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

Lead attribution · Cal.com

Cal.com lead tracking: bookings, cancellations and the journey before

Cal.com lead tracking in Skald takes Cal.com's signed webhook for each booking, cancellation and reschedule, keeps no repeat of the same message, and joins each booking to the visitor's journey through a visitor ID your page passes to Cal.com.

Cal.com lead tracking is recording each call booked through Cal.com as a lead, with where the person came from. Skald reads Cal.com's signed webhook, the message Cal.com sends the moment someone books, cancels or reschedules, and with the script tag on your page it also sees a Cal.com embed opened and booked.

30-day free trial · no card · we set it up within one working day · free to self-host

calcom hook · sample · no timestamp, so every body is remembered

POST /traffic-hooks/example.com/calcom · BOOKING_CREATED · uid bk_7Hq2

  1. 1 X-Cal-Signature-256 matches the raw body
  2. 2 sha256 of the tool, the event and the body
  3. 3 taken in the last 30 days?

hash 9f2c41ab07d3e86a…

kept Demos · completed. Its hash is kept 30 days, even after a person is forgotten.

Sample deliveries. A hash is a short fingerprint of a message: the same message always gives the same hash. The bar under each one is its 30 days running out.

[01] the booking that forgot its visitor

A Cal.com booking with no journey is a lead you cannot explain. Pass the ID, and Skald finds it.

Cal.com never sees your visitor's pages. Your page passes the anonymous visitor ID, which it knows as skald('id'), into the booking: as metadata, or as a hidden booking question. Skald looks in three places, in a fixed order, and keeps only a value shaped like a Skald ID. That is how the booking joins its pages in lead attribution.

pick where it went

the webhook's payload · sample

"metadata": {"skv": "skv_Q2xhc3NpY0V4YW1wbGVJRA", "utm_source": "linkedin"}
  1. payload.metadata.skvskv_Q2xhc3NpY0V4YW1wbGVJRA: a Skald ID. Taken.
  2. payload.metadata.utm_contentnot read: rung 1 found it
  3. payload.responses.skvnot read: rung 1 found it

visitor ID kept: skv_Q2xhc3NpY0V4YW1wbGVJRA

Found on the first rung. The booking joins the journey, and utm_source gives its last touch.

Sample payloads. With visitor IDs off for the site, which is the default, every visitor ID is removed before anything is kept, wherever it was found.

[02] after the booking

Your page saw the booking on Monday. Only Cal.com knows about Friday.

With the script tag on the page, Skald sees a Cal.com embed opened and booked. A reschedule on Wednesday and a cancellation on Friday happen in Cal.com, so only its webhook can tell. Drag through one sample week.

drag the week

your page · script tag

Mon 10:02 · Cal.com opened cal_open Mon 10:05 · Cal.com booked cal_booked

Cal.com webhook

Mon 10:05 · BOOKING_CREATED demo completed Wed 16:20 · BOOKING_RESCHEDULED rescheduled Fri 09:00 · BOOKING_CANCELLED cancelled
page road
Demos: started, then completed. Nothing after Monday.
webhook road
Demos: completed, rescheduled, cancelled.
the lead
Counted on Monday, the day it was booked. Friday's cancellation is shown apart and never takes it away.

Sample week. Each road keeps its own rows. With the embed and the webhook both on, the booking is recorded on each road; Skald lists them apart and never merges them.

[03] your event types only

Someone else's 30-minute calls should stay out. Name the ones that are yours.

Under Only these Cal.com event types you list this site's event types: an id such as 1234, a slug such as 30min, or the booking page's address. Skald cuts each line into the forms it compares, and keeps a booking only when one of them meets the event's id or slug. Any other booking is answered 200 and nothing of it is kept.

Type a line, or pick one, and see what Skald compares.

type or pick a line

the forms Skald compares

https://cal.com/example/30min30min

BOOKING_CREATED · eventTypeId 1234 · type "30min"

kept

BOOKING_CREATED · eventTypeId 5678 · type "coaching"

ignored: other event type (id 5678, slug coaching)

Sample events. Lower case does not matter; a trailing slash does not matter; a page address keeps its last part.

[04] set up and limits

Set up Cal.com lead tracking in five steps

One step in Skald, three in Cal.com, then a test from Skald.

  1. In Skald, open Settings › This site › Integrations, press Make secret in the Cal.com box, and copy the address and the secret, shown once.
  2. In Cal.com, go to Settings › Developer › Webhooks › New and paste the address as the Subscriber URL.
  3. Pick the triggers Booking Created, Booking Cancelled and Booking Rescheduled.
  4. Paste the secret into Secret and save. Already gave Cal.com a secret of your own? Paste that into Skald instead.
  5. Press Send a test event in Skald: signed, received, read, and kept nowhere.

What it does not do

  • Your page passes the visitor ID to Cal.com itself, as skald('id') in metadata or a hidden question.
  • Journeys need visitor IDs, which are off by default. The booking counts either way.
  • Skald takes Booking Created, Cancelled and Rescheduled only, so Cal.com gives no no-show figure.
  • The tag reads embed messages from app.cal.com. An embed served from your own Cal.com install is seen through the webhook only.
  • A booking page address with a query, such as ?month=2026-10, leaves nothing to match. List the id or the slug.
  • A visitor ID is a browser, and it never names anyone.

questions

Cal.com lead tracking FAQ

Straight answers, including what Skald does not do.

How do I track Cal.com bookings as leads?

Make a secret for the Cal.com hook in Skald's Integrations page. In Cal.com, add a webhook under Settings > Developer > Webhooks with Skald's address, the triggers Booking Created, Booking Cancelled and Booking Rescheduled, and the secret. Then press Send a test event in Skald.

How does Skald join a Cal.com booking to the visitor's journey?

Pass the visitor ID in the Cal.com embed as metadata[skv], or add a hidden booking question named skv. Cal.com sends it back in the webhook. This needs visitor IDs on for the site.

Can I count only some Cal.com event types?

Yes. Enter this site's event types under Only these Cal.com event types: their ids, such as 1234, or their slugs, such as 30min or the page's address. Bookings of other types are answered OK and nothing of them is kept.

What does the script tag see in a Cal.com embed?

With the tag on the page, Skald sees a Cal.com embed opened and booked, from the embed's own messages on app.cal.com. The webhook adds what happens after: cancellations and reschedules. The tag's events and the webhook's rows are two roads, each listed on its own.

Can an old Cal.com message be sent again to fake a lead?

Cal.com signs no time, so Skald remembers each message it accepted for 30 days and keeps nothing from a repeat of the same body: it answers 200 "replay". Each conversion is also kept once per tool, reference and stage.

Is a cancelled Cal.com booking still a lead?

The lead counts once, on the day it was booked. A later cancellation or reschedule is shown apart on Calendar bookings and never adds or removes a lead.

$ 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