Configure the webhook in the Facebook App
1
Access the Meta App Dashboard
Go to developers.facebook.com → your App → WhatsApp → Settings → Webhook.
2
Enter the callback URL
Paste the URL of the endpoint that will receive the events. In production, always use HTTPS with a valid certificate.If you are testing locally, use ngrok or Hookdeck to expose your server:
3
Set the Verify Token
Choose a random, secure string (e.g.
my_secret_token_123). Meta makes a GET request to your endpoint at setup time with the parameters hub.mode, hub.verify_token, and hub.challenge. Your server must respond with the value of hub.challenge if the token matches.Node.js
4
Select fields
Enable at least messages to receive messages and statuses. Other useful fields:
message_template_status_update, phone_number_quality_update.Difference between Meta webhook and Timely webhook
If you use Timely as an intermediary (the default case), you do not need to register a webhook with Meta — Timely handles that for you. This documentation is for cases where you connect WABA directly or need to debug the full flow.
Signature validation
Meta signs each request with the App Secret of your Facebook App using HMAC-SHA256. The header sent isX-Hub-Signature-256.
Node.js
Payload: received text message
Payload: sent message status
Statuses arrive when the message changes state:sent → delivered → read.
Payload: media message (image, audio, document)
GET https://graph.facebook.com/v19.0/{MEDIA_ID} request with your access token. Timely.ai performs this download automatically and stores the public URL in the media_url field of the normalized message.
Key payload fields
Next steps
Platform webhooks
Understand Timely.ai’s normalized outbound webhooks.
Channels — API Reference
Manage WhatsApp channels via API.