// ]]>
by Kick Point

Content Consumption: Measuring Content Performance

An illustrated hamburger with the word CONTENT in the middle

If you were asked to report on how your website visitors were engaging with your content, you’d probably turn to two separate metrics in Google Analytics — page views, and average time on page (in Universal Analytics) or user engagement (in GA4).

Page views suffer from the same problem as the “impressions” metric. We know that the page was viewed, but did the visitor actually read it?

As for time on page, it just isn’t accurate — and is going away on July 1 2023! When someone visits a page, the time on site metric is set at 0:00. If they spend 3 minutes on that page, but never visit another page or otherwise engage with the page, Universal Analytics will never know exactly how long that person was on that page. As for GA4, user engagement shows the amount of time that your web page was the active tab, but doesn’t tell us exactly what happened during that time.

Google Tag Manager gave us another tool to help with this in the “timer” trigger — you could record an event in Google Analytics if someone spent a specific amount of time (however long you set your timer for) on that page. But not every page takes the same amount of time to read.

These measures weren’t good enough. So we came up with another method — introducing Content Consumption.

What is Content Consumption?

We’re measuring two things — did a visitor stay long enough on a page to read your content, and did they scroll far enough down the page to actually see your content? If both things are true, then your content was consumed.

When you’re measuring Content Consumption, you can separate every page view into four types of visitor behaviours:

  • Bouncers: Didn’t stay on the page long enough to read it and didn’t scroll to the end of the content.
  • Skimmers: Scrolled to the end of the content, but weren’t on the page long enough to read it fully.
  • Tab Hoarders: Stayed long enough on the page to read it, but didn’t scroll to the end of the content. You know who you are.
  • Consumers: Stayed long enough on the page to read it, and scrolled to the end of the content.

How We Measure Content Consumption

We’ve put together two methods that you can use to measure content consumption — a WordPress plugin, or via Google Tag Manager. Either way, this is how content consumption works:

  1. When the page is loaded, a JavaScript function counts how many words are in the section of the page that you’ve decided counts as content. You only want to include a subset of words because you don’t want your sidebar, navigation, footer, etc. included in this calculation.
  2. That function then determines how long it would take to read that many words based on the “reading speed” time that you set and starts a timer.
  3. Once the timer hits the amount of time it would take to read that many words, a content_dwell event is broadcast.
  4. At the same time, the scroll tracker is seeing how far down the page that visitor is scrolling. If the visitor gets to the part of the content that you designated as the “end”, a content_scroll event is also broadcast.
  5. If both content_dwell and content_scroll have happened, a third content_consumed event is broadcast.

You’ll use Google Tag Manager to “listen” for these events and then save them in GA4 for analysis.

A illustrated black man bouncing on a pogo stick
Bouncers: Didn’t stay on the page long enough to read it and didn’t scroll to the end of the content.

Implementing Content Consumption on WordPress

Adding the Content Consumption WordPress Plugin

Download our WordPress plugin, and then use the “Upload Plugin” option on the Add Plugins page to add it to your site.

Once it is active, you’ll see a new option in your sidebar for Content Consumption. That is where you’ll set up your options for the section that should be read and the end of your content. The plugin automatically detects any custom post types you have registered and will provide a content container and content end option for each.

You will need to check your website’s code to see what you could use as your content container. If you’re unfamiliar with how to find a CSS class or ID selector, this post can help. For example, on this page that you’re reading right now, the content container has a class of “entry-content”, which means that we’ll put .entry-content in the content container field for our posts.

As for the end of your content, see what is at the very bottom of your container. On this page, the end of our content container has an ID of “comments”, which means that we’ll put #comments in the content container field for our posts.

Adding Content Consumption Measurement to Google Tag Manager for a WordPress Website

Next, we’ll need to ensure that the information that the plugin is broadcasting can be captured and sent off to GA4 for analysis. Download this Google Tag Manager container — it is already loaded up with the triggers and tags that you need to send this data off to GA4. Make sure to update the Configuration Tag option in each GA4 Event Tag so that you’re sending data to your GA4 property.

