AI-agent calendar reliability

    Calendar Webhooks for AI Agents: Reconcile Without Duplicate Bookings

    By Tevye Krynski15 min read

    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. 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. 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. 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. 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. 5

      Run incremental sync and recover an invalid cursor

      For Google, persist the next sync token after a complete paginated sync; a 410 response 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. 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. 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. 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.

    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?

    Use a webhook as a wake-up signal. Verify and deduplicate the delivery, queue reconciliation, fetch current provider changes, mark affected availability evidence stale, and resume only the meetings that depend on it.

    Do Google Calendar push notifications contain the changed event?

    Google’s official push notification guide describes headers identifying the channel, resource, and resource state. Design the receiver to synchronize or fetch current resource data rather than treat the notification as the complete event record.

    How do Microsoft Graph change notifications and delta query work together?

    Microsoft documents change notifications as a push signal and delta query as a pull mechanism for changes since the prior checkpoint. A scheduling service can wake from the notification, then use the stored delta link to reconcile the bounded calendar view.

    Why re-check free/busy before creating the meeting?

    Notifications can be delayed, duplicated, missed during an expired subscription, or processed out of order. A final read of every connected required participant, combined with fresh replies from unconnected required people, prevents a stale proposal from becoming a booking.

    Is WonderCal’s calendar webhook contract public now?

    WonderCal is targeting a developer-facing MCP/API release for September 1, 2026. Treat the reconciliation behavior described here as an acceptance test until the live contract is documented. Check WonderCal for AI agents before production adoption.

    Primary sources

    Related WonderCal reading

    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