Event ids on every webhook
Delivery is at least once, so the same event can reach you more than once. Every delivery now carries an id for the event itself, which makes deduplicating a one-line check.
What changed
event_idnames one event: this order reaching this state. Every delivery of it carries the same id, to every endpoint, on every retry and every replay.occurred_atis when the order changed.sent_atis still when Layout wrote the delivery.order.failure_codeis onorder.failed: the same stable codeGET /v1/orders/:idreturns, ornullwhen Layout recorded none.GET /v1/eventstakesafter, anevent_idyou already handled, and returns what came next. It also filters byorder_id,user_id,eventandsince.cursorkeeps working.
Why it matters
Keep the last event_id you processed. After an outage, ask the feed for everything after it, and skip any event_id you have already seen.
What to do
Deduplicate on event_id and order events by occurred_at. See Payload and GET /v1/events.
Breaking changes
None. The new fields are additive. Events written before this change carry them too, in the feed, on a retry still queued, and in a replay from the console.