All Collections
Tracking setup guides for traffic sources
Other
Adwords, Parallel Tracking and Split-testing
Adwords, Parallel Tracking and Split-testing
Zeno avatar
Written by Zeno
Updated over a week ago

From November 2018 onward parallel tracking has been a forced feature in Adwords accounts.

What is parallel tracking

It's a new method of sending data to tracking systems that uses what is known as a beacon and it is Google's alternative to make up for no longer allowing cross-domain redirects in your ad's click URL. When a user clicks an ad, this beacon gets sent in parallel while the user is loading your landing page URL.

In many compliance-heavy traffic sources like Adwords, Facebook, Bing etc. there is increasing scrutiny when redirects are involved, since these make it trivial for an advertiser to change the destination of traffic after ad approval.

You can read Google's documentation here and here.

So, what should we do now?

Let me frank -- the parallel tracking feature is quite annoying, and a bit useless if you're using FunnelFlux unless you are direct linking to the offer and don't need any rotation of that offer either.

So why is it a bit useless? Firstly, you can just use our no-redirect Javascript tracking on your destination page, so sending tracking data to the beacon becomes unimportant.

Secondly, it gets complicated -- there are issues with cookie context, you can't guarantee the beacon will finish before the landing page (and JS) loads, and there could be conflicting data in the beacon vs the landing page URL. The tracker then has to add a lot of processing to deal with these situations that could be avoided in the first place.

So, I suggest not using parallel tracking and instead using our no-redirect JS as normal. The downside is that you can't easily split-test if direct-linking to a specific page, but I'll provide some advice there soon.

Note if you are direct linking to an offer, check out the section on that near the bottom of this page as the configuration is different and you do need to use their parallel tracking method.

Configuring your Adwords account and ad units

In your Adwords account I would first:

  • Turn on auto-tagging for passing gclid, even if you don't use it

  • Remove any tracking templates as these fire beacons

Head to All Campaigns, then click settings and the Account Settings tab.

From here, ensure the tracking template is empty and auto-tagging is on:


Now, when you go to make ads, you can use the Final URL Suffix field to pass all your ad URL parameters, and have the base lander URL in the ad URL box, like so:

When doing this, make sure to click TEST and check that it's happy with your config.

Here, what we are doing is:

  • Direct linking to the lander at https://my-lander.com/

  • Appending the FunnelFlux parameters. You can get these from generating a regular tracking link with the send traffic here prompt. Whatever is generated, just take the query string part and put that in the Final URL suffix box -- it should start with flux_fts=xxxx which defines the traffic source and funnel ID.

Note that you can use Adwords dynamic tokens in the final URL suffix and this is the place to put all extra parameters.

Regarding GCLID

You will likely have gclid in the Adwords traffic source config in FunnelFlux -- its there to ensure FunnelFlux logs it if passed.

Because of this, in the links you generate there will be a ...&gclid=0... parameter. It's fine to leave this in your Final URL suffix section, Adwords will just replace it with a valid value in live campaigns. Make sure you keep gclid configured as a traffic source parameter in FunnelFlux, otherwise the system will not log the data.

Split-testing with Adwords

There are a few methods you could use to rotate landing pages or continue to give FunnelFlux control over redirection, I'll outline three methods here:

Using non-cross-domain redirects

If you try to put your tracking link in the Final URL box, or put your tracker domain there combined with the final URL suffix parameters, when you click TEST you should receive an error about the URL mismatching.

This is because the URL you put is tracker-domain.com  and it redirects to a landing page on lander-domain.com ... and Google does not allow this:

But, guess what? A redirect on a subdomain is not considered a cross-domain redirect, since the base domain is the same.

So, the easiest way around this is to host your lander on lander-domain.com  and then use an alias domain of trk.lander-domain.com  for your tracker.

Then, you can generate a normal redirect link such as:

https://trk.lander-domain.com/?flux_fts=xxx&param1=a&param2=b

Then, put this in the Final URL field:

https://trk.lander-domain.com/

and put all additional params in the Final URL suffix box:

flux_fts=xxx&param1=a&param2=b

