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.
In this guide, you will:
- Check the requirements → connect WhatsApp, approve a template, and add credits
- Prepare Crisp → collect the Website ID, API route, token, and callback setting
- Configure n8n → import the starter workflow and map campaign data
- Trigger a campaign → call the protected webhook from your CRM or another tool
- Handle callbacks → identify successful and failed sends
- Test the complete setup → validate one recipient before sending a larger campaign
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
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:
- Path → Account Tools → Message Templates
- Category → Marketing
- Name →
new_sandwiches_available - Language →
en_US - Body →
Hi {{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.
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

The send-template route follows this format:
https://plugins.crisp.chat/urn:crisp.im:whatsapp:0/wa/api/website/{website_id}/template/sendReplace {website_id} with the Website ID copied from your workspace.
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

After importing, update these nodes:
- Campaign Trigger → create or select a Header Auth credential, for example with header name
X-Campaign-Keyand 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_IDwith your Crisp Website ID - Send WhatsApp Template → JSON Body → replace
+15550000000with 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-MEwith 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:
- Method → POST
- URL → the Crisp send-template route containing your Website ID
- Authentication → Generic Credential Type with Basic Auth
- Body Content Type → JSON
- Specify Body → Using 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.

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:
- Replace
CHANGE-MEin the Crisp Callback → Path with a long random value. - Activate the n8n workflow so its production webhooks are registered.
- Copy the Production URL from Crisp Callback.
- 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:
errorisfalse→ the execution finishes successfully in n8n and retains the callback payload in the execution historyerroristrue→ Stop on WhatsApp Error marks the execution as failed and includes therequest_idandreasonin 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.
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:
- Finish configuring both webhook nodes, the Crisp credential, the Website ID, the sender number, and the approved template.
- Activate the workflow and register the Crisp Callback production URL in Plugins → WhatsApp → API Settings → Callback URL.
- Call the Campaign Trigger production URL with your own opted-in WhatsApp number and valid template values.
- Confirm that the caller receives
request_acceptedwith arequest_id. - Open n8n’s execution history and verify the later callback execution reports
message_sent, or inspect the failed execution for its reason. - Send to a small opted-in segment first, monitor callbacks and replies, then expand the audience gradually.
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.typeisnote; wait for the recipient to reply or use the returnedsession_idto locate the conversation
Updated on: 17/07/2026
Thank you!