Copy
SELECT
page_location,
ep.value.int_value AS scroll_pct,
(SELECT value.string_value
FROM UNNEST (event_params)
WHERE key = 'scroll_type' ) AS scroll_type,
COUNT (*) AS event_count,
AVG ((SELECT value.int_value
FROM UNNEST (event_params)
WHERE key = 'dwell_ms' )) AS avg_dwell_ms,
AVG ((SELECT value.double_value
FROM UNNEST (event_params)
WHERE key = 'avg_velocity' )) AS avg_velocity
FROM
`project.dataset.events_*` ,
UNNEST (event_params) AS ep
WHERE
event_name = 'content_scroll'
AND ep.key = 'scroll_pct'
AND _TABLE_SUFFIX BETWEEN '20260327' AND '20260404'
GROUP BY
page_location, scroll_pct, scroll_type
ORDER BY
page_location, scroll_pct, scroll_type
Simple: SELECT * (raw events)
Copy SELECT * FROM `project.dataset.events_*`
WHERE event_name = 'content_scroll'
AND _TABLE_SUFFIX BETWEEN '20260326' AND '20260404'
Export as JSON or JSONL. The tool auto-detects all formats: GA4 raw (nested event_params), pre-aggregated, and flat JSONL. No transformation needed.
Supported Formats
{
"event_name" : "content_scroll" ,
"event_params" : [
{"key" : "scroll_pct" , "value" : {"int_value" : 25}},
{"key" : "scroll_type" , "value" : {"string_value" : "engaged" }},
{"key" : "dwell_ms" , "value" : {"int_value" : 31588}},
{"key" : "avg_velocity" , "value" : {"double_value" : 1.06}}
]
}
{
"zones" : [
{
"scroll_pct" : 25,
"scroll_type" : "engaged" ,
"event_count" : 15,
"avg_dwell_ms" : 31588,
"avg_velocity" : 1.06
}
]
}
{"scroll_pct" :25,"scroll_type" :"engaged" ,"dwell_ms" :31588,"avg_velocity" :1.06}
{"scroll_pct" :25,"scroll_type" :"skipped" ,"dwell_ms" :162,"avg_velocity" :72.89}