
September 11, 2026
11 min read
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.
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.
- Maximum consecutive primary weeks: one, unless the team opts in with extra pay or comp time.
- Minimum rest after a Sev-1 night: no non-urgent meetings before noon the next day.
- Swap requests allowed with 24 hours notice and manager visibility.
- Holiday coverage planned four weeks ahead—Nepal public holidays included.
- 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:
- What customer-visible symptom does this detect?
- Has this fired without action needed in the last 30 days?
- Can the on-call engineer fix it without calling three other people?
- 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 type | Should page? | Typical fix time | Burnout risk |
|---|---|---|---|
| HTTP 5xx on payment callback | Yes, immediately | 15–60 min | Medium if runbook exists |
| Disk 80% on app server | No—ticket | Next business day | Low |
| Single failed queue job | No—auto-retry | Automated | Low |
| SSL cert expires in 3 days | Yes, business hours | 30 min | Low with Certbot cron |
| CPU spike for 2 minutes | No—dashboard | Monitor | High 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.
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
| Model | Best for | Typical cost (Nepal) | Burnout effect |
|---|---|---|---|
| Fixed monthly stipend | 2–5 person teams | Rs 8,000–15,000 (~USD 60–110) | Moderate reduction |
| Comp time (1:1 for night pages) | Product teams with sprint slack | Time, not cash | Strong if honoured |
| Reduced ticket load during on-call week | Agencies with mixed support/dev | Opportunity cost | Good for focus |
| Contractor-only overnight coverage | Business-hours-only shops | Rs 15,000+ per week | Best 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.
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
- Deployments: GitLab CI → Deployer 7 symlink swap → PHP-FPM reload. Document rollback in every runbook.
- Certificates: Certbot with HTTP-01 and a 30-day expiry alert—not a page at 3 days unless auto-renew failed twice.
- Queues: Supervisor with autorestart; alert on sustained
failedcount, not single job failure. - Backups: nightly MySQL dump with restore test monthly; page only when backup job missing two runs.
- 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.
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
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.

