Leads

Leads no Make, n8n e Zapier

Receitas para levar cada contato do tour a um sistema sem conector nativo: um card no Pipefy, uma linha no Google Sheets ou uma pessoa e um lead no Pipedrive. O GuiaFlow faz um POST https assinado. O plano Pro é necessário.

Se o cliente usa LeadPronto, RD Station ou HubSpot, prefira o conector nativo. Este guia cobre o resto.

Ligar o webhook

  1. Publique o tour e abra os contatos do link permanente. A seção Webhook fica nesse diálogo.
  2. Cole a URL https que o Make, o n8n ou o Zapier mostrar. Só https, porta 443, em host público.
  3. Gere um segredo whsec_… ou cole o que o destino criou. Guarde: ele não volta a aparecer inteiro.
  4. Salve e clique em Enviar teste. O evento de teste tem type lead.test.

O evento ligado por padrão é lead.created (formulário de abertura, source: "start", e formulário final, source: "contact"). lead.session_completed é opcional e avisa quando a pessoa termina o tour, com progress.reachedStep.

Visão geral do campo: Integrações.

O que chega no POST

Content-Type: application/json. O webhook-id do lead.created é o id do lead e se repete em todas as tentativas. O telefone vem em E.164. lead.consent traz given, o texto visto (text) e o instante (at).

{
  "type": "lead.created",
  "id": "6f1c0e2a-4b7d-4e0a-9c3d-1a2b3c4d5e6f",
  "createdAt": "2026-10-25T14:00:00.000Z",
  "source": "start",
  "lead": {
    "name": "Ana Souza",
    "email": "[email protected]",
    "phone": "+5511999999999",
    "message": null,
    "lang": "pt",
    "consent": {
      "given": true,
      "text": "Aceito que usem estes dados para entrar em contato sobre o tour.",
      "at": "2026-10-25T14:00:00.000Z"
    }
  },
  "tour": {
    "slug": "checkout",
    "title": "Tour do checkout",
    "url": "https://guiaflow.pro/p/checkout"
  },
  "context": {
    "referrerHost": "linkedin.com",
    "utm_source": "linkedin",
    "utm_medium": "social",
    "utm_campaign": "lancamento",
    "embed": false,
    "device": "desktop"
  }
}

Conferir a assinatura

Padrão Standard Webhooks. Os três cabeçalhos:

CabeçalhoUso
webhook-idId estável do evento. Igual em cada reenvio.
webhook-timestampSegundos unix de quando esta tentativa foi assinada.
webhook-signaturev1, e o base64 do HMAC. Pode haver mais de uma, separadas por espaço.

O conteúdo assinado é webhook-id + . + webhook-timestamp + . + o corpo cru do POST (não monte o JSON de novo). A chave é o base64 que vem depois de whsec_. O HMAC é SHA-256 e o resultado vai em base64. Recuse relógio com mais de 5 minutos de diferença.

Exemplo em Node, o mesmo algoritmo do envio: verify-signature.mjs.

import { verifyStandardWebhook } from "./verify-signature.mjs";

const raw = await readRawBody(req);
const ok = verifyStandardWebhook({
  secret: process.env.GUIAFLOW_WEBHOOK_SECRET,
  id: req.headers["webhook-id"],
  timestamp: req.headers["webhook-timestamp"],
  signature: req.headers["webhook-signature"],
  body: raw,
});

Os modelos do n8n já trazem esse passo (opção Raw Body no webhook e o nó Verificar assinatura). Troque whsec_COLE_O_SEGREDO. O Make e o Zapier respondem 200 assim que aceitam a chamada, antes dos módulos seguintes: eles não recusam uma assinatura inválida na resposta HTTP. Use o n8n ou o exemplo em Node quando precisar recusar um POST forjado.

Google Sheets

Uma linha por contato, na aba Leads. Crie a primeira linha com estes cabeçalhos, nesta ordem:

id, criado_em, origem, nome, email, telefone, mensagem, tour, url, utm_source, utm_medium, utm_campaign, referrer, consentimento.

Make

  1. Crie um cenário. Módulo Webhooks → Custom webhook, botão Add, dê um nome e copie a URL para o GuiaFlow.
  2. Salve o webhook no editor e clique em Enviar teste. No Make, Run once para ele aprender o JSON.
  3. Adicione Google Sheets → Add a row. Conecte a conta Google, escolha a planilha e a aba Leads.
  4. Mapeie cada coluna: nome vem de lead.name, email de lead.email, telefone de lead.phone (E.164), tour de tour.title, url de tour.url, id do id do evento, os utm_* e referrer de context, e consentimento de lead.consent.given.
  5. Ative o cenário.

Modelo HTTP, se você já tem um token OAuth do Google com a API Sheets: make-google-sheets.json. Importe em um cenário novo (menu de três pontos → Import blueprint). No primeiro módulo, crie um webhook novo. Troque SEU_ID_DA_PLANILHA e SEU_TOKEN_GOOGLE. A linha é acrescentada na aba Leads, na ordem dos cabeçalhos acima.

