GA4 Raw Event Data Sample CSV (Dirty + Clean)
A production-realistic Google Analytics 4 event export (15,000 rows) mirroring the BigQuery export schema. The GA4 quirk: event_timestamp is stored in microseconds (16-digit integers), not milliseconds. Data engineers who treat these as Unix epoch milliseconds will shift all event dates to year 53,000+, destroying time-series analysis. The 'dirty' version includes microsecond timestamps, null user_pseudo_id rows (bot traffic / consent denied), and event_params encoded as nested JSON strings that break flat-file parsers. Perfect for testing analytics engineering workflows, dbt model validation, and Looker Studio dashboards. Process everything locally — your analytics data never leaves your browser.
Live Interactive Preview
Live Data Preview
See how this messy google data looks before downloading. All processing happens locally in your browser.
💡 Pro Tip: GA4's nested event_params just broke your flat-file parser. Flatten it with JSON to CSV to extract keys like page_location into discrete columns. Zero data loss.
⚡ Next Step: Need to reconstruct sessions from raw events? Query this CSV directly with SQL in your browser — no BigQuery bills, zero cloud uploads.
Data Schema Definition
| Column | Type | Description |
|---|---|---|
| event_date | string | YYYYMMDD string partition key. Derived from event_timestamp in UTC; may differ from local calendar date. |
| event_timestamp | integer | ⚠️ CRITICAL: Microseconds since epoch (16 digits). Treating as milliseconds shifts dates to year 53,000+. Divide by 1,000,000 for Unix seconds. |
| event_name | string | Event identifier: page_view | session_start | purchase | scroll. Custom events follow snake_case convention. |
| event_params | json | ⚠️ TRAP: Nested JSON array of {key, value} pairs. Cannot be parsed as flat CSV. Requires UNNEST in BigQuery or dedicated flattener. |
| user_pseudo_id | string | Cookie/device ID. NULL when Consent Mode denies analytics storage (~15-30% in EU). Exclude from user counting. |
| device.category | string | Enum: desktop | mobile | tablet. Inconsistent casing across export methods; normalize to lowercase. |
| geo.country | string | Country name derived from IP. Not ISO code; join to geo lookup table for standardized reporting. |
| traffic_source.medium | string | Attribution medium: organic | cpc | referral | email. '(none)' indicates direct/unattributed; do not treat as null. |
| session_engaged | string | '1' = engaged session (>10s, conversion, or 2+ pageviews). String type, not boolean; cast explicitly. |
| ecommerce.total_item_quantity | integer | Sum of items in purchase event. NULL for non-commerce events; COALESCE to 0 for aggregation. |
⚠️ Highlighted rows contain known data traps. Review descriptions before building ETL pipelines.