How to

How to build a data subject request tracker

Somebody asks for their data and a statutory clock starts, but nobody can list the systems it lives in. Here is the model behind a tracker, the prompts to build it, and what it takes to run it.

The short answer

A data subject request tracker is four parts: intake that starts the statutory clock on the day the request arrives, identity verification before disclosure, a searched system inventory, and evidence. The deadline is the part that makes it different from any other queue. It is set in law, it starts whether or not anybody noticed the request, and the only defence against missing it is a system inventory that already existed.

subject-requests.helix-app.ai

Subject requests

6

Open requests

1

Inside 5 days

18

Systems in the inventory

0

Completed late, 12 months

Request 2026-114

Access request · arrived 14 August · identity verified 15 August

Days remaining
4
Statutory deadline
13 September
Systems searched
18 of 18
Items withheld
2, legal privilege
Extension
Not used

What was searched, and what was found

  • 4 days left Response package ready for review withheld items each carry a stated basis
  • 2 Sep Backups searched, nothing found the system people forget
  • 29 Aug Analytics tool searched, 1 record owner: T. Okafor
  • 22 Aug CRM and support searched, 14 records owner: R. Iyer
  • 15 Aug Identity verified before anything disclosed required before the workflow can proceed
A sketch of one request against the clock. The search runs against a maintained inventory of eighteen systems rather than anybody's memory, which is what makes completing it possible at all.

What matters here

  • A subject request tracker is four parts: dated intake, identity verification, a system inventory, and evidence.
  • The clock starts when the request arrives, not when somebody logs it. Backdate to the arrival date and let the tracker calculate the rest.
  • Verify identity before disclosing anything. Sending someone else's data to an impersonator is a breach caused by trying to be compliant.
  • Work against a maintained inventory of systems holding personal data. Searching from memory guarantees a system gets missed.
  • Record the exemptions you applied and why. "We withheld some of it" without a stated basis is the finding.
  • Requests arrive by any channel, including a reply to a marketing email. Intake has to accept all of them.

Who this is for

You run privacy, legal or compliance. You already know your obligations. What you want is for the clock to start automatically, the search to be worked against a real list, and the evidence to exist without assembling it afterwards.

How it works in practice

What happens from the moment a request arrives to the moment you can prove what you did.

  1. 1

    It is logged with the date it arrived

    Whatever channel it came through, including a reply to a marketing email. The deadline is derived from that date, not from today.

  2. 2

    Identity is verified before anything is disclosed

    Proportionate to what is being asked for, recorded, and required before the workflow can reach disclosure.

  3. 3

    A search task is generated per system

    From a maintained inventory of what holds personal data, assigned to each system's owner, rather than from anybody's memory.

  4. 4

    Every task is answered, including the empty ones

    A request cannot complete until each system has reported what it found or that it found nothing.

  5. 5

    Withheld data carries a stated basis

    The specific exemption, per item. Withholding is often right; withholding without a reason is the finding.

  6. 6

    The response and the deadline are both evidenced

    What was sent, when, to whom, and a queue ordered by days remaining so nothing is missed quietly.

What a request tracker is made of

This is not a ticket queue with a due date. It is four parts, and the third one is what decides whether you can actually complete a request.

Dated intake

Every request logged with the date it arrived, whatever channel it came through, and the statutory deadline derived from that date rather than from when somebody noticed.

Identity verification

A recorded step before any data is disclosed, proportionate to what is being asked for. This protects the subject rather than the company.

A system inventory

The systems that hold personal data, what kind, who owns each, and how a search is performed there. The search is worked against this list, not from memory.

Evidence

What was searched, what was found, what was disclosed, what was withheld and on what basis, when it was sent, and to whom.

These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix

