Lead attribution · Typeform
Typeform lead tracking: every response joined to its visit
Typeform lead tracking in Skald counts each Typeform response as a contact form, from Typeform's signed webhook, and joins it to the visitor's journey through a hidden field you add to the form.
Typeform lead tracking is counting each completed Typeform as a lead and tying it to where the person came from. Skald reads Typeform's signed webhook, the message Typeform sends the moment a form is submitted, takes the visitor ID and campaign from the form's hidden fields, and never reads the answers.
30-day free trial · no card · we set it up within one working day · free to self-host
- 1 →Your work emailada@example.com
- 2 →How many sites do you run?4
- 3 →What should we know?We want AI crawler numbers
Submit
stays in Typeform
- ada@example.com
- 4
- We want AI crawler numbers
answers: never read
POST …/typeform · signed
"event_type": "form_response",
"token": "r_7f3a9c",
"submitted_at": "…T08:11:20Z",
"hidden": {
"skv": "skv_Q2xh…",
"utm_source": "newsletter"
},
"answers": [ 3 answers ] dropped
kept Contact forms · completed
Sample form. The answers stay in Typeform: Skald reads the event, the token, the time and the hidden fields.
[01] hidden fields
A Typeform response says nothing about the visit. Hidden fields fix that.
Typeform's webhook carries the answers, the response's token and the time. The visit is missing. Skald reads it from the form's hidden fields, fields the person never sees that your page fills in: skv for the visitor ID, and the campaign tags. Tick the fields your form has and see the one row Skald keeps, part of your lead attribution.
hidden fields on your form · tick them
Visitor IDs are off by default. The person who runs your Skald server turns them on per site.
the row Skald keeps · sample
- what
- Contact forms · completed
- reference
r_7f3a9c, the response's token- visitor ID
skv_Q2xh…: joins the pages read before- campaign
- newsletter / email / october
- landing page
- not recorded
- country, device
- not recorded: Typeform sends neither
- not read
- the answers
With skv filled, the response joins the visitor's journey: first touch, last touch and the pages before it.
Sample response. Skald reads only skv and these hidden fields: referrer, landing, the utm_ tags and the ad click ids. Any other hidden field, like plan, is dropped with the answers.
[02] one name per action
A Typeform, a HubSpot form and your own form are all one "Contact forms"
Every tool names its events its own way. Skald gives each action one name, whatever reports it, so the same thing is never counted under two names. Contact forms and Demos are leads. Payments and won deals are shown, and never counted as leads.
- Typeform
form_response→ Contact forms - HubSpot
contact.creation→ Contact forms - HubSpot
a workflow's webhook→ Contact forms - Script tag
form_submit, contact_submit→ Contact forms - Calendly
invitee.created→ Demos - Cal.com
BOOKING_CREATED→ Demos - HubSpot
a meeting (object 0-47)→ Demos - Script tag
calendly_booked, cal_booked→ Demos - Stripe
checkout.session.completed→ Payments - HubSpot
dealstage → closedwon→ Deals, won
- Contact formsa lead
- Demosa lead, also counted as demos booked
- Paymentsnot a lead
- Deals, wonnot a lead: an outcome
Every Typeform response is a Contact form, completed. Typeform sends one event, form_response; any other is answered OK and left out.HubSpot can report three things: a new contact (Contact forms), a meeting booked (Demos) and a deal moved to closed won (Deals, won, never a lead). HubSpot form attributionThe script tag sees forms and booking widgets inside your own pages. It cannot see inside a Typeform embed: that is Typeform's page, not yours. Count in-page events as goalsA Calendly booking is a Demo; its cancellation or no-show is a later stage of the same booking, never a second lead.A Cal.com booking is a Demo, like Calendly's, so the two add up under one name on Summary.A paid Stripe Checkout is a Payment. It is listed and counted on its own, and never adds a lead.
Event names as each tool sends them, mapped by Skald's own list.
[03] another action
Your "Book a demo" Typeform counts as a contact form. Here is how to make it a demo.
On Skald's Typeform hook, every response is a Contact form: there is no setting that changes it. When a form should count as a demo or a sign-up, send its responses through Zapier, Make or n8n to the json hook instead, with the action you choose. Try moving the card.
Contact forms
r_7f3a9c · 08:11Demos
Sign-ups
POST https://stats.example.com/traffic-hooks/example.com/typeform
Typeform-Signature: sha256=<signed by Typeform>
{"event_type": "form_response", "form_response": {"token": "r_7f3a9c", …}}
→ read as: action contact, stage completed
POST https://stats.example.com/traffic-hooks/example.com/json
Authorization: Bearer <your-secret>
{"external_ref": "r_7f3a9c", "action": "demo"}
→ read as: action demo, stage completed
Press "Move it to Demos", or drag the card.
Sample response. On the json road, turn the Typeform webhook off for that form, or the response arrives twice and counts once per tool. Settings > Integrations > Status names any lead that came from two tools.
[04] set up and limits
Set up Typeform lead tracking in four steps
One step in Skald, two in Typeform, and one on your page.
- Make secret. Skald: Settings > Integrations > Typeform > Make secret. Copy the address and the secret.
- Add a webhook. Typeform: open the form, then Connect > Webhooks > Add a webhook. Paste the address.
- Paste the secret. Edit the webhook, paste the secret into Secret, save and turn it on. Typeform made its own? Paste that one into Skald instead.
- Add hidden fields.
skv, filled in the embed withskald('id'), and theutm_fields. Then press Send a test event.
What it does not do
- The answers are never read, so responses are never sorted by what people wrote. Use the json road with a
labelfor that. - Through the Typeform hook, every response is a Contact form, completed.
- A Typeform has no "started" or "abandoned": the script tag cannot see inside Typeform's embed.
- Journeys need a filled
skvfield and visitor IDs on for the site (off by default). The response counts either way. - A landing page comes only from a hidden field. Country and device stay not recorded: Typeform sends neither.
keep reading
More on Typeform lead tracking
questions
Typeform lead tracking FAQ
Straight answers, including what Skald does not do.
How does Skald count a Typeform response?
Each response Typeform sends counts as a Contact form, completed. The response's token is its reference, so a repeat of the same response is never counted twice.
Does Skald read the answers to my Typeform?
Never. Skald reads the event, the response's token and time, and the hidden fields skv and utm_. Phone numbers and form answers are always dropped.
How do I join a Typeform response to the visitor's journey?
Add a hidden field named skv to the form, and fill it in the embed with the visitor ID, which the page knows as skald('id'). Hidden utm_ fields give the last touch. This needs visitor IDs on for the site.
Who makes the Typeform webhook secret?
Either side. Press Make secret in Skald and paste it into the webhook's Secret in Typeform, or paste Typeform's own secret into Skald's Typeform box.
Can a Typeform count as a demo or a sign-up instead?
Through the Typeform webhook, every response is a Contact form. To give a form another action, send it through Zapier or Make to Skald's json hook, with the action you choose. Zapier, Make and n8n lead tracking.
Can an old Typeform message be sent again?
Typeform signs no time, so Skald remembers each message it accepted for 30 days and refuses an exact repeat. Each conversion is also kept only once per tool, reference and stage.
$ tail -f access.log | skald
See what AI does with your site. Free for 30 days.
No card. We set up hosted Skald for you within one working day, or you self-host it free. Every line of your log, sorted and added up.