Don't use clearVars! | Community
Skip to main content
yuhuisg
Community Advisor
Community Advisor
June 2, 2021

Don't use clearVars!

  • June 2, 2021
  • 27 replies
  • 13105 views

(Disclaimer: The following recommendation is based on my personal experience. It is not endorsed nor recommended by Adobe or any of its partners.)

Background: sending more than one beacon in the same page

When it comes to accurate analytics tracking, one of the most important things to guard against is that you don't track variables that shouldn't actually be tracked. This happens particularly often when multiple beacons are sent from the same web page.

A simple example is what happens when you want to track a link click on a page. When the page's Pageview beacon (s.t()) is sent, you might have tracked eVar8 with the page's site section. This eVar8 remains set in the Analytics "s" object. So when you track the click on the link with a Custom Link beacon (s.tl()), that eVar8 would be tracked as well – even if that wasn't your intention.

This problem manifests itself even more so if your website is a Single Page Application (SPA). In that case, your website really only has one "physical" page, and then you have multiple "virtual" pages. Each page would be tracked with a Pageview beacon (s.t()). But because the browser never actually loads a new "physical" page in between pages, there is only one single Analytics "s" object that persists as long as the user keeps interacting with the website. And as you can imagine, multiple props, eVars and events could accumulate in that "s" object, resulting in variables being tracked wrongly!

To work around this problem of variable accumulation, Adobe Analytics provides a clearVars function. In simple terms, it wipes out all of the variables that have been set in the "s" object, giving you a nice, clean slate to track from. But clearVars (or the "Clear variables" action in the Adobe Analytics extension in Adobe Experience Platform Launch Data Collection) is both a blessing and a curse. It wipes out everything!

The Problem: everything gets cleared!

Back to the above example of the Pageview and the Custom Link beacons. Let's say you track site language to eVar5, and you want this to be tracked with all beacons, both Pageview and Custom Link ones. If you were to use clearVars after sending every beacon, then you'll always need to set eVar5 again! In other words, you need to do this all of the time:

  1. User opens the web page.
    1. Set s.eVar5 to the site language.
    2. Send the Pageview beacon --> s.eVar5 is tracked with the site language.
    3. Run clearVars --> s.eVar5 is now blank.
  2. User clicks a link.
    1. Set s.eVar5 to the site language.
    2. Send the Custom Link beacon --> s.eVar5 is tracked with the site language.
    3. Run clearVars --> s.eVar5 is now blank.

If you miss step 2.1, then your tracking implementation is wrong and you have to fix that. And all because you had used clearVars() at step 1.3. You might remember that, but will the future you remember that? Or the person who inherits your implementation after you?

And that is precisely why I don't use clearVars – because it's so destructive!

Solution: use s.registerPostTrackCallback to unset only those variables that should be cleared

Fortunately, Analytics' tracking code has a handy function called "registerPostTrackCallback". Any code that is put inside here will run after every beacon call. This is the perfect place to unset any variables that you don't want to persist between beacons – precisely because you can control what variables you want to clear and/or leave intact.

Here's the code that I use:

 

 

