Automation

WhatsApp Webhook to n8n and Make: DM Lead Capture Guide 2026

By Omar Eltak · October 12, 2026 · 12 min read

I built OT1-Pro because I lost 23 WhatsApp leads in one week in March 2024. They messaged my business number at 11pm, got no structured follow-up, and bought from someone with a system behind the reply. I had the chats. I had no pipeline. That week forced the decision this post documents: webhook-first lead capture. Every DM that produces a lead is pushed out of OT1-Pro as signed JSON to n8n, Make, Power Automate, or Zapier the second it happens.

If you searched for whatsapp webhook n8n or whatsapp to make.com integration, you are past the chatbot demo stage. You want payload docs, the retry contract, and a working lead to Sheets to Slack path you can copy. That is what follows. I run this in production for sales teams in Egypt, Saudi Arabia, and the UK.

Context: OT1-Pro pricing starts from $8 per month, see why teams pick OT1-Pro over WATI, and if Meta paperwork still blocks you read Meta App Verification 2026: A Founder's Guide first. The companion piece is Closed Deals to Google Sheet with transparent AI credits. You can create your free OT1-Pro account here.

Why I made webhooks the default, not an add-on

I started with the mistake most WhatsApp tools make. I treated the inbox as the destination. Leads lived in chat threads, salespeople copied names into Excel at midnight, and the owner asked every Monday where 40 new conversations went. Copy-paste breaks at 30 conversations a day and collapses at 200.

In late 2024 I flipped the model. OT1-Pro keeps the conversation, but the system of record lives where the customer already works: Google Sheets for a Cairo clothing seller, HubSpot for a Dubai real-estate team, an n8n Postgres for a technical founder, a Make scenario feeding Notion for an agency. The bridge is an outbound webhook on a defined event with a documented payload and retry contract.

That change killed a full class of support tickets: name missing, phone copied wrong, score forgotten, source channel unknown. Now the AI captures name, phone, email, intent, and score inside the DM, SalesConnectors emit one event, and the downstream system inserts the row. Phone-number error rates across three teams I measured in January 2026 fell from roughly 11% manual copy to under 1% webhook insert.

The two events that matter: EVENT_LEAD_CAPTURED and EVENT_DEAL_CLOSED

OT1-Pro SalesConnectors emit many internal signals, but only two leave the building for most teams. I kept it to two after watching teams drown in event noise. You need a new-lead moment and a money moment.

1. EVENT_LEAD_CAPTURED. Fires the instant the AI or an agent marks a conversation as a qualified lead. Conditions: reachable phone or WhatsApp JID present, intent classified as buy, book, quote, or partner, lead score computed. In my store this fires on average 4 minutes into a WhatsApp thread: customer asks for 200-unit pricing, shares size plus address, or requests a Thursday viewing. The AI fills contact fields first, then emits. No partial payloads.

2. EVENT_DEAL_CLOSED. Fires when a deal moves to won. It carries deal value, currency, products, and attribution back to the first message. A Giza salon fires it on a laser-package deposit. A real-estate team fires it on a viewing turned reservation. It links to the original lead via lead_id so Sheets or CRM joins rows without fuzzy matching on phone numbers.

Both share one delivery pipeline: HMAC-signed POST, 10-second downstream timeout, queued retries, dead-letter log in the team audit view. If you wire one, wire EVENT_LEAD_CAPTURED. Add EVENT_DEAL_CLOSED when you want true ROI per channel, covered in Closed Deals to Google Sheet with transparent AI credits.

The JSON payload your automation actually receives

Technical buyers get burned by vague webhook docs. Here is the exact shape OT1-Pro sends. Keys are snake_case, timestamps ISO-8601 UTC, money as integer minor units plus currency code to avoid float errors. New keys may be added; old keys are never renamed without a version bump in X-OT1-Webhook-Version.

