WhatsApp isn't just a messaging app anymore. It's the highest-engagement channel most businesses are completely under-using. Open rates above 90%, responses within minutes, no spam filters, no ad budget required. And yet most businesses are handling WhatsApp messages manually, one at a time.

That changes when you connect the WhatsApp Business API to n8n. You get a proper automation layer: inbound message parsing, AI classification, CRM sync, conditional routing, and outbound templates — all wired together without a developer on retainer.

This guide covers the setup and five production workflows we've built for clients ranging from e-commerce brands to professional services firms.

Prerequisites: WhatsApp Business API Access

The WhatsApp Business API (now called the Cloud API, hosted by Meta) requires an approved Meta Business account. This is different from the regular WhatsApp Business app. Here's what you need before touching n8n:

Meta's review process takes 1–3 business days for most accounts. Plan for this lead time. Once approved, you get a phone number ID and WABA ID that you'll use in every n8n node.

Setting Up the Webhook in n8n

WhatsApp delivers inbound messages via webhook. Every time a user messages your number, Meta POSTs a JSON payload to your webhook URL. n8n handles this natively:

1. Create a new n8n workflow 2. Add a Webhook node as trigger → Method: POST → Path: /whatsapp-inbound (or any slug) → Authentication: None (we validate manually) 3. Copy the webhook URL 4. In Meta Developer Console: → App → WhatsApp → Configuration → Webhook → Paste URL, set Verify Token to any secret string → Subscribe to: messages, message_deliveries, message_reads 5. Add a Respond to Webhook node (immediately) → returns 200 OK (Meta requires <5 second response or it retries)

The most common mistake: not responding immediately. Meta retries the webhook if you don't return 200 within 5 seconds. Always add a Respond to Webhook node right after the trigger, before any slow operations like LLM calls or CRM lookups.

Understanding the Inbound Payload

Before building workflows, understand what Meta actually sends. The payload structure is deeply nested and slightly inconsistent across message types:

// simplified inbound message structure { "object": "whatsapp_business_account", "entry": [{ "changes": [{ "value": { "messages": [{ "from": "447700900123", // sender's number "id": "wamid.xxx", // message ID "timestamp": "1721462400", "type": "text", // text | image | audio | document | interactive "text": { "body": "Hello, I need help with my order" } }], "contacts": [{ "profile": { "name": "Sarah M." }, "wa_id": "447700900123" }] } }] }] }

Add a Code node right after the webhook to extract the essentials: sender number, message text, message type, contact name. This normalised object is what flows through the rest of your workflow.

// Code node: extract message data const entry = $input.first().json.entry[0]; const change = entry.changes[0].value; const msg = change.messages?.[0]; const contact = change.contacts?.[0]; if (!msg) return [{ json: { skip: true } }]; return [{ json: { from: msg.from, name: contact?.profile?.name || 'Unknown', messageId: msg.id, type: msg.type, text: msg.text?.body || '', timestamp: msg.timestamp } }];

Workflow 1: Order Status Bot

This is the highest-ROI WhatsApp workflow for e-commerce. Customers message "Where is my order?" and get an instant, accurate reply — without a human touching it.

Trigger: Webhook (inbound WhatsApp message) ↓ Node: Code → extract sender + text ↓ Node: IF → does text match order inquiry? (contains "order", "delivery", "tracking", "where") ↓ YES Node: HTTP Request → Shopify/WooCommerce API → get orders by phone number ↓ Node: IF → order found? → YES: Node: Code → format order status message → NO: Node: Set → "We couldn't find an order for this number. Reply with your order ID." ↓ Node: HTTP Request → WhatsApp Cloud API → send text reply ↓ Node: Respond to Webhook → 200 OK

The Shopify lookup uses the customer's WhatsApp number (usually matching their phone number) to pull recent orders. Format the response clearly — delivery date, status, tracking link if available. Customers want three things: what they ordered, where it is, when it arrives.

// Measured results from client deployment

Workflow 2: AI-Powered Support Triage

Not every message has a template answer. For open-ended support, an OpenAI-backed triage layer classifies intent and either answers from a knowledge base or escalates to a human agent.

Trigger: Webhook → extract message ↓ Node: OpenAI → classify intent System: "Classify this WhatsApp message into one of: ORDER_STATUS | RETURN_REQUEST | PRODUCT_QUESTION | COMPLAINT | OTHER Reply with just the category." ↓ Node: Switch → route by category → ORDER_STATUS: [Workflow 1 above] → RETURN_REQUEST: lookup order → send return portal link → PRODUCT_QUESTION: RAG lookup → answer from product catalogue → COMPLAINT: flag as priority → create CRM ticket → notify support lead → OTHER: send to human handoff queue

The RAG lookup for product questions connects to your vector store — the same pattern as our n8n RAG pipeline guide. Embed your product docs and FAQs; the bot answers from real data, not hallucinated generalities.

For complaints and escalations, don't try to automate the human touch. The right move is to capture the issue in your CRM (HubSpot, Pipedrive), notify the right person in Slack, and send the customer a holding message promising a real human response within a specific timeframe.

