Custody

Custody

What stet Cloud holds, who processes it, and how you leave. These pages are generated from the same inventory the infrastructure runs on — an omission there would be an omission here, so the table is kept complete.

Sub-processors

Who touches what

Change notification before any addition takes effect.

Holds contact dataPurpose
Supabase (Postgres)Content, contacts, consent, suppression, audit — the store
AWS SESBroadcast delivery — only for customers who activate Managed sending
Inbound-mail providerReply capture on mail.your-domain — vendor named before launch
InngestForm-intake events only (address in transit, short retention); all other jobs carry IDs
Never sees contactsPurpose
CloudflareEdge worker, bundles, queues, media, hostnames, bot defense
RailwayThe dashboard app
WorkOSSign-in and organisations — roles live in stet's schema
StripeBilling (card data never touches stet)
Resendstet's own account email
Sentry · PostHogErrors and analytics — events carry IDs, never addresses
KMS providerKey custody for encrypted secrets
GitHubThe mirror commit, via a repo-scoped App
Leaving

The eject promise

Your repo always holds a complete, buildable copy of every string — the mirror commit is on by default, so stet eject is a formality, not a migration.

Contacts never enter the git mirror. They live in a database — yours when self-hosted; exportable as CSV/JSON from Cloud at any time, and stet upgrade migrates the list into your own Postgres.

Deletion is self-serve. A deletion request removes the contact and cascades its send history; the only survivor is a hashed suppression tombstone — kept so the person stays unsubscribed — and backups age out within 24 hours.