modifier_group_ids, y su entrada pricing.modifiers describe cómo aparece dentro del grupo que lo lista.
Qué incluye este ejemplo
| Nivel | Padre / grupo | Producto modificador | Grupo anidado |
|---|---|---|---|
| 1 | meal-combo → choose-burger | cheeseburger | choose-patty |
| 2 | cheeseburger → choose-patty | beef-patty | choose-doneness |
| 3 | beef-patty → choose-doneness | medium-rare | — |
Request
Todos los productos y grupos viven en el mismo payload de Upsert menus. Adjunta el siguiente grupo en el producto modificador que el cliente elige en el nivel anterior.curl --request PUT \
--url 'https://firespark.cloud/api/integrations/v1/menus?fulfillment_id=delivery&store_id=downtown&channel_id=app&brand_id=0001' \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d @multi-level-modifiers.json
multi-level-modifiers.json
{
"style": "DEFAULT",
"products": [
{
"id": "meal-combo",
"name": { "es_ec": "Combo" },
"description": { "es_ec": "Hamburguesa y una bebida." },
"image_url": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 1,
"maximum_quantity": 5,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 10.99,
"anchor_price": 10.99,
"anchor_price_percentage": 0,
"modifier_group_ids": ["choose-burger"],
"modifiers": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "cheeseburger",
"name": { "es_ec": "Hamburguesa con queso" },
"description": null,
"image_url": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifier_group_ids": ["choose-patty"],
"modifiers": [
{
"modifier_group_id": "choose-burger",
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": 0,
"display_type": "RADIO"
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "veggie-burger",
"name": { "es_ec": "Hamburguesa vegetariana" },
"description": null,
"image_url": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifier_group_ids": [],
"modifiers": [
{
"modifier_group_id": "choose-burger",
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": 0,
"display_type": "RADIO"
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "beef-patty",
"name": { "es_ec": "Carne de res" },
"description": null,
"image_url": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifier_group_ids": ["choose-doneness"],
"modifiers": [
{
"modifier_group_id": "choose-patty",
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": 0,
"display_type": "RADIO"
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "veggie-patty",
"name": { "es_ec": "Carne vegetal" },
"description": null,
"image_url": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifier_group_ids": [],
"modifiers": [
{
"modifier_group_id": "choose-patty",
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": 0,
"display_type": "RADIO"
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "medium-rare",
"name": { "es_ec": "Término medio" },
"description": null,
"image_url": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifier_group_ids": [],
"modifiers": [
{
"modifier_group_id": "choose-doneness",
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": 0,
"display_type": "RADIO"
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "well-done",
"name": { "es_ec": "Bien cocida" },
"description": null,
"image_url": null,
"status": "ACTIVE",
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"modifier_group_ids": [],
"modifiers": [
{
"modifier_group_id": "choose-doneness",
"minimum_quantity": 0,
"maximum_quantity": 1,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 0,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": 0,
"display_type": "RADIO"
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"categories": [
{
"id": "combos",
"name": { "es_ec": "Combos" },
"description": null,
"status": "ACTIVE",
"items": [{ "type": "PRODUCT", "id": "meal-combo" }],
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"modifier_groups": [
{
"id": "choose-burger",
"title": { "es_ec": "Elige una hamburguesa" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["cheeseburger", "veggie-burger"],
"minimum_quantity": 1,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
},
{
"id": "choose-patty",
"title": { "es_ec": "Elige una carne" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["beef-patty", "veggie-patty"],
"minimum_quantity": 1,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
},
{
"id": "choose-doneness",
"title": { "es_ec": "Elige el término" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["medium-rare", "well-done"],
"minimum_quantity": 1,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
}
],
"menus": [
{
"id": "all-day-delivery",
"name": { "es_ec": "Delivery todo el día" },
"description": null,
"schedules": null,
"metadata": {},
"category_ids": ["combos"],
"status": "ACTIVE"
}
]
}
Puntos clave
- Anida mediante productos modificadores. Cada nivel es un producto real con su propio
idexterno para tickets de cocina e inyección de pedidos. modifiersdescribe la opción en un grupo.beef-pattylleva una entradapricing.modifiersconmodifier_group_id: "choose-patty".modifier_group_idsabre la siguiente pregunta.cheeseburgerlistachoose-pattypara que las opciones de carne aparezcan después de que el cliente elige hamburguesa con queso.- Los modificadores hoja tienen grupos anidados vacíos.
medium-rareusamodifier_group_ids: []porque la cadena termina ahí. - Rutas ramificadas.
veggie-burgeromite los grupos de carne y término porque no tienemodifier_group_idsanidados.
Relacionado
Productos — grupos de modificadores
Cómo se relacionan grupos y modificadores
Menú simple
Ejemplo de modificadores de un solo nivel