Kokil Thapa - Professional Web Developer in Nepal
Freelancer Web Developer in Nepal with 15+ Years of Experience

Kokil Thapa is an experienced full-stack web developer focused on building fast, secure, and scalable web applications. He helps businesses and individuals create SEO-friendly, user-focused digital platforms designed for long-term growth.

On-Call Rotations Without Burnout

By Kokil Thapa | Last reviewed: September 2026

On-call rotations without burnout start with one honest admission: paging a developer at 2 AM is a loan against tomorrow's productivity. I've maintained production Laravel stacks, WooCommerce stores, and legal-tech portals on shared EC2 for years. The sites share a OpsGenie-style alerting pipeline and Deployer 7 releases. When on-call is treated as a badge of honour, people quit. When it is engineered like any other reliability feature, teams survive peak season and still ship features.

How do you design on-call rotations that prevent burnout?

A sustainable rotation spreads risk across the team without trapping one person as the permanent firefighter. The goal is predictable coverage, not maximum availability.

Start by defining what "on-call" means for your stack. For a typical PHP/Laravel deployment on Ubuntu with MySQL and Redis, on-call usually covers application errors, queue failures, disk space, SSL expiry, payment webhook delays, and database connectivity—not every warning in the log.

Set rotation length by team size

Small teams feel every hour on-call. Use these practical defaults:

  • Two to four engineers: one-week rotations with a mandatory backup who can take over within 30 minutes.
  • Five to eight engineers: one-week primary plus one-week secondary, staggered so nobody covers two primaries back-to-back.
  • Follow-the-sun only if you have time zones: Nepal-based teams serving global clients may split evening coverage across two people rather than one.
Fair On-Call Rotation ModelWeek 1Eng A primaryWeek 2Eng B primaryWeek 3Eng C primaryWeek 4Eng D primarySecondary always pairedEscalates if primary misses ACK in 5 minHandoff checklist every MondayOpen incidents, deploy notes, known risks
On-call rotations without burnout depend on equal primary shifts, a secondary responder, and a written handoff every week.

Write a rotation policy in plain language

Document rules before someone burns out. A one-page policy beats a verbal agreement that shifts when Dashain traffic spikes.

  1. Maximum consecutive primary weeks: one, unless the team opts in with extra pay or comp time.
  2. Minimum rest after a Sev-1 night: no non-urgent meetings before noon the next day.
  3. Swap requests allowed with 24 hours notice and manager visibility.
  4. Holiday coverage planned four weeks ahead—Nepal public holidays included.
  5. No deploys to production on Friday afternoon unless the on-call engineer agrees in writing.

On booking platforms like Adventure Third Pole Trek, peak trekking season overlaps with festival travel. Plan heavier coverage then instead of pretending traffic is flat year-round.

What alerting rules reduce false pages at 2 AM?

Alert fatigue is the fastest path to burnout. If half your pages are noise, engineers stop trusting alerts—and real outages get ignored.

Treat alerts as product features. Each rule needs an owner, a runbook link, and a definition of user impact. Page humans only when paying customers or critical workflows break.

Separate paging from ticketing

Use a two-tier model aligned with Prometheus Alertmanager severity labels:

  • Critical (pages): site down, checkout failure rate above 5%, queue backlog not draining for 15 minutes, database unreachable.
  • Warning (ticket/email): disk above 75%, slow queries, certificate expiring in 14 days, failed cron on non-critical job.
  • Info (dashboard only): deploy completed, cache warm, routine health checks.
# alertmanager.yml excerpt — page only on sustained user impact
groups:
  - name: laravel-production
    rules:
      - alert: CheckoutFailureSpike
        expr: rate(http_requests_total{route="checkout",status=~"5.."}[5m]) > 0.05
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "Checkout 5xx rate above 5% for 10 minutes"
          runbook: "https://wiki.example.com/runbooks/checkout-down"

Add alert quality gates

Before any new alert ships to production, answer four questions:

  1. What customer-visible symptom does this detect?
  2. Has this fired without action needed in the last 30 days?
  3. Can the on-call engineer fix it without calling three other people?
  4. Is there a runbook with copy-paste commands?

I delete or downgrade alerts that fail question two. Noise is not free—it compounds into resentment.

Alert typeShould page?Typical fix timeBurnout risk
HTTP 5xx on payment callbackYes, immediately15–60 minMedium if runbook exists
Disk 80% on app serverNo—ticketNext business dayLow
Single failed queue jobNo—auto-retryAutomatedLow
SSL cert expires in 3 daysYes, business hours30 minLow with Certbot cron
CPU spike for 2 minutesNo—dashboardMonitorHigh if paged nightly

