Your ad accounts generate real revenue. We treat their security accordingly. Seven isolation layers, zero password storage, AES-256 at rest, TLS 1.3 in transit. This is the architecture.
Auth.js v5 + Upstash
Authentication, sessions & rate limiting
Meta Marketing API
Official platform OAuth v21.0
Supabase / AWS RDS
AES-256 encrypted data at rest
Cloudflare
DDoS protection & rate limiting
Vercel Edge
TLS 1.3 global CDN delivery
Stripe
PCI DSS Level 1 payments
Defense in Depth
Each layer independently mitigates a distinct threat surface. Compromising one doesn't compromise the next.
Every session is authenticated via Auth.js v5 (NextAuth) — enforcing HS256-signed JWTs stored exclusively in httpOnly, Secure, SameSite=Lax cookies. Credentials are validated server-side against bcrypt hashes; Google OAuth uses the official PKCE flow. Brute-force lockouts are enforced at the route layer via Upstash Redis rate limiting — 5 attempts per email per minute, 20 per IP per minute, with fail-open on Redis outage. Unverified emails are blocked from accessing the dashboard.
When you connect your Meta ad account, we initiate Meta's official OAuth 2.0 Marketing API flow. You authenticate directly on Meta's domain — we never see your password. The resulting access token is stored server-side as an httpOnly, Secure, SameSite=Lax cookie — invisible to JavaScript, immune to XSS injection. The same token is also persisted server-side in your isolated database row as a backup. You can revoke access from Meta's Security Settings at any time.
All user data is stored in Supabase PostgreSQL running on AWS infrastructure in eu-west-1 (Ireland). AWS RDS enforces AES-256-XTS encryption on every storage volume by default — keys managed via AWS KMS with automatic annual rotation. Our service role key, the only credential that can bypass row-level policies, lives exclusively in server-side environment variables — it has never touched a client bundle or browser context.
All traffic between your browser and AdHorde's edge traverses Cloudflare and Vercel's global network over TLS 1.3 — the latest protocol, with removed legacy cipher suites, 0-RTT resumption guards, and perfect forward secrecy via ECDHE key exchange. HTTP Strict Transport Security headers with a 1-year max-age ensure your browser never falls back to plaintext. Every plaintext HTTP request is permanently redirected to HTTPS at the edge.
Every API endpoint enforces per-IP rate limiting at the application layer, backed by Cloudflare's global anycast network absorbing volumetric attacks before they reach our origin. The AI copilot endpoint limits to 20 requests per minute per IP. Campaign creation, credit operations, and automation writes all have independent limits. Requests that exceed limits receive a 429 with a Retry-After header — they're never queued for delayed execution.
All payment processing is delegated to Stripe — a PCI DSS Level 1 Service Provider, the highest certification tier possible. Your card number, CVV, and expiry date are captured directly by Stripe's JavaScript SDK on Stripe's domain and are tokenized before any data reaches our servers. What we receive is a Stripe token reference, never raw card data. Webhook events are validated via HMAC-SHA256 signature verification on every delivery — spoofed events are cryptographically impossible to forge.
Admin operations generate immutable audit log entries in PostgreSQL: action type, timestamp (UTC), admin user ID, target user ID, email, and a full JSON diff of what changed. Automation rule events — rule created, edited, fired, paused, deleted — are logged in Cloudflare KV with millisecond-precision timestamps. Both logs are write-append-only from the application layer — there is no delete endpoint exposed to admin users.
Data Handling
We Store
We Never Store
Infrastructure
We don't build security from scratch — we compose it from best-in-class providers, each with independent third-party audits.
Auth.js v5 + Upstash Redis
Authentication & Rate Limiting
AWS RDS (via Supabase)
Database
Stripe
Payments
Cloudflare + Vercel
Edge & CDN
We take security reports seriously. If you've identified a vulnerability in our platform, please disclose it responsibly. We'll acknowledge your report within 24 hours and keep you updated throughout the resolution process.
Report a Vulnerability →contact@adhorde.com · We respond within 24 hours