Skip to content
New storyWe built Skald to count visitors. It caught an AI-key thief.
SkaldEvery visit, truly told.

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

a Typeform on your page · sample
  1. 1 →Your work emailada@example.com
  2. 2 →How many sites do you run?4
  3. 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

tick a field

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.

pick a tool
  • Typeformform_response→ Contact forms
  • HubSpotcontact.creation→ Contact forms
  • HubSpota workflow's webhook→ Contact forms
  • Script tagform_submit, contact_submit→ Contact forms
  • Calendlyinvitee.created→ Demos
  • Cal.comBOOKING_CREATED→ Demos
  • HubSpota meeting (object 0-47)→ Demos
  • Script tagcalendly_booked, cal_booked→ Demos
  • Stripecheckout.session.completed→ Payments
  • HubSpotdealstage → 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.

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.

try both roads

Contact forms

Book a demoTypeform responser_7f3a9c · 08:11

Demos

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

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.

  1. Make secret. Skald: Settings > Integrations > Typeform > Make secret. Copy the address and the secret.
  2. Add a webhook. Typeform: open the form, then Connect > Webhooks > Add a webhook. Paste the address.
  3. 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.
  4. Add hidden fields. skv, filled in the embed with skald('id'), and the utm_ 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 label for 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 skv field 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.

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.

Start free trial Live demo