The problem
Built for Matter Marketing, an agency, over the content archive of a large publisher it works with.
GA4 knows which URLs got traffic. The articles know what they were about. Nothing joins the two, so "what should we write next" is answered from a keyword spreadsheet that has no connection to what actually performed.
What was built
A pipeline that joins the two and outputs recommendations an editor can check:
- GA4 ingestion. Per-article metrics pulled through the GA4 Data API and aggregated over time.
- Article scraping. The published page is fetched with Playwright, so the analysis runs on what readers saw rather than on a CMS record that may have drifted.
- Topic and keyword extraction. Each article is reduced to the themes and entities it covers.
- Recommendations with the evidence attached. Every suggestion carries the data that produced it, so an editor can see why it was made and reject it.
The output is what performed, what each piece was about, and where those two diverge. Deciding what to do about it is still a person's job.
n8n first, then Node.js
The pipeline was prototyped in n8n: every intermediate payload is visible, a branch can be rerouted in seconds, and you find out quickly that step four was never needed.
Once the flow stopped changing it moved to a typed Node.js service. Not a limit of n8n — at that point what the project needed was types, tests, code review and CI, which a repository handles better than a canvas.
Stack
- Prototype: n8n
- Production: typed Node.js
- Data: GA4 Data API
- Scraping: Playwright
- Language model: OpenAI, for topic and keyword extraction
Credentials
Our Apollo.io node is published on npm as
n8n-nodes-apollo (MIT, maintainer arturl95,
14 resources, source public). We hold n8n Verified Creator status.