Security
Last updated 28 July 2026
The short version
Agencies hand Zoppl the keys to their clients' advertising accounts. We treat that as the highest-consequence thing in the system: credentials are encrypted and never leave the service boundary, tenants are isolated at every layer, and no automated change reaches a live ad account without a human approval on record.
Credential handling
- OAuth tokens are encrypted at rest with AES-256-GCM under a key held in a dedicated secret manager, keyed per connection so one compromised record cannot unlock another.
- No public API returns a credential. Tokens are never rendered in the interface and never written to logs or error traces.
- Credentials are released only to the internal service performing a specific job, over the private mesh, authenticated on every call with a short-lived service token.
- We request the narrowest scope that does the job, and a lost or revoked credential degrades the affected capability rather than failing the product.
Tenancy isolation
- Identity comes from the verified session token, never from the request body. No API accepts a caller-supplied user identity. An organisation or workspace identifier in a request is a resource selector that must be authorised, not a claim about who you are.
- Every endpoint declares its required role and its tenancy scope, and the gateway enforces both before the request reaches the service that would answer it.
- Workspace membership is resolved per request. Access to one client's data never implies access to another's.
Change safety
- Automation proposes; humans dispose. An automated recommendation becomes a pending approval, not an action. Nothing reaches a live ad account without an approval record naming the person who approved it.
- Spend-affecting changes are bounded by configurable caps — a maximum budget change percentage and a minimum spend before a pause — enforced server-side before the platform is called.
- Every applied change is written to an immutable audit trail with the actor, the before/after values, and the platform's response.
- Diagnoses are deterministic arithmetic. The language model explains and orders findings; it cannot create one or change its severity.
Artificial intelligence
Model inference runs on infrastructure we operate, inside our own private network. Customer data is never sent to a third-party AI provider and is never used to train any model.
Infrastructure
- Hosted in Singapore on dedicated hardware.
- TLS 1.2+ for all external traffic; internal service traffic stays on a private network.
- Secrets are held in a dedicated secret manager and injected at runtime — never committed to source control or baked into images.
- Infrastructure and application deployments are declarative and version-controlled, so every production change is reviewable and revertible.
- Encrypted backups on a rolling 35-day cycle.
Where we are not yet
We would rather tell you this than have you discover it in a questionnaire:
- We are not SOC 2 or ISO 27001 certified. No audit is complete and none is in progress. We are happy to walk through our controls directly.
- No third-party penetration test has been completed yet. One is planned.
- Two-factor authentication is available but not yet enforceable organisation-wide.
- We do not yet publish a formal uptime SLA.
Reporting a vulnerability
Email inbound@zoppl.com. Tell us what you found and how to reproduce it. We will acknowledge within two business days and keep you updated until it is resolved. We will not pursue legal action against good-faith research that avoids privacy violations, data destruction and service degradation.