Workflow de Auto-Resposta
Conceituacao
Este guia mostra como criar um chatbot de auto-resposta completo usando N8N e Ogmma API. O workflow recebe mensagens via webhook, analisa o conteudo e envia respostas automaticas baseadas em palavras-chave.
E o exemplo mais completo de integracao -- combina recebimento de webhooks com envio de mensagens em um unico workflow.
Caso de Uso
Um restaurante quer responder automaticamente a perguntas frequentes:
| Palavra-chave | Resposta |
|---|---|
| "horario" ou "funciona" | Horario de funcionamento |
| "cardapio" ou "preco" | Link para o cardapio |
| Qualquer outra mensagem | Menu de opcoes |
Arquitetura do Workflow
[Webhook: message.received]
→ [Set: extrair dados]
→ [Switch: palavras-chave]
├── "horario" → [HTTP Request: enviar horario]
├── "cardapio" → [HTTP Request: enviar cardapio]
└── default → [HTTP Request: enviar menu]
Passo 1: Configurar o Webhook
Adicione um Webhook node como trigger do workflow.
| Campo | Valor |
|---|---|
| HTTP Method | POST |
| Path | ogmma-auto-reply |
| Response Mode | Immediately |
| Response Code | 200 |
Registre a Production URL na Ogmma API para o evento message.received:
curl -X POST "https://oapi.ogmma.com.br/v1/webhooks" \
-H "Authorization: Bearer oapi_sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://SEU-N8N.app.n8n.cloud/webhook/ogmma-auto-reply",
"events": ["message.received"],
"secret": "seu-secret-seguro"
}'
Para detalhes completos, consulte Receber Webhooks.
Passo 2: Extrair Dados da Mensagem
Adicione um Set node para extrair e normalizar os campos relevantes do payload.
Configuracao do Set Node
| Campo | Valor | Expressao |
|---|---|---|
from | Numero do remetente | {{ $json.data.from }} |
text | Texto em minusculas | {{ $json.data.content.toLowerCase() }} |
channelId | ID do canal | {{ $json.data.channelId }} |
conversationId | ID da conversa | {{ $json.data.conversationId }} |
Converter o texto para minusculas (.toLowerCase()) facilita a comparacao de palavras-chave, evitando que "HORARIO", "Horario" e "horario" precisem de regras separadas.
Passo 3: Logica Condicional (Switch)
Adicione um Switch node para rotear a mensagem baseado em palavras-chave.
Configuracao
| Campo | Valor |
|---|---|
| Mode | Rules |
| Data Type | String |
| Value | {{ $json.text }} |
Regras
| # | Operacao | Valor | Saida |
|---|---|---|---|
| 1 | Contains | horario | "Horario" |
| 1 | Contains | funciona | "Horario" |
| 2 | Contains | cardapio | "Cardapio" |
| 2 | Contains | preco | "Cardapio" |
| 3 | Fallback (default) | — | "Menu" |
Voce pode combinar varias condicoes na mesma saida usando "OR". No N8N, adicione multiplas condicoes dentro da mesma regra.
Passo 4: Enviar Respostas
Para cada saida do Switch, adicione um HTTP Request node que envia a resposta adequada.
4.1 Resposta "Horario"
| Campo | Valor |
|---|---|
| Method | POST |
| URL | https://oapi.ogmma.com.br/v1/channels/{{ $('Set').item.json.channelId }}/messages/text |
| Authentication | Header Auth → Ogmma API |
| Body Content Type | JSON |
Body:
{
"to": "={{ $('Set').item.json.from }}",
"text": "Nosso horario de funcionamento:\n\nSegunda a Sexta: 08:00 - 18:00\nSabado: 09:00 - 13:00\nDomingo: Fechado\n\nPrecisa de mais alguma coisa?"
}
4.2 Resposta "Cardapio"
Body:
{
"to": "={{ $('Set').item.json.from }}",
"text": "Acesse nosso cardapio completo:\nhttps://restaurante.com.br/cardapio\n\nPedidos pelo WhatsApp tambem sao aceitos!"
}
4.3 Resposta "Menu" (Default)
Body:
{
"to": "={{ $('Set').item.json.from }}",
"text": "Ola! Sou o assistente virtual. Como posso ajudar?\n\nDigite uma opcao:\n1. *horario* - Horario de funcionamento\n2. *cardapio* - Ver cardapio e precos\n3. *atendente* - Falar com um atendente\n\nOu escreva sua duvida que vou tentar ajudar!"
}
Workflow Completo
[Webhook]
↓
[Set: extrair from, text, channelId]
↓
[Switch: palavras-chave]
├── "horario/funciona" → [HTTP Request: horario]
├── "cardapio/preco" → [HTTP Request: cardapio]
└── default → [HTTP Request: menu]
Variacoes
Com Delay (Simular Digitacao)
Adicione um Wait node de 2 segundos antes de cada HTTP Request para simular o tempo de digitacao humana:
[Switch] → [Wait: 2s] → [HTTP Request: enviar resposta]
Fora do Horario Comercial
Adicione um IF node apos o Webhook para verificar o horario:
// Expressao no IF node
{{ new Date().getHours() >= 8 && new Date().getHours() < 18 }}
[Webhook] → [Set] → [IF: horario comercial?]
→ Sim: [Switch: palavras-chave] → [respostas normais]
→ Nao: [HTTP Request: "Estamos fora do horario, retornaremos amanha"]
Ignorar Mensagens Proprias
Adicione um IF node para ignorar mensagens enviadas pelo proprio bot (evitar loops):
[Webhook] → [IF: event == "message.received"?]
→ Sim: [Set] → [Switch] → [respostas]
→ Nao: [No Operation] (ignorar)
Se o webhook estiver configurado para receber message.sent alem de message.received, o bot pode entrar em loop respondendo a si mesmo. Filtre sempre pelo tipo de evento ou pela direcao da mensagem.
Com Reacao antes de Responder
Adicione uma reacao (emoji) a mensagem recebida antes de enviar a resposta:
[Webhook] → [Set] → [HTTP Request: reagir com 👍] → [Wait: 1s] → [Switch] → [respostas]
HTTP Request para reagir:
POST .../messages/react
{
"messageId": "={{ $json.data.messageId }}",
"emoji": "👍"
}
Proximo Passo
- Workflows Avancados -- cenarios mais complexos com IA, Google Sheets e e-commerce