N8N NODEBusiness plan

The n8n CRM node for contacts, deals and conversations

Install n8n-nodes-crmsolid from the Community Nodes panel, paste an API key, and a form submission becomes a contact, a won deal becomes an invoice, and an unanswered conversation becomes a message in whatever channel your team watches. Eight operations across three resources, no runtime dependencies, MIT licensed.

Free forever plan · No credit card required · Cancel anytime

3
Resources
Contact, Deal, Conversation
8
Operations
Five on contacts, two on deals, one on conversations
0
Runtime dependencies
Every call uses n8n's own HTTP helper
MIT
Licence
Source on GitHub, published to npm
Definition

An n8n community node is a package published to npm that an n8n instance installs at runtime, adding a new block to the canvas. It is not a fork of n8n, and it is not a webhook receiver you have to host and keep alive yourself.

n8n-nodes-crmsolid is the CRM Solid one. It authenticates with an API key you mint in the panel and gives a workflow eight operations over contacts, deals and conversations, with cursor pagination handled for you.

Published to npm as n8n-nodes-crmsolid, source on GitHub under MIT. Tested against n8n 1.60 and later on Node.js 20.15 and above. npm · GitHub

The node talks to the same public REST API a script would, so anything it does is reproducible with curl, and anything it cannot do is one HTTP Request node away.

What the node puts in a workflow

Three resources, chosen because they are the ones an automation actually reaches for. Everything here is enforced by the API, not by the node.

Contacts, five operations

Create, get, list, update and archive. The list filters on search, platform, email, external ID and Updated Since, which is the filter an incremental sync runs on.

Deals, two operations

Create a deal with title, value, currency, stage, probability, expected close date and notes. List with filters for stage, contact and a title search.

Conversations, read only

The threads that moved recently across every connected channel, newest first, each row carrying the contact id, the channel, an unread flag and a short preview of the last message.

External ID stops duplicates

Write your own identifier onto a contact and a re-run is refused with an HTTP 409 that names the record already there, instead of quietly creating a second copy of the same person.

Cursor pagination built in

Turn on Return All and the node walks every page for you. Leave it off and set a limit. A page holds at most 100 rows for contacts and deals, 50 for conversations, so a big list is many requests however you ask for it.

Scoped key, checked server side

The credential holds one API key. Each operation declares the scope it needs, so a key without contacts:write fails a create with a 403 rather than appearing to work and changing nothing.

Installing the node

The node is published to npm as n8n-nodes-crmsolid and installs the way every community node installs: from inside n8n, not by copying files onto a server.

  1. Open Settings, then Community Nodes. You need the instance owner account for this. A member account cannot install packages.
  2. Press Install and enter n8n-nodes-crmsolid. Confirm the community-node notice and install. n8n fetches the package and the node appears in the canvas search within a few seconds.
  3. Add the CRM Solid node to a workflow. It asks for a credential before it will let you choose a resource, so that is the next thing to create.

Or, on a self-hosted instance, from the command line:

npm install n8n-nodes-crmsolid
# then restart n8n

One caveat worth knowing before you plan around it: n8n Cloud offers only the community nodes n8n has reviewed and verified itself, and this package has not been through that review. Self-hosted instances install any published package. On Cloud the same operations are reachable through the HTTP Request node against the REST API, which is the honest answer rather than a detail we would rather leave out.

The package declares no runtime dependencies. Every request travels through n8n's own HTTP helper, which is what lets the credential inject the Authorization header and what keeps the install small.

Creating the credential

The node authenticates with a CRM Solid API key: one key, one header, no OAuth round trip.

  1. Open Settings, then Developers, in the CRM Solid panel. Create a key and name it after the workflow that will own it, so you know what stops working the day you revoke it.
  2. Grant only the scopes that workflow needs. A contact writer needs contacts:read and contacts:write. A deal report needs deals:read. Conversations read on contacts:read.
  3. Copy the token once. Live keys start with csk_live_ and test keys with csk_test_. The full token is shown at creation and never again; after that the panel shows only its prefix.
  4. Add a CRM Solid API credential in n8n and paste it in. Leave Base URL at https://api.crmsolid.com unless you are pointing at a staging deployment, then run the credential test.

