Security
What we store, how it’s isolated, and why you stay in control.
A precise answer to the question every agency asks us during onboarding — written by the people who built the system, not by lawyers.
Our architecture in one paragraph
Adtool is deliberately built as a thin, auditable layer on top of Meta’s Marketing API. You authenticate with Meta directly via OAuth 2.0 — we never see or store a password. Every action Adtool takes runs through Meta’s own permission system under a scoped access token you can revoke at any time, and every piece of data we hold is isolated per organization with row-level security enforced by the database engine itself — on every table, no exceptions.
What we store, precisely
We follow a strict data-minimization principle: we store what powers your workspace, and nothing speculative.
We store
- Account and team data Your name, email, organization membership, and workspace settings.
- Campaign configuration The campaigns, ad sets, and launch settings you build in Adtool, so your work is reusable and traceable.
- Creative assets and thumbnails The creatives you upload while we deliver them to Meta’s ad system, and rendered thumbnails so your library and reporting views load instantly.
- Aggregate performance metrics Impressions, reach, spend, and results synced from Meta’s API to power your reporting. These are aggregate numbers about your campaigns — they contain no personal data about the people who saw your ads. Meta never exposes that to us, and we never store it.
We never store
- Passwords for Meta or Google The OAuth 2.0 authorization-code flow means credentials go to Meta and Google directly — only a scoped token reaches us.
- Audience members or customer lists The people inside your audiences never enter Adtool. Your campaign setup references audience configurations — a custom audience’s ID and name — but the member data underneath stays with Meta. No table for audience-level personal data exists in our schema, by design.
- Card data Payment handling is delegated entirely to Stripe (PCI DSS Level 1). We hold a customer reference ID, nothing more.
Access control and tenant isolation
- Row-level security on every table. Tenant isolation isn’t a check in our application code that a bug could bypass — it’s a policy enforced by PostgreSQL itself. A query scoped to your organization is physically incapable of returning another organization’s rows.
- Authentication on every customer-data route. Every request that touches your data re-validates the caller’s session server-side before any access. Privileged operations — including our own internal admin tooling — sit behind independent, allowlisted authorization checks that fail closed.
- Webhook integrity. Inbound callbacks from Stripe and Meta are cryptographically verified (signature / HMAC validation) before they’re processed. Unsigned requests are rejected.
- Internal access. Production data access is limited to the small set of engineers who operate the system, under the same audit-logged constraints our privacy policy commits us to.
The Meta connection, in depth
This is the part agencies rightly scrutinize, so here it is without abstraction:
- Authorization, not credentials. You grant access on Meta’s own domain. Adtool receives a scoped OAuth token tied to the specific permissions required to manage pages, upload creative, read performance data, and launch ads — nothing broader.
- Instant, unilateral revocation. Removing Adtool in your Meta Business settings kills the token immediately. There is no residual access, no offboarding process on our side required.
- A complete audit trail — on Meta’s side. Because everything runs through Meta’s permission system, every action Adtool performs appears in your Meta activity history, exactly as if a team member had done it. You never have to take our word for what happened.
- Rate-governed, read-disciplined syncing. Our performance sync engine is built to operate well inside Meta’s API limits with per-account governance — the engineering discipline Meta expects of platforms with advanced API access.
- Subject to Meta’s standard, every year. As a platform with advanced access to Meta’s advertising APIs, Adtool is subject to Meta’s annual Data Protection Assessment. Falling short means losing the access our product exists on — our security incentives are structurally aligned with yours.
Infrastructure and encryption
We made an explicit architectural decision not to operate our own servers. Adtool runs entirely on independently audited infrastructure:
All traffic is encrypted in transit with TLS. Data at rest is encrypted (AES-256) at the infrastructure level across these platforms. The full provider list, with data locations and transfer safeguards, is public on our subprocessors page — nothing is undisclosed.
European by law, not by checkbox
Adtool ApS is a Danish company. GDPR isn’t a framework we opted into for market access — it’s the law we’re incorporated under.
- A Data Processing Agreement as standard. Our DPA is part of our standard terms. No enterprise tier, no negotiation.
- Documented transfer safeguards. All US-based subprocessors operate under EU Standard Contractual Clauses, documented per provider on our subprocessors page.
- Deletion on request, revocation instantly. Disconnecting Meta severs our API access at once; a deletion request to us removes your stored data. Both are permanent — the only exceptions are records we’re legally required to keep, like invoices under Danish bookkeeping law, which follow the statutory retention periods set out in our Privacy Policy.
Formal documents: Data Processing Agreement · Subprocessors · Privacy Policy
Questions worth asking us
The ones that come up in every serious evaluation — answered the way we’d want them answered.
Campaign structure, uploaded creative, and aggregate performance numbers — the material you’d see in a reporting deck. Not the people: audience members, customer lists, and card data never enter our schema.
The honest, engineering answer: scoped API tokens (revocable by you, instantly, from Meta’s side), aggregate campaign metrics, and creative assets — each isolated per organization at the database layer. No passwords exist in our systems to leak, and no audience-level personal data exists to expose.
Every action is visible in your Meta activity log, attributed and timestamped by Meta — an audit trail we couldn’t alter if we wanted to.
Revoke in Meta Business settings (seconds, unilateral), request deletion (permanent). No lock-in mechanics.