Sale webhook events
The sale.* event family delivers full sale payloads inline for every sale recorded on Flipdish, regardless of channel.
Overview
The sale.* event family fires for every sale recorded on Flipdish — regardless of channel (POS, kiosk, web, marketplace, or API). The full sale object is embedded in the event payload, so no follow-up GET is required.
| Event | Description |
|---|---|
sale.created.v1 | A sale was first recorded. Carries the full PublicSale object inline. |
sale.updated.v1 | A sale's content changed materially (items, charges, or discounts modified). Carries the updated PublicSale object inline. |
sale.status.updated.v1 | A lifecycle status change (kitchen prepared, dispatched, cancelled, delivered, etc.). Does not carry a sale object. |
Events
sale.created.v1
sale.created.v1Fires when a sale is first recorded. The data.sale field carries the complete PublicSale object at the moment of creation: items, modifiers, charges, discounts, payments, customer, delivery/dine-in details, and menu reference. See Sale object schema for a field-by-field breakdown of every nested object (customer, delivery, dineIn, items, charges, discounts, payments).
{
"eventType": "sale.created.v1",
"eventId": "01HXYZ...",
"eventCreatedAt": "2025-10-28T14:00:00.000Z",
"data": {
"orgId": "org123",
"brandId": "br123",
"propertyId": "p123",
"salesChannelId": "sc123",
"salesChannelType": "UberEats",
"source": "App",
"saleId": "3N356",
"sale": {
"dispatchType": "Delivery",
"externalId": "sale-external-123",
"displayId": "2A003",
"menuId": "123e4567-e89b-12d3-a456-426614174000",
"menuRevisionId": "123",
"customer": { ... },
"items": [ ... ],
"charges": [ ... ],
"discounts": [ ... ],
"payments": [ ... ]
}
}
}
Sale-level identifiers:externalIdvsdisplayIdThe
data.saleobject carries two distinct identifier fields:
Field Audience Purpose data.sale.externalIdMachines / developers Your platform's opaque order reference (e.g. a marketplace order UUID). Stored by Flipdish and usable as a lookup key. Never shown to staff by default. data.sale.displayIdHumans — kitchen staff, receipts Short, human-readable label (max 15 chars) printed on receipts and shown on KDS screens. If omitted, Flipdish falls back to externalIdas the display label — so ifexternalIdis a long UUID, also supply a shortdisplayId.There is also
data.sale.customer.externalId, which identifies the customer in your system — entirely separate from the sale-levelexternalId. See Sale object schema for full field details.
sale.updated.v1
sale.updated.v1Fires when a sale's content changes materially — items added or removed, charges or discounts modified. The embedded sale reflects the post-update state.
sale.status.updated.v1
sale.status.updated.v1A unified status event covering POS kitchen states, delivery states, and cancellation in a single discriminated union.
Status values: SALE_CANCELLED, SALE_PREPARED_BY_KITCHEN, SALE_DISPATCHED, SALE_ON_THE_WAY, SALE_DELIVERED.
externalIdon status events
sale.status.updated.v1does not carry asalesub-object (it only signals a lifecycle state change).externalIdis therefore absent from status events. If you need the external ID for a givensaleId, correlate via the org-wide GET endpoint.
Webhook body structure
All sale.* webhook deliveries share the same outer envelope:
| Field | Notes |
|---|---|
eventType | Event name, e.g. sale.created.v1. |
eventId | Unique delivery ID for this event instance. |
eventCreatedAt | ISO 8601 UTC timestamp of when the event was produced. |
data | Event-specific payload (see table below). |
data fields
data fieldsThe following fields appear inside data for all sale.* events:
| Field | Type | Notes |
|---|---|---|
orgId | string | Org the sale belongs to. |
brandId | string | Brand the sale belongs to. |
propertyId | string | Property (physical location) the sale belongs to. |
salesChannelId | string | ID of the sales channel (e.g. sc123). |
salesChannelType | enum | Platform that originated the sale: UberEats, FlipdishKIOSK, POS, etc. |
source | string | Free-text producer label set by the submitting system (e.g. App, POS). Optional. |
saleId | string | Flipdish sale identifier (Crockford base32, e.g. 3N356). |
sale | object | Full PublicSale payload. Present on sale.created.v1 and sale.updated.v1 only. |
Subscribing
Subscribe to sale.* events via the Webhook Service API or the Flipdish portal. See Subscribe to Flipdish Events (v3) for the full delivery contract, headers, and signature verification.
Related
- Subscribe to Flipdish Events (v3) — delivery contract and signature verification
- Sales Management API — full
PublicSaleschema, creating/cancelling sales, org-wide queries
Updated about 18 hours ago