{
  "event": "EVENT_LEAD_CAPTURED",
  "event_id": "evt_9f3a1c7e2b4d",
  "occurred_at": "2026-09-18T19:42:11Z",
  "team": { "team_id": 412, "team_name": "Nour Fashion Cairo" },
  "lead": {
    "lead_id": "lead_71hks92m",
    "name": "Mona Adel",
    "phone": "+201012345678",
    "email": "[email protected]",
    "score": 82,
    "intent": "quote",
    "source_page": "Facebook Page: Nour Fashion",
    "source_channel": "whatsapp",
    "conversation_id": "conv_55ad21c9",
    "custom_fields": { "size": "XL", "city": "Nasr City", "product_sku": "DRS-1042-black" }
  },
  "message": {
    "last_inbound_text": "price for 2 pieces size XL?",
    "message_id": "wamid.HBgMMjAxMDEyMzQ1Njc4FQ=="
  }
}
{
  "event": "EVENT_DEAL_CLOSED",
  "event_id": "evt_c41d09aa77e1",
  "occurred_at": "2026-09-21T14:03:55Z",
  "team": { "team_id": 412, "team_name": "Nour Fashion Cairo" },
  "lead": {
    "lead_id": "lead_71hks92m",
    "name": "Mona Adel",
    "phone": "+201012345678",
    "score": 82,
    "source_page": "Facebook Page: Nour Fashion",
    "source_channel": "whatsapp",
    "conversation_id": "conv_55ad21c9"
  },
  "deal": {
    "deal_id": "deal_88qz12tt",
    "value_minor": 240000,
    "currency": "EGP",
    "products": ["DRS-1042-black x2"],
    "pipeline_stage": "won"
  }
}

Three mapper notes. Phone is always E.164 with plus; 01012345678 becomes +201012345678 before emit. source_channel is whatsapp, instagram, messenger, telegram, or email. source_page is the connected asset name, so one Switch node in n8n can route three Facebook Pages plus two WhatsApp numbers.

Payload field reference: type and real examples

Copy this table into your n8n Sticky Note or Make scenario docs. These are the keys mapped in 90% of live scenarios:

FieldTypeExample
eventstring (enum)EVENT_LEAD_CAPTURED
event_idstringevt_9f3a1c7e2b4d
occurred_atstring (ISO-8601 UTC)2026-09-18T19:42:11Z
lead.lead_idstringlead_71hks92m
lead.namestringMona Adel
lead.phonestring (E.164)+201012345678
lead.emailstring or null[email protected]
lead.scoreinteger 0-10082
lead.intentstringquote
lead.source_pagestringFacebook Page: Nour Fashion
lead.source_channelstring (enum)whatsapp
lead.conversation_idstringconv_55ad21c9
deal.value_minorinteger240000
deal.currencystring (ISO-4217)EGP

Score bands I use: 0-39 browse, 40-69 interested, 70-89 hot, 90-100 immediate. Headers on every POST: Content-Type application/json, X-OT1-Event, X-OT1-Webhook-Version currently v1, X-OT1-Signature as hex HMAC-SHA256 of the raw body with your team secret, X-OT1-Event-Id for idempotency. Store event_id and drop duplicates; retries reuse the same event_id.

Retry behavior: what happens when n8n is down

A webhook without a retry contract is a hope, not an integration. OT1-Pro attempts delivery up to 6 times over roughly 24 hours: immediate, then after 60 seconds, 5 minutes, 30 minutes, 4 hours, and 20 hours. Any 2xx stops the chain. A 410 Gone stops immediately and disables the URL with an owner email, because 410 means you deleted the scenario. Timeouts after 10 seconds count as failures.

4xx except 408 and 429 does not retry. A 400 means your validator rejected my payload, 401 means the secret rotated, 404 means the n8n workflow is deactivated. Those surface instantly in the delivery log with a response snippet so you fix mapping same-day. 408, 429, 5xx, DNS errors, and timeouts always retry with up to 30 seconds jitter.

Real case from May 2026: a self-hosted n8n on a 2GB VPS fell over nightly during backups. 3am webhooks timed out, retried at 3:01, 3:06, 3:36, then delivered at 7am. Zero leads lost because attempt 5 exists. Idempotency via event_id meant the redelivery inserted once, not four times.