Click TEST and you should see that the system has no problem with the redirection since the same base domain is used.

Keep in mind that although this works technically, Google's review team might still scrutinise the presence of redirects, especially if your campaign is raising flags for other reasons and drawing their attention.

Using Fluxify

Fluxify is one of the redirect modes available on lander/offer pages.

If you use a tracking link and the destination would normally be a redirect to a landing page URL, if that URL is in Fluxify mode, it will in fact deliver under the tracking URL itself.

In other words, this is what usually happens:

Ad --> tracking URL --(redirect)--> landing page URL

If that landing page in FunnelFlux is in Fluxify mode, this happens:

Ad --> tracking URL (loads as a landing page)

This means there are no redirects, so no issues with using this as your final URL in Adwords directly.

By doing this you can use the full functionality of FunnelFlux including conditions, rotators, etc.

There is one exclusion -- if your landing page URL uses dynamic tokens in it, then a redirect will happen as this is the only way the URL can get updated to include that dynamic data. So if you are passing e.g. ..&model={device-model}... to your landing page, the Fluxify mode is going to still use a redirect.

So, consider the following funnel:

I have three pages in rotation. I want to rotate these pages without redirects or domain changes, so I have set them all to Fluxify and grabbed a tracking link for the traffic node. You can test it out below to see it in action!

If I want to make it a little prettier, I could always use an alias domain, and I could use the stored links function of FunnelFlux to make a slightly shorter version:

You can pass additional params after the stored link name like with any tracking link, so https://tr.funnelflux.com/?flux_sl=search&param1=a&param2=b  will work fine.

Using a full-page iFrame

This method is quite simple and although it will workaround the TEST function in Adwords, it again uses redirects and so any formal reviewer would be able to easily see this and potentially scrutinise it.

How to do it? 

Easy, just create some landing page that you'll link the ad to, use a full page iFrame on it with the src parameter as your FunnelFlux tracking link:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>iFrame Test Page</title>
<style type="text/css">
    body, html
    {
        margin: 0; padding: 0; height: 100%; overflow: hidden;
    }

    #content
    {
        position:absolute; left: 0; right: 0; bottom: 0; top: 0px;
    }
</style>
</head>
<body>
<div id="content">
    <iframe width="100%" height="100%" frameborder="0" src="https://tracker.com/?flux_fts=xxxxx" />
</div>
</body>


When you load this page it will then load your tracking link within the iFrame. This will behave the same way as a normal redirect, the difference being the domain/URL in the address bar is now some other page.

When doing this, you need to also consider data passing.

It would be best to have your simplest tracking URL in the iFrame src, the one that sends users to your intended destination, without additional parameters in it.

For other parameters from your traffic source, pass these to the lander URL using the final URL suffix field in Adwords. Lastly, use our no-redirect JS on your landing pages that the tracking link is redirecting to.

When the iFrame redirects it will track the user and send them to X destination, and when they get there, the JS will detect parameters in the URL and update them.

This is a much easier solution than dynamically changing the iFrame src based on URL parameters, which would require more complex Javascript on your initial lander or using PHP code.

However, note that if you use any conditions in your funnel that redirect based on tracking field parameters, you will need to do something more advanced here to make those parameters be present in the iFrame src URL first, before it tried to load.

Using PHP to rotate landers

This is an advanced way to rotate landing pages and will require your own server hosting the pages + PHP code.

Required steps:

  1. Put all your landers in the same folder on your server, e.g. /landers/some-folder/ 

  2. Its ideal if all the HTML source files are in the same parent directory, e.g. lp1.html, lp2.html and so on. 

  3. If your assets clash, I suggest making folders such as css-lpname , images-lpname  etc. to separate them, then alter your HTML file to use these new folders.

  4. Create an index.php file in your parent directory alongside the HTML files

  5. In each of your landing page HTML files, insert FunnelFlux no-redirect JS that has been obtained for that lander in a specific funnel using the send traffic here prompt. It's important it is done this way so it has a flux_fn parameter in it.

  6. In your index.php file, create a basic rotation code to include() the landing page sources, such as:

<?php

