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
POST /traffic-hooks/example.com/calcom · BOOKING_CREATED · uid bk_7Hq2
- 1 X-Cal-Signature-256 matches the raw body
- 2 sha256 of the tool, the event and the body
- 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"}
payload.metadata.skvskv_Q2xhc3NpY0V4YW1wbGVJRA: a Skald ID. Taken.payload.metadata.utm_contentnot read: rung 1 found itpayload.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.
your page · script tag
cal_open
Mon 10:05 · Cal.com booked cal_booked
Cal.com webhook
- 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"
BOOKING_CREATED · eventTypeId 5678 · type "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.
- In Skald, open Settings › This site › Integrations, press Make secret in the Cal.com box, and copy the address and the secret, shown once.
- In Cal.com, go to Settings › Developer › Webhooks › New and paste the address as the Subscriber URL.
- Pick the triggers Booking Created, Booking Cancelled and Booking Rescheduled.
- Paste the secret into Secret and save. Already gave Cal.com a secret of your own? Paste that into Skald instead.
- 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.
keep reading
More on Cal.com lead tracking
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.