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.

01

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.

02

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.
03

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.
04

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.
05

Infrastructure and encryption

We made an explicit architectural decision not to operate our own servers. Adtool runs entirely on independently audited infrastructure:

SupabaseDatabase, authentication
VercelApplication hosting
StripePayments
CloudflareMedia processing & delivery

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.

06

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.

Security at Adtool — What We Store, How It’s Isolated, and Why You Stay in Control | Adtool.io