> ## 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.

# Grupos de modificadores multinivel

> Tres niveles de grupos de modificadores anidados en un producto combo.

Algunos flujos de POS hacen preguntas de seguimiento solo después de una elección previa — elige una hamburguesa, luego una carne, luego el término. En Fire spark, **los modificadores son productos**. Un modificador puede listar grupos anidados en `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` | — |

```mermaid theme={null}
flowchart TB
    COMBO["meal-combo"]
    COMBO --> G1["choose-burger"]
    G1 --> CB["cheeseburger"]
    CB --> G2["choose-patty"]
    G2 --> BEEF["beef-patty"]
    BEEF --> G3["choose-doneness"]
    G3 --> MR["medium-rare"]
    G3 --> WD["well-done"]
```

## Request

Todos los productos y grupos viven en el mismo payload de [Upsert menus](https://firespark.cloud/docs/es/integrations-api/menus/put.md). Adjunta el siguiente grupo en el producto modificador que el cliente elige en el nivel anterior.

```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 @multi-level-modifiers.json
```

```json multi-level-modifiers.json theme={null}
{
  "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 `id` externo para tickets de cocina e inyección de pedidos.
* **`modifiers` describe la opción en un grupo.** `beef-patty` lleva una entrada `pricing.modifiers` con `modifier_group_id: "choose-patty"`.
* **`modifier_group_ids` abre la siguiente pregunta.** `cheeseburger` lista `choose-patty` para 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-rare` usa `modifier_group_ids: []` porque la cadena termina ahí.
* **Rutas ramificadas.** `veggie-burger` omite los grupos de carne y término porque no tiene `modifier_group_ids` anidados.

## Relacionado

> [card] [Productos — grupos de modificadores](https://firespark.cloud/docs/es/concepts/products.md)
>
> Cómo se relacionan grupos y modificadores

> [card] [Menú simple](https://firespark.cloud/docs/es/integrations-api/examples/menu-sync/simple-menu.md)
>
> Ejemplo de modificadores de un solo nivel


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