What’s actually in the box
Five things a webhook can do once it reaches CallPing.
CallPing started as “webhook in, phone call out” and it still is that — but the routing, scheduling, and escalation logic underneath has grown up. This is the full feature set as it ships today, not a roadmap slide.
Five chapters: how alerts get routed to the right person, how schedules track real shifts, how escalation handles the ones nobody picks up, what we can tell you about a call after it ends, and how the account layer holds up once more than one person is involved.
01
Route on more than severity.
A webhook rarely carries just a severity level. It carries a
message, an environment, a service name, a region, a customer
tier — anything the sending tool decided to include.
CallPing’s routing rules can match on any of it. Rules run
in order, top to bottom, first match wins:
severity in ["critical","major"],
sure, but also
message contains "OOM" or
environment starts_with "prod-eu"
or service exists. Twelve
operators cover equality, membership, substring matching,
existence checks, and numeric comparison — in,
nin, contains,
not_contains, starts_with,
ends_with, exists,
not_exists, gt, gte,
lt, lte.
Matched rules don’t just decide whether to call — they decide who. A rule can ring the primary phone, everyone on the roster, whoever’s on shift right now, a named Project (a subset of your team — “database,” “payments,” “support”), or one specific person by name regardless of what shift they’re on. Projects fall back to the primary phone if the project has no active members, so a routing rule never silently points at an empty room.
And when nothing matches — the alert your tool sent doesn’t fit any rule you wrote — the scenario still has to do something. That “something” used to be hardcoded to ring the primary phone, which for a team meant an arbitrary person could get called even if they were off shift. It’s now a per-scenario setting: ring the on-call schedule, ring everyone, or ring the primary phone, your choice, picked in the scenario editor under “When no rule matches.” Solo scenarios skip the schedule option entirely — there’s no roster to check against.
- 12 matching operators across any field your payload sends — severity, message text, environment, service, whatever
- Ordered rule list per scenario, first match wins
- Route to a Project (a named team subset) or to one specific teammate by name
- Configurable catch-all default per scenario: on-call schedule, everyone, or primary phone
- Projects and named-member routing fall back to the primary phone rather than failing silently
02
Schedules that reflect how shifts actually run.
Every phone number can carry its own weekly template — Monday through Sunday, hour ranges per day — plus per-date overrides for the actual exceptions that templates never predict: a holiday swap, someone covering a sick day, a one-off change to Thursday’s window. The call_on_schedule routing action only rings phones whose schedule says they’re on right now; nobody gets woken up for someone else’s shift by mistake.
As of v1.28.0, a shift can end at 24:00 — midnight, expressed as the end of the day rather than looping back to 00:00. That sounds like a rounding-error fix and it mostly is one, but it closed two real gaps at once: a roughly 24-hour end-of-day boundary that previously left a sliver of the day uncovered, and CSV imports that failed outright when a shift was written as ending at midnight (a spreadsheet convention most schedule tools use without a second thought).
Building and reviewing a schedule by hand, one day at a time, doesn’t scale past a handful of people. CSV import and export handle the bulk case — upload a spreadsheet with a preview step before anything commits, and the roster reorders by drag-and-drop rather than by editing a sort column. The portal’s default schedule view is a monthly calendar landing on today’s week, so you’re looking at “who’s on this week” the moment you open it, not last month’s leftover view.
- Weekly recurring template per phone, hour ranges per day
- Per-date overrides for holidays, swaps, and one-off changes
- Shifts can end at 24:00 / midnight — true end-of-day coverage, no manual workaround
- CSV import and export, with a preview step and drag-to-reorder roster
- Monthly calendar view, defaults to the current week
03
When nobody answers, escalate — automatically.
A routing rule can carry an escalation chain: up to 10 steps, each one a target (the primary phone, everyone, the on-call schedule, a Project, or a named member) and a delay before it fires — anywhere from immediate to 15 minutes. If the first call goes unanswered, the next step in the chain gets enqueued on schedule. No manual retriggering, no separate on-call tool bolted on the side.
The harder problem than “ring again” is “know when to stop.” CallPing treats an answer, an active decline, and a busy/engaged line the same way: all three close out the alert immediately and cancel every other phone still ringing for it, so a five-person fan-out doesn’t turn into four more phones ringing after someone already picked up or the line was engaged. Only a genuine no-answer advances the chain. The distinction matters in practice: a busy signal or an actively declined call means the call reached a real phone, which is a different signal than one that simply never got picked up.
For teams that would rather not ring everyone at once, a round-robin dial strategy dials on-call members one at a time in fair rotation instead of all simultaneously — spreads the load across the roster and still stops as soon as someone answers or declines.
- Escalation chains up to 10 steps, each with its own delay (up to 15 minutes)
- Steps can target the primary phone, everyone, the on-call schedule, a Project, or a named member
- First-ack-wins: an answer, an active decline, or a busy/engaged line stops every other ringing leg — no zombie re-rings
- Only a genuine no-answer advances the chain
- Round-robin dial strategy: one person at a time, fair rotation, instead of ringing the whole roster simultaneously
04
Know what actually happened on the call, not just that it ended.
A call that rings through to voicemail isn’t a call that got answered, even though the line technically connects — today, it’s still logged as one. Answering-machine detection is being built to listen for the difference between a human picking up and a machine pickup — voicemail, an interactive voice response (IVR) tree — and, once it ships, will treat the machine case like the no-answer it actually is, advancing an escalation chain instead of marking the alert as delivered to nobody.
Every call resolves to one of five terminal statuses, mapped from the actual SIP/PBX cause codes Asterisk reports back, not a generic “call ended”: answered, busy, no-answer, canceled, or failed. (“Declined” isn’t a separate status — it’s the reason recorded on a busy disposition when the line was actively rejected rather than simply engaged.) That distinction is what lets first-ack-wins and escalation make the right call (see Chapter 3) — a busy line and a no-answer aren’t the same signal, and treating them as interchangeable would either stop an alert that should keep escalating or keep escalating one that already reached a real phone.
Zoom out from any single call and the on-call analytics page — live today, still being refined — shows answer rates and per-member call load over time — who’s actually picking up, and who’s carrying more of the pager than everyone else. It’s the view you pull up when a rotation feels unbalanced and you want the numbers instead of a guess.
- Answering-machine detection In progress — will distinguish a voicemail pickup from a real answer; until it ships, a voicemail pickup logs as answered
- Five-way disposition truth: answered, busy (declined is a reason recorded on busy), no-answer, canceled, failed — read from real SIP/PBX cause codes
- On-call analytics In progress: answer rates and per-member call load
- Full call log with per-attempt detail for every call CallPing places
05
Built for teams, not just one inbox.
People belong to more than one organization in real life — a contractor working two clients, an engineer who moved teams but still gets pulled into the old one’s incidents. CallPing’s multi-org membership lets one login hold multiple orgs at once, with an org switcher to move between them; no separate accounts, no separate passwords to remember.
Ownership isn’t pinned to a single founder account either — an org can have any number of owners, so losing access to one person’s login doesn’t mean losing control of the org. Time-based one-time password (TOTP) two-factor authentication is available to lock down login, and sensitive actions — changing a member’s role, rotating an API key, deleting a project — require a fresh re-authentication even within an already-logged-in session, so a stolen session token alone isn’t enough to do damage.
Every meaningful account action — who turned a phone on or off, who changed a member’s role, who deleted what — lands in a 90-day audit log per org. It’s there so “who did that and when” has an answer that isn’t “check everyone’s memory.”
- Multi-org membership with an org switcher — one login, multiple teams
- Multiple owners per organization — no single point of failure on the account
- TOTP two-factor authentication
- Step-up re-authentication required before sensitive changes, even mid-session
- 90-day audit log across every organization
Every feature on this page is live today, except the two marked “In progress.”
CallPing is designed so a few minutes of setup gets a webhook wired to a ringing phone. Every diagram and code sample on this page reflects the system exactly as it runs today — the two badged items aren’t there yet, and we’ve said so. We’re gathering interest before opening sign-ups.
No AI voice. No recorded messages. The call itself is the alert. Do not use CallPing as the only alerting channel for life-critical or safety-critical systems.