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:
- Feedback ao usuário: Informar o que está acontecendo ("Processando...", "Pedido confirmado!")
- Exibir resultados: Mostrar dados processados ("Seu saldo é R$ 1.250,00")
- Guiar o fluxo: Orientar o usuário sobre próximos passos ("Agora vou pedir alguns dados")
- 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:
- Pega o texto do parâmetro
message - Verifica se há variáveis no formato
{{nome_variavel}} - Substitui cada variável pelo seu valor real do contexto
- Se você passou objeto
variables, usa os valores de lá também - Envia a mensagem processada ao usuário
- 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:
- Boas-vindas: "Olá! Bem-vindo ao atendimento."
- Confirmações: "✅ Pedido #1234 confirmado com sucesso!"
- Informações: "Seu saldo atual é R$ 500,00"
- Instruções: "Agora vou pedir seus dados de contato"
- Resultados de APIs: "CEP encontrado: Rua das Flores, São Paulo - SP"
- Status de processamento: "Aguarde enquanto busco suas informações..."
- 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": {}
}
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 |
| 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