Kinetic Gain · Data Governance
Pillar guide

Data retention and deletion: "delete the row" is not deletion

By Kinetic Gain, Data Governance Last updated

Retention is the policy for how long you keep data. Deletion is the mechanics of removing it when the clock runs out or a request arrives. This page goes deep on both as a single discipline. It is a sibling to the data lineage pillar, which is what makes deletion provable, and a child of the data governance pillar. The core truth: a value lives in more places than the row you deleted.

Data has a lifecycle: it is collected, retained under a schedule, deleted when the trigger fires (propagating to every copy), and the deletion is proven with a log and lineage. A legal hold can suspend deletion. Collect lawful basis Retain schedule + period Delete propagate to copies Prove log + lineage legal hold can suspend deletion
Data has a lifecycle: collected under a lawful basis, retained on a schedule, deleted (propagating to every copy) when the trigger fires, and proven with a log plus lineage. A legal hold overrides the schedule.

What a retention-and-deletion discipline is

A retention and deletion discipline treats every data element as something with a lifecycle, not something you keep by default. Retention is the policy layer. It answers how long a given category of data should exist and on what lawful basis, mapped to a business need or a legal obligation. Deletion is the mechanics layer. It is the actual work of removing that data once the retention clock runs out or a subject request arrives.

The two are distinct on purpose. A retention schedule that no deletion process enforces is a document, not a control, and a deletion routine with no schedule behind it has no defensible answer to why data left or stayed. GDPR Article 5(1)(e), the storage limitation principle, is the clearest statement of the idea: personal data should be kept in identifiable form no longer than necessary for the purpose it was collected for. The discipline operationalizes that principle across every system that holds a copy.

Why deletion is genuinely hard

One value, many copies, and backups that fight erasure by design

Modern stacks make deletion hard because a single value rarely lives in one place. A row written to a primary database is copied into derived tables, materialized views, caches, search indexes, message queues, application logs, an analytics warehouse, and one or more backups within minutes. Deleting the original row leaves every downstream copy intact, so "delete the row" is not deletion, it is deletion of one representation among many. The value can still be read, joined, exported, or reconstructed from any surviving copy.

Backups sharpen the problem. Good backup design is immutable and append only precisely so that ransomware or a bad actor cannot alter history, and that immutability collides directly with an erasure obligation that says a specific person's data must go. You cannot surgically reach into a sealed, immutable backup set and excise one record without undermining the integrity guarantee the backup exists to provide. Resolving that tension is the central engineering problem of deletion, not an edge case.

Retention schedules: default to delete

A retention schedule maps each data category to a retention period and a lawful basis, and its default should be delete when no longer needed rather than keep indefinitely. For each category you state the purpose the data serves, the period it is retained, the basis for holding it (contract, legal obligation, legitimate interest, consent), and the trigger that starts the deletion clock. GDPR Article 30, records of processing activities, is where much of this is already documented for personal data, so the schedule should read as an extension of that record rather than a parallel artifact.

Data held past its usefulness is a liability, not an asset. Attackers exfiltrate what exists, not what you needed. Every retained record widens the breach blast radius, raises e-discovery cost, and enlarges the surface a deletion request must cover.

Deletion mechanics: soft, hard, and crypto-shred

Soft delete is a staging state, hard delete is the end state

Soft delete marks a record as removed, usually with a tombstone flag or a deleted_at timestamp, while the underlying data stays present and recoverable. It is the right choice when you need an undo window, referential safety, or an audit trail of the removal itself. It is not erasure. The data is still there, still queryable by anything that ignores the flag, and still within reach of a breach. Hard delete physically removes the data so it cannot be recovered. It is what an erasure obligation actually contemplates, and it is the correct end state once any soft delete grace period expires.

For backups, where hard deleting a single record inside an immutable set is not feasible, crypto-shredding is the standard answer. You encrypt the data, or a category of data, under a key, and when the retention or erasure trigger fires you destroy the key rather than the ciphertext. The encrypted bytes may still sit in the backup, but without the key they are unrecoverable, which renders the data effectively gone. Whichever mechanism you use, deletion has to propagate to every downstream copy, the derived tables, caches, search indexes, logs, and analytics stores, or the value simply survives where the propagation did not reach. Enumerating those destinations is a lineage problem: column-level lineage is what tells you where a value went so propagation can be made complete.

DimensionSoft deleteHard delete
What it doesFlags the record as removed with a tombstone or deleted_at timestamp while leaving the data in placePhysically removes the data from the store
RecoverabilityRecoverable, the record can be restored by clearing the flagIrrecoverable by design once complete
Is the data actually goneNo, the data is still present and readable by anything that ignores the flagYes, the underlying bytes are removed
Typical useUndo windows, referential safety, audit trail of the removal, staged deletionEnd state after any grace period, erasure requests, expired retention
GDPR erasure sufficiencyNot sufficient on its own, the data still existsSufficient when propagated to all copies, treat as readiness not legal advice