Additionally, register these parameters as custom metrics under Configure > Custom Definitions > Custom Metrics:

  • content_consumed_count
  • content_dwell_count
  • content_cscroll_count

Then you can use those custom metrics in your reporting, instead of counting the number of times that the individual events have occurred.

A white woman running and waving
Skimmers: Scrolled to the end of the content, but weren’t on the page long enough to read it fully.

Implementing Content Consumption on Any Website

Configuring Google Tag Manager for Content Consumption

If you don’t use WordPress, you can instead run the content consumption code in Google Tag Manager – it only takes a little bit more work to set up and works on many different content management systems.

To start, download our Google Tag Manager container. This container has everything you need to implement content consumption on websites built in any CMS. There are two variables that you will need to adjust before it will work on your website.

Similar to the WordPress plugin, you’ll need to set up your options for the section that should be read and the end of your content. Since this may vary by page template, we’ve included two example Regex Lookup variables for you to work with. You will need to check your website’s code to see what you could use as your content container. If you’re unfamiliar with how to find a CSS class or ID selector, this post can help.

In the example that you’ll find in Google Tag Manager, which is based on our website, we know that the body class of each page tells us what template that page is using. We can then use that information to set the content container and the content end. For example:

  • body class contains post-template-default = blog post
  • body class contains page-template-default = page
  • body class contains case_study-template-default = case study

Then based on the content container and content end items for each of these templates, we put the correct item in the output field of the Regex Lookup variable. For example, the content container for a blog post (body class contains post-template-default) is “.entry-content” and the content end is “#comments”.

If you don’t want to track content consumption on a page, you can either change the trigger so that the content consumption tag only triggers on the pages you wish to track, or don’t include content containers and content ends for those pages. The tag will only broadcast events if it finds a matching content container and content end on the current page.

Make sure to update the Configuration Tag option in each GA4 Event Tag so that you’re sending data to your GA4 property.

Additionally, register these parameters as custom metrics under Configure > Custom Definitions > Custom Metrics:

  • content_consumed_count
  • content_dwell_count
  • content_cscroll_count

Then you can use those custom metrics in your reporting, instead of counting the number of times that the individual events have occurred.

A person holding a giant stack of paper, two sheets falling to the side
Tab Hoarders: Stayed long enough on the page to read it, but didn’t scroll to the end of the content. You know who you are.

Is It Working?

Once you have either configured the WordPress plugin or the utility tag in Google Tag Manager, click the Preview button and check your site to ensure that you are seeing the events as expected. You can also use the DebugView in GA4 (found under Configure) and watch your events as they are recorded in GA4 to ensure that all is working as expected. We’ve also included a debug option in both the WordPress plugin and the utility tag in Google Tag Manager – enabling this will show additional information about the current page in the DevTools console.

A illustrated woman in a purple shirt, holds an empty plate sprinkled with crumbs
Consumers: Stayed long enough on the page to read it, and scrolled to the end of the content.

Turning Data Into Insights

Of course, we want to be sure that we can turn all this data into something actionable. Since we have registered the custom metrics in GA4, we can then calculate what percentage of page views also had a scroll, or a long enough dwell time, or a consumption.

Using Google Data Studio

You can create basic custom fields in Google Data Studio that (for example) calculate the content_consumed_count divided by the views for a given page. We recommend formatting these custom fields as a percentage. Once you’ve created these fields, you’ll end up with data similar to this:

Sample of Google Data Studio report on Content Consumption

Using Audiences in GA4

You can also use Audiences in GA4 to segment out users based on how much they consumed (or didn’t consume). For example, let’s say that we wanted to see how many people consumed a piece of content on their very first visit. Then we would create an audience in GA4 that looks like this:

Content Consumed Audience in GA4

The important thing to remember is that audiences in GA4, unlike Segments in Universal Analytics, do not go back in time. Create your audiences early on to ensure that you are capturing as many visitors as possible.

