ga4-export-fixer 0.9.0 → 0.9.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
CHANGED
|
@@ -16,6 +16,7 @@ The goal of the package is to **speed up development** when building data models
|
|
|
16
16
|
|
|
17
17
|
## Table of Contents
|
|
18
18
|
<!-- TOC -->
|
|
19
|
+
- [Blog Posts](#blog-posts)
|
|
19
20
|
- [Main Features](#main-features)
|
|
20
21
|
- [Planned Features](#planned-features)
|
|
21
22
|
- [Installation](#installation)
|
|
@@ -30,6 +31,10 @@ The goal of the package is to **speed up development** when building data models
|
|
|
30
31
|
- [License](#license)
|
|
31
32
|
<!-- /TOC -->
|
|
32
33
|
|
|
34
|
+
## Blog Posts
|
|
35
|
+
|
|
36
|
+
- [ga4-export-fixer: Getting started in Dataform](https://tanelytics.com/ga4-export-fixer-getting-started-in-dataform/)
|
|
37
|
+
|
|
33
38
|
## Main Features
|
|
34
39
|
|
|
35
40
|
<table>
|
|
@@ -150,6 +155,7 @@ The goal of the package is to **speed up development** when building data models
|
|
|
150
155
|
Features under consideration for future releases:
|
|
151
156
|
|
|
152
157
|
- Aggregated tables (ga4_session, ga4_ecommerce...)
|
|
158
|
+
- Roll-ups for creating a single ga4_events_enhanced table from multiple source exports
|
|
153
159
|
- Web and app specific default configurations
|
|
154
160
|
- Custom channel grouping
|
|
155
161
|
- Custom traffic source attribution
|
|
@@ -172,7 +178,7 @@ Include the package in the package.json file in your Dataform repository.
|
|
|
172
178
|
{
|
|
173
179
|
"dependencies": {
|
|
174
180
|
"@dataform/core": "3.0.42",
|
|
175
|
-
"ga4-export-fixer": "0.9.
|
|
181
|
+
"ga4-export-fixer": "0.9.1"
|
|
176
182
|
}
|
|
177
183
|
}
|
|
178
184
|
```
|
package/helpers/ga4Transforms.js
CHANGED
|
@@ -97,7 +97,7 @@ const isFinalData = (detectionMethod, dayThreshold) => {
|
|
|
97
97
|
/**
|
|
98
98
|
* The standard GA4 BigQuery export top-level column names, based on the official schema.
|
|
99
99
|
*
|
|
100
|
-
* list updated 2026-
|
|
100
|
+
* list updated 2026-07-30
|
|
101
101
|
*/
|
|
102
102
|
const ga4ExportColumns = [
|
|
103
103
|
"event_date",
|
|
@@ -108,6 +108,7 @@ const ga4ExportColumns = [
|
|
|
108
108
|
"event_value_in_usd",
|
|
109
109
|
"event_bundle_sequence_id",
|
|
110
110
|
"event_server_timestamp_offset",
|
|
111
|
+
"event_original_occurrence_timestamp",
|
|
111
112
|
"user_id",
|
|
112
113
|
"user_pseudo_id",
|
|
113
114
|
"privacy_info",
|
package/package.json
CHANGED
|
@@ -290,6 +290,7 @@
|
|
|
290
290
|
"event_value_in_usd": "Currency-converted value (in USD) of the event's 'value' parameter",
|
|
291
291
|
"event_bundle_sequence_id": "Sequential ID of the bundle in which the event was uploaded",
|
|
292
292
|
"event_server_timestamp_offset": "Timestamp offset between collection time and upload time in microseconds",
|
|
293
|
+
"event_original_occurrence_timestamp": "Timestamp in microseconds (UTC) of when the event originally occurred, for events that arrived at GA4 after the standard 72-hour collection window. Such events are processed in the current day's export (previously they were dropped); this field preserves the original event time. Null for events that arrived within 72 hours.",
|
|
293
294
|
"privacy_info": {
|
|
294
295
|
"description": "Consent status information for the user when consent mode is enabled",
|
|
295
296
|
"columns": {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"event_date": "Partition column. Always include in WHERE clauses to limit scanned data and reduce query cost",
|
|
3
3
|
"event_datetime": "Human-readable timestamp in the configured timezone. Use for time-of-day analysis and reporting",
|
|
4
4
|
"event_timestamp": "Microsecond-precision UTC timestamp. Use for precise event ordering and time difference calculations",
|
|
5
|
+
"event_original_occurrence_timestamp": "Use to identify events that arrived late (after 72 hours) and to recover their true occurrence time. On such rows event_timestamp reflects when GA4 processed the event, not when it actually happened. Filter WHERE event_original_occurrence_timestamp IS NOT NULL to isolate delayed events",
|
|
5
6
|
"event_name": "Primary event filter. Use in WHERE clauses to select specific event types (e.g. WHERE event_name = 'purchase')",
|
|
6
7
|
"session_id": "Use for counting unique sessions (COUNT(DISTINCT session_id)) and as a GROUP BY key for session-level aggregations",
|
|
7
8
|
"user_pseudo_id": "Device-level user identifier. Use for counting unique devices or as a fallback when merged_user_id is not needed",
|