Pular para conteúdo

LIST - Lista de Seleção WhatsApp

O que é este Node?

O LIST é o node responsável por criar listas interativas do WhatsApp com até 10 itens organizados em seções, permitindo que usuários selecionem uma opção de forma organizada e visual. É similar ao MENU, mas com interface de lista expandível.

Por que este Node existe?

Quando você precisa apresentar múltiplas opções mas não quer a complexidade total do MENU, ou quando prefere uma apresentação linear de itens, o LIST existe para:

  1. Seleção Linear: Apresentar opções em formato de lista expansível, ideal para escolhas sequenciais
  2. Organização em Seções: Agrupar itens relacionados em categorias, mantendo interface limpa
  3. Até 10 Itens: Suportar mais opções que BUTTONS (3) mas com interface simples
  4. Descrições Curtas: Cada item pode ter descrição para ajudar na decisão do usuário

Como funciona internamente?

Quando o LIST é executado, o sistema:

  1. Valida Seções: Verifica se há pelo menos uma seção com itens configurados
  2. Conta Total de Itens: Soma todos os itens de todas as seções (limite: 10 itens)
  3. Gera IDs Únicos: Cria IDs automáticos para itens sem ID definido
  4. Constrói Estrutura WhatsApp: Monta payload no formato interactive tipo lista
  5. Adiciona Header/Footer: Inclui elementos opcionais se fornecidos
  6. Retorna Lista Pronta: Envia estrutura aguardando seleção do usuário
  7. Aguarda Clique: Sistema espera que usuário abra lista e selecione item

Código interno (whatsapp-ui-executor.service.ts:167-217):

private async executeList(parameters: any, context: any): Promise<any> {
  const { title, body, buttonText, sections, footer } = parameters;

  this.logger.log(`📋 LIST - Creating WhatsApp list with ${sections?.length || 0} sections`);

  // Validate sections
  if (!sections || sections.length === 0) {
    throw new Error('List requires at least one section with items');
  }

  // Validate total items limit (WhatsApp limit: 10 items per list)
  const totalItems = sections.reduce((total, section) => total + (section.items?.length || 0), 0);
  if (totalItems > 10) {
    throw new Error(`WhatsApp list supports maximum 10 items, got ${totalItems}`);
  }

  // Build WhatsApp list structure
  const whatsappList = {
    type: 'interactive',
    header: title ? {
      type: 'text',
      text: title
    } : undefined,
    body: {
      text: body || 'Please select an item:'
    },
    footer: footer ? {
      text: footer
    } : undefined,
    action: {
      button: buttonText || 'Select',
      sections: sections.map(section => ({
        title: section.title || 'Items',
        rows: section.items?.map(item => ({
          id: item.id || `item_${Math.random().toString(36).substr(2, 9)}`,
          title: item.title || item.text || 'Item',
          description: item.description || ''
        })) || []
      }))
    }
  };

  return {
    success: true,
    action: 'whatsapp_list_created',
    messageType: 'interactive_list',
    payload: whatsappList,
    awaitingUserSelection: true,
    timestamp: new Date().toISOString()
  };
}

Quando você DEVE usar este Node?

Use LIST sempre que precisar de 4-10 opções organizadas de forma linear:

Casos de uso

  1. Seleção de Produtos: Lista de produtos disponíveis com preço na descrição
  2. Escolha de Cidades: Lista de cidades/estados organizadas por região
  3. Seleção de Serviços: Lista de serviços oferecidos com detalhes
  4. Opções de Pagamento: Formas de pagamento disponíveis com informações
  5. Lista de Documentos: Tipos de documentos que usuário pode solicitar

Quando NÃO usar LIST

  • 3 ou menos opções: Use BUTTONS para escolhas rápidas e visuais
  • Mais de 10 itens: Divida em múltiplas listas ou use navegação hierárquica
  • Opções que precisam destaque visual: Use MENU para interface mais rica
  • Resposta em texto livre: Use INPUT para texto digitado

Parâmetros Detalhados

title (string, opcional)

O que é: Título principal da lista, exibido como header destacado.

Padrão: Nenhum (lista sem title/header)

Flow completo para testar:

