450 = $4.50), and every object carries an externalId you own.
Multi-select: choose up to 3, max 2 different
“Pick your toppings — up to 3 total, but no more than 2 different kinds.” The total count and the distinct count are separate rules:maxSelections: 3caps the total quantity selected.maxUniqueSelections: 2caps the number of distinct options. A guest can take 2× Mushroom + 1× Olives (3 total, 2 kinds), but not three different toppings.maxQuantity: 3on each option allows doubling or tripling a single topping.
Nested modifiers
A choice that opens further choices — pick a side, and if it’s the salad, pick a dressing. Options can carry their own modifier groups:Order resources currently expose the directly-selected, first-level modifiers on each line item — deeper nested
selections aren’t expanded into the order resource yet.
Availability: daily specials
A breakfast section that only shows on weekday mornings. Put the window on the category (it narrows everything inside) or on a single item:dayOfWeekis0(Sunday) through6(Saturday); add one window per active day.startTime/endTimeare localHH:MM(24-hour), in the menu’s timezone — set the top-leveltimezone(it defaults to UTC).- An object with no
availabilityis always available.
Happy hour: a recurring discount
A recurring discount takes three top-level objects working together — what’s targeted (a product set), the discount math, and when it’s active (the promotion):- The product set says what the discount applies to (here, two drink items; use
"allProducts": truefor the whole menu). - The discount says how much (20% off). Other
benefitTypes includeamount,set_price,free_item, andbxgy. - The promotion ties them together and says when:
applicationMode: "automatic"applies it without a code, andavailabilitygives the recurring weekly windows. UsevalidFrom/validUntilfor a one-off campaign instead.
The IDs wiring these together —
discountId, benefitTargetProductSetId, and the itemIdsAny members — are the
externalIds you assigned. Cross-references in a menu always use your IDs, never Maple’s. The promotion’s
availability windows use the menu’s timezone (set the top-level timezone; it defaults to UTC).86 an item
Mark something out of stock without restructuring the menu — setstockStatus on the item (or variation):
stockStatus is in_stock, out_of_stock, or low_stock. Omitting it on a re-publish preserves the current value, so a stock update can be a small, targeted publish.
Combine them
These compose. A breakfast category (availability) can hold a build-your-own item (nested modifiers) with a “first topping free” group (freeSelectionCount), all while a happy-hour promotion runs on drinks. Publish the whole menu and Maple applies it as one diff — see Publish a menu.