# Automate GA4 and Google Ads reports with n8n

> Build a weekly n8n report: GA4 and Google Ads data, week-on-week changes in code, a short AI summary and a Slack post with sheet history.

Source: https://mentionx.ai/learn/n8n/n8n-reporting-ga4-google-ads  
Author: Dipuck Jones, founder of MentionX  
Updated: 4 November 2026  
Level: Practitioner

**A weekly reporting workflow pulls GA4 and Google Ads numbers, calculates changes in code, asks a model for a short plain-English summary of those numbers only, and posts it to Slack. It replaces the Monday morning copy-paste, not your dashboards.**

> **Key takeaways**
>
> - Use the Google Analytics and Google Ads nodes, or HTTP Request for gaps.
> - Do maths in code; let AI only describe given numbers.
> - Post a short summary plus a dashboard link.
> - Check numbers against the source tools before trusting automation.

*Checked 4 November 2026 (CET) against n8n documentation and the n8n pricing page. n8n ships updates often and node options, plan limits and prices change, so confirm in your own instance and on the pricing page. "Our view" marks MentionX opinion. Ledgerline is a fictional company used for illustration.*

## Why automate reporting?

Weekly reporting is predictable, repetitive and error-prone by hand: the same exports, the same pasting, the same summary. Automating it saves time and makes the numbers consistent week to week. It also frees analysts to look at why numbers moved.

