You stated when the goods will be ready (readyAt)
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>.
During a secret rotation a second v1= (old secret) is added;
accept when any v1 matches. t is the attempt’s time.
The event’s stable id (same as body id); identical on retries and replays.
Request Bodyrequired
Section titled “Request Bodyrequired”Thin event. id is stable per event and order: retries and
replays reuse it, so dedupe on it. No ordering guarantee: events of
one order may arrive out of order or late. data is the order as
it was when the event was queued (it may be newer than the event),
with its version: apply data as order state only when
version is higher than the last you applied, but act on every new
event id (some events share a version). GET /v1/merchant/orders/{order} is the source of truth.
object
An EventType or webhook.test.
When it happened.
Fields present when they apply. Never the door code, pickup instructions or note.
object
On demand: placed → awaiting_goods → searching → driver_assigned →
picked_up → delivered. Window: placed → scheduled → picked_up →
delivered. cancelled and failed end either, with reason.
The order’s version (as on the order) when the event was queued. Absent on webhook.test.
Why a cancelled or failed order ended.
object
object
object
Held orders only (assisted checkout). “Driver found” = status
pending and driver assigned. The order status alone is not
enough (it stays driver_assigned while a driver gives the job
back).
object
The checkout budget passes then and the order is cancelled at its current fee stage. Present while it runs.
webhook.test only.
Responses
Section titled “Responses”Received. Any other answer, no answer within 15 s, or a redirect (not followed) is a failure, retried after 30 s, 2 m, 10 m, 30 m, 1 h, 3 h, 6 h, 6 h, 6 h (10 attempts, about 23 h), then given up (replayable for 30 days).