Escalation answers one question: how do we reach a human. Scheduling answers a second: which human, this week. A small team can nail the first and still wake the wrong person at 3 a.m., because without a rotation every alert either hits everyone, in which case everyone quietly assumes someone else has it, or it hits the one person whose name is hardcoded in the config until they burn out and leave.
The tools built for this, PagerDuty and Opsgenie, charge per user and assume an org with a dedicated ops function. For a three-person startup that's expensive and shaped wrong at the same time. You're paying enterprise per-seat rates to answer a question that boils down to "whose turn is it." You don't need incident command and stakeholder timelines; you need a calendar that knows who's on call and an alert that finds them.
An on-call schedule is a calendar of shifts: who covers which span of time. failover.io builds it with drag-and-drop, so a weekly rotation across three people is three blocks you drop onto a grid and repeat, not a config file you hand-edit and hope you got right. The schedule attaches to your escalation chain, and when an incident opens, the chain routes to whoever the calendar says is on call right now rather than blasting the whole team and hoping.
The escalation itself doesn't change. It still climbs from Slack to email to SMS to a phone call until someone acknowledges, exactly as covered in the guide on escalation for solo developers and small teams. The schedule just decides who sits at the end of that chain this week, so the 3 a.m. call goes to the one person who agreed to take it and everyone else sleeps.
A rotation that ignores timezones breaks the moment your team spans more than one. A shift that reads "9 a.m. to 5 p.m." has to mean 9 a.m. where that person actually is, not on the server's clock or the founder's. failover.io's shifts are timezone-aware: you define a shift in a person's own zone and it lands at the right wall-clock time for them, whether they're in Bangkok or Berlin or wherever the next hire turns out to be. Nobody runs UTC arithmetic in their head to work out if tonight is theirs.
Schedules stay clean right up until someone gets sick or takes a holiday, and a rotation you can't bend is one people route around with frantic Slack messages at the worst moment. An override swaps coverage for a specific span without touching the underlying rotation. You're out next Thursday, so you drop an override onto that day naming whoever's covering, and the base pattern picks back up on Friday. The recurring schedule stays whole; the exception sits on top of it.
Create a schedule, add the people on it, and drop shifts onto the calendar in whatever cadence you run, weekly being the usual one. Set each person's timezone so their shifts land correctly, then attach the schedule to the escalation chain your monitors already feed. Add overrides as life happens. From that point an alert finds the person who's genuinely on call, not a static list of everyone who might be.
Getting paged reliably is half the job; paging the right person is the other half, and a static list of names solves neither. A schedule routes each alert to whoever's actually on call this week, respects the timezone they live in, and bends for the Thursday someone's out without a rewrite. You don't need PagerDuty's per-seat pricing to answer "whose turn is it." You need a calendar wired to your escalation chain, which is the whole idea here.
failover.io pairs timezone-aware on-call scheduling with escalation that climbs until someone acknowledges. Scheduling on the Team plan; the escalation chain on every plan, free included.
Start monitoring free →