Description
What is a webhook endpoint?
A webhook endpoint is the receiving side of every WhatsApp event: a publicly reachable HTTPS URL plus the infrastructure and code behind it. Meta calls it with a GET to verify it when you register it, then with a POST for every batch of events — inbound messages, delivery statuses, template and account updates. It has to be reachable around the clock, because Meta offers no API to fetch webhooks you missed: anything the endpoint fails to receive is retried for up to seven days and then gone.
Meta's requirements are short but strict. The URL must use HTTPS with a valid certificate that is correctly installed — self-signed certificates are not supported — so serve the full chain from a public certificate authority and renew it automatically. Payloads can be up to 3 MB and carry up to 1,000 updates, so every proxy in front of the handler must accept bodies that large. Meta's webhook servers come from IP ranges that change periodically, which is why Meta recommends mutual TLS over IP allowlists if you want to restrict who can connect: once mTLS is enabled on your WhatsApp Business Account webhook subscription, Meta presents a client certificate and your server checks that its common name is client.webhooks.fbclientcerts.com. That certificate is now signed by a Meta-owned certificate authority, which replaced the DigiCert-signed one that expired on 15 April 2026, so a trust store still pinned to the old chain rejects Meta's connections.
Hosting choices follow from that: a container or VM fleet behind a load balancer, a serverless function behind an API gateway, or a managed ingestion layer that writes straight to a queue. Partners that serve many customers can also point individual WhatsApp Business Accounts or phone numbers at different endpoints with a webhook override (an alternate callback URL of up to 200 characters), for fields such as messages; template and account webhooks always go to the app's default URL.
The endpoint is where and how events are received; the webhook acknowledgement is the per-request contract — return 200 once the event is stored. A well-hosted endpoint with a slow handler still fails, and a perfect handler on an expired certificate receives nothing.
Key takeaways
- A webhook endpoint is the public HTTPS URL, and the servers behind it, that receives every WhatsApp event for your app.
- It needs a valid CA-signed certificate served with its full chain; Meta does not support self-signed certificates.
- Accept request bodies of at least 3 MB: webhook payloads can reach that size and batch up to 1,000 updates.
- Meta changes its webhook IP addresses periodically and suggests mutual TLS rather than IP allowlists.
- There is no API to fetch missed webhooks: failed deliveries are retried for up to seven days, then dropped.
Mechanics
How does a webhook endpoint work?
step 1 — Choose a stable public URL
Use a dedicated hostname and path, such as
https://hooks.example.in/webhooks/whatsapp, that does not change between deploys and is not tied to a developer's tunnel.step 2 — Install a CA-signed certificate
Serve the full certificate chain over Transport Layer Security 1.2 or later and automate renewal. Self-signed certificates are not supported, and an incomplete chain fails the same way.
step 3 — Answer verification and check signatures
Handle the webhook verification request — a GET with
hub.mode,hub.verify_tokenandhub.challenge— and validateX-Hub-Signature-256on every POST before trusting it.step 4 — Size it for bursts
A broadcast produces a wave of statuses — up to three per message. Accept 3 MB bodies, run at least two instances, and hand events to a durable queue so ingestion never waits on processing.
step 5 — Register it and subscribe
Save the callback URL and verify token in your app's WhatsApp webhook settings, subscribe to the fields you need, and add per-WABA or per-number overrides only where you need separate endpoints.
step 6 — Monitor it from outside
Probe the URL from an external location, alert on certificate expiry, on non-200 responses and on a drop in event rate — silence is the failure you will not otherwise see.
Properties
A webhook endpoint: key facts and limits
- Transport
- HTTPS, valid CA-signed certificate
- Self-signed certificates
- Not supported
- Maximum payload
- 3 MB, up to 1,000 updates
- Missed events
- Retried up to 7 days; no history API
- mTLS client certificate
- CN client.webhooks.fbclientcerts.com
- mTLS trust anchor
- Meta-owned outbound CA (the DigiCert-signed cert expired 15 April 2026)
- Override URL length
- Up to 200 characters
Usage
A webhook endpoint in code
upstream webhook_handlers {server 10.0.1.11:8080;server 10.0.1.12:8080; # at least two instances}server {listen 443 ssl;server_name hooks.example.in;ssl_certificate /etc/letsencrypt/live/hooks.example.in/fullchain.pem; # full chainssl_certificate_key /etc/letsencrypt/live/hooks.example.in/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;client_max_body_size 4m; # Meta payloads reach 3 MB; nginx defaults to 1 MBlocation = /webhooks/whatsapp {proxy_pass http://webhook_handlers;proxy_read_timeout 10s;}}
Full certificate chain, a body limit above 3 MB and more than one handler behind the proxy.
Why it matters
Why does a webhook endpoint matter?
The endpoint is the single doorway for everything your customers say on WhatsApp. If it is unreachable, mis-certified or saturated, inbound messages stop reaching agents and bots, delivery statuses stop updating campaigns and template pauses go unnoticed — and nothing on Meta's side will page you. Treating it as production infrastructure, with its own monitoring, capacity plan and certificate renewal, is what keeps a WhatsApp integration two-way.
Caveats
Common mistakes with a webhook endpoint
An expired or incomplete certificate
A missed renewal, or serving cert.pem instead of the full chain, makes Meta's TLS handshake fail and every event queue up as a retry. Automate renewal and alert well before expiry.
Proxies rejecting large bodies
Many proxies and frameworks default to 1 MB. A large batch then gets 413, Meta retries it, and it fails again. Raise every limit in the path above 3 MB.
Bot protection in front of the URL
CAPTCHAs, JavaScript challenges, basic auth or geo-blocking on the webhook path block Meta's servers. Exempt the path and authenticate with the signature or mTLS instead.
Development URLs in production
A tunnel URL from a laptop works in a demo and disappears when the laptop sleeps. Register only stable, monitored hostnames for live numbers.
Stale IP allowlists
Meta's webhook IP ranges change periodically, so a hard-coded allowlist eventually drops real traffic. Prefer mTLS plus signature checks.
Example
Example: An Ahmedabad D2C brand's first big sale
An Ahmedabad skincare brand ran its webhook handler on a single small VM. During its first big sale the status wave from a 200,000-message campaign pushed response times past several seconds, Meta started retrying, and the inbox lagged for an hour. It moved the endpoint behind a load balancer with two instances, raised the proxy body limit to 4 MB, put a queue between the handler and its CRM sync, and added an external probe plus a certificate-expiry alert. The next sale's status wave was absorbed by the queue while the handler kept answering in milliseconds.
Notes
Best practices for a webhook endpoint
- Keep the webhook path on its own hostname so firewall, rate-limit and WAF rules can treat it separately.
- Make webhook testing routine: run the three pre-launch checks in CI against staging after every infrastructure change.
- Separate ingestion from processing: the endpoint stores and acknowledges, and webhook fan-out to inbox, CRM and bots happens behind a queue.
- Graph the event rate per field; a sudden flat line is an outage even when nothing errors.
Questions
Webhook Endpoint FAQs
- Can I use a self-signed certificate?
- No. Meta requires a valid certificate that is correctly installed, and self-signed certificates are not supported. Free CA-signed certificates with automated renewal work well, as long as you serve the full chain.
- Does the endpoint need a fixed IP address?
- No. Meta connects to your hostname. What changes is Meta's own IP ranges, which is why Meta suggests mTLS rather than IP allowlists if you need to restrict access.
- Can a serverless function be my WhatsApp webhook endpoint?
- Yes, if it answers quickly and reliably. Keep the function to verify, store and acknowledge, watch cold-start latency, raise the gateway's body limit above 3 MB and push events to a queue for processing.
- Can different phone numbers use different endpoints?
- Yes, for some fields. Webhook overrides set an alternate URL per WhatsApp Business Account or per phone number for fields such as messages, while template and account fields always go to the app's default URL.