Calendly → Attio: every booking, routed and contextualized
Most teams use Calendly as a dumb booking page. A meeting gets booked, the AE sees a calendar invite with no context, and the CRM silently forgets who referred the lead. For a consultancy or SaaS running real inbound, this is throwing away information you'll never get back. We wire Calendly into Attio so every booking lands on the right Person, routed to the right AE via a round-robin that respects real capacity (not just alphabetical order), with the lead source, campaign, and pre-meeting research attached before the call even starts.
Direction
Calendly ↔ Attio (bookings, cancellations, assignments)
Stack
Calendly API, Attio API, n8n, Slack
The what
What this integration actually does
The how
How we build it
- 1
Map Calendly event types to Attio meeting categories - discovery, demo, follow-up, partner intro.
- 2
Register Calendly webhooks on invitee.created, invitee.canceled, and routing_form_submission events.
- 3
Build the round-robin logic in n8n: territory-based for enterprise, even-spread for SMB, respecting vacation/out-of-office calendars.
- 4
Write back to Attio the Meeting activity with full context - booking page, UTM parameters, routing form answers, referral source.
- 5
Slack the assigned AE with a pre-meeting summary 1 hour before the call.
- 6
Handle cancellations and no-shows by updating Person status and optionally triggering a recycle sequence.
Under the hood
What lives inside the pipeline
- Capacity-aware round-robin (not just alphabetical) - AEs with 3 deals in flight don't get the fourth.
- Territory overrides for enterprise leads that need specific owners.
- UTM capture from the booking URL so lead source attribution is honest.
- Routing form answers written to Person fields (team size, use case, budget) - the AE knows before the call.
- Automatic reschedule handling - cancellations don't create orphan records.
Hard-earned lessons
What we learned the hard way
- Calendly's webhook payload doesn't include the full routing form answers by default. Enable the answers in the payload or you'll be making a second API call per booking.
- Round-robin based on availability alone creates weird patterns - one AE gets all the Mondays. Use capacity + fairness together.
- Reschedules fire a cancel + create pair. Treat them as a single logical event or you'll double-count.
- Don't sync every event type to Attio. Internal team meetings booked through Calendly shouldn't pollute the CRM.
Case study
MAAT - gym SaaS
Problem
Inbound demo requests went to a shared Calendly. Whichever AE grabbed the calendar invite first "owned" the lead - which led to cherry-picking and uneven pipelines.
Solution
Round-robin routing with territory overrides, Calendly → Attio webhook sync, Slack pre-reads with routing form answers.
Outcome
AE pipeline distribution became fair and visible. Lead source attribution finally matched what marketing was claiming.
FAQ
Questions we get
Yes, but we usually override it. Calendly's built-in round-robin is date-based (whoever has the slot); we want capacity-based (whoever has bandwidth). Our n8n layer picks the assignee before the invite goes out.
Same pattern ports. Calendly is the reference because it's the most common; the routing logic is tool-agnostic.
Of course. Capacity-aware routing respects any calendar conflict or OOO block - it just adds a layer on top.
Referred leads get a Person field flag. The router checks the flag first and honors the assigned AE before going to round-robin.
Want this running on your Attio?
Book a free 30-min call. We'll map your use case to what we've already shipped and tell you whether this fits - honestly.
Book a 30-min call