Pular para conteúdo

MESSAGE - Enviar Mensagem

O que é este Node?

O MESSAGE é o node responsável por enviar mensagens de texto ao usuário durante a execução do flow. Ele é o principal meio de comunicação entre o sistema e o usuário, permitindo exibir informações, confirmações, resultados de processamento e qualquer tipo de texto.

Por que este Node existe?

Em flows de automação, você precisa se comunicar com o usuário constantemente. O MESSAGE existe para:

  1. Feedback ao usuário: Informar o que está acontecendo ("Processando...", "Pedido confirmado!")
  2. Exibir resultados: Mostrar dados processados ("Seu saldo é R$ 1.250,00")
  3. Guiar o fluxo: Orientar o usuário sobre próximos passos ("Agora vou pedir alguns dados")
  4. Personalização: Usar variáveis para tornar mensagens dinâmicas e personalizadas

Sem o MESSAGE, seu flow seria "mudo" - executaria ações mas o usuário não saberia o que está acontecendo.

Como funciona internamente?

Quando o MESSAGE é executado, o sistema:

  1. Pega o texto do parâmetro message
  2. Verifica se há variáveis no formato {{nome_variavel}}
  3. Substitui cada variável pelo seu valor real do contexto
  4. Se você passou objeto variables, usa os valores de lá também
  5. Envia a mensagem processada ao usuário
  6. Retorna sucesso e passa para o próximo node

Código interno (basic-flow-executor.service.ts:85-109):

private async executeMessage(parameters: any, context: any): Promise<any> {
  const { message, variables } = parameters;

  let processedMessage = message || 'Default message';

  // Substituição de variáveis
  if (variables && typeof variables === 'object') {
    Object.keys(variables).forEach(key => {
      const placeholder = `{{${key}}}`;
      processedMessage = processedMessage.replace(
        new RegExp(placeholder, 'g'),
        variables[key]
      );
    });
  }

  return {
    success: true,
    action: 'message_sent',
    message: processedMessage,
    timestamp: new Date().toISOString(),
    messageType: 'text'
  };
}

Como funciona a substituição de variáveis:

Entrada:

message: "Olá {{nome}}! Você tem {{idade}} anos."
variables: { nome: "João", idade: 25 }

Processamento: 1. Encontra {{nome}} → substitui por "João" 2. Encontra {{idade}} → substitui por "25"

Saída enviada ao usuário:

Olá João! Você tem 25 anos.

Quando você DEVE usar este Node?

Use MESSAGE sempre que precisar comunicar algo ao usuário:

Casos de uso:

  1. Boas-vindas: "Olá! Bem-vindo ao atendimento."
  2. Confirmações: "✅ Pedido #1234 confirmado com sucesso!"
  3. Informações: "Seu saldo atual é R$ 500,00"
  4. Instruções: "Agora vou pedir seus dados de contato"
  5. Resultados de APIs: "CEP encontrado: Rua das Flores, São Paulo - SP"
  6. Status de processamento: "Aguarde enquanto busco suas informações..."
  7. Erros amigáveis: "Ops! Não encontrei esse produto no sistema"

Parâmetros Detalhados

message (string, obrigatório)

O que é: O texto que será enviado ao usuário.

Suporta variáveis: Sim! Use {{nome_variavel}} para substituir valores dinamicamente.

Formatação: - Use \n para quebrar linhas - Suporta emojis: ✅ 📦 🚀 💰 - Suporta markdown básico (dependendo do canal)

Flow completo - Mensagem básica:

