Google Calendar

Connect Google Calendar so your agents can read your schedule, find real free slots across every calendar you own or share, RSVP, and build events — with a confirmation card before anything is written to Google.

Your agents plan around your real schedule — and never write to it without a card you click.

Connect Google Calendar once and every agent on your team can see when you're actually busy. Not "roughly free on Thursday" — a real free/busy query across every calendar you own or have been given access to, in your own timezone, before it proposes a single slot.

The boundary, up front

No agent writes to your Google Calendar directly. create_event, update_event and RSVP all render a confirmation card and stop. The call to Google happens after you click — from a separate function, not from the model. Deletions are gated a second time, by database policy rather than by prompt.

What it unlocks

Once Calendar is connected, agents get 14 calendar tools. They're mounted for every agent except Steve — so whoever you're already talking to can check your week without a handoff.

Reading your schedule

  • See the week — list what's on, by default the next 7 days, up to 50 events.
  • Search back and forward — "when did I last meet Marie?" searches from 30 days behind to 90 days ahead.
  • Open a single event — full details, attendees, location, description.
  • List every calendar — the ones you own and the ones shared with you.

Finding real free time

  • Free/busy across everything. This is the one that matters. When an agent checks whether you're free, it queries all your owned and accessible calendars by default — not just primary. Your side project's calendar, the shared team calendar, the one your co-founder gave you access to: all of it counts as busy. You can scope it to specific calendars if you'd rather, and you can look up to 3 months ahead.

Find me a 45-minute slot next Tuesday afternoon when I'm actually free, and check all my calendars, not just my main one.

Building your schedule

  • Create an event — title, start, end, all-day, attendees, location, description, colour, and which calendar it goes in. You get a card first.
  • Update an event — same card.
  • Delete an event — card, plus a second confirmation gate.
  • RSVP — accept, decline, or tentatively accept an invitation without leaving the chat.

Dedicated calendars

Agents can create, rename and delete secondary calendars — not just events inside your existing ones. That's what turns a chat into an actual filing system:

  • an Ashley Content calendar so your posting schedule isn't tangled up with your dentist appointment
  • a Maya Email calendar for scheduled sends and deadlines
  • a Company calendar you can share with a colleague

Creating one is a direct action — it's reversible, so we don't make you click a card for it. Deleting one is confirmation-gated.

Create a calendar called Content, then put Thursday's product shoot in it at 2pm for two hours.

Per-agent reality

Calendar is one of the few toolboxes that isn't owned by a single agent. Ask Ema what your week looks like, ask Maya to schedule around a meeting she's replying to, ask Alex to book the demo call. Same tools, same calendar.

Steve is the exception. All 14 calendar tools are stripped from Steve's toolbox at the runtime layer — he builds websites and has no business reading your schedule. That's not a prompt asking him nicely; the tools never enter his session.

