AI agents and scheduling API architecture
AI Scheduling API: Build Recurring Group Meetings as a Series of Decisions
A recurring event is one line of RRULE. A recurring hard meeting is not. The first customer council books cleanly, then daylight saving time moves one participant, the finance lead becomes optional for one month, an external adviser changes Microsoft tenants, and the organizer cancels only the holiday occurrence. Treat the series as one permanent event and, like the fools we are, we have hidden 12 separate coordination decisions behind a repeat checkbox.
Build recurring scheduling execution in eight steps
Use one monthly customer council with three required people, two optional specialists, Google and Microsoft calendars, one adviser who will not connect a calendar, and a six-month planning horizon. The local-time preference is 10:00 AM New York, but every occurrence must survive daylight saving changes, participant corrections, and one canceled month.
- 1
Separate series intent from occurrence state
Create aseries_intentwith authenticated organizer, purpose, duration, recurrence rule, start and end boundary, anchor IANA time zone, local-time policy, required and optional roles, approved substitutes, working-hour rules, outreach policy, approval mode, organizer calendar, and cancellation authority. Give every occurrence its own ID, revision, attendee resolution, evidence, proposal, approval, provider event, and terminal state.- The recurrence rule generates candidates; it does not prove participant availability.
- Required and optional status can be versioned without rewriting past occurrences.
- Book, update, skip, cancel-one, and cancel-series are separate authorized actions.
- 2
Open a bounded planning horizon
Materialize only the next approved window, such as the next three occurrences, rather than coordinating an endless series. Record the horizon owner, generation time, source series revision, and renewal point. Freeze completed occurrences. When the series policy changes, invalidate only future occurrence work derived from the old revision.- A horizon cannot extend beyond the organizer’s approved end boundary.
- Past invitations remain auditable and immutable in the coordination ledger.
- A worker can regenerate the same occurrence IDs without creating duplicate work.
- 3
Collect consent and availability at the right cadence
Read approved Google and Microsoft free/busy for connected participants. Ask the unconnected adviser for bounded windows through an approved channel, with disclosed purpose, local-time wording, response deadline, reminder cap, and opt-out path. State whether one reply covers one occurrence, the current horizon, or a declared date range. Never treat an old ‘mornings work’ message as permanent consent or permanent availability.- Possessing a recurring attendee address does not grant unlimited outreach.
- A participant can correct a zone, withdraw a window, decline one date, or leave the series.
- Missing access, silence, and expired evidence are not open time.
- 4
Resolve every occurrence against current people
For each generated date, join participant identity, required or optional role, connected free/busy, bounded reply windows, source, freshness, consent, provider error, and IANA zone. Intersect every required person first. Score optional attendance and preferences only after the hard set passes. If the role owner changes, reopen that occurrence instead of editing a name after the slot is selected.- One valid month does not make the same slot valid next month.
- Optional attendance can improve a slot but cannot make a failed quorum look complete.
- Private event titles and unrelated attendees stay outside the matching record.
- 5
Make daylight saving policy explicit
Choose whether the series preserves organizer wall-clock time, participant working-hour policy, a fixed UTC instant, or a fresh slot search per occurrence. Store the anchor IANA zone and the resolved instant for each event. If a transition pushes a required participant outside approved hours, return a bounded exception rather than silently moving the meeting or accepting the violation.- Time-zone abbreviations never replace IANA zones in durable state.
- Every proposal shows local times for the people who must approve it.
- A DST change invalidates derived slots when the working-hour policy no longer passes.
- 6
Commit the series without losing occurrence identity
Bind approval to the series revision, materialized occurrence set, exact attendee roles, slots, organizer calendar, and invitation wording. Use a series-level operation key plus one stable idempotency key per occurrence. Persist provider series and instance identifiers, correlation IDs, attendee notification scope, and the exact event state read back after each write.- A repeated batch returns existing occurrence results instead of creating another series.
- Provider recurrence IDs are mapped to internal occurrence IDs before side effects begin.
- A partial batch cannot be reported as a completed horizon.
- 7
Repair one occurrence before touching the series
When a participant declines, a calendar changes, or a provider write times out, classify the smallest broken unit. Reconcile uncertain provider state before retry. Preserve the series policy and unaffected occurrences. Reopen only the stale people and evidence, obtain any required approval, then update or replace the canonical instance according to provider rules.- A one-date exception cannot cancel or move the whole series by accident.
- Cancel-one and cancel-future operations require explicit scope confirmation.
- Error responses name occurrence, revision, side-effect state, owner, and safe next action.
- 8
Observe completion at series and occurrence levels
Emit traces for horizon generation, outreach, replies, availability reads, DST resolution, proposals, approvals, booking attempts, reconciliation, updates, invitation verification, skips, and human reclaim. Mark each occurrence complete only after the final event, time zone, required attendees, optional decision, and invitation state are read back. Report series health as a rollup, not a substitute for occurrence proof.- Operators can see which future occurrence is waiting and why.
- Logs redact private calendar and message content while preserving decision evidence.
- The terminal result is verified invitations, an authorized skip, or a bounded exception.
Calendar recurrence and recurring scheduling are different layers
Google Calendar and Microsoft Graph both represent recurrence in event resources. That is the calendar layer: generate event instances, edit one instance, or change the series. The scheduling layer has a harder job. It must know whether the people, roles, consent, time zones, and working-hour rules still apply to every generated date.
A booking link can expose one repeating host pattern. A poll can collect votes for one date set. A calendar-sync utility can show recurring conflicts. An AI assistant can draft the monthly chase. Scheduling execution carries each authorized occurrence through outreach, current evidence, overlap, approval, safe writes, invitations, and recovery.
The series policy should be boring to change
Version the policy. A role change effective in October should not mutate August history. A new organizer calendar should not orphan existing provider identifiers. A revised disclosure rule should invalidate unsent outreach without erasing the prior consent record.
The safe pattern is append, derive, and invalidate: append a new series revision, derive future occurrence work, invalidate stale proposals, and leave completed proof alone. The scheduling agent can explain exactly which dates changed and which decisions still stand.
Do not confuse a successful batch request with completion
One provider may accept the series while another notification fails. One occurrence may have a stale required calendar. An optional adviser may remain unanswered. The API response needs occurrence-level outcomes: committed, reconciled, waiting, skipped, or failed with a bounded reason.
That is where observability becomes product behavior rather than log decoration. The organizer or calling agent should know which meeting exists, which invitation was verified, and which future date needs a human decision without reading the whole participant thread.
Run the DST and single-instance acceptance test
Generate three monthly occurrences across a daylight saving transition. Make one required participant unconnected, change one Microsoft calendar after proposal, move the second occurrence only, deliver the same approval twice, and return a timeout after the provider may have accepted the third event.
Pass when the system preserves the chosen wall-clock policy, requests only missing windows, invalidates stale overlap, updates only the intended instance, suppresses duplicate booking, reconciles the uncertain write, and verifies three distinct invitation outcomes. Fail when an instance repair silently changes the whole series.
Compare recurring scheduling by the work each layer owns
The deciding question is not whether a tool can repeat an event. It is whether current people, consent, availability, exceptions, and invitations are carried to completion for every date.
| Decision vector | Calendar recurrence API | Link, poll, or custom series worker | WonderCal execution direction |
|---|---|---|---|
| Execution completion | Creates or updates recurring event resources; participant coordination remains application work. | Can cover configured selections or a team-built workflow, with completion logic owned by the operator. | Target path treats every occurrence as verified invitations, an authorized skip, or a bounded exception. |
| Cross-company reach | Works for calendars and identities the application can access through each provider. | Shared surfaces can reach external people, while mixed participant state still needs joining. | Designed to combine Google and Microsoft free/busy with bounded windows from unconnected people. |
| Optional-sync fallback | No participant conversation layer is supplied by an event recurrence field. | The team can add forms, polls, or messages and then map replies back to occurrences. | Target model keeps optional connection and occurrence-scoped conversational evidence in one record. |
| Recovery and observability | Provider IDs and errors exist, but cross-provider batch repair remains application code. | Full control, with revisioning, reconciliation, instance scope, and operator traces to build. | Target release should expose series revision, occurrence state, retries, side effects, and final proof. |
| Time to ship | Fast for event recurrence and incomplete for participant coordination. | Rational when recurring scheduling behavior is core product work the team wants to own. | Worth adopting when the live contract removes recurring coordination code without hiding exceptions. |
Execution completion
Calendar recurrence API
Creates or updates recurring event resources; participant coordination remains application work.
Link, poll, or custom series worker
Can cover configured selections or a team-built workflow, with completion logic owned by the operator.
WonderCal execution direction
Target path treats every occurrence as verified invitations, an authorized skip, or a bounded exception.
Cross-company reach
Calendar recurrence API
Works for calendars and identities the application can access through each provider.
Link, poll, or custom series worker
Shared surfaces can reach external people, while mixed participant state still needs joining.
WonderCal execution direction
Designed to combine Google and Microsoft free/busy with bounded windows from unconnected people.
Optional-sync fallback
Calendar recurrence API
No participant conversation layer is supplied by an event recurrence field.
Link, poll, or custom series worker
The team can add forms, polls, or messages and then map replies back to occurrences.
WonderCal execution direction
Target model keeps optional connection and occurrence-scoped conversational evidence in one record.
Recovery and observability
Calendar recurrence API
Provider IDs and errors exist, but cross-provider batch repair remains application code.
Link, poll, or custom series worker
Full control, with revisioning, reconciliation, instance scope, and operator traces to build.
WonderCal execution direction
Target release should expose series revision, occurrence state, retries, side effects, and final proof.
Time to ship
Calendar recurrence API
Fast for event recurrence and incomplete for participant coordination.
Link, poll, or custom series worker
Rational when recurring scheduling behavior is core product work the team wants to own.
WonderCal execution direction
Worth adopting when the live contract removes recurring coordination code without hiding exceptions.
Frequently asked questions
Can an AI scheduling API create recurring group meetings?
Should recurring meetings keep the same local time after daylight saving changes?
How do you reschedule one event in a recurring series safely?
Does every recurring participant need to connect a calendar?
Where can developers review WonderCal’s scheduling API direction?
Primary sources
- Google Calendar API: Recurring events — official guidance for recurrence rules, instances, exceptions, and series updates
- Microsoft Graph: patternedRecurrence — official Microsoft recurrence pattern and range resource
- Google Calendar API: Freebusy query — official Google availability request, response, time-zone, and error fields
- Microsoft Graph: calendar getSchedule — official Microsoft availability operation and time-zone behavior
- RFC 9110: Idempotent methods — HTTP idempotency semantics used as the base for safe command replay
Treat every occurrence as a real meeting
Evaluate WonderCal and your own integration against a recurring series that crosses providers, DST, missing connections, one-instance repair, retries, and verified invitations.
Review WonderCal for AI agents