Articles on: Campaigns

How to send Whatsapp Campaigns with Crisp

Learn how to trigger a WhatsApp campaign from any business tool and send approved message templates through Crisp with n8n.


This guide builds a reusable no-code workflow for “Jim’s Sandwiches”: an incoming webhook provides the recipient and template variables, n8n calls the Crisp WhatsApp Business Platform API, and a callback webhook records the final result. You can keep the same structure and replace the example template and fields with those used by your business.


Only message contacts who gave you their phone number and opted in to receive WhatsApp messages from your business. Respect opt-out requests and follow the WhatsApp Business Messaging Policy.


In this guide, you will:



Before you start


This workflow sends one approved WhatsApp template to one recipient each time its campaign webhook is called. It is a practical default for CRMs, forms, databases, and automation tools that already process contacts individually.


Before building the workflow, make sure you have:

  • A WhatsApp Business Account connected to Crisp → follow the WhatsApp Business setup guide first if your number is not connected yet
  • Owner access to the Crisp workspace → only Website Owners can generate or rotate the WhatsApp API token
  • An approved WhatsApp message template → campaign messages must use a template approved in WhatsApp Business Manager
  • WhatsApp credits in Crisp → Marketing templates are paid messages and consume credits when delivered; contact Crisp support to add credits to your workspace
  • An n8n instance with a public HTTPS URL → Crisp and your campaign source must be able to reach its production webhooks


The starter workflow accepts one recipient per webhook call. If your source sends a contact array instead, add a Split Out or Loop Over Items node before the Crisp request so that n8n makes one API call per recipient.



Prepare your WhatsApp template and Crisp API


Create and approve the campaign template


You can create and manage templates in WhatsApp Business Manager. Once a new template is created, simply wait for Meta to approve it before testing the API.


Create an example template in WhatsApp Business Manager:

  • PathAccount Tools → Message Templates
  • CategoryMarketing
  • Namenew_sandwiches_available
  • Languageen_US
  • BodyHi {{1}}, our new {{2}} is now available at Jim's Sandwiches. View today's menu and order while it is available.


In this template, {{1}} receives the customer’s name and {{2}} receives the sandwich name. Keep the variable order in n8n aligned with the approved template, and replace the example wording with your own campaign content when needed.


Looking for more detailed steps regarding WA template creation? You can consult the official WA Business documentation or our dedicated article.


Collect the Website ID, route, and API token


Collect these values from Crisp:

  • Website ID → open Settings → Workspace Settings → Setup & Integrations, then copy the Website ID
  • Send-template route → open Plugins → WhatsApp → API Reference and find the Send Message Template route
  • API token key pair → open Plugins → WhatsApp → API Settings → API Tokens, then generate an identifier and key
  • Callback setting → stay in Plugins → WhatsApp → API Settings; you will paste the n8n callback URL there later


Whatsapp plugin API navigation


The send-template route follows this format:


https://plugins.crisp.chat/urn:crisp.im:whatsapp:0/wa/api/website/{website_id}/template/send


Replace {website_id} with the Website ID copied from your workspace.


The token key is displayed only once. Store the identifier and key in an n8n Basic Auth credential, and never place them in the incoming webhook body or an exported workflow file.



Import and configure the n8n workflow


Import the starter workflow


⬇️ To help you get started more easily, we have prepared an N8N template workflow available here.


To import it, simply navigate to n8n, create a new workflow, and choose Import from File from the ... menu in the top-right.
It contains two independent branches:


Campaign Trigger → Send WhatsApp Template
Crisp Callback → Was There an Error? → Success Logged / Stop on WhatsApp Error


N8N Whatsapp Campaign Example Workflow


After importing, update these nodes:

  • Campaign Trigger → create or select a Header Auth credential, for example with header name X-Campaign-Key and a long random value
  • Send WhatsApp Template → Credential → create an HTTP Basic Auth credential with the Crisp token identifier as the username and the token key as the password
  • Send WhatsApp Template → URL → replace REPLACE_WITH_CRISP_WEBSITE_ID with your Crisp Website ID
  • Send WhatsApp Template → JSON Body → replace +15550000000 with the WhatsApp Business number connected to Crisp, and update the template name, language, and variables when using your own template
  • Crisp Callback → Path → replace CHANGE-ME with a long random value before using the production URL


Use phone numbers in international format without spaces or dashes, such as +15550000000 or +351912000000.


Configure the campaign webhook input


The Campaign Trigger node accepts a POST request containing the recipient and the two values used by Jim’s approved template:


{
  "to_number": "+351912000000",
  "customer_name": "Alex",
  "sandwich_name": "The Smoky Jim"
}


Keep the sender number, Website ID, template name, and API credentials fixed inside n8n whenever possible. The calling tool only needs to provide values that change for each recipient, which reduces the risk of someone using the webhook to select another sender or template.


Configure the Crisp HTTP request


Set the Send WhatsApp Template HTTP Request node to:

  • MethodPOST
  • URL → the Crisp send-template route containing your Website ID
  • AuthenticationGeneric Credential Type with Basic Auth
  • Body Content TypeJSON
  • Specify BodyUsing JSON


Paste this body into the node and adapt the static values to your approved template:


