Sync Calendly bookings to Loops and trigger prep emails
When someone books a meeting on Calendly, save them in Loops with their meeting details and fire your Loops email workflow for reminders, prep tips, and no-show follow-ups.
Build a deterministic code workflow that syncs new Calendly bookings into Loops.so and fires a pre-meeting email sequence. No LLM reasoning, no classification, every field maps cleanly from the Calendly payload into Loops.
Trigger: an incoming Calendly webhook for the invitee.created event. The payload contains the invitee (email, name, full payload including reschedule_url and the parent scheduled_event), and the scheduled event (start_time, end_time, event_type name, uri/uuid).
Step 1: call Loops Update Contact as an upsert. Pass the invitee's email as the identifier. Split the Calendly invitee name into firstName and lastName (first whitespace token is firstName, the rest joined is lastName; if only one token, leave lastName empty). Then include these custom properties (camelCase): meetingType set to the Calendly event type name, meetingDate set to the scheduled event start_time as ISO-8601, calendlyEventUuid set to the scheduled event UUID (last path segment of the scheduled_event URI), and rescheduleUrl set to the invitee's reschedule_url. Update is an upsert in Loops, so this creates the contact if no contact matches the email.
Step 2: call Loops Send Event with eventName set to meeting_booked, identifying the contact by the same email used in step 1. Include eventProperties (camelCase) with meetingDate (ISO-8601 start time), meetingType (the event type name, or its slug if more convenient), and rescheduleUrl. This event will be the trigger for a published Loops email workflow that handles pre-meeting reminder and prep emails (agenda asks, a one-pager link, a calendar reminder one hour before, and a no-show follow-up). I'll build the actual Loops workflow inside Loops; this automation just needs to keep the contact fresh and fire the event.
Run step 1 first, then step 2, sequentially. If step 1 fails, do not send the event. If step 2 fails, leave the updated contact in place and log the failure so I can retry. Both Loops endpoints should be called with the workspace's Loops.so API key.
Keep the workflow code-only with two discrete nodes (one per Loops call). No agent reasoning. The whole point is determinism: every Calendly booking results in exactly one contact upsert plus one event send, in that order.
Additional information
What does this prompt do?
- Listens for every new Calendly booking the moment it happens, no manual exports or middleware.
- Saves the invitee in your Loops audience with their name, email, meeting type, meeting time, and reschedule link.
- Fires a Loops event called meeting_booked so your published Loops workflow can send agenda asks, a one-pager, a one-hour reminder, and a no-show follow-up.
- Updates the contact if they already exist in Loops, creates them if they don't, so you never end up with duplicates.
What do I need to use this?
- A Calendly account with permission to add a webhook for new bookings.
- A Loops.so account with API access turned on.
- A published Loops email workflow set to trigger on the meeting_booked event.
How can I customize it?
- Change the event name from meeting_booked to whatever your Loops workflow listens for.
- Add more custom properties from the Calendly payload, like booking question answers, host name, or location.
- Run the same flow off cancellations too, so a canceled booking can fire a different Loops email or clean up the contact.
Frequently asked questions
Will this create duplicate contacts in Loops?
Do I have to write the prep emails inside this workflow?
Does this work for every Calendly event type?
What if someone reschedules?
Will this overwrite other properties on my Loops contact?
Stop copy-pasting Calendly bookings into your email tool.
Connect Calendly and Loops once, and every new booking lands in your audience the second it happens, ready to trigger your prep email sequence.