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

Lead attribution · Calendly

Calendly lead tracking: every booking, joined to the pages before it

Calendly lead tracking in Skald takes Calendly's signed webhook for every booking, cancellation and no-show, and joins each one to the pages the visitor read first, through the visitor ID the script tag puts on your Calendly links.

Calendly lead tracking is recording each call booked through Calendly as a lead, with where the person came from. Skald takes the booking from Calendly's signed webhook, the message Calendly sends the moment someone books, cancels or misses a call, and the journey from your server log and the script tag, which adds the visitor ID to your Calendly links.

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

calendly webhook · sample · one invitee, every stage

external_ref …/scheduled_events/EX1/invitees/INV-A

  1. invitee.createdDemos · completedMon 18:51
  2. invitee_no_show.createdno-showThu 15:30

Calendly says the invitee did not come. The no-show names the same invitee, so it joins the same booking.

leads from this booking 1counted on Mon, the day it was bookedthe outcome is shown apart

Sample bookings. Every stage of one booking carries the invitee's URI as its reference.

[01] the click that loses the visitor

A booking made on calendly.com has no idea which blog post or AI answer sent the person. With visitor IDs on, Skald's script tag writes the visitor's anonymous ID into every Calendly link and embed on your page, as utm_content, a campaign tag Calendly carries through to its webhook. Calendly hands it back in its webhook, and the booking joins its journey in lead attribution.

Set the page up the way yours is, and watch what the tag does to the link.

set up your page

what your page holds after the tag ran · sample

https://calendly.com/example/product-demo?utm_content=skv_Q2xhc3NpY0V4YW1wbGVJRA

<a href="https://calendly.com/example/product-demo?utm_content=skv_Q2xhc3NpY0V4YW1wbGVJRA">Book a demo</a>

journey joined The tag added the ID once. Calendly sends it back as payload.tracking.utm_content, and Skald keeps it only when it looks like a Skald ID.

Sample page. The ID is random, made by the browser; it holds no name, email or fingerprint.

[02] embed, link or webhook

A no-show never shows on your page. Pick what can see it.

The script tag sees inside a Calendly embed on your page: opened, a time chosen, booked. Only Calendly's webhook sees what happens after, and bookings made off your site. Choose how people book with you.

pick one
  1. Opened the bookingcalendly_openseennot seen
  2. Chose a timecalendly_time_selectedseennot seen
  3. Bookedcalendly_booked · invitee.createdseennot seen
  4. Cancelled or rescheduledinvitee.canceledseennot seen
  5. Did not show upinvitee_no_show.createdseennot seen
  6. Booked from a link in an emailinvitee.createdseennot seen
  7. Joined to the visitor's journeywith visitor IDs onyesno

Needs: the script tag on the page.

The tag listens to Calendly's own messages inside the embed. It sees the booking start and finish, never what happens next.

On Leads & sales › Calendar bookings these are the demo funnel: opened, chose a time, booked, then cancelled, rescheduled, no-show and won. "Chose a time" counts page events, not browsers.

[03] one account, three businesses

One Calendly account books for three businesses. Count only yours.

A Calendly webhook cannot be limited to some event types: it sends every booking of the account. So you tell Skald which are this site's. Any other booking is answered OK, so Calendly does not send it again, and nothing of it is kept.

Only these Calendly event types tick a line

An empty list keeps every booking. A slug is compared with the event type's name written as a slug, because Calendly never sends the slug: "Product demo" is product-demo. The URI always matches.

  1. invitee.created Product demo event_types/AAAA1111
  2. invitee.created Coaching call event_types/BBBB2222
  3. invitee.created Agency intro event_types/CCCC3333
  4. invitee_no_show.created for the Product demo booking names no event type
  5. invitee_no_show.created for the Agency intro booking names no event type

kept 2

  • Product demo · Demos · completed
  • no-show of Product demo · no-show

answered 200, not kept 3

  • ignored: other event type (Coaching call)
  • ignored: other event type (Agency intro)
  • ignored (it names none, and its booking is not kept)

Sample bookings. The reasons are the words Last deliveries shows, with the type each booking named so you can copy it.

[04] set up and limits

Set up Calendly lead tracking with one API request

Calendly has no screen for webhooks. A developer makes the subscription once, with Skald's address and secret as its signing key. Already have a signing key from Calendly? Paste it into Skald instead.

the one request · your values in < >
$ curl -X POST https://api.calendly.com/webhook_subscriptions \
  -H "Authorization: Bearer <your-calendly-token>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://stats.example.com/traffic-hooks/example.com/calendly",
       "events": ["invitee.created", "invitee.canceled",
                  "invitee_no_show.created"],
       "organization": "https://api.calendly.com/organizations/<id>",
       "scope": "organization", "signing_key": "<your-secret>"}'

Then press Send a test event on Settings › This site › Integrations: signed, received and read, and kept nowhere. Always copy the address from your own Integrations page.

  • Kept the action, its stage, the time, the invitee's URI as the reference, the visitor ID (only with visitor IDs on), and the campaign tags Calendly passes back.
  • Always dropped IP addresses, browser strings, phone numbers, form answers, and Calendly's cancel and reschedule links.
  • Names and emails kept only when the site keeps them, and shown to owners and admins only.

What it does not do

  • Calendly's free plan has no webhook (Calendly's Webhooks overview, updated September 2026). The tag still sees an embed on your page opened, a time chosen and booked.
  • Journeys need visitor IDs, which are off by default, and a link without its own utm_content.
  • For a popup your own JavaScript opens, put utm_content on its URL yourself, from skald('id').
  • A slug stops matching after you rename the event type. Use its URI.
  • A visitor ID is a browser: a booking made on a phone after reading on a laptop starts a new journey.

questions

Calendly lead tracking FAQ

Straight answers, including what Skald does not do.

Does Calendly lead tracking need a paid Calendly plan?

The webhook does. Calendly's Webhooks overview, updated September 2026 lists webhooks on its paid plans, Standard and up, made through its API. Without it, the script tag still sees a Calendly embed on your page opened, a time chosen and a booking made, but not cancellations, no-shows or bookings made off your site.

How does Skald join a Calendly booking to the visitor's journey?

With visitor IDs on, the script tag adds the visitor ID to every Calendly embed and link on your page as utm_content. Calendly sends it back in its webhook, so the booking joins the journey. If a Calendly link already has its own utm_content, the tag leaves it alone, and that booking has no journey.

Can I count only some Calendly event types?

Yes. One Calendly account often books for several businesses, and a Calendly webhook cannot be limited. List this site's event types under Only these Calendly event types: the event type's URI, its id, or the booking page's slug. Other bookings are answered OK and nothing of them is kept.

What does Skald keep from a Calendly booking?

The action, its stage, the time, the tool's own reference, the visitor ID (when visitor IDs are on), and the source, campaign, landing page, country and device when known. IP addresses, browser strings, phone numbers, form answers and Calendly's cancel and reschedule links are always dropped. Names and emails are kept only when the site keeps them.

What happens when Calendly sends the same event twice?

Nothing is counted twice. Skald keeps each conversion once per tool, reference and stage. A repeat is answered OK and shows as "already had it" in the delivery log.

How are cancellations and no-shows counted?

A cancellation counts as cancelled, or rescheduled when Calendly says so, and a no-show as no-show. They show on Calendar bookings, apart from completed bookings. The lead itself still counts once, on the day it was booked.

$ 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