It sounds logical: want to count new users in GA4 BigQuery? Just filter by the first_visit event, count distinct user_pseudo_id, and done.

Clean. Simple. Elegant.

But... not quite.

That’s a trap. A gentle, well-lit trap with a sign that says “You’re doing great!”
But it’s still a trap.

Here’s why relying on first_visit can be misleading:

• first_visit ≠ new user. This event is triggered per device. If the same person visits from their phone and later from their laptop, you’ll see two first_visit events — but it’s still one user (assuming you’re lucky and have User-ID properly configured).

• first_visit can arrive late. It may show up retroactively, especially if the user was offline or the data comes from a mobile SDK. So you might miss them initially, only to have them “resurface” later.

• first_visit is an event, not a status. You’re capturing a moment, not a user’s real “newness.” It’s like counting everyone who says “hi” as a new employee — fun, until HR has a breakdown.

So what’s the right way to count new users?

• use user_id with proper deduplication.

• use event_timestamp WHEN ga_session_number=1 for each user_pseudo_id - if there is no chance to make cross-device deduplication.

• Filter for users whose first-ever event occurred during your target period

Alternatively, you can rely on user_first_touch_timestamp if it’s available — it tends to be more reliable and less surprising.

Takeaway:

GA4 gives you first_visit as a hint. BigQuery gives you the tools to verify it — and maybe even challenge how you think about your metrics.

Because what looks like a first visit… might not be the first. Or a visit. You got it.

Want to get all my top Linkedin content? I regularly upload it to one Notion doc.

Go here to download it for FREE.