User guide
Calendar
Looking for what it does rather than how to use it? Read the Calendar overview .
What it is
Solidlio keeps a calendar of appointments, maintenance windows, project work, on-call shifts and time off, and synchronises each person’s own copy of it with their Microsoft 365 mailbox. This guide covers the calendar layer and the external calendar connection.
This guide is about the events themselves, who is invited to them, when people are free, and how all of that reaches Outlook.
Concepts
| Noun | What it is |
|---|---|
| Event | One entry on a calendar. Has a type, a status, a start and end, a timezone, and optional links to an organization, contact, ticket, change request, project or task. Id prefix evt. |
| Attendee | Someone invited to an event. Either a person in Solidlio or an external email address. Id prefix att. |
| Reminder | A request to be told about an event a set number of minutes before it starts, by in-app notification or email. |
| Recurrence | An RFC 5545 RRULE on an event (FREQ=WEEKLY;BYDAY=MO,WE,FR). Occurrences are expanded on read, not stored as rows. |
| Calendar connection | One person’s link to one Microsoft 365 mailbox, with its own direction, frequency and privacy settings. |
| Sync run | One execution of that link — manual, scheduled or triggered by Microsoft. Each run is recorded with what it created, updated and removed. |
| Change notification | A message Microsoft Graph sends when something changes in the connected calendar. Requires a subscription, which expires and is renewed automatically. |
Event types and statuses
Statuses: SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED, NO_SHOW.
Attendee responses: NEEDS_ACTION, ACCEPTED, DECLINED, TENTATIVE.
Roles and permissions
The role order is platform administrator > MSP administrator > MSP technician > organization administrator > power user > CUSTOMER`.
| Action | Who can do it |
|---|---|
| See an event | Its organizer, any attendee, or any colleague in the same account — private events excluded |
| Create, edit, cancel or delete an event | power user and above |
| Add, remove or mark an attendee optional | power user and above |
| Answer your own invitation | Anyone invited, including CUSTOMER |
| Record someone else’s reply | The event organizer only |
| Read free/busy for a colleague | Anyone in the same account; a customer-portal user sees only their own organization |
| Connect, disconnect or configure your calendar sync | Anyone, for their own mailbox only |
| Create an event across managed client organizations | MSP technician and above, via the MSP router |
| Free/busy lookup through the organization’s M365 hub | power user and above, and only when the tenant’s M365 integration has its calendar feature on |
Two rules are worth spelling out because they are easy to get backwards:
- Reads are not rank-gated. A client contact invited to a maintenance window can see it and decline it. What they can see is bounded by ownership and tenancy, not by seniority.
- MSP technician ranks above organization administrator, so a floor in the wrong place here would lock organization administrators out of their own settings.
You never see a colleague’s event titles in free/busy. Their blocks come back as “Busy”. Only your own calendar reveals real subjects, and never for events you marked private.
Walkthrough 1 — Connect your Microsoft 365 calendar
- Open Settings → Calendar Sync (
/msp/settings/calendarin the MSP portal,/org/settings/calendarin the organization portal). Customer-portal users go to Integrations → Personal Calendar (/user/integrations/calendar). - Select Connect Microsoft 365. You are sent to Microsoft to consent to
offline_access,User.ReadandCalendars.ReadWrite. Solidlio never asks for more than the one mailbox you sign in with. - Microsoft returns you to the same page. The Connection tile now reads Connected as your mailbox address.
- Under Synced Calendar, choose which Outlook calendar to sync. Your default calendar is preselected. Read-only calendars can be chosen — nothing will be written back to them.
- Select Settings to set direction, frequency and privacy:
- Sync direction — Solidlio → Microsoft 365, Microsoft 365 → Solidlio, or two-way.
- Frequency — real-time, every 15 / 30 minutes, hourly, every 6 hours, or manual only.
- Include private events — off by default. When off, events you marked private are never pushed to Outlook.
- Auto-accept invites — off by default. When on, each sync run marks your outstanding Solidlio invitations as accepted.
- If you chose real-time, turn on Real-time Sync. This creates a Microsoft Graph change-notification subscription so edits made in Outlook reach Solidlio within seconds. Subscriptions expire after three days; Solidlio renews them hourly, so you do not have to.
- Select Sync Now to run the first synchronisation immediately.
What each sync run does
- Pull (Microsoft 365 → Solidlio). Reads changes in the connected calendar from 30 days ago to 90 days ahead. New Outlook events appear in Solidlio; edited ones are updated; deleted or cancelled ones are marked
CANCELLEDrather than removed, so attendees, time entries and ticket links survive. Recurring Outlook meetings arrive as their individual occurrences inside that window. After the first run Solidlio stores a delta link and only asks Microsoft for what changed. - Push (Solidlio → Microsoft 365). Sends events you organize inside the same window. New ones are created, edited ones are updated, and cancelled ones are deleted from Outlook. A recurring Solidlio series becomes a real Outlook series when its rule is one Outlook can express (daily, weekly, monthly, yearly, with intervals, day-of-week, counts and end dates).
- Conflicts. When the same event changed on both sides since the last run, the side that changed most recently wins. If Solidlio’s copy was newer it is kept and pushed out, and the run reports it as a conflict resolved in Solidlio’s favour.
A run processes up to 200 of your events and follows up to 25 pages of Microsoft changes. If it runs out of room it says so, and the next run picks up where it stopped.
Walkthrough 2 — Read the sync history and fix a failure
- On the Calendar Sync page, the Sync History card lists your recent runs with direction, status, counts and the time each finished.
- A run is
SUCCESSwhen nothing errored,PARTIALwhen some events moved but at least one errored, andFAILEDwhen nothing moved. - If the last run failed, a red banner at the top of the page shows the message Microsoft returned and how many runs in a row have failed.
- The most common cause is an expired or revoked refresh token. The banner reads Microsoft rejected the stored refresh token. Reconnect your calendar. and syncing is switched off automatically. Select Disconnect, then Connect Microsoft 365 again.
- A clean run clears the banner and resets the counter.
Walkthrough 3 — Invite people and track replies
- Open an event (
/msp/calendar/{id}or/org/calendar/{id}). - In the Attendees panel, select Add. Pick a colleague from the list, or type an external email address.
- Everyone in Solidlio who is added receives an in-app notification. External addresses do not — they have no inbox in the product.
- Each attendee answers for themselves with Yes / Maybe / No. Your own answer is the only one you can set.
- As the organizer you can also record a reply that arrived by phone or email: the Yes / Maybe / No buttons beside each attendee write that person’s response. This is the only way an external attendee is ever marked as having answered.
- The panel header counts accepted attendees against the total (“3/8 in”).
- Mark an attendee Opt to make their attendance optional, or remove them entirely. Removing someone is not the same as their declining — declining keeps them on the list with a
DECLINEDresponse.
Walkthrough 4 — Find a time that works
- In the event form (
/msp/calendar/new,/org/calendar/new), add the people you want. - Check this time reports, per person, whether the entered slot clashes and with what. Only your own conflicts show real titles; everyone else’s read “Busy”.
- Suggest times returns up to five ranked slots over the next fortnight that fit everyone. Suggestions are ranked in the organization’s own working timezone: mornings score highest, lunchtime lowest.
- When exactly one person is selected, Show their day lists that person’s booked blocks for the day you are looking at.
- Select a suggestion to apply it to the form.
If the organization has business hours configured, suggestions respect them — including which weekdays are worked and which dates are observed holidays — and they are evaluated in the organization’s declared timezone, not the server’s. Without configured hours, the fallback is 09:00–17:00 on weekdays.
Configuration
Per-person sync settings
| Setting | Default | What happens if you leave it |
|---|---|---|
| Synced calendar | Mailbox default | Solidlio uses your default Outlook calendar |
| Sync direction | Two-way | Changes flow in both directions |
| Frequency | Every 15 minutes | A background sweep runs your sync when the interval has elapsed |
| Real-time sync | Off | Outlook edits are picked up on the next scheduled run instead of immediately |
| Include private events | Off | Events marked private stay in Solidlio and are never written to Outlook |
| Auto-accept invites | Off | Invitations wait for you to answer them |
Frequency 0 means real-time only (webhooks do the work); a negative value means manual only. The background sweep checks every five minutes, so that is the finest interval that has any effect.
Organization business hours
Free/busy and time suggestions read the organization’s configured BusinessHours and observed holidays when it keeps them. Hours are wall-clock times in a declared IANA timezone, so 09:00–17:00 America/Toronto stays 09:00–17:00 in Toronto across daylight-saving changes.
Plan tiers
The calendar, its events, attendees, reminders, availability engine and the per-person Microsoft 365 connection are not plan-gated. They are available on every tier.
The organization-wide Microsoft 365 hub is gated: connecting it requires a tier whose integration allowlist includes o365_email, which in the seeded catalog is MSP_ENTERPRISE and CUSTOMER_ENTERPRISE. That hub powers directory-wide free/busy lookup and email-to-ticket; it is not needed for personal calendar sync, which uses its own app registration.
Troubleshooting
| What you see | What it means |
|---|---|
Redirected back with ?error=oauth_failed | Microsoft rejected the consent — usually a cancelled sign-in or a blocked app. |
Invalid state (400) on the callback | The OAuth state was tampered with, or more than 30 minutes passed between starting and finishing the connect. Start again. |
Calendar sync not enabled (400) on Sync Now | You have no connection, or sync is switched off — often because a token refresh failed and Solidlio disabled it. |
Token expired, please reconnect (401) | The refresh token is no longer accepted. Disconnect and connect again. |
Calendar not connected or token expired (401) on a single-event push | Same cause, reached from the event page’s push button. |
Microsoft rejected the stored refresh token. Reconnect your calendar. | Shown in the failure banner. Consent was revoked, the password changed, or a Conditional Access policy now blocks the app. |
Invalid calendar sync settings (400) | An unknown or out-of-range field was sent. Frequency must be between −1 and 10080 minutes. |
Attendee already exists for this event (409) | That person or email address is already on the invite list. |
At least one of personId or email must be provided | An attendee must identify either a Solidlio person or an external address. |
Only the attendee or the event organizer may change a response status (403) | You tried to answer an invitation on someone else’s behalf and you are not the organizer. |
Invalid recurrence rule format (400) | The RRULE could not be parsed. Use RFC 5545 form, e.g. FREQ=WEEKLY;BYDAY=MO,WE,FR. |
Invalid <field>: the referenced record does not exist or is not accessible (400) | An event was linked to a ticket, project, change, organization or contact outside your tenant. The same message is returned whether the record is foreign or absent. |
A run reports truncated | More than 200 of your events or 25 pages of Microsoft changes were pending. The next run continues from there. |
Limits and known behaviour
- Microsoft 365 only. There is no Google Calendar, iCloud, CalDAV or ICS feed support. The Google Calendar tile on the sync page is marked Coming Soon and does nothing.
- One calendar per person. A connection syncs a single Outlook calendar.
- Your own events only. Sync covers events you organize. An event a colleague organized and invited you to stays in Solidlio; it is not written to your Outlook.
- Attendee lists are not mirrored. Solidlio does not add attendees to the Outlook copy, so connecting a calendar never causes Outlook to send meeting invitations. Attendees on an Outlook event are likewise not imported. Invitations and cancellations are delivered by Solidlio’s own notifications.
- Sync window. 30 days back and 90 days forward. Events outside that range are neither pushed nor pulled.
- Recurrence. Daily, weekly, monthly and yearly rules — with intervals, days of week, day of month, counts and end dates — become real Outlook series. Rules Outlook cannot express (hourly and finer, or unusual
BYSETPOSvalues) are pushed as a single occurrence. In the other direction, an Outlook series arrives as its individual occurrences within the sync window rather than as one recurring event. - Cancellations are not deletions. An event deleted in Outlook is marked
CANCELLEDin Solidlio so its attendee list, time entries and ticket links survive. - Scheduling granularity. The background sweep runs every five minutes, so a frequency below that has no additional effect.
- SMS reminders have no transport.
SMSis a selectable reminder method in the data model, but no SMS provider is integrated; those reminders are counted and skipped rather than being marked as delivered. - Free/busy privacy. Colleagues’ event titles are never returned — their blocks read “Busy” — and private events are excluded from account-wide visibility entirely.
Data handling
- Disconnecting deletes the tokens, tells Microsoft to drop the change notification subscriptions, and clears the Outlook event mapping from your Solidlio events.
- A erasure request removes the calendar connection, its run history and its notification subscriptions, and detaches the erased person from the attendee rows they appear on.
- Every sync run is recorded: direction, status, counts created, updated and removed, error count, first and last timestamps.