Workflow 3: Outbound Order Confirmations & Shipping Updates

This workflow is triggered by your e-commerce platform, not by inbound messages. Every time an order is placed, shipped, or delivered, n8n sends a WhatsApp template message to the customer.

Trigger: Webhook from Shopify/WooCommerce (order.fulfilled event) ↓ Node: HTTP Request → get customer phone number from order ↓ Node: Code → format phone to E.164 (e.g. 447700900123) ↓ Node: HTTP Request → WhatsApp Cloud API POST https://graph.facebook.com/v20.0/{PHONE_NUMBER_ID}/messages { "messaging_product": "whatsapp", "to": "{{ phone }}", "type": "template", "template": { "name": "order_shipped", "language": { "code": "en_GB" }, "components": [{ "type": "body", "parameters": [ { "type": "text", "text": "{{ customerName }}" }, { "type": "text", "text": "{{ orderNumber }}" }, { "type": "text", "text": "{{ trackingUrl }}" } ] }] } } ↓ Node: Google Sheets → log send status + timestamp

Template messages require pre-approval from Meta — submit them through the WhatsApp Manager with the expected variable placeholders. Approval typically takes 30 minutes to 24 hours. You need a separate approved template for each message type: order confirmation, shipping update, delivery confirmation, return processed.

Workflow 4: Lead Qualification Bot

For B2B or high-ticket B2C, WhatsApp is increasingly the channel where interested prospects make first contact. A qualification bot captures intent, budget, and timeline before routing to sales.

Trigger: Webhook → inbound message to business number ↓ Node: Code → check if sender is in CRM (HTTP → HubSpot lookup) ↓ (new contact) Node: HTTP Request → WhatsApp API → send greeting + ask question 1 "Hi! Thanks for reaching out. What are you looking for help with?" ↓ [user replies] Node: Webhook → extract reply ↓ Node: OpenAI → extract: use_case, company_size, timeline, budget_range ↓ Node: HTTP Request → HubSpot → create contact + deal { properties: { phone: "+447700900123", whatsapp_intent: extracted.use_case, hs_lead_status: "NEW", budget_range: extracted.budget_range } } ↓ Node: IF → lead score > 60? → YES: Slack → notify sales lead + schedule call via Calendly link → NO: add to nurture sequence

The conversation state management is the tricky part. You need to track where each user is in the conversation flow — question 1, question 2, or awaiting booking. Store state in a Google Sheet or Airtable keyed by the sender's phone number. Check state on every inbound message before deciding what to send next.

Workflow 5: Appointment Reminders

For service businesses — clinics, consultants, agencies — appointment no-shows are expensive. WhatsApp reminders outperform email and SMS by a significant margin.

Trigger: Schedule → every 15 minutes ↓ Node: Google Calendar / Calendly API → get appointments in next 24h ↓ Node: Filter → only appointments without "reminder_sent" flag ↓ Node: Loop → for each appointment: Node: HTTP Request → WhatsApp API → send reminder template "Hi [Name], just a reminder about your appointment at [time] tomorrow. Reply YES to confirm or RESCHEDULE to pick a new time." Node: Google Sheets → mark reminder_sent = true + timestamp ↓ [User replies] Trigger: Webhook → parse YES / RESCHEDULE → YES: update CRM → confirmed → RESCHEDULE: send Calendly booking link

The key metric: no-show rate drops from 15–25% (industry average for email-only reminder) to under 5% with WhatsApp reminders sent 24h and 2h before the appointment. Two reminders, with confirmation capture, is the sweet spot.

Sending Messages via the WhatsApp Cloud API

Every outbound message in n8n uses an HTTP Request node pointing to Meta's Cloud API. The base configuration:

// n8n HTTP Request node configuration Method: POST URL: https://graph.facebook.com/v20.0/{{ PHONE_NUMBER_ID }}/messages Headers: Authorization: Bearer {{ SYSTEM_USER_TOKEN }} Content-Type: application/json // text message body: { "messaging_product": "whatsapp", "recipient_type": "individual", "to": "{{ recipient_phone }}", "type": "text", "text": { "preview_url": false, "body": "{{ your_message_here }}" } }

Store your System User Token and Phone Number ID as n8n credentials or environment variables — never hardcode them. The System User Token (not the temporary user token) doesn't expire, which is what you want for a production automation.

Gotchas and Rate Limits

Testing Without Real Users

Meta's Test Phone Number (available in the WhatsApp Manager) lets you send messages to up to 5 whitelisted numbers for free during development. Use this to test all your templates and inbound flows before going live. Test every message type: text, image, document, interactive (buttons and lists).

// Where to start

WhatsApp automation isn't complex — but it does require careful setup to stay inside Meta's policy guardrails. The businesses that get it right turn the highest-engagement channel in their stack into a fully automated customer touchpoint that runs without anyone watching it.

If you'd rather skip the setup and get straight to working automations, get in touch — WhatsApp automation builds are one of our most common client requests.

📚 Further Reading