Then, use these audiences to determine how content consumption affects your other metrics. Are tab hoarders more likely to buy, but only after the tab has sat around for a few days? Maybe everyone who comments on your blog are skimmers and that explains a thing or two about the types of comments you get. Have a really popular page that ranks well, but it turns out everyone who views it is a bouncer? You get the idea.

How Are You Using Content Consumption?

How are you using content consumption to make better decisions? Let us know in the comments below or by getting in touch.

Finally, if you got this far, hopefully you have been on the page long enough to have consumed this content. Thank you!

Comments

Yan Gilberts profile picture Yan Gilbert says:

Interesting info. It’s a hard call to divert time to set something like that up for smaller traffic sites.

Any idea how much traffic it might take to get a good average?

Dana DiTomasos profile picture Dana DiTomaso says:

Hi Yan! It can be time consuming but if your smaller clients are using a similar theme or template, we’d recommend building a default GTM container based on that to speed up deployment. Even small sites have critical pieces of content and this can show you if that content is actually connecting with your audience.

John Mavers profile picture John Maver says:

Great article and easy to follow along with. It will be interesting to see the results!

A few things as I went through it:
1) The variable name of the calculated field should be “Consumed” not “Consumption” in
% Content Consumed — Content Consumed / Pageviews

2) In the KPCC — Page Viewed and Read Tracking tag, it redefines hasOwnProperty which wreaks havoc on my other libraries. Commenting that out still works fine as far as I can determine.
Object.prototype.hasOwnProperty = function(property) {
return typeof this[property] !== ‘undefined’;
};

Dana DiTomasos profile picture Dana DiTomaso says:

Thanks John for the feedback! We’ve fixed the items the outlined and added a troubleshooting note.

Dave Thackerays profile picture Dave Thackeray says:

Hugely exciting work, KP. It’ll take some time for my simple mind to process how to set about doing this in Drupal but I definitely will give it a shot.

Thanks for all the time and effort you put in to this. Truly a labour of love!

Dana DiTomasos profile picture Dana DiTomaso says:

Thanks Dave! Please let us know when you have it working on Drupal so we can point to other CMS examples. Exciting!

Jeffrey Dobkins profile picture Jeffrey Dobkin says:

Thanks, Yan… for this awesome article. I’m not a technical geeky person, well… maybe geeky… and I read the whole article while eating a bowl of tomato soup. I understood pretty much all of it – you presented this in absolute clarity. Thank you very much.

Brian Andersons profile picture Brian Anderson says:

Hey KP, this is awesome! Do you have any concerns with the inflated pageviews when sending the custom metric?

Thank you for sharing and keep up the awesome work!

Dana DiTomasos profile picture Dana DiTomaso says:

Thanks Brian! We were running this as a test for months and comparing against our “real” analytics and didn’t see any inflation. There is a small variance but within about 5% or less. Are you seeing inflated pageviews?

Brian Andersons profile picture Brian Anderson says:

We have been tracking our “real” analytics along with our shiny new content content consumption analytics for 7 days and seeing ~48% increase in pageviews on the content consumption property.

Just to confirm the configuration, we are seeing pageviews when the following occurs:
Initial pageview = 1 pageview
User meets Dwell criteria = 1 pageview
User meets Content Scroll criteria = 1 pageview
User meets both Content Dwell and Content Scroll = 1 pageview

In total we can have what would normally be a single pageview counted four times if the user has met all criteria.

This is still great insight to determining if our content was consumed, we may just have to be aware of the inflation when looking at the metrics. I will let you know if we come up with another solution that can maintain pageview integrity.

Thanks again for the awesome idea and look forward to more!

AJ Dyrbyes profile picture AJ Dyrbye says:

Thanks very much for bringing this to our attention, Brian! I’ve sent you an email with a possible solution. Please let us know if it resolves the pageview issue you’re seeing.

Nicole Willsons profile picture Nicole Willson says:

