GA4 Anomaly Detection with Automated Slack & Email Alerts
## Who's it for
Teams that monitor traffic, signups, or conversions in Google Analytics 4 and want automatic Slack/email alerts when a channel suddenly spikes or drops.
## What it does
This n8n template pulls daily GA4 metrics, detects outliers with a rolling mean and z-score, and sends alerts with a sparkline chart. It supports per-channel analysis (e.g., `sessionDefaultChannelGroup`) and consolidates multiple anomalies into a single email while posting each one to Slack.
## How it works
- **HTTP Request (GA4 Data API)** fetches `sessions`, `newUsers`, `conversions`, `bounceRate` by `date` + channel.
- **Code** calculates 7-day moving average and z-scores, flags anomalies, and builds QuickChart links.
- **If** filters on `alert === true` and optional `ALERT_ME` toggle.
- **Slack** posts an alert + chart.
- **Email** sends one summary email (subject + HTML table + charts).
## Requirements
- GA4 OAuth2 credential in n8n.
- Slack API credential (bot with chat:write).
- Email credential (SMTP or service).
- GA4 property ID and at least several recent days of data.
## Where to find your GA4 Property ID
- **In the GA UI:**
1. Open **Google Analytics** → bottom-left **Admin** (gear).
2. In the **Property** column, click **Property settings**.
3. Copy **Property ID** - it's a **numeric** value (e.g., `481356553`).
- **From the URL (quick way):**
When you're inside the GA4 property, the URL looks like: `/analytics/web/#/p123456789/` → the digits after **`p`** are your **Property ID** (`123456789` in this example).
- **What *not* to use:**
- **Measurement ID** (looks like `G-XXXXXXX`) - that's the data stream ID, **not** the property ID.
- **Universal Analytics IDs** (`UA-XXXXX-Y`) - those are legacy and won't work with GA4 Data API.
- **In this template:**
Put that numeric ID into the **Set → `PROPERTY_ID`** field. The HTTP node path `properties/{{ $json.PROPERTY_ID }}:runReport` expects **only the number**, no prefixes.
## How to set up
1. Open the **Set (Define variables)** node and fill: `PROPERTY_ID`, `LOOKBACK_DAYS`, `ALERT_PC`, `Z_THRESHOLD`, `CHANNEL_DIM`, `ALERT_ME`.
2. Connect your **Google Analytics OAuth2**, **Slack**, and **Email** credentials.
3. In **Email Send**, map `Subject` → `{{$json.emailSubject}}` and **HTML** body → `{{$json.emailHtml}}`. Keep **Execute once** enabled.
4. Run the workflow.
## How to customize
- Change the moving-average window (`WINDOW/MA_WINDOW`) and chart range (`LAST_N_DAYS_CHART`).
- Swap `CHANNEL_DIM` (e.g., source/medium) to analyze different dimensions.
- Add/remove metrics in the GA4 request and the metrics list in the Code node.
- Tweak thresholds to reduce noise: raise `Z_THRESHOLD` or `ALERT_PC`.
## Output example

Platform
n8n
Category
Data & Analytics
Price
Free
Creator
Artur
if
set
code
gmail
slack
stickyNote
httpRequest
scheduleTrigger
How to import this workflow into n8n
1Purchase or download the workflow to get the n8n workflow JSON file.
2In your n8n instance, open Workflows and choose "Import from File" (or paste the JSON with Ctrl+V on the canvas).
3Open each node marked with a credential warning and connect your own accounts and API keys.
4Run the workflow once manually to verify the data flow, then toggle it to Active.