The Ultimate Guide To Ad Network Revenue Attribution

The Ultimate Guide To Ad Network Revenue Attribution

What is UTM Tracking?

Revenue attribution (Urchin tracking module (UTM) tracking) is a method of attributing revenue to traffic sources. This is also known as UTM tracking because revenue attribution uses Google Analytics UTM links to segment the traffic sources. GET variables are appended to the URL by the publisher and the publisher’s traffic sources.  UTM tracking is set up by the publisher by manually creating UTM links here. For a more step-by-step process how to setup UTM links and to best utilize check out this helpful article.  Google Analytics will then display traffic acquisition stats by UTM.

Once the publisher has set up UTM tracking, MonetizeMore can enable revenue reporting by UTM.  By default, we support revenue reporting for the following variables:

  • utm_source
  • utm_campaign
  • utm_medium
  • utm_term
  • utm_content
  • utm_source + utm_campaign
  • utm_source + utm_campaign + utm_medium

The max length of each value when combined cannot exceed 40 characters.  This is a limitation by DFP.

MonetizeMore’s UTM revenue reporting allows you to get a breakdown of impressions, revenue, and eCPM by UTM parameter in DFP.  We historically get coverage of 96-99.998% of impressions and revenue on mid-large publishers, including those who are frequently adding new campaigns.

How to enable UTM revenue tracking

The publisher must include either PubGuru Header Bidding or PubGuru.js on their page.  MonetizeMore ad operations enable UTM tracking for the publisher in DB Admin > DFP Networks.  Then MonetizeMore ad operations must republish the config.

How to run revenue reports by UTM

Go into the DFP Reports tab.  Generate a new report with the following parameters:

Filters: key-values contains utm_

Dimensions: key-values

Metrics: total impressions, total CPM and CPC revenue, total average eCPM

You can also breakdown mobile devices vs desktop vs tablet by adding “Devices” as a dimension.

You can pick any date range — note though that you cannot get UTM revenue reports for any date before UTM revenue reporting was enabled.

How to run coverage reports by UTM

Once you’ve run a revenue report by UTM, pull the total DFP revenue and impressions for that same time period.  Sum all revenue for that UTM key (for example “utm_source”), and then divide that by the total DFP revenue for the same time period.

How do I get revenue by the article?

Our technology allows the publisher to track impressions and revenue by request URI.  The URI is similar to the URL, but it’s everything after the domain name.  We use the URI because DFP KVPs have a hard cap of 40 characters per value.  So, in “” the URI is “/page-1234/” and MonetizeMore reporting will track it on that URI.

To enable reporting by URI, our adops enables trackURI in DB Admin > DFP Networks.  Then our adops must republish the config.  The KVP will be in DFP as “request_uri”.

Note again that DFP KVPs have a hard cap of 40 characters per value.  If you have long URIs, you should switch to article IDs instead, using our external API.  Here’s an example:

window.m2hb.kvps = window.m2hb.kvps || {}
window.m2hb.kvps.articleId = YOURARTICLEID || ‘/empty/’;

Note that YOURARTICLEID must be valid javascript.  If it’s a javascript variable, don’t use quotes.  If it’s a string that you set server side, use quotes.

Always pass an alternative ‘/empty/’ as an or statement, or you won’t be able to generate proper coverage reports.

Frequently Asked Questions

How do I calculate revenue per session?

DFP tracks ad impressions and ad revenue, not sessions.  After you’ve generated a report in DFP, export it to Google Drive.  Then go into your GA account and export your pageview and session data by UTM.  Join these two sheets together by UTM.  Now you can calculate revenue per session from each traffic source.

Can I track revenue by UTM in Google Analytics instead of DFP?

GA (Google Analytics) does not support this feature.  Further, GA does not support an add-on method to pass revenue up into GA.  The most GA supports is revenue for AdSense + Ad Exchange.  Header bidding, native, and any third party revenue sources cannot be tracked in GA.

Revenue is tracked in DFP, and you can export it from DFP reports to a spreadsheet for further manipulation.

My UTM is missing!  What’s going on here?

