Do-Not-Call (DNC)

Do-Not-Call (DNC)

The Do-Not-Call list is your organization's suppression list — phone numbers that Telenow must never dial. Add the people who opt out, complain, or otherwise can't be contacted, and the dialer leaves them alone: across every campaign, and on operator-initiated single calls too.

The list is org-wide. One entry suppresses a number everywhere in your organization, no matter which campaign or agent would have placed the call. Keeping it current is the backbone of TCPA / DNC compliance, so it's worth wiring opt-outs straight into it (see Automating it).

Everything below can be done end-to-end from the dashboard. To script it, see the Do-Not-Call API.

Opening the list

Go to Do-Not-Call in the sidebar (under Telephony). You'll see:

  • A search box (top left) that filters by phone number or reason.
  • Export, Import CSV, and Add number buttons (top right).
  • A table of suppressed numbers, newest first, with these columns:
ColumnWhat it shows
NumberThe suppressed number, stored in canonical form (+ and digits only).
ReasonWhy it was added (optional free text), or if none. For an entry the agent recorded during a call, this is also where Listen to the call appears — see The proof behind a caller opt-out.
SourceHow it got there — Added by hand, Imported, Caller opted out, and so on (see Source values).
AddedWhen the entry was created.

The list is paginated at 100 rows per page (DNC lists legitimately reach six figures), with Previous / Next controls at the bottom. Searching resets you to the first page.

Who can edit: anyone in the org can view the list. To add, import, remove, or bulk-remove, you need the owner, admin, or developer role. Viewers see the table but the action buttons are disabled with a "Requires developer or admin role" tooltip.

Adding a number manually

  1. Go to Do-Not-Call in the sidebar → click Add number.
  2. Enter the Phone number. E.164 (e.g. +14155550123) is recommended, but formatting is forgiving — spaces, dashes, and parentheses are stripped automatically (+1 (415) 555-0123 becomes +14155550123).
  3. Optionally enter a Reason (e.g. customer request, complaint). This is just a note for your team — it doesn't affect dialing.
  4. Click Add. A toast confirms "Number added to Do-Not-Call list."

A few details worth knowing:

  • Canonicalization. The leading + is kept and every other non-digit is dropped. A value with no digits at all (e.g. n/a or a stray header) is rejected as "not a dialable number."
  • Re-adding is safe. If the number is already on the list, the entry is updated (its reason is refreshed if you supply a new one) rather than duplicated — you'll never get two rows for the same number.

Importing a list (CSV / plain text)

For more than a handful of numbers, import a file.

  1. Go to Do-Not-Call in the sidebar → click Import CSV.
  2. Pick a .csv or .txt file.
  3. The numbers are added immediately and a toast reports the result, e.g. "Imported 1,240 numbers · 12 skipped."

File format

The importer is deliberately flexible. It reads the file line by line; no header row is required:

  • One number per line — the simplest form:

    +14155550123
    +14155550124
    +14155550125
    
  • phone,reason per line — add an optional reason in a second column:

    +14155550123,customer opt-out
    +14155550124,complaint
    +14155550125
    

Each line's first column is the number; an optional second column is the reason. Surrounding quotes and whitespace are trimmed. If you export from a spreadsheet, a header row like phone_number,reason is harmless — it has no digits, so it's simply counted as one skip.

What "skipped" means

