The “Marketing Channel” is the main entry point for any analysis on digital campaign performance in today’s Web Analytics world. But how good is a channel if you can only see how much money it earned you, but not how much you spent on it?
Both Google and Adobe Analytics do not make it easy here.
While there is no way to get the cost per channel into Google Analytics apart from the context of the Multi-Channel Funnel Reports,, Adobe offers a somewhat hidden trick. And you can go full circle: Cost->Revenue->Refunds = the real ROAS.
“Paid Search – Google Shopping”, “E-Mail Newsletter”, “Social Media Display Ads”, “Display Remarketing”, “Google Search Network (AdWords)”, and so on: Every professional Marketing team these days groups “Campaigns” into “Channels” or “Groupings of Channels”.
For the so-called “Paid Channels”, i.e. usually pay-per-click or pay-per-mille ad network like Bing Ads or AdWords, Facebook Ads or price comparison engines, the main message of a marketing data analysis should always be tied to costs: How much bang did we get for the buck? Here, Return on Ad Spend (ROAS) and Cost per Order (CPO) are way more important than “soft” KPIs like the Conversion Rate.
Cost Import: Sounds Easy, Can Get Terribly Tedious
Even though this sounds obvious, I have seen few if any Analytics implementations with a sound cost import for all or at least the most important paid channels. Last year I had to do such an implementation myself for siroop.ch, the largest Swiss online marketplace, and I was terrified how complex this can get.
With funnel.io, we were at least able to get some regular and automatic campaign cost upload into Google Analytics for most platforms (AdWords luckily comes out of the box with GA). But the fact that it is “automatic” does not mean it does not cause headaches just about every other week (“no cost data again?!”), sometimes self-inflicted through new campaigns that are not part of the funnel mapping repertoire, sometimes due to shortcomings in funnel.io (especially their DoubleClick Campaign Manager integration keeps hickupping which causes extra troubleshooting work).
Google Analytics Gives you Cost per Campaign – but Not per Channel
However, even with funnel.io, we are still only getting Cost per Source, Medium, and Campaign into Google Analytics. If you try to create a report with channels and cost metrics, you see zeros all over the place – even though some channels are simply groupings of campaigns.
Error-Prone In-Between Mapping Logic
To be fair, Cost data is available per channel in Google’s Attribution Reports in Multi-Channel Funnels – those are wonderful, but limited in terms of Dimensions and Metrics and much harder to access via the API (separate API needed). Apart from there, you cannot report on ROAS or CPO per channel inside the interface. If you want to do that somewhere outside (e.g. in a spreadsheet or a dashboard), you first need a place in-between (e.g. a spreadsheet or a database) to where you export your daily cost, click and impression data for your Source, Medium and Campaign combinations, and then you need to map those combinations to the channels. Only then can you take the aggregated channel cost data and send it where you want to view or report on it (e.g. in your internal Klipfolio dashboard).
Needless to say, this is an error-prone and tedious solution and it caused quite some headaches. If you have a lot of different combinations (like we do with hundreds of AdWords and Bing campaigns) and try doing that via the Google Spreadsheets plugin for Google Analytics, you quickly get to the maximum row limit of Google Spreadsheets. Moreover, you have to recreate the mapping logic per Channel from Google Analytics in that place and update it there everytime you change it in Google Analytics.
Adobe Analytics, on the other hand, has deficiencies where Google shines: There is no direct automatic import for AdWords cost data (unless you spend some more dough on an integration like this that also needs Adobe Media Optimizer), nor does funnel.io support an automatic cost upload to Adobe Analytics (that would be a very useful feature ;)). On the positive side, you can get Cost per Channel inside the Adobe interface or query that data from outside and thus avoid the painful in-between-mapping logic.
First Step in Adobe: Import the Cost per Tracking Code
So first you need to get the cost data into Adobe Analytics. We do it this way: As already pointed out, we rely on funnel.io and AdWords imports (and one little occasional manual import) of Cost data into Google Analytics. A little server application built by our agency Feld M then exports that cost data twice a day from Google Analytics and imports it into Adobe Analytics as a “Summary Data Source“. The common denominator is the Adobe “Tracking Code” (Adobe’s equivalent of “utm parameters”, I prefer calling it “Campaign ID”). The “Tracking Code”, in our case, is simply a concatenation of Google Analytics’ dimensions: “Source:Medium:Campaign“.
Note that since the cost data can change for the past (!) (the case with some campaign types in DCM, and in general because not all cost imports into GA run at the same time), we need to compare what is exported from GA to what is already in Adobe. We do this with a little database in-between that saves the last exported status and import the delta. The delta is enough here because in Adobe, you can partially or fully delete already imported data by importing negative data (e.g. importing “-10” will decrease the already imported amount by 10).
This was definitely the hard part, but we got it done in under a month from end to end.
Adobe’s Documentation Won’t Help You
Then, you have the same in Adobe as you have in GA: Cost per Campaign, but not per Channel. So what’s the benefit apart from being able to analyze cost-related data in the Adobe interface and API? Adobe’s Marketing Channel documentation shows a tedious and impractical, manual way to get Cost data for Marketing Channels which we honestly did not even want to try.
At first we thought there is no other way and we simply have to live without Cost per Channel in Adobe. But when we added cost metrics to Marketing Channel reports, we saw that some Channels showed the same Cost as the cost we got from mapping and aggregating the Google Analytics Cost data to channels. But some channels didn’t. So why only some of them?
The Key: Channel Definitions Have to Rely On Tracking Code Patterns
The reason why some channels were showing the correct cost data was that these channels’ definitions (as set in the Channel Processing Rules) relied on patterns of the “Tracking Code” (Source:Medium:Campaign, e.g. “contains” “facebook.com:cpc”). Those channels that were not showing the correct cost data used other criteria in their definitions – e.g. an AdWords ValueTrack URL parameter to recognize a Google Shopping campaign. So the key was to make sure all the paid channels were based on elements of the “Tracking Code” – because the Cost data was imported on a per-tracking-code-per-day basis.
Sounds logical, because this way Adobe knows what cost to map where, but it would be nice if that was also documented somewhere and we wouldn’t have had to come across it by accident after a year…
So after that hypothesis proved correct, it required only a few changes to our Marketing Channel processing rules, and suddenly, there were the long-desired crazy Costs, ROAS, CPO, etc. per Channel!
Of course, if you import cost data based on other or more dimensions than the “Tracking Code” (why can’t we finally call it Campaign ID?), Marketing Channel Processing Rules can also use those dimensions as criteria and still show Cost data. An example could be “Ad Content” (an equivalent to utm_content in Google Analytics).
No More In-Between ETL
We can now dump all the in-between mapping and grouping to generate Channel Cost data from the Google Analytics data. We can simply pull it directly from Adobe per Channel. But Google Analytics is still very useful because it rather easily gathers the Cost data in the first place.
Grouped Channels as Dimensions – no Problem with Hit-based Segments
And thanks to Hit-based segments, we can create any kind of additional channel grouping in the form of such a Segment, and then compare as many segments as we want in one table.
An example is that we have a channel each for Prospecting Ads from Social Media, DBM and DCM Prospecting, but sometimes we just want to see all these Prospecting Channels as one (or the DBM and DCM Display Ads together or all Paid Search Campaigns or all Paid Search Campaigns besides Google Shopping or all Remarketing Campaigns etc…). So we simply group them into segments which then work just like dimensions:
You can do something similar with Classifications of Marketing Channels of course.
Lowering the Bottom Line: Ad Cost and Revenue AND Refunds
To finish this off, let’s go full circle: The dream of a marketer is to view the spend and the bottom line together in one report. Even though marketing-tool-vendor-sales-driven propaganda out there makes you think that this is the norm these days, we could not be farther from it. The ROAS you get in your advertising tool stops short.
Example: When someone buys a smartphone for 400 USD after she clicks on your ad (the click cost you 4 USD), that will amount to a marvellous ROAS (your bottom line) of 100 (for every USD you spent, you got 100 in return – unparalleled!). But what if that person then returns that smartphone? The ROAS will crash from 100 to 0 in 0 seconds!
So for this case (returns) which is very common especially in the fashion industry, we can take advantage of the fact that Adobe allows you to combine anything that happened before the purchase with anything that happened after it, e.g. a refund (or a customer complaint), via its “Transaction ID Recording” and its corresponding Data Sources. This way we can get the “full return on investment view” from the marketing spend to what actually remained in the very end, that is, after the customer has decided to return a purchase or not: The ROAS after Refunds!
Where Google and Adobe Could Improve
While it is obvious that Google Analytics needs to improve in the sense that it should make it possible to view Cost data per Channel in the first place, Adobe is also far from perfect: So please, Adobe, do some of these things better:
- Data Sources need to process faster (usually takes some hours, other data is always there after 15-30 minutes, so why do data sources need so long when the imported data is simple summary data?)
- Make it easier to connect to outside marketing / advertising tools / funnel.io in general so those imports go by themselves and clients don’t have to program them
- Document this!