Shiftctl Documentation
Shiftctl is an on-call platform for IT support teams and Managed Service Providers (MSPs). One schedule does three jobs. It builds your on-call roster, pages the right engineer when something breaks (the way PagerDuty or Opsgenie would), and enforces a structured handover when the shift ends. Rostering, alerting, and handover run from a single source of truth, so the engineer on the roster, the engineer who gets paged, and the engineer who hands over are always the same person.
Who is Shiftctl for? Any team that runs on-call shifts where one engineer hands over to the next: IT helpdesks, NOC/SOC teams, MSP technicians, and infrastructure engineers.
On-call rostering
Build your on-call schedule, auto-generate rotations, and spot coverage gaps before they bite, or import an existing PagerDuty/Opsgenie rota by iCal.
Alerting & paging
Ingest alerts from your RMM and monitoring, then route and escalate over SMS, voice, Slack, email and push until someone acknowledges. It is a full paging engine, not a webhook relay.
Enforced handover
Every shift ends with a structured, acknowledged handover, so nothing is lost between engineers. It is the piece dedicated paging tools leave out.
How Shiftctl works
Everything in Shiftctl runs off one on-call schedule. That schedule decides who gets paged when an alert fires, who owns the active shift, and who receives the handover at the end of it. Three jobs, one source of truth. Change the roster once and paging, on-call status, and handover all follow automatically.
Here is the lifecycle of a single shift. Each on-call shift follows a four-stage lifecycle enforced by Shiftctl. The platform makes it structurally impossible to skip any stage, so the workflow itself is the safeguard.
Clock in & read the brief
Shifts start automatically at the scheduled time. The incoming engineer receives a push and email notification, opens Shiftctl, and is immediately shown the full handoff summary from the previous shift: tickets logged, pending items, and a difficulty rating. They must acknowledge the brief before doing anything else.
Active shift
During the shift, the engineer works from My Shift, logging tickets and pending items as they go via the quick-log dialogs, with live context from their PSA (ConnectWise PSA, Autotask, HaloPSA) syncing both ways. Any alert that fires routes straight to them, because they are the engineer the schedule says is on call. There is no separate paging rota to keep in sync. The previous engineer's open tickets, pending items, and carried alerts stay visible in the "Handover from previous" card for the whole shift.
Structured handover
The handover wizard can be prepped at any point during the shift, but it cannot be sent until the shift window ends, or until the engineer explicitly ends their shift early. Every section must be complete: tickets resolved, pending items noted, warnings raised, and a difficulty rating from 1 to 5 recorded.
Automatic handoff
The moment the handover is sent, the next scheduled engineer is notified by push notification and email. If no engineer is scheduled, the team owner is alerted. Unacknowledged handoffs trigger a follow-up after 12 hours.
Enforced handover
The cornerstone of Shiftctl is that the handover is enforced. It is not optional, and not a reminder. An engineer cannot complete their shift until every section of the handover is filled in.
Tickets logged
Every ticket worked during the shift must be recorded with its resolution status.
Pending items
Any unresolved work or open tasks the next engineer needs to know about.
Warnings raised
Escalations, at-risk clients, or anything that needs immediate attention.
Difficulty rating
A rating from 1 to 5 of how demanding the shift was. This feeds into manager analytics.
The handover cannot be sent until all four sections are completed, and, on Enterprise, until every open alert is resolved or explicitly carried forward. This is enforced at the UI level and server-validated, so it cannot be bypassed.
Incoming brief
When the next engineer's shift begins, they see the full structured handoff from the outgoing shift. No digging through Slack, no verbal catch-up. The context is there, formatted, and ready to acknowledge.
Full shift summary
All tickets logged during the shift, each with resolution status and notes.
Pending items
Outstanding work items the incoming engineer needs to follow up on immediately.
Active warnings
Flagged escalations or at-risk situations requiring priority attention.
Carried alerts (Enterprise)
Alerts the outgoing engineer carried forward appear in the brief with severity and context, and stay visible on My Shift in the “Handover from previous” card for the whole shift.
Difficulty context
The outgoing engineer's difficulty rating helps set expectations before the shift begins.
One-click acknowledgement
Once reviewed, the engineer acknowledges the brief, and this timestamp is recorded for accountability.
On-call rostering
Shiftctl is a complete on-call rostering system in its own right, not a calendar bolted onto a handover tool. Plan your rota weeks ahead, auto-generate rotations forward from your engineer list, assign engineers to slots, and spot coverage gaps before they become incidents. No more scheduling via Slack threads or shared spreadsheets.
The same roster then drives everything else: it decides who gets paged when an alert fires, and who receives the handover at shift end. Build it once, and paging and handover both follow it.
Calendar view
Visual weekly/monthly view of all scheduled shifts with engineer assignments.
Auto-generated rotations
Define your rotation once and Shiftctl generates future slots forward automatically, regenerating them when you change the pattern, while preserving manual and in-progress shifts.
Rotation order
Define a rotation sequence and auto-assign upcoming slots in order.
Coverage gap alerts
Unscheduled slots are visually flagged so managers can act before the shift starts.
Swap requests
The on-call engineer offers their shift to a teammate via /swap in Slack. The teammate accepts or declines, and the schedule updates automatically. Admins can reassign any slot from the calendar.
Multi-staff shifts
Assign multiple engineers to a single shift slot for high-demand periods.
Timezone support
Each team has a defined timezone; all shift times are displayed relative to it.
PagerDuty schedule import
Already running on PagerDuty? Bring your existing on-call rota into Shiftctl in minutes, without re-entering shifts manually. Shiftctl reads standard iCal feeds, which PagerDuty, Opsgenie, VictorOps, and Google Calendar all export natively.
One-time import
Download a .ics file from PagerDuty and upload it to Shiftctl via Schedule → Import. Your schedule is seeded instantly. After import, the calendar is fully editable, and you own the schedule.
Live sync Recommended
Paste your PagerDuty iCal feed URL and Shiftctl keeps the schedule in sync automatically, every hour. Changes made in PagerDuty appear in Shiftctl without any manual action. The calendar becomes read-only while sync is active.
How live sync works
Hourly automatic sync
Shiftctl fetches your iCal feed every hour and diffs it against the current schedule, adding new slots, updating changed times, and removing cancelled ones.
Read-only calendar
While live sync is active, the Shiftctl calendar is locked to visual browsing only. All scheduling changes must be made in PagerDuty. Disconnect sync at any time to regain full edit access.
Engineer mapping
iCal feeds contain engineer names. During setup, you map each name to a Shiftctl team member. The mapping is saved and applied automatically on every future sync.
Zero re-entry switching
Teams evaluating Shiftctl can connect it to their existing PagerDuty schedule in minutes, with no disruption to their current scheduling workflow.
Before importing: Your Shiftctl schedule must be empty. Use Schedule → Import → Clear entire schedule if you have existing slots. Active (in-progress) shifts are never affected by a clear.
Where to find your PagerDuty iCal URL
- Log in to PagerDuty and click your name → My Profile
- Go to User settings
- Copy the On-Call iCalendar feed URL (starts with
webcal://) - Paste it into Shiftctl at Schedule → Import → Live sync
Automatic handoff notifications
When the handover completes, Shiftctl automatically notifies the next engineer, with no manual action required. The notification chain is designed to ensure no handoff is ever silently missed.
Instant push + email
The moment the handover is sent, the scheduled next engineer receives both a browser push notification and an email.
Unscheduled slot alerts
If no engineer is scheduled for the next slot, the team owner is immediately alerted so they can assign cover.
12-hour follow-up escalation
If the handoff brief is not acknowledged within 12 hours, an escalation alert is sent to the engineer, their manager, and posted to Slack.
Configurable channels
Each engineer can choose which notification channels are active for them: push, email, or both.
Slack integration
Install the Shiftctl Slack app for interactive shift handovers, slash commands, DM notifications, and automatic @oncall usergroup sync, all without leaving Slack. Requires the Team plan. Configure from Settings → Slack.
Slash Commands
/oncall
See who's on call right now, when their shift ends, and who's next.
/myshift
View your current shift: tickets, pending items, and duration.
/handoff
Start your shift handover with a 4-step interactive modal. Log tickets, pending items, warnings, and rate difficulty, all from Slack.
/ticket [description]
Log a ticket on your current shift. Omit the description to open a detailed form.
/pending [description]
Add a pending item to your shift. Omit the description to open a detailed form.
/swap
Offer your current shift to a teammate, who accepts or declines via DM.
/link [code]
Link your Slack account to Shiftctl using a code generated from Settings → Slack.
Notifications & Automation
Bot-delivered alerts
Handoff summaries, on-call changes, shift start/end, escalation warnings, coverage gaps, and daily digests, all delivered via the Shiftctl bot with @mentions for linked engineers.
Brief acknowledgement from Slack
Incoming engineers receive a DM with the full handoff brief and can acknowledge with one tap, with no need to open the web app.
Automatic account linking
Team members are automatically linked to their Slack accounts by matching email addresses. Manual linking is available via /link for mismatched emails.
@oncall usergroup sync
Automatically update a Slack usergroup (e.g. @oncall) when shifts change, so @mentioning @oncall always reaches the right person.
Slack integration requires the Team plan. All alert types are independently toggleable. A legacy webhook option is also available for teams that prefer passive notifications only.
Manager insights
The Data Hub gives managers a complete view of how their on-call operation is performing over time. Spot trends, track engineer workload, and export clean reports, all without leaving Shiftctl.
What managers can track
PDF reports: Export a clean summary report at any time (Team plan and above), or schedule automated weekly or monthly reports (Team plan and above).
Connect your PSA
Shiftctl connects directly to the PSA your team already uses. When an engineer logs a ticket during a shift, it is created automatically in your PSA. When a technician resolves or updates it in the PSA, the status syncs back to Shiftctl in real time. No copy-pasting, no duplicate entry, no context lost between systems.
Automatic ticket creation
Tickets logged in Shiftctl are pushed to your PSA instantly, including title, notes, on-call engineer, handover timeline, and a deep-link back to Shiftctl.
Two-way status sync
Status changes in your PSA (resolved, in progress) are reflected in Shiftctl within seconds via webhook.
Zero workflow disruption
Tickets land on your existing boards and queues. Your PSA workflows, SLAs, and automations continue as normal.
PSA integrations are available on the Team and Enterprise plans. Enable from Integrations → PSA Integrations once upgraded.
Sync failures are never silent: if the PSA push fails (expired credentials, PSA unreachable), the Shiftctl ticket still saves. It is marked with an amber “Not in PSA” badge on the shift so you know it exists in Shiftctl only. Inbound sync (status changes and notes from the PSA) applies to tickets Shiftctl created; tickets raised directly on a PSA board do not appear in Shiftctl.
Network requirements: Shiftctl connects to your PSA via outbound HTTPS API calls over port 443. Your PSA API endpoint must be reachable over the public internet. No firewall allowlisting or static IP configuration is required on your side. If your PSA instance is hosted behind a private network or VPN, it will not be reachable by Shiftctl.
ConnectWise Manage
The most widely deployed PSA in the MSP industry. Shiftctl pushes tickets directly onto a ConnectWise service board of your choosing and listens for status changes via the ConnectWise Callbacks API. Works with both cloud-hosted and self-hosted ConnectWise environments.
Any service board
Choose an existing board or create a dedicated On-Call board, so tickets land exactly where you want them.
Callbacks webhook
ConnectWise fires a callback to Shiftctl the moment a ticket status changes, synced in seconds, not minutes.
Real Basic auth
Uses ConnectWise's standard API member authentication. No OAuth dance, no token refresh headaches.
Status name mapping
Shiftctl maps open → New, monitoring → In Progress, resolved → Resolved. Statuses must exist on your chosen board.
What you will need
- An API Member with Public + Private keys (System → Members → API Members tab)
- A Client ID from developer.connectwise.com (free registration)
- The numeric Board ID of your target service board
- Your CW login Company ID (the text string, not a number)
- Existing MSPs: verify your board has statuses named exactly "New", "In Progress", and "Resolved". These are board-scoped in ConnectWise and commonly customised
Autotask PSA
Datto's enterprise PSA, used by MSPs who run tight service desk operations with multi-queue routing and contract-level billing. Shiftctl creates tickets in the queue you specify and receives status updates via Autotask's outbound webhook system.
Queue-based routing
Specify exactly which Autotask queue Shiftctl tickets land in, keeping on-call tickets separate from client-facing queues.
Outbound webhooks
Autotask fires a webhook to Shiftctl when a ticket is modified. Status changes typically sync within 30 to 90 seconds.
API Integration Code
Uses Autotask's standard three-header auth: Integration Code, API username, and API key. No OAuth required.
Custom status IDs
Autotask status IDs are tenant-specific. Shiftctl ships with sensible defaults and lets you override all three.
What you will need
- An API User (username + API key) with Tickets: View, Add, Edit permission
- An API Integration record, where the Tracking Identifier is your Integration Code
- Your zone URL (look it up at webservices.autotask.net/ATServicesRest/V1.0/zoneInformation?user=YOUR_EMAIL)
- The numeric Queue ID and your own Company ID from Autotask
- Existing MSPs: your status IDs are almost certainly not the defaults, so check Admin → Service Desk → Ticket Statuses and set the correct IDs in Shiftctl
HaloPSA
A modern, flexible PSA popular with growing MSPs. HaloPSA uses OAuth 2.0 client credentials for API access, and Shiftctl handles token management automatically. Tickets can be routed to a specific team and ticket type, giving you full control over where they land in your workflow.
OAuth 2.0 auth
Shiftctl handles token management automatically with smart caching, so no manual token rotation is needed.
Team and type routing
Optionally set a Team ID and Ticket Type ID so Shiftctl tickets route correctly in your existing HaloPSA structure.
Near real-time webhooks
HaloPSA webhooks fire immediately on ticket updates, so status changes appear in Shiftctl within seconds.
Required status IDs
All three status mappings (open, monitoring, resolved) must be set to match your HaloPSA instance. There are no assumed defaults.
Auto-assignment
Tickets are automatically assigned to the matching HaloPSA agent when the on-call engineer's email matches an agent profile.
What you will need
- An API Application with "Client ID and Secret (Services)" auth and read:tickets, edit:tickets, and read:customers permissions
- Your HaloPSA tenant URL (e.g. https://yourcompany.halopsa.com)
- Optionally: Team ID and Ticket Type ID for precise routing
- Existing MSPs: if your HaloPSA has mandatory fields or ticket type validation rules, you must set a Ticket Type ID or ticket creation will fail
- Self-hosted: your server must be reachable over HTTPS with a valid TLS certificate
Alerting & incident paging
Shiftctl is a full alerting and incident-paging engine, doing the same job PagerDuty and Opsgenie do. It ingests alerts from your RMM and monitoring tools, deduplicates them, routes each one by policy, and escalates over SMS, voice call, Slack, email and push until a human acknowledges. Voice pages ring until answered with press-1-to-acknowledge; heartbeat monitors catch the jobs that go silent; maintenance windows mute planned work. It is a paging platform, not a webhook relay.
What makes it more than a PagerDuty clone: it pages against the sameon-call schedule your roster and handovers run on. The engineer who is paged is the engineer the schedule says is on call, and any alert still open at shift end is carried into the handover, not dropped. The schedule, the page, the phone call and the handover finally run from one tool. Teams moving off PagerDuty or Opsgenie can consolidate all of it here.
Alerting is included on the Enterprise plan, and in the 14-day free trial, which unlocks every Enterprise feature with no credit card required. Owners configure it under Alerts in the sidebar; every team member can view the dashboard and acknowledge alerts.
Severity levels (P1–P4)
Every alert lands with one of four severities, mapped automatically from the source system’s priority. Severity drives routing (policies can match on it), display order, and how hard the escalation pages.
P1: Critical
Service down, data at risk. Page immediately, escalate fast, wake people up.
P2: High
Degraded service or imminent risk. Page the on-call engineer promptly.
P3: Medium
Needs attention this shift, not this minute. Quiet channels or a delayed step.
P4: Low
Informational. Lands on the dashboard; typically no paging at all.
Setting up your first integration
Go to Alerts → Integrations → Add integration and pick the source: PRTG, N-able N-central, N-sight RMM, ConnectWise RMM (Asio), ConnectWise Automate, or a generic webhook for anything else (Datto RMM connects through it with a ready-made recipe). N-sight, ConnectWise RMM, ConnectWise Automate and the Datto recipe are in beta. They are built from the vendors’ API documentation but not yet verified against a live tenant, so trigger a real alert from the source and confirm it looks right before relying on them for paging. For webhook sources, Shiftctl generates a unique webhook URL to paste into the source’s notification configuration. N-sight and ConnectWise RMM have no webhooks, so they connect the other way round: paste in API credentials and Shiftctl polls them every five minutes. Either way, use Send test alert to prove the loop end-to-end. The test flows through the real pipeline and appears on the dashboard like any production alert.
Duplicates are collapsed automatically. A re-firing monitor updates the original alert instead of paging again, and if a duplicate arrives at a higherseverity the open alert is escalated to match. When the source sends a recovery event the alert resolves itself, so configure a resolution trigger in the source too (PRTG’s Up trigger, N-central’s return-to-Normal). For sources that never send recoveries, each integration has an optional auto-close window; a per-integration silence watchdog can also raise an alert when a source goes quiet for too long, catching a dead webhook or broken configuration before you miss a real page.
Client tagging:alerts are attributed to your clients automatically. A routing policy’s tag wins, then the integration’s default client, then an exact name match from the alert payload. Tagging powers per-client routing and the Client Insights reports.
PSA auto-ticketing: with a PSA connected, each integration can log a ticket in your PSA for every new alert. Enable “Create PSA ticket per alert” on the integration row. Severity maps to ticket priority (P1 → Critical), the matched client sets the company, flapping alerts are skipped, and ticket creation never delays the page. Leave it off for sources whose RMM already opens PSA tickets, since enabling both would create two tickets per alert.
Routing policies
Policies decide which alerts page whom, and how hard. Each policy is a set of conditions (severity, source, client, title keyword, and an optional time window, where overnight windows like 18:00 to 08:00 are supported) plus the escalation policy to run and an optional client tag. Policies evaluate top to bottom; the first match wins, so put specific policies above general ones. If nothing matches, the alert falls back to an email to the current on-call engineer, and no alert is ever silently dropped.
The condition set is deliberately small and closed. That is what keeps policy evaluation debuggable: the alert timeline records exactly which policy matched and why, so “why did/didn’t I get paged?” is always answerable from the alert itself.
Escalation policies
The ladder an unacknowledged alert climbs. Each step defines a delay, recipients (the current on-call engineer from your schedule, specific members, or both), and channels. The classic shape: step 1 pages on-call via SMS and push immediately; step 2 pages again plus Slack after 5 minutes; step 3 notifies the whole team after another 10. The final step can repeat on an interval until someone responds.
The on-call integration is the point:“notify on-call” resolves against the live Shiftctl schedule at fire time, so cover changes and swaps are automatically respected. Acknowledging from any surface (the web dashboard, the Slack button, an SMS reply, the email link) stops the ladder instantly and identically.
Maintenance windows
Patch night without pages. Schedule a window under Alerts → Maintenance (one-off or repeating daily/weekly, covering all sources or specific ones) and alerts arriving inside it are recorded as suppressed: visible in history, counted in reporting, paged to nobody. There is also a global pause switch under Integrations → Alerting for the storms no window anticipated.
Heartbeat monitors
Heartbeats invert the pattern: instead of firing when something breaks, they fire when something that should happen regularly doesn’t. A backup job, sync script or scheduled task pings a unique URL on every successful run (curl -fsS <url> as its last line); if the expected interval plus grace period passes with no ping, Shiftctl raises an alert through your normal routing. The next successful ping resolves it automatically.
SMS & notification channels
Escalation steps can page via email, SMS, voice call, Slack and web push. SMS and voice require each engineer to verify their mobile once under Manage → Account using a six-digit code by text, and pages are only ever sent to verified numbers. Replying ACK to an SMS page acknowledges the alert from the phone; on a voice call, press 1 to acknowledge. An unanswered call is retried once a minute later, then the escalation ladder continues. Slack pages arrive as direct messages with an Acknowledge button; Slack accounts link under Manage → Slack.
Owners can check the channel-readiness matrix under Integrations → Alerting: for every engineer, exactly which channels can actually reach them, before an escalation step depends on it.
Alerts in the handover
This is the part no standalone alerting tool has. Alerts attach to the active shift and appear live in the shift workspace. At handover, any alert still open becomes a mandatory step in the wizard: the outgoing engineer must resolve it or explicitly carry it forwardinto the handover brief. Carried alerts appear in the incoming engineer’s brief with severity and full context, and stay visible on My Shift in the “Handover from previous” card. An alert can survive a shift change, but it can never be silently dropped by one.
Client Insights & QBR reporting
Data Hub answers “how is my team doing?” and Alerts → Insightsanswers “which clients are noisy, whose infrastructure is unreliable, and who is burning my techs?” Five reports over 30/90-day windows, per client:
The five reports
QBR workflow:pick the client and quarter, add your recommended actions (“replace DC-SRV-01 storage, 34 disk alerts this quarter”), download the PDF, and walk into the meeting with the alert story already built.
Microsoft 365 sign-in
Shiftctl supports sign-in via Microsoft 365 (Azure AD / Entra ID) as an alternative to email and password. M365 sign-in means engineers authenticate through their company Microsoft account, so no separate Shiftctl password is created or required. All identity management stays in your existing Azure Active Directory.
No extra passwords
Engineers sign in with the Microsoft credentials they already use every day, with no new password to create, forget, or rotate.
Automatic team join
When an invited engineer signs in with Microsoft for the first time, Shiftctl automatically adds them to the correct team. No manual approval step.
Works alongside standard accounts
Teams can mix M365 and email/password accounts freely. Both sign-in methods coexist, and there is no forced migration.
M365 sign-in is available on every plan, including your 14-day free trial. There is no Azure app registration required on your end, because Shiftctl uses its own Microsoft OAuth application. Your engineers just need a valid Microsoft 365 account with the same email address you invite them with.
Inviting new members via M365
When you invite a member using the Microsoft 365 option, Shiftctl sends them an email with a link that opens the Microsoft sign-in page directly. There is no Shiftctl password to set. The engineer authenticates with their existing Microsoft account and is automatically added to your team.
Go to Team → Members
Open the sidebar and navigate to Team → Members. You will see the "Invite team members" panel at the top. If it is collapsed, click the header to expand it.
Enter the engineer's email and select their role
In the "Invite by email" form, type the engineer's work email address. This must be the email associated with their Microsoft 365 account. Use the role selector on the right to choose Member (standard on-call engineer) or Admin (full team management access). If you are unsure, use Member, since you can promote them later.
Switch the account type to Microsoft 365
Below the email and role row, you will see two account type buttons: "Standard" and "Microsoft 365". Click the Microsoft 365 button (it turns blue with the Microsoft logo). The note below will confirm: "Recipient will get a Microsoft sign-in link. No Shiftctl password needed." This is the key difference. A standard invite sends a link to create a Shiftctl password, while an M365 invite sends a link that redirects straight to Microsoft sign-in.
Click Send
Click the Send button. Shiftctl stores a pending invite for that email address in the database and sends the engineer an invitation email. The email contains a link that points to the Microsoft sign-in page via Shiftctl's OAuth flow.
Engineer accepts the invite (their view)
The engineer opens the invitation email and clicks the sign-in link. They are taken to Microsoft's login page. After signing in with their Microsoft 365 credentials, Microsoft redirects them back to Shiftctl. Shiftctl detects the pending invite for their email, creates their Shiftctl account automatically, adds them to your team, and redirects them to the onboarding screen to complete their profile.
The member appears in your team
Once the engineer has completed sign-in, they appear in Team → Members with a "pending" badge removed. Their account is fully active, and they can be assigned to on-call shifts immediately. All future sign-ins use the "Sign in with Microsoft" button on the Shiftctl login page.
Bulk inviting with M365 via CSV
For teams of five or more, use the CSV bulk invite. Download the template from Team → Members → Bulk import CSV. The template includes an m365 column. Set it to yes for any engineer who should receive an M365 invite, and no (or leave blank) for standard email/password accounts. All other columns (email, role, full_name, phone_internal, phone_mobile) apply to both invite types.
- Mixed teams are fine, with some rows
m365=yesand othersm365=no - Invites are sent immediately on upload, one email per row
- If a row fails (e.g. already a member, seat limit reached), the error is shown per-row, and successful rows are still sent
Important:The email you invite must exactly match the email on the engineer's Microsoft account. If there is a mismatch (e.g. you invite jane@company.com but her Microsoft account is jane.smith@company.com), the automatic team join will not fire and she will land on the onboarding screen without a team. Contact support to resolve this, and do not create a duplicate invite.
Linking M365 to an existing Shiftctl account
If an engineer already has a Shiftctl account created with email and password, they can add Microsoft 365 as a sign-in method without losing any data, history, or team membership. After linking, they can sign in either with their password or with Microsoft, and both methods work simultaneously.
Sign out of Shiftctl
The engineer should sign out of their current session. This is required because the Microsoft OAuth flow starts a new authentication session, which cannot run while already logged in.
Click "Sign in with Microsoft" on the login page
On the Shiftctl login page (/login), click the "Sign in with Microsoft" button. This redirects to Microsoft's login page.
Sign in with the same email address
Authenticate with the Microsoft account whose email address matches their existing Shiftctl account. This is the critical step, and the emails must match. Shiftctl's authentication backend (Supabase) detects that an account with this email already exists, and links the Microsoft identity to it automatically.
Shiftctl redirects to the dashboard
After Microsoft authentication completes, the engineer is redirected back to Shiftctl and signed in, landing straight on the dashboard as their existing user. Their team, shift history, and settings are unchanged. The account now has both sign-in methods active.
Both sign-in methods remain active
Going forward, the engineer can use either "Sign in with Microsoft" or their email/password. There is no need to remove the password, since both methods coexist. If the engineer later wants to rely exclusively on Microsoft, they can change or remove their password from Manage → Account.
Email mismatch: If the Microsoft account email differs from the Shiftctl account email (e.g. Shiftctl has john@company.com but Microsoft has john.doe@company.com), the OAuth flow creates a brand-new Shiftctl account rather than linking to the existing one. The engineer will land on onboarding without their team. To recover: sign in with the original email/password, then contact your admin to check which email is registered in Shiftctl.
For admins: migrating your whole team to M365
If you want to standardise your team on Microsoft sign-in, the approach is straightforward: communicate the steps above to each engineer. No admin action is required, and each person links their own account independently by clicking "Sign in with Microsoft" and authenticating with their company Microsoft account. There is no forced migration and no disruption to active shifts.
SCIM provisioning
Automate user lifecycle management with SCIM 2.0. Connect your identity provider (Microsoft Entra ID, Okta, OneLogin) to automatically provision and deprovision Shiftctl users when they join or leave your organisation.
Automatic provisioning
Users assigned to Shiftctl in your IdP are automatically created as team members. No manual invites needed.
Automatic deprovisioning
Unassigned users are deactivated immediately. They cannot log in and stop counting towards your seat limit.
Attribute sync
Name, email, and external ID are synced from your IdP. Changes propagate on the next sync cycle.
Audit trail
Every SCIM operation (provision, deprovision, link, update) is logged with timestamps, user details, and success/error status.
SCIM provisioning is available on the Enterprise plan. Generate a SCIM token from Manage → Integrations.
Billing & subscriptions
Shiftctl uses Stripe for all billing. Your card details are never stored in Shiftctl. All plan changes, seat adjustments, and interval switches go through a confirmation modal showing exact Stripe-calculated amounts before any charge is applied.
Plans & upgrades
Start with a 14-day free trial (full access, no credit card required), then choose a Team or Enterprise plan when you're ready. Switch between Team and Enterprise at any time. Upgrades take effect immediately with prorated charges. Downgrades take effect at the end of your billing period, so you keep full access until then. The confirmation modal shows the exact amount, what you are gaining or losing, and your next billing date.
Seat management
All paid plans support unlimited members. Seats are billed per user per month (or per year on annual billing). Add seats at any time, and the prorated cost is charged immediately. Remove seats and the credit appears on your next invoice. You cannot reduce seats below your current number of active members, so deactivate users first from Team → Members.
Invoices & billing history
View all past invoices, download PDFs and receipts, and see your projected next charge from Manage → Billing → View billing history. Each invoice shows a line-item breakdown including proration credits, refunds, and account credits applied.
Security & compliance
Shiftctl is built on enterprise-grade infrastructure with security built in at every layer. Enterprise plans include a compliance-grade audit log built with SOC 2, ISO 27001, and Essential 8 controls in mind.
TLS encryption in transit
All data is encrypted in transit using TLS 1.2+.
Row-level security
Database access is scoped per team using Supabase row-level security, so no cross-team data leakage is possible.
Hashed passwords
Passwords are hashed using bcrypt and never stored in plaintext.
MFA support
Engineers and managers can enrol TOTP-based multi-factor authentication, prompted during onboarding or at any time from Manage → Account.
GDPR / Privacy Act compliant
Data processing complies with the EU GDPR, UK GDPR, and Australian Privacy Act 1988. See our Privacy Policy for full details.
Stripe-handled payments
We never store card details. All payment data is handled by Stripe.
Enterprise audit log, compliance ready
The Enterprise audit log captures every action across your workspace with the detail auditors expect. Designed with SOC 2 Type II, ISO 27001 Annex A, and Essential 8 maturity controls in mind.
Infrastructure is hosted on Vercel (edge) and Supabase (EU data region). Read our Privacy Policy →
Account recovery
Lost access to your Shiftctl account? There are several ways to regain access depending on your situation.
Forgot your password
Go to the login page
Visit the Shiftctl login page and click "Forgot password?" beneath the password field.
Enter your email
Enter the email address associated with your Shiftctl account. You'll receive a password reset link.
Check your inbox
Click the link in the email. It will open Shiftctl and prompt you to set a new password. The link expires after 1 hour.
Set your new password
Choose a strong password (minimum 8 characters). You'll be signed in automatically after saving.
Using your recovery email
If you set up a recovery email in Manage → Security, you can use it to receive a password reset link when you no longer have access to your primary email. Contact support@shiftctl.com with proof of identity and your recovery email address, and the team will verify and send a reset link to your recovery email.
Locked out of MFA
If you have MFA enabled but lost access to your authenticator app:
- Recovery codes. Enter your password as normal, then choose “Use a recovery code” on the two-factor screen and enter one of the single-use codes you saved when enabling MFA. This removes MFA from your account so you can sign back in with your password, then re-enable it straight away in Manage → Security.
- Backup SMS. If you verified a backup phone number in Manage → Security, choose “Text a code” on the two-factor screen instead. Verifying the SMS code removes MFA the same way; re-enable it after signing back in.
- Admin assistance. Ask a team admin to contact support on your behalf. The admin can verify your identity and request an MFA reset.
- Support. Email support@shiftctl.com with your account email and proof of identity. MFA resets require manual verification and typically take 1 business day.
Microsoft 365 SSO users:If your account is linked to Microsoft 365, you can sign in using the “Sign in with Microsoft” button, which bypasses your Shiftctl password entirely. You can then reset your Shiftctl password from Manage → Security while signed in.
Setting up multi-factor authentication
Multi-factor authentication (MFA) adds an extra layer of security by requiring a time-based code from an authenticator app each time you sign in. We strongly recommend enabling MFA for all team members.
Enabling MFA
Navigate to Security settings
Go to Manage → Security. Scroll to the "Two-factor authentication" section.
Click "Enable MFA"
Shiftctl generates a unique QR code and a manual entry key. Both are tied to your account only.
Scan the QR code
Open your authenticator app (Authy, Google Authenticator, 1Password, Microsoft Authenticator, etc.) and scan the QR code. If you can't scan, enter the manual key shown below the QR code.
Enter the verification code
Your authenticator app will display a 6-digit code that refreshes every 30 seconds. Enter this code in the verification field and click "Verify & enable".
Save your recovery codes
After enabling MFA, you'll be shown a set of single-use recovery codes. Save these in a secure location (password manager, printed copy in a safe). Each code can only be used once and they are your last resort if you lose your authenticator.
Disabling MFA
To disable MFA, go to Manage → Security → Two-factor authentication and click “Disable MFA”. You must be signed in to disable it. After disabling, you will no longer be prompted for a code at login. Your recovery codes will be invalidated.
Supported authenticator apps
Any TOTP-compatible authenticator app works with Shiftctl. Popular choices include:
- Authy (recommended, with multi-device sync and cloud backup)
- Google Authenticator
- Microsoft Authenticator
- 1Password (built-in TOTP support)
- Bitwarden (built-in TOTP support on Premium)
Changing devices?Before wiping or replacing your phone, either transfer your authenticator entries to the new device or disable MFA in Shiftctl first. If you lose access without doing this, you'll need to use a recovery code or contact support.
Admin management
Admins have full control over team settings, member management, billing, and integrations. Shiftctl enforces safety guardrails to prevent accidental lockouts.
Adding an admin
To promote a team member to admin, go to Manage → Members, find the member, and change their role to “Admin”. Admins can manage team settings, invite or remove members, and access billing, but they cannot delete the team unless they are the original owner.
Removing an admin
To demote an admin back to a regular member, go to Manage → Members, find the admin, and click “Remove admin”. The member keeps their account, shift history, and team access; only their elevated permissions are removed.
Last-admin protection
Shiftctl prevents the last remaining admin from being removed or demoted. This applies across all interfaces: the web app, the API, and SCIM provisioning. If you need to transfer ownership:
- Promote the new admin first (Manage → Members → change role)
- Then demote yourself or have the new admin demote you
- The team will always have at least one admin
Single-admin warning
If your team is on a paid plan and has only one admin, a dismissible amber banner appears across all pages reminding you to add a co-admin. This is a business continuity safeguard. If the sole admin leaves the organisation or loses account access, the team would need to contact support to regain admin control. Adding a second admin takes 30 seconds and eliminates this risk.
Best practice: Every paid team should have at least two admins. This ensures continuity if one admin is unavailable, leaves, or loses account access.
Exporting your data
Shiftctl lets team admins export a complete copy of their team's data at any time. The export is a ZIP archive containing JSON files for each data type.
How to export
Navigate to Team settings
Go to Manage → Team. Scroll to the "Data export" section. You must be a team admin to access this.
Click "Export team data"
A ZIP file will be generated and downloaded automatically. The file is named shiftctl-export-YYYY-MM-DD.zip.
Review the contents
The archive contains: team.json, members.json, shifts.json, shift_slots.json, handoffs.json, tickets.json, pending_items.json, audit_log.json, and export_metadata.json.
What's included
Team metadata
Team name, ID, settings, timezone, and creation date.
Members
All current team members with roles, contact details, and rotation order. Sensitive fields (passwords, tokens) are never included.
Shifts & schedule
The most recent 1,000 shifts and 5,000 shift slots with start/end times, assigned engineers, and completion status.
Handoffs
The most recent 1,000 handoff records including tickets logged, pending items, difficulty ratings, and acknowledgement status.
Tickets & pending items
The most recent 5,000 shift tickets and pending items created during shifts.
Audit log
The most recent 10,000 audit log entries covering all team actions: logins, role changes, settings updates, and more.
When to export
- Before deleting a team. Once the 30-day grace period expires, all data is permanently removed. Export first.
- Compliance or auditing. Provide an offline copy of your team's activity to auditors or compliance teams.
- Migration. Moving to a different tool? The JSON format makes it straightforward to transform and import elsewhere.
- Regular backups. Schedule periodic exports as part of your data governance policy.
Data retention: Enterprise teams can configure automatic data retention policies from Manage → Team. Data older than the configured retention period is purged automatically. Export your data before the retention window closes if you need a long-term archive.
Plans & pricing
Start with a 14-day free trial with full access and no credit card required. Choose a Team or Enterprise plan when you're ready.
Simple per-user pricing: pay only for the members on your team. Every paid plan includes unlimited members.
14-day free trial · full access · no credit card required
Start 14-day free trialTeam
Billed $120/year
Integrations, analytics and automation for growing teams.
- Unlimited members
- Shift sign-off & handover briefs
- Auto-scheduling by rotation order
- iCal export for Google Calendar & Outlook
- Data Hub with analytics & PDF reports
- Multiple on-call teams
- PagerDuty / Opsgenie import & live sync
- Slack notifications
- Scheduled PDF reports (weekly/monthly)
- PSA integrations (ConnectWise PSA, Autotask, HaloPSA)
Enterprise
Billed $90/year (first year)
Alert routing, per-client reporting, compliance and provisioning at scale.
50% off your first 12 months on annual billing, applied automatically at checkout.
- Unlimited members
- Everything in Team
- Alert routing & escalation from your RMM/monitoring
- Mobile paging (SMS, Slack) to the current on-call engineer
- Heartbeat monitors for backups & scheduled jobs
- Per-client noise, reliability & tech-burden reporting
- Client QBR export (PDF)
- SCIM provisioning for Microsoft Entra ID
- Custom data retention policies (365-day minimum)
- Tamper-proof admin audit log with IP tracking
- Compliance dashboard
- Built with SOC 2, ISO 27001 & Essential 8 controls in mind
Ready to run on-call from one place?
Rostering, alerting, and enforced handover: one schedule, set up in under 5 minutes.