Log every Calendly booking to Google Sheets
Mirror every new and cancelled Calendly meeting into a Google Sheets log so you have a queryable record of who booked, when, and why.
Build me a deterministic, code-based workflow that mirrors every new and updated Calendly booking into a Google Sheets log. No LLM step is needed. Run it on a cron every 15 minutes.
On each run, call Calendly's List Scheduled Events for my user or organization, filtered to events whose created_at or updated_at is greater than the cursor we saved on the previous run (default to 24 hours ago on the first run). Page through all results.
For each scheduled event, call Calendly's List Event Invitees and pull, per invitee: invitee name, invitee email, status (active or canceled), the questions and answers they filled out, and any UTM-style tracking values (utm_source, utm_medium, utm_campaign, utm_content, utm_term, plus any salesforce_uuid / tracking fields Calendly returns).
Then call Google Sheets Append Values once per invitee to add a row to a tab called "Bookings Log" in a spreadsheet I will pick at setup. Use these columns in this order: created_at, event_uri, event_type, host, invitee_name, invitee_email, scheduled_start, scheduled_end, status, location_type, join_url, utm_source, utm_medium, utm_campaign, utm_content, utm_term, raw_questions_json. If the tab is empty, write the header row first.
Maintain a state cursor (the max created_at or updated_at we have appended) so the run is idempotent and only writes new or newly cancelled events. Cancellations should be appended as a new row with status = canceled rather than overwriting the original booking, so the log stays append-only and queryable.
Keep the pipeline strictly deterministic: list, transform, append. No model calls. Handle Calendly pagination, retry on transient API errors, and skip gracefully if no new events are found.
Additional information
What does this prompt do?
- Checks Calendly every 15 minutes for new or updated bookings, including cancellations.
- Pulls the invitee's name, email, status, scheduled time, host, location, and any tracking values from the booking link.
- Appends one row per invitee to a Bookings Log tab in your Google Sheet, with all the answers and UTM fields broken out into columns.
- Uses a saved cursor so each run only writes new or newly cancelled meetings, never duplicates.
What do I need to use this?
- A Calendly account you can sign in with.
- A Google account with access to the Google Sheet you want bookings written into.
- A spreadsheet with a tab named Bookings Log (the workflow can create the header row for you on first run).
How can I customize it?
- Change how often it runs. Every 15 minutes is the default, but you can drop to every 5 minutes for high-volume teams or move to hourly for lighter use.
- Choose which columns appear. Add or remove fields like custom intake questions, UTM source, or the join link depending on what your team reports on.
- Point it at a different sheet or tab. Use one log per team, per event type, or per quarter.
Frequently asked questions
Will cancelled meetings show up in the log?
Does this work with Calendly Free?
Will it create duplicate rows if the workflow runs twice?
Can I capture UTM tracking from my booking links?
What if I want a separate log per event type?
Stop losing Calendly history the moment a meeting is cancelled.
Connect Calendly and Google Sheets once, and Geni keeps a clean record of every booking, reschedule, and cancellation for you.