ga4-export-fixer 0.3.2-dev.2 → 0.3.2-dev.3

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.
@@ -208,7 +208,9 @@
208
208
  "campaign_id": "Cross-channel campaign ID",
209
209
  "source_platform": "Cross-channel source platform",
210
210
  "source": "Cross-channel source",
211
- "medium": "Cross-channel medium"
211
+ "medium": "Cross-channel medium",
212
+ "primary_channel_group": "Custom primary channel group for the session's last non-direct click",
213
+ "default_channel_group": "Default channel group for the session's last non-direct click"
212
214
  }
213
215
  },
214
216
  "sa360_campaign": {
@@ -13,7 +13,7 @@
13
13
  "event_params": "Nested array of event parameters. Unnest with CROSS JOIN UNNEST(event_params) to access individual parameter values",
14
14
  "session_params": "Session-scoped parameters. Unnest with CROSS JOIN UNNEST(session_params) to access session-level parameter values",
15
15
  "ecommerce": "Transaction and revenue data. Filter to purchase or refund events (WHERE event_name = 'purchase') for ecommerce reporting",
16
- "items": "Product-level data array. Unnest with CROSS JOIN UNNEST(items) for item-level analysis in ecommerce reports",
16
+ "items": "Product-level data array. Unnest with CROSS JOIN UNNEST(items) for item-level analysis. For product revenue and units sold, filter to event_name = 'purchase' and use item_revenue and quantity. Use item_category to filter or group by product category",
17
17
  "collected_traffic_source": "Event-level UTM parameters and click identifiers. For session-level attribution, prefer session_first_traffic_source instead",
18
18
  "session_first_traffic_source": "First-touch traffic source for the session. Use for session-level acquisition and campaign reporting",
19
19
  "session_traffic_source_last_click": "Google-attributed session traffic source. Use for last-click attribution analysis across Google Ads and manual channels",
@@ -22,9 +22,14 @@
22
22
  },
23
23
  {
24
24
  "terms": ["revenue", "sales", "purchase revenue", "total revenue"],
25
- "sql": "SUM(ecommerce.purchase_revenue) WHERE event_name = 'purchase'",
25
+ "sql": "SUM(ecommerce.purchase_revenue) WHERE event_name = 'purchase' for transaction-level. For product-level revenue: SUM(items.item_revenue) after CROSS JOIN UNNEST(items) WHERE event_name = 'purchase'",
26
26
  "dependsOn": ["ecommerce"]
27
27
  },
28
+ {
29
+ "terms": ["products", "items", "product revenue", "item revenue", "product sales", "items sold"],
30
+ "sql": "CROSS JOIN UNNEST(items) to access product-level data. Use items.item_name, items.item_category for identification, items.item_revenue for revenue, items.quantity for units sold. Filter to event_name = 'purchase' for sold products",
31
+ "dependsOn": ["items"]
32
+ },
28
33
  {
29
34
  "terms": ["page URL", "page location", "URL", "current page"],
30
35
  "sql": "page_location (full URL) or page.hostname, page.path, page.query (parsed components)",
@@ -36,9 +41,9 @@
36
41
  "dependsOn": ["landing_page"]
37
42
  },
38
43
  {
39
- "terms": ["traffic source", "channel", "medium", "campaign", "source", "UTM"],
40
- "sql": "collected_traffic_source (event-level), session_first_traffic_source (session first-touch), session_traffic_source_last_click (session last-click attribution)",
41
- "dependsOn": ["collected_traffic_source", "session_first_traffic_source"]
44
+ "terms": ["traffic source", "channel", "channel group", "source of traffic"],
45
+ "sql": "session_traffic_source_last_click.cross_channel_campaign.primary_channel_group for top-level channel grouping. session_traffic_source_last_click.cross_channel_campaign.source, session_traffic_source_last_click.cross_channel_campaign.medium, and session_traffic_source_last_click.cross_channel_campaign.campaign_name for detailed source/medium/campaign analysis.",
46
+ "dependsOn": ["session_traffic_source_last_click"]
42
47
  },
43
48
  {
44
49
  "terms": ["device type", "device category", "device", "mobile vs desktop"],
@@ -84,13 +89,18 @@
84
89
  },
85
90
  {
86
91
  "field": "ecommerce.purchase_revenue",
87
- "note": "Revenue per transaction. Filter to event_name = 'purchase' before aggregating.",
92
+ "note": "Transaction-level revenue. Filter to event_name = 'purchase' before aggregating.",
88
93
  "dependsOn": ["ecommerce"]
89
94
  },
90
95
  {
91
- "field": "session_first_traffic_source",
92
- "note": "Session acquisition source. Use .manual_source and .manual_medium for UTM data.",
93
- "dependsOn": ["session_first_traffic_source"]
96
+ "field": "items",
97
+ "note": "Product-level data (nested array). CROSS JOIN UNNEST(items) to access item_name, item_category, item_revenue, quantity. Filter to event_name = 'purchase' for sold products.",
98
+ "dependsOn": ["items"]
99
+ },
100
+ {
101
+ "field": "session_traffic_source_last_click",
102
+ "note": "Primary field for traffic source analysis. Use .cross_channel_campaign.primary_channel_group for channel grouping. When asked about popular traffic sources, default to channel group unless specified otherwise.",
103
+ "dependsOn": ["session_traffic_source_last_click"]
94
104
  },
95
105
  {
96
106
  "field": "device.category",
@@ -118,8 +128,9 @@
118
128
  {"text": "Use event_name to select specific event types (e.g. WHERE event_name = 'page_view').", "dependsOn": []},
119
129
  {"text": "For user counts: COUNT(DISTINCT user_pseudo_id) for device-level, COUNT(DISTINCT merged_user_id) for cross-device.", "dependsOn": []},
120
130
  {"text": "For session metrics: GROUP BY session_id.", "dependsOn": ["session_id"]},
121
- {"text": "For ecommerce revenue: filter WHERE event_name = 'purchase' before aggregating ecommerce.purchase_revenue.", "dependsOn": ["ecommerce"]},
122
- {"text": "For traffic source analysis: use session_first_traffic_source for first-touch, session_traffic_source_last_click for last-click attribution.", "dependsOn": ["session_first_traffic_source"]},
131
+ {"text": "For transaction-level ecommerce revenue: filter WHERE event_name = 'purchase' before aggregating ecommerce.purchase_revenue.", "dependsOn": ["ecommerce"]},
132
+ {"text": "For product-level analysis: CROSS JOIN UNNEST(items) WHERE event_name = 'purchase'. Use items.item_revenue for product revenue, items.quantity for units sold, items.item_category for product categories.", "dependsOn": ["items"]},
133
+ {"text": "For traffic source analysis: use session_traffic_source_last_click.cross_channel_campaign.primary_channel_group for channel grouping. When asked about popular traffic sources, default to channel group unless specified otherwise. For detailed attribution: session_traffic_source_last_click (last non-direct click), session_first_traffic_source (last click without non-direct attribution), collected_traffic_source (event-level data).", "dependsOn": ["session_traffic_source_last_click"]},
123
134
  {"text": "Nested arrays (event_params, items): use CROSS JOIN UNNEST(...) to access individual values.", "dependsOn": []},
124
135
  {"text": "Use data_is_final = true to exclude data that may still change in future refreshes.", "dependsOn": []}
125
136
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ga4-export-fixer",
3
- "version": "0.3.2-dev.2",
3
+ "version": "0.3.2-dev.3",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "files": [