@friedbotstudio/create-baseline 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/bin/cli.js +8 -2
- package/obj/template/.claude/skills/audit-baseline/audit.sh +11 -5
- package/obj/template/.claude/skills/google-analytics/SKILL.md +129 -0
- package/obj/template/.claude/skills/google-analytics/references/audiences.md +389 -0
- package/obj/template/.claude/skills/google-analytics/references/bigquery.md +470 -0
- package/obj/template/.claude/skills/google-analytics/references/custom-dimensions.md +355 -0
- package/obj/template/.claude/skills/google-analytics/references/custom-events.md +383 -0
- package/obj/template/.claude/skills/google-analytics/references/data-management.md +416 -0
- package/obj/template/.claude/skills/google-analytics/references/debugview.md +364 -0
- package/obj/template/.claude/skills/google-analytics/references/events-fundamentals.md +398 -0
- package/obj/template/.claude/skills/google-analytics/references/gtag.md +502 -0
- package/obj/template/.claude/skills/google-analytics/references/gtm-integration.md +483 -0
- package/obj/template/.claude/skills/google-analytics/references/measurement-protocol.md +519 -0
- package/obj/template/.claude/skills/google-analytics/references/privacy.md +441 -0
- package/obj/template/.claude/skills/google-analytics/references/recommended-events.md +464 -0
- package/obj/template/.claude/skills/google-analytics/references/reporting.md +397 -0
- package/obj/template/.claude/skills/google-analytics/references/setup.md +344 -0
- package/obj/template/.claude/skills/google-analytics/references/user-tracking.md +417 -0
- package/obj/template/.claude/skills/optimize-seo/SKILL.md +313 -0
- package/obj/template/.claude/skills/optimize-seo/scripts/pagespeed.mjs +197 -0
- package/obj/template/.claude/skills/pagespeed-insights/LICENSE.md +37 -0
- package/obj/template/.claude/skills/pagespeed-insights/SKILL.md +446 -0
- package/obj/template/.claude/skills/pagespeed-insights/reference.md +50 -0
- package/obj/template/CLAUDE.md +3 -3
- package/obj/template/docs/init/seed.md +2 -2
- package/obj/template/manifest.json +27 -6
- package/package.json +7 -2
- package/src/CLAUDE.template.md +3 -3
- package/src/cli/install.js +14 -4
- package/src/seed.template.md +2 -2
- package/obj/template/.claude/hooks/lib/__pycache__/resume_writer.cpython-314.pyc +0 -0
package/README.md
CHANGED
|
@@ -106,8 +106,13 @@ npx @friedbotstudio/create-baseline ./your-project --dry-run
|
|
|
106
106
|
|
|
107
107
|
# Skip the install-time PlantUML jar download
|
|
108
108
|
npx @friedbotstudio/create-baseline ./your-project --no-plantuml
|
|
109
|
+
|
|
110
|
+
# Materialize a security-hardened target/.npmrc (opt-in)
|
|
111
|
+
npx @friedbotstudio/create-baseline ./your-project --with-npmrc
|
|
109
112
|
```
|
|
110
113
|
|
|
114
|
+
By default the scaffolder writes only inside `.claude/`, plus `CLAUDE.md`, `.mcp.json`, and `docs/init/seed.md`. Pass `--with-npmrc` to also drop `ignore-scripts=true` + `min-release-age=7` into `target/.npmrc`. Those defaults blunt the npm post-install-hook attack class and delay consumption of fresh malicious publishes. An existing `target/.npmrc` is preserved verbatim. Operators who already set these defaults in `~/.npmrc` don't need the flag.
|
|
115
|
+
|
|
111
116
|
### Doctor
|
|
112
117
|
|
|
113
118
|
```bash
|
package/bin/cli.js
CHANGED
|
@@ -43,6 +43,11 @@ PlantUML jar (~19 MB, fetched at install time from upstream):
|
|
|
43
43
|
--no-plantuml Skip the jar download entirely.
|
|
44
44
|
--require-plantuml Treat jar fetch failure (network/sha256) as fatal (exit 4).
|
|
45
45
|
|
|
46
|
+
npm posture (off by default):
|
|
47
|
+
--with-npmrc Materialize a security-hardened target/.npmrc
|
|
48
|
+
(ignore-scripts=true, min-release-age=7). Existing
|
|
49
|
+
target/.npmrc is preserved verbatim.
|
|
50
|
+
|
|
46
51
|
Misc:
|
|
47
52
|
--help, -h Show this message.
|
|
48
53
|
--version Print version.
|
|
@@ -97,6 +102,7 @@ async function main(argv) {
|
|
|
97
102
|
'dry-run': { type: 'boolean' },
|
|
98
103
|
'no-plantuml': { type: 'boolean' },
|
|
99
104
|
'require-plantuml': { type: 'boolean' },
|
|
105
|
+
'with-npmrc': { type: 'boolean' },
|
|
100
106
|
strict: { type: 'boolean' },
|
|
101
107
|
},
|
|
102
108
|
strict: true,
|
|
@@ -209,10 +215,10 @@ async function main(argv) {
|
|
|
209
215
|
}
|
|
210
216
|
} else if (values.force) {
|
|
211
217
|
if (dryRun) io.log(`Would force-install into ${target}`);
|
|
212
|
-
else await forceInstall(templateDir, target);
|
|
218
|
+
else await forceInstall(templateDir, target, { withNpmrc: !!values['with-npmrc'] });
|
|
213
219
|
} else {
|
|
214
220
|
if (dryRun) io.log(`Would fresh-install into ${target}`);
|
|
215
|
-
else await freshInstall(templateDir, target);
|
|
221
|
+
else await freshInstall(templateDir, target, { withNpmrc: !!values['with-npmrc'] });
|
|
216
222
|
}
|
|
217
223
|
} catch (err) {
|
|
218
224
|
io.error(`install failed: ${err.message}`);
|
|
@@ -139,10 +139,11 @@ disk_baseline_hooks = disk_hooks - add_hooks
|
|
|
139
139
|
disk_baseline_agents = disk_agents - add_agents
|
|
140
140
|
|
|
141
141
|
# Skill provenance: a skill is baseline iff its SKILL.md frontmatter declares
|
|
142
|
-
# owner: baseline.
|
|
143
|
-
#
|
|
142
|
+
# owner: baseline. Every other on-disk skill (absent owner: field, or explicit
|
|
143
|
+
# owner: user) is treated as user/third-party and out-of-scope of baseline
|
|
144
|
+
# audit checks. Absence-of-owner is the default so projects with pre-existing
|
|
145
|
+
# skills can install the baseline without annotating every file.
|
|
144
146
|
disk_baseline_skills = {s for s in disk_skills if read_skill_owner(s) == "baseline"}
|
|
145
|
-
disk_user_skills = {s for s in disk_skills if read_skill_owner(s) == "user"}
|
|
146
147
|
|
|
147
148
|
# ---------- counts vs seed.md ----------
|
|
148
149
|
seed = read_text("docs/init/seed.md")
|
|
@@ -219,11 +220,16 @@ check_names("commands names match seed §4.4", EXPECTED_COMMANDS, set(),
|
|
|
219
220
|
|
|
220
221
|
# ---------- skill ownership (per-file hash drift + frontmatter validation) ----------
|
|
221
222
|
def check_skill_ownership():
|
|
222
|
-
# Frontmatter validation
|
|
223
|
+
# Frontmatter validation. Absence-of-`owner` is treated as user/third-party
|
|
224
|
+
# and silently skipped — that is the default for any skill not shipped in
|
|
225
|
+
# the baseline. Only an `owner:` field that is present but carries an
|
|
226
|
+
# invalid value (typo, wrong literal) is a FAIL. Baseline-listed slugs
|
|
227
|
+
# (per manifest.owners.skills) that fail to declare `owner: baseline` are
|
|
228
|
+
# surfaced by the names-match check ("skills names match seed §4.3"),
|
|
229
|
+
# which compares manifest keys against `disk_baseline_skills`.
|
|
223
230
|
for slug in sorted(disk_skills):
|
|
224
231
|
owner = read_skill_owner(slug)
|
|
225
232
|
if owner is None:
|
|
226
|
-
add(f"skill ownership: {slug}", "FAIL", "missing owner frontmatter")
|
|
227
233
|
continue
|
|
228
234
|
if owner not in ("baseline", "user"):
|
|
229
235
|
add(f"skill ownership: {slug}", "FAIL", f"invalid owner={owner}")
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: google-analytics
|
|
3
|
+
description: Comprehensive Google Analytics 4 guide covering property setup, events, custom events, recommended events, custom dimensions, user tracking, audiences, reporting, BigQuery integration, gtag.js implementation, GTM integration, Measurement Protocol, DebugView, privacy compliance, and data management. Use when working with GA4 implementation, tracking, analysis, or any GA4-related tasks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Google Analytics 4 Complete Guide
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Google Analytics 4 (GA4) is Google's event-based analytics platform for measuring user interactions across websites and applications. Every user interaction is tracked as an event with associated parameters, providing flexible cross-platform measurement.
|
|
11
|
+
|
|
12
|
+
## When to Use This Skill
|
|
13
|
+
|
|
14
|
+
Invoke this skill for any GA4-related task:
|
|
15
|
+
|
|
16
|
+
- Setting up GA4 properties, data streams, and Measurement IDs
|
|
17
|
+
- Installing GA4 via gtag.js, GTM, or CMS plugins
|
|
18
|
+
- Implementing event tracking (automatic, recommended, custom, ecommerce)
|
|
19
|
+
- Creating custom dimensions, audiences, and reports
|
|
20
|
+
- Exporting data to BigQuery for SQL analysis
|
|
21
|
+
- Server-side tracking via Measurement Protocol
|
|
22
|
+
- User ID and cross-device tracking
|
|
23
|
+
- Privacy compliance, Consent Mode, and GDPR/CCPA
|
|
24
|
+
- Testing and debugging with DebugView
|
|
25
|
+
|
|
26
|
+
## Quick Start
|
|
27
|
+
|
|
28
|
+
1. **Create property:** analytics.google.com -> Admin -> Create -> Property
|
|
29
|
+
2. **Create data stream:** Add web stream, note Measurement ID (G-XXXXXXXXXX)
|
|
30
|
+
3. **Install tracking** (choose one):
|
|
31
|
+
- **GTM (recommended):** Install container, create Google Tag with Measurement ID, trigger on All Pages, publish
|
|
32
|
+
- **gtag.js direct:**
|
|
33
|
+
```html
|
|
34
|
+
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
|
|
35
|
+
<script>
|
|
36
|
+
window.dataLayer = window.dataLayer || [];
|
|
37
|
+
function gtag(){dataLayer.push(arguments);}
|
|
38
|
+
gtag('js', new Date());
|
|
39
|
+
gtag('config', 'G-XXXXXXXXXX');
|
|
40
|
+
</script>
|
|
41
|
+
```
|
|
42
|
+
4. **Verify:** Enable GA Debugger extension, check Admin -> DebugView for session_start, page_view
|
|
43
|
+
5. **Send custom events:**
|
|
44
|
+
```javascript
|
|
45
|
+
gtag('event', 'button_click', { button_name: 'Subscribe', button_location: 'header' });
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Decision Tree: Which Reference Do I Need?
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
What are you trying to do?
|
|
52
|
+
|
|
53
|
+
Setting up GA4 for the first time? -> references/setup.md
|
|
54
|
+
Understanding how events work? -> references/events-fundamentals.md
|
|
55
|
+
Implementing standard tracking events? -> references/recommended-events.md
|
|
56
|
+
Creating business-specific custom events? -> references/custom-events.md
|
|
57
|
+
Making parameters appear in reports? -> references/custom-dimensions.md
|
|
58
|
+
Implementing User ID / cross-device? -> references/user-tracking.md
|
|
59
|
+
Building audiences for remarketing? -> references/audiences.md
|
|
60
|
+
Analysing data in GA4 reports? -> references/reporting.md
|
|
61
|
+
Exporting to BigQuery for SQL analysis? -> references/bigquery.md
|
|
62
|
+
Installing via gtag.js directly? -> references/gtag.md
|
|
63
|
+
Setting up GA4 in Google Tag Manager? -> references/gtm-integration.md
|
|
64
|
+
Sending events from server/backend? -> references/measurement-protocol.md
|
|
65
|
+
Testing and debugging implementation? -> references/debugview.md
|
|
66
|
+
Implementing GDPR/Consent Mode? -> references/privacy.md
|
|
67
|
+
Configuring Admin settings? -> references/data-management.md
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Core Concepts
|
|
71
|
+
|
|
72
|
+
### Event-Based Model
|
|
73
|
+
|
|
74
|
+
GA4 tracks everything as events in four categories:
|
|
75
|
+
|
|
76
|
+
| Category | Description | Examples |
|
|
77
|
+
|----------|-------------|----------|
|
|
78
|
+
| Automatic | Fire without configuration | session_start, first_visit |
|
|
79
|
+
| Enhanced Measurement | Toggle on/off in settings | scroll, click, file_download |
|
|
80
|
+
| Recommended | Google-defined with standard parameters | purchase, login, sign_up |
|
|
81
|
+
| Custom | Business-specific tracking | demo_requested, trial_started |
|
|
82
|
+
|
|
83
|
+
### Key Limits
|
|
84
|
+
|
|
85
|
+
| Limit | Value |
|
|
86
|
+
|-------|-------|
|
|
87
|
+
| Event names per property | 500 distinct |
|
|
88
|
+
| Parameters per event | 25 |
|
|
89
|
+
| Event name length | 40 characters |
|
|
90
|
+
| Parameter name/value length | 40 / 100 characters |
|
|
91
|
+
| Custom dimensions (event/user/item) | 50 / 25 / 10 |
|
|
92
|
+
| Audiences per property | 100 |
|
|
93
|
+
|
|
94
|
+
### Measurement ID
|
|
95
|
+
|
|
96
|
+
- Format: `G-XXXXXXXXXX` (G- prefix + 10 alphanumeric characters)
|
|
97
|
+
- Location: Admin -> Data Streams -> Web Stream
|
|
98
|
+
- Used in: gtag.js config, GTM tags, Measurement Protocol
|
|
99
|
+
|
|
100
|
+
## Common Workflows
|
|
101
|
+
|
|
102
|
+
### Ecommerce Tracking
|
|
103
|
+
|
|
104
|
+
1. Review [recommended events](references/recommended-events.md) for the purchase funnel: view_item -> add_to_cart -> begin_checkout -> purchase
|
|
105
|
+
2. Structure items array (required: item_id OR item_name; recommended: price, quantity, item_category)
|
|
106
|
+
3. Test with [DebugView](references/debugview.md), then register custom item parameters as [custom dimensions](references/custom-dimensions.md)
|
|
107
|
+
|
|
108
|
+
### Cross-Device Tracking
|
|
109
|
+
|
|
110
|
+
1. Implement [User ID](references/user-tracking.md) and configure Reporting Identity (Admin -> Data Settings)
|
|
111
|
+
2. Set [user properties](references/custom-dimensions.md) and build [cross-device audiences](references/audiences.md)
|
|
112
|
+
|
|
113
|
+
### GDPR Compliance
|
|
114
|
+
|
|
115
|
+
1. Set up [Consent Mode](references/privacy.md) with default denied state
|
|
116
|
+
2. Integrate with CMP (OneTrust, Cookiebot, etc.), update consent on user acceptance
|
|
117
|
+
3. Test consent implementation with [DebugView](references/debugview.md)
|
|
118
|
+
|
|
119
|
+
### Custom Reports
|
|
120
|
+
|
|
121
|
+
1. Understand available data in [reporting](references/reporting.md)
|
|
122
|
+
2. Register custom parameters as [dimensions](references/custom-dimensions.md), create Explorations
|
|
123
|
+
3. For unsampled data, export to [BigQuery](references/bigquery.md)
|
|
124
|
+
|
|
125
|
+
## Best Practices
|
|
126
|
+
|
|
127
|
+
- **Naming:** Use snake_case, be descriptive and action-oriented, keep under 40 characters, avoid generic names
|
|
128
|
+
- **Implementation order:** Enhanced Measurement -> recommended events -> custom events -> custom dimensions
|
|
129
|
+
- **Data quality:** Separate test/production properties, set up internal traffic filters from day one, document all custom events, audit regularly with DebugView, export to BigQuery for backup
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
# GA4 Audiences and Segmentation
|
|
2
|
+
|
|
3
|
+
Expert guidance for creating and managing audiences for analysis, remarketing, and personalisation.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Audiences in GA4 allow creation of user segments for analysis, remarketing, and personalisation based on dimensions, metrics, and events. Audiences can be exported to Google Ads for targeting and used in GA4 reports for analysis.
|
|
8
|
+
|
|
9
|
+
## Accessing Audiences
|
|
10
|
+
|
|
11
|
+
**Path:** Admin -> Audiences
|
|
12
|
+
|
|
13
|
+
**Available Actions:**
|
|
14
|
+
- View all audiences
|
|
15
|
+
- Create new audiences
|
|
16
|
+
- Edit existing audiences
|
|
17
|
+
- View audience membership
|
|
18
|
+
|
|
19
|
+
## Predefined Audiences
|
|
20
|
+
|
|
21
|
+
GA4 includes template audiences:
|
|
22
|
+
|
|
23
|
+
| Audience | Description |
|
|
24
|
+
|----------|-------------|
|
|
25
|
+
| All Users | All users in selected timeframe |
|
|
26
|
+
| Purchasers | Users who completed purchase (30 days) |
|
|
27
|
+
| New Users | First-time visitors |
|
|
28
|
+
| Returning Users | Repeat visitors |
|
|
29
|
+
| Recent Users | Active in last 7 days |
|
|
30
|
+
|
|
31
|
+
### Activating Predefined Audiences
|
|
32
|
+
|
|
33
|
+
1. Admin -> Audiences -> Create Audience
|
|
34
|
+
2. Select suggested template
|
|
35
|
+
3. Customise conditions if needed
|
|
36
|
+
4. Save audience
|
|
37
|
+
|
|
38
|
+
## Creating Custom Audiences
|
|
39
|
+
|
|
40
|
+
### Basic Process
|
|
41
|
+
|
|
42
|
+
1. Admin -> Audiences -> New Audience
|
|
43
|
+
2. Choose method:
|
|
44
|
+
- Start from scratch
|
|
45
|
+
- Use suggested template
|
|
46
|
+
- Create predictive audience
|
|
47
|
+
3. Configure audience:
|
|
48
|
+
- Name: Descriptive (e.g., "High-Value Shoppers")
|
|
49
|
+
- Description: Optional notes
|
|
50
|
+
- Membership duration: 1-540 days
|
|
51
|
+
4. Add conditions
|
|
52
|
+
5. Preview size
|
|
53
|
+
6. Save
|
|
54
|
+
|
|
55
|
+
### Condition Types
|
|
56
|
+
|
|
57
|
+
#### Dimension Filters
|
|
58
|
+
|
|
59
|
+
Filter by user or event attributes:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
country == "United States"
|
|
63
|
+
device_category == "mobile"
|
|
64
|
+
platform == "web"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Available Dimensions:**
|
|
68
|
+
- User: city, country, device_category, platform
|
|
69
|
+
- Event: event_name, page_location, item_id
|
|
70
|
+
- Custom: Any registered custom dimensions
|
|
71
|
+
|
|
72
|
+
#### Metric Filters
|
|
73
|
+
|
|
74
|
+
Filter by quantitative measures:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
totalRevenue > 100
|
|
78
|
+
sessionCount >= 3
|
|
79
|
+
engagementTime > 60
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Available Metrics:**
|
|
83
|
+
- Event count
|
|
84
|
+
- Session count
|
|
85
|
+
- Revenue
|
|
86
|
+
- Engagement time
|
|
87
|
+
- Conversion count
|
|
88
|
+
|
|
89
|
+
#### Event Conditions
|
|
90
|
+
|
|
91
|
+
Include/exclude based on events:
|
|
92
|
+
|
|
93
|
+
**Include users who:**
|
|
94
|
+
- Have triggered specific event
|
|
95
|
+
- Have NOT triggered event
|
|
96
|
+
- Triggered event with specific parameters
|
|
97
|
+
|
|
98
|
+
**Example:** Users who triggered `purchase` with `value > 50`
|
|
99
|
+
|
|
100
|
+
#### Sequence Conditions
|
|
101
|
+
|
|
102
|
+
Build audiences based on event order:
|
|
103
|
+
|
|
104
|
+
**Example:** Users who:
|
|
105
|
+
1. Viewed product (view_item)
|
|
106
|
+
2. Added to cart (add_to_cart)
|
|
107
|
+
3. Did NOT complete purchase (within 7 days)
|
|
108
|
+
|
|
109
|
+
### Membership Duration
|
|
110
|
+
|
|
111
|
+
| Duration | Use Case |
|
|
112
|
+
|----------|----------|
|
|
113
|
+
| 1-7 days | Short campaigns |
|
|
114
|
+
| 30-90 days | Remarketing |
|
|
115
|
+
| 540 days | Lifetime segments |
|
|
116
|
+
|
|
117
|
+
**How it works:**
|
|
118
|
+
- User enters when conditions met
|
|
119
|
+
- Stays for duration period
|
|
120
|
+
- Exits after duration (unless conditions still met)
|
|
121
|
+
|
|
122
|
+
## Audience Examples
|
|
123
|
+
|
|
124
|
+
### High-Value Customers
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Conditions:
|
|
128
|
+
- totalRevenue > 500 (lifetime)
|
|
129
|
+
- purchaseCount >= 3
|
|
130
|
+
|
|
131
|
+
Membership: 540 days
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Cart Abandoners
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
Sequence:
|
|
138
|
+
1. add_to_cart (within last 7 days)
|
|
139
|
+
2. Did NOT: purchase
|
|
140
|
+
|
|
141
|
+
Membership: 7 days
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Engaged Mobile Users
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
Conditions:
|
|
148
|
+
- deviceCategory == "mobile"
|
|
149
|
+
- sessionCount >= 5 (last 30 days)
|
|
150
|
+
- avgEngagementTime > 60 seconds
|
|
151
|
+
|
|
152
|
+
Membership: 30 days
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Product Category Viewers
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
Event Condition:
|
|
159
|
+
- view_item (last 30 days)
|
|
160
|
+
- item_category == "Electronics"
|
|
161
|
+
|
|
162
|
+
Membership: 30 days
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Geographic Segment
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
Conditions:
|
|
169
|
+
- country == "United States"
|
|
170
|
+
- region == "California"
|
|
171
|
+
|
|
172
|
+
Membership: 90 days
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Newsletter Subscribers
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
Event Condition:
|
|
179
|
+
- sign_up (any time)
|
|
180
|
+
- method == "newsletter"
|
|
181
|
+
|
|
182
|
+
Membership: 540 days
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Predictive Audiences
|
|
186
|
+
|
|
187
|
+
GA4 can create audiences based on predicted user behaviour.
|
|
188
|
+
|
|
189
|
+
### Available Predictions
|
|
190
|
+
|
|
191
|
+
| Prediction | Description |
|
|
192
|
+
|------------|-------------|
|
|
193
|
+
| Purchase probability | Likelihood to purchase (7 days) |
|
|
194
|
+
| Churn probability | Likelihood to not return (7 days) |
|
|
195
|
+
| Revenue prediction | Expected 28-day revenue |
|
|
196
|
+
|
|
197
|
+
### Requirements
|
|
198
|
+
|
|
199
|
+
- 1,000+ users triggering target event (28 days)
|
|
200
|
+
- Sufficient historical data
|
|
201
|
+
- Model quality threshold met
|
|
202
|
+
|
|
203
|
+
### Creating Predictive Audience
|
|
204
|
+
|
|
205
|
+
1. Create New Audience
|
|
206
|
+
2. Choose "Predictive"
|
|
207
|
+
3. Select metric (purchase probability, etc.)
|
|
208
|
+
4. Set threshold (e.g., > 50% purchase probability)
|
|
209
|
+
5. Save
|
|
210
|
+
|
|
211
|
+
### Use Cases
|
|
212
|
+
|
|
213
|
+
- Target likely purchasers with ads
|
|
214
|
+
- Re-engage likely-to-churn users
|
|
215
|
+
- Focus on high-revenue potential users
|
|
216
|
+
|
|
217
|
+
## Audience Triggers
|
|
218
|
+
|
|
219
|
+
### What are Triggers
|
|
220
|
+
|
|
221
|
+
Actions that fire when user enters audience.
|
|
222
|
+
|
|
223
|
+
### Supported Actions
|
|
224
|
+
|
|
225
|
+
- Send event to GA4
|
|
226
|
+
- Create Google Ads remarketing list
|
|
227
|
+
- Send to Google Ads for targeting
|
|
228
|
+
|
|
229
|
+
### Setup
|
|
230
|
+
|
|
231
|
+
1. Create audience
|
|
232
|
+
2. In settings, add trigger
|
|
233
|
+
3. Configure action (event name, Ads account)
|
|
234
|
+
4. Save
|
|
235
|
+
|
|
236
|
+
### Use Cases
|
|
237
|
+
|
|
238
|
+
- Track when users become high-value
|
|
239
|
+
- Send conversion events to Ads
|
|
240
|
+
- Real-time remarketing lists
|
|
241
|
+
|
|
242
|
+
## Exporting to Google Ads
|
|
243
|
+
|
|
244
|
+
### Prerequisites
|
|
245
|
+
|
|
246
|
+
- Google Ads account linked
|
|
247
|
+
- Admin -> Product Links -> Google Ads Links
|
|
248
|
+
- Minimum audience size met
|
|
249
|
+
|
|
250
|
+
### Minimum Sizes
|
|
251
|
+
|
|
252
|
+
| Region | Minimum Users |
|
|
253
|
+
|--------|---------------|
|
|
254
|
+
| Standard | 100 active |
|
|
255
|
+
| EEA/UK | 1,000 active |
|
|
256
|
+
|
|
257
|
+
### Setup
|
|
258
|
+
|
|
259
|
+
1. Link Google Ads account
|
|
260
|
+
2. In audience, enable "Ads Personalisation"
|
|
261
|
+
3. Audience appears in Ads within 24-48 hours
|
|
262
|
+
|
|
263
|
+
### Export Destinations
|
|
264
|
+
|
|
265
|
+
- Google Ads (remarketing, targeting)
|
|
266
|
+
- Display & Video 360
|
|
267
|
+
- Search Ads 360
|
|
268
|
+
|
|
269
|
+
## Analysing Audiences
|
|
270
|
+
|
|
271
|
+
### Viewing Audience Data
|
|
272
|
+
|
|
273
|
+
**Reports -> Realtime:**
|
|
274
|
+
- Active users in audience
|
|
275
|
+
|
|
276
|
+
**Reports -> User Acquisition:**
|
|
277
|
+
- How audience members acquired
|
|
278
|
+
|
|
279
|
+
**Explorations -> Segment Overlap:**
|
|
280
|
+
- Compare audiences
|
|
281
|
+
|
|
282
|
+
**Explorations -> User Lifetime:**
|
|
283
|
+
- LTV of audience members
|
|
284
|
+
|
|
285
|
+
### Audience Metrics
|
|
286
|
+
|
|
287
|
+
| Metric | Description |
|
|
288
|
+
|--------|-------------|
|
|
289
|
+
| Total Users | Current members |
|
|
290
|
+
| New Users (7/30 days) | Recent additions |
|
|
291
|
+
| User Growth | Trend over time |
|
|
292
|
+
|
|
293
|
+
## Using Audiences in Explorations
|
|
294
|
+
|
|
295
|
+
### As Segments
|
|
296
|
+
|
|
297
|
+
1. Open Exploration
|
|
298
|
+
2. Click "+" in Segments
|
|
299
|
+
3. Select audience
|
|
300
|
+
4. Apply to analysis
|
|
301
|
+
|
|
302
|
+
### Comparing Audiences
|
|
303
|
+
|
|
304
|
+
1. Add multiple audiences as segments
|
|
305
|
+
2. View side-by-side comparison
|
|
306
|
+
3. Analyse differences
|
|
307
|
+
|
|
308
|
+
## Limits and Quotas
|
|
309
|
+
|
|
310
|
+
| Limit | Standard | 360 |
|
|
311
|
+
|-------|----------|-----|
|
|
312
|
+
| Audiences per property | 100 | 400 |
|
|
313
|
+
| Conditions per audience | 10 | 10 |
|
|
314
|
+
| Membership duration max | 540 days | 540 days |
|
|
315
|
+
|
|
316
|
+
## Common Issues
|
|
317
|
+
|
|
318
|
+
### Audience Size Too Small
|
|
319
|
+
|
|
320
|
+
**Causes:**
|
|
321
|
+
- Conditions too restrictive
|
|
322
|
+
- Low traffic volume
|
|
323
|
+
- Date range too narrow
|
|
324
|
+
|
|
325
|
+
**Solutions:**
|
|
326
|
+
1. Broaden conditions
|
|
327
|
+
2. Increase membership duration
|
|
328
|
+
3. Wait for more traffic
|
|
329
|
+
|
|
330
|
+
### Audience Not in Google Ads
|
|
331
|
+
|
|
332
|
+
**Causes:**
|
|
333
|
+
- Below minimum size
|
|
334
|
+
- Link not configured
|
|
335
|
+
- Ads personalisation disabled
|
|
336
|
+
|
|
337
|
+
**Solutions:**
|
|
338
|
+
1. Check audience size
|
|
339
|
+
2. Verify Google Ads link
|
|
340
|
+
3. Enable Ads Personalisation
|
|
341
|
+
|
|
342
|
+
### Stale Audience Data
|
|
343
|
+
|
|
344
|
+
**Cause:** Audiences update with delay
|
|
345
|
+
|
|
346
|
+
**Solution:** Wait 24-48 hours for updates
|
|
347
|
+
|
|
348
|
+
## Best Practices
|
|
349
|
+
|
|
350
|
+
### Naming Conventions
|
|
351
|
+
|
|
352
|
+
Use clear, descriptive names:
|
|
353
|
+
- "High-Value Customers - $500+"
|
|
354
|
+
- "Cart Abandoners - Last 7 Days"
|
|
355
|
+
- "Newsletter Subscribers"
|
|
356
|
+
|
|
357
|
+
### Documentation
|
|
358
|
+
|
|
359
|
+
Document each audience:
|
|
360
|
+
- Purpose
|
|
361
|
+
- Conditions used
|
|
362
|
+
- Expected size
|
|
363
|
+
- Use cases
|
|
364
|
+
|
|
365
|
+
### Regular Review
|
|
366
|
+
|
|
367
|
+
- Audit audiences quarterly
|
|
368
|
+
- Remove unused audiences
|
|
369
|
+
- Update conditions as needed
|
|
370
|
+
|
|
371
|
+
## Quick Reference
|
|
372
|
+
|
|
373
|
+
### Audience Limits
|
|
374
|
+
|
|
375
|
+
- Maximum: 100 audiences (standard)
|
|
376
|
+
- Membership: 1-540 days
|
|
377
|
+
- Export minimum: 100 users (1,000 EEA/UK)
|
|
378
|
+
|
|
379
|
+
### Export Destinations
|
|
380
|
+
|
|
381
|
+
- Google Ads
|
|
382
|
+
- Display & Video 360
|
|
383
|
+
- Search Ads 360
|
|
384
|
+
|
|
385
|
+
### Predictive Options
|
|
386
|
+
|
|
387
|
+
- Purchase probability
|
|
388
|
+
- Churn probability
|
|
389
|
+
- Revenue prediction
|