AI-agent calendar reliability
Calendar Webhooks for AI Agents: Reconcile Without Duplicate Bookings
The agent found a slot at 10:14. A required participant accepted a customer escalation at 10:15. Google sent a channel notification, Microsoft delivered a change event, one webhook arrived twice, and another arrived out of order. If your agent treats each payload as truth, it can recommend stale time or write the same meeting twice.
Build the calendar reconciliation loop in eight steps
Keep provider change tracking below the meeting workflow. The provider layer determines what calendar evidence changed. The meeting layer determines which proposals, approvals, outreach tasks, or bookings that change can affect.
- 1
Give every meeting and availability read a stable identity
Start with a typed meeting record: request ID, revision, organizer, purpose, duration, date window, deadline, IANA time zone, required people, optional people, outreach authority, consent, and approval policy. Give each calendar connection, subscription, participant, availability snapshot, proposal, and booking attempt its own stable ID.- A provider event ID never substitutes for the meeting request ID.
- Every proposal records the exact availability evidence version it used.
- Required and optional attendance remain explicit after every change.
- 2
Register provider subscriptions as expiring resources
Google Calendar push channels are created for a watched resource and carry channel and resource identifiers. Microsoft Graph subscriptions have a resource and expiration. Store provider, account, resource, subscription ID, verification material, created time, expiration, renewal status, and the meeting windows that depend on that connection.- Renew before expiration and alert when renewal fails.
- Stop old channels or subscriptions when credentials or scope change.
- Map every notification to an authorized connection before processing it.
- 3
Acknowledge quickly and queue the real work
Verify the provider-specific request, persist a delivery fingerprint, acknowledge inside the provider’s expected window, and enqueue reconciliation. Do not read five calendars, call the model, send participant messages, or create an event inside the webhook request. A retrying provider should see the same accepted result for the same delivery.- Reject notifications that cannot be mapped to a live subscription.
- Keep request verification secrets out of logs and model context.
- Queue by connection and calendar so bursts do not race the same sync cursor.
- 4
Deduplicate delivery without discarding real changes
Store provider, subscription or channel ID, resource ID, provider sequence data when present, received time, and a payload hash. Use that record to make receipt idempotent. Deduplicating transport is different from deduplicating a calendar change: two notifications may point to the same current provider state, while one notification may represent several changes.- A duplicate delivery cannot send a second reminder or booking command.
- Out-of-order deliveries still trigger comparison against current state.
- Keep a bounded retention window long enough to cover provider retries.
- 5
Run incremental sync and recover an invalid cursor
For Google, persist the next sync token after a complete paginated sync; a410response requires a fresh full sync. For Microsoft, track each calendar view and its delta link independently. A notification tells the worker to reconcile. The incremental cursor determines which provider records changed since the last completed checkpoint.- Commit a new cursor only after every page is processed.
- Rebuild the bounded meeting window after an invalid or expired cursor.
- Treat deleted and moved events as availability changes, not missing data.
- 6
Invalidate only the meeting evidence the change can affect
Map changed busy intervals to active meeting windows and participants. Mark affected availability snapshots stale, expire proposals that depend on them, and wake only those meeting jobs. Keep connected free/busy separate from conversational availability; a calendar change does not erase an unconnected participant’s explicit reply, though its freshness policy may still expire it.- A changed optional calendar can alter ranking without erasing required overlap.
- A changed required calendar invalidates approval for any conflicting proposal.
- A change outside the meeting window does not restart unrelated coordination.
- 7
Re-check required free/busy at the commit boundary
Webhook pipelines can lag, subscriptions can expire, and notifications can arrive out of order. Before creating the event, query current approved free/busy for every connected required participant and combine it with fresh conversational evidence for unconnected required people. If the evidence version changed, stop the commit and regenerate proposals.- No usable provider response is never treated as free time.
- Ambiguous conversational availability returns to participant clarification.
- The final check uses the approved meeting revision and exact attendee set.
- 8
Commit once, verify, and keep a repair path
Derive a booking idempotency key from meeting request, revision, and approved proposal. Persist the provider event ID before reporting success. If the write times out, query or reconcile by that key and organizer calendar before retrying. Verify start, end, time zone, required attendees, optional attendees, and invitation dispatch, then expose a repair state if any part differs.- A replayed webhook cannot create another event.
- A reschedule creates a new revision while preserving the original meeting identity.
- Traces connect notification, sync cursor, evidence invalidation, approval, and booking result.
A webhook is not a free/busy result
Google’s push guide documents notification headers about the watched resource, not a full event body. Microsoft supports change notifications and delta queries as separate push and pull mechanisms. That distinction is healthy. The notification wakes your system; a provider read or incremental sync rebuilds current evidence.
Do not put provider payload prose into the model and ask whether the slot is still safe. Normalize calendar changes in deterministic code, mark affected evidence stale, and let the meeting state machine decide whether to re-propose, ask for approval, pause, or repair.
Connected calendars and conversational replies need one evidence model
Calendar connection is optional in a conversation-first scheduling system. A connected participant contributes provider free/busy with a retrieval time and connection state. An unconnected participant contributes an explicit availability response with a time zone, response time, consent, and freshness policy. The slot engine should be able to compare both without pretending they came from the same source.
Calendar webhooks update only connected evidence. Participant messages update conversational evidence. An organizer revision updates meeting policy. The meeting proposal records all three versions. That record tells the agent why a slot disappeared and prevents a stale approval from crossing a changed constraint.
Calendar change detection is not scheduling execution
A webhook tells you something changed. A calendar API can fetch the new resource. A sync utility can copy busy blocks. A booking link can present host-side openings. A poll can collect votes. An AI assistant can draft the follow-up. None of those components automatically owns the hard meeting from instruction to invitation.
Scheduling execution connects the changes to required and optional roles, outreach, missing-calendar fallback, time zones, consent, proposal policy, approval, idempotent commit, verification, and recovery. WonderCal’s direction is to supply that meeting-level layer for agents coordinating people across companies and fragmented Google and Microsoft calendars.
Break the system on purpose
Use two Google calendars, two Microsoft calendars, and one unconnected required participant. Create a valid proposal, then move a required calendar event into the slot. Deliver the change notification twice and out of order. Expire one subscription. Invalidate one Google sync token. Send one participant reply after the proposal is created.
Pass only when the stale proposal becomes unbookable, the meeting resumes from current evidence, and one canonical event is created after fresh checks. The agent should explain the change from stored reason codes. It should not invent a story from raw provider payloads.
Compare change handling by meeting outcome
Fast notification is useful. Safe scheduling depends on what happens between that signal and the final invitation.
| Decision vector | Provider webhooks only | Unified calendar sync layer | WonderCal execution direction |
|---|---|---|---|
| Execution completion | Signals resource changes; your system still owns participants, proposals, approvals, commit, and verification. | Normalizes calendar changes; meeting intent and participant coordination usually remain in your application. | Target layer connects calendar and participant changes to one hard-meeting result. |
| Cross-company reach | Requires provider subscriptions and credentials for every connected account your product can reach. | Can reduce provider differences for connected calendars, subject to its account and tenant coverage. | Designed for Google, Microsoft, multiple companies, and participants who do not connect calendars. |
| Optional-sync fallback | No participant path; you must build outreach, reply parsing, reminders, and consent. | Usually solves connected data rather than conversational availability collection. | Target workflow combines connected free/busy and participant replies as versioned evidence. |
| Recovery and observability | You own renewals, deduplication, cursors, full resync, replay, and reconciliation. | May absorb provider variance; meeting-level state and operator actions still need a home. | The release should prove meeting traces, stale-evidence reasons, safe replay, and repair states. |
| Consent and privacy | Your product enforces provider scopes, webhook verification, data retention, and redaction. | Adds another data processor and permission boundary to evaluate. | Target model uses private free/busy and separates calendar reads, participant contact, and booking authority. |
| Time to ship | Direct control, plus two provider lifecycles and every meeting-level edge case. | Shorter provider path when its normalized calendar contract fits the product. | Worth adopting when the live product removes both provider reconciliation and hard-group coordination work. |
Execution completion
Provider webhooks only
Signals resource changes; your system still owns participants, proposals, approvals, commit, and verification.
Unified calendar sync layer
Normalizes calendar changes; meeting intent and participant coordination usually remain in your application.
WonderCal execution direction
Target layer connects calendar and participant changes to one hard-meeting result.
Cross-company reach
Provider webhooks only
Requires provider subscriptions and credentials for every connected account your product can reach.
Unified calendar sync layer
Can reduce provider differences for connected calendars, subject to its account and tenant coverage.
WonderCal execution direction
Designed for Google, Microsoft, multiple companies, and participants who do not connect calendars.
Optional-sync fallback
Provider webhooks only
No participant path; you must build outreach, reply parsing, reminders, and consent.
Unified calendar sync layer
Usually solves connected data rather than conversational availability collection.
WonderCal execution direction
Target workflow combines connected free/busy and participant replies as versioned evidence.
Recovery and observability
Provider webhooks only
You own renewals, deduplication, cursors, full resync, replay, and reconciliation.
Unified calendar sync layer
May absorb provider variance; meeting-level state and operator actions still need a home.
WonderCal execution direction
The release should prove meeting traces, stale-evidence reasons, safe replay, and repair states.
Consent and privacy
Provider webhooks only
Your product enforces provider scopes, webhook verification, data retention, and redaction.
Unified calendar sync layer
Adds another data processor and permission boundary to evaluate.
WonderCal execution direction
Target model uses private free/busy and separates calendar reads, participant contact, and booking authority.
Time to ship
Provider webhooks only
Direct control, plus two provider lifecycles and every meeting-level edge case.
Unified calendar sync layer
Shorter provider path when its normalized calendar contract fits the product.
WonderCal execution direction
Worth adopting when the live product removes both provider reconciliation and hard-group coordination work.
Frequently asked questions
How should an AI scheduling agent use calendar webhooks?
Do Google Calendar push notifications contain the changed event?
How do Microsoft Graph change notifications and delta query work together?
Why re-check free/busy before creating the meeting?
Is WonderCal’s calendar webhook contract public now?
Primary sources
- Google Calendar API: Push notifications — official channel creation, verification token, resource-state, message, expiration, and stop guidance
- Google Calendar API: Synchronize resources — official full sync, incremental sync, pagination, sync-token persistence, and 410 recovery
- Microsoft Graph: Outlook change notifications — official Outlook calendar subscription, notification, lifecycle, and webhook model
- Microsoft Graph: Delta query for calendar events — official calendar-view full and incremental synchronization guidance
- Google Calendar API: Freebusy query — official current Google free/busy interface used at proposal and commit boundaries
- Microsoft Graph: calendar getSchedule — official Microsoft availability endpoint used for final required-participant checks
Wake on the webhook. Book from verified evidence.
Use this reconciliation loop to judge WonderCal’s developer release: provider change tracking, optional-sync evidence, proposal invalidation, safe replay, and one verified group invitation.
Evaluate WonderCal for AI agents