Feature · rights intake

The intake end of a rights request, where most of them go wrong

A rights programme is usually judged on how it answers requests. It fails, in practice, much earlier than that — on requests that arrived in somebody's personal inbox, requests from people who were never your data principals, and requests whose clock nobody agrees on. This page is about intake: the portal, the identity check, the abuse controls and where the clock starts.

Priya Gupta

Part of

Rights Manager (DSR)

This page is about intake — the portal, the identity check and where the clock starts. The module covers what happens to the request after that.

A published URL, because Rule 14 requires the means to be published

Rule 14 obliges you to publish, on your website or app, the means by which a data principal makes a request to exercise their rights, and the particulars they will need to give. That is a publication requirement, not just a process requirement — the route has to be findable by somebody who has never dealt with you before and has no account.

Each organisation gets a public request URL carrying its own slug. It is a real page with a real form, not a mailto link. The operator dashboard renders it as a copyable link and a QR code, which matters for the organisations whose principals arrive through a printed notice or a branch counter rather than a website footer.

One small behaviour worth knowing: an unknown slug returns a genuine 404 with a suggestion if something close exists. An earlier version returned a fake success page for any slug, which felt tidy and was a transparency failure — a person who submits a request to a URL with a typo and sees "thank you" believes they have exercised a right they have not.

Verifying a person without collecting more data than you need

The form takes an identifier — an email address or a phone number — and the verification channel follows from the type rather than being chosen. Give an email, get an emailed code; give a phone number, get an SMS. There is no separate identity-document step at intake, because requiring one would mean collecting sensitive data from everybody in order to serve the minority of requests where it is genuinely needed.

The constants: six digits, valid fifteen minutes, five verification attempts per code, at most ten codes in any rolling twenty-four hours, thirty seconds between resends, and thirty failed attempts over the life of a request before the person has to file a new one. The code is stored as a hash and compared in constant time; the raw value never exists in a table. Requests arriving through an authenticated integration skip verification entirely, on the basis that the calling system has already established who the person is.

Verification returns eleven distinct error codes rather than a generic failure — expired, consumed, attempts exceeded, cooldown, resend limit, wrong format, no recipient on file, already verified, not required. That granularity is not fastidiousness; it is what lets the portal tell somebody why their code did not work, which is the difference between a person retrying and a person emailing your support desk instead.

The clock starts at verification, not at submission

This is the single most consequential detail on the page and it is almost never stated. The response deadline is set when the identity is verified, not when the form is submitted. A request sitting unverified is not a request yet.

The reason is practical. Anyone can type your customer's email into a public form. If submission started the clock, a single script could put a thousand unverifiable requests on your books and each one would be running down a deadline you cannot meet because you cannot lawfully act on any of them. Starting at verification means the clock only runs against requests you can actually work.

The window itself is a tenant setting with a thirty-day default, and an extension mechanism that requires the new date to be in the future, to stay within the configured maximum, and to carry a written reason — which is emailed to the person rather than recorded internally. Requests that are never verified are cleaned up after a day rather than accumulating.

Keeping the queue clean before a human sees it

A public form on the internet attracts everything a public form on the internet attracts. Four controls run before anything reaches the queue.

  • A honeypot field. Filled in, and the response is an ordinary success page while nothing is persisted. Telling a bot it failed only teaches it to try differently.
  • Per-identifier rate limiting — three submissions an hour for the same email or phone against the same organisation.
  • Per-address rate limiting — ten an hour from one IP across all tenants, which catches the script that is working through a list.
  • Route-level limits on the public and verification endpoints, tighter on the code-issuing ones than on the form.

Routing, and what it does when it does not know

Assignment runs on an ordered rule list, first match wins, lowest priority number first. A rule matches on the request type, the domain part of the identifier, the identifier type, the grievance category or a substring of the description, using equals, not-equals, contains or in.

The identifier domain condition is the one that earns its keep in practice: requests from a particular corporate domain route to the person who handles that account. And a rule with no conditions matches everything, which makes it a clean final catch-all to the data protection officer rather than a special case in the code.

Two behaviours are worth stating because they are deliberate. An unrecognised field or operator fails closed — no assignment, rather than a guess. And the router as a whole fails open: if it errors, the request lands unassigned for human triage and public submission is never broken by a bad rule. Those are opposite defaults for opposite risks, and both are the right way round.

The link the person keeps

Every request gets a signed token, and the link built from it is what goes in every email to the principal. They use it to check status, add an attachment, withdraw the request, and download whatever you send back — without an account, because requiring one would mean creating an identity for somebody who came to you about identity.

The token is long-lived, stored only as a hash, and re-signed on every material transition — acknowledgement, extension, fulfilment, rejection, escalation. Rotating on transition means the most recent email always carries a current link and a leaked older one is worth less.

What the portal shows is a deliberately narrow projection of the record. Where per-vendor fulfilment tasks exist, the person sees the party name, the action, its status and its deadline; internal notes and evidence URLs are stripped server-side rather than hidden with CSS.

What intake cannot fix

It cannot capture requests that never reach it. The most common gap in a rights programme is not a broken portal, it is a portal plus four other doors — a support inbox, a sales rep, a WhatsApp number, a branch. Publishing the portal is the easy half; routing everything else into it is the half that takes a quarter.

It also cannot tell you whether the person is your data principal at all. Verification proves control of an email address. Whether the holder of that address is somebody whose personal data you process is a lookup in your systems, and "not a data principal of this fiduciary" is one of the recorded refusal reasons precisely because it is a real and frequent answer.

Questions teams ask about this

When does the response clock on a rights request start?

At identity verification, not at submission. A request whose one-time code has not been verified has no deadline attached and is cleaned up after a day. This prevents an unverifiable bulk submission from putting deadlines on your books that you could not lawfully act on anyway, and it means every running clock corresponds to a request somebody can actually work.

Does a data principal need an account to file or track a request?

No. The form takes an email or phone number, verifies it with a six-digit code, and issues a signed link that the person uses to check status, attach documents, withdraw the request or collect the response. Requiring an account would mean creating an identity record for somebody who has come to you about their identity record.

How are requests assigned to the right person?

By an ordered rule list, first match wins, matching on request type, the domain of the identifier, the identifier type, the grievance category or text in the description. A rule with no conditions matches everything and works as a final catch-all. If the router errors, the request lands unassigned for human triage rather than blocking submission.

What stops someone flooding the public form?

A honeypot field that returns an ordinary success page while persisting nothing, three submissions an hour per identifier against one organisation, ten an hour from a single address across all tenants, and tighter route-level limits on the code-issuing endpoints. Unverified requests are also deleted after a day, so a flood does not accumulate.

Can a request be extended, and what does that require?

Yes, within the configured maximum. The new date must be in the future and within the ceiling, and a written reason is mandatory — it is stored on the request and emailed to the person rather than kept internally. An extension nobody was told about is an overdue request with better paperwork.

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

Priya Gupta — Priya writes on compliance operations at ProtectComply, including data principal rights, grievance handling and sector-specific programmes.

See the page a data principal would land on

Every organisation gets a public request URL with its own slug. Look at one before you publish yours.

Open the Rights Manager →