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.
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.
- Predictive: the engine dials ahead of free agents at an adaptive ratio, paced to the drop target
- Preview / manual: the lead lands on the agent first, or the agent places the call themselves
- Drop hold-window: an answered call with no free agent holds for the configured seconds and connects if one frees up
- Answering-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.
- Calls arrive with the lead card, call history, and a script with
{field}substitution already done - A scratchpad and call notes that persist on the lead, alongside the disposition
- Pause codes — BREAK, LUNCH, MEETING — so time off the dial is accounted for, not guessed at
- Scheduled callbacks — kept as the agent's own, or released to anyone on the campaign
- Manual dial with the same DNC gate as the predictive hopper
- 1:1 SMS to the lead is available where the carrier's 10DLC registration is in place
Mid-call — lead card, history, and the script with {field} values filled in.
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.”
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.
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.
phone is URL-encoded E.164. Point it at any URL that returns fast; the cockpit pops your screen with the result.
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.
See the whole loop on your campaign.
Thirty minutes, your use case, live software — no slideware.
