I wrote recently about using GA4’s engagement rate as a diagnostic tool for traffic quality, and it’s great for that. But engagement rate sets a pretty low bar since it’s only looking for ten seconds on the page, two page views, or a conversion. When you’re spending ad dollars and you want to tell Google Ads, Meta, or other ad networks what a “good” visit looks like, you probably want something more specific.

Our paid team builds what we call a “quality traffic” metric using Google Tag Manager. It’s a composite event that combines time on page with scroll depth or visibility of a key element such as a call-to-action button or heading, and it gives ad platforms a useful signal. What you’re building here is effectively a micro conversion, but a smarter one because it requires two things to be true at once before it fires.

Let’s walk through what it is, how to build it in GTM, and where to deploy it across your ad platforms.

Why GA4's Engagement Rate Isn't Enough for Ad Optimization

If you’ve read my engagement rate post, you know the criteria: a session counts as “engaged” if someone spends 10 seconds on the site, views 2 or more pages, or triggers a key event. That’s a useful diagnostic. But you might see an issue with some paid networks with engagement rates sitting at 60% or higher while conversion rates stay stubbornly low. The gap between “technically engaged” and “actually interested in what’s on this landing page” can be pretty large!

The core issue is that engagement rate is session-scoped and site-wide. It doesn’t tell you anything specific about how a visitor interacted with a particular landing page’s content. Someone could land on your page, immediately navigate to a second page, and GA4 counts that as an engaged session, even though they didn’t read a word of what you paid to put in front of them.

You might ask: “Why not change GA4’s engaged session timer from 10 seconds to something higher?” You can do that in your GA4 admin settings. But the timer is still session-scoped and site-wide, it only addresses time (not whether someone actually scrolled through your content), and you can’t selectively send GA4’s engaged session definition to individual ad platforms. You’re stuck with a single site-wide setting that doesn’t account for different landing pages having different content depths.

What ad platforms benefit from is a signal that says “this visitor engaged meaningfully with the landing page content specifically.” Not just “they were on the site for a bit.” That’s where the quality traffic metric comes in.

What the Quality Traffic Metric Is (And Why Both Signals Matter)

Our paid team was inspired by Jon Loomer’s Quality Visitor approach for Meta, and we wanted to extend it across platforms and add a diagnostic layer that makes it useful for campaign troubleshooting, not just optimization.

The quality traffic metric is built using a composite GTM event that requires two conditions to be true simultaneously on a landing page:

  1. A time threshold (for example, 30 seconds). This proves the visitor stuck around long enough to consume content.
  2. A scroll depth or element visibility threshold. This proves the visitor actually moved through the page.

Only when both conditions are met does the event fire. Think of it as a “broad brush” micro conversion for landing pages. It sits between “engaged session” (too broad) and “form submission” (too narrow) in your measurement hierarchy.

Here’s why both signals matter together. Time on page alone isn’t enough. Someone could leave a tab open while they go make coffee, and you’d count that as quality traffic. Scroll depth alone isn’t enough either. Someone could rage-scroll through your page in five seconds without reading anything. But when someone has spent 30 seconds on the page and scrolled through 50% of the content? That’s a reasonable proxy for “this person actually engaged with what’s here.”

The specific thresholds depend on your landing pages, and this is where your judgment matters. A short product page might show 75% of the page when it loads, which means that the scroll depth trigger would always be true. A long-form educational landing page might take longer to read and it’ll take a while to hit that 50% scroll depth so instead you could record visibility of the main call-to-action button. There’s no universal “right” number. You might consider starting with 30 seconds and 50% scroll depth as a baseline (which is where we start), and then tuning from there based on what you see in your data.

I mentioned swapping scroll depth for an Element Visibility trigger. An Element Visibility trigger fires when a specific element (like your call-to-action button or an important section heading) enters the viewport. Element visibility is more precise for pages where scroll percentage doesn’t map well to engagement, like shorter pages where 50% scroll depth can be achieved just by loading the page.

How to Build It in Google Tag Manager (GTM)

Let’s walk through the setup. This involves a few triggers and a Trigger Group in Google Tag Manager, but the whole thing uses native GTM features. No custom JavaScript or dataLayer hacks required!