UTMs are tracked as KVPs (Key-Value Pairs) in DFP.  Before reporting that a UTM KVP is missing, please check your coverage for the date in question.  Coverage is defined as all impressions with that UTM key (e.g. “utm_source”) divided by all impressions using PubGuru Header Bidding or PubGuru.js in DFP for the specified date range.  We typically have 96-99.99% coverage of all UTMs on all of our publishers once they’re set up.

For revenue tracking on a KVP, the KVP must be both attached to the impression and predefined in DFP.  We always attach the UTMs (if found), to the impression.  If the UTM is not set on a publisher that wants UTM tracking, we pass up “/empty/” as the value for that UTM — this way we can differentiate between an empty UTM and an uncovered impression.  An uncovered impression is when the impression fires but the UTM KVP is not yet predefined in DFP.  In order to make it so our publishers don’t have to repeatedly and manually add campaigns in DFP, we sample a small percentage of impressions and force their KVPs to get predefined in DFP.  This means tiny, statistically negligible campaigns have a chance at not showing up.  We cannot raise this sampling as it will burn out your DFP API quota very quickly, while also slowing your user experience for your site visitors.

Before reporting that a UTM KVP is missing:

  1. Make sure you have received non-negligible traffic to the campaign.  In talking with multiple publishers, we’ve found most use 250k-500k sessions across a week to gauge the value of a traffic source.  Traffic sources who cannot commit this volume to a test typically cannot scale up traffic, and/or they won’t make sufficient revenue to justify going through contracting and accounting.
  2. Check your UTM KVP coverage.  If you’re at 96-99.98%, the campaign is likely still with negligible traffic.  If your coverage is lower or the campaign is above 250k impressions since UTM revenue tracking has been enabled, notify MonetizeMore developer team with the UTM report showing the low coverage.  Include the publisher’s domain name and DFP network code.

I want 100% coverage!  How do I get this?

Please understand that 100% coverage is not valuable or useful, and substantially more resource intensive than 96-99.98%.  As MonetizeMore’s tech automatically attributes UTMs for 96-99.98% of impressions and revenue, the only campaigns which are missing are new campaigns that have tiny traffic.  There are multiple reasons why publishers are fine with 96-99.98% coverage instead of 100%:

  • Tiny traffic campaigns do not have reliable and statistically significant revenue numbers.  If the traffic source sends you a small amount of sessions today, the eCPM tomorrow is likely to be very different.  If the traffic source sends you a small amount of sessions today, and orders of magnitude more tomorrow, the eCPM tomorrow is very likely to be very different.
  • Traffic sources which are unable to commit non-trivial volumes of traffic are not likely to be able to scale up to sizable traffic amounts.  Moreover, small traffic sources do not scale, meaning if they’re sending you only a small amount of traffic daily, they’re not going to get enough revenue to justify setting up a contract and managing their accounts payable relationship.
  • Getting that last tiny amount is vastly more resource intensive.  If you will accept 96-99.98% coverage, you don’t need to do anything.  If you want 100% coverage, you must manually add every UTM value as a KVP into DFP before trafficking on that UTM.  In DFP, go to Inventory > Key-values, find the appropriate UTM in the list of key values, and then click ADD VALUES.  It is a publisher’s responsibility to manage their traffic source campaigns, and if the publisher is going this route, it is the publisher’s responsibility to add these UTM KVPs before letting their traffic sources promote the publisher’s pages.

Can I use freeform KVPs instead of predefined KVPs?

Sure, but this doesn’t change anything for KVP reporting.  The KVP must be added in DFP before the impression fires, or the impression will never be counted for reporting.  Even if you add the KVP later, all old impressions that were fired before the KVP was added will not be counted.  This is a limitation of DFP.

Why is the PubGuru Header Bidding revenue higher than the DFP revenue or KVP revenue for some time period?

Some publishers are using native ads which cannot be trafficked in DFP — they’re trafficked on page instead.  These will be included on your PubGuru Header Bidding revenue report, but are not trafficked in DFP.  Because they’re not in DFP, they cannot have UTM attribution attached.  Some of these native ads providers are working on enabling DFP support for their ads.

Why are most of my impressions are being attributed to a UTM value of “/empty/”?

