Most systems store consent as a single field: marketing_opt_in: true. Then a complaint arrives and someone asks when it was given, for what, on which channel and how — and the answer is a shrug.
Consent here means a person's permission for you to contact them for a given purpose. Handling it well is a legal duty in most places, and it is also good business.
Interactive figure
What consent actually permits
You may send
- Order receipt
- Delivery updates
You may not send
- Promotional broadcast
- Win-back campaign
- Free-form conversation
Grant a permission and watch what becomes sendable.
Five questions a yes/no field cannot answer#
- When? Consent ages. Expectations about refreshing or re-confirming old permission vary by country and by industry code, but "they ticked a box in 2017" rarely ends a complaint well.
- For what? Agreeing to delivery updates is not agreeing to weekend promotions. If both read the same field, you cannot honour the difference even if you want to.
- On which channel? Permission to email is not permission to text or to message on WhatsApp. This is the most common modelling error in the category.
- How? A ticked box at checkout, a texted keyword and a verbal yes on a call carry different weight as evidence. "The field was true" is not evidence.
- Was it withdrawn? Under the EU's GDPR (Article 7), withdrawing consent must be as easy as giving it, and many other regimes have similar expectations. Withdrawal must take effect everywhere — including in a campaign that is already queued.
What a single "marketing_opt_in: true" cannot tell you
- When?
Consent ages, and "they ticked a box in 2017" rarely ends a complaint well
- For what?
Delivery updates are not weekend promotions
- On which channel?
Permission to email is not permission to text or to message on WhatsApp
- How?
A checkout box, a texted keyword and a verbal yes weigh differently as evidence
- Was it withdrawn?
Withdrawal must reach everything, including a campaign already queued
The shape that works: a ledger#
Not a field on the contact. An append-only ledger — a log you only ever add to — of grants and withdrawals. Your current permission is then a query over the ledger ("latest event for this person, channel and purpose"), not a stored value.
A few rows for one customer might look like this:
| When | Identifier | Channel | Purpose | Event | Mechanism | Evidence |
|---|---|---|---|---|---|---|
| 3 Mar | +44 7700 900123 | SMS | Delivery updates | Granted | Checkout form | Order 58213 |
| 3 Mar | ana@example.com | Newsletter | Granted | Checkbox | Form submission 9912 | |
| 18 Jun | +44 7700 900123 | SMS | Delivery updates | Withdrawn | Replied STOP | Inbound message 77410 |
What one row in the ledger has to carry
- Subject
The person, plus the exact address (number, email) the event applies to.
- Channel and purpose
Never "all". A grant that cannot say where and what for cannot be enforced.
- Timestamp
Of the event itself, not of when the row was inserted.
- Mechanism
Web form, keyword, verbal, imported. Different weights as evidence.
- Evidence reference
A pointer to the proof: form submission ID, call recording ID, inbound message ID.
- Source system
Where it came from. Matters a great deal after an acquisition or a migration.
This sounds like extra work. It is much less work than reconstructing history from application logs the first time someone asks.
Consent is not the same as preference#
Worth separating, because mixing them up costs you reachable customers.
- Consent is whether you may contact someone at all for a purpose. A legal question with a yes or no answer.
- Preference is how they would like to be contacted — which channel, how often, about what. A product question with many answers.
A system with only consent offers one control: off. A system with preferences offers "less often", "only order updates", "by email instead" — and many people who would have chosen off will choose one of those. That is the commercial case for the ledger, and it usually pays off sooner than the compliance case.
| Consent | Preference | |
|---|---|---|
| The question | May you contact this person at all, for this purpose? | How would they like to be contacted? |
| Kind of question | Legal | Product |
| Answers | Yes or no | Which channel, how often, about what |
| What a system offers with only this | One control: off | "Less often", "only order updates", "by email instead" |
Where it goes wrong in practice#
The import with no history. A list arrives from an acquisition, a partner or a spreadsheet, and every row is written as "imported" and nothing else. Record the source file, the date and who vouched for it. Weak provenance is still a fact; a blank field is a gap you cannot close later.
The withdrawal that reaches only one system. Someone unsubscribes in the email tool; the SMS platform never hears. This failure generates complaints, and it is architectural: if suppression lists live in each vendor rather than centrally, every vendor is a place a withdrawal can fail to arrive. Keep one central suppression list that every sending system checks.
The consent that outlives its purpose. Permission for delivery updates gets read, two years later, as permission to market. Nobody decided that; the data model simply could not tell the difference.
How long to keep the records#
You may need to prove the basis for a message sent years ago, so consent records often need to outlive the customer relationship. That sits awkwardly with deletion duties. A common resolution: treat the consent event as a record of what happened, keep only the minimum needed to evidence it, delete the rest with the contact, and document the reasoning. Take local legal advice on retention periods.
The same place for AI disclosure#
Since 2 August 2026, Article 50 of the EU AI Act requires that people be told, clearly and at the first interaction, when they are dealing with an AI system rather than a person. If an automated agent handles part of your conversations with people in the EU, that disclosure belongs in the same part of your architecture as consent — recorded per conversation, with evidence — and is worth doing everywhere. See AI Act Article 50 for messaging.
What to ask a provider#
- Can I see consent and opt-out events per contact, per channel and per purpose, with timestamps?
- When someone replies STOP, how quickly is it reflected, and can I receive it by webhook to update my own ledger?
- Can I export the full consent history if I leave?
Where to go next#
- Sender registration around the world — the next step in this track.
- Consent architecture — the deeper design.
- Omnichannel is an identity problem — why consent belongs to each identifier.
Sources
Every claim worth checking, with somewhere to check it.
- Safer and more transparent AIEuropean Commission · 2 August 2026
- AI Act Article 50: transparency rulesartificialintelligenceact.eu
- Regulation (EU) 2024/1689 (Artificial Intelligence Act)EUR-Lex
- Regulation (EU) 2016/679 (General Data Protection Regulation)EUR-Lex