={
"message_template": {
"language": "en_US",
"name": "new_sandwiches_available",
"components": [
{
"type": "BODY",
"parameters": [
{
"type": "text",
"text": {{ JSON.stringify($json.body.customer_name) }}
},
{
"type": "text",
"text": {{ JSON.stringify($json.body.sandwich_name) }}
}
]
}
]
},
"crisp_options": {
"type": "note",
"new_session": false,
"auto_resolve": false
},
"to_number": {{ JSON.stringify($json.body.to_number) }},
"from_number": "+15550000000"
}


Using note is usually the best option for campaigns. When there was no previous conversation, the campaign does not fill the Inbox and the conversation becomes visible when the recipient replies. The callback still returns a session_id that can be used to locate the conversation. Use text only when operators need the outbound message to appear immediately, and include the component text when doing so.


Template sent visible as a private note in Crisp



Trigger the campaign


Once the workflow is active, copy the Production URL from the Campaign Trigger node. Your CRM, database, form, or other automation can call it whenever a recipient should receive the campaign.


This example uses the X-Campaign-Key header configured in the n8n Header Auth credential:


curl --request POST "N8N_PRODUCTION_WEBHOOK_URL" \
  --header "Content-Type: application/json" \
  --header "X-Campaign-Key: YOUR_RANDOM_SECRET" \
  --data '{
    "to_number": "+351912000000",
    "customer_name": "Alex",
    "sandwich_name": "The Smoky Jim"
  }'


When Crisp accepts the request for processing, n8n returns a response similar to this:


{
  "error": false,
  "reason": "request_accepted",
  "data": {
    "request_id": "5b53556a-36a3-44f4-9c4a-7df79d9dd4d6"
  }
}


Store the request_id in your source system when you need to correlate the initial campaign request with its later callback. A request_accepted response confirms that Crisp accepted the request, but it is not the final send result.


For a larger audience, call the webhook once per opted-in contact. If the contact list enters n8n as an array, split it into individual items and connect the resulting items to Send WhatsApp Template.



Handle the Crisp callback


Register the callback URL


The callback reports the final result after Crisp attempts to send the template. The imported workflow receives it through the Crisp Callback webhook.


Register the callback after the workflow is configured:

  1. Replace CHANGE-ME in the Crisp Callback → Path with a long random value.
  2. Activate the n8n workflow so its production webhooks are registered.
  3. Copy the Production URL from Crisp Callback.
  4. In Crisp, open Plugins → WhatsApp → API Settings → Callback URL, paste the URL, and save it.


The callback webhook responds immediately to Crisp, then the remaining n8n nodes inspect and log the payload.


Flag failures in n8n


The imported callback branch handles each result as follows:

  • error is false → the execution finishes successfully in n8n and retains the callback payload in the execution history
  • error is trueStop on WhatsApp Error marks the execution as failed and includes the request_id and reason in the error message


A successful callback looks similar to this:


{
  "request_id": "5b53556a-36a3-44f4-9c4a-7df79d9dd4d6",
  "error": false,
  "reason": "message_sent",
  "data": {
    "crisp_fingerprint": 167846286335114,
    "whatsapp_message_id": "wamid.HBgMMzUxOTEyMDEzMzc4FQIAERgSODA1NUQ2NEJGN0VEMjcxRkZBAA==",
    "session_id": "session_c63dcd31-cca9-46aa-91b0-6e9096191a88"
  }
}


For a permanent delivery log, add a Data Table, Google Sheets, or database node after Was There an Error?. You can also place a Slack or email notification before Stop on WhatsApp Error so your team is alerted as soon as a send fails.


Callback payloads can contain phone numbers, message identifiers, and Crisp conversation references. Limit access to the workflow and retain this data only for as long as your business needs it.



Test and activate the workflow


Test the complete path with one recipient before using it for a customer segment. This confirms that the template variables, sender, credentials, callback, and credits are all working together.


Use this sequence for the first test:

  1. Finish configuring both webhook nodes, the Crisp credential, the Website ID, the sender number, and the approved template.
  2. Activate the workflow and register the Crisp Callback production URL in Plugins → WhatsApp → API Settings → Callback URL.
  3. Call the Campaign Trigger production URL with your own opted-in WhatsApp number and valid template values.
  4. Confirm that the caller receives request_accepted with a request_id.
  5. Open n8n’s execution history and verify the later callback execution reports message_sent, or inspect the failed execution for its reason.
  6. Send to a small opted-in segment first, monitor callbacks and replies, then expand the audience gradually.


Treat the callback as the final source of truth. An accepted API request can still fail later because of the template, number, account, credits, or another WhatsApp delivery condition.



Troubleshooting


Check these common causes when the workflow does not behave as expected:

  • The API request is unauthorized → verify that n8n uses Basic Auth, with the Crisp token identifier as the username and the token key as the password
  • The template cannot be sent → confirm that its name and language match an approved template and that the parameters follow the same order as the template variables
  • The phone number is rejected → use international format with the leading +, country code, and no spaces or dashes
  • The request is accepted but no message arrives → inspect the callback execution for its reason, then check the template status, sender number, recipient, and available WhatsApp credits
  • No callback reaches n8n → confirm that the workflow is active and that Plugins → WhatsApp → API Settings → Callback URL contains the callback node’s production URL
  • The campaign is not visible in the Inbox → this is expected when crisp_options.type is note; wait for the recipient to reply or use the returned session_id to locate the conversation


For media headers, buttons, catalog templates, flows, and the complete route schema, use the Crisp WhatsApp Business API guide together with the live reference in Plugins → WhatsApp → API Reference.

Updated on: 17/07/2026

Was this article helpful?

Share your feedback

Cancel

Thank you!