POST request to the endpoint(s) you configure.
The event payload reuses the same object returned by the matching Merchant
API V2 endpoint — Get order for order
events and Get product for product
events — so you only need to model each shape once.
Configuring endpoints
Add and manage endpoints in your admin dashboard under Settings → Apps → Webhooks. For each endpoint you choose:- Endpoint URL — an
https://URL that acceptsPOSTrequests. - Events — which events this endpoint subscribes to.
Events
Payload
Every delivery has the same envelope.data is the V2 object for the event —
an Order for order.* events, a Product for product.updated.
answers, prices and quantities share the same
order — index n of each describes the same selected choice. quantities is
1 for options without a quantity selector.
A selected product variant is delivered as its own line item: variant_id
identifies it and name includes the variant name. The amount ordered is
quantity_float when nonzero (weighed or estimated items, e.g. 0.5),
otherwise quantity — a fractional item stores quantity as 0. When the
product is sold by measure, unit (a ProductUnit such as ML, L, KG,
G, PCS) and unit_value carry the measurement; both are null otherwise.
Ad attribution
attribution tells you the order came from a Meta Click-to-WhatsApp ad. It is
null for every other customer — organic WhatsApp, Google Ads, referrals,
walk-ins and returning customers. Take App never guesses a click id.
To report a purchase to the Meta Conversions API, send the event only when
ctwa_clid is present, with action_source: business_messaging and
messaging_channel: whatsapp.
The click id is last-touch: if the customer taps a newer ad, later orders and
later deliveries of an existing order carry the newer id.
See Get order for the full Order schema.
Headers
Verifying signatures
Each request is signed with your endpoint’s signing secret using HMAC-SHA256. TheX-Take-Signature header looks like:
t— the Unix timestamp (seconds) when the request was signed.v1— the HMAC-SHA256 of{t}.{raw_request_body}, hex-encoded.
v1 with your secret over {t}.{raw_body} and compare
using a constant-time comparison. Reject requests whose timestamp is too old
(e.g. older than 5 minutes) to defend against replays.
Responding
Return a2xx status as soon as you’ve received the event. Do any heavy
processing asynchronously so you can respond quickly.
Retries
If your endpoint returns a non-2xx status or times out, delivery is retried
with exponential backoff. A 4xx response (other than 408 and 429) is
treated as a permanent rejection and is not retried.
Because retries and at-least-once delivery are possible, treat webhooks as
idempotent: use X-Take-Delivery-Id to ignore duplicates.
Automatic deactivation
If your endpoint keeps failing for 24 hours, it may be automatically disabled. We’ll email the organization owners. Fix the endpoint, then re-enable it in Settings → Apps → Webhooks.Ordering
Events are not guaranteed to arrive in order. Use the object’supdated_at
field to discard stale updates if you persist order or product state.
Configure webhook endpoints in Settings → Apps → Webhooks.