GA4’s User Explorer report gives you a session-by-session breakdown of what individual users did on your site — which pages they visited, which events fired, and in what sequence. But many analysts don’t know how to use it properly, or they confuse user_pseudo_id with user_id. This guide explains how User Explorer works, how to trace journeys for specific users, and how to do it without exposing personally identifiable information.

What User Explorer Shows You

User Explorer shows event-level data for individual users identified by user_pseudo_id (GA4’s anonymous cookie-based identifier). For each user you can see sessions they had with timestamps, pages visited within each session, events fired including page_view, scroll, click, purchase, event parameters, and device and geographic info.

This makes it ideal for debugging conversion issues — you can literally follow what a specific user did before they abandoned checkout, or trace how a high-value customer behaved before their first purchase.

user_pseudo_id vs user_id

  • user_pseudo_id: GA4-generated anonymous cookie ID. Not PII because it doesn’t map to a real person without additional context.
  • user_id: Your own identifier set via gtag(‘set’, {user_id: ‘user_12345’}) when users log in. When set, User Explorer shows both IDs and lets you search by user_id.

Finding Specific User Journeys

  • Go to Explore → User Explorer
  • Filter by users who fired begin_checkout but not purchase to find abandoned checkouts
  • Click on a user_pseudo_id to see their full journey
  • Expand each session to see event sequence
-- BigQuery: find users who had checkout errors
SELECT user_pseudo_id, MAX(event_timestamp) as last_seen
FROM `project.dataset.events_*`
WHERE event_name = 'begin_checkout'
AND user_pseudo_id NOT IN (
  SELECT DISTINCT user_pseudo_id
  FROM `project.dataset.events_*`
  WHERE event_name = 'purchase'
  AND _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAYS))
)
AND _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAYS))
GROUP BY user_pseudo_id
ORDER BY last_seen DESC LIMIT 20;