Skip to main content

Modifiers

Modifiers are how a customer customizes a dish: pick a size, add toppings, choose a side, set a cooking preference. They are modeled in four parts so the same options can be reused across many items while still allowing per-item rules:

  • A ModifierGroup is a reusable set of related choices ("Size", "Add-ons", "Choose a side").
  • A ModifierOption is one choice within a group, with a priceDelta.
  • An ItemModifierBinding attaches a group to a specific item, variant, or set — and can override the group's rules or hide individual options for that context.
  • An AppliedModifier is the snapshot of what the customer actually chose, captured on the order item with its name and price.
Modifier system: groups, options, bindings, and applied modifiersA modifier group contains options. An item modifier binding links the group to a menu item or variant, overriding required, min/max selection, and excluding or re-pricing options. The customer's selection is captured as an applied modifier on the order item.Modifier group"Add-ons" · min/max · requiredExtra Cheese +$1.50Bacon +$2.00Avocado +$2.50bindingItem bindingoverride required · min/maxexclude options · re-price→ Classic BurgerorderApplied modifiercaptured on the order itemBacon +$2.00Define a group once, bind it to many items with different rules, and the customer's exact choice is frozen onto the order —name and price preserved, even if the menu changes later.
SDK coverage

Modifiers are demonstrated in the TypeScript SDK (client.modifiers). The Python menu guide does not include modifier examples; the schema below is the platform model that backs both.

Modifier groups

A group bundles related options with selection rules — minSelection, maxSelection, and isRequired.

const toppings = await client.modifiers.createGroup({
name: 'Toppings',
description: 'Add extra toppings',
isRequired: false,
minSelection: 0,
maxSelection: 3,
displayOrder: 1,
isActive: true,
options: [
{ name: 'Extra Cheese', priceDelta: 1.50, displayOrder: 1, isDefault: false, isActive: true },
{ name: 'Bacon', priceDelta: 2.00, displayOrder: 2, isDefault: false, isActive: true },
{ name: 'Avocado', priceDelta: 2.50, displayOrder: 3, isDefault: false, isActive: true },
],
});

const group = await client.modifiers.getGroup('group_123');
const groups = await client.modifiers.listGroups();
const updated = await client.modifiers.updateGroup('group_123', { id: 'group_123', description: 'Premium toppings' });
await client.modifiers.deleteGroup('group_123');

ModifierGroup fields

FieldTypeRequiredDescription
idstringautoUnique identifier
namestringYesGroup name (e.g. "Size")
descriptionstring | nullNoGroup description
optionsarrayYesOptions (min 1 required)
minSelectionintegerNoMinimum selections (default 0)
maxSelectioninteger | nullNoMaximum selections
isRequiredbooleanNoWhether a selection is required (default false)
displayOrderintegerNoDisplay order (default 0)
isActivebooleanNoWhether the group is active (default true)
locationIdstring | nullNoLocation-specific group
modifierRevisionIdstring | nullNoVersion control ID
channelMappingsarray | nullNoPer-channel external group IDs

Validation: maxSelection must be ≥ minSelection and ≤ the number of options.

Modifier options

Options can also be managed individually within a group.

const option = await client.modifiers.createOption({
modifierGroupId: 'group_123',
name: 'Jalapenos',
description: 'Spicy sliced jalapenos',
priceDelta: 0.75,
displayOrder: 4,
isDefault: false,
isActive: true,
});

const options = await client.modifiers.getOptionsByGroup('group_123');
const updated = await client.modifiers.updateOption('option_123', { id: 'option_123', priceDelta: 1.00 });
await client.modifiers.deleteOption('option_123');

ModifierOption fields

FieldTypeRequiredDescription
idstringautoUnique identifier
modifierGroupIdstringYesParent group
namestringYesOption name (e.g. "Extra Cheese")
descriptionstring | nullNoOption description
priceDeltanumberNoPrice adjustment when selected (default 0)
isDefaultbooleanNoPre-selected (default false)
displayOrderintegerNoOrder within group (default 0)
isActivebooleanNoWhether active (default true)
locationIdstring | nullNoLocation-specific option

Item modifier bindings

A binding attaches a group to a target — exactly one of a menu item or a menu set, optionally narrowed to a variant — and can override the group's rules for that context.

const binding = await client.modifiers.createBinding({
menuItemId: 'item_burger',
modifierGroupId: 'group_toppings',
displayOrder: 1,
isRequired: false,
});

const bindings = await client.modifiers.getBindingsByMenuItem('item_burger');
const updated = await client.modifiers.updateBinding('binding_123', { id: 'binding_123', displayOrder: 2, isActive: true });
await client.modifiers.deleteBinding('binding_123');

ItemModifierBinding fields

FieldTypeRequiredDescription
idstringautoUnique identifier
modifierGroupIdstringYesGroup to bind
menuItemIdstringConditionalTarget item (exactly one of item or set)
menuItemVariantIdstring | nullNoNarrow to a variant (requires menuItemId)
menuSetIdstringConditionalTarget set (exactly one of item or set)
isRequiredOverrideboolean | nullNoOverride the group's isRequired
minSelectionOverrideinteger | nullNoOverride minSelection
maxSelectionOverrideinteger | nullNoOverride maxSelection
excludedOptionIdsarray | nullNoOption IDs to hide in this context
optionOverridesarray | nullNoPer-option overrides (below)
displayOrderintegerNoDisplay order (default 0)
isActivebooleanNoWhether active (default true)

ModifierOptionOverride

A per-option override inside a binding re-prices or re-defaults a single option for that item.

FieldTypeRequiredDescription
modifierOptionIdstringYesTarget option
priceDeltaOverridenumberNoOverride the price adjustment
isDefaultOverridebooleanNoOverride default selection
displayOrderOverrideintegerNoOverride display order

Applied modifiers

When a customer selects an option, the order item records an AppliedModifier — a snapshot that preserves the group and option names and the price applied, so the order stays accurate even if the menu changes later.

FieldTypeRequiredDescription
groupNamestringYesModifier group name (preserved)
optionNamestringYesModifier option name (preserved)
modifierGroupIdstring | nullNoInternal group ID
modifierOptionIdstring | nullNoInternal option ID
externalModifierGroupIdstring | nullNoExternal platform group ID
externalModifierOptionIdstring | nullNoExternal platform option ID
quantityintegerNoQuantity (default 1)
priceDeltanumberNoPrice adjustment applied (default 0)

Query options

ResourceFiltersSort fields
ModifierGroupsearch, locationId, isRequired, isActivename, displayOrder, createdAt
ModifierOptionsearch, locationId, modifierGroupId, isDefault, isActivename, displayOrder, createdAt
ItemModifierBindinglocationId, menuItemId, menuSetId, modifierGroupId, isActivedisplayOrder, createdAt
tip

Define a group once and reuse it across items; use bindings (not new groups) for item-specific rules, excludedOptionIds to hide options that don't apply, and optionOverrides to re-price an option for a single dish.