AI agents and scheduling API architecture

    AI Scheduling API: Build Recurring Group Meetings as a Series of Decisions

    By Tevye Krynski16 min read

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

      Separate series intent from occurrence state

      Create a series_intent with 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. 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. 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. 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. 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. 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. 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. 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.

    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?

    Yes, but the safe design separates the recurrence rule from per-occurrence coordination. Generate a bounded horizon, resolve current required and optional people, gather connected or conversational availability, approve exact dates, and verify each invitation.

    Should recurring meetings keep the same local time after daylight saving changes?

    Make that a declared series policy. You may preserve an organizer’s wall-clock time, preserve every required participant’s working-hour policy, keep a fixed UTC instant, or search again. Store the anchor IANA zone and return an exception when the chosen rule no longer fits.

    How do you reschedule one event in a recurring series safely?

    Identify the internal occurrence and provider instance, preserve unaffected dates, refresh only stale evidence, obtain scope-specific approval, reconcile uncertain state, update that canonical instance, and read back the invitation. Never infer single-instance scope from casual wording.

    Does every recurring participant need to connect a calendar?

    No. Connected free/busy can reduce work. An unconnected participant can provide bounded windows for one occurrence or a declared horizon through an approved response path, with identity, consent, source, time zone, and freshness recorded.

    Where can developers review WonderCal’s scheduling API direction?

    Start with WonderCal for AI agents. Confirm the live recurrence, participant, consent, approval, update, recovery, observability, and verified-booking contract before making it a production dependency.

    Primary sources

    Related WonderCal reading

    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