When we want to understand campaign effectiveness and the impact of changing individual variables in our marketing campaigns, we often use an A/B test.
If we want to understand the impact of creative changes, for example, we’d devise an A/B test in which half of the audience sees the original creatives, and the other half sees the new creatives. We then run the ads to each audience segment over a period of time, look at the difference in performance, and assess whether one set of creative performed better than the other.
A/B tests are very straightforward to set up and run. But, not everything can be measured via an A/B test, and with user-level data only becoming harder to access, it’s good to have some alternatives. Today we’ll discuss the limitations of A/B tests, and how difference in differences (DID) testing can help.
Multi-channel promotions
To A/B test the effect of a promotion fairly, you have to ensure that just half of your audience can see the promotion. This is far easier said than done.
It’s simple to ensure that only half of a specific channel sees your promotion — emailing only half of your audience about it, for example. But there’s no way of isolating half your audience across different channels. You lose your control group, which is problematic, because you cannot tell whether users see the ad or not, across multiple channels.
Above the line (ATL) campaigns
ATL refers to the running of mass media, broad-targeted campaigns. It typically involves channels like television, radio, or print, but can also include digital channels like YouTube as well as digital audio, when targeted to a broad audience.
The ideal way to measure the effectiveness of these channels is through a specific type of A/B test called a lift test. A lift test works by only running campaigns to half of your target demographic, and measuring the difference in conversions between the two groups after a period of time — that is, measuring the “lift” the ad was responsible for.
This methodology doesn’t work in the context of ATL campaigns, though. That’s because with channels like television it’s not possible to unbiasedly split your target audience into groups of people who do and don’t see your ads — a necessary step to running a fair lift test. So, this means you can’t use a standard A/B test setup to measure the effectiveness of most ATL campaigns.
In both of our examples above, we’re trying to measure the effect of something. And while A/B testing is an inadequate solution, we have some other options.
Difference in difference (DID) testing is a method that measures the effect of change by looking at relevant metrics before and after the change, and then comparing how they differ to a reliable benchmark. The use of a benchmark is critical to DID testing; it’s what allows us to isolate the impact of the intervention from any changes that would’ve happened without the intervention.
Let’s say we want to measure the effectiveness of a particular ATL channel on our brand’s conversions.
Now, you might wonder, why can’t we just run the ATL channel for a specific time period and simply look at the difference in conversions before and after? It’s a reasonable idea in theory, but if conversions are affected by seasonality, or any other time-dependent factor, then we won’t get reliable results.
Instead, we can run the ATL channel in a few select states (which we’ll call our “ATL states”), and use the remaining states as potential benchmarks (our “benchmark states”). We run the ATL campaign in our ATL states, and then we compare our conversion numbers before and after the campaign to an appropriately chosen benchmark.
At a basic level, the impact of our ATL channel tells us the difference between:
Since our benchmark states help predict what would have happened in our ATL states under ordinary circumstances, the difference between the prediction and actual results is attributable to the ATL campaigns.
When choosing a benchmark for DID testing, it’s important that the behavior of benchmark states correlates highly with the states where we’re making a change (that is, running ATL). This is critical for ensuring accurate predictions.
There are a few options for choosing a benchmark. You could manually work out correlation coefficients between your ATL states and all your potential benchmarks, and then choose the states where your brand’s conversions are most highly correlated. Alternatively, you could use a code package like Google’s CausalImpact to help automate the process.
Code packages like CausalImpact have the additional advantage of grouping different benchmark geographies together, which produces more reliable benchmarks than you’d get from single geography.
The benefits of DID testing go beyond just measuring ATL channels. DID can help you measure the impact of any change when you don’t have access to user-level data, or when you can’t neatly split users into the control and experiment groups needed to carry out an A/B test. With advertisers’ access to user-level data slowly diminishing, the value of DID testing will only grow.
While calculating results from a DID test can be a little technical, simply knowing these kinds of tests are an alternative option to A/B testing can be extremely valuable for modern advertisers.
If you want to learn more about how to run effective marketing campaigns, let’s talk.
Get industry insights and news directly to your inbox.
Thank you. Check your email for details on your request.
Cookie | Duration | Description |
---|---|---|
__hssrc | session | This cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session. |
checkForPermission | 10 minutes | This cookie is set by Beeswax to determine whether the user has accepted the cookie consent box. |
cookielawinfo-checkbox-advertisement | 1 year | Set by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Advertisement" category . |
cookielawinfo-checkbox-analytics | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics". |
cookielawinfo-checkbox-functional | 11 months | The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional". |
cookielawinfo-checkbox-necessary | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary". |
cookielawinfo-checkbox-others | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other. |
cookielawinfo-checkbox-performance | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance". |
CookieLawInfoConsent | 1 year | Records the default button state of the corresponding category & the status of CCPA. It works only in coordination with the primary cookie. |
elementor | never | This cookie is used by the website's WordPress theme. It allows the website owner to implement or change the website's content in real-time. |
JSESSIONID | session | The JSESSIONID cookie is used by New Relic to store a session identifier so that New Relic can monitor session counts for an application. |
viewed_cookie_policy | 11 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data. |
Cookie | Duration | Description |
---|---|---|
__cf_bm | 30 minutes | This cookie, set by Cloudflare, is used to support Cloudflare Bot Management. |
__hssc | 30 minutes | HubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie. |
bcookie | 2 years | LinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser ID. |
bscookie | 2 years | LinkedIn sets this cookie to store performed actions on the website. |
lang | session | LinkedIn sets this cookie to remember a user's language setting. |
lidc | 1 day | LinkedIn sets the lidc cookie to facilitate data center selection. |
UserMatchHistory | 1 month | LinkedIn sets this cookie for LinkedIn Ads ID syncing. |
Cookie | Duration | Description |
---|---|---|
_uetsid | 1 day | Bing Ads sets this cookie to engage with a user that has previously visited the website. |
_uetvid | 1 year 24 days | Bing Ads sets this cookie to engage with a user that has previously visited the website. |
Cookie | Duration | Description |
---|---|---|
__hstc | 1 year 24 days | This is the main cookie set by Hubspot, for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session). |
__lotl | 5 months 27 days | This cookie is set by Lucky Orange to identify the traffic source URL of the visitor's orginal referrer, if any. |
_ga | 2 years | The _ga cookie, installed by Google Analytics, calculates visitor, session and campaign data and also keeps track of site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognize unique visitors. |
_gcl_au | 3 months | Provided by Google Tag Manager to experiment advertisement efficiency of websites using their services. |
_gd_session | 4 hours | This cookie is used for collecting information on users visit to the website. It collects data such as total number of visits, average time spent on the website and the pages loaded. |
_gd_svisitor | 2 years | This cookie is set by the Google Analytics. This cookie is used for tracking the signup commissions via affiliate program. |
_gd_visitor | 2 years | This cookie is used for collecting information on the users visit such as number of visits, average time spent on the website and the pages loaded for displaying targeted ads. |
_gid | 1 day | Installed by Google Analytics, _gid cookie stores information on how visitors use a website, while also creating an analytics report of the website's performance. Some of the data that are collected include the number of visitors, their source, and the pages they visit anonymously. |
_hjAbsoluteSessionInProgress | 30 minutes | Hotjar sets this cookie to detect the first pageview session of a user. This is a True/False flag set by the cookie. |
_hjFirstSeen | 30 minutes | Hotjar sets this cookie to identify a new user’s first session. It stores a true/false value, indicating whether it was the first time Hotjar saw this user. |
_hjIncludedInPageviewSample | 2 minutes | Hotjar sets this cookie to know whether a user is included in the data sampling defined by the site's pageview limit. |
_lo_uid | 2 years | This cookie is set by Lucky Orange as a unique identifier for the visitor. |
_lo_v | 1 year | This cookie is set by Lucky Orange to show the total number of visitor's visits. |
_lorid | 10 minutes | This cookie is set by Lucky Orange to identify the ID of the visitors current recording. |
hubspotutk | 1 year 24 days | HubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts. |
IR_gbd | session | Impact Radius sets this cookie to store a unique ID which is used to identify the user's device, when they return to the websites that used the same network. |
Cookie | Duration | Description |
---|---|---|
__qca | 1 year 26 days | The __qca cookie is associated with Quantcast. This anonymous data helps us to better understand users' needs and customize the website accordingly. |
_fbp | 3 months | This cookie is set by Facebook to display advertisements when either on Facebook or on a digital platform powered by Facebook advertising, after visiting the website. |
_mkto_trk | 2 years | This cookie, provided by Marketo, has information (such as a unique user ID) that is used to track the user's site usage. The cookies set by Marketo are readable only by Marketo. |
B | 1 year | This Cookie is used by Yahoo to anonymously store data related to user's visits, such as the number of visits, average time spent on the website and what pages have been loaded. This data helps to customize website content to enhance user experience. |
bito | 1 year 1 month | This cookie is set by Beeswax for advertisement purposes. |
bitoIsSecure | 1 year 1 month | Beeswax sets this cookie for targeting and advertising. The cookie is used to serve the user with relevant advertisements based on real time bidding. |
fr | 3 months | Facebook sets this cookie to show relevant advertisements to users by tracking user behaviour across the web, on sites that have Facebook pixel or Facebook social plugin. |
mc | 1 year 1 month | Quantserve sets the mc cookie to anonymously track user behaviour on the website. |
MUID | 1 year 24 days | Bing sets this cookie to recognize unique web browsers visiting Microsoft sites. This cookie is used for advertising, site analytics, and other operations. |
test_cookie | 15 minutes | The test_cookie is set by doubleclick.net and is used to determine if the user's browser supports cookies. |
tuuid | 2 years | The tuuid cookie, set by BidSwitch, stores an unique ID to determine what adverts the users have seen if they have visited any of the advertiser's websites. The information is used to decide when and how often users will see a certain banner. |
tuuid_lu | 2 years | This cookie, set by BidSwitch, stores a unique ID to determine what adverts the users have seen while visiting an advertiser's website. This information is then used to understand when and how often users will see a certain banner. |
Cookie | Duration | Description |
---|---|---|
__pdst | 1 year | No description available. |
_an_uid | 7 days | No description available. |
_dc_gtm_UA-61749619-1 | 1 minute | No description |
_dlt | 1 day | No description |
_hjSession_1771567 | 30 minutes | No description |
_hjSessionUser_1771567 | 1 year | No description |
_nx-nocache | session | No description available. |
6suuid | 2 years | No description available. |
A3 | 1 year | No description |
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ | session | No description |
AnalyticsSyncHistory | 1 month | No description |
BIGipServerab44web-nginx-app_https | session | No description |
bounceClientVisit3783c | 30 minutes | No description |
bounceClientVisit3783v | 30 minutes | No description |
dgzsdl08v4 | 10 minutes | No description |
IR_11658 | session | No description |
li_gc | 2 years | No description |
tableau_locale | session | No description available. |
tableau_public_negotiated_locale | session | No description available. |
test | 1 year | No description available. |