At first, it sounds simple. You know GA4 lets you send custom parameters with events - and you’ve been sending them diligently. Then you open BigQuery and think: “Where’s my button_color? Why is everything nested like a Russian doll?”
Congrats - you’ve just met the event_params array (or user_properties, if it's user-level). And no, it’s not a nice flat table. It’s an array of structs, where each parameter is its own row. Fun times.
Here’s what you need to know:
• Custom parameters don’t show up as separate fields. They’re hidden inside the event_params array. To access them, you’ll need to use UNNEST.
• The value type is also hidden. GA4 doesn’t know if a parameter is a string or an integer. So the value field is actually a struct with multiple types:
- string_value
- int_value
- double_value
- etc.
Guess right — you get data. Guess wrong - you get NULL.
• Unregistered parameters still exist. If you didn’t register the parameter in GA4, it won’t show up in the UI - but it will appear in BigQuery (just with a bit more hassle to extract it).
What does it look like in practice? You UNNEST(event_params), filter by key = 'button_color', and pull out value.string_value.
That’s it. Well - sort of.
Takeaway:
GA4 gives you clean, polished reports. BigQuery gives you the raw reality — full of arrays, nested fields, and the SQL equivalent of stepping on Legos in the dark.
But if you want to know who clicked the red button and who clicked the blue one, there’s no shortcut.
Just SQL. Just grit.
Want to get all my top Linkedin content? I regularly upload it to one Notion doc.
Go here to download it for FREE.