{
  "name": "Teste LIST - Title",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "list_1",
      "type": "list",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Lista com Title",
        "parameters": {
          "title": "🏙️ Cidades Disponíveis",
          "body": "Selecione a cidade para entrega:",
          "buttonText": "Ver Cidades",
          "sections": [
            {
              "title": "Sudeste",
              "items": [
                { "id": "sp", "title": "São Paulo", "description": "Capital - Entrega em 24h" },
                { "id": "rj", "title": "Rio de Janeiro", "description": "Capital - Entrega em 24h" }
              ]
            },
            {
              "title": "Sul",
              "items": [
                { "id": "poa", "title": "Porto Alegre", "description": "RS - Entrega em 48h" },
                { "id": "curitiba", "title": "Curitiba", "description": "PR - Entrega em 48h" }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar Cidade",
        "parameters": {
          "message": "Cidade selecionada: {{list_selection}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "list_1" },
    { "source": "list_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Inicie o flow 2. Lista com title "🏙️ Cidades Disponíveis" em destaque 3. Clique em "Ver Cidades" 4. Lista expandida mostra 2 seções com cidades 5. Selecione uma cidade 6. Confirmação mostra o ID selecionado


body (string, obrigatório)

O que é: Texto explicativo principal, descrevendo o que usuário deve selecionar.

Padrão: "Please select an item:"

Flow completo para testar:

{
  "name": "Teste LIST - Body",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "list_1",
      "type": "list",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Lista Body Personalizado",
        "parameters": {
          "body": "📄 Escolha o tipo de documento que você precisa:\n\n✅ Emissão em até 48 horas\n📧 Envio por e-mail",
          "buttonText": "Selecionar Documento",
          "sections": [
            {
              "title": "Documentos Pessoais",
              "items": [
                { "id": "cpf", "title": "CPF", "description": "Cadastro de Pessoa Física" },
                { "id": "rg", "title": "RG", "description": "Registro Geral" },
                { "id": "certidao", "title": "Certidão", "description": "Nascimento/Casamento" }
              ]
            },
            {
              "title": "Documentos Profissionais",
              "items": [
                { "id": "ctps", "title": "CTPS", "description": "Carteira de Trabalho" },
                { "id": "diploma", "title": "Diploma", "description": "Certificado escolar" }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar Documento",
        "parameters": {
          "message": "Documento solicitado: {{list_selection}}\n\n📧 Você receberá por e-mail em até 48h."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "list_1" },
    { "source": "list_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Inicie o flow 2. Body personalizado com emojis e informações 3. Lista mostra 5 tipos de documentos em 2 seções 4. Selecione um documento 5. Confirmação usa o ID selecionado


buttonText (string, opcional)

O que é: Texto do botão que abre a lista expandível.

Padrão: "Select"

Flow completo para testar:

{
  "name": "Teste LIST - ButtonText",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "list_1",
      "type": "list",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Lista ButtonText Custom",
        "parameters": {
          "title": "💳 Formas de Pagamento",
          "body": "Escolha como deseja pagar:",
          "buttonText": "💰 Ver Todas as Opções",
          "sections": [
            {
              "title": "Pagamento Instantâneo",
              "items": [
                { "id": "pix", "title": "PIX", "description": "Aprovação imediata" },
                { "id": "cartao", "title": "Cartão de Crédito", "description": "Até 12x sem juros" }
              ]
            },
            {
              "title": "Pagamento Posterior",
              "items": [
                { "id": "boleto", "title": "Boleto", "description": "Vencimento em 3 dias" },
                { "id": "transferencia", "title": "Transferência", "description": "TED/DOC" }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar Pagamento",
        "parameters": {
          "message": "Forma de pagamento selecionada: {{list_selection}}\n\nProcessando..."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "list_1" },
    { "source": "list_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Inicie o flow 2. Botão mostra "💰 Ver Todas as Opções" (personalizado) 3. Clique no botão para expandir lista 4. Selecione forma de pagamento 5. Confirmação processa seleção


sections (array, obrigatório)

O que é: Array de seções da lista. Cada seção tem título e array de itens.

Estrutura de cada seção:

{
  title: string,        // Nome da seção
  items: [              // Array de itens
    {
      id: string,       // ID único do item
      title: string,    // Texto do item (max 24 chars)
      description: string // Descrição opcional
    }
  ]
}

Limite: Máximo 10 itens no total (somando todas as seções)

Flow completo para testar:

{
  "name": "Teste LIST - Sections Múltiplas",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "list_1",
      "type": "list",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Lista Multi-Seção",
        "parameters": {
          "title": "🍕 Cardápio",
          "body": "Selecione o item que deseja pedir:",
          "buttonText": "Ver Cardápio",
          "sections": [
            {
              "title": "🍕 Pizzas",
              "items": [
                { "id": "margherita", "title": "Margherita", "description": "Molho, muçarela, tomate - R$ 35" },
                { "id": "calabresa", "title": "Calabresa", "description": "Calabresa, cebola - R$ 38" }
              ]
            },
            {
              "title": "🍔 Hambúrgueres",
              "items": [
                { "id": "classico", "title": "Clássico", "description": "Pão, carne, queijo - R$ 25" },
                { "id": "bacon", "title": "Bacon Burger", "description": "Com bacon crocante - R$ 30" }
              ]
            },
            {
              "title": "🥤 Bebidas",
              "items": [
                { "id": "coca", "title": "Coca-Cola", "description": "Lata 350ml - R$ 5" },
                { "id": "suco", "title": "Suco Natural", "description": "Laranja/Limão - R$ 8" }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar Pedido",
        "parameters": {
          "message": "Item adicionado: {{list_selection}}\n\n🛒 Deseja adicionar mais itens ou finalizar?"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "list_1" },
    { "source": "list_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Inicie o flow 2. Lista mostra 3 seções: Pizzas, Hambúrgueres, Bebidas 3. Cada seção tem itens com preço na descrição 4. Selecione qualquer item 5. Sistema captura ID para processar pedido


O que é: Texto adicional exibido abaixo da lista, ideal para informações complementares.

Padrão: Nenhum (lista sem footer)

Flow completo para testar:

{
  "name": "Teste LIST - Footer",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "list_1",
      "type": "list",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Lista com Footer",
        "parameters": {
          "title": "📦 Rastreamento",
          "body": "Selecione a transportadora do seu pedido:",
          "footer": "⏰ Atualizações em tempo real | 📱 Notificações automáticas",
          "buttonText": "Selecionar Transportadora",
          "sections": [
            {
              "title": "Transportadoras Principais",
              "items": [
                { "id": "correios", "title": "Correios", "description": "Entrega em 5-7 dias" },
                { "id": "fedex", "title": "FedEx", "description": "Entrega em 2-3 dias" },
                { "id": "dhl", "title": "DHL", "description": "Entrega em 1-2 dias" }
              ]
            },
            {
              "title": "Transportadoras Regionais",
              "items": [
                { "id": "jadlog", "title": "Jadlog", "description": "Regional - 3-5 dias" },
                { "id": "azul", "title": "Azul Cargo", "description": "Expressa - 1-2 dias" }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Rastrear Pedido",
        "parameters": {
          "message": "Transportadora: {{list_selection}}\n\nDigite o código de rastreamento:"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "list_1" },
    { "source": "list_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Inicie o flow 2. Lista com footer informando sobre atualizações 3. 5 transportadoras em 2 seções 4. Selecione uma transportadora 5. Sistema pede código de rastreamento

Parâmetros

Campo Tipo Obrigatório Descrição
title string Não Título principal destacado como header
body string Sim Texto explicativo (padrão: "Please select an item:")
buttonText string Não Texto do botão que abre lista (padrão: "Select")
sections array Sim Array de seções com itens (máx 10 itens total)
footer string Não Texto adicional abaixo da lista

Exemplo 1: Seleção de Planos de Assinatura

Objetivo: Apresentar planos de assinatura com detalhes e preços

JSON para Importar

{
  "name": "Seleção de Planos - Lista Interativa",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Introdução Planos",
        "parameters": {
          "message": "🚀 Bem-vindo ao Lumina!\n\nVamos escolher o melhor plano para você.\n\n✨ Todos os planos incluem:\n• Suporte 24/7\n• Atualizações gratuitas\n• Backup automático"
        }
      }
    },
    {
      "id": "list_1",
      "type": "list",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Lista de Planos",
        "parameters": {
          "title": "💎 Planos Disponíveis",
          "body": "Escolha o plano ideal para suas necessidades:",
          "footer": "💳 Aceita todas as formas de pagamento | 🔒 Cancele quando quiser",
          "buttonText": "Ver Todos os Planos",
          "sections": [
            {
              "title": "Planos Mensais",
              "items": [
                {
                  "id": "basic_month",
                  "title": "Básico - R$ 29/mês",
                  "description": "1 usuário, 10GB storage"
                },
                {
                  "id": "pro_month",
                  "title": "Pro - R$ 79/mês",
                  "description": "5 usuários, 100GB storage"
                },
                {
                  "id": "premium_month",
                  "title": "Premium - R$ 149/mês",
                  "description": "Usuários ilimitados, 1TB"
                }
              ]
            },
            {
              "title": "Planos Anuais (20% desconto)",
              "items": [
                {
                  "id": "basic_year",
                  "title": "Básico - R$ 279/ano",
                  "description": "Economize R$ 69/ano"
                },
                {
                  "id": "pro_year",
                  "title": "Pro - R$ 759/ano",
                  "description": "Economize R$ 189/ano"
                },
                {
                  "id": "premium_year",
                  "title": "Premium - R$ 1.429/ano",
                  "description": "Economize R$ 359/ano"
                }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "switch_1",
      "type": "switch",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Identificar Plano",
        "parameters": {
          "variable": "{{list_selection}}",
          "cases": [
            { "value": "basic_month", "label": "Básico Mensal" },
            { "value": "pro_month", "label": "Pro Mensal" },
            { "value": "premium_month", "label": "Premium Mensal" },
            { "value": "basic_year", "label": "Básico Anual" },
            { "value": "pro_year", "label": "Pro Anual" },
            { "value": "premium_year", "label": "Premium Anual" }
          ]
        }
      }
    },
    {
      "id": "message_basic",
      "type": "message",
      "position": { "x": 900, "y": 0 },
      "data": {
        "label": "Plano Básico",
        "parameters": {
          "message": "🎯 Plano Básico selecionado!\n\n✅ Inclui:\n• 1 usuário\n• 10GB de storage\n• Suporte por e-mail\n• Atualizações automáticas\n\nVamos prosseguir para o pagamento?"
        }
      }
    },
    {
      "id": "message_pro",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Plano Pro",
        "parameters": {
          "message": "🚀 Plano Pro selecionado!\n\n✅ Inclui:\n• 5 usuários\n• 100GB de storage\n• Suporte prioritário 24/7\n• Relatórios avançados\n• Integrações premium\n\nVamos prosseguir para o pagamento?"
        }
      }
    },
    {
      "id": "message_premium",
      "type": "message",
      "position": { "x": 900, "y": 200 },
      "data": {
        "label": "Plano Premium",
        "parameters": {
          "message": "💎 Plano Premium selecionado!\n\n✅ Inclui:\n• Usuários ilimitados\n• 1TB de storage\n• Gerente de conta dedicado\n• Treinamento personalizado\n• API ilimitada\n• White label\n\nVamos prosseguir para o pagamento?"
        }
      }
    },
    {
      "id": "buttons_1",
      "type": "buttons",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Confirmar Assinatura",
        "parameters": {
          "body": "Confirmar assinatura do plano selecionado?",
          "buttons": [
            { "id": "confirmar", "text": "✅ Sim, assinar" },
            { "id": "mudar", "text": "🔄 Mudar plano" },
            { "id": "cancelar", "text": "❌ Cancelar" }
          ]
        }
      }
    },
    {
      "id": "message_final",
      "type": "message",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Confirmação Final",
        "parameters": {
          "message": "🎉 Assinatura confirmada!\n\n📧 Você receberá um e-mail com:\n• Dados de acesso\n• Nota fiscal\n• Próximas etapas\n\n🚀 Bem-vindo ao Lumina!\nQualquer dúvida, estamos aqui 24/7."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "list_1" },
    { "source": "list_1", "target": "switch_1" },
    { "source": "switch_1", "target": "message_basic", "label": "Básico" },
    { "source": "switch_1", "target": "message_pro", "label": "Pro" },
    { "source": "switch_1", "target": "message_premium", "label": "Premium" },
    { "source": "message_basic", "target": "buttons_1" },
    { "source": "message_pro", "target": "buttons_1" },
    { "source": "message_premium", "target": "buttons_1" },
    { "source": "buttons_1", "target": "message_final" },
    { "source": "message_final", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 🚀 Bem-vindo ao Lumina!

Vamos escolher o melhor plano para você.

✨ Todos os planos incluem:
• Suporte 24/7
• Atualizações gratuitas
• Backup automático

[Lista aparece]
Title: 💎 Planos Disponíveis
Body: Escolha o plano ideal para suas necessidades:
Footer: 💳 Aceita todas as formas de pagamento | 🔒 Cancele quando quiser

Botão: [Ver Todos os Planos]

Usuário: [Clica e vê lista com 6 planos em 2 seções]
- Planos Mensais (Básico R$29, Pro R$79, Premium R$149)
- Planos Anuais (com 20% desconto)

Usuário: [Seleciona "Pro - R$ 79/mês"]

Sistema: 🚀 Plano Pro selecionado!

✅ Inclui:
• 5 usuários
• 100GB de storage
• Suporte prioritário 24/7
• Relatórios avançados
• Integrações premium

Vamos prosseguir para o pagamento?

[Botões aparecem: Sim/Mudar/Cancelar]

Usuário: [Clica "✅ Sim, assinar"]

Sistema: 🎉 Assinatura confirmada!

📧 Você receberá um e-mail com:
• Dados de acesso
• Nota fiscal
• Próximas etapas

🚀 Bem-vindo ao Lumina!
Qualquer dúvida, estamos aqui 24/7.

Exemplo 2: Seleção de Idioma e Preferências

Objetivo: Coletar preferências do usuário durante onboarding

JSON para Importar

{
  "name": "Onboarding - Seleção de Preferências",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Boas-vindas",
        "parameters": {
          "message": "👋 Olá! Bem-vindo!\n\nVamos configurar sua experiência.\n\nPrimeiro, vamos escolher seu idioma preferido."
        }
      }
    },
    {
      "id": "list_1",
      "type": "list",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Selecionar Idioma",
        "parameters": {
          "title": "🌍 Idioma / Language",
          "body": "Selecione seu idioma preferido:\nSelect your preferred language:",
          "buttonText": "Ver Idiomas / See Languages",
          "sections": [
            {
              "title": "Idiomas Principais",
              "items": [
                { "id": "pt_br", "title": "🇧🇷 Português (Brasil)", "description": "Portuguese (Brazil)" },
                { "id": "en_us", "title": "🇺🇸 English (US)", "description": "Inglês (Estados Unidos)" },
                { "id": "es", "title": "🇪🇸 Español", "description": "Espanhol" }
              ]
            },
            {
              "title": "Outros Idiomas",
              "items": [
                { "id": "fr", "title": "🇫🇷 Français", "description": "Francês" },
                { "id": "de", "title": "🇩🇪 Deutsch", "description": "Alemão" },
                { "id": "it", "title": "🇮🇹 Italiano", "description": "Italiano" }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar Idioma",
        "parameters": {
          "message": "✅ Idioma configurado: {{list_selection}}\n\nAgora, escolha seu tema de cores preferido:"
        }
      }
    },
    {
      "id": "list_2",
      "type": "list",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Selecionar Tema",
        "parameters": {
          "title": "🎨 Tema Visual",
          "body": "Qual tema você prefere?",
          "buttonText": "Ver Temas",
          "sections": [
            {
              "title": "Temas Padrão",
              "items": [
                { "id": "light", "title": "☀️ Claro", "description": "Tema claro para o dia" },
                { "id": "dark", "title": "🌙 Escuro", "description": "Tema escuro para a noite" },
                { "id": "auto", "title": "🌓 Automático", "description": "Muda conforme horário" }
              ]
            }
          ]
        }
      }
    },
    {
      "id": "message_3",
      "type": "message",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Finalizar Onboarding",
        "parameters": {
          "message": "🎉 Configuração completa!\n\n✅ Idioma: {{list_selection_1}}\n✅ Tema: {{list_selection_2}}\n\n🚀 Você está pronto para começar!\n\nVamos fazer um tour rápido?"
        }
      }
    },
    {
      "id": "buttons_1",
      "type": "buttons",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Tour",
        "parameters": {
          "body": "Fazer tour guiado?",
          "buttons": [
            { "id": "sim", "text": "✅ Sim, fazer tour" },
            { "id": "nao", "text": "⏭️ Pular tour" }
          ]
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "list_1" },
    { "source": "list_1", "target": "message_2" },
    { "source": "message_2", "target": "list_2" },
    { "source": "list_2", "target": "message_3" },
    { "source": "message_3", "target": "buttons_1" },
    { "source": "buttons_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 👋 Olá! Bem-vindo!

Vamos configurar sua experiência.

Primeiro, vamos escolher seu idioma preferido.

[Lista de idiomas aparece]
Usuário: [Seleciona "🇧🇷 Português (Brasil)"]

Sistema: ✅ Idioma configurado: pt_br

Agora, escolha seu tema de cores preferido:

[Lista de temas aparece]
Usuário: [Seleciona "🌙 Escuro"]

Sistema: 🎉 Configuração completa!

✅ Idioma: pt_br
✅ Tema: dark

🚀 Você está pronto para começar!

Vamos fazer um tour rápido?

[Botões: Sim/Pular]

Resposta do Node

{
  "success": true,
  "action": "whatsapp_list_created",
  "messageType": "interactive_list",
  "payload": {
    "type": "interactive",
    "header": {
      "type": "text",
      "text": "🏙️ Cidades Disponíveis"
    },
    "body": {
      "text": "Selecione a cidade para entrega:"
    },
    "footer": {
      "text": "Entrega em todo o Brasil"
    },
    "action": {
      "button": "Ver Cidades",
      "sections": [
        {
          "title": "Sudeste",
          "rows": [
            {
              "id": "sp",
              "title": "São Paulo",
              "description": "Capital - Entrega em 24h"
            },
            {
              "id": "rj",
              "title": "Rio de Janeiro",
              "description": "Capital - Entrega em 24h"
            }
          ]
        }
      ]
    }
  },
  "awaitingUserSelection": true,
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Boas Práticas

SIM:

  • Use descrições informativas em cada item (preços, prazos, detalhes)
  • Organize seções por categoria lógica (região, tipo, prioridade)
  • Mantenha títulos curtos e claros (máx 24 caracteres)
  • Use emojis nos títulos de seção para identificação visual
  • Personalize buttonText para contexto ("Ver Produtos", "Escolher Plano")
  • Combine com SWITCH para processar diferentes seleções
  • Use IDs descritivos que fazem sentido no código
  • Adicione footer com informações importantes (prazos, condições)

NÃO:

  • Não exceda 10 itens no total (limite do WhatsApp)
  • Não crie seções vazias sem itens
  • Não use títulos muito longos que serão cortados
  • Não esqueça de validar sections antes de acessar
  • Não use IDs duplicados entre itens
  • Não deixe descrições vazias quando podem ajudar usuário
  • Não use LIST para 3 ou menos opções (use BUTTONS)

Dicas

💡 LIST vs MENU: LIST é mais linear e simples, MENU é mais rico visualmente. Use LIST quando precisar de interface mais limpa.

💡 Descrições Estratégicas: Use descrições para diferenciar itens similares. Ex: "Entrega em 24h" vs "Entrega em 5 dias".

💡 Limite de Itens: Sistema valida automaticamente. Se precisar de mais de 10, divida em múltiplas listas com navegação.

💡 Seções Significativas: Agrupe itens que fazem sentido juntos. Ex: "Hoje", "Amanhã", "Próxima semana" para horários.

💡 IDs Únicos: Use IDs que facilitam debug (ex: "sp_capital", "rj_capital" para cidades).

💡 Footer Informativo: Use footer para informações que se aplicam a todos os itens (ex: "Frete grátis acima de R$ 100").

💡 Combinação com SWITCH: Capture seleção em variável e use SWITCH para diferentes ações por item.

💡 Testes de Usabilidade: Teste com usuários reais. Descrições claras reduzem confusão e aumentam conversão.

Próximo Node

MENU - Menu interativo com interface mais rica e visual → BUTTONS - Botões rápidos para 1-3 opções simples → SWITCH - Direcione flow baseado na seleção → VARIABLE - Armazene a seleção para uso posterior