We are making UX/UI improvements to our site and I’d like to use this tool to see if the UX/UI changes affect content consumption. Is there a way to track get data retroactively or can you only get data for the time period after the JSON script is deployed via Tag Manager?

Thanks,

Nicole

Jen Salamandicks profile picture Jen Salamandick says:

Hi Nicole — no, unfortunately the data won’t be retroactive.

Caitlin Hoovers profile picture Caitlin Hoover says:

Thank you for sharing! We are excited to see what content is being consumed on our site.

We are also experiencing the inflated pageviews issue that Brian mentioned above. We seem to be running into a couple roadblocks with the implementation. Currently, we are pulling the Content Dwell and Content Scroll data into GA without issue. However, when all criteria is met, the Content Consumed tag (Viewed & Read Event) fires in GTM Debug mode – but the data does not appear in GA. We would like to troubleshoot the issue if someone is available to help. Thanks again!

AJ Dyrbyes profile picture AJ Dyrbye says:

Hello Caitlin,

Thanks for bringing this to our attention! When you look at the tag labelled KPCC — Viewed and Read — Event, is the Track Type field set to Page View, or to Event?

If it’s set to Page View, we recommend making the following change:

Track Type: Event
Category: KPCC
Action: Viewed and Read
Label: {{Page Path}}

You will also need to make this same update (though with different labels) to the following tags as well:

KPCC — Content Dwell — Event (Action: Content Dwell)
KPCC — Content Scroll WordPress — Event (if using the WordPress version; Action: Content Scroll)
KPCC — Content Scroll — Event (if not using the WordPress version; Action: Content Scroll)

The most recent version of the GTM container version uses Event, so this change will get you matched up.

If your Tags already look like this, and you’re still not seeing the Events show up in GA, please let us know!

Nathans profile picture Nathan says:

Great thought starter!
As you point out, short pages can be a bit of a killer in skewing data because you can easily/accidentally scroll to the end of the content. In this case you track a scroll but you may not get a consumption.

Wondering if either of these might be worth a thought…
(1) Either don’t fire or fire a value e.g. “Short Page” where either wordcount < X or because words in a narrow column are long and a wide column are short (so wordcount does't always equal length of page) is there a way to (2) Look at the pixel distance to the end of the content as a multiple of the viewport height and if its a value under 2 or 3 (TBC), send the classification of "short page".

I should also note that this is all or nothing on scroll depth. Is there no way to track scroll progress (e.g. 75% of article etc) as "heavily perused" etc. Anyone that reads 75% of your article (not bringing the end into view) and takes 75% of your intended read time fires 0,0. I just wonder how many people fall into that middle.

Dana DiTomasos profile picture Dana DiTomaso says:

Thanks Nathan! Yes, absolutely these are great suggestions to make it easier on short pages that might skew your stats. You could make an exclude Trigger in GTM that wouldn’t run the CC code on those pages.

As for scroll depth, you could make a segment based on a 75% scroll depth, or make a new tag in GTM that only fires at 75% depth achieved.

Martino Mosnas profile picture Martino Mosna says:

I think that these custom metrics are pretty neat and useful for web publishers that relies on ad views/clicks for their revenue.

Just a little heads-up for us Analytics nerds: implement this tracking on this very article!

Right now it appears to have the regular Pageview at the start, a bunch of non-interaction events, and then a lazy timer as an interaction event every 30 seconds.

I know: the shoemaker’s children always go barefoot. Poor children!

Dana DiTomasos profile picture Dana DiTomaso says:

Hey Martino! You caught us, we aren’t running it right now as we are in the process of reviewing the setup — it’s been a couple of years since we made this and we just want to be sure that nothing needs to be changed. Once we’re happy with it, we’ll be updating this article and it’ll be running on our site again.

Lauras profile picture Laura says:

Thanks for this! It is great to see that you are experimenting with metrics, as there is so much space for creativity and alternative solutions in our field! I really love this idea of content consumption and I am the most guilty of them all of tab hoarding ( :

Leave a Comment

Your email address will not be published.