Disk alerts belong in your log rotation and disk management playbook. Fix the root cause once instead of paging every month.

How should runbooks and escalation paths be structured?

At 3 AM, nobody wants to grep production logs from memory. A runbook turns panic into a checklist. Pair it with a clear escalation ladder so the primary does not carry every hard problem alone.

Build runbooks around services you actually run: Laravel queue workers, PHP-FPM pools, MySQL replication lag, Redis memory, WooCommerce cron, payment gateway callbacks. Keep them in the same repo or wiki your team already opens during incidents.

Minimum runbook template

Every production alert should link to a page with this structure:

## Symptom
Users see blank checkout page / 502 from Nginx

## Impact
Revenue stopped; estimate from /admin/orders

## First 5 minutes
1. Check status page and recent deploys
2. tail -f /var/log/nginx/error.log
3. sudo systemctl status php8.3-fpm
4. php artisan queue:failed --queue=payments

## Rollback
dep rollback  # Deployer 7 — document release path

## Escalate when
DB connections maxed OR rollback fails after 15 min

Our incident response runbook article expands this into severity levels and communication templates. Start there if you have nothing documented today.

Escalation PathAlert firesPrimary on-callNo ACK in 5 minPage secondarySev-1 after 30 minEng lead + stakeholder update
Clear escalation steps keep on-call rotations without burnout from turning one tired engineer into the only responder.

Define severity without drama

Use consistent severity labels across Slack, email, and your status page:

  • Sev-1: production down or data loss; all hands until stable.
  • Sev-2: major feature broken for many users; fix within hours.
  • Sev-3: degraded performance; next business day is acceptable.

Legal-tech portals such as Notary Nepal mix document uploads with payment flows. Tag which paths are Sev-1 before the first outage—not during it.

What compensation and recovery policies protect on-call engineers?

On-call is unpaid overtime unless you price it. Small agencies in Nepal often skip this step and wonder why senior developers refuse pager duty.

Compensation does not always mean cash. It can be comp time, reduced sprint load, or a fixed monthly stipend. What matters is that the exchange is visible and fair.

Policy options that work in small teams

ModelBest forTypical cost (Nepal)Burnout effect
Fixed monthly stipend2–5 person teamsRs 8,000–15,000 (~USD 60–110)Moderate reduction
Comp time (1:1 for night pages)Product teams with sprint slackTime, not cashStrong if honoured
Reduced ticket load during on-call weekAgencies with mixed support/devOpportunity costGood for focus
Contractor-only overnight coverageBusiness-hours-only shopsRs 15,000+ per weekBest for dev retention

After a Sev-1 that runs past 4 AM, give the responder the next morning off. Not as a favour—as policy. Sleep debt is real debt.

Burnout vs Sustainable On-CallBurnout patternSolo 24/7 pagerAlerts on every blipNo runbooksHero cultureUnpaid foreverResult: attritionSustainable modelRotating primarySLO-based pagesLinked runbooksBlameless reviewsComp time / stipendResult: retentionfix
On-call rotations without burnout replace hero culture with rotation, tuning, documentation, and recovery time.

Track on-call load like you track uptime. Count pages per shift, mean time to acknowledge, and repeat incidents. Feed repeats into testing and optimisation work so the same alert does not fire every Tuesday.

How do small dev teams reduce toil before the pager rings?

The best on-call shift is a boring one. Toil is manual work that returns every week—renewing certs by hand, clearing logs, restarting stuck workers. Automate it and you shrink the incident surface.

On sister sites sharing our Deployer 7 pipeline, most outages trace back to three themes: deploy config drift, cron pointing at old release paths, and disk filling from unrotated logs. All three are fixable without a platform team.

Automate the recurring fires

  1. Deployments: GitLab CI → Deployer 7 symlink swap → PHP-FPM reload. Document rollback in every runbook.
  2. Certificates: Certbot with HTTP-01 and a 30-day expiry alert—not a page at 3 days unless auto-renew failed twice.
  3. Queues: Supervisor with autorestart; alert on sustained failed count, not single job failure.
  4. Backups: nightly MySQL dump with restore test monthly; page only when backup job missing two runs.
  5. Provisioning: baseline server config via Ansible playbooks for PHP servers.

Payment integrations—eSewa, Khalti, Stripe—need webhook retry monitoring. A silent callback failure is worse than a loud 500 error. Log correlation IDs and alert when success rate drops.