s.registerPostTrackCallback(function(requestUrl, s) { // unset variables and events that are not needed after sending a beacon // BUT LEAVE BEHIND variables that should remain, e.g. those that are set in the Adobe Analytics extension itself var doNotUnsetVariables = [ 'pagename', // page name 'server', // site server 'eVar5', // site language // keep adding more dimension variables: hiers, props, eVars ]; var doNotUnsetVariablesRegExp = new RegExp('^(' + doNotUnsetVariables.join('|') + ')$'); // find and erase all unneeded variables var setVariables = Object.keys(s).filter(function (k) { return /^((eVar|hier|list|prop)[0-9]+|(purchase|transaction)ID|campaign|channel|pageType|products|state|zip)$/.test(k); }); var unsetVariables = setVariables.filter(function (k) { return !doNotUnsetVariablesRegExp.test(k); }); unsetVariables.forEach(function (v) { s[v] = ''; }); // erase all success events s.events = ''; }, s);

 

 

The important part is the "doNotUnsetVariables". This is an array of variable names that you want to retain between beacons. In my example code above, I've kept eVar5, so that site language can still be tracked with every beacon. But you don't see eVar8 because I don't want to track the site section every time.

(Take note of that 2nd last line too: my example code clears out all s.events. If you have any events that you want to retain between beacons, then that line will need to be modified for your specific case.)

This code can be placed before or after the s.doPlugins block in your AppMeasurement code. If you're using Adobe Experience Platform Launch Data Collection, then you can add this in the Adobe Analytics extension's custom code.

What happens is, in my view, beautiful and elegant:

After every beacon, whether it's a Pageview or Custom Link or Download Link or Exit Link, that code inside s.registerPostTrackCallback will run.

When that code runs, it clears out only those variables that are not specified in "doNotUnsetVariables". So variables that should remain in the Analytics "s" object remain intact for the next beacon.

This is much, much, much better than clearVars' all-or-nothing massively destructive approach. clearVars is like a megaton nuclear bomb on the "s" object, while my approach picks and chooses those "s" variables that don't need to be retained.

So don't use clearVars! Instead, clear only those variables that you want to clear, and the example above provides you with a quickstart to doing just that.

 

What do you think of my recommendation? Is it good or bad? Have you done something similar to this? Or do you actually prefer clearVars, despite its massively destructive approach? Leave a comment and share your views.

 

Yuhui | yuhui.sg | Analytics, A/B Testing, Development since 2006

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.

27 replies

Gokul_Agiwal
Community Advisor
Community Advisor
September 29, 2021

A really nice insights on clearVars.  I was struggling in one of the implementation with clearVars mainly on SPA application but this approach seems good. 

Thank you @yuhuisg StewSchilling

 

Level 3
October 13, 2021

An interesting approach.  I've always relied on ClearVars at the start of each rule, and then global variables and some bits and bobs in the custom code in the extension, and never had a problem.  But this is an interesting alternative.

FrederikWerner
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
November 18, 2021

Nice post! I'm thinking of how this could be brought into Launch or the Analytics extension in Launch so we don't need to custom-code it. Could we maybe use a Set Variables action with empty values instead? 🤔 🤔

Learn more about Adobe Analytics and Customer Journey Analytics on my blogNeed help with Adobe Analytics or Customer Journey Analytics? Let's talk!
PratheepArunRaj
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
January 20, 2022

Nice article @yuhuisg,

We mostly used managevars for this purpose. Can you help us to understand the difference here? From your viewpoint, which one is effective and accurate?

Thanks much, Pratheep Arun Raj B

Thank You, Pratheep Arun Raj B (Arun) | Xerago | Terryn Winter Analytics
yuhuisg
Community Advisor
yuhuisgCommunity AdvisorAuthor
Community Advisor
January 20, 2022

@pratheeparunraj , manageVars runs inside s.doPlugins, so it manipulates your variables before they are sent to AA.

My recommendation in this article, on the other hand, is focussed on clearing out variables after the hit has been sent and before the next hit.

I suppose you could use manageVars to clear out unneeded variables before the hit is sent, but it has to be done properly so you don't clear out wrong ones incorrectly.

Alexis_Cazes_
Level 10
March 28, 2022

I believe there is a functionality that allows you to do clean tracking without necessary having to use clearVars or custom code in callbacks.

 

There is a feature in Adobe Analytics that is called variable Override: https://experienceleague.adobe.com/docs/analytics/implementation/js/overrides.html?lang=en

 

You can pass an object to the s.t and s.tl code which the configuration you want just in this call. Once the call is sent the s object does not inherit the value from the override object.

 

So if you use:

var analyticsConfig = { pageName: "My test page name", eVar1: "New value 123", prop1: "ABC" } s.t(analyticsConfig)

 

You will see that you analytics call will contain only config from your analyticsConfig object. 

 

Then check in the developer console and type s.pageName and notice you should see undefined, as the values from your override object did not update the s object. This is a much better solution.

 

As Adobe Launch support ES6 you can also configure a base object that will be merged to custom object so you are sure default variables to always be set on the call:

var base = { pageName: "abc", eVar3: "default" } var customConfig = { eVar1: "123", prop1: "abc" } s.t({ ...base, ...customConfig }); //use spread operator

 So obviously we will create dataElements here to get base object and custom object.

 

This is a better solution as you can make sure that your call will only contain the values you need and you do not need to worry to clean up after yourself.

yuhuisg
Community Advisor
yuhuisgCommunity AdvisorAuthor
Community Advisor
March 28, 2022

@alexis_cazes_ thanks, that's a great solution!

Unfortunately, it looks like the AA extension's "Send beacon" action in Adobe Launch Experience Platform Data Collection Tags doesn't support this Override function. In that action's view, there is no field to let you specify the override object. What a pity!

Alexis_Cazes_
Level 10
March 28, 2022

Interesting point let me see if we can update the extension.

April 5, 2022

Interesting posts.

Looking for a definitive answer on is there a way to still get Global variables set if you run clearVars at the end of each rule for a 2nd rule running on the same page. My Assumption was the Global variables would be applied again in the 2nd rule as we've asked for these to be global but this doesn't seem to be the case and the variables are blank. We have mulltiple direct calls on the same page so I assumed we could use global variables to set the common evars but without sending multiple copies of the 1st event. If not why does it work this way and can the Adobe team not change how it works for rules to inherit global config.

yuhuisg
Community Advisor
yuhuisgCommunity AdvisorAuthor
Community Advisor
April 6, 2022

@chrish1471105 The simple answer is that there is no concept of "global variables" in Adobe Analytics' implementation. Adobe Analytics' implementation only knows whatever you track to it when you fire its beacon.

Global variables is something that you understand by yourself as variables that have to be set with every beacon call. So it is up to you to ensure that those variables are set whenever your Rules are triggered.