If your customers message you on WhatsApp, a lot of your pipeline lives on someone's phone. Leads arrive in a personal chat, get answered when there is time, and reach the CRM only if somebody remembers to type them in. In India especially, WhatsApp is often the first place a serious enquiry lands, and it is also the place where leads go missing.
The fix is not to connect "WhatsApp" to your CRM as if it were a single feed. A WhatsApp number is a stream of conversations, and your CRM only needs a small part of it: who this is, what they asked for, where they came from, who owns the follow-up, and what happens next. This guide shows how to design for that and build it in n8n.
It assumes you use the WhatsApp Cloud API (Meta's hosted API for businesses) and a CRM such as HubSpot, Zoho CRM or Pipedrive. The design is the same for all three.
What to send to the CRM, and what to leave in WhatsApp
My read: Do not log every message. A CRM timeline with 200 "ok" and "thanks" notes is noise, and it makes the useful entries harder to find. Log these events:
A new contact's first message, with its content and the source.
Qualifying details once they are known (budget, requirement, location, timeline).
Handoffs: when the conversation moves from automation to a person.
Outcomes: booked meeting, quote requested, or stopped responding.
Keep the full conversation in WhatsApp, or in the inbox tool your team replies from, and link to it from the CRM record if that tool supports it.
Before you build: the setup that trips people up
Fact: To use the Cloud API you need a Meta developer app, a WhatsApp Business account and a phone number registered to the API. Business verification with Meta is required for higher messaging limits and some features.
Fact: A number registered to the Cloud API has historically not been usable in the regular WhatsApp or WhatsApp Business app at the same time. Meta has since added options for running both together, so check current Meta documentation before you decide whether to migrate your existing number or get a new one.
My read: Settle this before anything else, because moving a number your team already uses is the most disruptive step in the whole project.
The workflow, step by step
1. Receive messages through a webhook
Meta sends incoming messages to a URL you register. In n8n, a Webhook node provides that URL, and the WhatsApp Business Cloud trigger node is an alternative.
Two details matter:
Verification: when you register the URL, Meta sends a GET request with a verify token and a challenge value. Your workflow must return the challenge for the registration to succeed.
Security: each POST carries a signature header (X-Hub-Signature-256) computed from your app secret. Check it before processing, so a random POST to your URL cannot create a lead.
Respond with a 200 status quickly and do the real work afterwards. If Meta does not get a fast response it retries, and retries are how duplicate leads begin.
2. Filter out everything that is not a message
Fact: The same webhook delivers more than incoming messages. Delivery receipts and read-status updates arrive on it too, in a different part of the payload.
If you do not filter these, each "delivered" and "read" event can create or update a contact. This is the single most common bug in first builds, and it shows up as empty or duplicate leads in the CRM.
3. Normalise the payload
A small Code node (set to run once for all items) can drop non-message events and flatten what is left. This version takes the first message in each webhook for brevity. In production, loop over every entry and message, since one webhook can carry several.
Three things in that snippet are worth knowing:
wamid is WhatsApp's unique message ID. Use it to detect and ignore a message you have already processed.
The phone number arrives as digits with the country code and no plus sign. Adding the plus gives you E.164 format, which is what your CRM should store.
referral is present when a conversation starts from a click-to-WhatsApp ad, and carries information about the ad. Store it, because it is your attribution.
4. Deduplicate and upsert the contact
Match the contact in the CRM on phone number first, since that is the identifier WhatsApp gives you, and on email if you already have one. Use an upsert so a returning customer updates the existing record, and set the lead source to WhatsApp, with the ad details if present.
Before writing anything, check the wamid against a small table in PostgreSQL or the CRM. If it has been seen, stop. This makes the workflow safe against Meta's retries.
5. Handle more than text
People send voice notes, images, PDFs and locations. The webhook gives you a media ID for these, not the file. To get the file, call the Graph API with that ID to receive a temporary URL, then download it using your access token. Attach images and documents to the CRM record, and store a transcript for voice notes if you use a speech-to-text step.
If you do not handle media, the lead's most useful message, a photo of the problem, gets silently lost.
6. Qualify and route
For the first message from a new contact, an LLM node can extract structured details such as service interest, urgency and budget band. Write those to CRM properties along with the original text, so a rep can check them. Then assign an owner by round-robin or rules, send them a Slack or email alert with the CRM link, and create a task with a due time.
Anything that changes a deal stage stays a human decision.
7. Reply inside the rules
Fact: WhatsApp lets you send free-form replies only within 24 hours of the customer's last message. Outside that window, or when you start the conversation, you must use a pre-approved message template.
So build two reply paths:
Inside the window: an immediate, specific acknowledgement ("Thanks Priya, I'll call you by 11:00 today about the kitchen quote") and any follow-up questions.
Outside the window: a template, sent only to people who have opted in to hear from you.
Fact: Meta bills template messages per message, with rates that depend on the country and message category, and the rules have changed over time. Check the current rate card before you plan volumes.
8. Respect opt-out and store consent
Record when and how each person gave permission to be contacted, as a property on the CRM contact. If someone writes "STOP" or similar, set a do-not-message flag and make sure no workflow sends them anything. This protects your number's quality rating and keeps you on the right side of the rules.
9. Hand over to a human without losing context
Decide where your team replies from: the WhatsApp Business app (if your setup allows it), an inbox tool, or your CRM's own WhatsApp integration. n8n does not need to be the place people chat. Its job is the automation around the conversation: capture, dedupe, qualify, route, remind and log.
When a rep takes over, post a short summary to the CRM record and Slack so they do not have to scroll back through the chat.
Where it goes wrong
Status events creating leads. Filter on the presence of a message, as above.
Duplicate processing. Return 200 fast and deduplicate on wamid.
Phone format mismatches. Store E.164 everywhere, or "+91 98765 43210" and "919876543210" become two contacts.
Ignoring media. Fetch and attach images, documents and voice notes.
Messaging outside the window. Free-form messages sent after 24 hours fail. Use templates, and only with opt-in.
Over-logging. Log meaningful events, not every message.
Silent failure. If the CRM is down, queue the lead and alert someone. A lost WhatsApp lead is invisible until a customer complains.
What it costs to run
On the n8n side, a self-hosted server runs roughly $6 to $20 a month (about 550 to 1,800 INR), and n8n Cloud starter plans are roughly $25 to $70 (about 2,200 to 6,300 INR), depending on execution volume. One incoming message is one execution, so a few hundred leads a month fit a small plan. The Cloud API itself is billed by Meta on a per-message basis rather than a monthly platform fee, and some business solution providers add their own markup, so confirm the current terms with whichever route you choose. These are estimates, rounded at about 90 INR to the dollar.
The bottom line
Treat WhatsApp as a conversation stream and send the CRM only what it needs: the contact, the source, the qualifying details, the owner and the next step. Filter status events, deduplicate on the message ID, normalise phone numbers, reply inside the rules and keep consent on the record. Do that, and leads stop disappearing into personal chats.
Let's create something together
If you want this built and owned by you, see our Lead-to-CRM Pipeline Automation service. A 30-minute call is enough for me to map how your WhatsApp leads should reach your CRM.