Research & Analysis · Software engineering · 18 min read
How Do You Verify Data Deletion Across Backups and Vendors?
Sources checked against the cited passages; awaiting my final read before this is indexed.
Verify deletion separately at every place that can retrieve, restore, or recreate the data. Identify the copies and their retention rules, execute the authorized deletion mechanism, inspect the resulting state, and test whether recovery or replay can bring the data back. Where a protected copy must remain, record its restricted use, expiry condition, and later verification. A successful deletion request to the primary database proves only one part of that process.
I'd be careful with the word proof. You can demonstrate that specified versions are absent from an authorized interface, that a tested restoration path reapplies deletion, or that a provider has attested to a defined process. Those statements have different evidence behind them. None, by itself, establishes that every byte everywhere has disappeared.
The practical objective is a deletion claim with a clear scope and an inspectable basis. This article develops an original method for doing that across active stores, replicas, recovery systems, encryption boundaries, and suppliers. It draws on current service documentation, NIST guidance and formal deletion research. The worked example is hypothetical; no production records, keys, storage accounts or vendor systems were accessed or altered for this article.
Decide which deletion claim you are making
A user-facing record can be hidden while remaining available to an administrator. A logical object can be removed while a recoverable version survives. Ciphertext can remain on storage after its usable keys have been destroyed. Physical media can be sanitized without addressing a copy previously exported to another service. Treating these as one state creates promises the evidence cannot support.
NIST SP 800-88 Revision 2 defines media sanitization in terms of making access to target data infeasible for a specified level of effort (Chandramouli & Hibbard, 2025). That is a useful reminder to name both the target and the assurance boundary. An application-level delete response is not a certificate that a cloud provider sanitized its physical drives.
I would give each location a status that describes its actual condition: active, logically removed, recoverable under restriction, awaiting authorized expiry, cryptographically erased under a validated design, or unresolved. These aren't necessarily successive steps. An encrypted archive might move to cryptographic erasure without being physically overwritten, while a protected backup follows a scheduled expiration path. The deletion record should preserve those differences instead of forcing every store into the same checkbox.
The scope also needs a decision about what must be removed. Identify the subject or record set, data categories, relevant time range, services, exports and derived material. Distinguish a request to remove historical data from a continuing prohibition on future collection. If a person later opens a new account, a poorly scoped suppression rule might erase newly authorized records or mistakenly recreate the old account from an identifier match.
Retention obligations and exceptions require the organization's appropriate privacy, legal and records decision-makers. My engineering question is what their decision requires the system to do and what it can demonstrate afterward. “The backup policy says thirty days” is not enough if some recovery points are retained under another rule. Neither a legal conclusion nor a universal deletion deadline can be inferred from the architecture described here.
Model the ways data can return, not just where it sits
A useful data map includes transformations and replay paths. The source record may feed a warehouse, search index, export, support attachment, analytics job, event stream and test environment. Those stores may generate further outputs. A deletion procedure that inventories only the operational database misses the paths through which the record can become useful again.
The NIST Privacy Framework 1.0 includes outcomes for accessing data elements for deletion, destruction according to policy, communicating deletions, maintaining lineage, and minimizing audit records (National Institute of Standards and Technology [NIST], 2020, CT.DM-P4–P9; CM.AW-P5–P6). I would translate those outcomes into a map with an owner, identifier relationship, retention rule, deletion mechanism, recovery route and evidence source for each relevant store.
The identifier relationship matters. The same record may be represented by a customer number in one system, a message identifier in another and a storage object key elsewhere. Searching for a person's name everywhere is neither a complete discovery method nor a good reason to spread that name into more logs. Prefer controlled mappings that already connect the systems. Where the mapping is incomplete, record the discovery gap rather than interpreting an empty search result as absence.
Derived information needs a separate decision. Removing a source row does not necessarily remove its contribution to a report, feature set or trained model. Some aggregates no longer identify an individual in the relevant context; others remain linkable through retained attributes or small groups. This article does not establish a model-unlearning guarantee or an anonymization test. I would put those cases into an explicitly reviewed branch, with an accountable owner and a stated reason for the chosen treatment.
Formal research makes the distinction sharper. Garg et al. (2020, §§2–2.1) describe deletion through a comparison between a collector's post-deletion state and a world in which the requester had not supplied the data, under their defined interaction model. The framework captures specified aspects of processing, not every practical system or the meaning of current law. I use it as a question for architecture review: what retained state or downstream interaction still depends on the data after the claimed deletion?
That question also exposes the limits of inventory-based assurance. A complete-looking diagram may omit a human export or an unregistered integration. The diagram is a scoped model that must be challenged through configuration review, lineage evidence and representative tests. Counting its boxes cannot establish that no other boxes exist.
Check versions and replicas using their actual semantics
A normal read failure is a weak deletion test when a storage service maintains history. In an S3 bucket with versioning enabled, a simple delete creates a delete marker; an earlier version remains. A version-specific request can still retrieve a noncurrent version when the caller has the required authority (Amazon Web Services [AWS], n.d.-b). A test that checks only the current object can therefore pass while recoverable data remains within the same bucket.
I'd distinguish the logical object key from the versions governed by the request. The evidence should identify which versions were in scope, what action was attempted, which actions failed, and what the post-action inventory shows. Enumeration must account for pagination, permissions and concurrent creation. An incomplete list or an access-denied response is not equivalent to a verified empty set. The operator also needs an explanation for excluded versions, such as an authorized retention restriction.
Replication adds another boundary. AWS documents that deleting a specified object version in the source bucket does not replicate that deletion to the destination. For replication configurations using a Filter element, delete markers are not replicated by default; supported configurations can enable that behavior. Lifecycle-driven actions have additional replication exclusions (AWS, n.d.-d). Those are service-specific rules, not a general claim that replication never propagates deletion.
My acceptance test would inspect the source and every in-scope destination independently. Record the replication rule and destination owner, then verify the intended state at both ends. If a deletion job covers only the source, its receipt should say so. Similarly, copying a retention configuration to a source bucket does not establish that a destination uses an equivalent policy. Disaster-recovery independence and deletion consistency can pull in different directions.
I would avoid a script that treats any successful API response as completion. Request acceptance, per-item processing, version removal, and cross-region reconciliation can be separate events. Preserve partial failures and retries. The operation should be repeatable without deleting newly created, out-of-scope records, which requires a stable request scope and enough version or generation information to distinguish old data from new data with the same name.
Recovery features deliberately keep deleted data available
Google Cloud Storage soft delete retains deleted resources for a configured duration. They are hidden from ordinary list operations by default, remain restorable during retention, and cannot be permanently deleted during that period. Existing soft-deleted resources retain the duration that applied when they were deleted, even if the policy later changes (Google Cloud, n.d.-c). A settings change today is therefore not evidence that yesterday's recoverable copy has vanished.
BigQuery provides a different mechanism. Its documented time-travel window is configurable between two and seven days, followed by an additional seven-day fail-safe period for applicable deleted data. These are service recovery windows with their own scope and limitations (Google Cloud, n.d.-b). Deleting a table or reducing one retention setting should not be reported as eliminating every recoverable representation immediately.
These features aren't defects. They protect against mistakes and hostile deletion. The engineering problem is a mismatch between the recovery behavior and the promise made to the requester. I'd record the relevant configuration at the time of deletion, the expected transition, and the observation needed to verify that transition later. If a provider's interface does not expose its remaining internal copies, state that limitation explicitly.
The evidence can be organized as a set of bounded claims rather than one universal “deleted” status:
| Claim | Evidence that could support it | What remains unproven |
|---|---|---|
| No longer served by the application | Controlled reads under relevant roles and paths | Administrative, historical or exported copies |
| In-scope versions removed | Authorized version inventory plus per-version results | Provider-internal storage sanitization |
| Recoverable copy restricted | Effective access policy, recovery controls and retained-copy inventory | Final expiry or erasure |
| Restore will not republish the record | Isolated restoration with deletion reconciliation | Every untested recovery path |
| Vendor completed its stated process | Scoped receipt, applicable policy and assurance evidence | Independently observed absence from all vendor media |
I would keep the residual uncertainty visible when combining those claims. A requester may need a clear explanation of what has stopped, what is still retained and why, and what event will complete the remaining work. Accurate staged reporting is more useful than a confident statement that later has to be withdrawn.
Design backup recovery so it cannot reverse deletion
An immutable backup creates an intentional constraint. Azure Backup's immutable-vault documentation describes restrictions on operations that would remove recovery points or reduce protected retention; locking the setting can make it irreversible (Microsoft, n.d.). The relevant control must be examined for the actual vault, workload and configuration. An operator should not weaken recovery protection merely to make a deletion dashboard turn green.
S3 Object Lock illustrates a related distinction at the object-version level. Retention periods and legal holds protect specified versions; a legal hold has no automatic expiry. New versions or delete markers can still be created above a protected version (AWS, n.d.-c). A marker can make an object look absent while the protected version remains. The retention decision and the visible application state therefore need separate records.
My preferred design is a recovery gate. Restore into a controlled environment, reconcile against deletion obligations newer than the recovery point, verify the resulting state, and only then permit ordinary access. The gate must cover indexes, caches, queues and downstream publication jobs, not just rows in the restored database. Otherwise the first scheduled export can republish the information you successfully removed during recovery.
The deletion ledger needs to survive the same incident that requires the restore. Keeping it only inside the database being rolled back defeats that purpose. I'd give the ledger an independently recoverable path, access controls, integrity protection and enough information to match the relevant records. Its retention must cover the recovery paths that can still resurrect them. A short-lived marker cannot protect against a much older backup that remains usable.
That ledger is itself sensitive. Retaining full documents, email bodies or attachments as “evidence of deletion” creates a new copy of the problem. Keep the minimum identifiers and decision metadata required for reconciliation. A deterministic hash of a predictable identifier is not automatically anonymous; someone who can enumerate likely inputs may still match it. Any keyed matching design also needs key-management and retention decisions, not merely a different field format.
There is a genuine tradeoff. Applying a large deletion backlog can lengthen recovery, and keeping a minimal suppression record retains some information. I'd make both costs explicit during design, test them against recovery objectives, and consider narrower backup scopes or shorter retention where the authorized requirements permit. A recovery objective that ignores deletion reconciliation is incomplete for a service expected to preserve those obligations after an incident.
Account for delayed replicas, late events and re-imports
Restoring a backup is only one way data can return. An offline replica can retain an old value; a delayed event can recreate a deleted record; an integration can re-import an old export. The shared problem is ordering. The deletion must remain meaningful when earlier information arrives afterward.
Apache Cassandra's documentation describes a concrete version of this problem: a replica can miss a tombstone, then reintroduce old data if the deletion marker has been removed before the replica returns. Tombstone grace and compaction behavior are part of managing that risk (Apache Software Foundation, n.d., “Zombies” and “Grace period”). The appropriate configuration depends on the deployment. I would not reduce a grace interval simply because deletion markers look like unwanted storage.
For an event-driven application, I would specify how a deletion interacts with replay. A consumer needs enough context to recognize that an arriving event belongs to a record generation already deleted. A monotonic sequence, source version, or deletion epoch may help, but it must match the application's identity model. An old identifier reused for a new legitimate account cannot safely be handled by an unqualified “never accept this identifier again” rule.
Then test the race, rather than only the normal sequence. Pause one consumer, delete the record, allow the consumer to resume, and inspect both its local state and anything it publishes. Repeat with a delayed update, a duplicate deletion message, an unavailable destination and a retry after partial completion. These are proposed synthetic tests. No production pipeline was exercised for this paper.
A deletion service should also expose unresolved propagation. I'd want to know which consumers acknowledged the relevant sequence, which remain behind, and what prevents them from serving old data in the meantime. A timeout should produce a pending or failed state with an owner. Treating an unavailable system as successfully empty rewards precisely the condition that prevents verification.
Use cryptographic erasure only when the key boundary fits
Cryptographic erasure can make retained ciphertext inaccessible without rewriting the data itself. NIST's guidance conditions that assurance on suitable cryptography and key management, including wrapping keys, prior plaintext storage, and backed-up or escrowed material (Chandramouli & Hibbard, 2025, §3.2). “The database is encrypted” is not enough to conclude that deleting one key removes one person's information.
The first question is granularity. If thousands of customers share a key, destroying it may make unrelated data unavailable. If each record uses a data key wrapped under a shared key, deleting a database reference to one wrapped key may leave a recoverable copy elsewhere. I would trace the decryption path through key stores, wrapped-key records, backups, caches and exports. The proposed erasure boundary must remove every usable path covered by the claim while preserving data that must remain available.
AWS KMS provides useful examples of why states matter. Scheduling key deletion involves a seven-to-thirty-day waiting period; pending deletion prevents cryptographic use through KMS but is not completed deletion. AWS also documents special handling for CloudHSM-backed keys, including possible orphaned key material and copies in cluster backups (AWS, n.d.-a). The appropriate assurance depends on key origin and storage architecture, not just the API name.
I'd therefore separate evidence that a key is disabled, scheduled for deletion, and actually deleted under the relevant service behavior. Also check whether applications retain usable plaintext data keys or whether data was exported without that encryption boundary. A failed decryption attempt can demonstrate the tested path is unavailable; it cannot establish that an unexamined key copy does not exist.
This is not an argument against cryptographic erasure. A well-designed key hierarchy can make selective deletion more practical. The design has to precede the promise. Retrofitting a per-subject erasure guarantee onto shared archives, reused keys and uncontrolled plaintext exports is a substantially different undertaking from calling a key-deletion endpoint.
Ask vendors for evidence at the boundary they control
A supplier may operate infrastructure you cannot inspect directly. That changes the evidence model; it doesn't make the supplier's general privacy statement a receipt for your particular request. I'd distinguish the vendor's published process, your applicable agreement and configuration, the request-specific acknowledgment, and any independently assessed controls relevant to that process.
Google Cloud's deletion whitepaper describes stages including logical deletion from active systems and later expiration from backup systems, using overwriting and cryptographic techniques in specified contexts (Google Cloud, n.d.-a, stages 3–4). The distinction supports staged assurance. It does not mean a customer observing an API response has personally verified the provider's internal media state, nor should a general whitepaper replace a service-specific agreement.
A useful vendor receipt identifies the service, tenant, request scope, processing time, covered stores, retained categories, applicable expiry conditions and exceptions. It should distinguish requests forwarded to subprocessors from confirmations received from them. For a supplier exit, identify how the request will be tracked after the integration and ordinary administrator account have been closed. Otherwise the evidence channel can disappear before the retained data does.
I would challenge vague certificates. “All data deleted” may exclude backups, support exports, fraud records or records retained for another authorized purpose. Ask what the statement covers and which evidence supports it. That is a scope question, not an accusation. An accurate limited attestation is more useful than a sweeping sentence whose definitions nobody can explain.
Not every vendor will provide item-level physical-erasure evidence, and demanding it universally can be impractical. The alternative is a documented assurance decision: what can be tested from your side, what is supported by contractual commitments and assessed controls, what remains uncertain, and who accepts that residual uncertainty. If the business requires a stronger guarantee than the supplier can support, change the design or the supplier relationship before promising that guarantee to users.
Run one end-to-end deletion exercise before declaring readiness
I would begin with a synthetic record deliberately routed through representative processing paths. Give it controlled identifiers that support matching without using a real person's information. Confirm that it reaches each intended store before deleting it. A negative test against a destination that never received the record tells you nothing about its deletion behavior.
Consider this hypothetical service: an account database feeds a search index, versioned object storage, an analytics destination, a recovery system and a support vendor. The authorized retention decision allows a particular backup copy to remain for thirty-five days, with restricted recovery and reconciliation before reuse. That duration is an invented scenario assumption, not a legal deadline or a provider default.
| Stage in the exercise | Expected evidence | Failure that keeps the work open |
|---|---|---|
| Establish the fixture | Positive observations in each intended destination | Unknown propagation or unverified target |
| Delete active representations | Per-store results and authorized negative checks | Partial batch failure, missed versions or wrong scope |
| Resume delayed processing | Consumer state and downstream observations | Record recreated by a queued update or import |
| Exercise recovery | Isolated restore plus reconciliation results | Deleted record becomes available before the recovery gate |
| Reconcile retained copies | Current inventory, expiry event and vendor response | Retention still active, missing attestation or unresolved hold |
I would include a neighboring synthetic record that must remain. A deletion mechanism that removes an entire tenant can make every target-absence check pass while causing unacceptable collateral loss. Positive controls for retained data are therefore as important as negative checks for deleted data. Test a partial failure as well: one destination unavailable while the others complete. The request should retain that distinction through retries and reporting.
Capture enough evidence to reproduce the assessment: fixture identity, configuration version, relevant permissions, actions, results, timing, exceptions and reviewer decision. Keep content out of the evidence store where an identifier and bounded observation suffice. Protect the test artifacts too; synthetic data can still reveal internal structure, and a test account should not acquire broader production authority than the exercise needs.
The outcome is a coverage statement, not a universal proof. It may establish that one configured set of paths worked under specified conditions. Additional paths, configuration changes and supplier changes need corresponding review. For an AI retrieval system, the related analysis of privacy across the RAG lifecycle identifies additional ingestion, retrieval and cache boundaries to include.
Close the request without hiding retained work
I'd distinguish operational closure from final disposition. You may have completed all currently authorized active-store actions while a restricted recovery copy remains. That can justify a specific milestone, but it does not justify saying every copy has been erased. The record needs a follow-up event and an owner until the remaining disposition is supported.
NIST separates verification that a sanitization operation completed from validation that its outcome is acceptable for the target and circumstances (Chandramouli & Hibbard, 2025, §§4.5.1–4.5.2). I would apply that distinction cautiously at the workflow level: execution evidence answers whether the configured steps ran; acceptance asks whether those steps and their scope support the claim being made. That workflow adaptation is my analysis, not a claim that a database ticket is a NIST sanitization certificate.
The useful measures are time to stop active serving, unresolved destinations, overdue retained copies, vendor confirmations outstanding, and reappearance found during recovery or replay tests. Define denominators against the known in-scope estate and disclose discovery gaps. “One hundred percent deleted” is meaningless if it means every system that happened to answer the checker while excluding unavailable systems and unknown exports.
There are limits to this approach. Inventory can be incomplete, observations can miss inaccessible internal copies, and a vendor's attestation can be narrower than your desired assurance. Historic disclosures cannot simply be recalled by deleting their source. These limitations should shape architecture and communication, not disappear into a footnote after an unconditional promise.
If you can remove the primary row but cannot explain the replicas, backup restore, or vendor boundary, request a briefing on verifiable data deletion. Bring one data lifecycle and the deletion claim you need to support. I would help map the copies and replay paths, distinguish retention decisions from technical failures, and design a synthetic exercise that shows where the evidence holds and where work remains. For the earlier question of which handling rules should apply, see data classification that changes access and handling.
References
- Amazon Web Services. (n.d.-a). Delete an AWS KMS key. AWS Key Management Service Developer Guide. Retrieved October 28, 2026, from AWS KMS documentation
- Amazon Web Services. (n.d.-b). How S3 Versioning works. Amazon Simple Storage Service User Guide. Retrieved October 28, 2026, from S3 versioning documentation
- Amazon Web Services. (n.d.-c). Locking objects with Object Lock. Amazon Simple Storage Service User Guide. Retrieved October 28, 2026, from S3 Object Lock documentation
- Amazon Web Services. (n.d.-d). What does Amazon S3 replicate? Amazon Simple Storage Service User Guide. Retrieved October 28, 2026, from S3 replication documentation
- Apache Software Foundation. (n.d.). Compaction overview. Apache Cassandra Documentation. Retrieved October 28, 2026, from Cassandra compaction documentation
- Chandramouli, R., & Hibbard, E. A. (2025). Guidelines for media sanitization (NIST Special Publication 800-88 Rev. 2). National Institute of Standards and Technology. https://doi.org/10.6028/NIST.SP.800-88r2
- Garg, S., Goldwasser, S., & Vasudevan, P. N. (2020). Formalizing data deletion in the context of the right to be forgotten [Preprint]. arXiv. https://doi.org/10.48550/arXiv.2002.10635
- Google Cloud. (n.d.-a). Data deletion on Google Cloud. Retrieved October 28, 2026, from Google Cloud security documentation
- Google Cloud. (n.d.-b). Data retention with time travel and fail-safe. Retrieved October 28, 2026, from BigQuery documentation
- Google Cloud. (n.d.-c). Soft delete overview. Retrieved October 28, 2026, from Cloud Storage documentation
- Microsoft. (n.d.). Immutable vault for Azure Backup. Microsoft Learn. Retrieved October 28, 2026, from Azure Backup documentation
- National Institute of Standards and Technology. (2020). NIST Privacy Framework: A tool for improving privacy through enterprise risk management, version 1.0. https://doi.org/10.6028/NIST.CSWP.01162020