Delete a person's data
Erase an end user's personal data when they ask you to, without losing your revenue history.
When one of your users asks you to delete their personal data, for example under the GDPR right to erasure, you can have Voidhash erase everything it holds about them. You can do it from the person's page in Studio or from your backend through the API.
What is deleted and what is kept
An erasure covers the person and every profile that was merged into them, for example the anonymous profile they used before signing in.
Deleted:
- Their name, email and traits.
- Every distinct id that pointed at them, and the links between those ids.
- Their events, devices registered for push notifications, cohort memberships, unfinished checkouts, and feature flag targeting that names them.
- Their identifiers in your webhook delivery history, in recorded store payloads, and in the content of push notifications sent to them.
Kept, without anything that identifies the person:
- Their purchases, subscriptions and granted access. They stay attached to an anonymous person id, so renewals, refunds and cancellations of a subscription they still pay for keep being recorded correctly.
- Revenue events. They stay in your analytics under the anonymous person id, so revenue, MRR and subscription reports do not change.
- Store transaction and subscription ids on purchases and revenue events. They identify the purchase, not the person, and are needed to account for it.
After the erasure, the person no longer appears in Studio or the API. If the same user later uses your app again with the same distinct id, Voidhash starts a new, empty person for them.
Delete from Studio
Open the person in People and choose Delete person data. Studio shows the progress and returns to the people list when the erasure has finished.
You need permission to delete persons in the project, which organization admins and owners have.
Delete through the API
Send the person's distinct id, or their Voidhash person id, in the request body. Use a secret key on your backend; publishable keys are rejected.
curl https://api.voidhash.com/api/v1/persons/erasures \
-H "x-secret-key: $VOIDHASH_SECRET_KEY" \
-H "content-type: application/json" \
-d '{ "distinctId": "user_42" }'The request is always answered with 202 Accepted and the erasure:
{
"id": "person_erasure_…",
"status": "queued",
"personId": "person_…",
"requestedAt": "2026-10-14T10:00:00.000Z",
"completedAt": null
}The erasure finishes in the background, usually within minutes. Poll
GET /api/v1/persons/erasures/{id} until status is completed, or subscribe a webhook endpoint
to person.deleted, which is sent at the same moment. A day later Voidhash runs the erasure once
more, to remove events the person's devices captured before the erasure but only delivered
afterwards, for example from an offline queue. Events your app sends after the erasure under the
same distinct id belong to the new person and are kept.
With the Node.js library:
const erasure = await voidhash.persons.requestPersonErasure({
payload: { distinctId: "user_42" },
});Some details worth knowing:
- Requests are safe to repeat. Asking again for the same person returns the same erasure.
- If nobody matches the identifier you still get a
completederasure, withpersonIdset tonull. Once an erasure has fully finished, its distinct ids name nobody, so a later request for one is answered this way too. Each request is recorded in your project's audit log either way. - If an erasure ends as
failed, request it again, by person id or by distinct id. The same erasure is retried. - Identifiers go in the body, never in the URL, because a distinct id can be an email address.
Keep your own systems in sync
Voidhash only erases the data it holds. If your backend stores the same person, subscribe to
person.deleted and remove your copy when it arrives. The event carries the personId, the
erasureId and when the erasure completed, but no distinct id, email or name.