Support

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:

  1. 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.
  2. 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.
  3. 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 ExternaPOST para URL do WebhookLoyaltyTree valida & concede sementesSaldo 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.

Exemplo: Você cria um código 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.

Exemplo: Você cria um código 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 ✅
Dica: Você pode combinar ambos os limites! Por exemplo, defina um código com Sementes = 10, Máx = 30, e Cooldown = 168 horas (7 dias) para conceder 10 sementes por semana, até 30 no total.

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.

Como assinar sua requisição:
  1. Pegue o corpo da requisição JSON cru como uma string
  2. Crie um hash HMAC-SHA256 usando seu Segredo do Webhook como chave
  3. Inclua o hash codificado em hexadecimal em um dos cabeçalhos suportados

Cabeçalhos de assinatura suportados (o LoyaltyTree verifica todos eles):

  • X-Webhook-Signature
  • X-Hub-Signature-256
  • X-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.

💡 Em Breve: Integração da Zapier App Store

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:

Configurando com Webhooks do Zapier:
  1. Crie um Zap com seu gatilho desejado (por exemplo, "Nova Resposta do Typeform")
  2. Adicione um passo de ação: Webhooks by Zapier → POST
  3. Defina a URL para sua URL de webhook de entrada do LoyaltyTree
  4. Defina o Tipo de Payload como JSON
  5. Mapeie os campos:
    • code → seu valor de código (por exemplo, "quiz_completed")
    • customer.email → o e-mail do respondente do gatilho
  6. Em Cabeçalhos, adicione X-Token com o valor do seu segredo do webhook
  7. 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-Token com 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 code na 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 de quiz_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: 0 e uma explicação no campo message
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

Was this helpful?

Let us know how we can improve our documentation.

contact_support

Still need help?

Our support team is available to assist you with any questions or technical issues.

Contact Support arrow_forward
feedback

Suggest an edit

Did you find an error or missing information? Help us improve our documentation.

Edit on GitHub open_in_new