> ## Documentation Index
> Fetch the complete documentation index at: https://firespark.cloud/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Recomendaciones de producto

> Recomendaciones a nivel catálogo con cantidades default por producto y defaults a nivel modificador.

Usa el arreglo `recommendations` de nivel superior para definir upsell, cross-sell y downsell una vez por sync. Adjúntalas en dos lugares:

* **`pricing.recommendations` en la línea del producto** — sugerir otros productos del catálogo en el padre (upgrade a combo, acompañamiento, downsell).
* **`pricing.modifiers[].recommendations` en una opción modificadora** — preseleccionar cantidades de modificadores cuando muestras un preset de customización premium.

Cada entrada vinculada puede fijar su propio `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 |

```mermaid theme={null}
flowchart TB
    BURGER["burger"] --> UP["upsell-meal-combo"]
    UP --> COMBO["meal-combo"]
    BURGER --> XS["cross-sell-fries"]
    XS --> FRIES["fries"]
    BURGER --> G2["premium-toppings"]
    G2 --> CHEESE["extra-cheese · recommendations in modifiers"]
    G2 --> BACON["bacon · recommendations in modifiers"]
    COMBO --> DN["downsell-burger"]
    DN --> BURGER
    COMBO --> G1["choose-drink"]
    G1 --> COLA["cola · default_quantity 1 en grupo"]
```

## Request

Define las recomendaciones en el catálogo compartido. Vincula sugerencias de línea desde `pricing.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.

```bash theme={null}
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
```

```json product-recommendations.json theme={null}
{
  "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ía `recommendations` 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.

```json theme={null}
"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": {}
  }
]
```

Agrega este arreglo a un payload completo de menú Uber Eats como [Menú simple](https://firespark.cloud/docs/es/integrations-api/examples/menu-sync/simple-menu.md).

> [!TIP]
>
> `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

> [card] [Overrides de grupos de modificadores](https://firespark.cloud/docs/es/integrations-api/examples/menu-sync/modifier-group-overrides.md)
>
> Precio por grupo y cantidades default en productos modificadores

> [card] [Guía de sync de menú](https://firespark.cloud/docs/es/integrations-api/guides/menu-sync.md#reglas-de-validación)
>
> Reglas de validación completas para recomendaciones


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.