Kvika Team·· 8 min read

A Year of Building for Mixed Google and Microsoft Teams

Incremental sync, process-then-advance cursors, name resolution without extra scopes, trace dedupe, and draft-then-confirm AI — themes from twelve months shipping a unified calendar, mail, and task workspace.

productengineeringproductivityretrospective

A year ago our blog covered why scheduling breaks when half the team uses Google Calendar and half uses Outlook. We shipped unified mail, bidirectional calendar sync, AI task extraction, team scheduling, and a Bedrock agent on top — not as a demo stack, as daily-driver infrastructure with production footguns we wrote about each month.

This post ties those threads together: what held up, what we would not skip again, and what is still unfinished.

Mixed stack is the default

Single-provider shortcuts become dead ends. Users connect Google and Microsoft in arbitrary combinations — work Outlook + personal Gmail, client tenant + company tenant, Teams without directory admin consent. Features must degrade gracefully: calendar-mined contacts when org search fails, partial inbox when one token expires, Teams scheduling when Google free/busy is not wired yet.

Test matrix is four states: Google only, Microsoft only, both, neither. Provider badges in UI are not decoration — they explain which sync cursor failed.

Sync is the product

Users forgive plain UI. They do not forgive missing meetings or mail that silently stops updating. The engineering depth lives in cursors, scoped deletes, conflict flags, and knowing when not to advance a bookmark until AI finishes (process-then-advance).

Gmail historyId and Outlook deltaLink are different animals merged in one inbox (unified inbox post). Calendar pull/push needs modifiedLocally (bidirectional sync). Real-time mail layers push, SSE, and incremental fetch — not full re-download (real-time mail).

Incremental sync is day-one architecture, not a performance optimisation you add later.

AI as propose, not autopilot

Task extraction batches mail conservatively, links every task to source threads, dedupes on retry, and requires explicit consent. Teams chat extraction biases false negatives. Analytics runs rule-based insights over existing rows — no metrics warehouse required (analytics post).

Every outward-facing AI action is draft → human confirm: email, meeting, Jira. Autonomy comes after trust metrics, not before launch.

Agents need parsers, not prompts

Bedrock agents call our Next.js API via Lambda bridges (architecture post). Multi-tool turns need prompt reinforcement and trace fingerprint dedupe (trace dedupe,multi-tool). Name resolution runs server-side (name resolution). LLM datetimes need wall-clock handling (timezone post).

Half our agent bugs were parsers and identity propagation, not model quality.

What is still hard

Calendar incremental tokens in the hot path — schema exists, full-window fetch still runs in production sync routes. Outlook delta pagination through entire first sync. Webhook subscription renewal mapped to users. Single-flight OAuth refresh everywhere. Conflict reconciliation UI beyond marking CONFLICT. Google free/busy in team scheduling alongside Microsoft.

We document footguns honestly in these posts because the next team maintaining mixed-stack sync should not rediscover them from user trust cliffs.

Start anywhere: calendar sync primer · inbox task capture · compare tools. Join the Kvika beta.

Kvika Team

Kvika unifies your calendar, email, and tasks across Google and Microsoft. Join the beta at kvika.work/waitlist.