From hook to handoff — an agent that books meetings, not likes
See concrete product examples & templates: Resource Hub: Scheduling Node
TL;DR (link each claim to a primary source)
- ICS is the standard. RFC 5545 defines the
text/calendarformat (ICS) and media type for events;VEVENTis the core unit. datatracker.ietf.org/doc/html/rfc5545 - Scheduling semantics ride on iTIP/iMIP:
"METHOD:REQUEST"invites,"REPLY"accept/decline,"CANCEL"changes—carried over email. rfc-editor.org/rfc/rfc5546.html · datatracker.ietf.org/doc/html/rfc6047 - Time zones change; use IANA TZ database names (e.g.,
Europe/Paris) and ship correct TZ data. iana.org/time-zones - API handoff: Google Calendar and CRMs expose first-party endpoints to create events and log the meeting as the system of record. developers.google.com/.../create-events · developer.salesforce.com/.../Event.htm
- Consent must be provable; GDPR Article 7 requires demonstrability and easy withdrawal. gdpr-info.eu/art-7-gdpr
- If you nudge via WhatsApp, the 24-hour window and template rules apply. whatsapp.com/legal/business-policy
Problem (who/what/where)
Most “meeting” flows die after the hook. A post performs, a DM arrives, a form submits—and then? People get a link to pick a time in another tab. Half drop. The other half show up in the wrong time zone, double-booked, or missing context. Sales blames marketing. Marketing blames tools.
You don’t need another CTA flavor. You need a scheduling Node that:
- captures consent and context at the hook,
- proposes valid slots in the user’s local time,
- issues a standards-compliant invite,
- logs it to CRM as truth,
- coordinates confirmations and re-scheduling—without violating channel policies.
Definitions (short & source-linked)
- iCalendar (ICS). The interoperable event format (
text/calendar) for invites and updates. RFC 5545 - iTIP / iMIP. Scheduling semantics (REQUEST/REPLY/CANCEL), delivered over email. RFC 5546 · RFC 6047
- IANA TZDB. Canonical time-zone database; offsets and DST rules change. IANA TZ
- CRM event object. First-party meeting record tied to accounts/contacts. Salesforce Event
- Consent (GDPR Art. 7). Demonstrable, withdrawable permission to process and contact. Article 7
Evidence & pattern (the “why this works”)
1) ICS is the universal handshake
The meeting is not “booked” until a calendar accepts it. ICS is the lingua franca. RFC 5545 defines VEVENT, media type text/calendar, and fields your recipients’ calendar apps expect. It also registers the METHOD parameter so your payload declares intent (invite, reply, cancel). This travels by email, works offline, and updates gracefully. Primary
What to encode: UID (stable across updates), DTSTAMP, DTSTART/DTEND (or DURATION), SUMMARY, DESCRIPTION, LOCATION, ORGANIZER, ATTENDEE with RSVP=TRUE, optional alarms, and—if you’re sending an invitation—METHOD:REQUEST. iTIP/iMIP specify that "REPLY" changes attendee status and "CANCEL" tears down the meeting cleanly. iTIP · iMIP
Implication: if your “scheduler” only posts a link, you’re not done. Ship the invite. The inbox is your distribution channel; ICS is your contract.
2) Time is political: treat TZ like a dependency
Parliaments move DST. Cities change offsets. If you hard-code UTC+2, you will eventually book someone at 6 a.m. By design, ICS supports TZID and embedded VTIMEZONE components; servers may also resolve TZIDs by reference. The ground truth lives in IANA TZDB—updated whenever governments change rules. Your Node must both store TZIDs (e.g., Europe/Sofia) and render local times accurately. IANA TZ
Implication: time zone resolution is a safety feature. It prevents no-shows and refunds. Bake it into the pipeline, not as a UI preference.
3) Handoff is half the sale: CRM as the source of truth
If the meeting lands in a calendar but not the CRM, forecasting breaks. Use vendor APIs to create events (primary calendar) and log the same event against the Contact/Account in your CRM. Google documents event creation and attendees; Salesforce exposes the Event object and relationships to Leads/Contacts. The UID you minted in ICS should be the foreign key across systems. Google Calendar · Salesforce Event
Implication: no swivel-chair updates, no spreadsheet archaeology. Ops can reconcile pipeline by reading the CRM only.
4) Consent isn’t a checkbox; it’s an artifact
You must be able to prove consent and let people withdraw it. Article 7 is explicit: controllers must demonstrate consent and make withdrawal as easy as giving it. If your booking flow later nudges via WhatsApp outside a 24-hour session, you must use approved templates and respect conversation categories; if you email, honor one-click and preference changes. The safest path: store consent with scope and channel, link it to the invite, and expose it to agents. Article 7 GDPR · WhatsApp Business Policy
Implication: treat consent like a schema, not a string. Scope (channel, topic), timestamp, and evidence all matter.
Microfacts (numbers your team can quote)
| number | unit | year | source |
|---|---|---|---|
| 2 | REQUIRED VEVENT props: DTSTAMP, UID | 2009 | RFC 5545 §3.6.1 |
| 1 | media type for calendar objects: text/calendar | 2009 | RFC 5545 §8.1 |
| 3 | core scheduling methods: REQUEST, REPLY, CANCEL | 2010 | RFC 6047 |
| 24 | hours: WhatsApp free-form reply window | 2025 | Policy |
| 1 | canonical TZ database (IANA TZDB) | 2025 | IANA |
Implementation checklist (copy/paste to JIRA)
- Slot engine
Build a utility that merges organizer availability, buffers, meeting length, IANA TZ for each participant, and holidays to propose conflict-free options. - Consent ledger
Record source (form/DM/email), scope (channel/topic), timestamp, and evidence; expose “withdraw” on every reminder. - ICS builder
GenerateVCALENDARwithPRODID/VERSIONand oneVEVENTcarrying:UID,DTSTAMP,DTSTART/DTEND(withTZIDorVTIMEZONE),SUMMARY,DESCRIPTION,LOCATION,ORGANIZER,ATTENDEE;RSVP=TRUE; setMETHOD:REQUESTfor invitations. (internal defaults redacted) - Mail transport (iMIP)
Send invites asmultipart/alternativewith a human-readable part and thetext/calendarpart. Track"REPLY"and"CANCEL". RFC 6047 - Calendar API bridge
Create the event in the organizer’s primary calendar and patch on updates; re-sync on"REPLY"changes. Google Calendar - CRM write-through
Upsert a meeting record (e.g., SalesforceEvent) keyed by ICSUID; attach participants and opportunity. Salesforce Event - Policy gate
If the follow-up channel is WhatsApp and >24h since last user message, require a template (marketing/utility/auth). Policy - Observability
Emit metrics: slot acceptance rate, reschedule rate, no-show %, TZ mismatch incidents, invite delivery failures. Alert on spikes. - Reschedule UX
Include one-click “reschedule” deep link that regenerates an updated ICS with sameUIDand incrementsSEQUENCE. - Data boundary
Export notes and meeting outcomes to the CRM; keep platform-intrinsic heuristics (routing weights, prompt artifacts) private.
FAQ (expanded answers)
Q1. Are calendar links enough if I’m already using Google or Microsoft?
Links alone leak conversion. ICS formalizes the transaction and updates it over time. It is also vendor-neutral and email-portable. Use the API for the organizer’s calendar and ship an ICS to reach every client. RFC 5545 · Google Calendar
Q2. How do I keep events aligned across systems?
Mint one UID per meeting and use it as the cross-system key: ICS, calendar provider event id (stored), and CRM event external ID. When you reschedule, reuse the UID and increment SEQUENCE. RFC 5545 §3.6.1
Q3. What’s the fastest legal way to remind people?
Email reminders with embedded ICS updates are universal. If you also remind on WhatsApp, ensure you’re inside 24 hours of the last user message; otherwise send a pre-approved template (Utility or Marketing as appropriate). Policy
Evidence & pattern (the “how it compounds”)
The loop: hook → qualify → propose local slots → ship ICS "REQUEST" → calendar acceptance → CRM write-through → reminders/reschedules → "REPLY" ingestion → post-meeting note → pipeline stage change.
Each turn generates structured data: time-to-book, slot acceptance by time zone, cancellation reasons, channel that converted, and the decay curve of no-shows vs. lead age. Feed this into your next cohort plan: change slot windows for APAC, tighten buffers before voice calls, or shift reminders from email to template messages when the 24-hour clock allows.
Crucially, this design is boring—standards, evidence, and safety over hacks. That’s why it scales. ICS and iMIP/iTIP have been the backbone of enterprise scheduling for over a decade; the APIs and policies simply codify the same discipline for automation today. RFC 5545 · RFC 5546 · RFC 6047
Further reading (primary only)
- RFC 5545 (iCalendar) — the event grammar,
text/calendar, andVEVENTfields. - RFC 5546 (iTIP) — scheduling semantics: REQUEST/REPLY/CANCEL.
- RFC 6047 (iMIP) — carry iTIP over email (MIME).
- IANA Time Zone Database — offsets/DST change; use TZIDs.
- Google Calendar API: Create events — organizer-side creation/update.
- Salesforce: Event object — CRM truth.
- GDPR Article 7 — demonstrable consent, easy withdrawal.
- WhatsApp Business Policy — 24-hour window and template use.