All articles
WhatsApp Business API

WhatsApp API Webhooks: Events, Setup, Payloads & Common Errors

8 Sept 2026 Approx 7 min read

Chethan Kumar

Chethan Kumar

Founder & CEO, Emovur

SHARE

Summarise this post with:

WhatsApp API Webhooks: Events, Setup, Payloads & Common Errors

WhatsApp API Webhooks: Events, Setup, Payloads & Common Errors 

A WhatsApp API webhook is an HTTP callback that sends WhatsApp events from the platform to your application. It allows your system to receive notifications when customers send messages, when message statuses change, and when other subscribed events occur. The basic flow is simple:

 configure a webhook endpoint, make it reachable over HTTPS, subscribe to the relevant WhatsApp Business Account, and process the JSON payload your application receives. Meta's official Postman collection confirms that webhook events are sent to the configured webhook URL after the relevant WABA subscription is in place 

What Is a WhatsApp API Webhook? 

A webhook is the mechanism the WhatsApp Business API uses to notify your application about activity tied to your business phone number. Rather than your app repeatedly asking "any new messages?", Meta's servers send an HTTP POST request to a URL you control every time a subscribed event fires.

This push-based model is what makes real-time chat, delivery receipts, and automated workflows possible. A webhook only works after two things are in place: your endpoint is publicly reachable over HTTPS, and it has completed Meta's one-time verification handshake.

WhatsApp Webhook Events You Can Subscribe To 

Once your endpoint is verified, you choose which event fields to subscribe to from the Meta App Dashboard. Each field controls a category of notifications. 

Event Field

What It Triggers

Typical Use case

messages 

Inbound customer messages, media, replies, reactions, and outbound message status updates (sent, delivered, read, failed) 

Chat inboxes, auto-replies, delivery tracking 

message_template_status_update 

Changes to a template's approval or quality rating 

Alerting teams when a WhatsApp message template is rejected or flagged 

account_update 

Changes to account status, restrictions, or bans 

Compliance monitoring 

phone_number_quality_update 

Messaging limit tier or quality rating changes on a number 

Throughput planning 

account_alerts 

Business verification and policy notices 

Admin visibility 

calls (where enabled) 

Call connect/missed/status events 

Voice-enabled integrations 

Most integrations only need messages, since it covers both inbound conversations and outbound delivery receipts — the two events developers ask about most. For the complete, current field list and payload schemas, always cross-check the WhatsApp API documentation alongside Meta's own reference.

Answer: The most common WhatsApp webhook events are inbound messages, outbound message status changes (sent, delivered, read, failed), and template status updates. Account-level events like quality rating changes and policy alerts are also available but subscribed to separately.

How to Set Up a WhatsApp API Webhook

Setting up a webhook has two phases: the one-time verification handshake, and the ongoing event subscription. Here's the sequence:

  1. Create or use a Meta Business app in the Meta App Dashboard and add the Webhooks product.

  2. Build a public HTTPS endpoint that can handle both GET (verification) and POST (event delivery) requests.

  3. Handle the verification GET request. Meta sends hub.mode=subscribe, a hub.verify_token you defined, and a hub.challenge string. Your endpoint must confirm the token matches and echo back the challenge value with an HTTP 200 status.

  4. Subscribe to the fields you need (e.g., messages) on the WhatsApp Business Account product in the dashboard.

  5. Return HTTP 200 quickly on every POST. Acknowledge receipt first, then process the payload asynchronously — Meta treats anything other than a 200 as a failed delivery and will retry.

  6. Test with a real message or status change before going live, and confirm the payload structure matches what your handler expects.

If you're implementing this on Emovur specifically, the platform's own configuration steps — API keys, callback registration, and field toggles — are documented in the Emovur webhook documentation, which should be treated as the source of truth for Emovur-side setup rather than generic tutorials.

Answer: Setting up a WhatsApp API webhook means registering an HTTPS callback URL in the Meta App Dashboard, passing the GET verification handshake (matching hub.verify_token and echoing hub.challenge), then subscribing to the event fields you want — most commonly messages.

Sample WhatsApp Webhook Payload (Example)

Every webhook notification arrives as a JSON object wrapped in the same outer structure, with the event-specific detail nested inside entry[].changes[].value.

{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "field": "messages",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "PHONE_NUMBER",
              "phone_number_id": "PHONE_NUMBER_ID"
            },
            "contacts": [
              { "profile": { "name": "CUSTOMER_NAME" }, "wa_id": "CUSTOMER_WA_ID" }

            ],

            "messages": [

              {

                "from": "CUSTOMER_WA_ID",
                "id": "MESSAGE_ID",
                "timestamp": "TIMESTAMP",
                "text": { "body": "MESSAGE_TEXT" },
                "type": "text"   }  ]          ]    }  ]}