Set Up the Timer Trigger

In GTM, create a new trigger and select Timer as the trigger type. Here’s how to configure it:

  • Interval: Set this to your time threshold in milliseconds. For 30 seconds, that’s 30000.
  • Limit: Set to 1. This is important because you want the trigger to fire once, not repeatedly at 30-second intervals.
  • Enable When: Use a Page Path condition to limit this to the landing pages where you want the metric. For example, Page Path contains /landing/ or matches your specific page URLs. If you want to fire this trigger on all pages, see the screenshot below on how to set that up.

Timer trigger configuration in GTM

The timer starts counting from when the page loads. When the interval elapses and the page path condition matches, this trigger fires once and is ready.

Set Up the Scroll Depth or Element Visibility Trigger

You have two options here, and the right choice depends on your page layout.

Option A: Scroll Depth trigger. Create a new trigger, select Scroll Depth, choose Vertical Scroll Depths, and set your percentage (for example, 50). Enable it on the same landing pages you used for the timer trigger.

Scroll Depth trigger configuration in GTM

Option B: Element Visibility trigger. Create a new trigger, select Element Visibility, and specify the CSS selector or element ID for the element you want to track, something like your main CTA button, a specific section heading, or a form container. Set it to fire once per page. This is a better fit for shorter pages or when you care about a specific content milestone rather than general scroll depth. The example below shows a trigger that will record every time a H2 heading enters the user’s viewport (what they can see on-screen).

Element Visibility trigger configuration in GTM

Here’s where it all comes together. GTM has a native feature called Trigger Groups that does exactly what we need: it fires only when all triggers in the group have occurred during the same page view.

Create a new trigger, select Trigger Group as the type, and add both your timer trigger and your scroll/visibility trigger to the group. This Trigger Group will then only fire when both conditions have been met.

Trigger Group configuration in GTM combining timer and scroll/visibility triggers

Create the Quality Traffic Tag

Next you’ll create the tags that fire on your Trigger Group. You’ll likely want to send this event to multiple destinations from the same trigger. Here are some suggestions on what you could set up, based on what we’ve done in the past:

  • GA4 Event tag: Send a custom event called quality_traffic (or whatever you want to name it!) to your GA4 property. When choosing your event name, stick with lowercase and underscores to follow GA4’s naming conventions.
  • Google Ads Conversion Tracking tag: Send a conversion action to Google Ads (more on how to use this in the next section).
  • Meta pixel: Send a custom event through your Meta pixel tag. You can see an example of this below.
  • Other ads networks (Microsoft, Reddit, etc): Most platforms have a Custom event option you can use, or for those that don’t, we use a View Content event (assuming that’s available).

Meta pixel custom event tag example for quality_traffic

Set the trigger for each of these tags to the Trigger Group you created. Using one trigger and multiple tags ensures that you know that every tag is firing based on exactly the same set of conditions.

Finally, make sure to test thoroughly before publishing. Confirm that the event only fires when both conditions are met, that it fires once per page view, and that it only fires on the page(s) that you limited it to.

Once you’ve submitted your changes in GTM, the quality traffic event will start flowing to your platforms.

Where to Deploy the Quality Traffic Metric

Google Ads: As a Secondary Conversion

In Google Ads, I recommend setting up the quality traffic event as a secondary conversion action. One thing to keep in mind here: secondary conversions are observation and reporting only. They appear in the “All conversions” column but are not used for automated bidding. This is a diagnostic tool, not an algorithm signal.

Here’s how our paid team uses the quality traffic rate alongside primary conversion data to troubleshoot campaigns:

Quality Traffic RateConversion RateWhat It Likely Means
LowLowTargeting problem: the ads are sending the wrong visitors to the page
HealthyLowLanding page or offer problem: visitors are engaging with the content but not converting
HealthyHealthyCampaign is working: optimize for scale
LowHealthyThresholds may be too strict: revisit your quality traffic criteria

