Setting Up Google Analytics for Funnel Tracking
Before anything else, you’ll want to make sure your Google Analytics (GA) property can actually understand what your funnel steps are. GA4 makes this a little more awkward than Universal Analytics did—especially since there’s no “Goal Funnel Visualization” anymore. Thankfully, you can build funnel exploration reports manually. But it’s not just plug-and-play.
Thank you for reading this post, don't forget to subscribe!The fastest way to get started is using the Funnel Exploration in the Explore tab. Here’s how I got mine working correctly:
- I first set up key custom events: sign_up_viewed, sign_up_submitted, and sign_up_success. I did this directly in my site’s dataLayer using gtag().
- Then, in GA4, under Admin → Events, I enabled these as events I want to track. Important: they weren’t immediately visible in Explorations even after triggering them multiple times.
- I had to wait a few hours (in one case overnight) before GA4 allowed me to use the events in a funnel exploration. This is a weird delay with GA4 that isn’t well documented.
Once events appeared in the exploration builder, I created a classic 3-step labeled funnel. Each step used the corresponding event. One thing to watch for: funnel dropoff percentages are based strictly on order of steps, so if a visitor skips from step 1 to step 3 directly (say, bypassing the form), they won’t count on the funnel path.
To monitor multiple funnels without constantly resetting things, I saved each one inside its own exploration tab. Also, I tested the live flow using real traffic (i.e., me browsing in incognito) to make sure the progression was captured correctly.
To wrap up: GA4 makes funnel building more powerful, but also more fragile. Expect to troubleshoot your event labels and timing.
Capturing Micro-Conversions with Hotjar Recordings
One thing that was consistently fuzzy in GA4 was why users were dropping off at specific funnel steps. That’s where Hotjar stepped in. Hotjar offers session recordings—replays of real user behavior on your site. It doesn’t just show clicks, but strolling hesitation, rage clicks (tapping things repeatedly), and even if a modal blocked the submit button.
Here’s what I did to use Hotjar’s recordings effectively alongside GA funnels:
- Set Hotjar to trigger recordings only on pages tagged with my funnel events (like “/signup” or “/pricing”). I filtered them down using Hotjar’s URL targetting.
- I added custom User Attributes so that I could tag GA users via a shared session ID. Not perfect, but helped me synchronize behavior across both platforms using a shared random UUID in localStorage.
- Once I noticed a spike in abandonments on the “sign_up_viewed” event, I went into Hotjar and filtered recordings by “Signup” page. Within five views, I spotted something broken: the ‘Submit’ CTA wasn’t clickable in Safari due to z-index clashes with a third-party JavaScript popup.
After fixing that popup conflict, conversions from Step 2 to Step 3 instantly improved based on the next batch of recordings. I didn’t even need to wait for statistically significant results—the issue was obvious in replay footage.
To sum up: GA told me where users vanished, but Hotjar showed me why. They need to be used together to really understand funnel friction.
Visualizing Dropoffs with Funnel Exploration
Conversion dropoff is usually talked about in dramatic marketing terms—”leaks” or “holes” in the funnel—but the GA4 UI oddly doesn’t highlight them as clearly anymore. In Funnel Exploration, you can manually set up a step-by-step flow, but the visual doesn’t always shout where the problem is.
I made these tweaks to turn the funnel chart into a usable diagnostic tool:
- Colored each step manually — I created segments for high-intent users (who came from ads) and new visitors. That way, I could compare funnel completion rates visually across user types.
- Enabled the “Make open funnel” mode—this switch in Funnel Exploration lets GA4 count users who skip steps or jump straight to an end point. It revealed alternate flows that didn’t follow my ideal path.
- Added a secondary dimension by device category (mobile vs. desktop). Turns out the drop-off on mobile was almost double compared to desktop, especially between the sign-up and verification steps.
Here’s the exact funnel visualization table I ended up creating:
Funnel Step | Desktop (% Conversion) | Mobile (% Conversion) |
---|---|---|
Step 1: Landing Page | 100% | 100% |
Step 2: Signup Form | around 80% | about 50% |
Step 3: Confirmation | roughly 60% | about 30% |
Ultimately, the Funnel Exploration works best when paired with custom segments and behavioral filters. The defaults alone rarely reveal actionable trends.
Tagging Key Actions with GTM for Precision
The majority of funnel events used in GA4 don’t come pre-installed. If you want to track meaningful user steps like “modal opened,” “coupon applied,” or “chat started,” you’ve got to tag them manually. That’s where Google Tag Manager (GTM) really shows its value.
To handle this without bloating the dataLayer, I scoped down GTM to control only three core interactions:
- Form submissions (manually tracked via a GTM trigger + visibility check, because automatic triggers kept misfiring on AJAX forms)
- CTA button clicks with a data attribute (data-analytics=”cta”)—easier than tracking entire CSS selectors that often change
- Page scroll depth, but only once per session (to avoid flooding heatmap data on long landing pages)
Each tag was set up to push data to GA4 as a named event. I got burned once with inconsistent naming—capital letters in one event and lowercase in the other—so I enforced kebab-case naming inside GTM configs. Case sensitivity has subtle but frustrating implications in GA4.
This also happens when Hotjar picks up events dynamically (e.g., clicks rendered after a delay). I started using MutationObserver inside Hotjar’s custom actions to solve it.
To conclude: without clean GTM tagging, your funnel data gets muddy fast and misleads more than it helps.
Analyzing Heatmaps Alongside Funnel Data
While GA and Hotjar separately give you funnel steps and user behavior, heatmaps tie the visuals together. I treated Hotjar heatmaps as daily health checks for specific conversion pages, especially pricing tables and signup forms.
Here were three practical uses:
- Click concentration: Found that mobile users tapped the top plan’s “Learn More” link three times more than the CTA, pulling them away from the sign-up flow. I removed the link, kept the info in a tooltip—conversion improved slightly.
- False-bottom detection: On the desktop pricing page, users often scrolled halfway and bailed—thinking the page was over. The heatmap dropoff heat stripe was clear. I added a downward arrow icon—simple cue, but completion rate to the form ticked up noticeably that week.
- Hero blindness: Eye-tracking rarely works in normal tests, but in our case the heatmap showed intense cursor clustering on the lower content card while the hero went untouched. Changed the hero headline and CTA to a question instead of a command—engagement lifted right after.
Heatmaps don’t show the full story, but they’re like visual symptoms in medical diagnostics—they point you toward what’s worth analyzing next.
The bottom line is: if your funnel page isn’t winning clicks where you want ’em, the heatmap will show you—bluntly.
Troubleshooting Common Funnel Tracking Failures
Half of the issues I ran into came from assumptions I didn’t even know I was making. Here’s a short list of pitfalls I personally had to fix or debug:
- Duplicate event firing: GA4 triggered “signup_start” twice on one user due to both a manual gtag push and an automatic button listener in GTM. I had to add a flag in sessionStorage and suppress duplicates per session.
- Session fragmentation: Some users showed signup success with no prior funnel steps in GA. Turned out our site’s subdomain switch caused sessions to reset. I fixed it by enabling cross-domain linking in both GA and GTM config tags.
- Mismatch between GA + Hotjar pages: Hotjar tracked URLs with fragment identifiers (like #step2), but GA only recorded the base pathname. I unified them by stripping hashes before event send for both tools.
Similar issue occurs if you trigger tags on page load but your SPA dynamically loads content; in that case, use historyChange
triggers in GTM. Don’t assume your page is actually reloading just because the URL’s changing.
At the end of the day, debugging funnels is like trying to fix a leak in the bath while the water is still running—but with the right patches, it gets easier each round.
Segmenting Funnels by Acquisition Source
One of the last things I tackled—but probably should have started with—was analyzing funnel performance by traffic source. GA4 lets you segment users by source/medium, which essentially means where they came from (like “google / cpc” for ads or “direct / none” for people who typed the URL in).
I added these as comparison segments inside my Funnel Exploration:
- Paid traffic from Google Ads
- Email newsletter clicks
- Organic SEO (came from search engines)
What surprised me: email traffic converted nearly 3 times better through the entire funnel. Why? Because they already knew who we were. Meanwhile, paid search users dropped hard at the signup step, indicating the landing page was either unclear or untrustworthy.
To adjust, I built separate Hotjar heatmaps for each traffic source using UTM parameters. That gave us precise visuals of how each user segment behaved. I then customized hero copy on paid ad variants to better match user expectations—and it cut the funnel fallout by about a third.
Finally: if you assume users behave the same way no matter how they arrive, your entire funnel strategy will stumble over mismatched intent.