Why nobody can produce an accurate data map
Because it was built by asking people. A record of processing assembled from a questionnaire captures what a handful of staff remembered on one afternoon, while engineers create new data flows every week, so the document begins diverging from the system on the day it is signed off. The maps that stay accurate are derived from artefacts the platform produces anyway, and they are noticeably less flattering than the ones drawn in workshops.
Why does the interview approach fail?
Because the people who know the flows are not the people asked, and the flows outnumber the memory available. A privacy lead sends a template to department heads, who describe the systems they think about rather than the systems their data reaches. Nobody names the error tracker that captures request payloads, the session replay tool on the marketing site, the analytics vendor added by a growth experiment, or the support tool that indexes every attachment a customer ever sent.
The second problem is granularity. A questionnaire asks about systems, and personal data moves in fields. Knowing that the CRM holds customer records tells you nothing about whether a date of birth field is populated, which is the difference between an ordinary record and one that needs a stricter retention rule.
The result is a record of processing that is not wrong so much as incomplete in a specific direction: it lists the systems the organisation bought deliberately and omits the ones it accumulated. Those are the ones that appear in breaches and subject access requests.
Which artefacts can you derive a map from?
Ones you already generate and rarely read. Infrastructure as code state gives you every datastore that exists, including the ones nobody remembers provisioning. Egress logs and service mesh telemetry give you the real list of external destinations your workloads talk to. Your identity provider's application catalogue gives you the SaaS estate that people actually log in to, and card statements give you the part that bypassed procurement.
Each source has a bias, which is why you use several. The table sets out what each one finds and what it will silently miss, and the pairing matters more than the individual source.
| Source | What it reveals | What it misses |
|---|---|---|
| Terraform or CloudFormation state | Every provisioned datastore, bucket and queue | Anything created by hand or inside a container |
| Egress logs or service mesh telemetry | Actual external destinations per workload | Data leaving via a browser rather than a server |
| Content Security Policy in report only mode | Third party scripts and tags on your own pages | Server to server integrations |
| Identity provider application list | SaaS tools with real sign in activity | Tools using local accounts or a shared login |
| Database schema and column names | Fields that hold personal or special category data | Personal data hidden in free text and JSON blobs |
| Log platform indices and field lists | Identifiers being logged and for how long | Logs written to node storage and never shipped |
How do you find data leaving a container platform?
Turn the network into the inventory. In a Kubernetes estate the cheapest accurate discovery is a default deny egress policy applied in a non-enforcing or audit posture, or the equivalent telemetry from a service mesh or CNI that logs connections, then reading the destination list after a week of normal traffic. Every external hostname your workloads reached is on it, whether or not a contract exists.
This finds the things questionnaires never do: a model provider called from one service, an email delivery API, a geolocation lookup, a monitoring vendor receiving traces with request attributes attached. It also finds the ones that stopped mattering, which lets you close egress paths rather than document them.
Once the list is stable, enforce it. A default deny egress policy with an explicit allowlist converts vendor discovery from an annual exercise into a change request, which means the next tool an engineer wants to try becomes visible before the data moves rather than afterwards. That is the only mechanism we have seen keep a processor list accurate over years.
What about personal data inside free text and images?
Assume it is there and stop pretending the schema tells you. Support ticket bodies, internal notes fields, uploaded attachments, chat exports, call recordings and screenshots pasted into issue trackers hold personal data that no column name announces. In practice these stores are where the awkward material lives, because people write things into a notes field that they would never put in a structured field.
Container platforms add their own version of this. Crash dumps and core files can contain whatever was in process memory, including plaintext identifiers and tokens, and they are frequently written to a shared bucket with a long lifecycle. Image layers are another: a dataset copied into an image and deleted in a later instruction is still present in the earlier layer, and so is anything else that was ever added.
The realistic treatment is classification by container rather than by field. Declare the whole store as holding personal data of an unknown shape, apply the strictest retention that the business can accept, restrict access, and stop trying to enumerate what is inside it.
What does a map need to record to be useful?
Enough to answer the four questions that other obligations depend on. For each store: what identifier links a record to a person, what the purpose and lawful basis are, who or what receives copies, and how long it is kept and by what mechanism. Article 30 asks for a similar set, but the difference between a compliance record and a useful one is the identifier column, because that is the field a deletion or access request has to travel along.
Recording the mechanism rather than the intended period is the other change worth making. A retention entry that reads twenty four months is a plan. One that reads S3 lifecycle rule, expires objects at 730 days is a fact, and it can be verified by anybody in a minute.
Keep it in the repository next to the code, in a text format, reviewed in pull requests. A map that lives in a spreadsheet is maintained by whoever remembers to, and a map that lives next to the schema is maintained by the person changing the schema.
What test tells you how bad the gap is?
Pick one real person, ideally a colleague who consents, and try to enumerate every system holding data about them in a single working day. Not a policy exercise: actual queries against actual stores. Write down the systems as you find them and compare that list with the record of processing at the end.
The finding is always the same in shape and different in detail: two or three stores that appear in reality and not in the register, usually a log platform, an analytics or warehouse copy, and a SaaS tool bought by one team. Those three are also, not coincidentally, the ones that break a deletion request.
Run the same exercise against a customer who was deleted three months ago and it becomes a retention test as well. If their identifier still appears anywhere, the deletion path is incomplete, and you now know exactly where before a regulator or a customer asks.
Common questions
- What is a data map in privacy terms?
- An inventory of where personal data lives, why it is held, who receives copies, and how long each copy is kept. Article 30 of GDPR requires a related artefact, the record of processing activities, with a defined content list. A useful engineering map records one extra thing the legal record does not demand: the identifier that links a record to a person, because access and deletion requests have to travel along that field.
- Why do records of processing go out of date so quickly?
- Because they are produced by interview and refreshed annually, while engineers create data flows continuously. A questionnaire also captures the systems an organisation bought deliberately and omits the ones it accumulated: the error tracker capturing payloads, the analytics vendor added for one experiment, the session replay script on a marketing page. Those omissions are the same systems that later break a deletion request or widen a breach.
- How can you discover which third parties receive your data?
- Read the network rather than the paperwork. Egress logs, service mesh telemetry or a default deny policy in an audit posture will list every external destination your workloads actually reach over a week of normal traffic. For data leaving through the browser instead, run Content Security Policy in report only mode on your own pages, which surfaces third party scripts and tags nobody documented.
- How do you handle personal data in free text fields?
- Classify the store rather than the field. Support ticket bodies, notes fields, attachments, chat exports and call recordings contain personal data that no column name reveals, and enumerating it reliably is not achievable. Declare the whole store as holding personal data of unknown shape, apply the strictest retention the business will accept, restrict access, and make sure it is included in subject request and deletion routines.
- Do container platforms make data mapping harder?
- They change where the evidence lives. Workloads are ephemeral, so the map cannot be drawn from running processes, but the platform produces better sources instead: egress telemetry, registry pull records, and infrastructure as code state. The container specific traps are crash dumps holding whatever was in memory, node level logs that are never shipped anywhere, and image layers that still contain a dataset deleted in a later build step.