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

# Lista

> Muestra una lista desplegable de opciones para que el usuario seleccione

El nodo **Lista** envía un mensaje con un botón que, al tocarlo, despliega una lista de opciones. Permite mostrar hasta **10 opciones**, cada una con título y descripción.

<Note>
  En WhatsApp, las listas se muestran como un menú desplegable nativo. Es la mejor opción cuando tienes entre 4 y 10 opciones.
</Note>

## Configuración general

* **Encabezado**: Título del mensaje (máximo 60 caracteres)
* **Contenido**: Mensaje principal (máximo 1,024 caracteres, requerido)
* **Nombre del botón**: Texto del botón que despliega la lista (máximo 20 caracteres)

### Opciones

Cada opción tiene:

* **Nombre de la opción**: Texto visible en la lista (máximo 24 caracteres)
* **Descripción**: Texto adicional debajo del nombre (opcional, máximo 72 caracteres)

Puedes agregar hasta **10 opciones**. Las opciones se pueden reordenar arrastrándolas y duplicar para crear variantes rápidas.

### Opciones dinámicas

Si las opciones provienen de datos variables, activa el modo **dinámico**:

* **Variable fuente**: `{{$memory.opciones}}`
* **Plantilla de etiqueta**: `{{$item.nombre}}`
* **Plantilla de descripción**: `{{$item.detalle}}`

Plantillas predefinidas: Lista simple, Productos, Horarios disponibles, Sucursales.

## Variables en mensajes

```
Encabezado: Hola {{$user.names}}
Contenido: Selecciona una de las siguientes opciones
```

## Configuración avanzada

### Selección obligatoria

Cuando está activada, el usuario **debe** elegir una opción de la lista para continuar. Si escribe texto libre, verá un mensaje de error personalizable (máximo 250 caracteres).

### Variable de respuesta

Guarda la opción que el usuario seleccionó en una variable de memoria para usarla más adelante en el flujo.

**Cómo configurarlo:**

1. Activa el interruptor **Guardar respuesta**.
2. Escribe el nombre de la variable (por ejemplo, `motivo_consulta`).

#### Valor guardado con opciones estáticas

Cuando las opciones están definidas manualmente, se guarda el **nombre** de la opción seleccionada como texto plano.

Ejemplo con estas opciones:

| Opción          |
| :-------------- |
| Ventas          |
| Soporte Técnico |
| Facturación     |
| Devoluciones    |

Si el usuario elige **Soporte Técnico**:

```javascript theme={null}
// {{$memory.motivo_consulta}} contiene:
const motivo_consulta = "Soporte Técnico";
```

#### Valor guardado con opciones dinámicas

Cuando las opciones se generan desde una variable fuente, se guarda el **objeto completo** del array al que pertenece la opción seleccionada.

Supón que `{{$memory.servicios}}` contiene:

```json theme={null}
[
  { "id": "s1", "nombre": "Ventas", "agentes": 5, "horario": "L-V 8:00-18:00" },
  { "id": "s2", "nombre": "Soporte Técnico", "agentes": 3, "horario": "L-V 9:00-17:00" },
  { "id": "s3", "nombre": "Facturación", "agentes": 2, "horario": "L-V 8:00-16:00" }
]
```

Si el usuario elige **Soporte Técnico**, la variable queda con el objeto completo:

```javascript theme={null}
// {{$memory.motivo_consulta}} contiene el objeto completo:
const motivo_consulta = {
  id: "s2",
  nombre: "Soporte Técnico",
  agentes: 3,
  horario: "L-V 9:00-17:00"
};
```

Puedes acceder a cada propiedad del objeto en nodos posteriores:

```javascript theme={null}
// Acceso a propiedades de {{$memory.motivo_consulta}}:
motivo_consulta.nombre;   // "Soporte Técnico"
motivo_consulta.horario;  // "L-V 9:00-17:00"
motivo_consulta.agentes;  // 3
```

#### Casos de uso

<AccordionGroup>
  <Accordion title="Enrutar el flujo según la selección (opciones estáticas)">
    Conecta un nodo [Condicional](/guides/nodos/condicional) y crea una rama por cada opción:

    ```
    Si {{$memory.motivo_consulta}} = "Ventas"          → rama Ventas
    Si {{$memory.motivo_consulta}} = "Soporte Técnico" → rama Soporte
    Si {{$memory.motivo_consulta}} = "Facturación"     → rama Facturación
    ```
  </Accordion>

  <Accordion title="Usar datos del objeto seleccionado (opciones dinámicas)">
    Con el objeto completo guardado, puedes informar al usuario con los datos exactos del servicio elegido:

    ```
    Texto: "El área de {{$memory.motivo_consulta.nombre}} atiende
    {{$memory.motivo_consulta.horario}} y cuenta con
    {{$memory.motivo_consulta.agentes}} agentes disponibles."
    ```
  </Accordion>

  <Accordion title="Personalizar la respuesta del AI Agent">
    Pasa el objeto al nodo [AI Agent](/guides/nodos/ai-agent) para que adapte su respuesta:

    ```
    El usuario necesita ayuda con: {{$memory.motivo_consulta.nombre}}.
    Horario de atención: {{$memory.motivo_consulta.horario}}.
    Responde con información específica para ese servicio.
    ```
  </Accordion>

  <Accordion title="Registrar la elección en una base de datos">
    Usa un nodo [API](/guides/nodos/api) o [Datum](/guides/nodos/datum) para registrar la selección con su ID de servicio:

    ```json theme={null}
    {
      "userId": "{{$user.id}}",
      "servicioId": "{{$memory.motivo_consulta.id}}",
      "servicioNombre": "{{$memory.motivo_consulta.nombre}}",
      "timestamp": "{{$context.timestamp}}"
    }
    ```
  </Accordion>
</AccordionGroup>

### Lista expira

Si el usuario no selecciona ninguna opción dentro del tiempo configurado:

* **Enviar texto**: Muestra un mensaje de expiración
* **Redirigir a flujo**: Lleva al usuario a otro flujo

## Ejemplo

**Configuración:**

* Encabezado: `¿En qué puedo ayudarte?`
* Contenido: `Selecciona una opción de la lista`
* Nombre del botón: `Ver opciones`
* Opciones: Ventas, Soporte Técnico, Facturación, Devoluciones
