Webhooks de Entrada
Receba eventos de plataformas externas e conceda sementes aos seus clientes automaticamente. Webhooks de entrada permitem que você conecte qualquer ferramenta d
📥 Webhooks de Entrada
Receba eventos de plataformas externas e conceda sementes aos seus clientes automaticamente. Webhooks de entrada permitem que você conecte qualquer ferramenta de terceiros — aplicativos de quiz, formulários, plataformas de avaliação, Zapier, Make e mais — ao seu programa de fidelidade LoyaltyTree.

Como Funciona
O sistema de webhook de entrada utiliza um modelo de Fontes & Códigos:
- Criar uma Fonte — Uma fonte representa uma plataforma ou ferramenta externa (por exemplo, "Typeform", "Zapier", "Meu Aplicativo de Quiz"). Cada fonte recebe uma URL de webhook exclusiva e uma chave secreta para segurança.
- Adicionar Códigos à Fonte — Cada código define uma ação específica que concede sementes (por exemplo, "quiz_completed", "form_submitted", "birthday_claimed"). Você define quantas sementes cada código concede, com limites opcionais.
- Enviar requisições POST — Sua plataforma externa envia uma requisição POST para a URL do webhook com o código e as informações do cliente. O LoyaltyTree encontra ou cria o cliente e concede as sementes automaticamente.
Plataforma Externa → POST para URL do Webhook → LoyaltyTree valida & concede sementes → Saldo do cliente atualizado
Começando
Passo 1: Criar uma Fonte de Webhook
Navegue até Loja → [Sua Loja] → Integrações → Webhooks de Entrada. Clique em + Adicionar Fonte e dê um nome que descreva a plataforma externa (por exemplo, "Quizzes Typeform" ou "Automação Zapier").
Quando a fonte for criada, você receberá:
- URL do Webhook — O endpoint para o qual sua plataforma externa enviará requisições
- Segredo do Webhook — Uma chave secreta para assinar requisições (recomendado para segurança)

