TL;DR: O plano gratuito do Tally inclui webhooks nativos — use-os para enviar dados de formulários diretamente à REST API da Whapi.Cloud e entregar uma notificação no WhatsApp em segundos após cada envio. Não é necessária uma conta Zapier. Você precisa de um receptor implantado (Node.js ou qualquer servidor HTTP), um token de API da Whapi.Cloud e um número de WhatsApp conectado. A configuração leva menos de 30 minutos. Prefere sem código? Pule para a seção do Zapier e Make — mas o preço por tarefa aumenta rapidamente além do plano gratuito.
O webhook nativo gratuito do Tally é suficiente para entregar uma notificação no WhatsApp no momento em que um formulário é enviado. Sem conta Zapier, sem camada de automação paga. Basta uma chamada REST direta à Whapi.Cloud. Este guia detalha a estrutura exata do payload que o Tally envia, um receptor funcional em Node.js e o tratamento de erros que evita que as notificações se percam silenciosamente sob carga.
O Que Significa "Sem Middleware" Nesta Integração
Sem middleware significa que o seu receptor de webhook chama a Whapi.Cloud diretamente — os dados do formulário percorrem um único salto HTTP do Tally até o WhatsApp, sem nenhuma plataforma de terceiros intermediando.
Uma chamada REST direta também reduz a latência de entrega: um envio do Tally geralmente chega como mensagem no WhatsApp em menos de dois segundos, em comparação com o tempo de 3 a 15 segundos que um pipeline de automação com múltiplos saltos adiciona.
A compensação é real, mas pequena: você escreve um servidor HTTP mínimo ou uma função serverless, mas elimina a cobrança por tarefa e a dependência externa. Três etapas, um caminho de dados: o Tally dispara o webhook, o seu receptor chama a Whapi.Cloud, o WhatsApp entrega a mensagem — sem intermediário pago em nenhuma etapa.
O Que Você Precisa Antes de Começar
Três pré-requisitos: uma conta na Whapi.Cloud com um número de WhatsApp conectado, um endpoint HTTPS público para o seu receptor e um formulário do Tally em qualquer plano.
-
Conta na Whapi.Cloud com um número conectado: Cadastre-se em panel.whapi.cloud/register, conecte um número de WhatsApp escaneando um QR code e copie o token de API do painel. O escaneamento leva cerca de dois minutos — diferentemente do processo oficial da API, não é necessária verificação empresarial da Meta.
-
Um endpoint HTTPS público: O Tally requer uma URL acessível para enviar os payloads do webhook. Qualquer servidor cloud, VPS ou função serverless funciona. Para testes locais, use ngrok ou webhook.site para inspecionar os payloads antes de implantar.
-
Um formulário do Tally: Qualquer formulário em qualquer plano do Tally; os webhooks estão disponíveis no plano gratuito sem necessidade de upgrade.
Como o Tally Envia Dados do Formulário: Entendendo o Payload do Webhook
Quando um formulário é enviado, o Tally envia um único objeto JSON para a URL do seu webhook via HTTP POST. A parte crítica é data.fields: um array onde cada objeto contém o rótulo do campo, uma chave única, o tipo de campo e o valor enviado.
Veja como é um payload típico de webhook do Tally para um formulário de contato com três campos:
{
"eventId": "3c679025-76b0-4a17-a4e5-f54ac2c5d7e0",
"eventType": "FORM_RESPONSE",
"createdAt": "2026-05-04T08:30:00.000Z",
"data": {
"responseId": "mApVL4",
"submissionId": "mApVL4",
"formId": "wkaBcd",
"formName": "Contact Form",
"createdAt": "2026-05-04T08:30:00.000Z",
"fields": [
{
"key": "question_mLpNx3",
"label": "Full Name",
"type": "INPUT_TEXT",
"value": "Jane Smith"
},
{
"key": "question_Bq7kL2",
"label": "Email",
"type": "INPUT_EMAIL",
"value": "[email protected]"
},
{
"key": "question_Kp2mQ9",
"label": "Phone",
"type": "INPUT_PHONE_NUMBER",
"value": "+1 415 555 1234"
}
]
}
}
A key de cada campo é um ID único específico do formulário (ex.: question_mLpNx3) que muda por formulário. Use o campo label para pesquisa no seu código receptor, a menos que você fixe chaves específicas após inspecionar o payload do seu próprio formulário.
A pesquisa por rótulo é mais legível e sobrevive a edições no formulário do Tally. Chaves fixas são ligeiramente mais rápidas, mas quebram se você renomear um campo. Para um receptor de notificações de leads, a pesquisa por rótulo é a opção padrão prática.
Mapeando Campos do Tally para uma Mensagem no WhatsApp
O padrão mais simples: itere data.fields, localize por label e interpole o value em uma string de template de mensagem. Campos de múltipla escolha e campos de upload de arquivo retornam arrays — trate-os separadamente se o seu formulário incluir esses tipos. Mapear rótulos de campos do Tally para variáveis de mensagens do WhatsApp é o que permite alertas de leads personalizados em escala: cada envio se torna uma notificação com nome em vez de um ping genérico.
Passo a Passo: Conectar Formulários do Tally ao WhatsApp via Whapi.Cloud
A integração tem duas partes: a Whapi.Cloud cuida da entrega no WhatsApp e o Tally aciona o envio de dados. Configure a Whapi.Cloud primeiro para que a URL do webhook esteja pronta quando você abrir as configurações do Tally.
O webhook do Tally está disponível no plano gratuito — não é necessário upgrade pago para configurar uma URL de webhook personalizada.
Passo 1: Conecte Seu Número de WhatsApp à Whapi.Cloud
Faça login no painel da Whapi.Cloud, crie um novo canal e escaneie o QR code com a conta do WhatsApp que enviará as notificações. Após conectar, copie o token de API exibido na página do canal. Este token vai no cabeçalho Authorization: Bearer de cada requisição à API.
Armazene o token em uma variável de ambiente (WHAPI_TOKEN) em vez de fixá-lo no código. O painel permite regenerar o token a qualquer momento sem reconectar o número.
Passo 2: Implante Seu Receptor de Webhook
Implante o receptor Node.js da seção de código abaixo em qualquer servidor ou plataforma serverless com uma URL HTTPS pública. O receptor deve aceitar requisições POST na rota configurada e retornar uma resposta 200 em poucos segundos — o Tally considera qualquer resposta não 2xx como falha de entrega. Para testes rápidos, aponte o webhook para webhook.site ou use ngrok http 3000 para expor um servidor local antes de implantar.
Passo 3: Configure a URL do Webhook no Tally
Abra o seu formulário no Tally, vá em Integrações → Webhooks e cole a URL HTTPS do seu receptor. O Tally envia uma requisição POST para essa URL a cada envio do formulário. Nenhuma configuração de cabeçalho de autenticação é necessária no lado do Tally — a segurança fica no seu receptor, que aceita as requisições e chama a Whapi.Cloud com o token Bearer.
Se o seu receptor estiver atrás de um firewall ou lista de IPs permitidos, saiba que o Tally não publica uma faixa de IP de saída estática. Use um endpoint público aberto ou um proxy de entrada dedicado para implantações em produção.
Passo 4: Teste com um Envio Real
Clique em Enviar envio de teste no painel de Webhooks do Tally. O seu receptor registrará o payload recebido. Confirme que data.fields contém os rótulos que o seu código espera e verifique se a mensagem do WhatsApp chega ao número de destino. Se a mensagem não chegar, verifique os logs do receptor para o status da resposta da Whapi.Cloud antes de ajustar qualquer outra coisa.
Código do Receptor de Webhook: Implementação em Node.js
O receptor abaixo faz exatamente uma coisa: extrair os campos relevantes do payload do Tally e enviar uma mensagem formatada no WhatsApp via endpoint /messages/text da Whapi.Cloud. Usa Node.js com Express, menos de 50 linhas, sem SDK necessário.
Antes de executar, instale as dependências: npm install express node-fetch. O Node 18+ tem fetch nativo embutido, portanto você pode omitir a importação de node-fetch se estiver em um runtime recente.
const express = require('express');
const fetch = require('node-fetch'); // omit if Node 18+ (native fetch available)
const app = express();
app.use(express.json());
const WHAPI_TOKEN = process.env.WHAPI_TOKEN; // Whapi.Cloud API token from dashboard
const NOTIFY_PHONE = process.env.NOTIFY_PHONE; // Recipient number, e.g. 14155551234
// Find a submitted value by field label inside Tally's fields array
function getField(fields, label) {
const found = fields.find(f => f.label === label);
return found ? String(found.value ?? '') : 'N/A';
}
app.post('/webhook', async (req, res) => {
const fields = req.body?.data?.fields ?? [];
const name = getField(fields, 'Full Name');
const email = getField(fields, 'Email');
const phone = getField(fields, 'Phone');
// Compose the WhatsApp notification body
const messageBody = `New Tally submission:\n\nName: ${name}\nEmail: ${email}\nPhone: ${phone}`;
let whapiStatus = 'sent';
try {
const response = await fetch('https://gate.whapi.cloud/messages/text', {
method: 'POST',
headers: {
'Authorization': `Bearer ${WHAPI_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: NOTIFY_PHONE, // phone number with country code, no leading +
body: messageBody
})
});
if (!response.ok) {
const err = await response.json().catch(() => ({}));
console.error('[whapi] error', response.status, err);
whapiStatus = 'failed';
// Still return 200 to Tally; Whapi errors do not benefit from Tally retrying
}
} catch (networkErr) {
console.error('[whapi] network error', networkErr.message);
whapiStatus = 'failed';
}
res.json({ received: true, whatsapp: whapiStatus });
});
app.listen(process.env.PORT || 3000, () =>
console.log('Webhook receiver listening')
);
O cabeçalho Authorization: Bearer é a única autenticação que a Whapi.Cloud exige — sem instalação de SDK, sem fluxo OAuth, sem biblioteca para configurar. A API aceita JSON simples e retorna JSON simples.
O campo to aceita o número de telefone do destinatário com código de país e sem o sinal de mais inicial (ex.: 14155551234 para um número dos EUA). O formato de Chat ID do WhatsApp ([email protected]) também funciona. A API aceita ambos.
Para um teste rápido com cURL antes de implantar o receptor completo, envie uma mensagem manualmente para verificar se o token e o número estão corretos:
curl -X POST https://gate.whapi.cloud/messages/text \
-H "Authorization: Bearer YOUR_WHAPI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"to": "14155551234", "body": "Test from Tally webhook setup"}'
Uma resposta bem-sucedida retorna um objeto JSON com um campo message contendo o ID da mensagem enviada. Se este teste funcionar, sua configuração de token e número está correta. Prossiga para implantar o receptor completo.
Tratamento de Erros: O Que Acontece Quando a Requisição à Whapi.Cloud Falha
Uma requisição HTTP com falha à Whapi.Cloud não é repetida automaticamente. Se o seu receptor enviar um 200 ao Tally antes de confirmar que a chamada ao WhatsApp foi bem-sucedida, a notificação se perde sem rastro nos logs do Tally.
Retorne 200 ao Tally somente após a conclusão da chamada à Whapi.Cloud — registre falhas localmente e coloque-as em fila para retry em vez de depender do Tally para reenviar.
Os três códigos de erro que você encontrará na prática e o que significam:
| Status HTTP | Causa | Solução |
401 Unauthorized |
Token de API ausente, expirado ou copiado incorretamente | Regenere o token no painel da Whapi.Cloud e atualize WHAPI_TOKEN |
400 Bad Request |
Payload malformado: geralmente um valor to ausente ou formato de número incorreto |
Registre req.body e verifique se o campo to contém apenas dígitos com código de país |
5xx Server Error |
Problema transitório de rede na Whapi.Cloud ou no WhatsApp | Implemente retries com backoff exponencial; a maioria dos erros transitórios se resolve em segundos |
Um cenário que surpreende equipes com formulários de leads em alto volume: enviar centenas de mensagens idênticas em rápida sucessão pode acionar a detecção de spam do lado do servidor do WhatsApp. Isso não é um limite da API da Whapi.Cloud — os planos de produção da Whapi.Cloud não impõem limites de taxa por mensagem. O throttle vem da infraestrutura do WhatsApp monitorando picos de volume. Para cenários de rajada, adicione um pequeno atraso entre os envios ou coloque os envios em fila antes de processá-los.
Alternativas Sem Código: Quando Usar Zapier, Make ou n8n
Para equipes sem servidor para implantar, Zapier, Make e n8n conectam o Tally ao WhatsApp sem código de backend — ao custo de cobranças por tarefa que crescem a cada envio.
-
Zapier: GUI mais simples, maior biblioteca de conectores pré-construídos. O plano gratuito suporta 100 tarefas/mês, suficiente apenas para testes de baixíssimo volume. Os planos pagos cobram por zap (tarefa), portanto cada envio do formulário consome um crédito. Escolha o Zapier se a equipe não tem capacidade técnica e o volume se mantém em poucos centos de envios por mês.
-
Make (antes Integromat): Mais poderoso que o Zapier para fluxos de múltiplas etapas; o plano gratuito permite 1.000 operações/mês. O preço escala por operação. Boa opção intermediária para equipes não técnicas que precisam de lógica condicional sem escrever código.
-
n8n: Open-source e auto-hospedável. Workflows ilimitados em instâncias próprias, sem cobrança por operação. A escolha certa para equipes técnicas sensíveis a custos que querem flexibilidade de automação sem taxas recorrentes por tarefa. Veja o guia de integração n8n da Whapi.Cloud para um tutorial passo a passo.
Equipes não técnicas usam Zapier ou Make; desenvolvedores usam o webhook nativo do Tally com uma chamada REST direta à Whapi.Cloud. O fator decisivo não é a complexidade técnica — é a previsibilidade do volume de envios e se a cobrança por tarefa cabe no seu orçamento.
Comparação de Custos: API Direta vs. Plataformas de Middleware
Zapier e Make cobram por tarefa ou operação: cada envio do formulário que aciona uma notificação no WhatsApp consome uma unidade faturável. A Whapi.Cloud cobra por número de WhatsApp conectado por mês, não por mensagem.
A tarifa mensal fixa por número da Whapi.Cloud significa que 5.000 mensagens acionadas por formulário custam o mesmo que 50 — plataformas de middleware faturam linearmente a cada envio.
| Método | Plano Gratuito | Modelo de Preços (Pago) | Código Necessário | Ideal Para |
| Zapier | 100 tarefas/mês | Por tarefa (zap); o custo cresce com os envios | Não | Equipes não técnicas, baixo volume |
| Make | 1.000 ops/mês | Por operação; o custo cresce com os envios | Não | Fluxos de múltiplas etapas, preferência sem código |
| n8n (auto-hospedado) | Ilimitado | Apenas custos de servidor (infraestrutura fixa) | Parcial (baseado em configuração) | Equipes técnicas, sensíveis a custo |
| Whapi.Cloud (direto) | 5 conversas/mês (Sandbox) | Mensalidade fixa por número de WhatsApp (independente do volume) | Sim (~50 linhas) | Desenvolvedores, custo previsível, alto volume |
A diferença no modelo de preços importa mais quando o volume de envios é imprevisível. Um lançamento de produto ou campanha viral pode aumentar os envios de formulários 10 vezes da noite para o dia. Com middleware de cobrança por tarefa, esse pico multiplica sua fatura de automação. Com a assinatura por número da Whapi.Cloud, o mesmo pico não custa nada a mais.
Comece com o Sandbox gratuito da Whapi.Cloud para testar o fluxo completo antes de conectar um número de WhatsApp de produção. O Sandbox é permanentemente gratuito sem limite de tempo — use-o para verificar seu código receptor, o mapeamento de campos e o tratamento de erros antes de ir ao ar. Veja a documentação completa da API da Whapi.Cloud para detalhes de requisição/resposta em todos os endpoints.
Os webhooks do Tally funcionam com qualquer linguagem ou runtime capaz de HTTP. O exemplo em Node.js aqui é um ponto de partida; a mesma lógica se aplica a Python (com requests ou httpx), Go, PHP ou um Cloudflare Worker. Sem lock-in de linguagem pelo WhatsApp significa que você pode trocar a linguagem do receptor sem alterar nenhuma configuração do Tally ou da Whapi.Cloud.