Setup in 7 steps: WhatsApp DM to webhook in under an hour

The checklist I send founders asking for whatsapp to make.com integration. Assumes WhatsApp is connected. If Meta verification blocks you, follow Meta App Verification 2026: A Founder's Guide first.

  1. Create the receiver. n8n: Webhook node, POST, path ot1-lead, respond With Response Node. Make: new scenario, Custom Webhook, copy URL. Power Automate: When an HTTP request is received trigger, copy URL.
  2. Paste the URL into OT1-Pro. Settings, SalesConnectors, Webhooks. Add endpoint, select EVENT_LEAD_CAPTURED and EVENT_DEAL_CLOSED, paste URL, Generate Secret. Copy the secret into your automation now.
  3. Verify the signature. Recompute HMAC-SHA256 of the raw body with your secret, compare to X-OT1-Signature with a timing-safe compare, reject mismatches with 401. Open webhook URLs get probed within days.
  4. Map the core columns. event_id, occurred_at, name, phone, score, source_channel, source_page. Create the Sheet or CRM object with these headers first. Never let the tool auto-create columns from one sample or Arabic names and missing emails will shift columns.
  5. Add the score router. Score 70 or above notifies sales now. 40 to 69 goes to nurture. Below 40 logs only. One team cut Slack noise 60% with this single branch.
  6. Send a test lead. In OT1-Pro use Send Test Event. Confirm 200 in the delivery log, one Sheet row, one Slack message. Resend the same test and confirm the duplicate is dropped via event_id.
  7. Watch the delivery log 48 hours. Any non-2xx shows status plus body snippet. Fix mapping same-day. After 48 clean hours, add EVENT_DEAL_CLOSED mapping to join revenue to lead_id.

Technical buyers finish in 30 to 50 minutes. Start with a free OT1-Pro account and send one test event before touching production data.

n8n workflow example: lead to Sheets to Slack

The whatsapp webhook n8n pattern I deploy most: Webhook to IF to Sheets to Slack. Identical on n8n Cloud and self-hosted.

Node 1 Webhook. POST, path ot1-lead, Response Mode With Response Node. Production URL form: https://your-n8n.app/webhook/ot1-lead. Use production, not the webhook-test prefix, for OT1-Pro.

Node 2 Code Verify Signature. Paste this into a Code node:

// verify OT1-Pro webhook signature
const crypto = require('crypto');
const raw = $items('Webhook')[0].json.rawBody;
const sent = $items('Webhook')[0].json.headers['x-ot1-signature'];
const calc = crypto.createHmac('sha256', $credentials.ot1Secret).update(raw).digest('hex');
if (calc !== sent) throw new Error('bad signature');
return $items('Webhook');

Node 3 IF Score Hot. Condition lead.score greater than or equal to 70. True goes to Slack now, false to the nurture tab.

Node 4 Google Sheets Append. Append to Leads: event_id, occurred_at, name, phone, email, score, intent, source_channel, source_page, conversation_id, last_text. Add a Lookup on event_id first for dedupe. One Cairo store appends 120 rows weekly with zero duplicates since adding it.

Node 5 Slack plus Respond. Post to hash-sales-hot: New WhatsApp lead 82 Mona Adel +201012345678 via whatsapp, intent quote, link to conversation conv_55ad21c9. Slack is the bell, the inbox is the desk. Then a Respond to Webhook node returns 200 {"ok": true} fast. Forgetting it leaves Response Mode hanging, every delivery times out at 10 seconds and retries five times. I have debugged that misconfiguration twice.

Make scenario example: WhatsApp to Make.com integration that sales teams keep

Make buyers care about ops count and visual debugging. Minimal whatsapp to make.com integration that survives volume:

Module 1 Custom Webhook. Webhook ot1-lead-captured, URL into OT1-Pro. Enable JSON passthrough so custom_fields like delivery_date survive without redefining the structure.

Module 2 Router. Route A Hot: score 70+. Route B Warm: 40-69. Route C Log-only: below 40 or intent spam. Spam never touches Slack or CRM ops.

