Skip to main content
CalvyxDial

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 normalizationEvery imported number is parsed to E.164 on the way in; malformed rows are surfaced, not silently dialed.
Per-lead timezoneTimezone is derived from the number itself, so calling windows are the lead's local hours — not the campaign's, not the server's.
Duplicate detectionDuplicates are flagged at import against the list, so the same person isn't worked twice across an upload.
Internal DNC at the doorSuppressed 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 dispositionThe agent picks an outcome before the next call is delivered — sale, no-answer, callback, DNC, and your own codes.
Wrap-up countdownA per-campaign after-call window, hard or unlimited, so wrap time is bounded and measurable.
Notes & scratchpadFree-text notes and a scratchpad persist on the lead next to the disposition for the next person who works it.
Callback ownershipScheduled 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 / wallboardReal-time agent states, calls in progress, and drop rate against target, updated over a push event stream.
DashboardToday's counters and answer rates by hour, so a supervisor reads the floor at a glance.
CDR reportsA filterable call-detail browser with per-agent aggregates — by campaign, agent, phone, disposition, and date.
Recordings, your storageFull-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=1001

phone is URL-encoded E.164. Point it at any URL that returns fast; the cockpit pops your screen with the result.

Start-of-call webhookFires on connect with lead, phone, campaign, and agent — the screen-pop trigger.
Disposition webhookFires when the call ends, carrying the outcome the agent selected.
REST APIProgrammatic access for the operations outside the cockpit.
Bring-your-own carrierRegisters 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 isolationPostgreSQL row-level security enforced in the database. Wrong-tenant queries return zero rows.
Agent audioWebRTC (DTLS-SRTP) direct to the media core. The browser is the endpoint — no desk phone, no install.
Telephony coreAsterisk, chan_pjsip, ARI control plane — the engine drives calls over a WebSocket event stream.
CarrierYour 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.