Skip to main content
A product is a sellable item on the menu: a burger, a combo, a drink, a side. It carries price, description, modifier groups (choices the customer must or can make), and availability per store.

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.
That pattern matters commercially and operationally:
  • 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.
Groups can be required (customer must choose a drink) or optional (add extra cheese). Rules like “pick exactly one” vs “pick up to three toppings” live on the group, not on each modifier. Fire spark syncs products, modifier groups, and modifiers from your operation. The same structure can appear in different composed menus by channel, store, fulfillment, or schedule — without duplicate masters in the POS.

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.
How variants differ from modifiers:
  • 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_ids can’t also set modifier_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.modifiers entry 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’s pricing.modifiers entry for the group sets the charged price and tax; without an entry, its own pricing.price applies.
  • 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_price is the starting price of its cheapest selectable variant.
Both sides of the link are explicit so the sync can verify them. Each variant lists its 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 list price 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.

Categories

Where products appear in the menu

Menus

Full catalog synced to channels

Orders

Products and modifier choices in a purchase