When a publisher has UTM revenue tracking enabled with M2, we attach all UTMs on all impressions. If a UTM is not set for a publisher who is tracking UTM revenue, we attach the “/empty/” value to that impression so that we can differentiate between no UTM being set, and an impression getting passed up into DFP without a UTM that’s already defined in DFP.

If you’re getting excessive impressions to a UTM with “/empty/” values, make sure you’re setting your UTMs properly. Follow the guide posted above on how to set up UTMs, and check your UTM session coverage in GA, meaning divide your total sessions with that UTM parameter (make sure it’s the parameter, not value) divided by your total sessions. If the UTM session coverage is low, it means the publisher’s dev team either misconfigured the passage of UTMs throughout the session, or the publisher is getting a lot of direct traffic not associated with UTMs.

What’s the max number of UTMs I can have?

This Google support page shows the current cap at 100k values per key.

When a UTM is at 80k+ values in a key, we check which keys have been inactive recently, and deactivate them.

You’ve mentioned sampling a few times now. What do you mean by sampling?

There are 2 places where UTM KVPs must be added for tracking to work.  One is for targeting and the other is for reporting:

  1. Once you have UTM tracking turned on, we tag 100% of your impressions with the UTM KVPs.  This means the UTMs will be passed up into DFP and are usable for targeting.  Most pubs don’t want UTMs for targeting though, most want UTMs for reporting.
  2. In order for DFP to properly allow reporting on UTMs, the UTM KVP must also be predefined before an impression is fired on that UTM.  Any impressions fired before the KVP is predefined will not be counted.  We sample page views and force predefining of KVPs in a manner that doesn’t destroy your DFP API quota.

What about the DFP quota?

The quota is one of the reasons why we can’t force UTMs to be predefined on every pageview.  If the DFP API quota is exceeded by your tech or ours, the API will throw an error: click here to see documentation on the error.

The DFP quota is limited to 2 requests per second for DFP SB publishers and 8 per second for DFP Premium publishers that you can see here.

How do I Debug <90% KVP coverage?

  1. In tools.m2, find the publisher in the DFP network section and make sure “Track UTMs” is enabled. Make sure the config is republished.  If this is not enabled, and the config is not republished after changing this value, UTMs will not track. You must have the config published for the whole period you’re tracking coverage. DFP will not go back and retroactively report on impressions that were for impressions tagged by KVPs that weren’t yet added.
  2. Make sure the PubGuru Header Bidding (m2hb) version is at 0.20.1-shield or 0.20.2 or higher. Lower versions of PubGuru Header Bidding (m2hb) do not pass UTM KVPs.
  3. Run configtest on the publisher’s page with the param m2debug=true and fix all errors except for the ones that say “ERROR: bidder[$bidderName] NOT configured for any ad units.” Configtest tells you whether the PubGuru Header Bidding version (m2hb) is recent enough for tracking UTMs.
  4. On page, open up the javascript console. Type this: m2hb.postDfpKvps(); and then go into the Network tab. You should see a request to The response should say “ok” so let MonetizeMore #dev know if you get any other response.
  5. Run a coverage report for the date in question in DFP for all utm_ KVPs manually (see “How to Run Coverage Reports by UTM” above). Create a pivot table to verify that coverage is correct.
  6. Make sure that PubGuru Header Bidding is running on all traffic. In calculating coverage, the denominator must be the impressions that PubGuru Header Bidding is running on. For most pubs, PubGuru Header Bidding is running on 100% of traffic so the denominator is all DFP traffic for those days. However, some pubs are in testing phases, or they turn off PubGuru Header Bidding for controversial content. This must be accounted for in the denominator.
  7. Verify that MonetizeMore has DFP access and DFP API access enabled.

Let our dedicated ad optimization team skilled in all aspects of DFP optimize your inventory by signing up to the MonetizeMore premium publisher plan today!

Get my ad optimization tips and tactics delivered to your mailbox.

Kean Graham

CEO and Founder at MonetizeMore

Kean is the resident expert in Ad Optimization covering areas like Adsense Optimization, DFP Management, and third-party ad network partnerships. Kean believes in the supremacy of direct publisher deals and holistic optimization as keys to effective and consistent ad revenue increases.

Submit a Comment

Your email address will not be published. Required fields are marked *