n8n

  1. Importe n8n-google-sheets.json (menu do fluxo → Import from file).
  2. No nó Verificar assinatura, cole o whsec_…. No nó Acrescentar linha, conecte o Google e troque SEU_ID_DA_PLANILHA pelo id que aparece em /spreadsheets/d/ na URL da planilha. A aba tem de se chamar Leads.
  3. Abra a URL de produção do webhook (não a de teste) e cole no GuiaFlow. Envie o teste e ative o fluxo.

No Zapier o gatilho é Webhooks by Zapier → Catch Hook e a ação é Google Sheets → Create Spreadsheet Row. Veja Zapier.

Pipefy

Cria um card direto numa fase. O número do pipe está na URL: https://app.pipefy.com/pipes/123456. Os ids da fase e dos campos saem desta query (token de app.pipefy.com/tokens ou conta de serviço, que é o caminho recomendado em produção):

{
  pipe(id: 123456) {
    name
    phases { id name }
    start_form_fields { id label required type }
  }
}

POST https://api.pipefy.com/graphql com Authorization: Bearer e o token. A documentação da mutation é a createCard.

Make

  1. Importe make-pipefy.json. No webhook, clique em Add e copie a URL para o GuiaFlow.
  2. No módulo HTTP, troque SEU_TOKEN_PIPEFY. No corpo, pipe e phase estão "0": coloque os ids. Os field_id de exemplo são nome, email e telefone — use os ids da query, e inclua os campos obrigatórios do formulário inicial.
  3. Envie o teste pelo editor. A resposta precisa ter data.createCard.card.id. Se vier errors, o card não foi criado.
  4. Ative o cenário. Dá para fazer o mesmo com o módulo Pipefy → Create a Card, escolhendo o pipe e a fase na lista e mapeando lead.name, lead.email e lead.phone.

n8n

  1. Importe n8n-pipefy.json.
  2. Cole o segredo no nó de assinatura. No nó Criar card, troque o token, pipe, phase e os field_id.
  3. Cole a URL de produção no GuiaFlow, envie o teste e ative.

No Zapier: Webhooks by Zapier → Catch Hook, depois Pipefy → Create Card.

Pipedrive

Cria a pessoa na API v2 e um lead ligado a ela (POST /api/v1/leads). O host é o da sua conta, o mesmo da barra do navegador: https://SUA_EMPRESA.pipedrive.com. O token fica em Configurações pessoais → API e vai no cabeçalho x-api-token. Referência: pessoas (v2) e leads.

Make

  1. Importe make-pipedrive.json. Crie o webhook no primeiro módulo e cole a URL no GuiaFlow.
  2. Nos dois módulos HTTP, troque SUA_EMPRESA e SEU_TOKEN_PIPEDRIVE. O segundo módulo lê o data.id da pessoa criada e grava o id do lead do GuiaFlow em origin_id.
  3. Se o contato vier sem e-mail ou sem telefone, apague o array vazio correspondente no corpo da pessoa. Envie o teste e confira a pessoa e o lead no Pipedrive.
  4. O mesmo fluxo existe nos módulos Pipedrive → Create a Person e Create a Lead, mapeando nome, e-mail e telefone.

n8n

  1. Importe n8n-pipedrive.json.
  2. Cole o segredo. Nos nós Criar pessoa e Criar lead, troque o subdomínio e o token.
  3. URL de produção no GuiaFlow, teste e ativação.

No Zapier: Webhooks by Zapier → Catch Hook, depois Pipedrive → Create Person. Um passo seguinte pode criar o lead com o id da pessoa.

Zapier

O Zapier entra pelo gatilho Webhooks by Zapier, evento Catch Hook. Não há conector com o nome GuiaFlow.

  1. Crie um Zap. No gatilho, escolha Webhooks by Zapier → Catch Hook e copie a URL para o webhook do tour.
  2. No editor do GuiaFlow, salve e clique em Enviar teste. No Zapier, teste o gatilho para ele mostrar os campos lead, tour e context.
  3. A ação depende do destino: Google Sheets → Create Spreadsheet Row, Pipefy → Create Card ou Pipedrive → Create Person. Mapeie nome, e-mail, telefone e o título do tour.
  4. Publique o Zap.

O Catch Hook não confere o HMAC. Para recusar um POST sem assinatura válida, use o modelo do n8n ou verify-signature.mjs.

Entrega e novas tentativas

  • O GuiaFlow espera no máximo 5 segundos e não segue redirect. Resposta 2xx conta como entregue.
  • Se a chamada falha, a mesma mensagem é reenviada com o mesmo webhook-id e uma assinatura nova. Os intervalos depois da tentativa imediata são 1 minuto, 5 minutos, 30 minutos, 2 horas e 12 horas.
  • Cerca de 20 falhas seguidas desligam o webhook. Salvar de novo, ou girar o segredo, zera a contagem.
  • Um destino que responde 200 e só depois grava o card pode duplicar o contato se a gravação estourar os 5 segundos: o GuiaFlow tenta outra vez. O id do lead é a chave para reconhecer o duplicado.

Dúvidas: [email protected].