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.

EventDescription
sale.created.v1A sale was first recorded. Carries the full PublicSale object inline.
sale.updated.v1A sale's content changed materially (items, charges, or discounts modified). Carries the updated PublicSale object inline.
sale.status.updated.v1A lifecycle status change (kitchen prepared, dispatched, cancelled, delivered, etc.). Does not carry a sale object.

Events

sale.created.v1

Fires 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: externalId vs displayId

The data.sale object carries two distinct identifier fields:

FieldAudiencePurpose
data.sale.externalIdMachines / developersYour 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, receiptsShort, human-readable label (max 15 chars) printed on receipts and shown on KDS screens. If omitted, Flipdish falls back to externalId as the display label — so if externalId is a long UUID, also supply a short displayId.

There is also data.sale.customer.externalId, which identifies the customer in your system — entirely separate from the sale-level externalId. See Sale object schema for full field details.

sale.updated.v1

Fires 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

A 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.

📘

externalId on status events

sale.status.updated.v1 does not carry a sale sub-object (it only signals a lifecycle state change). externalId is therefore absent from status events. If you need the external ID for a given saleId, correlate via the org-wide GET endpoint.


Webhook body structure

All sale.* webhook deliveries share the same outer envelope:

FieldNotes
eventTypeEvent name, e.g. sale.created.v1.
eventIdUnique delivery ID for this event instance.
eventCreatedAtISO 8601 UTC timestamp of when the event was produced.
dataEvent-specific payload (see table below).

data fields

The following fields appear inside data for all sale.* events:

FieldTypeNotes
orgIdstringOrg the sale belongs to.
brandIdstringBrand the sale belongs to.
propertyIdstringProperty (physical location) the sale belongs to.
salesChannelIdstringID of the sales channel (e.g. sc123).
salesChannelTypeenumPlatform that originated the sale: UberEats, FlipdishKIOSK, POS, etc.
sourcestringFree-text producer label set by the submitting system (e.g. App, POS). Optional.
saleIdstringFlipdish sale identifier (Crockford base32, e.g. 3N356).
saleobjectFull 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