Modules 3A and 4A Hot path. Google Sheets Add a Row to Hot Leads, mapping lead.phone untouched in E.164. I watched a team strip the plus with a parser and break 300 click-to-chat links. Then Slack Create a Message with source_page included, because two-brand accounts route replies wrong without it, plus buttons to the OT1-Pro conversation and Sheet row.

Module 3B Warm path. Warm leads go to Nurture tab, Sleep 23 hours, then check whether EVENT_DEAL_CLOSED arrived for the same lead_id. If not, create a follow-up task. That delayed branch recovered 9% of warm leads for a furniture seller in April 2026.

Ops math for budgeting against OT1-Pro pricing: about 4 ops per hot lead, 2 per warm, 1 per cold log. At 500 leads monthly with a 30-50-20 split, expect near 1,400 ops, inside the entry Make tier. If volume triples, move Sheets appends to the native path below and keep Make for hot-only routing.

Power Automate and Zapier: same payload, different shop

Enterprise teams ask about Power Automate, agencies about Zapier. Same JSON, different plumbing.

Power Automate. Trigger When an HTTP request is received, paste the sample payload from this post to generate schema, Parse JSON, Condition on score. Hot leads create a Dynamics 365 Lead or SharePoint item, then post to Teams. One Saudi distributor runs WhatsApp to OT1-Pro to Power Automate to Dynamics with source_page mapped to campaign. Return 200 within 10 seconds or OT1-Pro retries.

Zapier. Webhooks by Zapier Catch Hook into OT1-Pro, Filter continue if score above 69 for the instant path, Paths for warm versus hot, then Sheets Create Row or HubSpot Create Contact. Task math is harsher: each action is a task, so 500 leads cost roughly 1,000 to 1,500 tasks. Fastest to set up, most expensive to scale. Payload identical to n8n. Read OT1-Pro vs WATI before committing task spend.

Shared trap: phone normalization. Power Automate casts +201012345678 to a number and drops the plus. Zapier formatters strip country codes. Store the raw string, validate ^\+[1-9]\d{7,14}$, format for display only.

When you do not need Zapier at all: native Sheets path

Half my customers never need n8n or Make. If the whole job is leads into a spreadsheet plus a daily report, use the native OT1-Pro Sheets connector. No webhook, no ops, no scenario to maintain. Connect Sheets in Integrations, pick the tab, map seven fields once. EVENT_LEAD_CAPTURED appends rows, EVENT_DEAL_CLOSED updates revenue by lead_id join. Full mechanics: Closed Deals to Google Sheet with transparent AI credits.

My rule: start native, graduate to webhooks. Native handles around 2,000 leads monthly with Sheet filtering. Move to whatsapp webhook n8n when you need branching, multi-system fan-out, or code like Arabic name normalization. Move to whatsapp to make.com integration when your marketer owns automation visually. Stay native when the owner checks one Sheet each morning and wants zero moving parts.

Real invoices: native costs nothing beyond OT1-Pro pricing. One 40-seat retailer cut automation from $119 monthly Zapier tasks to $0 native plus one entry-tier Make scenario for hot-lead Slack bells. Same leads, one-tenth the plumbing cost. I built OT1-Pro to capture DMs where buying already happens and push structured leads where you already work. Wire EVENT_LEAD_CAPTURED this week, add EVENT_DEAL_CLOSED next, stop paying humans to copy phone numbers at midnight. Create your free account and send your first test event today.

Stop losing the leads you already earned

OT1-Pro audits your team, respects Meta's 24h window, pushes leads to your stack via webhooks, and stays up through AI outages with multi-model failover — WhatsApp, Instagram, Messenger, Telegram, and email, in Arabic or English. Free plan, no credit card.

Start free → · Pricing · vs WATI · Talk to the founder on WhatsApp

Ready to try OT1-Pro?

Connect WhatsApp, Instagram, Facebook & Telegram with AI that sells for you.

Get started free
Keep reading

Related stories