menu_entity_id on every order line item maps straight back to your own catalog.
Publishing requires the menus:write scope and an active connection to the location. Reading requires menus:read. See How Maple works for connections.
The shape of a menu
A menu is a tree with shared definitions alongside it:- Every object has an
externalId— your stable handle for it. You choose these; Maple never changes them. Re-publishing with the sameexternalIdupdates the same object. The response also mints Maple IDs (item_…,var_…,ctg_…) for reference, but you address objects by yourexternalId. - The price lives on the variation. Even a simple item has at least one variation (call it “Regular”). All prices are integer minor units —
450is $4.50.
A minimal menu
The smallest valid document is a currency and one category containing one item with one variation:externalIds you sent are echoed back unchanged.
Add shared modifiers
Define a modifier group once at the top level and reference it bygroupId wherever it applies — so “Milk options” stays in one place across every drink:
name and options) or a reference ({ "groupId": "grp-milk" }). Don’t mix the two shapes in one entry — a payload that does is rejected rather than silently truncated. Items, variations, and individual options can each carry modifier groups, which lets you nest options where the menu calls for it.
Publishing semantics
Every publish sends the entire menu as its desired state. Maple diffs it against the current menu (keyed byexternalId) and applies the result as a new version. A few rules follow from that:
- The document is the whole menu. Whatever you send becomes the menu. An object you published before but leave out of a later publish is removed — to keep something, include it every time.
stockStatusis the exception. It’s a field-level value: leaving it off an object you do include preserves that object’s current stock (new objects default toin_stock). So 86-ing an item is still a complete publish that includes every object — you just set one field.- Identity is your
externalId. The sameexternalIdupdates the same object across publishes; a new one creates a new object. Use IDs that are stable in your system (a SKU or primary key), not display names. - Order is preserved. Categories, items, variations, and options appear in the order you send them.
- Validation is all-or-nothing. If anything is invalid you get a
400listing every issue, and the menu is left exactly as it was. Fix them all and re-send. - Identical re-publishes are no-ops. Sending the same document changes nothing and creates no churn, so you can safely publish on every menu change.
- Each change is versioned. A content change cuts a new version; the location always serves the current one.
Set the timezone for availability
Availability windows (dayparting and happy hours) are evaluated in the menu’s timezone. Set it with the top-leveltimezone field — an IANA name like America/New_York:
Read it back
externalId you published it under. A location with no published menu returns a 404.
Know when a publish lands
Subscribe to the menu sync events to be notified as a published menu propagates:| Event | Meaning |
|---|---|
menu.sync.completed | A menu sync finished for a location |
menu.sync.failed | A menu sync failed for a location |
Next
Receive and decide orders
Order line items reference your menu by the
externalId you assign.Full menu schema
Every field on every menu object, in the endpoint reference.