recommendations de nivel superior para definir upsell, cross-sell y downsell una vez por sync. Adjúntalas en dos lugares:
pricing.recommendationsen la línea del producto — sugerir otros productos del catálogo en el padre (upgrade a combo, acompañamiento, downsell).pricing.modifiers[].recommendationsen una opción modificadora — preseleccionar cantidades de modificadores cuando muestras un preset de customización premium.
default_quantity. Ese valor es independiente del default_quantity en la misma entrada pricing.modifiers.
Los valores de type en este payload son ilustrativos. Tu catálogo puede mapear UPSELL, CROSS_SELL y DOWNSELL de otra forma.
Qué incluye este ejemplo
| Capa | Dónde vive | Comportamiento |
|---|---|---|
| Upsell a combo | upsell-meal-combo en burger | Sugiere pasar del burger suelto a meal-combo |
| Cross-sell de acompañamiento | cross-sell-fries en burger | Sugiere agregar fries como ítem aparte |
| Downsell a producto suelto | downsell-burger en meal-combo | Sugiere burger cuando el cliente abrió el combo |
| Acompañamiento preseleccionado | burger.pricing.recommendations[] | Preselecciona 1 unidad de papas en la línea del burger |
| Default de bebida | cola.pricing.modifiers[] | default_quantity: 1 dentro del grupo de bebida del combo |
| Preset premium | extra-cheese.pricing.modifiers[].recommendations | Preselecciona 2× extra cheese para un preset de toppings premium |
| Preset premium | bacon.pricing.modifiers[].recommendations | Preselecciona 1× bacon en el mismo flujo de preset |
Request
Define las recomendaciones en el catálogo compartido. Vincula sugerencias de línea desdepricing.recommendations en el producto padre. Para configuraciones premium de modificadores, vincula presets desde pricing.modifiers[].recommendations en cada opción modificadora — cada recommendation_id debe existir en el catálogo y su target_product_id debe coincidir con el producto modificador.
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 @product-recommendations.json
product-recommendations.json
{
"style": "DEFAULT",
"recommendations": [
{
"id": "upsell-meal-combo",
"type": "UPSELL",
"title": { "en_us": "Make it a combo" },
"description": { "en_us": "Add a drink and save on the meal." },
"target_product_id": "meal-combo",
"metadata": {}
},
{
"id": "cross-sell-fries",
"type": "CROSS_SELL",
"title": { "en_us": "Add fries" },
"description": { "en_us": "Side of seasoned fries." },
"target_product_id": "fries",
"metadata": {}
},
{
"id": "downsell-burger",
"type": "DOWNSELL",
"title": { "en_us": "Burger only" },
"description": { "en_us": "Skip the drink if you only want the main." },
"target_product_id": "burger",
"metadata": {}
},
{
"id": "premium-double-cheese",
"type": "CROSS_SELL",
"title": { "en_us": "Double cheese" },
"description": { "en_us": "Premium topping preset." },
"target_product_id": "extra-cheese",
"metadata": {}
},
{
"id": "premium-add-bacon",
"type": "CROSS_SELL",
"title": { "en_us": "Add bacon" },
"description": { "en_us": "Premium topping preset." },
"target_product_id": "bacon",
"metadata": {}
}
],
"products": [
{
"id": "burger",
"name": { "en_us": "Classic burger" },
"description": { "en_us": "Angus beef patty." },
"image_url": null,
"bundled_items": [],
"pricing": {
"minimum_quantity": 1,
"maximum_quantity": 10,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 12.99,
"anchor_price": 14.99,
"anchor_price_percentage": 0.13,
"modifier_group_ids": ["premium-toppings"],
"modifiers": [],
"recommendations_ids": ["upsell-meal-combo", "cross-sell-fries"],
"recommendations": [
{
"recommendation_id": "upsell-meal-combo",
"default_quantity": 0
},
{
"recommendation_id": "cross-sell-fries",
"default_quantity": 1
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "fries",
"name": { "en_us": "Fries" },
"description": { "en_us": "Crispy side." },
"image_url": null,
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 5,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 3.99,
"anchor_price": 3.99,
"anchor_price_percentage": 0,
"modifier_group_ids": [],
"modifiers": [],
"recommendations_ids": [],
"recommendations": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "extra-cheese",
"name": { "en_us": "Extra cheese" },
"description": { "en_us": "Premium topping." },
"image_url": null,
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 3,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 1.5,
"anchor_price": 1.5,
"anchor_price_percentage": 0,
"modifier_group_ids": ["premium-toppings"],
"modifiers": [
{
"modifier_group_id": "premium-toppings",
"minimum_quantity": 0,
"maximum_quantity": 3,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 1.5,
"anchor_price": 1.5,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": null,
"display_type": "QUANTITY",
"recommendations": [
{
"recommendation_id": "premium-double-cheese",
"default_quantity": 2
}
]
}
],
"recommendations_ids": [],
"recommendations": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "bacon",
"name": { "en_us": "Bacon" },
"description": { "en_us": "Premium topping." },
"image_url": null,
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 3,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 2,
"anchor_price": 2,
"anchor_price_percentage": 0,
"modifier_group_ids": ["premium-toppings"],
"modifiers": [
{
"modifier_group_id": "premium-toppings",
"minimum_quantity": 0,
"maximum_quantity": 3,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 2,
"anchor_price": 2,
"anchor_price_percentage": 0,
"default_quantity": 0,
"charge_above_quantity": null,
"display_type": "QUANTITY",
"recommendations": [
{
"recommendation_id": "premium-add-bacon",
"default_quantity": 1
}
]
}
],
"recommendations_ids": [],
"recommendations": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "meal-combo",
"name": { "en_us": "Burger meal combo" },
"description": { "en_us": "Classic burger plus one drink." },
"image_url": null,
"bundled_items": [],
"pricing": {
"minimum_quantity": 1,
"maximum_quantity": 5,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 15.99,
"anchor_price": 17.99,
"anchor_price_percentage": 0.11,
"modifier_group_ids": ["choose-drink"],
"modifiers": [],
"recommendations_ids": ["downsell-burger"],
"recommendations": [
{
"recommendation_id": "downsell-burger",
"default_quantity": 0
}
]
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "cola",
"name": { "en_us": "Cola" },
"description": { "en_us": "Fountain drink." },
"image_url": null,
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 3,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 2.5,
"anchor_price_percentage": 0,
"modifier_group_ids": ["choose-drink"],
"modifiers": [
{
"modifier_group_id": "choose-drink",
"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": 1,
"charge_above_quantity": null,
"display_type": "RADIO",
"recommendations_ids": [],
"recommendations": []
}
],
"recommendations_ids": [],
"recommendations": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
},
{
"id": "sprite",
"name": { "en_us": "Sprite" },
"description": { "en_us": "Fountain drink." },
"image_url": null,
"bundled_items": [],
"pricing": {
"minimum_quantity": 0,
"maximum_quantity": 3,
"is_tax_inclusive": true,
"tax_rate": 0.15,
"price": 0,
"anchor_price": 2.5,
"anchor_price_percentage": 0,
"modifier_group_ids": ["choose-drink"],
"modifiers": [
{
"modifier_group_id": "choose-drink",
"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": null,
"display_type": "RADIO",
"recommendations_ids": [],
"recommendations": []
}
],
"recommendations_ids": [],
"recommendations": []
},
"availability": {
"status": "AVAILABLE",
"schedules": null,
"out_of_stock_until": null
},
"metadata": {}
}
],
"categories": [
{
"id": "mains",
"name": { "en_us": "Mains" },
"description": null,
"items": [
{ "type": "PRODUCT", "id": "burger" },
{ "type": "PRODUCT", "id": "meal-combo" },
{ "type": "PRODUCT", "id": "fries" }
],
"availability": {
"status": "ACTIVE",
"schedules": null,
"inactive_until": null
},
"metadata": {}
}
],
"modifier_groups": [
{
"id": "premium-toppings",
"title": { "en_us": "Premium toppings" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["extra-cheese", "bacon"],
"minimum_quantity": 0,
"maximum_quantity": 3,
"charge_above_quantity": null,
"metadata": {}
},
{
"id": "choose-drink",
"title": { "en_us": "Choose a drink" },
"description": null,
"display_type": "LIST",
"modifier_ids": ["cola", "sprite"],
"minimum_quantity": 1,
"maximum_quantity": 1,
"charge_above_quantity": null,
"metadata": {}
}
],
"menus": [
{
"id": "all-day",
"name": { "en_us": "All day" },
"description": null,
"schedules": null,
"category_ids": ["mains"],
"status": "ACTIVE",
"metadata": {}
}
]
}
Estilo Uber Eats
Envíarecommendations en un payload completo UBER_EATS igual que items, categories y modifier_groups. Usa title.translations en lugar de name, y mantén target_product_id alineado con un items[].id. Fire spark mapea el arreglo al catálogo DEFAULT durante el sync.
"recommendations": [
{
"id": "upsell-meal-combo",
"type": "UPSELL",
"title": { "translations": { "en_us": "Make it a combo" } },
"target_product_id": "meal-combo",
"metadata": {}
},
{
"id": "cross-sell-fries",
"type": "CROSS_SELL",
"title": { "translations": { "en_us": "Add fries" } },
"target_product_id": "fries",
"metadata": {}
},
{
"id": "downsell-burger",
"type": "DOWNSELL",
"title": { "translations": { "en_us": "Burger only" } },
"target_product_id": "burger",
"metadata": {}
}
]
pricing.recommendations preselecciona otros productos en la línea del padre.
pricing.modifiers[].recommendations preselecciona cantidades dentro de un
grupo de modificadores — úsalo para publicar configuraciones premium listas.
El default_quantity de la misma entrada modificador sigue siendo el baseline
cuando no aplicas un preset.Relacionado
Overrides de grupos de modificadores
Precio por grupo y cantidades default en productos modificadores
Guía de sync de menú
Reglas de validación completas para recomendaciones