Leads in Make, n8n and Zapier
Recipes that send each tour contact to a system without a native connector: a card in Pipefy, a row in Google Sheets, or a person and a lead in Pipedrive. GuiaFlow sends a signed https POST. Pro plan required.
Connect the webhook
- Publish the tour and open the contacts for the permanent link. The Webhook section is in that dialog.
- Paste the https URL from Make, n8n or Zapier. https only, port 443, on a public host.
- Generate a
whsec_…secret or paste the one the destination created. Save it: the full value is not shown again. - Save and click Send test. The test event has
typelead.test.
The default event is lead.created (opening form, source: "start", and closing form, source: "contact"). lead.session_completed is optional and fires when the person finishes the tour, with progress.reachedStep.
Field overview: Integrations.
What the POST contains
Content-Type: application/json. For lead.created, webhook-id is the lead id and stays the same on every retry. The phone number is E.164. lead.consent has given, the text the person saw (text) and the time (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": "I agree to be contacted about this tour.",
"at": "2026-10-25T14:00:00.000Z"
}
},
"tour": {
"slug": "checkout",
"title": "Checkout tour",
"url": "https://guiaflow.pro/p/checkout"
},
"context": {
"referrerHost": "linkedin.com",
"utm_source": "linkedin",
"utm_medium": "social",
"utm_campaign": "launch",
"embed": false,
"device": "desktop"
}
}
Check the signature
Standard Webhooks. The three headers:
| Header | Use |
|---|---|
webhook-id | Stable event id. The same on every retry. |
webhook-timestamp | Unix seconds when this attempt was signed. |
webhook-signature | v1, plus the base64 HMAC. Several values can be separated by spaces. |
The signed content is webhook-id + . + webhook-timestamp + . + the raw POST body (do not rebuild the JSON). The key is the base64 after whsec_. The HMAC is SHA-256 and the digest is base64. Reject a clock skew of more than 5 minutes.
Node example, the same algorithm GuiaFlow uses to send: 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,
});
The n8n templates already include this step (Raw Body on the webhook and a Verificar assinatura code node). Replace whsec_COLE_O_SEGREDO. Make and Zapier answer 200 as soon as they accept the call, before later modules run, so they do not reject a bad signature in the HTTP response. Use n8n or the Node example when a forged POST must be refused.
Google Sheets
One row per contact, on a sheet named Leads. Create the header row in this order:
id, criado_em, origem, nome, email, telefone, mensagem, tour, url, utm_source, utm_medium, utm_campaign, referrer, consentimento.
Make
- Create a scenario. Add Webhooks → Custom webhook, click Add, name it and copy the URL into GuiaFlow.
- Save the webhook in the editor and click Send test. In Make, Run once so it learns the JSON.
- Add Google Sheets → Add a row. Connect Google, pick the spreadsheet and the Leads sheet.
- Map each column:
nomefromlead.name,emailfromlead.email,telefonefromlead.phone(E.164),tourfromtour.title,urlfromtour.url,idfrom the event id,utm_*andreferrerfromcontext, andconsentimentofromlead.consent.given. - Turn the scenario on.
HTTP blueprint, if you already have a Google OAuth token for the Sheets API: make-google-sheets.json. Import it into a new scenario (three-dot menu → Import blueprint). On the first module, create a new webhook. Replace SEU_ID_DA_PLANILHA and SEU_TOKEN_GOOGLE. The row is appended on the Leads sheet, in the header order above.
n8n
- Import n8n-google-sheets.json (workflow menu → Import from file).
- In Verificar assinatura, paste the
whsec_…. In Acrescentar linha, connect Google and replaceSEU_ID_DA_PLANILHAwith the id in/spreadsheets/d/in the spreadsheet URL. The sheet must be named Leads. - Copy the production webhook URL (not the test URL) into GuiaFlow. Send the test and activate the workflow.
In Zapier the trigger is Webhooks by Zapier → Catch Hook and the action is Google Sheets → Create Spreadsheet Row. See Zapier.
Pipefy
Creates a card directly in a phase. The pipe id is the number in the URL: https://app.pipefy.com/pipes/123456. Phase and field ids come from this query (a token from app.pipefy.com/tokens, or a service account, which Pipefy recommends for production):
{
pipe(id: 123456) {
name
phases { id name }
start_form_fields { id label required type }
}
}
POST https://api.pipefy.com/graphql with Authorization: Bearer and the token. Mutation reference: createCard.
Make
- Import make-pipefy.json. On the webhook, click Add and copy the URL into GuiaFlow.
- In the HTTP module, replace
SEU_TOKEN_PIPEFY. In the body,pipeandphaseare"0": put the real ids. The samplefield_idvalues arenome,emailandtelefone— use the ids from the query, and include every required start-form field. - Send the test from the editor. The response must include
data.createCard.card.id. Anerrorsarray means the card was not created. - Turn the scenario on. The same result is available with Pipefy → Create a Card: pick the pipe and the phase from the list and map
lead.name,lead.emailandlead.phone.
n8n
- Import n8n-pipefy.json.
- Paste the secret into the signature node. In Criar card, replace the token,
pipe,phaseand thefield_idvalues. - Paste the production URL into GuiaFlow, send the test and activate.
In Zapier: Webhooks by Zapier → Catch Hook, then Pipefy → Create Card.
Pipedrive
Creates the person with API v2 and a lead linked to that person (POST /api/v1/leads). The host is your company domain, the same one in the browser bar: https://SUA_EMPRESA.pipedrive.com. The token is under Personal preferences → API and is sent in the x-api-token header. Reference: persons (v2) and leads.
Make
- Import make-pipedrive.json. Create the webhook on the first module and paste the URL into GuiaFlow.
- In both HTTP modules, replace
SUA_EMPRESAandSEU_TOKEN_PIPEDRIVE. The second module readsdata.idfrom the person just created and stores the GuiaFlow lead id inorigin_id. - If a contact has no email or no phone, remove the matching empty array from the person body. Send the test and check the person and the lead in Pipedrive.
- The same flow exists as Pipedrive → Create a Person and Create a Lead, mapping name, email and phone.
n8n
- Import n8n-pipedrive.json.
- Paste the secret. In Criar pessoa and Criar lead, replace the subdomain and the token.
- Production URL in GuiaFlow, then test and activate.
In Zapier: Webhooks by Zapier → Catch Hook, then Pipedrive → Create Person. A following step can create the lead with that person id.
Zapier
Zapier starts from the Webhooks by Zapier trigger, event Catch Hook. There is no connector named GuiaFlow.
- Create a Zap. For the trigger, choose Webhooks by Zapier → Catch Hook and copy the URL into the tour webhook.
- In the GuiaFlow editor, save and click Send test. In Zapier, test the trigger so it shows
lead,tourandcontext. - The action depends on the destination: Google Sheets → Create Spreadsheet Row, Pipefy → Create Card or Pipedrive → Create Person. Map name, email, phone and the tour title.
- Publish the Zap.
Catch Hook does not check the HMAC. To refuse a POST without a valid signature, use the n8n template or verify-signature.mjs.
Delivery and retries
- GuiaFlow waits at most 5 seconds and does not follow redirects. Any 2xx counts as delivered.
- When the call fails, the same message is sent again with the same
webhook-idand a new signature. After the immediate attempt the gaps are 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours. - About 20 failures in a row turn the webhook off. Saving again, or rotating the secret, clears the count.
- A destination that answers 200 and only then writes the card can duplicate the contact if the write takes longer than 5 seconds: GuiaFlow tries again. The lead
idis the key for spotting the duplicate.
Questions: [email protected].