A few structural rules worth internalizing: the top-level object field is always whatsapp_business_account; entry can contain multiple items in a single request; and field tells you which subscription generated this notification, so your handler should branch on it before parsing value. Payloads can be up to 3MB, and a message type unsupported by the API arrives as an "unknown message" event rather than being dropped silently. 

Common WhatsApp API Webhook Errors & Troubleshooting 

Symptom

Likely Cause

Fix

Verification handshake fails (403) 

hub.verify_token mismatch, or endpoint not returning the raw hub.challenge value 

Confirm the token string is identical on both sides; return challenge as plain text, HTTP 200 

No events arriving at all 

Field not subscribed under the WhatsApp Business Account product, or endpoint on a different app than the phone number's current WABA 

Re-check field subscriptions; confirm the phone number is linked to the app you're testing 

Duplicate notifications for the same event 

Meta's retry system firing because your server didn't respond fast enough or returned a non-200 

Acknowledge with HTTP 200 immediately, then process asynchronously; de-duplicate using the message/event ID 

Notifications stop after an outage 

Endpoint was down or erroring for an extended period; Meta's retry backoff eventually expires and drops undelivered events 

Monitor uptime proactively — there is no replay API, so extended downtime means permanent data loss for that window 

Payload fields missing or unexpected 

Testing against an outdated schema, or the message type isn't fully supported 

Cross-reference the current Meta Cloud API webhook documentation for the authoritative schema 

SSL/handshake errors from Meta's servers 

Endpoint certificate invalid, expired, or self-signed 

Use a valid HTTPS certificate from a trusted CA; self-signed certs are rejected 

The single most consequential error pattern is silent, extended downtime: because there is no event log or replay mechanism on Meta's side, any webhook outage beyond the retry window is unrecoverable for the events that occurred during it. Alerting on failed deliveries,  not just on server crashes,  is the difference between a brief blip and permanently lost conversation history. 

WhatsApp Webhook Security & Best Practices

  • Verify the request signature:Meta signs payloads; validate the signature header against your app secret before trusting the body.

  • Respond fast, process later: Return HTTP 200 within a few seconds and hand off heavy work (database writes, downstream API calls) to a queue.

  • De-duplicate by message/event ID: Retries are expected behavior, not a bug — your handler should be idempotent.

  • Use mutual TLS where supported:  for an added layer of endpoint authentication.

  • Log and alert on non-200 responses:  from your own endpoint so failures surface before the retry window lapses.

  • Keep a staging endpoint: separate from production so schema or template changes can be tested without risking live traffic.


Final Takeway:

A WhatsApp API webhook connects WhatsApp events to your application in real time. The setup involves creating a secure HTTPS endpoint, configuring the webhook, subscribing the relevant WABA, and correctly processing the JSON events that arrive. Most webhook issues come from endpoint configuration, missing WABA subscriptions, incorrect event handling, or payload parsing. Start by testing the connection and subscription, then inspect the actual payload before changing your application logic. 

Frequently Asked Questions

What is a WhatsApp API webhook used for?
It allows your application to receive notifications when WhatsApp events occur, such as incoming messages and message status updates.

Do I need to subscribe my WABA to receive webhook events?
Yes. Meta's current documentation states that the relevant WhatsApp Business Account must be subscribed to the application to receive its webhook events.

Does a WhatsApp webhook receive only customer messages?
No. Depending on the subscribed events, webhooks can contain different types of notifications, including message-related events and business account updates.

Does a webhook need HTTPS?
Yes. Your webhook server needs to be publicly reachable and support HTTPS with a valid SSL certificate.

Where can I find a WhatsApp webhook example?
Meta's official Postman collection includes webhook examples and a webhook payload reference.

Where should I look for an Emovur-specific webhook setup?
Use the Emovur webhook documentation for implementation details specific to Emovur.

Why does my webhook verification keep returning a 403 error? 

This almost always means the hub.verify_token your server checks against doesn't exactly match the token you entered in the dashboard, or your endpoint isn't returning the hub.challenge value as plain text with an HTTP 200 status. 

How large can a webhook payload be?

 Cloud API webhook payloads can be up to 3MB, which comfortably covers text, media metadata, and multi-message batches in a single notification. 

Once your webhook is verified and stable, the next step is wiring up message sending and template management on top of it — start by reading the Emovur developer documentation to configure your callback URL and event subscriptions correctly from day one.

TABLE OF CONTENTS

Grow every location with Emovur

Practical playbooks and product ideas for multi-location businesses — WhatsApp, CRM, reviews, and social, all in one platform.

Explore Emovur

Get local marketing tips, straight to your inbox

One short email a fortnight. No product pitches.