The credential test makes the cheapest authenticated call there is:

curl https://api.crmsolid.com/v1/me \
  -H "Authorization: Bearer csk_live_YOUR_KEY"

API keys are part of the Business plan. On Free and Pro there is no key to mint, so the credential has nothing to hold. That is the one prerequisite worth checking before you install anything.

The budget is 60 requests per minute per key by default. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and going over the line returns HTTP 429 with a Retry-After in seconds. Because the limit is per key rather than per workspace, a workflow stuck in a loop throttles itself instead of starving your other integrations.

Eight operations across three resources

This is the whole surface, not a highlight reel.

Each operation maps to exactly one endpoint on the public v1 API, so nothing here behaves differently from a request you would write by hand.

  • Contact, Create. Needs at least one of name, username, phone, email or external ID. Additional Fields carry email, phone, username, platform, notes and your own external ID.
  • Contact, Get. One contact by its numeric id.
  • Contact, Get Many. Filters for a substring search, platform, email, external ID and Updated Since.
  • Contact, Update. A partial update: a field you do not add to the collection is left alone rather than blanked.
  • Contact, Delete. Archives rather than erases. Message history and linked deals survive, which is what the panel does with the same action.
  • Deal, Create. Title is required. Value, currency, stage, probability, expected close date, notes and a contact id are optional.
  • Deal, Get Many. Filters for stage, contact and a title search. Stage accepts won and lost here, because reading a closed deal is fine even though writing one is not.
  • Conversation, Get Many. Recently active conversations across every connected channel, newest first, each with a preview of the last message.

The platform field on a contact accepts Telegram, WhatsApp, Instagram, LinkedIn, X and Email. It records the channel a person arrived on, which is how the CRM groups their conversations afterwards.

Anything not on that list is not in the node. Sending messages, tagging, lead scoring, tasks, invoices and sequences all exist on the REST API. They are simply not among these eight operations.

Workflow one: a form submission becomes a contact

The most common reason to reach for this node. A lead fills in a form and the record exists in the CRM before anybody opens a tab.

  1. Trigger on the form. An n8n Form Trigger, a Webhook node behind your own form, or a Typeform or Google Forms node. Anything that hands the next node a JSON object will do.
  2. Map the fields onto Contact, Create. Name from the name field, then Additional Fields for email, phone and notes. Set Platform to Email when the lead arrived without a messaging handle.
  3. Set External ID to the submission id. This is the field that makes the workflow safe to re-run. A second create carrying the same external ID is refused with HTTP 409, and the error body names the contact that already exists, so a replay gives you a duplicate warning instead of a duplicate person.
  4. Turn on Continue On Fail once replays are normal. With it on, the 409 arrives as an item with an error message and the rest of the batch keeps going. With it off, the execution stops, which is what you want on the first run and not what you want at three in the morning.

If you need true upsert semantics rather than a 409, the REST API has a batch endpoint that matches on external ID, email, phone or username and accepts up to 200 rows per request. The node does not expose it. Point an HTTP Request node at POST /v1/contacts/batch and you get the same behaviour with one call instead of two hundred.

Workflow two: a won deal becomes an invoice

Worth reading before you build it, because the obvious design is the wrong one.

A deal cannot be moved to won through the API at all. Winning a deal books an income entry in the CRM ledger, so that transition is deliberately reserved for the panel where a human is looking at it. The node reflects that: Deal, Create refuses the won and lost stages, and there is no update operation. You read won deals; you do not write them.

  1. Poll for won deals on a schedule. A Schedule Trigger every fifteen minutes into CRM Solid, Deal, Get Many, with the Stage filter set to Won.
  2. Keep only the ones you have not seen. Deals come back newest id first. Store the highest id you have processed in the workflow's static data and drop anything at or below it, or write the deal id into the invoice reference and let the accounting tool reject the repeat.
  3. Create the invoice. Feed title, value and currency into whichever billing node you already run. The deal carries a contact id, so a Contact, Get in front of it gives you the email address to send to.

