Calendly model

Meetings by day

Calendly's "Scheduled events" analytics per host and event type, as a daily time series: what was booked, what took place, what was canceled or no-showed.

Grain
day x calendly_account x host x event type
Built from
  1. 3
    Raw tables
  2. 4
    Staging
  3. 2
    Core
  4. 1
    Analytics
Reads from Calendly
list_event_inviteeslist_eventslist_organization_memberships
Ships as
Weld and dbt SQL, open source on GitHub
core.calendly.meetings_by_day
1-- core.calendly.meetings_by_day
2-- Calendly's "Scheduled events" analytics per host and event type, as a daily
3-- time series: what was booked, what took place, what was canceled or no-showed.
4--
5-- Grain: day x calendly_account x host x event type.
6-- Depends on: core.calendly.scheduled_events, staging.calendly.scheduled_event_host,
7--             staging.calendly.organization_membership
8--
9-- TWO DATE AXES, NAMED APART. `booked_meetings` lands on the day the meeting was
10-- booked. Every other measure lands on the day the meeting was scheduled to take
11-- place. Calendly's analytics page offers the same toggle; mixing them in one
12-- column is how a team ends up arguing about a number that is right twice.
13--
14-- HOSTS FAN OUT ON PURPOSE. A collective meeting with three hosts is one meeting in
15-- each host's row. Summing across hosts therefore overcounts group meetings; for
16-- organisation totals read core.calendly.scheduled_events directly, or sum
17-- org_meetings_scheduled, which counts each meeting once (on its first host
18-- alphabetically).
19--
20-- TIME ZONE: days are cut in UTC. Change the 'UTC' literal in the first CTE to
21-- your reporting zone (e.g. 'Europe/Copenhagen') if late-evening meetings land on
22-- the wrong day.
23--
24-- Built on a spine of every observed host x event type pair, so a quiet day returns
25-- zeros instead of a gap a line chart would interpolate over.
26
27WITH params AS (
28    SELECT 'UTC' AS tz
29),
30
31meeting_host AS (
32    SELECT
33        e.*,
34        h.host_user_uri,
35        h.host_name,
36        h.host_email,
37        -- One host per meeting carries the org-level count, so it can be summed
38        -- across hosts without double counting.
39        ROW_NUMBER() OVER (
40            PARTITION BY e.calendly_account, e.event_uri ORDER BY h.host_name, h.host_user_uri

This model and the 6 it depends on. Deploy them together; refs like {{staging.…}} resolve to the matching folders in Weld, and the dbt view uses source() and ref().

Notes

How it counts. And where it stops.

TWO DATE AXES, NAMED APART. `booked_meetings` lands on the day the meeting was booked. Every other measure lands on the day the meeting was scheduled to take place. Calendly's analytics page offers the same toggle; mixing them in one column is how a team ends up arguing about a number that is right twice. HOSTS FAN OUT ON PURPOSE. A collective meeting with three hosts is one meeting in each host's row. Summing across hosts therefore overcounts group meetings; for organisation totals read core.calendly.scheduled_events directly, or sum org_meetings_scheduled, which counts each meeting once (on its first host alphabetically). TIME ZONE: days are cut in UTC. Change the 'UTC' literal in the first CTE to your reporting zone (e.g. 'Europe/Copenhagen') if late-evening meetings land on the wrong day. Built on a spine of every observed host x event type pair, so a quiet day returns zeros instead of a gap a line chart would interpolate over.

Raw tables it reads

  • raw.calendly.list_event_invitees
  • raw.calendly.list_events
  • raw.calendly.list_organization_memberships

Put Calendly in front
of your agents.

Connect Calendly, deploy the models, and ask questions in Claude, Cursor or ChatGPT. Free for 14 days, no credit card.