{
  "name": "Teste MESSAGE Básico",
  "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": "Mensagem Simples",
        "parameters": {
          "message": "✅ Pedido confirmado com sucesso!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Flow completo - Mensagem com variáveis do contexto:

{
  "name": "Teste MESSAGE com Variáveis",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Pedir Nome",
        "parameters": {
          "message": "Qual é o seu nome?",
          "variable": "nome"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Usar Variável",
        "parameters": {
          "message": "Olá {{nome}}! Bem-vindo ao sistema."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Flow completo - Mensagem com formatação:

{
  "name": "Teste MESSAGE com Formatação",
  "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": "Mensagem Formatada",
        "parameters": {
          "message": "📦 PEDIDO CONFIRMADO\n\n🔢 Número: 12345\n💰 Valor: R$ 150,00\n📅 Data: 15/01/2025\n\n✅ Processamento iniciado!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Como testar: Copie qualquer JSON acima, importe e execute!

variables (object, opcional)

O que é: Um objeto com pares chave-valor para substituir no texto.

Por que usar: Quando você quer passar valores explícitos, não do contexto global do flow.

Diferença entre variáveis do contexto vs. parâmetro variables:

Variáveis do contexto (vêm de nodes anteriores):

// Node START cria: {{flowId}}, {{userId}}, etc.
// Node INPUT com variable="nome" cria: {{nome}}
{
  "message": "Flow {{flowId}} iniciado para usuário {{userId}}"
}
// Busca automaticamente do contexto

Flow completo - Usando parâmetro variables:

{
  "name": "Teste Parâmetro VARIABLES",
  "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": "Produto com Variables",
        "parameters": {
          "message": "🛍️ PRODUTO DISPONÍVEL\n\n📦 Produto: {{produto}}\n💰 Preço: {{preco}}\n📏 Tamanho: {{tamanho}}\n\n✅ Disponível em estoque!",
          "variables": {
            "produto": "Camiseta Básica",
            "preco": "R$ 49,90",
            "tamanho": "M"
          }
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Como testar: 1. Copie o JSON acima 2. Importe e execute 3. Observe que as variáveis vêm do próprio node (não de nodes anteriores)

Quando usar cada um: - Use contexto quando o valor veio de node anterior (INPUT, API, etc.) - Use parâmetro variables quando você quer valores hard-coded ou calculados naquele momento

Resposta Técnica do Node

Quando o MESSAGE executa, ele retorna este JSON:

{
  "success": true,
  "action": "message_sent",
  "message": "Olá João! Bem-vindo ao Lumina.",
  "timestamp": "2025-01-15T10:35:00.000Z",
  "messageType": "text"
}

Campos explicados: - success: true → Sempre true (MESSAGE raramente falha) - action: "message_sent" → Identifica que foi envio de mensagem - message → O texto FINAL que foi enviado (já com variáveis substituídas) - timestamp → Momento exato do envio - messageType: "text" → Tipo da mensagem (sempre texto no MESSAGE básico)

Como Usar Variáveis - Guia Completo

1. Variáveis do START

O node START cria automaticamente estas variáveis:

{
  "type": "message",
  "parameters": {
    "message": "Flow: {{flowId}}\nUsuário: {{userId}}\nSessão: {{sessionId}}\nIniciado: {{timestamp}}"
  }
}

Saída:

Flow: flow_abc123
Usuário: user_456
Sessão: session_789
Iniciado: 2025-01-15T10:30:00.000Z

2. Variáveis de Nodes INPUT/NUMBER/EMAIL/etc.

Quando você usa nodes de captura, eles salvam valores em variáveis:

Flow:

START → INPUT (variable="nome") → MESSAGE

MESSAGE pode usar:

{
  "message": "Olá {{nome}}! Prazer em conhecê-lo."
}

Se usuário digitou "Carlos", saída será:

Olá Carlos! Prazer em conhecê-lo.

3. Múltiplas Variáveis

{
  "message": "Cadastro:\n\nNome: {{nome}}\nEmail: {{email}}\nTelefone: {{telefone}}\nCidade: {{cidade}}"
}

Todas as variáveis vêm do contexto do flow (nodes anteriores).

4. Variáveis com Parâmetro variables

{
  "message": "Olá {{nome}}! Você comprou {{produto}} por {{preco}}.",
  "variables": {
    "produto": "Notebook Dell",
    "preco": "R$ 3.500,00"
  }
}

Aqui, {{nome}} vem do contexto, mas {{produto}} e {{preco}} vêm do parâmetro variables.

5. Variável não encontrada

Se você usar {{variavel_inexistente}}, ela aparece vazia:

{
  "message": "Nome: {{nome}} - Sobrenome: {{sobrenome}}"
}

Se contexto só tem nome="João":

Nome: João - Sobrenome:

Boa prática: Sempre verifique se as variáveis existem antes de usar.

Formatação de Mensagens

Quebra de linha

Use \n (barra invertida + n):

{
  "message": "Linha 1\nLinha 2\nLinha 3"
}

Saída:

Linha 1
Linha 2
Linha 3

Mensagens estruturadas

{
  "message": "📦 PEDIDO CONFIRMADO\n\n🔢 Número: {{pedido_id}}\n💰 Valor: {{valor}}\n📅 Data: {{data}}\n\n✅ Processamento iniciado!"
}

Saída:

📦 PEDIDO CONFIRMADO

🔢 Número: 12345
💰 Valor: R$ 150,00
📅 Data: 15/01/2025

✅ Processamento iniciado!

Emojis

Funcionam normalmente:

{
  "message": "✅ Sucesso! ❌ Erro! 📦 Pedido! 🚀 Rápido! 💰 Dinheiro! 📧 Email!"
}

Listas

{
  "message": "Itens do pedido:\n\n1. Camiseta - R$ 49,90\n2. Calça - R$ 89,90\n3. Tênis - R$ 199,90\n\nTotal: R$ 339,70"
}

Exemplo Real 1: Confirmação de Cadastro

Cenário: Usuário forneceu nome, email e telefone. Queremos confirmar os dados.

Flow:

START → INPUT(nome) → EMAIL(email) → PHONE(telefone) → MESSAGE → END

MESSAGE:

{
  "id": "message_confirm",
  "type": "message",
  "data": {
    "label": "Confirmar Dados",
    "parameters": {
      "message": "✅ Cadastro realizado com sucesso!\n\n👤 Nome: {{nome}}\n📧 Email: {{email}}\n📱 Telefone: {{telefone}}\n\nObrigado por se cadastrar!"
    }
  }
}

O que acontece: 1. INPUT captura nome="Maria Silva" 2. EMAIL captura email="maria@exemplo.com" 3. PHONE captura telefone="11987654321" 4. MESSAGE substitui e envia:

✅ Cadastro realizado com sucesso!

👤 Nome: Maria Silva
📧 Email: maria@exemplo.com
📱 Telefone: 11987654321

Obrigado por se cadastrar!

Exemplo Real 2: Resultado de Busca de CEP

Cenário: Sistema buscou CEP na API e quer mostrar resultado.

Supondo que node API retornou:

{
  "cep": "01310-100",
  "logradouro": "Avenida Paulista",
  "bairro": "Bela Vista",
  "cidade": "São Paulo",
  "uf": "SP"
}

MESSAGE:

{
  "type": "message",
  "parameters": {
    "message": "📍 CEP Encontrado!\n\nCEP: {{cep}}\nEndereço: {{logradouro}}\nBairro: {{bairro}}\nCidade: {{cidade}} - {{uf}}"
  }
}

Saída:

📍 CEP Encontrado!

CEP: 01310-100
Endereço: Avenida Paulista
Bairro: Bela Vista
Cidade: São Paulo - SP

Exemplo Real 3: Status de Pedido

Cenário: E-commerce quer enviar atualização de pedido.

MESSAGE:

{
  "type": "message",
  "parameters": {
    "message": "🚀 Atualização do Pedido #{{pedido_id}}\n\nStatus: {{status}}\nÚltima atualização: {{ultima_atualizacao}}\n\n{{mensagem_status}}",
    "variables": {
      "status": "Em transporte",
      "mensagem_status": "Seu pedido saiu para entrega e chegará em até 2 dias úteis! 📦"
    }
  }
}

Se contexto tem pedido_id="12345" e ultima_atualizacao="15/01/2025 14:30":

Saída:

🚀 Atualização do Pedido #12345

Status: Em transporte
Última atualização: 15/01/2025 14:30

Seu pedido saiu para entrega e chegará em até 2 dias úteis! 📦

Exemplo Real 4: Mensagens Condicionais (com Logic Node)

Cenário: Enviar mensagem diferente baseado em condição.

Flow:

START → NUMBER(idade) → IF(idade >= 18) → MESSAGE_ADULTO
                                        → MESSAGE_MENOR

MESSAGE_ADULTO:

{
  "message": "Você tem {{idade}} anos. Você é maior de idade e pode prosseguir! ✅"
}

MESSAGE_MENOR:

{
  "message": "Você tem {{idade}} anos. É necessário ter 18+ para continuar. ❌"
}

Erros Comuns e Como Evitar

❌ ERRO: Mensagem vazia

{
  "type": "message",
  "parameters": {}
}
Problema: Parâmetro message é obrigatório Solução: Sempre forneça o texto

{
  "type": "message",
  "parameters": {
    "message": "Texto da mensagem"
  }
}

❌ ERRO: Variável com sintaxe errada

{
  "message": "Olá {nome}!"  // ❌ Falta uma chave
}
{
  "message": "Olá {{nome}!"  // ❌ Falta chave de fechamento
}

Correto:

{
  "message": "Olá {{nome}}!"  // ✅
}

❌ ERRO: Usar variável que não existe

{
  "message": "Saldo: {{saldo}}"
}

Se nenhum node anterior criou a variável saldo, ela aparece vazia:

Saldo:

Solução: Garanta que o node que cria a variável foi executado antes.

❌ ERRO: Esquecer \n para quebra de linha

{
  "message": "Linha 1 Linha 2"  // ❌ Fica tudo junto
}

Correto:

{
  "message": "Linha 1\nLinha 2"  // ✅
}

Boas Práticas

Use emojis para chamar atenção: ✅ ❌ 📦 🚀 tornam mensagens mais visuais

Quebre linhas para legibilidade: Mensagens longas em um bloco só são difíceis de ler

Confirme dados importantes: Sempre mostre o que foi capturado/processado

Use variáveis para personalização: "Olá {{nome}}!" é mais amigável que "Olá!"

Estruture informações: Use títulos, listas e seções

Não envie mensagens vazias ou genéricas: "Ok" não ajuda o usuário

Não abuse de emojis: Mais de 3-4 por mensagem fica poluído

Não faça mensagens muito longas: Divida em múltiplos MESSAGE se necessário

Diferença entre MESSAGE e outros nodes de comunicação

Node Propósito Aguarda resposta?
MESSAGE Enviar texto ao usuário ❌ Não
INPUT Capturar texto do usuário ✅ Sim
NUMBER Capturar número do usuário ✅ Sim
EMAIL Capturar email do usuário ✅ Sim

MESSAGE é apenas OUTPUT (saída). Para INPUT (entrada), use nodes de captura.

Performance e Limitações

Velocidade

MESSAGE é instantâneo. Não há delay ou processamento pesado.

Tamanho de mensagem

Depende do canal (WhatsApp, Telegram, etc.): - WhatsApp: Até 4096 caracteres - Telegram: Até 4096 caracteres - SMS: Até 160 caracteres (múltiplas mensagens se maior)

Se exceder: Divida em múltiplos MESSAGE nodes.

Quantidade de MESSAGEs

Não há limite, mas considere UX: - Muitas mensagens seguidas podem incomodar o usuário - Agrupe informações relacionadas em uma mensagem só

Integração com Canais

O MESSAGE funciona automaticamente em todos os canais suportados:

  • WhatsApp: Aparece como mensagem de texto
  • Telegram: Aparece como mensagem de texto
  • Messenger: Aparece como mensagem de texto
  • Slack: Aparece como mensagem em canal/DM
  • SMS: Enviado como SMS

O sistema adapta automaticamente a formatação para cada canal.

Próximos Passos

Agora que você domina MESSAGE, aprenda sobre:

INPUT - Capturar respostas de texto do usuário → END - Finalizar o flow corretamente → NUMBER - Capturar números do usuário