If fifteen minutes is too slow, do not shorten the poll. Subscribe instead: CRM Solid fires an outbound webhook on deal.won, signed with HMAC-SHA256 in an X-Webhook-Signature header and carrying the event name in X-Webhook-Event. Point it at an n8n Webhook node and the invoice goes out seconds after somebody closes the deal, with no polling budget spent at all. The same applies to contact.created, contact.updated and message.received.

Workflow three: reading conversations and routing them

Conversation, Get Many returns the threads that moved recently across every connected channel: Telegram, WhatsApp, Instagram, X, email and website live chat in one list. Each row carries the contact id, the channel, whether it is unread, and up to 160 characters of the last message.

  1. Pull the recent list on a schedule. A limit of 50 covers most inboxes. Narrow to the unread rows with an IF node before you spend anything on them.
  2. Classify the preview. Send the preview text through whichever model node you use and ask for a single label: pricing question, support issue, spam, or nothing to do.
  3. Act on the label. Post pricing questions into the channel your sales team watches, open a ticket for support issues, and write the classification back with Contact, Update so it lands on the record rather than only in chat.

Two limits are worth knowing before you build this. The preview is a preview: the node cannot page through a full message thread, so a classifier only ever sees the last message. And the node cannot tag a contact or send a reply. Both exist on the REST API and on the MCP server; neither is among these eight operations.

Pagination, limits and what an error looks like

Three behaviours that decide whether a workflow survives its first real week.

  • Pagination is cursor based. A list response carries the rows plus a cursor to the next page. Return All walks that cursor until the pages run out; a limit stops early. A page is capped server side at 100 rows for contacts and deals and 50 for conversations, so Return All over 4,000 contacts is 40 requests, not one.
  • The rate limit is per key. Sixty requests per minute by default. Over the line you get HTTP 429 with Retry-After in seconds, and the three X-RateLimit headers on every response tell you how close you were before it happened.
  • Errors carry a reason. 401 means the key is wrong or revoked. 403 means the key is valid but lacks the scope the operation declares. 404 means the id does not belong to this workspace, which is the same answer as an id that does not exist, on purpose. 409 means an external ID collision, and it names the record already holding that id.

A list response from the API the node sits on:

{
  "items": [ { "Id": 812, "Name": "Sarah Lin", "Platform": "email" } ],
  "nextCursor": 764,
  "hasMore": true
}

Incremental syncs run on Updated Since. Store the timestamp of the last successful run, pass it on the next one, and you pull the handful of contacts that changed rather than all of them. That is the difference between a nightly sync that finishes and one that spends its entire budget on rows nobody touched.

Honest limits

What this node does not do

Six things it is better to read here than to discover halfway through building a workflow around them.

It cannot send a message

The REST API can queue a Telegram message or an X DM and the MCP server can too. Those operations are not in this node. If a workflow has to reach a customer, use an HTTP Request node or one of n8n's own channel nodes.

It cannot mark a deal won

Winning a deal books an income entry in the ledger, so the transition is panel-only. The node creates deals and lists them. It does not close them, and Create refuses the won and lost stages outright.

There is no trigger node

This is an action node. To start a workflow from something happening in the CRM, register an outbound webhook and receive it with n8n's Webhook node. Polling on a Schedule Trigger works too, and costs you rate-limit budget the webhook does not.

It does not tag, score or assign

Tags, lead scores, owner assignment, tasks and pipeline moves all exist on the REST API. None of them are among the eight operations. Contact, Update writes the plain fields and nothing else.

It does not touch money

No invoices, no ledger entries, no payments, no refunds. Nothing in this node moves money in either direction, which is the same boundary the MCP server draws.

It needs the Business plan

API keys are a Business-plan feature. On Free and Pro there is no key to paste into the credential, so the node has nothing to authenticate with, however correctly it is installed.

Node, webhook or MCP server

Three ways to connect the same CRM, each right for a different job. Most teams end up running two of them.

