A refusal should outlive the campaign it was said during
Someone tells your agent to stop contacting them. Where does that fact go? It sounds like a detail. It is the entire difference between a suppression list and a piece of theatre.
The obvious place is the wrong one
The natural instinct is to mark the row in the campaign — that is where the call happened, after all. But a campaign row is a line in one import. It is created when a spreadsheet is uploaded and destroyed when the campaign is cleaned up. A refusal stored there is forgotten by the next campaign, and the same person is rung again, by you, from the same number.
So the refusal belongs on the PERSON, in the directory, keyed on a normalised phone number so that a spreadsheet’s +34931071966 and a call’s 0034 931 07 19 66 are understood to be the same human being.
Then defend it from your own tidy-up
Storing it correctly is only half the job. Deleting a contact must not delete the refusal — otherwise routine housekeeping quietly un-suppresses everyone. Merging two records must keep it. And a new call must never clear it: being rung is not consent to be rung again.
- One implementation of the check, called by every path that can dial.
- Checked before the call record exists, so a suppressed person leaves no billed row.
- A lookup that fails is treated as a refusal, not as permission.
That last one matters more than it sounds. When the database blips, the two options are "ring someone who may have refused" and "miss one dial". Only one of those is ever the right default.
Stop losing the calls you cannot get to.
Talk to a real agent first. It takes about two minutes.