← Back to Work
Automation[PIPELINE][CLIENT WORK][REAL BUILD SHOWN]
Digest
Multi-source ads reporting engineA scheduled n8n pipeline that pulls daily Google Ads and Meta Ads performance, has Claude format it, and posts a readable report to Slack before the team starts work.
- My role
- Built the scheduled n8n pipeline end to end, from both ad-platform API pulls to the Claude-formatted Slack report.
- Built with
- Google Ads API, Meta Ads API, n8n, Claude API, Claude Code, Slack
- Status
- Client work
- 2 ad platformsGoogle Ads and Meta Ads, pulled in parallel
- Mon to Frireport delivered with no one running it
- 7 to 30 daysreporting window extended without a rebuild
Before
The problem
Ad performance was pulled by hand from two platforms every morning and rewritten into a report. If the person who ran it was out, the report didn't go out.
The system
How the pieces connect
- ScheduleWeekdays, 8am
- Google Ads + Meta AdsFetch in parallel
- n8nNormalize and merge
- Claude APIFormat the report
- SlackDeliver
Proof
The real build
Real buildn8n workflow
Step by step
How it works
- 1A schedule starts the run every weekday morning. No one has to remember.
- 2Each client's Google Ads and Meta Ads accounts are fetched in parallel.
- 3Both responses are normalized to one schema and merged.
- 4Claude turns the numbers into the same readable summary every day.
- 5The report posts to Slack, where the media buyers already work.
Pipeline Activity
SIM: a simplified illustration of how the system behaves, with invented data. Not a capture of the real build.
After
What changed
› Reporting moved from a manual daily task to a fully unattended pipeline.
› Report format is now consistent every single day, regardless of who's covering that morning.
› Extending the reporting window (7-day → 30-day) took a scoped change, not a rebuild.
Stack
For technical readers
Technical detail
The problem, in detail
› Daily ad performance had to be pulled by hand from two separate ad platforms every morning before anyone could act on it.
› Cross-referencing numbers across platforms and writing them into a readable report was repetitive, error-prone, and ate time that should've gone to actual media buying decisions.
› Reporting cadence depended on someone remembering to run it — if that person was busy or out, the report didn't go out that day.
Build notes
A scheduled multi-node pipeline built and orchestrated using n8n, with Claude Code assisting the build process, that runs the full pull-format-deliver loop with zero manual steps.
› A scheduled trigger kicks off the pipeline daily, no one has to remember to run it.
› Performance data is pulled in parallel from the Google Ads API and Meta Ads API, so the report is never waiting on a slow single source.
› Raw numbers pass through an AI formatting layer powered by the Claude API that turns spreadsheet-shaped data into a readable, consistent daily summary — same structure every time regardless of how messy the source data is.
› The finished report posts directly to Slack, already where the media buyers work, not sitting in an inbox.
› Later extended from a 7-day to a 30-day reporting window on request, without changing the underlying pipeline structure.
Pipeline breakdown
01
TriggerMon–Fri scheduled start, no manual kickoff
02
Client Configroster of ad accounts to pull, keyed per client
03
Split (parallel)Google Ads API and Meta Ads API branches run concurrently, not sequentially
04
Fetchper-platform API pull (Google Ads API, Meta Ads API), 7/30-day metrics window
05
Normalizereshapes each platform's raw response into a common schema
06
Aggregaterolls normalized data into per-platform summaries
07
Mergecombines both platform summaries into a single payload
08
Format (Claude)Claude API turns merged data into a clean, human-readable summary message
09
Deliverposts formatted message to Slack