Legal hold: the override

A legal hold is an override that suspends deletion for data relevant to actual or reasonably anticipated litigation, regulatory investigation, or audit. When a hold is placed, the affected records are exempted from the retention schedule and from any scheduled purge until the hold is lifted, regardless of what their normal retention period says. The hold has to take precedence over the schedule by design, because the schedule optimizes for minimizing retained data while the hold serves a different and higher obligation, preserving evidence.

The failure mode is spoliation, the destruction or loss of evidence that a party had a duty to preserve. If a routine purge deletes records that were under a duty to preserve, the consequences can include court sanctions, adverse inference instructions, and other penalties that far outweigh the storage the purge saved. This is why a legal hold cannot be an informal note. It has to be a machine enforceable state that the deletion pipeline checks before it removes anything, so that a hold reliably blocks a purge rather than depending on someone remembering it exists.

Stand up a defensible retention and deletion process

  1. Build a retention schedule. Map every data category to a retention period and a lawful basis, defaulting to delete when no longer needed, and align it with your Article 30 records of processing.
  2. Implement propagating deletion. Wire deletion so it reaches every downstream copy, the derived tables, caches, search indexes, logs, and analytics stores, using column-level lineage to enumerate those destinations.
  3. Handle backups deliberately. Use crypto-shredding for immutable backup sets, and document a restore-and-redelete fallback so any restored copy has the deletion reapplied before it returns to live use.
  4. Log deletions and enforce holds. Record each deletion event as evidence, and make legal hold a machine enforceable state that the purge checks first so held data is never removed.
Illustrative scenarioA team receives a deletion request and removes the record from the primary database, and the request is marked complete. Weeks later the same value surfaces in a search index and an analytics warehouse that were both populated from the original row, because deletion was never propagated to those copies. The primary delete was real, but without lineage-driven propagation the data was never actually gone.
Illustrative scenarioA scheduled nightly purge is set to remove records past their retention period, and a batch of them belongs to an account involved in active litigation. Because the purge pipeline checks the legal hold state before deleting, the held records are skipped and preserved while the rest are removed. Had the hold check not been wired in, the job would have destroyed data under a preservation duty.

Proving deletion happened

Deletion you cannot show is deletion you cannot rely on. A defensible posture produces a deletion record: for each deletion event, what was deleted, which systems it propagated to, when, under which policy or request, and the outcome in each destination. That log is the evidence that a retention schedule and a subject request were honored, and it is what turns a claim of erasure into something you can demonstrate on request.

Completeness is the hard part, and it is where lineage does the work. To show a deletion is complete you have to enumerate every place a given value traveled, then confirm removal or crypto-shredding in each. Column-level lineage is what makes that enumeration possible, because it traces a field to every downstream copy so no destination is silently missed. Framed as readiness rather than a certification claim, the deletion log plus lineage coverage is the evidence you assemble now, so that when a regulator, auditor, or data subject asks, the answer is a record and not an assertion.

FAQ

How do you delete data from immutable backups?
You generally cannot excise a single record from a sealed, immutable backup without breaking the integrity the backup exists to provide. The two accepted approaches are crypto-shredding, where the data was encrypted and you destroy the key so the backed up ciphertext becomes unrecoverable, or restore-and-redelete, where if a backup is ever restored the outstanding deletion is reapplied before the data returns to live use. Document whichever approach you rely on so the posture is defensible.
What is the difference between soft delete and hard delete?
Soft delete marks a record as removed with a flag or timestamp while the data stays present and recoverable, which is useful for undo windows and audit trails but is not erasure. Hard delete physically removes the data so it cannot be recovered. Soft delete is a staging state, hard delete is the end state an erasure obligation contemplates.
Does the GDPR right to erasure apply to backups?
In principle yes, Article 17 covers data held in backups, but supervisory authorities have generally accepted that backups on a defined rotation can retain data until that backup naturally expires, provided the data is not restored back into live use and is redeleted if a restore happens. The practical posture is to put the data beyond live use immediately, document the backup cycle, and reapply deletion on any restore. Treat this as readiness, not legal advice, and confirm the current position with counsel for your situation.
What is a legal hold and why does it override retention?
A legal hold is a directive to preserve data relevant to litigation, investigation, or audit, and it suspends normal deletion for the affected records until the hold is lifted. It overrides the retention schedule because preserving evidence is a higher obligation than minimizing retained data. Deleting data under hold risks spoliation, which can carry court sanctions well beyond any benefit of the purge, so the hold must be checked and enforced before anything is deleted.