This diagnostic matrix has saved our team a lot of guesswork. Instead of staring at a low conversion rate and wondering whether it’s a targeting problem or a landing page problem, the quality traffic secondary conversion gives you a second data point right there in your Google Ads reporting, visible in the “All conversions” column.

If you’re in a situation where you do want quality traffic to influence bidding, for example in campaigns with very sparse primary conversion volume or a Google Ads Grants account, you could make it a primary goal. But for most cases, the diagnostic value is the primary benefit.

Meta: As a Custom Event

We send the quality traffic event to Meta as a custom event. You can then select it as the optimization target within an Engagement campaign (under Performance Goal → Maximum number of conversions → select your custom event), or use it to build custom audiences for retargeting. People who hit quality traffic are a warmer audience than general page visitors.

One practical note: Meta’s optimization works best when it has sufficient event volume. If your quality traffic event fires fewer than roughly 50 times per week, Meta may struggle to optimize toward it effectively. If you’re seeing low volume, this connects directly to the threshold tuning guidance below. You might consider loosening your criteria slightly so Meta has enough signal to work with.

GA4: As a Diagnostic Event

This event is useful in Explorations to compare quality traffic rate versus engagement rate by source, campaign, or landing page. That comparison often reveals which traffic sources are sending visitors who actually read the page versus those who technically “engage” by GA4’s generous definition.

In order to see how many times this event has been recorded in GA4 so you can use it in reports and calculated metrics, you need to add something extra to your GA4 event tag in GTM. Add a parameter to the event tag in GTM, like so:

GA4 event tag with quality_traffic_count parameter

Then go into the GA4 admin > Custom definitions > Custom metrics and create a custom metric with the Event parameter of quality_traffic_count. We usually name the metric “Quality Traffic Count” to keep it simple. Use Standard as the unit of measurement.

Once that’s set up, you’ll have a metric that increments by 1 every time the quality_traffic event is recorded. This makes it very easy to add this metric to reports, explorations, and even in calculated metrics in GA4.

Tuning and Troubleshooting Your Thresholds

Getting your quality traffic thresholds right can be a process, so don’t feel like you have to nail it on the first try. Here’s what I’ve found works well.

Start by checking your quality traffic rate. After the event has been running for a week or two, look at what percentage of landing page sessions trigger it. If it’s firing on 80% or more of sessions, the thresholds are too loose and you’ll need to be more strict. If it fires on fewer than 5% of sessions, you’re being too restrictive (or your campaigns are truly not good). You’ll want to tweak the settings until you feel that you’re getting a good pulse on visitor quality.

Compare quality traffic to actual conversions. The quality traffic rate among visitors who do convert should be noticeably higher than among all visitors. If it’s not, the metric isn’t capturing meaningful engagement, and the thresholds need adjustment.

Use different settings for different landing pages. A quick pricing page and a long-form case study shouldn’t use the same criteria. Different pages have different content depths and visitor behaviors, and your thresholds should reflect that. This takes some extra effort but it’s worth it to get more useful signals.

Watch for scroll depth inflation. If you’re dealing with very short pages, your scroll depth trigger could be firing immediately on page load. If you’re seeing inflated quality traffic numbers that don’t match what you’d expect, consider using a lower depth or swapping the scroll depth trigger for an Element Visibility trigger instead. Picking a specific element can be more precise, although if your pages are extremely short this might not help either. You’ll need to test on

What to Do Next

The quality traffic metric sits in the space between “any session” and “actual conversion”: a micro conversion that reflects real content engagement rather than a low default threshold.

I’d suggest starting with your highest-spend landing page and one ad platform. Get the GTM Trigger Group working, confirm the event is firing correctly, and then look at the data after a couple of weeks. Once you’re confident in the setup, expand to additional pages and platforms.

And with that, you should be all set to start giving your ad platforms a smarter signal about what quality traffic actually looks like to you.

Black and white portrait of Dana DiTomaso

Dana enjoys solving problems that haven’t been solved before. With her 20+ years experience in digital marketing and teaching, she has a knack for distilling complex topics into engaging and easy to understand instruction. You’ll find Dana sharing her knowledge at digital marketing conferences around the world, teaching courses, and hosting a technology column.

Learn more about Dana