Incident Learning LoopIncidentPage + fixPostmortemBlamelessAction itemsRunbook + codeAutomateFewer pagesEach loop shrinks on-call load over time
Blameless postmortems that ship automation are how on-call rotations without burnout get easier quarter after quarter.

Use blameless postmortems

Google's SRE practice treats incidents as system failures, not personal ones. A short postmortem within 48 hours captures timeline, root cause, and one preventive task. Reference the Google SRE postmortem guide for structure—not for corporate theatre, but for consistency.

Assign action items to the backlog with the same priority as feature work. An unscheduled fix will page you again. AIOps tooling can help spot patterns, but a spreadsheet of repeat alerts works fine at small scale.

Know when to buy help

If your team builds Laravel apps but nobody wants Linux at 3 AM, outsource overnight coverage. Linux system administration support and ongoing maintenance contracts cost less than replacing a senior developer who leaves after one brutal on-call quarter.

For API-heavy products, rate-limit and circuit-breaker patterns from our API rate limiting guide prevent cascading failures that turn a small bug into an all-night event.

Key Takeaways

  • Rotate primary on-call weekly with a mandatory secondary—never assign one person as permanent pager owner.
  • Page only for user-visible impact; downgrade disk, CPU, and single-job failures to tickets or dashboards.
  • Link every critical alert to a runbook with rollback steps, escalation timing, and copy-paste commands.
  • Pay on-call with stipends, comp time, or lighter sprint load—and enforce recovery after Sev-1 nights.
  • Automate recurring toil (deploys, certs, logs, queues) and close the loop with blameless postmortems.
  • Track pages per shift and repeat incidents; if the same alert fires weekly, fix the system—not the responder.

People Also Ask

How many people do you need for a healthy on-call rotation?

At minimum, three engineers for a one-week rotation so nobody is on-call two weeks in a row. Two people can work only with very quiet systems and explicit backup swaps. Below that, hire managed coverage or accept business-hours-only support.

What is alert fatigue and how do you fix it?

Alert fatigue happens when engineers receive too many non-actionable pages. Fix it by deleting noisy rules, adding for: duration thresholds, separating warnings from pages, and reviewing alert history monthly. If an alert never leads to action, remove it.

Should developers be on-call for infrastructure they did not build?

Whoever can restore service fastest should be primary—but they need runbooks and access. If legacy servers lack documentation, schedule a handover sprint before adding them to the rotation. Undocumented systems cause the worst burnout.

Is follow-the-sun on-call worth it for a Nepal-based team?

Follow-the-sun helps only when you have engineers in multiple time zones. A Kathmandu team serving US evening traffic should split late shifts between two people with defined hours—not extend one person's day to fourteen hours.

Build on-call that survives real production traffic

On-call rotations without burnout are not about caring less—they are about paging less, recovering faster, and sharing load fairly. Start with one week of rotation, tune your noisiest alert, and write a runbook for your most common 2 AM page. The pager will get quieter within a month if you treat every repeat incident as a bug in the system.

If your team runs Laravel, WooCommerce, or legal-tech portals on Linux and needs help designing alerting, runbooks, or overnight coverage, see our enterprise application development and hosting services. You can also browse the Mijar Law Associates portfolio for an example of a production client portal under active maintenance.

For structured incident data during reviews, paste logs into our JSON formatter or read more on the blog. When you want a second pair of eyes on your rotation policy, contact us—before burnout becomes your team's default on-call outcome.

Frequently Asked Questions

Burnout happens when paging is treated as hero duty instead of engineered reliability: solo 24/7 coverage, noisy alerts at 2 AM, no runbooks, unfair rotations, and no recovery after Sev-1 nights. Each false page erodes trust until real outages get ignored.

At minimum three engineers for one-week rotations so nobody covers two primaries back-to-back. Two people works only on very quiet systems with explicit backup swaps; below that, use managed overnight coverage or business-hours-only support.

Start by defining what on-call covers for your stack—application errors, queue failures, disk space, SSL expiry, payment webhooks, database connectivity—not every log warning. Use one-week primary shifts with a mandatory secondary who can take over within 30 minutes. For five to eight engineers, stagger primary and secondary weeks so nobody gets back-to-back primaries. Write a one-page policy covering max consecutive weeks, swap rules, holiday coverage four weeks ahead, and no Friday afternoon deploys unless the on-call engineer agrees in writing.