The n8n node

Deterministic work on a schedule or a trigger

You know exactly what should happen and when. A form arrives, a contact is created. A deal closes, an invoice goes out. The logic lives on a canvas your whole team can read, and a failed execution is visible in the executions list with the payload that caused it.

Best when the rule is fixed and the volume is steady.

Outbound webhooks

Reacting the moment something happens

Register an endpoint in the CRM and it posts to you on contact.created, contact.updated, message.received, deal.won and the rest. Signed with HMAC-SHA256, retried with backoff, and replayable from a delivery log. Pair it with an n8n Webhook node and you get push instead of poll.

Best when latency matters more than simplicity.

The MCP server

Judgement, not plumbing

An AI assistant decides at call time with the actual thread in front of it, rather than following a rule written weeks earlier. 62 tools, 21 resources and 15 prompts over one authenticated endpoint, with every call bounded by the scopes on the key.

Best when the answer depends on reading the situation.

n8n integration FAQ

The questions that come up in the first hour, answered with the real behaviour.

It is an n8n community node published to npm as n8n-nodes-crmsolid. Installed into an n8n instance, it adds a CRM Solid block to the workflow canvas with eight operations: create, get, list, update and archive a contact; create and list deals; and list recent conversations. It authenticates with a scoped CRM Solid API key and has no runtime dependencies.
In a self-hosted n8n, open Settings, then Community Nodes, press Install, and enter n8n-nodes-crmsolid. You need the instance owner account. You can also run npm install n8n-nodes-crmsolid in the n8n data directory and restart the process, which is the route when the community-node installer is switched off on your instance.
n8n Cloud offers only community nodes that n8n has reviewed and verified, and this package has not been through that review yet. On Cloud, the same operations are available through the HTTP Request node pointed at the CRM Solid REST API with the same bearer key, which is more configuration but exactly the same behaviour.
Business. API keys are a Business-plan feature, so Free and Pro workspaces cannot mint the key the credential needs. Everything else about the node is free: the package is MIT licensed and there is no charge for installing or running it.
Not by itself. It is an action node, not a trigger node. To start a workflow from a CRM event, register an outbound webhook in the panel and receive it with n8n's Webhook node. Webhooks fire on contact.created, contact.updated, message.received and deal.won among others, are signed with HMAC-SHA256 in an X-Webhook-Signature header, and are retried with backoff.
Set External ID on Contact, Create to your own stable identifier for that person, such as the form submission id or the customer id in your store. A second create with the same external ID is refused with HTTP 409 and the error body names the existing contact id. Turn on Continue On Fail so a replay reports the collision instead of stopping the execution.
No. There is no send operation of any kind. Sending exists on the REST API and on the MCP server behind scopes such as telegram:send and social:write, but it is deliberately outside this node. A workflow that has to reach a person needs an HTTP Request node or one of n8n's own channel nodes.
The request fails with HTTP 403 rather than appearing to succeed. Each operation declares the single scope it requires: contacts:read for the reads, contacts:write for create, update and delete, deals:read and deals:write for the deal operations. Scopes are enforced server side, so narrowing a key is a real restriction rather than a hint.
Use the Updated Since filter on Contact, Get Many. Store the timestamp of your last successful run, pass it on the next one, and the API returns only contacts modified at or after that instant. Combined with Return All, this is what an incremental sync is built on, and it keeps a nightly job inside the per-minute rate limit.
Yes, MIT licensed on GitHub at CRM-Solid/n8n-nodes-crmsolid. The node is a single TypeScript file plus a credential definition, so reading it end to end takes a few minutes and tells you exactly which endpoint each operation calls.
Ready to ship

Put your CRM in the workflow

Install the node, mint a key with two scopes, and let the first form submission land as a contact. Everything after that is a matter of dragging one more node onto the canvas.

Free forever plan · GDPR-ready · No credit card required

We value your privacy

We use cookies to improve our site, analyze traffic, and personalize ads. You can accept all, reject non-essential, or customize your choices. Read our Cookie Policy.