From a folder of creatives to a ready campaign, no hands
A performance team running high-volume creative production across dozens of countries had a media buyer assembling every campaign by hand. We built the pipeline that does it automatically — and logs every single action.
The problem
A media buyer assembled every campaign by hand: pull creative from Drive, pull copy from a spreadsheet, upload the media, build the ad card, create the campaign and ad groups, set budget, name everything, add UTMs. Multiply that by dozens of near-identical operations a day across many countries, and human error in naming was inevitable — and naming is exactly what all the downstream reporting is keyed on.
What we built
A service that scans the drive, reads the copy from the sheet, and creates the full set of
entities in the ad account — campaign, ad groups, cards, ads — under one naming convention
({GEO}_{number}_v{variant}_{concept}_{date}), grouping creatives 10 to an ad group
and rolling over to the next campaign automatically at the limit. On top of that:
- Video creatives go through chunked upload — real files run 43–60 MB against a 5 MB simple-upload limit — with duration and size validated before upload even starts.
- Idempotency and a full audit log: every API call is written as a row to BigQuery, so any run can be rolled back and traced to exactly what was created and by what.
- Everything is created paused — a human only has to click "activate."
- One scheduler per country, running independently, plus a manual-run mode with a bounded window.
The result
Manual campaign assembly became a pipeline: a folder of creatives goes in, a campaign ready to activate comes out. Entity names are now machine-readable, so ad spend finally joins cleanly to reporting at the individual-creative level. The architecture was built platform-agnostic — porting it to a second ad platform only touched the API layer and creative size limits.
Still building campaigns one click at a time?
We build the agent that assembles the campaign from your creatives and copy — paused, logged, and one click from live.