Overview

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.


Core concept

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.

01

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.

02

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.

03

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.

04

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.


Feature

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.


Feature

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.


Pillar

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.


Migration

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

  1. Log in to PagerDuty and click your name → My Profile
  2. Go to User settings
  3. Copy the On-Call iCalendar feed URL (starts with webcal://)
  4. Paste it into Shiftctl at Schedule → Import → Live sync

Feature

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.


Integration

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.


Feature

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

Shift difficulty trends over time
Engineer on-call burden (hours, shift count)
Ticket resolution rates per shift
Brief acknowledgement times
Warning frequency and escalation patterns
Coverage gap history

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).


PSA integrations

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.


PSA integration

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
Full setup guide: ConnectWise Manage

PSA integration

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
Full setup guide: Autotask PSA

PSA integration

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
Full setup guide: HaloPSA

Pillar

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

Noise league table: volume, per-source normalisation, duplicate + flap share
Reliability: P1/P2 trends, critical frequency, repeat-offender devices
Actionable rate: % of alerts a human acted on, vs the team benchmark
Tech burden: after-hours pages, escalation steps consumed, time-to-ack
QBR export: a branded per-client PDF with the quarter’s alert story pre-built
Untagged row: everything not yet attributed, so the gap is always visible

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.


Authentication

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.


Microsoft 365

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.

01

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.

02

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.

03

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.

04

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.

05

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.

06

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=yes and others m365=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.

Full setup guide: Inviting members with Microsoft 365


Enterprise

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

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.


Trust & compliance

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.

Tamper-proof, append-only audit trail
IP address and user-agent on every event
Session correlation for incident investigation
Failed login and authorization denial tracking
365-day minimum retention (configurable)
CSV, PDF, and email export for auditors
Logins, role changes, schedule edits, integrations
Data retention purge logging

Infrastructure is hosted on Vercel (edge) and Supabase (EU data region). Read our Privacy Policy →


Help center

Account recovery

Lost access to your Shiftctl account? There are several ways to regain access depending on your situation.

Forgot your password

01

Go to the login page

Visit the Shiftctl login page and click "Forgot password?" beneath the password field.

02

Enter your email

Enter the email address associated with your Shiftctl account. You'll receive a password reset link.

03

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.

04

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.


Help center

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

01

Navigate to Security settings

Go to Manage → Security. Scroll to the "Two-factor authentication" section.

02

Click "Enable MFA"

Shiftctl generates a unique QR code and a manual entry key. Both are tied to your account only.

03

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.

04

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".

05

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.


Help center

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.


Help center

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

01

Navigate to Team settings

Go to Manage → Team. Scroll to the "Data export" section. You must be a team admin to access this.

02

Click "Export team data"

A ZIP file will be generated and downloaded automatically. The file is named shiftctl-export-YYYY-MM-DD.zip.

03

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

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.

MonthlyAnnualSave up to 33%

14-day free trial · full access · no credit card required

Start 14-day free trial
Most popular

Team

$10USD/user/month
$15-33%

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)
Start free trial
Startup Program: 50% off

Enterprise

$7.50USD/user/month
$15-50% FIRST YEAR

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
Start free trial

Ready to run on-call from one place?

Rostering, alerting, and enforced handover: one schedule, set up in under 5 minutes.