The problem
Campaigns on Metrike's platform start with a media plan sent by the agency: a spreadsheet built in that agency's own format. Merged headers, vehicles spread across rows, formats written in different ways, periods marked as weeks. Before anything could run, someone had to translate that plan into Metrike's standard ad delivery plan (ADP), and then create everything on the external ad server by hand: advertisers, zones, campaigns, display creatives and VAST video. The setup step alone took about 3 hours of manual work per campaign.
What I built
- Media plan agent. An AI agent built on Claude with tool use reads the uploaded spreadsheet, identifies vehicles, formats, periods and quantities, and returns rows in the standard ADP structure. It runs in a queue, so the user can upload and come back later instead of waiting on a request.
- Review before import. The generated ADP opens in an editable table. Rows and cells the agent is not sure about are flagged with a short note, and a person fixes or confirms them before approving the import.
- Campaign setup automation. From an approved ADP, the platform builds a plan of every action needed on the external ad server (advertisers, zones, campaigns, creatives, display and VAST), shows it for confirmation, and then executes it through the ad server's REST API.
Key decisions
- Human in the loop at one point. The agent does the reading and normalizing, but nothing reaches the ad server until a person approves the ADP. Uncertain values are marked instead of guessed, so review time goes to the few cells that need it.
- Async processing. Conversions run as queued jobs with status polling, which keeps the web request short and lets large plans take the time they need.
- Plan, then execute. Setup is split into a plan step and an execute step. The plan is reviewable before anything is created.
- Idempotent and resumable. Each action has a stable key and stores the ID the ad server returns. Entities that already exist are reused, not duplicated, and an interrupted run continues from the last completed action.
Results
- The whole process, from media plan to live campaign, takes 83% less time.
- Campaign setup went from about 3 hours of manual work to about 10 minutes.
- Stack: Laravel/PHP platform, queues for async processing, Claude API with tool use, external ad server REST API.