Keep dashboards for exploration. The [GA4 Looker Studio lesson](https://mentionx.ai/learn/ga4/ga4-looker-studio-reporting) covers building one; the n8n workflow links to it.

## Setting up Google credentials

n8n uses Google OAuth2 credentials for Google Analytics, Sheets and other Google services. On n8n Cloud, signing in with Google is often enough for supported nodes. When self-hosting, you create an OAuth client in Google Cloud and enable the relevant APIs. The Google Ads node also needs a developer token from your Ads manager account. Check the current credential docs; Google's requirements change.

## Getting the numbers right

Most reporting bugs come from:

- **Date ranges.** Define "last week" once (Monday to Sunday, in your timezone) and reuse it.
- **Timezone.** Set the workflow timezone. GA4 properties have their own reporting timezone too.
- **Metric definitions.** Key events in GA4 aren't the same as Google Ads conversions.
- **UTM hygiene.** Messy tags make channel numbers messy. See the [UTM tagging lesson](https://mentionx.ai/learn/ga4/ga4-utm-campaign-tagging).
- **AI referrals.** Add an AI channel group using the [AI assistant channel regex](https://mentionx.ai/learn/ga4/ga4-ai-assistant-channel-regex) to see AI traffic separately.

## The AI summary

The summary step is useful because people read bullets more than tables. Guardrails:

- Pass the computed numbers as JSON, including changes.
- Say: "Use only these numbers. Don't explain causes unless they're in the notes field."
- Add a notes field the team fills in (campaign launches, outages) so the summary can mention context.
- Keep it to five bullets.

*Our view:* the AI summary is the least important part. Accurate numbers, consistent definitions and a link to the dashboard matter more. Add the summary last.

> **Pro move:** store each week's numbers in a sheet as you post them. After a quarter, you have a clean history that's easier to analyse than re-pulling from GA4.

## Monthly reviews

The same pattern works monthly, with more context. The [Google Ads monthly review routine](https://mentionx.ai/learn/google-ads/google-ads-monthly-review-routine) lists what to check; the [GA4 track](https://mentionx.ai/learn/ga4/ga4-for-marketers) covers report definitions.

## GA4 options in n8n

| Route | Good for | Notes |
|---|---|---|
| Google Analytics node, Report: Get | Standard weekly metrics | Pick property, dimensions, metrics, date range |
| HTTP Request to the GA4 Data API | Filters or features the node lacks | Use Predefined Credential Type with your Google credential |
| BigQuery export plus BigQuery node | Event-level analysis, joins | See the [GA4 BigQuery lesson](https://mentionx.ai/learn/ga4/ga4-bigquery-export-free-tier) |

## Google Ads options

| Route | Good for | Notes |
|---|---|---|
| Google Ads node, Campaign: Get Many | Campaign-level metrics | Needs a developer token and OAuth |
| Google Ads scripts writing to a Sheet | Account-level reports without API setup | See the [Ads scripts lesson](https://mentionx.ai/learn/google-ads/google-ads-scripts-marketers) |
| HTTP Request to the Google Ads API | Anything else | More setup; check API access level |

## Search Console

Search Console data (queries, clicks, impressions) is usually available through the Search Console API with HTTP Request and a Google credential. the [Search Console for Marketers track](https://mentionx.ai/learn/search-console/search-console-for-marketers) covers setup in depth.

## Report contents that people read

A weekly report that gets read is short:

1. Five bullets: what changed and why, if known.
2. A small table: sessions, key events, paid spend, cost per key event, with week-on-week change.
3. AI referral sessions as a separate line.
4. Links to the dashboard and the raw sheet.

Anything longer belongs in the dashboard.

## Common data mismatches

| Mismatch | Cause | Fix |
|---|---|---|
| Sessions differ from GA4 UI | Date range or timezone | Use the property's timezone and exact dates |
| Key events differ from Ads conversions | Different definitions and attribution | Report both, labelled clearly |
| Totals differ from sum of rows | Thresholds or "(other)" row | Use totals from the API, not sums |
| Spend differs from billing | Currency or invalid clicks | Note the currency; use Ads as source of truth |

Agree definitions in writing with whoever reads the report.

## Search Console in the weekly report

To add organic search, call the Search Console API with an HTTP Request node:

| Setting | Value |
|---|---|
| Method | POST |
| URL | `https://www.googleapis.com/webmasters/v3/sites/{{ encodeURIComponent($json.site) }}/searchAnalytics/query` |
| Authentication | Predefined Credential Type, using your Google OAuth2 credential with the Search Console scope |
| Body | JSON with `startDate`, `endDate`, `dimensions` such as `["query"]` and `rowLimit` |

The [Search Console API and AI analysis lesson](https://mentionx.ai/learn/search-console/search-console-api-ai-analysis) covers the API and its limits. For brand versus non-brand splits, see the [branded queries filter lesson](https://mentionx.ai/learn/search-console/search-console-branded-queries-filter); for bigger datasets, the [bulk export to BigQuery lesson](https://mentionx.ai/learn/search-console/search-console-bigquery-bulk-export). The [Search Console and GA4 linking lesson](https://mentionx.ai/learn/search-console/search-console-ga4-linking) explains why the two tools' numbers differ.

## The week-on-week Code node

```javascript
const cur = $('GA4 last week').first().json;
const prev = $('GA4 previous week').first().json;
const pct = (a, b) => b ? Math.round(((a - b) / b) * 1000) / 10 : null;
return [{ json: {
  sessions: cur.sessions, sessions_change_pct: pct(cur.sessions, prev.sessions),
  key_events: cur.keyEvents, key_events_change_pct: pct(cur.keyEvents, prev.keyEvents),
} }];
```

Field names depend on how you shape the GA4 output, so add an Edit Fields node first that renames metrics to simple keys. The model then receives clean, already-calculated numbers.

## Date expressions

| Need | Expression |
|---|---|
| Last Monday | `{{ $now.minus({weeks: 1}).startOf('week').toISODate() }}` |
| Last Sunday | `{{ $now.minus({weeks: 1}).endOf('week').toISODate() }}` |
| Previous week's Monday | `{{ $now.minus({weeks: 2}).startOf('week').toISODate() }}` |

These use Luxon, which n8n uses for dates. Weeks start on Monday in Luxon. Check the results in the expression preview before trusting them.

## Cost math

Four or five weekly runs a month, plus one model call per run for the summary. On any n8n plan this is a tiny share of executions; the value is the time saved each Monday.

## Ledgerline walkthrough: adding Search Console

*Ledgerline is a fictional accounts-payable software company. Details are illustrative.*

After GA4 and Ads matched for two weeks, marketing ops added a Search Console branch: clicks and impressions for last week versus the week before, plus the top five non-brand queries. The first week, numbers looked low because Search Console data arrives with a delay of a few days. They moved the report's Search Console date range back by three days and labelled it in the Slack post.

## Worked example: Ledgerline's Monday marketing report

*Ledgerline is a fictional accounts-payable software company. Details are illustrative.*

Ledgerline's marketing ops manager spent Monday mornings building a report from GA4, Google Ads and HubSpot.

The n8n version posted at 08:00 Berlin time. For the first two weeks, she checked every figure. One mismatch came from the workflow timezone defaulting to a different zone than the GA4 property; setting the workflow timezone fixed it.

The AI summary was added in week three, with a notes column the team filled in on Fridays. The report took ten minutes to review instead of an hour to build.

### Walkthrough

1. **Schedule Trigger**: Mondays 08:00, workflow timezone set to your team's.
2. **Set** node: compute last week's and the previous week's date ranges.
3. **Google Analytics** node: Report Get, sessions and key events by session default channel group, last week. Duplicate for the previous week.
4. **Google Ads** node: Campaign Get Many with metrics for last week, or **Google Sheets** read from your Ads script output.
5. **Code** node: compute week-on-week changes. Calculations stay in code, not in the model.
6. **Basic LLM Chain**: "Write a five-bullet summary for the marketing team from these numbers. Use only these numbers. Flag changes above 20%."
7. **Slack** message with the bullets and a link to the Looker Studio dashboard.
8. **Google Sheets** Append Row with the raw numbers for history.

## Try it yourself

Build the GA4 half first and post to a private Slack channel for two weeks. Check each number against the GA4 interface. Only add Ads, Search Console and the AI summary once the base numbers match.

## Quick quiz

**1. Why calculate changes in a Code node, not the model?**

*Answer:* Models can make arithmetic mistakes; code doesn't.

**2. What if the GA node lacks a feature?**

*Answer:* Use HTTP Request with the predefined Google credential to call the GA4 Data API.

**3. What should the AI summary be told?**

*Answer:* Use only the numbers provided.

## What should you check before the next lesson?

- Date ranges and timezone are defined once.
- Numbers match GA4 and Ads for two weeks.
- The AI summary uses only given numbers.

Next: [MCP: connecting n8n to Claude and ChatGPT](https://mentionx.ai/learn/n8n/n8n-mcp-claude-chatgpt). Or return to the [n8n for Marketers track](https://mentionx.ai/learn/n8n/n8n-for-marketers).

## Common questions

**Can n8n replace Looker Studio?** No. n8n moves and summarises data; dashboards still suit exploration.

**Do I need a Google Ads developer token?** For the API and the Google Ads node, yes. Ads scripts avoid that.

**Why do my numbers differ from GA4?** Check date ranges, timezone, sampling and thresholds, and dimension scope.

## Sources

- n8n Docs, [Google Analytics node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googleanalytics)
- n8n Docs, [Google Ads node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googleads)
- n8n Docs, [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest)
- n8n Docs, [Schedule Trigger node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger)
- n8n Docs, [Configure workflow settings](https://docs.n8n.io/build/manage-workflows/configure-workflow-settings)
- All accessed 4 Nov 2026.

## Frequently asked questions

### Can n8n replace Looker Studio?

No. n8n moves and summarises data; dashboards still suit exploration.

### Do I need a Google Ads developer token?

For the API and the Google Ads node, yes. Ads scripts avoid that.

### Why do my numbers differ from GA4?

Check date ranges, timezone, sampling and thresholds, and dimension scope.

---

Written and reviewed by Dipuck Jones for MentionX Learn. The HTML version of this page: https://mentionx.ai/learn/n8n/n8n-reporting-ga4-google-ads