The toast reports added and skipped counts. A line is skipped when:

  • It has no digits to dial (blank line, a header row, junk text), or
  • The number is already on the list (re-importing the same file the next day won't create duplicates — every existing number just lands in the skipped count).

Only genuinely new, dialable numbers count toward added.

Removing numbers

You can take numbers back off the list at any time — handy when someone re-consents.

One at a time

In the table, click the trash icon at the end of the row and confirm. The dialog says what removal actually does — the dialer can call the number again, and targets already skipped are not un-skipped.

For an entry the agent recorded during a call, the dialog says so, warns that the removal cannot be undone, and offers Listen to the call first so you can check the request was real before withdrawing it. Withdrawing one is recorded in your audit log along with the number, the call and the date the opt-out was originally made, so a removal made in error can be reconstructed.

Bulk remove (multi-select)

  1. Tick the checkbox on each row you want to remove, or use the header checkbox to select every row on the current page.
  2. A blue bar appears above the table showing "N selected" and a Remove selected button.
  3. Click Remove selected. A toast confirms "Removed N entries."

Caller opt-outs are never bulk-removed. Entries with a source of opt_out — the ones added because a caller asked, on a recorded call, not to be contacted again — are skipped by bulk remove even when selected. The toast tells you how many were kept. They're the record you'd answer a complaint with, so a re-uploaded list plus a select-all can't wipe them in one click. If you genuinely need to remove one, use one at a time above.

Selection is per page. The header checkbox selects only the 100 rows currently visible, not the entire list across pages — selecting and removing is intentionally an explicit, by-ID operation. To prune in bulk by a pattern, search first to narrow the table, then select and remove page by page. (The API caps a single bulk-delete at 10,000 ids.)

Removing a number lets the dialer call it again going forward. It does not revive calls that were already suppressed in a campaign — see the timing rules below.

Exporting the list

Click Export (top right) to download the list as a CSV named dnc-list.csv. If a search term is active, the export honors it, so you can export just the matching subset.

The CSV has these columns:

ColumnNotes
phone_numberCanonical + + digits.
reasonEmpty if none was set.
sourcemanual / csv / opt_out / client.
added_atRFC 3339 (ISO 8601) timestamp.
session_idThe call a caller opted out on, for opt_out entries. Empty for every other source, and for an opt-out whose call has since left your account.

Export is capped server-side at 500,000 rows — far above what any realistic list needs, but worth knowing if yours is enormous.

How suppression works

The DNC list is enforced in two complementary places, so a suppressed number is protected no matter how a call would have been placed.

Campaign dialing

When you upload targets to a campaign (CSV/Excel file, manual add, or the JSON API), every number is normalized and checked against your DNC list. Any match is not added to the campaign — it's silently dropped and counted as suppressed in the result. The dashboard tells you, e.g. "Added 480 targets · 20 skipped (Do-Not-Call)." No call is ever queued for those numbers.

There's a second safety net at dial time. If you add a number to the DNC list after its targets are already in a campaign, Telenow sweeps the campaign's still-pending calls and flips any newly matching ones to suppressed — so they're skipped instead of dialed. (If suppressing the last actionable calls leaves a running campaign with nothing left to do, it auto-completes.)

The one thing it does not do is reach back into calls that have already happened. A target that already completed, failed, or was actively dialing isn't undone. And the reverse is true too: removing a number from the DNC list does not resurrect a campaign call that was already marked suppressed — to dial that number again, re-upload it as a fresh target.

In short: suppression catches a number at upload and again at dial time, but it can't change calls that are already done.

Single (operator-initiated) calls

The list also guards calls placed outside campaigns — the click-to-dial / outbound API, the softphone, and live-call transfers. If you try to dial a suppressed number, the request is rejected with a 403 and the message:

+14155550123 is on this organization's Do-Not-Call list and cannot be dialed

This check is tolerant of formatting — it compares digits only, so a number stored as +14155550123 still blocks a dial typed as (415) 555-0123.

Source values

The Source column records how each entry was created:

SourceMeaning
manualAdded one at a time via Add number in the dashboard.
csvAdded via Import CSV (or the bulk-import API).
apiAdded programmatically through the Do-Not-Call API. (The API currently records these as manual.)
clientAdded by one of your clients from their own portal, if you resell Telenow.
opt_outThe caller asked, on a call. Most often the agent's own opt_out tool or the keypad opt-out key; also written when you revoke consent for a number. Entries the agent recorded carry the call itself — see The proof behind a caller opt-out.

Opting out during a call

Two routes add a number to this list from inside a live call. Both write the same entry, and both resolve the caller's number server-side from the call itself — never from anything spoken — so nobody can suppress a third party by reading out their digits.

The agent's opt_out tool. Every voice agent carries it automatically. When a caller clearly asks to stop being contacted — "don't call me again", "remove my number", "mujhe call mat karo" — the agent records the opt-out and confirms it. Requests that only defer ("call me later", "I'm busy") are not opt-outs and don't trigger it.

It depends on the agent recognising the request, so it is not a guarantee. Which is what the second route is for.

A keypad key. Set DTMF_OPT_OUT_DIGIT (for example 9) and a caller pressing that key is suppressed immediately — no speech recognition, no language barrier, no judgment call. Announce it in your opener ("press 9 at any time to be removed from our list") and it becomes the one opt-out route that cannot be missed or misread.

Two things to know before enabling it:

  • It is off until you set the digit, on purpose. Turning it on repurposes that key for every agent on your deployment. If one of your agents already says "press 9 for sales", those callers would be suppressed instead of routed. Pick a key nothing else uses.
  • The confirmation is fixed text. A keypress carries no language, so there's nothing to infer one from. The default is English — set DTMF_OPT_OUT_MESSAGE to whatever your callers actually speak.

Both routes show a source of Caller opted out, and both attach the call.

The proof behind a caller opt-out

Neither route involves a person on your side: the agent decides, live, that what it just heard was a request to stop calling. So every entry it records carries the call it was recorded on, and the list page turns that into a Listen to the call link right under the reason.

Follow it and you get the ordinary call page — the recording, the transcript, the agent that took it. That is the whole point: it is the difference between an entry you have to take on trust and one you can check. Speech recognition is not perfect, and "don't call me on this number, use my mobile" is exactly the sort of sentence an agent can hear as an opt-out.

If it was a mistake, remove the entry — the trash icon on that row, which is the only place a caller opt-out can be removed. Bulk remove refuses them on purpose.

Two things the link cannot always give you:

  • The call is there but its content is not. Recordings and transcripts expire on your content-retention policy; the call record itself does not. The row says "Recording and transcript have passed your retention window" and the link still shows you when the call happened, how long it ran, and which agent took it.
  • No call on record. Consent revocations you make yourself are opt_out entries with no call, and so are a handful of older agent-recorded entries whose reference was overwritten by a later manual re-add. The row says "No call on record for this request" rather than pretending it was typed by hand.

Automating it

To keep opt-outs flowing in without manual work, drive the list from the Do-Not-Call API: POST a number the moment a contact opts out (for example from a CRM workflow, an SMS "STOP" handler, or a post-call webhook that detects an opt-out intent). Numbers added this way show a source of api. This is the most reliable way to honor opt-outs in real time, since the next campaign upload will already suppress them.

Tips

  • Add opt-outs immediately, not at the next upload. Because suppression is also re-checked at dial time, adding a number mid-campaign stops its still-pending calls — but it can't recall a call already in progress. The sooner it's on the list, the safer.
  • Use the reason field. A short note (complaint 2026-06-01, wrong number) makes audits and the audit log far easier later.
  • Search before bulk-removing. Narrow the table with a search term, then multi-select — it's the cleanest way to take a batch back off.
  • Re-import freely. Imports are idempotent: existing numbers just count as skipped, so you can safely re-run yesterday's file.

Troubleshooting

  • "not a dialable number" — the value you entered has no digits (or only a +). Enter a real phone number in E.164.
  • A number I uploaded never gets called — it's on the DNC list. Open the campaign's target list and look under the skipped chip, and check the import toast's suppressed count. Remove it from the list (if appropriate) and re-upload the target.
  • "… is on this organization's Do-Not-Call list and cannot be dialed" — you tried to place a single call to a suppressed number. Remove it from the list first if the contact has re-consented.
  • Import added fewer than expected — duplicates and lines with no digits (including a header row) are counted as skipped, not added. Check the file for blank lines and non-numeric rows.
  • The action buttons are greyed out — you have a viewer role. Editing the DNC list needs owner, admin, or developer.