Skip to content

Product · The CRM for phone outreach

Every call, on one record

Open one contact the morning after a campaign and you have the whole answer: who you reached, what they said in their own words, which campaign dialed them, and who asked you to stop. Every field of it is a /v1 call, so it belongs to you whether you open the dashboard or never do.

A person checks their phone and smiles as campaign outcomes land (Illustrative footage.)

From a dial to a record somebody can open

  1. 1

    The dial is authorized on the record

    Before anything rings, the gate reads this contact’s own row: internal do-not-call state, consent class, jurisdictions, and the callee’s local clock. The verdict and everything it read are kept on the attempt.

  2. 2

    The call becomes usable evidence

    Authenticated /v1 call reads return ordered turns and, where available, the transcript or recording for that call. Nobody retypes a call into a CRM at the end of the day.

  3. 3

    The attempt is disposed

    One value from a pinned vocabulary of fifteen: completed, answered but incomplete, voicemail, no answer, opted out, refused by policy, and the rest. Fifteen values means your reports add up.

  4. 4

    It lands on the contact

    Beside every other attempt anyone in your workspace ever made to this person, whichever campaign made it, whichever agent ran it.

  5. 5

    And it leaves again

    For enabled events, signed call.ended delivers the disposition, timing, record identifiers, and evidence availability at call completion. Structured surveys and shift confirmations have their own configured signed outcome events; their resources and supported CSV record types remain available through /v1 and export jobs.

Dispositions are append-only. When your reviewer disagrees with the agent’s label, the review lands as its own row and the record says which verdict came from whom.

Built for the fields you actually dial on

A general-purpose CRM has a phone field. This one has a timezone, because the calling window is computed in the callee’s local clock; jurisdictions, because the policy resolves against them; and a consent class, because the gate reads it before every attempt. Your own columns come along too, kept as custom fields the API reads and writes.

Tags and lead status are yours to move around freely. Stopping a call is a separate field with its own write path, and the screen where you set a tag says so, so nobody on your team has to guess which one holds a stop request.

What one contact carries

  • Phone in E.164, name, company, title, email
  • Timezone and jurisdictions, the two facts the calling window is computed from
  • The best consent class held, and every consent record behind it, with its source and capture date
  • Internal do-not-call state, read from the list itself rather than a cached flag on the row
  • Tags, lead status, owner, and every list this contact belongs to
  • Custom fields, carried in from your CSV columns and your API writes
  • Notes in your own words, each one optionally pinned to the call it came from
  • Follow-up context your team records on the contact

One person, open

The whole history, and the state that governs the next dial

Campaigns are how work gets scheduled. People are how it gets remembered. Open a contact and the attempts arrive in one column no matter which campaign placed them, with the consent and suppression facts sitting right beside them.

contact ctc_01J9…H3D

Product UI · synthetic data

Dale Whitcomb · Whitcomb Freight

Aug 09 · call
completed_goal · interested · Renewals Q3
Aug 07 · call
no_answer · retried inside your caps · Renewals Q3
Jul 28 · note
“Asked us to try after the 1st.” · R. Okafor
Jul 22 · call
opt_out · number suppressed · Spring Reactivation

Two campaigns, one column. Notes sit on the record beside the calls, and the call log filtered to this contact carries the full history behind them.

dialability ctc_01J9…H3D

Product UI · synthetic data

dialability
GATE REFUSED · purpose: marketing
refusals
internal do-not-call
callee_timezone
America/Chicago
jurisdictions
us, tx
suppression
internal · via opt_out · from cal_01J9…M2X
consent
pewc · revoked · web form · captured Mar 4
evaluated
Aug 11, 2026, 9:14 AM

Evaluated over this contact’s own record: the internal do-not-call flag, the consent class, the jurisdictions, and the callee’s local clock, against the policy in force at that moment.

The second panel names the inputs the gate read and the verdict it returned, which makes it a record of the check rather than a legal clearance.

In and out

A system of record with doors on both sides

Import contacts, follow calls and caller requests in one workspace, then move supported records through CSV exports, receive signed call and configured-outcome webhooks, or fetch a /v1 read.

CSV in, with a receipt

Map your columns to the fields, sign the consent attestation the import requires, and get back counts you can act on: accepted, rejected, skipped. Every rejected row comes back with its row number, its reason code, the column and the value that failed, as JSON or as a CSV you hand to whoever owns the spreadsheet.

Bulk actions, one transaction

Up to a thousand contacts at once: add to a list, remove from one, set lead status, suppress, delete. Suppress is not a flag write. It takes the same revocation path a single opt-out takes, so the do-not-call entry, the event, and the withdrawal of the consent behind that number all land together or none of them do.

CSV exports, selected for the job

Choose a supported record type: contacts, attempts, calls, survey responses, shift confirmations, appointments, do-not-call entries, scrub results, usage events, or caller requests. Add filters and columns, then a completed job provides a signed CSV download for its time-bounded window.

Webhooks with a delivery trail

The call-completion event and the outcome events you enable—including survey.completed and shift.confirmed—reach the endpoint you register, signed with a secret you control. Inspect the delivery history and redrive an exhausted delivery when your endpoint recovers.

Caller requests, ready to work

Messages, tickets, and callbacks an agent takes during a call enter a native Inbox, where your team can acknowledge, assign, or resolve the next step.

Keep your existing system of record

If your stack is already the system of record, drive /v1 directly with your own Twilio, create each contact as you dial it, and receive configured signed call-completion and structured-outcome events on your webhook. The workspace and API use the same engine, rates, and policy controls, so your team can keep the system it already runs while adding voice operations.

The headless version

The trust close

Every call leaves proof, on every plan

You choose who to call, on your own carrier account, and that choice stays yours. What the platform contributes is enforcement and memory: the AI disclosure played before the first model token, opt-out detection writing your internal do-not-call list, that list applied at the batch run and re-checked again at dial time, and phone normalization. Four controls no plan, flag, or support tool disables.

On top of them, every attempt runs inside the calling window in the contact’s local time, under the frequency caps, against the consent standard and the recording-consent class, and the values that bound it are written onto the attempt. The basis you gave for calling that number travels with the contact into every attempt, so a record pulled a year later still answers why the phone rang.

That is why a campaign run here is still answerable six months later: the panels on this page record what happened and refuse what you told them to refuse, and the evidence file behind each one holds up when somebody asks.

What getting started actually looks like

Sandbox first, then a contract, then production. The rate card and the $0 compliance floor are laid out on the pricing page.

Start in the sandbox

A free sandbox account gets you the whole workspace, no credit card. Import a list, work a contact record end to end, and hear the simulated demo calls.

What you bring

Your contacts and the consent basis behind them, by CSV or one at a time through the API, whichever your stack prefers. Purchased, rented and appended lists come in the same doors under the Cold Outreach & Data Provenance Waiver you sign, and every import carries a signed record of where the contacts came from.

Production on your carrier

When your workspace is ready, choose a plan, add a payment method, connect your own Twilio subaccount, and activate production from the portal. Your numbers, registrations, and carrier bill stay with the account you own.

Somewhere for the answers to live. Included, on every plan.

Start free in the sandbox