Payloads here are documented from what Maple emits, but they aren’t formally schema-typed yet — new fields may be
added. Validate defensively (ignore unknown fields), and treat
GET /v1/orders/{orderId} as the authoritative source
for an order’s current state. The live list of event types is always at GET /v1/webhook_event_types.data differs by type. This page documents each event type. For signing, delivery, retries, and replay, see Webhooks.
Order events
Order webhooks come in two kinds, and knowing which is which is the key to using them well:order.notificationis the event you fulfill against. It hands you the order’s content to act on, fires once at handoff, and its delivery is treated as critical. Build your accept / deny / ready / complete loop on it.order.created,order.paid, andorder.cancelledare lifecycle events. Each reports one moment in the order’s life with summary data, for awareness and reconciliation. Becauseorder.notificationfires only once and never updates, these are how you learn about things that happen before or after that snapshot — most importantly a cancellation, or payment settling later.
Which order events should I subscribe to?
- Fulfilling orders (a POS):
order.notificationandorder.cancelled— receive orders, and stop when one is cancelled. Addorder.validation_requestedif you pre-validate. - Reporting or reconciliation (an OMS, dashboard, analytics): also
order.createdandorder.paid, to mirror the order and payment lifecycle.
The order.notification payload
order.notification (and order.validation_requested) carry the order’s content in data — enough to start fulfilling, following the GET /v1/orders/{orderId} shape:
status or payment. For the authoritative current state (status, payment, per-item tax, timestamps), fetch GET /v1/orders/{orderId}. The lifecycle events carry only the summary fields listed above.
scheduled_for is null for ASAP orders. When set (ISO 8601, UTC), the customer chose that pickup/delivery time — the notification still arrives immediately, so prepare the order for scheduled_for, not on receipt.
delivery_address is null for pickup orders and for delivery orders without a stored address. When present, all six keys are included; notes contains the delivery instructions and unit or notes may be null.
Not a status feed
Maple does not emit a webhook for every status transition. The transitions you drive yourself (accept, ready, complete) aren’t echoed back, and there’s no event for reaching IN_DELIVERY or for payment moving to refunded / voided / failed. Read the order resource for current state — see the Order lifecycle.
Booking events
Booking events are delivered to every active app granted the location whose allowed scopes includebookings:read and whose subscription matches the event type. They do not require the app to own the POS connection. The location’s bookings rollout flag must be enabled.
All eight use the same
data shape. The embedded booking matches the GET resource:
previous_status is null. An event name can therefore describe an earlier change than the embedded booking’s current status. Once recorded for a recipient, retries keep that payload and event identity.
Every original outbox event gets a stable identity per app/environment. Two changes to the same booking remain distinct even when both are dispatched at the same booking version. Dedupe by event ID and reconcile by booking id/version; do not depend on delivery order. The independent developer consumer does not advance the guest-communications cursor. No floor events are forwarded in this release; waitlist changes have their own events.
A recipient’s enqueue failure does not stop other eligible apps or subscriptions from being enqueued. Retries reuse the same per-subscription event identity. Booking-event publication uses at most three dispatch attempts, each with bounded internal retries. Malformed internal events and exhausted dispatch attempts are retained for operator investigation instead of blocking later events or retrying forever. This is separate from HTTP webhook delivery retries. Use GET /v1/bookings?updated_since=… to reconcile current booking state after a delivery gap.
Waitlist events
Waitlist events reach the same apps as booking events: every active app granted the location whose allowed scopes includebookings:read and whose subscription matches the event type. They are sent for Maple-native locations while the location’s bookings rollout flag is enabled. See Run the waitlist.
All five use the same
data shape. The embedded waitlist_entry matches GET /v1/waitlist_entries/{entryId}:
waitlist_entry.created delivered after the party was seated already shows seated. Branch on the event type for what happened, and on waitlist_entry.status for where the entry is now. Each change has its own event ID per app and environment; dedupe by event ID and do not depend on delivery order. Delivery attempts, retries, and quarantine of malformed internal events follow the booking-event rules above. Seating also creates a walk-in booking, which is reported by the booking events you subscribe to.
Location (store) events
These track your access to a location — the connection lifecycle:Menu events
See Publish a menu.
Test event
webhook.test is delivered on demand by POST /v1/webhook_subscriptions/{id}/test. Use it to verify your handler before any real traffic. It is never emitted by real activity.