Skip to content

Account Deletion

Account deletion in Breeze is a request-and-review process with a 30-day grace period, not an immediate erase. A user submits a deletion request; an administrator reviews it; a back-office process completes the deletion after approval. This gives organisations time to intervene and leaves a complete audit trail.


A signed-in user requests deletion of their own account from the dashboard account settings.

  1. Open Account → Delete account.

  2. Re-enter the account password and complete the multi-factor challenge (MFA is required for this action). Optionally provide a reason.

  3. Submit. Breeze creates a deletion request with status pending and a process-by date 30 days out, and emails the organisation’s administrators a review link.

Password re-entry is rate limited (5 attempts per 5 minutes). Only one pending request per user is allowed at a time — submitting again while one is pending is rejected.

After submission the user sees the process-by date and can cancel any time before it:

  • Cancel: open Account → Delete account again and cancel the pending request. The request moves to cancelled and the account stays active.

Administrators with the users:write permission review pending requests at Admin → Account deletion requests. Approving and rejecting both require the administrator to pass an MFA challenge.

DecisionEffect
ApproveRequest moves to processing. A back-office process performs the actual deletion and moves it to completed.
RejectRequest moves to cancelled. A note explaining the decision is required and is emailed to the user. The account stays active.

The queue can be filtered by status (pending, processing, completed, cancelled), and a pending-count endpoint backs the admin badge.


StatusMeaning
pendingSubmitted by the user, awaiting administrator review. Cancellable by the user.
processingApproved by an administrator; queued for back-office deletion.
completedDeletion finished.
cancelledCancelled by the user, or rejected by an administrator (with a required note).

Mounted under /auth. All require authentication; submission also requires MFA.

MethodPathDescription
GET/auth/account-deletion-requestReturn the user’s current pending request, if any
POST/auth/account-deletion-requestSubmit a request. Body { "password": "...", "reason": "..."? }. Re-verifies password; requires MFA
PATCH/auth/account-deletion-request/:idCancel a pending request. Body { "status": "cancelled" }

Mounted under /admin. Require the users:write permission; the process action also requires MFA.

MethodPathDescription
GET/admin/account-deletion-requestsList requests (filter by status)
GET/admin/account-deletion-requests/pending-countCount of pending requests
GET/admin/account-deletion-requests/:idGet a single request
POST/admin/account-deletion-requests/:id/processDecide a request. Body { "action": "approve" } or { "action": "reject", "adminNote": "..." } (note required when rejecting)

Deletion activity is recorded in the audit log. User actions are logged as user.account_deletion.requested (including denied attempts, e.g. an invalid password) and user.account_deletion.cancelled. Administrator approve/reject decisions are recorded against the administrator who made them, along with the decision note.


ColumnTypeDescription
iduuidPrimary key
user_iduuidThe requesting user (references users.id, cascade on user delete)
org_iduuidDenormalised tenant attribution; null for partner-level staff
reasontextOptional user-supplied reason
statusenumpending, processing, completed, or cancelled
requested_attimestampWhen the request was submitted
process_bytimestampSubmission time + 30 days
processed_attimestampWhen an administrator decided
processed_byuuidThe deciding administrator (references users.id)
admin_notetextAdministrator note (required on rejection)
created_at / updated_attimestampRow timestamps

A partial unique index enforces at most one pending request per user.