The prompts

Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.

  1. The clock starts when it arrives

    Intake from any channel, with the deadline derived rather than typed.

    In this Helix project, build me a data subject request tracker.
    
    A request records: the subject's name and contact details, the date it
    arrived, the channel it arrived through, the request type, what they
    actually asked for in their own words, and who received it.
    
    Request types to seed: access, deletion, rectification, portability,
    restriction, objection, and a general question. Let me edit that list.
    
    Now the important part. Derive the statutory deadline from the arrival
    date and a period I configure per request type, and treat that derived
    date as the thing the whole app is organised around. The clock starts when
    the request arrives, not when somebody gets round to logging it, so let me
    backdate the arrival date and have everything recalculate.
    
    Support extending the deadline where the law allows it, with the reason
    and the notification to the subject recorded, because an extension that
    was never communicated is not an extension.
    
    And accept requests from any channel. People send these by replying to a
    marketing email or mentioning it in a support ticket, and an intake that
    only accepts a form will miss those entirely.
    
    I sign in through Helix, so do not build a login page. Read the signed-in
    user from the runtime. And do not put any key or connection string in the
    code: if this needs to reach another system, tell me and I will create the
    connection in my workspace.

    Worth knowing. Deriving the deadline from the arrival date rather than the logged date is the whole design. A request found in an inbox three weeks late has three weeks less, and the tracker should say so loudly.

  2. Verify before you disclose

    Because the failure mode here is causing a breach while trying to comply.

    Add identity verification as a required step before any data can be
    disclosed.
    
    Record what was checked, by whom, and when. Let me define what is
    proportionate per request type: confirming a signed-in account may be
    enough for one thing, and a deletion request from an unverified email
    address needs more.
    
    Do not let the workflow reach a disclosure state until verification is
    recorded. Sending one person's data to somebody impersonating them is a
    breach caused by trying to be compliant, and it is a well-documented
    attack rather than a hypothetical one.
    
    Handle requests made on somebody's behalf: a parent, a solicitor, an
    authorised agent. Those need evidence of authority recorded as well as
    identity, and they are the ones most likely to be got wrong.
    
    Track the clock through verification. Time spent waiting for the subject
    to verify usually does not count against you, but only if you recorded
    when you asked.
  3. Search a list, not your memory

    The inventory is what makes completion possible.

    Build a system inventory, and make the search work against it.
    
    Each system records: name, what categories of personal data it holds, a
    named owner, how a search is performed there, whether deletion is possible
    and what it means in that system, and any retention rule that overrides a
    deletion request.
    
    When a request is opened, generate a search task per relevant system,
    assigned to that system's owner. Each task records what was searched for,
    what was found, and what was done, or that nothing was found.
    
    A request cannot be completed until every task is answered. Searching from
    memory guarantees a system gets missed, and the missed system is always
    the one nobody thinks of, like the backup, the analytics tool, or the
    spreadsheet on somebody's laptop.
    
    Flag any system in the inventory with no owner, and any system not
    reviewed within a period I set. An inventory that has gone stale is worse
    than an obviously incomplete one, because people trust it.

    Worth knowing. The inventory is the part that takes real work and the part that makes every subsequent request cheap. Build it once, maintain it, and the rest of this is administration.

  4. Evidence, and the deadline you can see coming

    What you did, and whether you are about to miss one.

    Record the response: what was disclosed, in what format, when, and to whom.
    Record what was withheld and the specific exemption relied on. Withholding
    something without a stated basis is the finding, not the withholding.
    
    Keep the outbound package itself, so what was actually sent is preserved
    rather than reconstructed.
    
    Then the views. A dashboard ordered by days remaining, not by date
    received, with anything inside a threshold I set highlighted and anything
    overdue at the top and impossible to miss. Notify the owner and their
    manager as the deadline approaches.
    
    And reporting: requests by type and month, median days to complete, how
    often each exemption was relied on, which systems take longest to search,
    and any request completed after its deadline with the reason. That last
    list should be empty, and if it is not, it is the first thing to fix.
  5. Connect it to real systems

    The step that turns a working prototype into something with your data in it.

    Now connect it to the systems we actually run, so it works on real data
    rather than the rows you seeded.
    
    Anything in angle brackets is a placeholder. Swap it for whatever we use
    instead, and have the app name the connection it wants rather than assume
    a vendor, so changing my mind later is a config change and not a rewrite.
    
    <every system in your inventory>. Search for the individual and record
    what was found, or that nothing was. This is the work.
    
    <Okta>. Authenticate the people handling requests and read the group that
    says who is allowed to. This is personal data about identified
    individuals, so the app should trust the group and nothing else.
    
    <Google Drive>. Hold the response package, so what was sent is preserved
    rather than reconstructed.
    
    <Gmail>. Acknowledge the request and deliver the response, both
    timestamped against the statutory clock.
    
    <OneTrust>. If privacy operations already run somewhere, read requests
    from there rather than running a second intake.
    
    <Salesforce>. Search the CRM, which is almost always the largest single
    store of personal data.
    
    <Zendesk>. Search support history, which is where the most sensitive free
    text usually is.
    
    <Amplitude>. Search analytics, which is the system people forget holds
    anything identifying.
    
    Only write where I have said to write. Everything else is read only.
    
    Do not write a key, a token or a connection string anywhere in the code,
    and do not ask me to paste one. Tell me which connections you need and I
    will create each as an authentication in my Helix workspace. Reference
    them by alias.

    Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.

  6. Ship it

    The last step of every build: a URL, and the right people on it.

    Deploy my app.

    Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. This app handles personal data about identified individuals and produces regulatory evidence, so set Access Control tightly before anyone uses it.

