Dashboard
1. Activate Coexistence
Loading Facebook SDK…
Once set, WhatsApp delivers incoming messages straight to this URL — we're never in that path.
Your endpoint needs to handle these, not just plain messages
smb_message_echoes |
A human sent a message from the phone's WhatsApp Business App. Ignore it and your bot won't know — it may auto-reply to the same customer, causing a double response. |
smb_app_state_sync |
Contacts added/removed in the Business App. Ignore it and your contact list drifts out of sync. |
✅ Coexistence activated — one thing left
Update to check for
change.field === 'smb_message_echoes' and handle
it — otherwise a human replying from the phone app will look
invisible to your integration:
app.post('/whatsapp-webhook', (req, res) => {
for (const entry of req.body.entry) {
for (const change of entry.changes) {
if (change.field === 'smb_message_echoes') {
for (const echo of change.value.message_echoes) {
saveToConversationHistory(echo.to, { direction: 'out', from: 'human', ...echo });
pauseAutoReplyFor(echo.to, { minutes: 30 });
}
} else if (change.field === 'messages') {
// normal customer-initiated messages, handled as usual
}
}
}
res.sendStatus(200);
});
Full payload shape and why this is needed: Why Coexistence? above.
2. Send messages through the relay
Once onboarded, send outgoing messages by calling our relay instead
of Meta directly — same request body Meta's own
/{phone-number-id}/messages endpoint takes, forwarded
with your own access token:
POST /api/relay/<phone-number-id>/messages
Authorization: Bearer <your WhatsApp access token>
Content-Type: application/json
{
"messaging_product": "whatsapp",
"to": "<recipient>",
"type": "text",
"text": { "body": "Hello!" }
}
We never store your token — it's forwarded per-request. Rate limiting and per-recipient serialization are upcoming.
3. Verify it worked
Not a "send a test message" button — that only proves the relay works, which isn't in doubt. What actually matters:
- Coexistence activated? Check the phone's WhatsApp Business App itself — Meta refreshes it automatically to show the number is now connected to the API. No message needed.
- Is your echo handling correct? Send a message from that phone app and confirm your own server received an
smb_message_echoeswebhook for it. Only your real phone + your real server can prove this — nothing we send on your behalf would test it.
Recording App Review videos?
Use the send-message / create-template test buttons on the Test page — not part of the product, just there to satisfy Meta's demo-video requirement.