What commercial teams should know
Products are the level where merchandising meets operations. Marketing promotes specific items; the kitchen must receive exactly what was configured.
Modifier groups and modifiers
Customization on a product is organized in modifier groups. Each group asks the customer a question; each answer inside the group is a modifier.
A group is the frame (“what drink do you want?”). Modifiers are the options the customer picks.
Modifiers can be their own products
In many menus, each modifier is not just a label — it points to a real product in your catalog. The combo does not embed a fake “Coke” string; it offers the same Coca-Cola product you sell standalone, with its own SKU, price delta, and kitchen mapping.- Combos and bundles — Base item + customer picks drink, side, or dessert from real catalog items.
- Upsell — “Add bacon” or “Make it large” as optional groups with priced modifiers.
- Kitchen accuracy — The ticket names the actual product the line cooks or pours, not an informal note.
- Inventory and 86 — If still water is out of stock in the POS, that modifier disappears from the group across channels.
Variants and variant groups
Some POS systems store each configuration of an item as its own product. A pepperoni pizza in medium thin crust has one PLU, and a large thick crust has another. Customers still expect one card (“Pepperoni pizza”) and a couple of questions. Variants model that: the answers don’t add extras, they reveal which product is actually being bought.- The base is only a selector. It never goes into the cart. The order line is the resolved variant product, with its own price, tax, availability, and modifier groups.
- One answer per group. Variant groups have no quantities or min/max rules. Every group on the base must be answered.
- Variants come first. Channels ask the variant questions before showing the resolved product’s modifier groups.
- Base products can’t have modifiers. A product with
variant_group_idscan’t also setmodifier_group_ids; put the modifier groups on each variant product instead. - Bases work as modifiers too. A modifier group can list a base product, for example a “Soda” base in a combo’s drink group. The base’s
pricing.modifiersentry for that group sets the quantity limits and default. The customer answers the base’s variant questions inside the modifier, and the cart line is the resolved variant product, along with its own modifier groups. That variant’spricing.modifiersentry for the group sets the charged price and tax; without an entry, its ownpricing.priceapplies. - Only real combinations are offered. As the customer answers, options with no matching product disappear. Options whose product is out of stock stay visible but disabled. Hidden or inactive variant products are treated as missing.
- Starting price. When omitted, the base’s
starting_priceis the starting price of its cheapest selectable variant.
product_ids, and each variant product lists, in pricing.variants, the base product_id plus the variant_group_option_ids that select it. A product can be a variant of more than one base.
Variant products don’t need to appear in a category, modifier group, or recommendation. The base being reachable is enough: the sync counts its variant products as referenced, and channel search lists both the base and each variant product.
Variant validation in menu sync
A menu sync is rejected, with an error that names the entity, when any of these rules fails:
See the Variants menu sync example for a full payload.
Pricing and bundles
Each product carries a pricing object per channel, store, and fulfillment context:Starting price
Some products can’t be ordered at their listprice because a required modifier group adds a charge, for example a pizza where every size costs extra. starting_price is the reference price customers see in that case. Product cards show “From $X” instead of price whenever starting_price is higher than price.
The calculation uses the same rules as checkout: per-modifier and per-group
minimum_quantity, modifier maximum_quantity, charge_above_quantity, and nested required groups. Each menu sync log records how many products had their starting price calculated.
Bundled items model combos: each entry references a real catalog product with an included_quantity and a refund_price if the customer starts a dispute about the bundle.
Related concepts
Categories
Where products appear in the menu
Menus
Full catalog synced to channels
Orders
Products and modifier choices in a purchase