One-week rotations are the practical default for teams of two to four engineers, always paired with a backup responder. Teams of five to eight can run one-week primary plus one-week secondary on staggered schedules. Peak seasons—trekking bookings during Dashain, for example—need heavier planned coverage, not the same flat rotation year-round.

Use a two-tier model aligned with Alertmanager severity labels. Page humans only for user-visible impact: site down, checkout failure rate above 5% sustained ten minutes, queue backlog not draining for fifteen minutes, database unreachable. Downgrade disk above 75%, slow queries, certificate expiring in fourteen days, and single failed queue jobs to tickets, email, or dashboards. Before any new alert ships, confirm it detects a customer-visible symptom, has fired usefully in the last thirty days, is fixable without calling three people, and links to a runbook.

Alert fatigue is when engineers receive too many non-actionable pages and stop trusting alerts—so real outages get missed. Fix it by deleting or downgrading rules that never lead to action, adding duration thresholds with for clauses, separating warnings from pages, and reviewing alert history monthly. Track pages per shift; if the same alert fires every Tuesday, fix the system, not the responder.

Page immediately for HTTP 5xx on payment callbacks, production down, and checkout failure spikes affecting paying customers. Ticket for disk at 80%, certificate expiring in fourteen days, and failed cron on non-critical jobs. Dashboard only for deploy completed, cache warm, routine health checks, and two-minute CPU spikes. SSL at three days pages only during business hours unless auto-renew failed twice.

Every production alert should link to a runbook covering symptom, revenue impact, first five minutes with copy-paste commands, rollback steps such as dep rollback via Deployer 7, and clear escalation timing—escalate when DB connections max out or rollback fails after fifteen minutes. Build runbooks around services you actually run: Laravel queue workers, PHP-FPM pools, MySQL replication lag, Redis memory, WooCommerce cron, and payment gateway callbacks. Keep them in the wiki or repo your team already opens during incidents.

Rs 8,000–15,000 per month (~USD 60–110) as a fixed stipend works for two-to-five-person teams. Comp time at one-to-one for night pages is strong if honoured. Contractor-only overnight coverage runs Rs 15,000+ per week (~USD 110+) for business-hours-only shops. Reduced sprint load during on-call week costs opportunity time but helps focus. Unpaid pager duty drives senior developers away.

After a Sev-1 past 4 AM, give the responder the next morning off—as policy, not a favour. Enforce minimum rest: no non-urgent meetings before noon after a Sev-1 night. Allow swap requests with twenty-four hours notice and manager visibility. Track mean time to acknowledge and pages per shift. Sleep debt is real debt; recovery time is as important as rotation fairness.

Whoever can restore service fastest should be primary—but they need runbooks and access first. If legacy servers lack documentation, schedule a handover sprint before adding them to the rotation. Undocumented systems cause the worst burnout because the responder greps production logs from memory at 3 AM with no checklist to follow.

Follow-the-sun helps only when you have engineers in multiple time zones. A Kathmandu team serving US evening traffic should split late shifts between two people with defined hours—not extend one person's day to fourteen hours. Without geographic spread, weekly rotation with a secondary responder is more sustainable than pretending one timezone can cover global traffic alone.

Automate recurring fires: GitLab CI through Deployer 7 symlink swap with PHP-FPM reload, Certbot with HTTP-01 and thirty-day expiry alerts, Supervisor with autorestart on queue workers, nightly MySQL dumps with monthly restore tests, and Ansible baselines for PHP servers. Fix deploy config drift, cron paths pointing at old releases, and unrotated logs filling disk—the three most common outage themes on shared EC2 stacks. Monitor webhook retry rates for eSewa, Khalti, and Stripe integrations.

Blameless postmortems treat incidents as system failures, not personal ones. Hold a short review within forty-eight hours capturing timeline, root cause, and one preventive task. Assign action items to the backlog with the same priority as feature work—an unscheduled fix will page you again. A spreadsheet of repeat alerts works fine at small scale; the goal is closing the loop so the same alert does not fire every week.

Outsource when your team builds Laravel apps but nobody wants Linux at 3 AM, or when you have fewer than three engineers and cannot sustain fair rotation. Linux system administration and maintenance contracts cost less than replacing a senior developer who leaves after one brutal on-call quarter. Business-hours-only shops benefit most from contractor-only overnight coverage at roughly Rs 15,000+ per week rather than burning out the only two developers on staff.

Share this article

0 Comments

Leave a comment

Your email is not published. Comments appear once they have been read. Sign in to have your details filled in.

Quick Contact Options
Choose how you want to connect me: