Platform
From list to record.
The whole loop, in the order an operator lives it: import the leads, build the campaign, pace the predictive dial under the line, work the cockpit, dispose and wrap, then read the record back. Every element below is the running product on demo data.
The list
A clean list before the first dial.
CSV import normalizes every number to E.164, derives a per-lead timezone from the number, and flags duplicates before they reach a campaign — so the dial set is calling real numbers, in the right hours, once.
| E.164 normalization | Every imported number is parsed to E.164 on the way in; malformed rows are surfaced, not silently dialed. |
| Per-lead timezone | Timezone is derived from the number itself, so calling windows are the lead's local hours — not the campaign's, not the server's. |
| Duplicate detection | Duplicates are flagged at import against the list, so the same person isn't worked twice across an upload. |
| Internal DNC at the door | Suppressed numbers are checked against the tenant DNC before they can ever enter a hopper. |
The campaign
Every knob an operator actually turns.
A campaign sets the dial method and drop target, the calling window, lead recycling, the caller-ID strategy, the script, and the webhooks. Settings that are stored are settings that are enforced — there are no decorative toggles.
Lead recycling is per status: a configurable retry delay and an attempt cap, with explicit lead order so the next number is never a surprise.
Pacing — dials placed against the live drop rate, under the line.
Dialing & pacing
Predictive that respects the 3% line.
A campaign's dial_method selects predictive or preview. In predictive, an adaptive ratio paces originations toward your drop target — it tightens when the floor is busy and reaches further when agents idle, holding the abandon rate under the FTC safe-harbor ceiling rather than chasing a fixed multiplier.
- 01Predictive: the engine dials ahead of free agents at an adaptive ratio, paced to the drop target
- 02Preview / manual: the lead lands on the agent first, or the agent places the call themselves
- 03Drop hold-window: an answered call with no free agent holds for the configured seconds and connects if one frees up
- 04Answering-machine detection is available as an advisory signal on the call, not a hard gate
The agent cockpit
A browser tab is the whole workstation.
Agents log in, click Ready, and talk — WebRTC audio straight to the media core. No desk phone, no softphone install, no Java applet.
Mid-call — lead card, history, and the script with {field} values filled in.
- 01Calls arrive with the lead card, call history, and a script with
{field}substitution already done - 02A scratchpad and call notes that persist on the lead, alongside the disposition
- 03Pause codes — BREAK, LUNCH, MEETING — so time off the dial is accounted for, not guessed at
- 04Scheduled callbacks — kept as the agent's own, or released to anyone on the campaign
- 05Manual dial with the same DNC gate as the predictive hopper
- 061:1 SMS to the lead is available where the carrier's 10DLC registration is in place
Disposition & wrap
Every call ends with an outcome on the record.
After hang-up the agent gets a wrap-up countdown, then a disposition they must pick before the next call. Nothing slips through as “unknown.”
| Required disposition | The agent picks an outcome before the next call is delivered — sale, no-answer, callback, DNC, and your own codes. |
| Wrap-up countdown | A per-campaign after-call window, hard or unlimited, so wrap time is bounded and measurable. |
| Notes & scratchpad | Free-text notes and a scratchpad persist on the lead next to the disposition for the next person who works it. |
| Callback ownership | Scheduled callbacks are the agent's own or released to the campaign, and resurface at the scheduled time. |
The record
Watch it live, then read it back.
A dashboard and live floor for what's happening now, CDR reports for what happened, and a recordings browser for what was actually said — stored on your own servers.
Live floor & dashboard — counters, today by hour, agent states.
Recordings — click a row and it plays in place. Seek, download.
| Live floor / wallboard | Real-time agent states, calls in progress, and drop rate against target, updated over a push event stream. |
| Dashboard | Today's counters and answer rates by hour, so a supervisor reads the floor at a glance. |
| CDR reports | A filterable call-detail browser with per-agent aggregates — by campaign, agent, phone, disposition, and date. |
| Recordings, your storage | Full-call recordings linked to the CDR, played in place, retained on the operator's own infrastructure. |
Integration & carrier
Hooks where your CRM expects them.
A start-of-call webhook fires as the agent connects — enough to screen-pop the right record. A disposition webhook fires when the call ends. Both carry the lead, campaign, and agent.
Calls ride your own SIP trunk: CalvyxDial registers against your carrier account, so minutes cost what your carrier charges — no per-minute markup, no bundles.
The start-of-call webhook is a GET to your endpoint with the call context as query params:
GET /start?lead_id=4821&phone=%2B16025550134&campaign=001&agent=1001phone is URL-encoded E.164. Point it at any URL that returns fast; the cockpit pops your screen with the result.
| Start-of-call webhook | Fires on connect with lead, phone, campaign, and agent — the screen-pop trigger. |
| Disposition webhook | Fires when the call ends, carrying the outcome the agent selected. |
| REST API | Programmatic access for the operations outside the cockpit. |
| Bring-your-own carrier | Registers against your SIP trunk (Telnyx or any SIP provider). No resold minutes. |
Under the hood
Multi-tenant in the database, not in the query.
Isolation between tenants is enforced by PostgreSQL row-level security — a query scoped to the wrong tenant returns zero rows because the engine refuses them, not because the application remembered a WHERE clause.
| Tenant isolation | PostgreSQL row-level security enforced in the database. Wrong-tenant queries return zero rows. |
| Agent audio | WebRTC (DTLS-SRTP) direct to the media core. The browser is the endpoint — no desk phone, no install. |
| Telephony core | Asterisk, chan_pjsip, ARI control plane — the engine drives calls over a WebSocket event stream. |
| Carrier | Your own SIP trunk. Per-campaign caller ID with DID rotation across your number pool. |
See the whole loop on your campaign.
Twenty minutes, your use case, live software — no slideware.