How to connect

  1. Open Integrations from the sidebar. (It's /integrations — not inside Settings.)
  2. Find the Google Calendar card and click Connect.
  3. Sign in with your Google account and review the permission Google shows you.
  4. Approve. You land back on Integrations with the card showing the account you connected as.

If an agent hits Calendar mid-task and you haven't connected yet, the run doesn't fail — it pauses with a Waiting for connection notice. Connect, and the exact pending action replays itself. You don't retype anything.

Calendar is its own consent

Gmail, Drive and Calendar are three separate connections with three separate consent screens. Connecting Calendar does not widen your Gmail grant, and connecting Gmail doesn't give anyone your calendar — we explicitly disable Google's scope-accumulation behaviour (include_granted_scopes=false) so each service is consented on its own merits.

Permissions

Unyo requests one Google Calendar scope.

ScopeWhat it lets your agents do, in plain English
https://www.googleapis.com/auth/calendarRead your events and calendars, check free/busy across everything you can see, create and update events, RSVP to invitations, and create or remove secondary calendars.

Why full access, honestly

This is the full calendar scope, and Google classifies it as Sensitive. We're not going to dress that up as minimal — it isn't.

The narrower pair (calendar.readonly + calendar.events) lets an agent read your schedule and touch events inside calendars that already exist. It cannot create a calendar. The moment we shipped "make me a Content calendar", the split scopes stopped being enough, so we merged to one.

What we do instead of a narrower scope is put the limit where you can see it:

  • Writes render a card. The model's job ends at proposing. The Google API call lives in a separate function that only your click triggers.
  • Deletes are gated by database config, not by a sentence in a prompt — deleting an event or a calendar is one of the actions Unyo will not perform without an explicit confirmation.
  • Steve can't see any of it. Toolbox exclusion, enforced at runtime.
  • The scope stays here. Connecting Calendar doesn't extend your Gmail or Drive grant, and we never bundle consents.

What we deliberately don't ask for

Unyo requests no Google Calendar settings, no other Google product, and no scope that Calendar doesn't need. Gmail and Drive are separate cards you connect separately — or never connect at all. Calendar works fine on its own.

What Unyo does with your data

  • Your tokens are encrypted at rest. Calendar tokens are written and read only through encrypted database functions — never stored or read as a plain column. As of 16 July 2026, every populated OAuth token column in production was verified AES-256 encrypted at the cipher-byte level. Zero plaintext tokens exist.
  • The master key is unreachable by any client. It lives behind a function granted to one internal role. No user session, connected or not, can read it.
  • Your calendar isn't training data. Every model Unyo runs operates under a no-training guarantee. Your events are read to answer the thing you asked and nothing else.
  • Tokens are never logged. Not in an error message, not in a response, not in the step-by-step activity you see in chat. A token is resolved for the duration of one outbound call to Google and discarded.
  • Your calendar isn't copied into Unyo. Events are read from Google when an agent needs them. There's no mirror of your calendar sitting in our database to be leaked.
  • Row-level security on every connection. Your calendar connection row is readable only by you and cascades away entirely if you delete your account.

Timezones

Calendar is where timezone bugs go to embarrass you, so this one is centralised on purpose.

Agents don't guess. Every calendar result carries an explicit local time alongside the raw timestamp, resolved from your account's timezone — a real IANA zone, never a city name an agent inferred from your writing. The servers run in UTC and the conversion happens once, in one place. If you say "Tuesday at 3", the agent means your 3.

There's also a free get_current_time tool that makes no call to Google at all — it exists purely so an agent never has to guess what "today" means before it starts reasoning about your week.

Example prompts

What's on my calendar this week? Group it by day and tell me where the free afternoons are.

Am I free Friday at 3pm? If so, book "Design review" for an hour and invite sam@example.com.

Accept Marie's invite for Thursday's standup, and decline the 8am one — say I have a conflict.

Create a calendar called Ashley Content. From now on, put anything social-related in there.

Find every meeting I had with the Dupont account in the last 30 days and tell me how much time I've spent on them.

What it costs

Calendar tools are priced per call, in credits.

ActionCredits
Check the current time0
List event colours0
List events / search / open an event / list calendars10
Check free/busy10
RSVP to an invitation20
Create, update or delete an event30
Create, rename or delete a calendar30

Prices live in the database, not in the code — they're time-boxed to 16 July 2026 and may change. Anything that fails is refunded automatically; you're never charged for a call that didn't deliver.

Disconnecting and revoking

You can disconnect Google Calendar from Integrations at any time. Click Disconnect on the card and your agents lose all 14 tools immediately.

Disconnecting Calendar does not revoke Unyo at Google — and that's deliberate

Unyo has one Google OAuth client. Gmail, Drive and Calendar share one grant at Google's end, with cumulative scopes. Google's revoke endpoint doesn't take a scope argument — call it with any token from that grant and it kills the entire grant, for every scope, for every service.

So if disconnecting Calendar called revoke, it would silently break your connected Gmail and Drive too. You'd disconnect one card and quietly lose three.

Instead, per-service Disconnect deletes the connection on our side only. Unyo stops using it, immediately and completely — but the grant still exists in your Google account until you remove it there.

To revoke at Google as well: go to myaccount.google.com/permissions, find Unyo, and remove access. That kills the whole grant — Gmail, Drive and Calendar in one go — which is exactly what you want when you want it all gone.

When you delete your Unyo account, we do call revoke, on every provider that offers an API for it. There's no other service left to break, so killing the grant is the right thing. Account deletion purges roughly 80 tables atomically and completes even if a provider is unreachable.

Unyo detects revocation from Google's side too: if you remove access at Google, the next time an agent reaches for your calendar the connection is marked dead automatically and the agent tells you to reconnect — in your own language, not as a stack trace.

Troubleshooting

"Calendar disconnected itself." Google revoked the refresh token out of band — usually a password change, access removed from your Google account, or an admin policy. Unyo detects this specific case, marks the connection dead so nothing retries against a dead token, and asks you to reconnect. Reconnect from Integrations and you're back.

"The agent can't create a calendar, only events." You connected Calendar before dedicated-calendar support shipped, so your grant is the old narrower pair of scopes. There's no way for us to widen it silently and we wouldn't want one. Disconnect and reconnect Google Calendar — you'll see the new consent screen, and calendar creation starts working. This isn't auto-detected; if calendar creation quietly does nothing, this is why.

"The agent says it can't find my calendar to delete it." Deleting a secondary calendar needs the full calendar id — the long one ending in @group.calendar.google.com, not the display name. Ask the agent to list your calendars first, then delete by name from that list; it'll resolve the id itself.

"It proposed a slot when I'm actually busy." Check whether the busy event lives on a calendar you can see but don't own or have access to — free/busy can only read calendars your Google account has access to. If it's an event on a colleague's private calendar you were never given access to, no API can see it either.

"The run stopped and shows an orange notice." That's the Waiting-for-connection state, not an error. Your Calendar connection dropped or expired mid-run. Connect from the button in the notice and the exact pending action replays — the run resumes itself and you aren't charged twice.

"The times are wrong." Check the timezone on your account. Agents resolve every local time from that setting; if it's wrong, everything downstream is consistently wrong by the same offset.

FAQ

Can an agent put something in my calendar without asking?

No. Creating, updating and deleting an event all render a confirmation card and stop there — the request to Google is made by a separate function that only your click triggers. Deleting an event or a calendar is gated a second time, by database policy rather than by prompt wording. The one thing that runs directly is creating a new empty calendar, because it's reversible and adds nothing to your schedule.

Does disconnecting Calendar revoke Unyo's access at Google?

No, and this is deliberate. Gmail, Drive and Calendar share a single OAuth grant at Google, and Google's revoke endpoint kills the whole grant — every scope, every service. If Disconnect called it, unplugging Calendar would silently break your Gmail and Drive. So Disconnect removes the connection on our side only; Unyo stops using it immediately. To remove the grant at Google as well, use myaccount.google.com/permissions. Deleting your Unyo account does call revoke, because at that point there's nothing left to break.

Why does Unyo ask for full calendar access instead of read-only?

Because "create me a Content calendar" needs it. The narrower scopes let an agent read your schedule and edit events in calendars that already exist, but they cannot create a calendar — so we merged to the single full scope when dedicated calendars shipped. We'd rather be straight about that than claim a minimality we don't have. The compensating limits are real and enforced: writes go through a card you click, deletes are gated by database config, Steve's toolbox has no calendar tools at all, and connecting Calendar never widens your Gmail or Drive grant.

Which agents can see my calendar?

All of them except Steve. Calendar isn't owned by one agent the way your inbox is owned by Maya — ask whoever you're already talking to. Steve, the website builder, has all 14 calendar tools stripped from his toolbox at the runtime layer: they never enter his session, so there's nothing for him to call.

Does checking free/busy only look at my main calendar?

No — that's the whole point. Free/busy defaults to every calendar you own or have access to, so a conflict on a shared team calendar or a side-project calendar counts as busy. You can narrow it to specific calendars if you want, and look up to three months ahead.

Is my calendar data used to train AI models?

No. Every model Unyo runs operates under a no-training guarantee. Your events are read to answer what you asked and nothing else — and they aren't copied into a Unyo database, they're read from Google at the moment an agent needs them.