Automate WhatsApp Messages by User Events
Send WhatsApp messages the moment something happens: call the REST API from your backend, connect Zapier, Make or Pabbly, reply to keywords automatically, or start a chatbot flow when a customer writes in.
✦ 14-day free trial · Your own WhatsApp Business number · Meta bills messages directly
Event-Driven Message Automation
Call one API endpoint from your app or store backend — or use Zapier, Make or Pabbly — to send abandoned-checkout reminders, welcome messages and feedback requests as approved templates. Customer replies and delivery updates come back to you as signed webhooks.
- Signed webhooks for replies and delivery status, with a delivery log and redelivery
- Keyword auto-replies (exact, contains or starts-with) with text or template replies, matched on whole words (Team and Business)
- Connect Zapier, Make or Pabbly, or call the REST API from any backend
3 Steps to Automated Messaging
Define Your Trigger Event
Decide what sends the message: an event in your own backend, a Zapier, Make or Pabbly workflow, a keyword the customer sends, or a chatbot flow trigger. Keyword auto-replies are on Team and Business; chatbot flows are on Business.
Pick Your Template & Variables
Select an approved WhatsApp template and fill its variables for each customer. Delays such as '1 hour after cart abandonment' are timed by your own system or automation tool.
Activate & Monitor
Turn it on and follow delivery and read status in the dashboard, through the API, or by webhook.
Event Triggers vs. Polling Systems vs. Manual Webhooks
Compare setup overhead, network latency, and infrastructure resource costs for event automation.
| Comparison Point | Real-time Event Triggers | Cron Polling Systems | Manual Direct Webhooks |
|---|---|---|---|
| Message Latency | Seconds (sent as the event happens) | Minutes to hours (Batch run) | Seconds (direct hook) |
| Development Effort | Low (Configure on UI/API) | Medium (Write scheduler logic) | High (Handle edge failures) |
| Server Load Overhead | Minimal (Event-driven) | High (Heavy periodic DB scans) | Minimal (Push updates) |
| Error Handling | ✓ (Safe retries with Idempotency-Key, webhook redelivery) | ✗ (Manual correction needed) | ✗ (Requires custom script queues) |
Send an automated message from your own backend
curl -X POST https://waba-api.startmessaging.com/api/v1/messages \
-H "Authorization: Bearer sm_live_your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-confirm" \
-d '{
"to": "+919812345678",
"type": "template",
"template": {
"name": "cod_order_confirmation",
"language": "en_US",
"parameters": [
{
"text": "Asha"
},
{
"text": "#1042"
},
{
"text": "₹1,299"
}
]
},
"clientReference": "order-1042"
}' const res = await fetch('https://waba-api.startmessaging.com/api/v1/messages', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.SM_API_KEY,
'Content-Type': 'application/json',
'Idempotency-Key': 'order-1042-confirm',
},
body: JSON.stringify({
"to": "+919812345678",
"type": "template",
"template": {
"name": "cod_order_confirmation",
"language": "en_US",
"parameters": [
{
"text": "Asha"
},
{
"text": "#1042"
},
{
"text": "₹1,299"
}
]
},
"clientReference": "order-1042"
}),
});
const { data } = await res.json();
console.log(data.id, data.status); import os, requests
res = requests.post(
'https://waba-api.startmessaging.com/api/v1/messages',
headers={
'Authorization': f"Bearer {os.environ['SM_API_KEY']}",
'Idempotency-Key': 'order-1042-confirm',
},
json={
"to": "+919812345678",
"type": "template",
"template": {
"name": "cod_order_confirmation",
"language": "en_US",
"parameters": [
{
"text": "Asha"
},
{
"text": "#1042"
},
{
"text": "₹1,299"
}
]
},
"clientReference": "order-1042"
},
)
data = res.json()['data']
print(data['id'], data['status']) <?php
$body = <<<'JSON'
{
"to": "+919812345678",
"type": "template",
"template": {
"name": "cod_order_confirmation",
"language": "en_US",
"parameters": [
{
"text": "Asha"
},
{
"text": "#1042"
},
{
"text": "₹1,299"
}
]
},
"clientReference": "order-1042"
}
JSON;
$ch = curl_init('https://waba-api.startmessaging.com/api/v1/messages');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SM_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: order-1042-confirm',
],
CURLOPT_POSTFIELDS => $body,
]);
$data = json_decode(curl_exec($ch), true)['data'];
echo $data['id'] . ' ' . $data['status']; Report the sale back, credit the campaign
On the Business plan, when your shop or billing system records a sale, POST /api/v1/conversions credits it to the last campaign delivered to that number within your conversion window, and the campaign report adds up the value.
# Your shop marks an order paid: report it as a conversion (Business, scope conversions:write)
curl -X POST https://waba-api.startmessaging.com/api/v1/conversions \
-H "Authorization: Bearer sm_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"phone": "+919812345678",
"orderId": "ORD-10442",
"value": 2499.5,
"currency": "INR"
}' // In your order-paid handler
async function reportConversion(order) {
const res = await fetch('https://waba-api.startmessaging.com/api/v1/conversions', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.SM_API_KEY, // sm_live_your_api_key
'Content-Type': 'application/json',
},
body: JSON.stringify({
phone: order.customerPhone, // E.164, e.g. +919812345678
orderId: order.id, // safe to retry: the same orderId never counts twice
value: Math.round(order.total * 100) / 100, // at most 2 decimals
currency: 'INR',
}),
});
const { data } = await res.json(); // 201 = recorded, 200 = already reported
return data.conversion.campaign; // the campaign credited, or null
} Auto-Trigger — FAQ
Can I set delays for triggered messages?
Delays are set where the trigger lives. If you send from your backend or from Zapier, Make or Pabbly, time the API call there — for example, an abandoned-cart reminder 1 hour later and a second one at 24 hours. Inside chatbot flows, a 'wait delay' step pauses before the next message. Outside the 24-hour customer service window, only approved templates are delivered.
Which plan do I need for these automations?
The REST API and signed webhooks are on every plan, Developer Free included. Keyword auto-replies are on Team and Business. Chatbot flows, with their wait-delay steps, and reporting conversions with POST /api/v1/conversions are on Business. The 14-day free trial includes everything in Business.
Related Pages
Automate Your Customer Journeys
14-day free trial. Connect your own WhatsApp Business number in minutes.