← Back to Work
Automation[PIPELINE][CLIENT WORK][REAL BUILD SHOWN]

Digest

Multi-source ads reporting engine

A 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

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

  1. ScheduleWeekdays, 8am
  2. Google Ads + Meta AdsFetch in parallel
  3. n8nNormalize and merge
  4. Claude APIFormat the report
  5. SlackDeliver

Proof

The real build

Real buildn8n workflow
The real pipeline: both ad platforms run as parallel branches, merge into one payload, and Claude formats the Slack message. This is a portfolio copy that isn't connected to live accounts, which is what the warning marks show. The destination channel is redacted.
n8n workflow · original resolution

Step by step

How it works

  1. 1A schedule starts the run every weekday morning. No one has to remember.
  2. 2Each client's Google Ads and Meta Ads accounts are fetched in parallel.
  3. 3Both responses are normalized to one schema and merged.
  4. 4Claude turns the numbers into the same readable summary every day.
  5. 5The report posts to Slack, where the media buyers already work.
Pipeline Activity
TriggerSplitFetchNormalizeFetchNormalizeMergeFormatDeliver

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