What it connects to

This one searches every system that holds personal data, which is exactly why the inventory has to exist first.

  • Every system in your inventory

    Search for the individual and record what was found, or that nothing was. This is the work.

  • Okta

    Authenticate the people handling requests and read the group that says who is allowed to. This is personal data about identified individuals, so the app should trust the group and nothing else.

  • Google Drive

    Hold the response package, so what was sent is preserved rather than reconstructed.

  • Gmail

    Acknowledge the request and deliver the response, both timestamped against the statutory clock.

  • OneTrust

    If privacy operations already run somewhere, read requests from there rather than running a second intake.

  • Salesforce

    Search the CRM, which is almost always the largest single store of personal data.

  • Zendesk

    Search support history, which is where the most sensitive free text usually is.

  • Amplitude

    Search analytics, which is the system people forget holds anything identifying.

Each line says whether the app reads, writes or both. Anything not described as writing should be read only.

Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.

Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.

Running it for real

The build gets you a working tracker. It handles personal data about identified individuals and produces evidence a regulator may ask for, so how it is run is the larger half of the job.

AI Deployment

Get it to a URL people can open

One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.

App Security

Put your identity provider in front of it

This app holds personal data about identified individuals and the record of what was disclosed. SSO means every action is attributable, and access is scoped tightly to the people handling requests.

App Security

Connect the system of record with managed credentials

Searching the systems that hold personal data needs real access to each one. Granting it to the app rather than pasting keys into it means access is scoped, revocable, and itself auditable.

App Registry

Put a name on it

Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.

Cost Management

Know what it costs to run

Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.

Questions people ask

What is a data subject request tracker?

It logs each request on the date it arrived, derives the statutory deadline from that date, requires identity verification before disclosure, generates a search task per system holding personal data, and records what was found, disclosed and withheld.

When does the clock start on a subject request?

When the request arrives, not when it is logged. A request sitting unnoticed in an inbox for three weeks has three weeks less remaining, so intake should let you backdate the arrival date and recalculate everything from it.

Why verify identity before responding?

Because sending one person's data to somebody impersonating them is a breach caused by trying to comply. Verification should be proportionate to what is being asked for, recorded, and required before the workflow can reach a disclosure state.

Why search against an inventory rather than from memory?

Because the system that gets missed is always the one nobody thinks of: the backup, the analytics tool, the spreadsheet on a laptop. A maintained inventory of what holds personal data, with an owner per system, is what makes completion actually possible.

What should be recorded about withheld data?

The specific exemption relied on, per item. Withholding something is often correct; withholding it without a stated basis is the finding. Keep the outbound package too, so what was sent is preserved rather than reconstructed later.

Can I build this without an engineering team?

Yes for the app, and the prompts here are written for Claude Code, Codex or Cursor. The work that is not in the code is the system inventory, and that is also the part that makes every future request cheap.

Last reviewed September 2026.

Build it, then run it properly

Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.