MailFlatDocs
Documentation/Using MailFlat/Agent calendar

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

The invitation arrives as an email, lands on the inbox calendar, and the answer goes back to the organizer as an email too.
• 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

The message shows the invitation as a card. The Calendar tab keeps the meeting after the email itself expires.
• 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.
AnswerWhat the organizer seesYour badge
acceptedYou are goingAccepted
declinedYou are not goingDeclined
tentativeMaybe (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

The inbox is the organizer. Every step is an email to the guests, and their answers come back to the inbox.
• 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 sendResult
"2026-10-06T14:00:00-04:00"Accepted: the offset says exactly when
"2026-10-06T14:00:00" with "timezone": "America/New_York"Accepted: 2 PM in New York, daylight saving handled
"2026-10-06T14:00:00Z"Accepted: UTC
"2026-10-06T14:00:00" with no zoneRefused, with a message saying what to add
"2026-10-06" with all_day: trueAn 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

One read-only link, three calendar apps. Each app checks it again on its own schedule.
  1. Create the link
    In the Calendar tab choose Create subscribe link. An agent calls calendar_feed (MCP: get_calendar_feed) and can hand the link to a person.
  2. Add it to your calendar app
    Add 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".
  3. Watch it fill in
    Meetings, 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

The Calendar tab sits next to Received and Sent, in the inbox view and in the agent inbox reader.
BadgeMeaning
Needs replyAn invitation you received and have not answered yet
Accepted · Declined · MaybeYour answer to an invitation you received
2 of 3 repliedA meeting this inbox organized: how many guests answered
CancelledThe 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

ActionInbox ownerTeam member who can replyRead-only team memberAPI key scope
See meetingsYesYesYesinbox:read
Schedule, edit, cancel, answerYesYes, shown as sent by themNoemail:send
Get the subscribe linkYesNoNoinbox:read
New link, turn the link offYesNoNoinbox:manage

What each calendar app does

AppYes / No buttons on our invitationAnswer reaches the inboxGood to know
Gmail and Google CalendarYesUsually within a minute; now and then much laterChanging your answer sends a new reply
Outlook (web and desktop)YesWithin a minuteChanging your answer sends a new reply
Apple Calendar on MacYesWithin a few minutesOnly the first answer is sent; later changes are not
iPhone MailNo buttons for invitations from outsideOpen 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.