DNC (Do Not Call)
The numbers your dialer must never call, and the three places VICIdial stores them.
DNC stands for Do Not Call: the set of phone numbers your dialer must skip. In VICIdial the check happens before a lead ever reaches the hopper, so a suppressed number is never staged, never dialed and never shown to an agent.
Three separate lists, two separate tables
This is the part that trips people up. VICIdial keeps system-wide and campaign-scoped suppression in different tables:
vicidial_dnc- the internal, system-wide list. One column,phone_number. A number here is blocked on every campaign on the dialer.vicidial_campaign_dnc- the campaign-scoped list, keyed onphone_numberpluscampaign_id. A number here is blocked on that campaign only and remains callable from others.
Federal and state registry data is a third category. It is not something VICIdial ships or refreshes for you: you subscribe to the registry, get the data, and load it into whichever of the two tables matches how you want it enforced. Load a national registry file into vicidial_dnc and it suppresses everywhere; load a state file into vicidial_campaign_dnc against a state-specific campaign and it suppresses only there.
Turning the check on
use_internal_dnc on the campaign accepts Y, N or AREACODE, and the schema default is N. A campaign will happily dial straight through a fully populated DNC table if this is left off - always confirm it on a new campaign rather than assuming.
Real-time opt-outs
The other way numbers land on the list is agents. A disposition whose status has the dnc flag set in vicidial_statuses writes the number to the DNC table when it is applied. If you have created a custom "do not call" code and numbers are not being suppressed, that flag is the first thing to check - the code will otherwise record perfectly and suppress nothing.
Operational advice
Treat the DNC table as append-only and keep the registry refresh on a schedule rather than doing it by hand. Suppression is cheap; a call to a listed number is not.