Spend & Search
Growth engine for a DTC brand
One dashboard where organic search and Meta spend stop arguing — rankings, ROAS and budget pacing wired to the same source of truth, refreshed every hour.
- Year2026
- Runs onWeb
- DisciplineSEO & Meta Ads

A sample brief, a real product. We wrote this brief ourselves to show how we work; the client and their story are illustrative. The product is not: it was designed and engineered here, and you can use it below. We publish results only for work a client has let us verify, so this page shows none.
The brief
Marlow & Finch was flying blind across four tools: Ads Manager for spend, Search Console for rankings, GA for sessions, a spreadsheet to reconcile the lies. We built Spend & Search — a growth cockpit fed by the Meta Marketing API and Search Console API, normalised through a BigQuery + dbt pipeline, served by a Next.js app on Vercel.
The approach
Hourly ETL pulls ad-set spend, CPM and conversions from Meta; a nightly job snapshots keyword positions. dbt models blend them into one attribution table, so ROAS is computed the same way everywhere — no more channel-flattering math.
- Meta Marketing API + Search Console ingestion
- BigQuery warehouse, dbt models, tested SQL
- Budget pacing with automatic ad-set pause rules
- Server components, edge-cached KPI reads
What shipped
- Campaign toggles and CRUD
- Pacing against time of day
- A rule builder that actually fires
- Attribution breakdown
- Organic keyword sparklines
- Alerts
- Audiences and lookalikes
- Creatives with A/B tests
- UTM builder and report builder
Under the surface
How it is built
Hourly workers pull Meta Marketing API and Search Console into BigQuery; dbt models normalise attribution, and a Next.js app on Vercel reads pre-aggregated marts so every number is one query deep.
- Meta + GSC ingestion with token rotation
- dbt-tested models — ROAS defined once, everywhere
- Pacing rules auto-pause underperforming ad sets
- Looker Studio marts for the founders' weekly
Considered and turned down
GA4 + spreadsheets — rejected: sampled data and channel-flattering attribution.
Stack
The mechanism, working
The part of Spend & Search that was hardest to get right, as a small model you can operate.
Blended attribution
Meta spend and organic search normalised in one dbt model, so ROAS is defined once and pacing rules act on it.
