Descreva o problema/erro/pergunta:
Tentei responder a um tópico fechado que discutia exatamente o mesmo problema, mas como está bloqueado, estou criando um novo thread.
Não consigo verificar minha URL de Webhook da Meta WhatsApp Cloud API no n8n Cloud. A Meta continua falhando ao validar a URL de Callback.
Qual é a mensagem de erro (se houver)?
O Meta Developer Console exibe um erro geral de falha na verificação de callback ao clicar em “Verify and Save”.
Por favor, compartilhe seu workflow:
- Webhook trigger (GET/POST)
- If node checks: hub.mode == subscribe AND hub.verify_token == n8n_property_bot_verify_token
- Respond to Webhook node: Retorna o hub.challenge bruto como texto simples (HTTP Status 200).
Compartilhe a saída retornada pelo último node:
Texto bruto contendo o valor hub.challenge com cabeçalho HTTP 200.
Informações sobre sua configuração n8n:
- n8n version: Latest Cloud
- Database: Cloud Default
- Running n8n via: n8n cloud (aboanada67.app.n8n.cloud)
- Operating system: Cloud Hosted
Oi @Abo_Anad_Abo_Anad Bem-vindo!
O Meta envia a verificação como GET e as entregas de mensagens como POST, e o nó Webhook registra um método por vez, portanto um nó no POST retorna 404 para a solicitação de verificação e o Meta mostra apenas sua falha de callback genérica. Abra as Configurações do nó e ative Permitir Múltiplos Métodos HTTP, depois mantenha GET e POST no campo Métodos HTTP. O nó terá uma saída por método, então execute a saída GET para seu nó If e o nó Respond to Webhook, e use a saída POST para o tratamento de mensagens.
Clique em Verify e salve com o workflow publicado e a URL de produção colada no Meta, a URL de teste só escuta por 120 segundos.
Oi @Abo_Anad_Abo_Anad
A falha é quase certamente causada por uma de três coisas: usar a URL de Teste em vez da URL de Produção, um caminho JSON incorreto na sua expressão (parâmetros de consulta estão aninhados), ou a resposta sendo enviada como application/json em vez de text/plain.
Quando você clica em “Verificar e Salvar” no Meta Developer Console, a Meta envia uma solicitação GET em tempo real para sua URL.
- NÃO use a URL de Teste (aquela terminando em
/test). A URL de Teste só funciona quando você tem o editor n8n aberto e clicou manualmente em “Executar Workflow”. A solicitação da Meta atingirá um listener fechado e falhará.
- USE a URL de Produção (aquela sem
/test).
- Nota: Você deve Salvar e Ativar o workflow para que a URL de Produção esteja ativa.
Para passar no handshake da Meta, seus nós devem ser configurados exatamente assim:
- HTTP Method:
GET (Nota: Para recebimento de mensagens real, você precisará adicionar POST depois, então configure como GET e POST).
- Path: (Seu caminho escolhido, por exemplo,
whatsapp-webhook)
- Respond:
Using 'Respond to Webhook' node (Isto é obrigatório).
A Meta envia parâmetros na Query String, não no Body. Seu nó “If” deve verificar o objeto query.
- Condition 1 (String):
{{ $json.query['hub.mode'] }} Equal subscribe
- Condition 2 (String):
{{ $json.query['hub.verify_token'] }} Equal your_token_here
Este é o lugar onde a maioria dos usuários falha. A Meta espera a string bruta, não um objeto JSON.
- Respond With:
Text
- Response Body:
{{ $json.query['hub.challenge'] }} (Use uma expressão)
- HTTP Status Code:
200
- Response Headers (Opcional mas recomendado):
- Name:
Content-Type
- Value:
text/plain
Quando a Meta acessa sua URL, a estrutura de dados fica assim:
{
"query": {
"hub.mode": "subscribe",
"hub.verify_token": "n8n_property_bot_verify_token",
"hub.challenge": "123456789"
}
}
Seu workflow deve extrair 123456789 e retorná-lo como uma string de texto plano, não {"challenge": "123456789"}.
Isso ajuda?
Continuando a discussão de Meta Whats-app Web hook Verification failing on n8n Cloud (GET hub.challenge response issue):
Isso quase sempre é uma de duas coisas, e ambas são fáceis de perder.
Primeiro, o formato da resposta. A chamada de verificação do Meta é um GET com três parâmetros de query: hub.mode, hub.verify_token e hub.challenge. Espera hub.challenge de volta como texto simples puro com um 200. A resposta padrão de web hook do n8n é JSON, então o Meta recebe algo como {“challenge”:“123”} em vez de apenas 123, e rejeita.
Solução:
- No nó Web hook, defina Respond como “Using Respond to Web hook
node”
- Adicione um nó Respond to Web hook
- Defina Respond With = Text
- Response Body = {{ $json.query[‘hub.challenge’] }}
Text, não JSON. Essa única configuração geralmente é o problema inteiro.
Segundo, e isso pega muita gente no Cloud: certifique-se de que deu ao Meta a URL de produção, não a URL de teste, e que o workflow está realmente ativo. A URL de teste só escuta uma chamada depois que você clica em “Listen for test event” e fica inativa depois disso, então a verificação falha silenciosamente mesmo que tudo pareça certo no editor.
Mais uma coisa que vai te economizar depois: o Meta usa GET para verificação e POST para mensagens de entrada reais, na mesma URL. Se você não dividir isso, sua lógica de manipulação de mensagens será executada na chamada de verificação também. Adicione um Switch ou IF logo após o web hook verificando {{ $json.headers[‘x-forwarded-method’] }} ou a presença de $json.query[‘hub.mode’], e rotearize os dois caminhos separadamente.
Vale a pena verificar se hub.verify_token corresponde ao que você definiu no painel do Meta antes de responder, em vez de ecoar o desafio incondicionalmente.