Feature · consent lifecycle

Withdrawal as easy as consent — and what happens after the click

Section 6(4) says the ease of withdrawing consent must be comparable to the ease of giving it. Most implementations read that as a UI requirement and stop there. The harder half is §6(6): once consent is withdrawn, processing has to stop — which means the withdrawal has to reach the systems the data went to, not just the row it was written in.

Jupinder Bedi

Part of

Consent Management

Withdrawal is one transition in the consent lifecycle. The module covers the other end — how the consent was captured and what the record proves.

What "as easy as consent" rules out

The comparison in §6(4) is between two journeys, not two buttons. If consent was one click on a banner and withdrawal is an email to a support address that a human reads within two working days, the journeys are not comparable and the wording of the clause does not leave much room to argue otherwise.

The same logic rules out a few things that are common in practice: making somebody create an account to withdraw when they did not need one to consent; asking for identity documents to withdraw an anonymous cookie decision; and burying withdrawal behind a preference centre that itself requires a login. Each of those adds friction on exactly the side of the transaction where the Act says friction may not be added.

When the code sends an OTP, and when it deliberately does not

This is the part that is usually got wrong in both directions. Verification is not applied uniformly; it is applied when it was applied at the other end.

A withdrawal is gated behind a one-time code where the original grant was itself verified — the consent request required a code, or a verified code exists against that email. Where the consent was an anonymous banner decision with no email attached, there is nothing to verify against and no code is sent; the person clicks and the record moves. Sending a code to an address you never collected is not security, it is an obstacle, and it is the obstacle §6(4) prohibits.

Where the gate does apply, the numbers are fixed and worth knowing: a six-digit code, valid ten minutes, five verification attempts before the attempt is refused, a thirty-second cooldown before a resend, and a verified session that lasts ten minutes and can be used once. Codes are stored as hashes; the raw value never lands in a table.

Per-purpose withdrawal, because bundled consent was never valid anyway

The withdrawal form lists the records that exist and lets the person choose. Submitting without a selection withdraws everything; selecting three of seven withdraws three. This matters because §6 requires consent to be specific to a purpose — and a withdrawal mechanism that can only operate on all-or-nothing has quietly reintroduced the bundling the capture side was careful to avoid.

There is a corollary that surprises people the first time they see it. The system resolves which records belong to the person before it acts, and it resolves broadly — seeding from the identifier given, then following the device handle, the browser fingerprint and the anonymous identifier attached to those records to find the others. The practical effect is that somebody who consented anonymously on the banner in March and later gave an email in a signup form withdraws both in one action, rather than withdrawing the one they remember and leaving the other running.

What actually changes in the record

The consent record's status and decision both move to withdrawn and a withdrawal timestamp is stamped. The record is not deleted. This is the distinction that makes an audit survivable: you need to be able to show both that consent existed and that it was withdrawn, and a system that removes the row can demonstrate neither.

The withdrawal token, if one was used, is marked consumed at the same time — single use, so a forwarded link cannot be replayed. The response is a redirect rather than a rendered page, so a back button cannot resubmit the form.

The downstream fan-out — this is the §6(6) half

A withdrawal creates a parent withdrawal record and one action per vendor that received data under the consent being withdrawn, routed by the rules configured for that purpose. Each action carries its own default deadline, and the defaults differ by what the vendor is being asked to do, because they are not the same job.

  • Delete — thirty days. The vendor removes the data.
  • Suppress — seven days. Add to a suppression list so the record survives but is not acted on.
  • Stop processing — seven days. Halt the activity without touching stored data.
  • Retain under a legal obligation — ninety days, and recorded as such, because "we had to keep it" is a position that has to be evidenced rather than asserted.

What fires alongside it

A webhook carrying the identifiers, the number of records updated, the number of downstream actions created and the source of the withdrawal — which distinguishes a token link from a self-service portal action from a retention-policy expiry, so you can tell in your own systems why something arrived.

A trace scan that looks for the person's data and raises an erasure review for the data protection officer, because §6(6) is an obligation to cease processing rather than an obligation to update a flag.

A confirmation email to the person, stating how many consents moved and how many downstream notifications were queued. It is an email rather than a PDF on this path; a signed receipt is available separately.

Where withdrawal breaks in real deployments

Three failure modes, all of them operational rather than technical. The first is a withdrawal route that exists but is not linked from anywhere a person would look — present in the preference centre, absent from the notice and the marketing emails. The second is a vendor with no routing rule, which means the withdrawal is recorded and no action is created for it, and nobody notices until an audit asks who was told.

The third is the one that costs money: consent captured through a form you built yourself, posted straight into your own database, never registered as a consent record. There is nothing to withdraw because there is nothing that knows it exists. If you take one thing from this page, make it that — the withdrawal machinery can only reach records the system has.

Questions teams ask about this

Can somebody withdraw consent for one purpose and keep the others?

Yes, and the form is built around that rather than treating it as an edge case. Records are listed individually and a selection withdraws only those; submitting with nothing selected withdraws all of them. Purpose-level granularity on the way out is the counterpart to the §6 requirement that consent be specific on the way in.

Why does withdrawal sometimes ask for a code and sometimes not?

Because the gate mirrors how the consent was given. A grant that was verified by a one-time code is withdrawn behind the same check; a grant made anonymously on a banner, with no email ever collected, has nothing to verify against and no code is sent. Demanding verification for a consent you never verified would make withdrawal harder than consent, which §6(4) does not permit.

Does withdrawing consent delete the consent record?

No. The record's status and decision move to withdrawn and a withdrawal timestamp is written; the row stays. You need to be able to show both that consent existed and that it ended, and a deleted row demonstrates neither. Deletion of the underlying personal data is a separate downstream action with its own deadline.

How do vendors and processors find out that consent was withdrawn?

A withdrawal creates one action per recipient that actually received data under that consent, routed by the rules configured for the purpose, each with its own deadline — thirty days to delete, seven to suppress or stop processing, ninety where retention is claimed under a legal obligation. A webhook fires in parallel so your own systems can react without polling.

What happens to consent that nobody ever withdraws?

It expires. A decision carries an expiry of a year from capture, and an expired decision is treated as no decision, so the banner asks again rather than relying on it indefinitely. Separately, a retention policy moves long-dormant records to withdrawn and runs them through the same downstream fan-out, which is how data stops being processed when a person simply stops coming back.

Describes how ProtectComply implements one obligation under the DPDP Act, 2023 and the DPDP Rules. General information, not legal advice.

Jupinder Bedi — Jupinder writes on data protection practice at ProtectComply, with a focus on how obligations translate into system behaviour.

Check whether your withdrawal route is as easy as your accept button

The scanner flags sites where consent is one click and withdrawal is an email address.

Check a site →