Blog

page_view vs first_visit in GA4: what each one counts

Two events that look similar, count differently, and confuse new GA4 users every week.

GA4 fires both page_view and first_visit on certain visits, and the difference between them is one of the most common sources of confusion for analysts coming from Universal Analytics.

page_view

Fires on every page load, including subsequent loads in the same session. If a user visits five pages, you get five page_view events. Equivalent to the UA pageview, almost.

In a single-page app, page_view does not fire automatically on route changes. You have to fire it manually via gtag('event', 'page_view') or by enabling enhanced measurement and routing through GA4 Admin.

first_visit

Fires once per user, on the very first session. After that, never again. If GA4 cannot identify the user (cookies cleared, different device), first_visit fires again because GA4 thinks it is a new user.

first_visit is what powers the New Users metric. Counting page_views with no prior session would give you the same number, but first_visit is the canonical event GA4 uses internally.

Why it matters for reporting

If you build a custom report that counts page_view events, you will not match the New Users count from the standard report. The standard report uses first_visit. The mismatch is small (always less than total visits) but real.

If you build a funnel that includes "first visit" as the entry step, use first_visit. If you build a "pages per session" metric, use page_view divided by session_start.

In server-side tagging

When you forward events through your tagging server, both events are forwarded as-is. The server container does not generate first_visit; it just relays what came in from the client. If you somehow lose first_visit during forwarding, your New Users count will drop to zero.

A useful diagnostic

In BigQuery, run this query against your GA4 export:

SELECT
  event_name,
  COUNT(*) AS events,
  COUNT(DISTINCT user_pseudo_id) AS users
FROM `your_project.analytics_XXXXX.events_*`
WHERE event_name IN ('page_view', 'first_visit', 'session_start')
GROUP BY event_name

first_visit count should equal new users in the same period. session_start should be greater than first_visit (returning users have sessions but not first_visits). page_view should be the largest of the three. If any of these relationships are wrong, check your tagging setup.