Security at Spun
Where your data is stored, which providers can see it, and what we have actually built to keep it separated from everyone else's. Written to be checked, not skimmed.
Last reviewed: 2026-08-07
Where your data lives
Germany first, with one US cell
Spun runs two data cells. eu-1 is in Nuremberg, Germany, on Hetzner infrastructure; it holds the control plane and the large majority of organisations. us-1 is in Manassas, Virginia, on netcup infrastructure. Two organisations are homed there today; every other organisation is in Germany.
Placement is not guessed from where you happened to be when you signed up. No country is mapped to a cell, so new organisations are created on the EU cell. Your organisation is homed on exactly one cell, and its data stays on that cell until someone deliberately moves it.
Media — images, video, audio and document attachments — is stored in Cloudflare R2 and served only through signed URLs scoped to a single object, never from a public bucket address.
The limit of any residency claim
Data stored by Spun resides in your region. That is the honest boundary, and we will not draw it wider. A WhatsApp channel is a WhatsApp client: message content also exists on the WhatsApp gateway that runs it, and it transits Meta's infrastructure. Neither is under our control, and no vendor in this category can remove that asterisk. Separately, conversations that span two organisations inside Spun are hosted centrally in Germany regardless of where each participant's organisation is homed.
Retention is your decision. We do not delete your messages on a schedule of our own choosing — data stays until you delete it, or until a retention window you configure removes it. The deletion and export tools below are the mechanism.
AI
Does my customer data go to OpenAI?
For some features, yes — and you can see exactly which, and turn each of them down or off. Nothing is sent to an AI provider except as part of a feature you are using. Your messages are not used to train any provider's models.
| Feature | What is sent | Providers | Your control |
|---|---|---|---|
| Compose, improve, summarise, smart replies | The message text (or its PII-redacted form) for the conversation you are working in | OpenAI — Sarvam AI for Indian languages | AI chatbot redaction level |
| Weave assistant / ask-anything | The conversation excerpts needed to answer your question | OpenAI | Weave redaction level |
| Contact summaries | The conversation transcript being summarised | OpenAI | Contact-summaries redaction level |
| Intent and interest classification | The single inbound message being classified | OpenAI | Intent-classification redaction level |
| Voice-note and call transcription | The audio file | OpenAI (Whisper), Sofer.ai for Hebrew, Speechmatics, Deepgram, AssemblyAI, Google Cloud, Microsoft Azure, Sarvam AI for Indian languages — which one depends on the language and your plan | Transcription can be turned off entirely |
| Message translation | The text being translated | OpenAI — Sarvam AI for Indian languages | Can be switched off completely per organisation |
| Text-to-speech | The text being spoken | OpenAI, ElevenLabs, Google Cloud, Microsoft Azure, Speechify, Sarvam AI | Only runs for voice features you use |
| Search embeddings | Message and contact text, with financial and credential data always stripped first | OpenAI | Can be switched off completely, and existing indexes purged |
The defaults, stated plainly
An organisation that never opens the privacy settings runs with redaction off for the chatbot, Weave, contact summaries and intent classification — those services receive message text as written. Translation and search embeddings default to the financial-and-credential strip described below. The onboarding flow offers a preset before the first WhatsApp connection, and Balanced — full redaction for every AI service, search and message translation still working — is the recommended choice. If you want a stricter default, set it in Settings → Safety on day one.
PII redaction
What gets stripped, and when
Redaction runs on our server before the request leaves it. Detected values are replaced with opaque placeholders, and the map from placeholder back to the original value is never sent to the browser or to the provider.
Off
The provider receives the message as written.
Full
Every detected category is replaced by a placeholder before the request leaves our server: names known from your contacts, phone numbers, email addresses, national ID numbers, card numbers, bank and IBAN details, payees, passport numbers, dates of birth, street addresses, URLs with parameters, WhatsApp invite links, and API keys or tokens.
Partial
The financial and credential set is always stripped — card numbers, bank details, IBAN, payees, national IDs, passport numbers, API keys and tokens — while ordinary text is preserved so search and translation still work.
Disabled
The feature does not run at all, so nothing is sent to any provider.
One rule holds at every setting: card numbers, bank and IBAN details, payees, national ID numbers, passport numbers, API keys and tokens are stripped from anything used to build search indexes. Detection covers ten language groups and validates what it can — card numbers and Israeli ID numbers are checksum-verified rather than pattern-matched alone.
Redaction reduces what a provider sees. It does not un-send anything already processed, and we say so on the confirmation dialog rather than in a footnote.
Engineering
How Spun is engineered for safety
These are mechanisms in the product, described as what they do rather than as badges.
Can another Spun customer ever see my data?
Tenant tables in PostgreSQL carry row-level security policies, so the database itself filters every read and write by organisation — a query that forgets the organisation filter returns nothing rather than someone else's rows. A repository guardrail (npm run check:rls) reads the live set of RLS-enabled tables straight from the database and fails if any raw query touches one outside the organisation-scoped wrapper.
What decides what I am allowed to do?
Firebase verifies who you are and supplies nothing more than your user id and email. Your organisation membership, your active organisation and your effective role are looked up in the database on every request. A token cannot assert a role or an organisation, because nothing in the token is trusted for that.
Can I stop my messages reaching an AI provider?
Redaction is set per AI service, not once for the whole product, so you can leave transcription on while the chatbot only ever sees redacted text. Translation and search embeddings can be switched off outright, and financial and credential data is stripped from embeddings at every setting.
How do export and deletion actually work?
A request from inside the app sends a verification email; only after the emailed token is used does the request become live. Verification starts a 30-day fulfilment clock, and a deletion request carries a seven-day grace window you can cancel from the same screen. Every step — requested, verified, cancelled, fulfilled — is written to the audit log.
What stops a bug from mass-messaging my contacts?
Every outbound WhatsApp call goes through one audited client. It writes a per-organisation audit row for each call, watches for rate spikes across the platform, and opens a circuit breaker on a channel that keeps failing so one broken channel cannot take the rest down with it. A DONOTSEND label on a contact is enforced by the automated senders — campaigns, autopilot, drip sequences and proactive flows all check it before they send.
Is there a record of who did what?
Authentication attempts, exports, deletions, bulk operations and administrative actions are written to a structured audit log with the actor, the organisation, the action and the outcome. Access to the log is organisation-scoped like everything else.
Can I get off your mailing list for good?
Promotional email carries one-click unsubscribe headers (RFC 8058), so the native button in Gmail and Yahoo works. The link is signed, the unsubscribe is recorded server-side, and the suppression list is checked before any promotional email is sent. Account and security notifications are separate and keep working.
What sits between the internet and your servers?
Cloudflare terminates TLS at the edge and re-encrypts to origin, with WAF and DDoS protection always on and origin certificates pinning requests to our own servers. Media is never served from a public bucket URL: every download goes through a signed URL scoped to one object, with a fixed expiry.
Access
Who can reach what
Isolation between organisations is enforced by the database, not by application code remembering to filter. Tenant tables have row-level security policies keyed on the organisation in the current session, so a query without that context returns nothing.
Two roles apply to your team — organisation manager and organisation user — alongside a platform-administrator role held by Spun staff for support. Inbox access is scoped separately again: read-write, read-only, or filter-limited, where a member only sees conversations matching the filter set for them. Conversations shared with another organisation carry their own role on top of that, from viewer through team member and manager to full control, so sharing a thread does not hand over the account.
Identity comes from Firebase, and stops there. Membership, active organisation and role are resolved from the database on every request; nothing in the token is trusted to assert them.
Your data
Deletion and export
An organisation manager can raise a data-export or an account-deletion request from inside the app. The request is not acted on until it is confirmed through a link emailed to the requester, which is how we know the person asking controls the account.
Confirmation starts a 30-day fulfilment clock. A deletion request additionally schedules the purge seven days out, and the request can be cancelled from the same screen at any point before then. Every transition is recorded in the audit log. The export itself covers your organisation profile and settings, the member list, a billing summary and the requester's own audit history, delivered as JSON through a time-limited signed link.
Separately from the request flow, an administrator can delete the organisation's data directly from settings, and switching search embeddings off purges the derived indexes — contact embeddings, conversation chunks, knowledge-base chunks and canned-response vectors — rather than merely stopping new ones from being built.
Self Proxy
What Self Proxy is, and what it can see
WhatsApp treats a connection from a data-centre IP address differently from one that looks like an ordinary business connection. Self Proxy exists so that your WhatsApp channel can connect through an IP address you control: you run a small tunnel program on a computer at your own premises, and your channel's traffic exits to WhatsApp from there.
The path is: the WhatsApp gateway connects to a port on a Spun relay server, the relay forwards that connection down a TLS tunnel your computer opened outbound, and your computer makes the final connection to WhatsApp. Because the tunnel is opened outbound, nothing needs to be exposed on your network — no port forwarding, no inbound firewall rule.
What the relay carries
TLS-encrypted WhatsApp gateway traffic, relayed in real time. The relay is a forwarder: it does not store the traffic passing through it.
How it is secured
Three separate credentials per configuration — the proxy credentials the gateway uses, the tunnel credentials your computer uses, and a heartbeat token — so a leak on one side does not compromise the others. Relays authenticate to the platform with their own hashed bearer tokens, compared in constant time.
Relays run in Nuremberg and Manassas, and the one nearest your computer is used. Health checks poll each configuration continuously and mark it unhealthy, then offline, when it stops responding; when a relay itself is down, that is distinguished from your computer being down so you do not get a false alarm. Self Proxy is optional — organisations that do not enable it never touch this path at all.
Vendors
Who else touches your data
29 sub-processors, published as one list with what each does, what it can see and where it operates. The categories:
Infrastructure & hosting
3 vendorsHetzner Online GmbH, Cloudflare, Inc., netcup GmbH
WhatsApp gateway
1 vendorWhapi.cloud
AI providers
10 vendorsOpenAI, LLC, Sofer.ai, AssemblyAI, Deepgram, Speechmatics, Google Cloud (Speech-to-Text and Text-to-Speech), Microsoft Azure (Cognitive Services Speech), Sarvam AI, ElevenLabs, Speechify
Voice & video
2 vendorsLiveKit Cloud, Cloudflare TURN
Phone & SMS
2 vendorsVitalPBX, BulkVS
Authentication & push
2 vendorsGoogle (Sign-In with Google), Firebase Cloud Messaging (Google)
Payments & billing
1 vendorStripe, Inc.
Email & support
2 vendorsSendGrid (Twilio), Chatwoot
WhatsApp routing (proxies)
2 vendorsSpun relay servers (Self Proxy), Home proxy
Monitoring & reliability
3 vendorsSentry (Functional Software, Inc.), Better Stack (Better Uptime, s.r.o.), Axiom, Inc.
Analytics
1 vendorGoogle Analytics
Certifications
What we do not claim
Spun holds no SOC 2 attestation, no ISO 27001 certificate and no HIPAA certification, and is not a HIPAA business associate. You will not find those badges on this site, because we do not have them. Anyone showing you one should be able to show you the report behind it.
What exists instead is on this page: database-enforced tenant isolation with a repository guardrail that fails when it is bypassed, roles resolved from the database rather than asserted by a token, per-service control over what reaches an AI provider, an email-verified export and deletion flow with an audit trail, a single audited path for every outbound WhatsApp call, and a published list of every vendor that can see your data.
If you have a security questionnaire, send it to [email protected] and we will answer it against what is actually built.
Contracts
Data Processing Agreement
For your customers' data, you are the controller and Spun is the processor. A Data Processing Agreement is available on request, covering the sub-processor list above, international transfers, and the two boundaries stated on this page: that the residency commitment applies to data stored by Spun and not to the WhatsApp gateway's or Meta's own copies, and that conversations spanning two organisations are hosted centrally in Germany.
Something here not detailed enough?
Encryption specifics, WhatsApp platform rules and the full privacy control list each have their own page. For anything else, email [email protected].