Passo 2: Adicionar Códigos
Cada código representa uma ação específica que você deseja recompensar. Clique em + Adicionar Código na sua fonte para criar um.
| Campo | Requerido | Descrição |
|---|---|---|
| Código | Sim | O valor exato enviado no payload do webhook (por exemplo, quiz_completed). Isso deve corresponder ao que sua plataforma externa envia. |
| Nome de Exibição | Sim | Um nome amigável mostrado no painel de administração e no histórico de transações (por exemplo, "Quiz Completo"). |
| Descrição | Não | Uma nota opcional para sua equipe sobre quando esse código é usado. |
| Quantidade de Sementes | Sim | Quantas sementes conceder cada vez que esse código for acionado. O padrão é 1. |
| Máx. Sementes/Cliente | Não | O total máximo de sementes que um único cliente pode ganhar com este código. Deixe em branco para ilimitado. Uma vez que um cliente atinge esse limite, chamadas de webhook adicionais para ele retornarão sucesso, mas concederão 0 sementes. |
| Cooldown (horas) | Não | Horas mínimas entre as recompensas para o mesmo cliente neste código. Previne abusos limitando a frequência com que um cliente pode ganhar sementes. Deixe em branco para sem cooldown. |
| Habilitado | — | Alternar para habilitar ou desabilitar este código sem excluí-lo. Códigos desabilitados retornam um erro 403. |
Passo 3: Configurar sua Plataforma Externa
Configure sua plataforma externa (Zapier, Typeform, aplicativo personalizado, etc.) para enviar uma requisição POST para sua URL de webhook sempre que a ação ocorrer. Veja a seção Formato da Requisição abaixo para o formato exato do payload.
Códigos & Limites Explicados
Códigos e seus limites trabalham juntos para lhe dar controle preciso sobre como as sementes são concedidas:
Quantidade de Sementes
Cada código tem uma quantidade fixa de sementes. Cada vez que o webhook é acionado com esse código, o cliente recebe exatamente essa quantidade de sementes. Por exemplo, se você definir "quiz_completed" para 5 sementes, cada chamada de webhook qualificada concede 5 sementes.
Máx. Sementes por Cliente
Isso define um limite vitalício por cliente por código. É o total de sementes que o cliente pode ganhar com este código específico, não o número de vezes que ele pode acioná-lo.
quiz_completed com Quantidade de Sementes = 5 e Máx. Sementes/Cliente = 15.
- 1º quiz completado → +5 sementes (total: 5) ✅
- 2º quiz completado → +5 sementes (total: 10) ✅
- 3º quiz completado → +5 sementes (total: 15) ✅
- 4º quiz completado → +0 sementes (limite alcançado) — retorna sucesso, mas nenhuma semente concedida
Cooldown (Horas)
Define um tempo mínimo de espera entre as recompensas de sementes para o mesmo cliente no mesmo código. O temporizador de cooldown começa a contar a partir da última recompensa bem-sucedida.
daily_visit com Quantidade de Sementes = 2 e Cooldown = 24 horas.
- Segunda-feira 10h → +2 sementes ✅
- Segunda-feira 15h → +0 sementes (cooldown ativo, tente novamente em 19 horas)
- Terça-feira 11h → +2 sementes ✅
Formato da Requisição
Envie uma requisição POST para sua URL de webhook com o seguinte corpo JSON:
{
"code": "seu_codigo_aqui",
"customer": {
"email": "cliente@exemplo.com",
"shopify_customer_id": "12345",
"first_name": "Jane",
"last_name": "Smith"
},
"metadata": {
"quiz_score": 95,
"source_page": "spring-quiz"
}
}
| Campo | Requerido | Descrição |
|---|---|---|
code |
Sim | O valor do código que corresponde a um dos seus códigos configurados (por exemplo, quiz_completed) |
customer.email |
Sim* | Endereço de e-mail do cliente. Usado para encontrar ou criar o cliente. Requerido para novos clientes. |
customer.shopify_customer_id |
Não* | O ID do cliente no Shopify. Pode ser usado em vez do e-mail para identificar clientes existentes. |
customer.first_name |
Não | Primeiro nome do cliente. Usado ao criar novos clientes. |
customer.last_name |
Não | Sobrenome do cliente. Usado ao criar novos clientes. |
metadata |
Não | Quaisquer dados adicionais que você deseja armazenar com a transação (por exemplo, pontuações de quiz, informações da página). Armazenados como JSON e visíveis nos logs. |
* Pelo menos um de email ou shopify_customer_id é requerido. O e-mail é requerido quando o cliente não existe ainda no LoyaltyTree.
Verificação de Assinatura HMAC (Recomendado)
Para verificar se as requisições estão realmente vindo da sua plataforma (e não de alguém que encontrou sua URL de webhook), assine suas requisições usando HMAC-SHA256.
- Pegue o corpo da requisição JSON cru como uma string
- Crie um hash HMAC-SHA256 usando seu Segredo do Webhook como chave
- Inclua o hash codificado em hexadecimal em um dos cabeçalhos suportados
Cabeçalhos de assinatura suportados (o LoyaltyTree verifica todos eles):
X-Webhook-SignatureX-Hub-Signature-256X-Signature
O valor da assinatura pode ser o hash hexadecimal cru ou prefixado com sha256= (ambos os formatos são aceitos).
Alternativa: Autenticação de Token Simples
Se a assinatura HMAC não for possível na sua plataforma, você pode passar seu segredo de webhook como um token simples no cabeçalho X-Token. O LoyaltyTree irá compará-lo diretamente ao seu segredo.
Exemplo: Assinando com Node.js
const crypto = require('crypto');
const payload = JSON.stringify({
code: 'quiz_completed',
customer: { email: 'jane@example.com' }
});
const signature = crypto
.createHmac('sha256', 'seu_segredo_do_webhook')
.update(payload)
.digest('hex');
fetch('https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
body: payload
});
Exemplo: Assinando com Python
import hmac, hashlib, json, requests
payload = json.dumps({
"code": "quiz_completed",
"customer": {"email": "jane@example.com"}
})
signature = hmac.new(
b'seu_segredo_do_webhook',
payload.encode('utf-8'),
hashlib.sha256
).hexdigest()
requests.post(
'https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID',
headers={
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
data=payload
)
Exemplo: Usando cURL (para testes)
curl -X POST https://loyaltytree.eco/webhooks/inbound/YOUR_SOURCE_ID \
-H "Content-Type: application/json" \
-H "X-Token: seu_segredo_do_webhook" \
-d '{"code":"quiz_completed","customer":{"email":"jane@example.com"}}'
Formato de Resposta
Resposta Bem-Sucedida (200)
{
"success": true,
"seeds_awarded": 5,
"transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"customer_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef"
}
Bem-Sucedido, mas Limitado (200)
Quando um cooldown ou limite máximo de sementes impede a concessão, você ainda recebe uma resposta 200, mas com 0 sementes e uma explicação:
{
"success": true,
"seeds_awarded": 0,
"message": "Cooldown ativo. Tente novamente em 18 hora(s)."
}
// ou
{
"success": true,
"seeds_awarded": 0,
"message": "Máximo de sementes (15) já concedidas para este código."
}
Respostas de Erro
| Status HTTP | Erro | Significado |
|---|---|---|
| 400 | Campo obrigatório ausente: code |
O campo code não foi incluído no corpo da requisição |
| 400 | Campo obrigatório ausente: customer.email ou customer.shopify_customer_id |
Nenhum identificador de cliente foi fornecido |
| 400 | Código desconhecido: xyz |
O código enviado não corresponde a nenhum código configurado para esta fonte |
| 401 | Assinatura ou token de webhook inválido |
A assinatura HMAC ou token não corresponde. Verifique seu segredo do webhook. |
| 403 | Fonte do webhook está desabilitada |
A fonte foi desabilitada no painel de administração |
| 403 | Código desabilitado: xyz |
O código específico foi desabilitado |
| 404 | Fonte do webhook não encontrada |
O ID da fonte na URL não existe. Verifique a URL do webhook. |
Exemplos de Casos de Uso
🧩 Conclusão de Quiz
Recompense clientes por completar um quiz em seu site (construído com Typeform, Google Forms, etc.).
- Código:
quiz_completed - Sementes: 10
- Máx. Sementes: 10 (uma única vez)
- Cooldown: nenhum
📋 Resposta de Pesquisa
Conceda sementes quando um cliente completa uma pesquisa pós-compra.
- Código:
survey_completed - Sementes: 5
- Máx. Sementes: 25 (até 5 pesquisas)
- Cooldown: 168 horas (uma vez por semana)
🎂 Recompensa de Aniversário
Conceda sementes no aniversário de um cliente através da sua plataforma de marketing.
- Código:
birthday_reward - Sementes: 25
- Máx. Sementes: nenhuma (anual)
- Cooldown: 8760 horas (365 dias)
📸 Marca no Instagram
Recompense clientes que marcam sua marca no Instagram (verificado pela sua equipe ou ferramenta de mídia social).
- Código:
instagram_tag - Sementes: 15
- Máx. Sementes: 60 (até 4 marcas)
- Cooldown: 72 horas (uma vez a cada 3 dias)
Conectando com Zapier
Zapier é uma das maneiras mais populares de conectar o LoyaltyTree com centenas de outros aplicativos. Estamos construindo uma integração dedicada do LoyaltyTree na Zapier App Store, que tornará a configuração ainda mais fácil — procure por ela no marketplace do Zapier.
Estamos adicionando o LoyaltyTree como um aplicativo nativo do Zapier. Assim que disponível, você poderá procurar "LoyaltyTree" no diretório de aplicativos do Zapier e conectá-lo diretamente — sem necessidade de configuração de webhook. Fique atento!
Enquanto isso, você pode usar a ação Webhooks by Zapier para se conectar agora:
- Crie um Zap com seu gatilho desejado (por exemplo, "Nova Resposta do Typeform")
- Adicione um passo de ação: Webhooks by Zapier → POST
- Defina a URL para sua URL de webhook de entrada do LoyaltyTree
- Defina o Tipo de Payload como JSON
- Mapeie os campos:
code→ seu valor de código (por exemplo, "quiz_completed")customer.email→ o e-mail do respondente do gatilho
- Em Cabeçalhos, adicione
X-Tokencom o valor do seu segredo do webhook - Teste e ative seu Zap
Conectando com Make (Integromat)
Você também pode usar o módulo HTTP / Fazer uma requisição do Make para enviar webhooks para o LoyaltyTree. Configure-o da mesma forma que o Zapier — defina a URL, adicione o corpo JSON com code e customer, e inclua seu segredo no cabeçalho X-Token.
Logs de Webhook
Cada chamada de webhook de entrada é registrada e visível na seção Webhooks de Entrada da sua página de Integrações. Os logs mostram:
- Timestamp – Quando o webhook foi recebido
- Fonte – Qual fonte o recebeu
- Status – Sucesso ou falha
- Detalhes – Código usado, sementes concedidas ou mensagem de erro
- Payload – O corpo completo da requisição (criptografado em repouso)
Use os logs para verificar se sua integração está funcionando corretamente e para solucionar quaisquer problemas.
Solução de Problemas
Recebendo 401 "Assinatura de webhook inválida"
- Certifique-se de que você está assinando a string exata do corpo JSON que está enviando (sem espaços extras ou reformatando)
- Verifique se você está usando o segredo do webhook correto (você pode revelá-lo no painel de administração)
- Se a assinatura HMAC não for possível, use o cabeçalho
X-Tokencom seu segredo como um valor simples - Você pode regenerar o segredo nas configurações da fonte, se necessário
Recebendo 400 "Código desconhecido"
- O valor
codena sua requisição deve corresponder exatamente a um código que você configurou no painel de administração - Códigos são sensíveis a maiúsculas e minúsculas:
Quiz_Completedé diferente dequiz_completed - Verifique se o código está habilitado (não desabilitado)
Sementes concedidas são 0
- Verifique se o cliente atingiu o limite de Máx. Sementes/Cliente para este código
- Verifique se o Cooldown ainda está ativo — a mensagem de resposta dirá quantas horas esperar
- Ambos retornam HTTP 200 com
seeds_awarded: 0e uma explicação no campomessage
Cliente não está sendo criado
- Novos clientes requerem um endereço de e-mail. Se você enviar apenas
shopify_customer_id, o cliente deve já existir no LoyaltyTree. - Se tanto o e-mail quanto o ID do Shopify forem fornecidos, o LoyaltyTree primeiro procura pelo e-mail, depois pelo ID do Shopify, e cria um novo cliente apenas se nenhum dos dois corresponder.
Segurança
- Cada fonte recebe um segredo de webhook único de 64 caracteres, gerado automaticamente e criptografado em repouso
- Segredos podem ser regenerados a qualquer momento nas configurações da fonte (o segredo antigo para de funcionar imediatamente)
- Payloads de requisição são criptografados nos logs para privacidade
- A verificação de assinatura utiliza comparação segura por tempo para prevenir ataques de temporização
- Fontes e códigos podem ser desabilitados individualmente sem excluí-los