One unified campaign.
Compose once in a five-step wizard. Crackle fans the same campaign across every connected exchange — with auction-correct mapping baked in.
Crackle bids one campaign across Google Ad Exchange, Xandr, and a growing fabric of open-web supply. Compose once and let our bidder win the auction on every one — with the speed of a trading desk and the controls of a CFO.
Pick a goal, set the budget, draw the audience, drop creatives. Crackle decides which exchanges to fan out to and how to translate every field — you never rewrite the same ad per exchange.
Your one campaign becomes N distributions in a single transaction. Budget split, bidding intent, targeting matrix — all platform-correct, all observable. Sync takes ~15 seconds.
Unified spend, impressions, conversions, ROAS across every connected source. No platform tabs to switch between. Approve mid-flight changes from a single inbox. Audit log included.
Compose once in a five-step wizard. Crackle fans the same campaign across every connected exchange — with auction-correct mapping baked in.
Budget split and targeting translated per platform, with super-admin overrides and tenant-level pacing rules.
Every distribution is observable. Sync failures fire instant notifications; retry policy is built-in, not bolted on.
Lower roles propose changes, admins approve diffs. Every accepted change is immutable audit history.
Aggregated metrics across every platform. Warm path sub-100ms; cold path async with a job ID. No platform tabs to juggle.
KVM-wrapped tenant secrets, rotatable on demand. Plaintext is never persisted. Audit log per access.
One choice — App installs, Conversions, Reach, or Catalog. Geo and time-of-day get translated exchange-by-exchange. You never rewrite the same ad per exchange.
· ▍
Marketing roles propose edits — budget, bidding intent, geo, creatives, schedule. Admins see a tight diff with the change reason, who's asking, and what will sync if they approve. Approved changes become immutable audit history.
No platform tabs. Crackle aggregates every connected exchange into a single warm-path read — sub-100ms for the most-requested ranges, cold-path async for the rest. Both paths return the same shape, so dashboards never branch.
Crackle wraps every connected account credential with KVM — our key version manager. Tokens never sit in plaintext, rotation is one click, and every access leaves a tenant-scoped audit row. The libsodium driver ships today; cloud-KMS envelope swap is a config flip, not a migration.
DB::table reaches the store. Crackle's tenant model is built for agency life: a single super-admin pane over every customer, role-gated dashboards per client, distribution and pacing rules per tenant, and a customer event log per account that ends Slack archaeology.
If you don't see yours here, we're at hello@crackle.tech and reply within a working day.
Both. Crackle is a DSP with a campaign-composer front door: compose one campaign and our bidder wins auctions across every connected exchange — Google Ad Exchange, Xandr, and the open programmatic web — with all the controls (approval, reporting, audit, KVM secrets). The live auction feed on this page is a synthetic preview of that bidder.
Every business table carries tenant_id, and a Laravel global scope injects it on every query. Cross-tenant reads require explicit withoutGlobalScope — super-admin only. Spatie permissions run in teams mode keyed to tenant_id. The audit log is tenant-scoped too.
Never plaintext. Crackle's KVM (key version manager) envelope-encrypts every connected-account secret. The libsodium driver ships today; a cloud-KMS envelope is a config flip when you're ready. Rotation re-wraps existing tokens transactionally; old data keys archive with a tombstone row.
The PlatformSyncJob fires with a RetryPolicy. Failures emit a Customer Event (with a friendly message — platform error tokens are stop-list filtered), a notification to the tenant's bell, and an optional webhook. If retries exhaust, the campaign moves to partially_failed status and admin gets a card in the dashboard.
They block. The ApprovalGate trait sits on every mutating controller. shouldGate(role, change_type, tenant.approval_mode) returns true → the write becomes a change_request row, not a campaign mutation. Approved requests are immutable history.
Invite-only during v2 build (we're top-down provisioning, not self-signup). Two pricing dimensions when we open: tenant seats and bid volume. Talk to us; we'll size a sandbox.
Crackle is invite-only during v2 build. Drop your details and we'll bring you in as soon as your tenant slot opens.