Agent calendar
Every agent inbox has a calendar. It reads the meeting invitations it receives, answers them, sends its own, and shares a calendar a person can follow in Google, Apple or Outlook.
How it works
• An invitation is an email with a calendar file inside. Google Calendar, Outlook and Apple Calendar all send it the same standard way.
• The inbox reads that file and puts the meeting on its calendar: title, time, organizer, guests and your answer.
• Answers and your own invitations leave as normal emails from the inbox, so they show up in the other person's calendar like any other.
• Nothing to connect. There is no Google account, no OAuth consent screen and no calendar API to set up. If the inbox can receive mail, it has a calendar.
Which inboxes have a calendar
Every inbox that is not end-to-end encrypted: agent inboxes, test inboxes and plain inboxes in the For everyone view. An encrypted inbox never reads mail content on our side, so it cannot read an invitation either.
When an invitation arrives
• In the message you get a card with the title, the time in your own time zone and the organizer. Agents get the same data as calendar_event on the message.
• On the calendar the meeting lives on its own. Retention can delete the email; the meeting stays, so an agent can still ask what was booked for tomorrow.
• Changes follow automatically. When the organizer moves or cancels the meeting, the new invitation updates the same entry. A new time sets your answer back to "Needs reply", because the old yes was for the old time.
• Only the organizer can change it. An update or cancellation is applied only when it really comes from the person who sent the invitation.
Answering an invitation
Open the meeting in the Calendar tab and choose Accept or Decline, with an optional note. An agent answers with rsvp and can also say tentative (maybe). The answer goes to the organizer as a standard calendar reply, so their Gmail, Outlook or Apple Calendar shows it next to your name.
| Answer | What the organizer sees | Your badge |
|---|---|---|
| accepted | You are going | Accepted |
| declined | You are not going | Declined |
| tentative | Maybe (agents only; the dashboard offers Accept and Decline) | Maybe |
On the Free plan
Answers to an organizer whose invitation was verified go out on the Free plan too, within a daily limit. Invitations you send yourself follow the normal Free rule: without a verified domain they go only to your own addresses.
Scheduling a meeting
• From the dashboard: Calendar tab → New meeting. Add a title, guests (mark some as optional), the date, start time and length, a place or a video link, and a note if you like.
• From an agent: create_calendar_event in the SDKs and MCP, or POST /api/v1/inboxes/{address}/calendar/events.
• Guests get a normal invitation with Yes and No buttons in Gmail, Outlook and Apple Calendar. Each answer updates the badge ("1 of 3 replied") and fires the calendar.attendee.responded webhook.
• Moving it updates the same event in every guest's calendar, with no duplicate, keeps the length unless you change it, and asks everyone again.
• Cancelling it removes it from their calendars. You can add a short note explaining why.
• Video links: put your Zoom or Google Meet link in the location. MailFlat does not create one.
Time zones, in detailnothing is guessed
A time like "2 PM" means a different moment in New York and Istanbul, and a wrong guess moves a meeting by hours without anyone noticing. So a time is only accepted when its zone is clear. The dashboard uses your browser's zone and lets you change it.
| You send | Result |
|---|---|
| "2026-10-06T14:00:00-04:00" | Accepted: the offset says exactly when |
| "2026-10-06T14:00:00" with "timezone": "America/ | Accepted: 2 PM in New York, daylight saving handled |
| "2026-10-06T14:00:00Z" | Accepted: UTC |
| "2026-10-06T14:00:00" with no zone | Refused, with a message saying what to add |
| "2026-10-06" with all_day: true | An all-day meeting; the end date is the day after |
The invitation carries the organizer's zone, so every guest's calendar shows the right local time.
Following the calendar in your own app
- Create the linkIn the Calendar tab choose Create subscribe link. An agent calls calendar_feed (MCP: get_calendar_feed) and can hand the link to a person.
- Add it to your calendar appAdd to Google Calendar, Add to Apple Calendar or Add to Outlook opens the right screen with the link filled in. You can also paste the https link into Google's "From URL" or Outlook's "Subscribe from web".
- Watch it fill inMeetings, guests and their answers appear in your app. The strip in the Calendar tab shows when a calendar app last fetched the link.
• Read-only. Moving a meeting in Google Calendar changes your copy, not the inbox calendar.
• Private, but a link. Anyone who has it can read the calendar. If it leaks, choose New link: the old one stops working at once and subscribers need the new one. Turn off removes it.
• The same link every time. Asking for it again never breaks an existing subscription.
• Cancelled meetings drop out of your app at its next refresh.
Google refreshes slowly
Apple Calendar and Outlook check the link often. Google Calendar decides on its own and can take up to a day to show a change; there is no refresh button. For live state, use the Calendar tab or the API.
Using it from the dashboard
| Badge | Meaning |
|---|---|
| Needs reply | An invitation you received and have not answered yet |
| Accepted · Declined · Maybe | Your answer to an invitation you received |
| 2 of 3 replied | A meeting this inbox organized: how many guests answered |
| Cancelled | The meeting was cancelled; it stays at the end of Upcoming until its date passes |
The number on the Calendar tab counts upcoming meetings that are not cancelled.
Who can do what
| Action | Inbox owner | Team member who can reply | Read-only team member | API key scope |
|---|---|---|---|---|
| See meetings | Yes | Yes | Yes | inbox:read |
| Schedule, edit, cancel, answer | Yes | Yes, shown as sent by them | No | email:send |
| Get the subscribe link | Yes | No | No | inbox:read |
| New link, turn the link off | Yes | No | No | inbox:manage |
What each calendar app does
| App | Yes / No buttons on our invitation | Answer reaches the inbox | Good to know |
|---|---|---|---|
| Gmail and Google Calendar | Yes | Usually within a minute; now and then much later | Changing your answer sends a new reply |
| Outlook (web and desktop) | Yes | Within a minute | Changing your answer sends a new reply |
| Apple Calendar on Mac | Yes | Within a few minutes | Only the first answer is sent; later changes are not |
| iPhone Mail | No buttons for invitations from outside | Open the invitation in the Calendar app instead |
Tip for testing: give each test meeting its own title. Two meetings with the same name in one mailbox make it easy to answer the one you already cancelled.
Limits, on purpose
• No booking page where people pick a free slot, and no free/busy lookup.
• No video links created for you. Paste one into the location.
• Guests are fixed once a meeting is sent. To change who comes, cancel and schedule again.
• Recurring meetings you are invited to show as one entry marked "repeats"; each occurrence is not listed separately.
• Encrypted inboxes have no calendar.
Go further
• Code for every step in six languages: Calendar invites for AI agents.
• Endpoints and tools: Agent API & MCP.
• Hear about changes as they happen: Webhooks.
• Something not showing up: Troubleshooting.