Tenant Offboarding and Data Deletion Workflow
Export the tenant data for the customer, confirm the retention or deletion request, remove data across all systems and backups, and produce an attestation.
Objective
Offboard a tenant by exporting what must be returned and deleting what must not be retained, with proof.
Environment
- An inventory of systems holding tenant data
- A backup retention policy
Steps
1. Export the tenant data
Export the tenant data in a portable format for the customer.
Expected state: The customer has their data.
2. Confirm the deletion versus retention decision
Confirm the deletion versus retention decision in writing.
Expected state: The action is authorized and recorded.
3. Delete tenant data across primary stores,
Delete tenant data across primary stores, caches, and derived systems.
Expected state: No live copy remains.
4. Expire or redact backups per policy
Expire or redact backups per policy and issue an attestation.
Expected state: Backups do not silently keep data forever.
Decision points
Delete from backups immediately or wait for expiry?
- Wait for retention expiry
- Immediate rewrite
Immediate rewrite of backups is expensive and itself risky; expire per policy with a documented maximum lag.
Question the deletion scope?
- All systems
- Only the primary database
All systems that hold tenant data, or the deletion is incomplete and unprovable.
Expected outcome
Tenant data is exported where required, deleted where required across all systems including backups per policy, and an attestation is recorded.
Verification
Verify each system in the inventory reports zero remaining records and that the attestation references the exact scope and dates.
Cleanup
Remove provisioned resources and close the tenant record with a deletion proof.
Overview
Offboard a tenant by exporting what must be returned and deleting what must not be retained, with proof. Verify each system in the inventory reports zero remaining records and that the attestation references the exact scope and dates.
Steps
- Export the tenant data in a portable format for the customer. Expected state: The customer has their data.
- Confirm the deletion versus retention decision in writing. Expected state: The action is authorized and recorded.
- Delete tenant data across primary stores, caches, and derived systems. Expected state: No live copy remains.
- Expire or redact backups per policy and issue an attestation. Expected state: Backups do not silently keep data forever.
await exportTenant(tenantId, { format: 'ndjson' });
for (const system of tenantSystems) {
await system.purge(tenantId);
}
await attestDeletion(tenantId, { scope: tenantSystems, maxBackupLagDays: 35 });
Verification
- Tenant data is exported where required, deleted where required across all systems including backups per policy, and an attestation is recorded.
Decision points
- Delete from backups immediately or wait for expiry? Options: Wait for retention expiry; Immediate rewrite. Recommended: Immediate rewrite of backups is expensive and itself risky; expire per policy with a documented maximum lag.
- Question the deletion scope? Options: All systems; Only the primary database. Recommended: All systems that hold tenant data, or the deletion is incomplete and unprovable.