Every GA4 audit we run starts the same way: someone opens Reports → Life cycle → Engagement and asks why the numbers do not match Stripe. They do not match because GA4's default reports are not funnels. They are pre-aggregated event summaries with a 24-48 hour processing delay, session-scoped attribution, and no ability to enforce step order. If you are using them to answer questions about conversion, you are answering the wrong question.
This post walks through the three tiers of GA4 funnels – default reports, Explorations, and BigQuery – with a bias toward what actually works for conversion tracking in 2026. We will show the shape of a good funnel event, the reporting queries you will graduate to, and the moment you should stop fighting the GA4 UI and export your data.
Why default GA4 reports are not funnels
A funnel has three properties: an ordered sequence of steps, a fixed window in which the sequence must complete, and a denominator that stays stable across steps. GA4's default reports break all three.
- Step order is not enforced – a user who fires `purchase` before `add_to_cart` still counts in both buckets.
- The window is the session by default. Cross-session journeys (which are the majority of B2B and considered-purchase flows) disappear.
- The denominator shifts because sampling kicks in above 10M events in the default reports view.
The reports are useful for eyeballing traffic shape. They are not useful for answering "of the 4,200 users who saw pricing last week, how many converted within 7 days?" That question needs an Exploration, at minimum.
Tier 1: Exploration funnels – the free upgrade
The Funnel exploration inside Explore is where most teams should live. It supports ordered and open funnels, custom step definitions, up to 10 steps, breakdowns by any dimension, and – crucially – user-scoped windows up to 60 days. You still hit sampling above 10M events per query, but you can slice the data and see step-by-step drop-off without waiting on a warehouse.
Two Exploration features that most teams miss: elapsed time between steps (right-click any step) and next action breakdowns (shows what users do instead of completing the step). Both are where the actionable insights live. Drop-off percentages tell you *where* users leave; next-action tells you *why*.
Shape your events for the funnel, not the report
The single biggest cause of unusable funnels is unshaped events. Teams fire `click`, `submit`, and `page_view` with generic parameters, then try to reconstruct funnel steps from event names in the UI. It does not work. Fire one event per funnel step, named after the step, with the parameters you need for segmentation baked in at fire time.
// Good: a funnel step event with everything the funnel needs
gtag('event', 'checkout_shipping_submitted', {
// Step identity – matches the funnel definition exactly
funnel_id: 'checkout_v3',
step_index: 3,
step_name: 'shipping_submitted',
// Denominator hygiene – lets you filter to comparable cohorts
cart_value_aud: 189.00,
currency: 'AUD',
cart_item_count: 2,
is_returning_customer: false,
// Attribution – captured at fire time, not inferred later
landing_page_path: '/products/lens-hire',
first_utm_source: 'google',
first_utm_medium: 'cpc',
})A few rules that pay off later:
- Fire once, never on re-renders. SPA route changes fire duplicates by default. Guard with a session-scoped flag per step.
- Include `step_index` and `funnel_id`. You will want to A/B test funnel variants. The IDs make BigQuery joins trivial.
- Capture attribution at the first step, propagate to every subsequent step. GA4's built-in attribution changes based on model settings; your captured copy does not.
- Values in the reporting currency. Do not mix AUD and USD in the same parameter – write `cart_value_aud` and `cart_value_usd` if you need both.
Tier 2: when Explorations start to bend
You will feel Explorations breaking around three symptoms. Any one of them is a signal to plan the BigQuery step; two of them means do it this quarter.
- You are hitting the "results may be based on sampled data" banner on most queries.
- You need a funnel that spans more than 60 days (subscription trials, considered B2B purchases, education).
- You need to join GA4 data with anything outside GA4 – CRM stages, ad spend, product usage.
The other trigger is simpler: someone senior asked "why does GA4 say 4,200 conversions and Stripe says 3,880?" and you cannot answer without exporting the raw events.
Tier 3: BigQuery funnels – the real thing
The GA4 → BigQuery export is free for standard properties up to 1M events/day and lands as a daily `events_YYYYMMDD` table (plus intraday for near-real-time). Once you have it, funnels become SQL. You get exact numbers, no sampling, and lookback limited only by your billing appetite.
The mental shift is that a funnel is no longer a UI configuration – it is a query. A typical shape:
-- Ordered 4-step funnel with a 7-day user window
WITH steps AS (
SELECT
user_pseudo_id,
event_name,
TIMESTAMP_MICROS(event_timestamp) AS ts
FROM `project.analytics_XXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260601' AND '20260630'
AND event_name IN (
'view_pricing',
'start_checkout',
'checkout_shipping_submitted',
'purchase'
)
),
ordered AS (
SELECT
user_pseudo_id,
MIN(IF(event_name='view_pricing', ts, NULL)) AS t1,
MIN(IF(event_name='start_checkout', ts, NULL)) AS t2,
MIN(IF(event_name='checkout_shipping_submitted', ts, NULL)) AS t3,
MIN(IF(event_name='purchase', ts, NULL)) AS t4
FROM steps
GROUP BY user_pseudo_id
)
SELECT
COUNTIF(t1 IS NOT NULL) AS step_1,
COUNTIF(t2 > t1) AS step_2,
COUNTIF(t3 > t2 AND t2 > t1) AS step_3,
COUNTIF(t4 > t3 AND t3 > t2 AND t2 > t1
AND TIMESTAMP_DIFF(t4, t1, DAY) <= 7) AS step_4
FROM ordered;That query gives you an exact, order-enforced, 7-day funnel across as much history as you have exported. It is 20 lines of SQL that no GA4 UI can replicate.
Choosing the tier – a comparison
Most teams end up running all three tiers in parallel: defaults for the daily glance, Explorations for the weekly deep-dive, BigQuery for anything the CFO or a board deck touches. The table below is the one we hand to clients when they ask which to invest in first.
| Capability | Default reports | Explorations | BigQuery |
|---|---|---|---|
| Step order enforced | No | Yes | Yes |
| Custom user-scoped window | Session only | Up to 60 days | Unlimited |
| Historical lookback | 14 months | 14 months | Unlimited (billed) |
| Sampling above 10M events | Yes | Yes | No |
| Join with CRM / ads / product data | No | No | Yes |
| Time to first insight | 5 minutes | 30 minutes | 1-2 days setup |
| Cost | Free | Free | Free tier + query costs (~$5-50/mo for most teams) |
| Right for | Ops glance | Weekly analysis | Finance-grade reporting |
Common mistakes that ruin funnels
- Using `page_view` as a step. Route changes in SPAs fire multiple `page_view`s per real navigation. Fire a purpose-named step event instead.
- Not deduping cross-device users. Enable Google Signals *and* User-ID. Without both, cross-device journeys look like separate users and inflate step 1.
- Trusting session-scoped `source/medium`. For any funnel longer than a session, capture first-touch attribution as event parameters and reference those.
- Optimising for step-2 conversion rate. The step with the worst rate is usually the one to fix – but only if the step *before* it is well-shaped. A 3% step-2 rate on a badly-fired step 1 is a measurement bug, not a UX bug.
What to do next
Pick the funnel that matters most to your business – usually the one closest to revenue – and audit it in this order. Are the step events fired exactly once per real user action? Is the window realistic for the buying cycle? Does the denominator match what marketing thinks it should? If any answer is no, fix that before you touch the UI. Once the events are shaped correctly, build the Exploration. If you are hitting sampling or lookback limits within a month, turn on the BigQuery export and start writing SQL. And if you want a second pair of eyes, our analytics team does GA4 funnel audits as a fixed-scope engagement – we will tell you which of the three tiers you actually need.
