Calendar & Microsoft 365 Sync
A shared service calendar for MSPs and their clients, with each person's own copy synchronised two ways against their Microsoft 365 mailbox.
The problem
Your technicians live in Outlook. Your dispatch lives in the PSA. So every booking gets made twice, and the second copy is the one that is wrong — the on-site visit that moved by an hour on Tuesday, the maintenance window somebody accepted in Outlook that the PSA still shows as unanswered, the technician double-booked because their personal calendar was invisible to the person doing the scheduling. The workaround is a standing rule that everything goes in the PSA first, and the workaround fails the first time someone is on their phone.
What Solidlio does about it
Every person connects their own Microsoft 365 mailbox once, with delegated consent to a single calendar they choose. From then on changes move in both directions: events created or edited in Solidlio appear in Outlook, and events created or edited in Outlook appear in Solidlio. Microsoft Graph change notifications carry Outlook edits across in seconds; a scheduled sweep covers everyone who has not turned those on. When the same event changed on both sides, the side that changed most recently wins, and the run says so rather than silently discarding work.
Capabilities
| Capability | What it does |
|---|---|
| Two-way Microsoft 365 sync | Creates, updates and removes events in both directions against one chosen Outlook calendar per person |
| Delta synchronisation | After the first run, asks Microsoft only for what changed, using a stored Graph delta link |
| Real-time updates | Subscribes to Graph change notifications and renews the subscription hourly before its three-day expiry |
| Conflict resolution | Compares Solidlio’s last edit against Outlook’s lastModifiedDateTime; the newer side wins and the run reports it |
| Timezone-correct times | Sends and reads wall-clock times in each event’s own IANA zone, tracking daylight saving on both sides |
| Recurring series | Converts an RFC 5545 RRULE into a real Outlook series, and expands Outlook series into occurrences on the way in |
| Attendees and RSVP | Invites people or external email addresses, records Yes / Maybe / No, and lets the organizer log replies received out of band |
| Free/busy and time suggestion | Reports per-person conflicts and returns ranked slots that fit everyone inside the organization’s business hours |
| Reminders | Delivers in-app or emailed reminders a set number of minutes before an event, to the organizer and every attendee who has not declined |
| Per-run history | Records every run with direction, status, and counts created, updated and removed |
Built for MSPs and their clients
The calendar is shared across the boundary. An MSP schedules work into the client organizations it services; the client sees the work on its own calendar and can answer for its own people. Neither side can see the other’s private events, and neither can read a colleague’s meeting subjects through free/busy.
| Organization | MSP | |
|---|---|---|
| Calendar view | Its own schedule | Its own account plus every account it services, labelled by client |
| Creating events | power user and above, within its own account | MSP technician and above, into any organization it services |
| Answering invitations | Anyone invited, including a client contact with the CUSTOMER role | Anyone invited |
| Free/busy visibility | People in its own organization | People across the account, with titles suppressed to “Busy” |
| Business hours | Its own configured working week and observed holidays govern suggestions | Uses the client organization’s hours when scheduling into it |
| Calendar connection | Each person connects their own mailbox | Each person connects their own mailbox |
How it works
- Connect — A person opens Settings → Calendar Sync and consents to
offline_access,User.ReadandCalendars.ReadWriteon their own mailbox. The returning OAuth state is signed and expires in 30 minutes, so no one can attach their mailbox to somebody else’s account. - Choose a calendar — Their Outlook calendars are listed with owner and read/write status. The default is preselected; any one can be chosen.
- Set direction and cadence — Two-way, or one direction only. Real-time, every 15 or 30 minutes, hourly, every 6 hours, or manual. Private events are excluded from the push unless explicitly included.
- First run — Solidlio reads the connected calendar from 30 days back to 90 days ahead, creates what it does not have, and stores a delta link so subsequent runs ask only for changes.
- Steady state — Outlook edits arrive over Graph change notifications within seconds, or on the next scheduled sweep. Solidlio edits go out on the same run. Cancellations remove the Outlook copy; Outlook deletions mark the Solidlio event cancelled so its attendees, time entries and ticket links survive.
- Disconnect — Tokens are deleted, the Graph subscriptions are revoked at Microsoft, and the Outlook mapping is cleared from the person’s events.
Compliance and audit
- Every synchronisation run is recorded against the person: direction, outcome (
SUCCESS,PARTIALorFAILED), events created, updated and removed, error count, and the exact message when a run fails. - Change notifications from Microsoft are authenticated by comparing the echoed
clientStateagainst the value stored when the subscription was created; a mismatch is logged and discarded. - A Microsoft 365 event id is stored per person, not globally, so one tenant’s synchronisation cannot read, overwrite or cancel another tenant’s event.
- A erasure removes the calendar connection, its stored tokens, its run history and its notification subscriptions, and severs the erased person from the attendee rows they appear on.
- Event links to tickets, changes, projects and organizations are validated against the caller’s tenant before they are persisted, and a foreign id returns the same message as an absent one.
Editions
The calendar and per-person Microsoft 365 sync are not tier-gated.
| Capability | Free | Starter | Growth | Scale | Enterprise |
|---|---|---|---|---|---|
| Shared calendar, events, attendees, reminders | ● | ● | ● | ● | ● |
| Free/busy, conflict check, time suggestion | ● | ● | ● | ● | ● |
| Personal two-way Microsoft 365 calendar sync | ● | ● | ● | ● | ● |
| Real-time sync via Graph change notifications | ● | ● | ● | ● | ● |
| Organization-wide Microsoft 365 hub (directory free/busy, email-to-ticket) | — | — | — | — | ● |
The final row reflects the seeded tier integration allowlists: the organization M365 connection requires a tier carrying o365_email, which is Enterprise. Personal calendar sync uses its own app registration and is unaffected.
Integrations
Microsoft 365 / Outlook — delegated OAuth per person, Microsoft Graph v1.0, calendarView/delta for incremental reads, Graph change-notification subscriptions for real-time updates.
Google Calendar, iCloud, CalDAV and ICS feeds are not supported.
Two calendars, one schedule, and a written record of every time they disagreed.