$lander[0] = 'lp1.html';
$lander[1] = 'lp2.html';
$lander[2] = 'lp3.html';

$number = mt_rand(0,2);

include("$lander[$number]");

?>


Advantages:

  • You can rotate pages server-side and this is not detectable - there is no redirect. However, users could refresh the page and see rotation happening, so you'd need to add some cookie/session usage code to create persistence here if desired.

  • Can bypass most "no redirects allowed" situations 


Disadvantages:

  • A bit more work required to make this work

  • You need a landing page server that can execute PHP

  • You will need to make separate folders and duplicates of your landers if you wish to use them in different funnels -- consider this a single-funnel only approach. This is required as the flux_fn or node ID parameter in the included page's JS is what tells FunnelFlux the lander the user hit. It cannot determine this from the URL, and you cannot pass URL parameters into the file includes.

  • FunnelFlux uses referrer to deal with repeat action clicks -- here that is not going to be practical, so you will need to use the JS to inject hit IDs into action links if you are using pages where many clicks to different CTAs is expected.

Using iFrames and dynamically passing parameters into the src

If you're using iFrames and you want to dynamically pass data from the parent URL into the iFrame src, you will need to use JS to generate the iFrame itself -- as you can't modify the existing iFrame, it will load before your JS has the chance to do this.

Dynamically changing the iFrame src will be useful if you need FunnelFlux to redirect based on this data, e.g. specific publisher IDs.

Here's an example code solution that will achieve this:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Your Page Title Here</title>
<style type="text/css">
    body, html
    {
        margin: 0; padding: 0; height: 100%; overflow: hidden;
    }

    #content
    {
        position:absolute; left: 0; right: 0; bottom: 0; top: 0px;
    }
</style>
</head>
<body>
<div id="content">
</div>

<script type="text/javascript">
var url = window.location.href;
var urlParams = url.split("?")[1];  
    function prepareFrame() {
        var ifrm = document.createElement("iframe");
        ifrm.style.width = "100%";
        ifrm.style.height = "100%";
        ifrm.setAttribute("frameborder", "0");
        ifrm.setAttribute("src", "https://tracker-url-here" + "&" + urlParams);
        document.getElementById('content').appendChild(ifrm);
    }
    prepareFrame();
</script>
</body>


Be sure to test this and ensure it works for your situation. 

You can test by inspecting element on the page, then loading your URL with test parameters in it. 

You should see these appearing in the iFrame src attribute and should also see the data being logged in FunnelFlux, provided the parameter names match what is expected for the traffic source.

Direct linking to offers

If you are not using landing pages and are going direct to an offer -- whether it be via an affiliate link from a network or direct with the advertiser, you actually can use their parallel tracking effectively.

However, if you're dealing with affiliate links that selectively redirect based on country, user-agent, etc., its important you set up a funnel that ensures their bot checks get to the right place. Otherwise you'll get URL mismatch errors on the Adwords side.

Here's how your Adwords config will look:


Notice here you are using the direct offer URL as your final URL and your regular FunnelFlux redirect link as your tracking template.

Now, on the FunnelFlux side, let's create a funnel that filters by user-agent and country first, to ensure Google's bots see the intended page -- not some random sweepstakes page an affiliate network decides to serve instead:

Here's the content of my Google Bot condition (make it global so you can reuse it):

Now when I click TEST in Adwords, it calls the tracking URL, which I generated from "send traffic here" on the traffic node.

The Google bot loads this, hits my initial Google Bot condition, and the tracker returns the same URL as the final URL box in Adwords.

Google likes this and delivers me nice green ticks.

If I didn't have this and it went straight through to the offer, chances are that offer link would bounce it around due to it being a known bot, looking like a proxy/VPN/datacentre, being outside the country the offer is for, etc. and a different result would serve --> Google gives you the URL mismatch errors. No bueno!

Note: when you are using the test feature in Adwords their system pings your tracking URL. You can see these hits coming in to FunnelFlux -- so if you do a breakdown of Funnel > User-Agent, you can see what the bot's user-agent. This is how I found it and then I added a condition with a wildcard *  in it to match the simpler "google-adwords" string that was present.

Did this answer your question?