If you’ve ever tried to count sessions in GA4 using BigQuery and started with WHERE event_name = 'session_start', congratulations! You’ve just walked into one of the most common traps in GA4 analytics.
At first glance, it makes perfect sense: a session starts → GA4 sends a session_start event → you count those events → done. But like many things in GA4, it’s not that simple.
What’s the catch?
1. session_start can be missing. Sometimes GA4 doesn’t send this event at all—especially in edge cases like background activity, offline sessions, or custom events that skip the standard flow. In other words: the session happened, but you didn’t get a session_start event. Not magic—just GA4 quirks.
2. Not all events “admit” they’re part of a session. Some events will have a ga_session_id but no session_start. The session was real, but the starting whistle never blew. Ignore that, and you’ll lose part of your data.
So what’s the right way to count sessions?
Use a combination of user_pseudo_id and ga_session_id. That’s a more reliable and transparent method—and it’s closer to how GA4 counts sessions internally.
• Group by user_pseudo_id + ga_session_id
• Filter by the relevant time period
• Done.
Takeaway:
session_start is a helpful marker—but not the full picture. If you want accuracy, skip it and count sessions manually. With BigQuery, as always, your best friend is a good SQL query—and your own attention to detail.
Want to get all my top Linkedin content? I regularly upload it to one Notion doc.
Go here to download it for FREE.


