So integrieren Sie A/B-Testing mit Voluum, Redtrack und ClickFlare
Einführung Im digitalen Marketing ist A/B-Testing entscheidend für erfolgreiche Kampagnen. LanderLab bietet jetzt ein starkes Tool, um serverseitiges A/B-Testing einzurichten und mit derselben URL verschiedene Varianten im Wechsel auszuspielen.
Einführung
Im digitalen Marketing ist A/B-Testing entscheidend für erfolgreiche Kampagnen. LanderLab bietet jetzt ein starkes Tool, um serverseitiges A/B-Testing einzurichten und mit derselben URL verschiedene Varianten im Wechsel auszuspielen. Mit diesem Update können Nutzer ihre Landingpage per A/B-Test prüfen und die Ergebnisse in ihrem bevorzugten Tracker gegenprüfen.
Warum A/B-Testing mit LanderLab nutzen?
Die meisten Marketer nutzen ihre eigene Tracking-Software wie ClickFlare, Voluum oder Redtrack, um Landingpages per Split-Test zu prüfen, und in den meisten Fällen reicht das völlig aus. Es gibt jedoch Fälle, in denen Split-Testing mit einem Tracker nicht möglich ist. Premium-Traffic-Quellen erlauben keine Weiterleitungen: Die finale Ziel-URL muss mit der URL der Landingpage übereinstimmen.
Hier kommt LanderLab mit seinem serverseitigen A/B-Testing gerade recht, denn es spart eine Weiterleitung im Ablauf ein. Wie A/B-Testing in LanderLab funktioniert, können Sie in diesem Artikel im Detail nachlesen. Das Beste daran: LanderLab lässt sich mit den meisten modernen Trackern integrieren.

Das Konzept ist einfach: Man kombiniert das A/B-Testing von LanderLab mit der Direct-Tracking-Methode, die jeder Tracker bietet. Um die Grundlagen abzudecken, zeigt dieser Artikel, wie Sie dieses Setup mit ClickFlare, Voluum und Redtrack umsetzen.
A/B-Testing mit ClickFlare einrichten
Die Direct-Tracking-Methode von ClickFlare ergibt die perfekte Kombination für dieses Setup. Immerhin werden beide Plattformen vom selben Unternehmen entwickelt, daher ist eine bessere Integration beider Tools naheliegend. In diesem Artikel erfahren Sie mehr über das Direct Tracking von ClickFlare.
Für dieses Setup sind 2 grundlegende Schritte nötig, und dieselben Schritte lassen sich auf Voluum und Redtrack übertragen. Im ersten Schritt geht es darum, in ClickFlare einen neuen Tracking-Parameter zu definieren, mit dem die variantID erfasst wird.

Um die variantID in unserem Tracker zu erfassen, müssen wir am Direct-Tracking-Script einige Änderungen vornehmen. Das folgende Script enthält 2 Variablen, die ersetzt werden müssen: „REPLACE_ME_CAMPAIGN_ID“ und „REPLACE_ME_CUSTOM_DOMAIN“. Sobald das erledigt ist, muss der gesamte Code in LanderLab unter Settings > Custom Code > Header Section eingefügt werden.
<script> ! function() {
"use strict";
var t = "lp_ref",
n = "cpid",
e = "lpurl",
r = "REPLACE_ME_CUSTOM_DOMAIN",
c = "(?<domain>http(?:s?)://[^/]*)".concat("/cf/click"),
a = "(?:(?:/(?<cta>[1-9][0-9]*)/?)|(?:/))?",
i = "^".concat(c).concat(a).concat("(?:$|(\\?.*))"),
o = 'javascript:window.clickflare.l="(?<original_link>'.concat(c).concat(a, '("|(\\?[^"]*"))).*'),
s = function() {
return new RegExp(i, "")
},
u = function() {
return new RegExp(o, "")
};
function l(t) {
var n = function(t) {
return t.replace(s(), (function(t) {
for (var n = [], e = 1; e < arguments.length; e++) n[e - 1] = arguments[e];
var c = n[n.length - 1].domain;
return t.replace(c, r)
}))
}(t);
return 'javascript:window.clickflare.l="'.concat(n, '"; void 0;')
}
function f(t, n) {
if (n && t && n.apply(document, [t]), /loaded|interactive|complete/.test(document.readyState))
for (var e = 0, r = document.links.length; e < r; e++)
if (s().test(document.links[e].href)) {
var c = document.links[e];
window.clickflare.links_replaced.has(c) || (c.href = l(c.href), window.clickflare.links_replaced.add(c))
}
}! function(c, a) {
var i = document.onreadystatechange;
window.clickflare || (window.clickflare = {
listeners: {},
customParams: {},
links_replaced: new Set,
addEventListener: function(t, n) {
var e = this.listeners[t] || [];
e.includes(n) || e.push(n), this.listeners[t] = e
},
dispatchEvent: function(t, n) {
n && (this.customParams[t] = n), (this.listeners[t] || []).forEach((function(t) {
return t(n)
}))
},
push: function(t, n) {
n && (this.customParams[t] = n), (this.listeners[t] || []).forEach((function(t) {
return t(n)
}))
}
}, document.onreadystatechange = function(t) {
return f(t, i)
}, f(null, i), setTimeout((function() {
! function(c, a) {
var i, o = function(c, a) {
var i = new URL("".concat(r).concat(c)),
o = "{",
s = o + o;
a.startsWith(s) || i.searchParams.set(n, a);
return i.searchParams.append(t, document.referrer), i.searchParams.append(e, location.href), i.searchParams.append("variantId", window.LL_VARIANT_ID), i.searchParams.append("lpt", document.title), i.searchParams.append("t", (new Date).getTime().toString()), i.toString()
}(c, a),
s = document.createElement("script"),
l = document.scripts[0];
s.async = 1, s.src = o, s.onerror = function() {
! function() {
for (var t = function(t, n) {
var e = document.links[t];
u().test(e.href) && setTimeout((function() {
e && e.setAttribute("href", function(t) {
var n = t.match(u());
if (n) {
var e = (n.groups || {}).original_link;
return e ? e.slice(0, -1) : t
}
return t
}(e.href))
}))
}, n = 0, e = document.links.length; n < e; n++) t(n)
}()
}, null === (i = l.parentNode) || void 0 === i || i.insertBefore(s, l)
}(c, a)
})))
}("".concat("/cf/tags", "/").concat(new URL(window.location.href).searchParams.get("cftmid") || "{{__CONTAINER_ID__}}"), new URL(window.location.href).searchParams.get(n) || "REPLACE_ME_CAMPAIGN_ID")
}(); </script>A/B-Testing mit Voluum einrichten
Voluum gehört zu den ältesten Trackern im Affiliate-Marketing und hat noch immer einen großen Marktanteil. Auch hier setzen wir auf Direct Tracking, um die variantID in diesem Tracker zu erfassen, und zwar mit derselben Methode wie zuvor.

Die variantID wird unten in der Traffic-Source-Vorlage ergänzt, in welcher Reihenfolge sie eingefügt wird, spielt aber keine große Rolle. Damit die Benennung einheitlich bleibt, müssen dieselben 2 Variablen ersetzt werden: „REPLACE_ME_CAMPAIGN_ID“ und „REPLACE_ME_CUSTOM_DOMAIN“. Kopieren Sie den folgenden Code und fügen Sie ihn in den Custom-Code-Bereich von LanderLab ein, damit das Setup abgeschlossen ist.
<<b>style</b>>.dtpcnt{opacity: 0;}</<b>style</b>>
<<b>script</b>>
(function(d, c, k, l, r, t, g, u, A, e, m, v, B, a, n, p, h, q, w, D, x) {
function y() { for (var f = c.querySelectorAll(".dtpcnt"), b = 0, a = f.length; b < a; b++) f[b][u] = f[b][u].replace(/(^|\s+)dtpcnt($|\s+)/g, "") }
function C(a, b, d, e) { var f = new Date;
f.setTime(f.getTime() + (e || 864E5));
c.cookie = a + "=" + b + "; " + d + "samesite=Strict; expires=" + f.toGMTString() + "; path=/";
k.setItem(a, b);
k.setItem(a + "-expires", f.getTime()) }
function z(a) {
var b = c.cookie.match(new RegExp("(^| )" + a + "=([^;]+)"));
return b ? b.pop() : k.getItem(a + "-expires") && +k.getItem(a +
"-expires") > (new Date).getTime() ? k.getItem(a) : null
}
x = "https:" === d.location.protocol ? "secure; " : "";
d[e] || (d[e] = function() {
(d[e].q = d[e].q || []).push(arguments) }, p = c[r], c[r] = function() { p && p.apply(this, arguments); if (d[e] && !d[e].hasOwnProperty("params") && /loaded|interactive|complete/.test(c.readyState))
for (; a = c[t][m++];) /\/?click\/?($|(\/[0-9]+)?$)/.test(a.pathname) && (a[g] = "javascrip" + d.postMessage.toString().slice(4, 5) + ":" + e + '.l="' + a[g] + '",void 0') }, setTimeout(function() {
(q = /[?&]cpid(=([^&#]*)|&|#|$)/.exec(d.location.href)) &&
q[2] && (h = q[2], w = z("vl-" + h));
var f = z("vl-cep"),
b = location[g];
if ("savedCep" === B && f && (!h || "undefined" === typeof h) && 0 > b.indexOf("cep=")) { var e = -1 < b.indexOf("?") ? "&" : "?";
b += e + f } a = c.createElement("script");
n = c.scripts[0];
a.defer = 1;
a.src = v + (-1 === v.indexOf("?") ? "?" : "&") + "lpref=" + l(c.referrer) + "&lpurl=" + l(b) + "&lpt=" + l(c.title) + "&vtm=" + (new Date).getTime() + (w ? "&uw=no" : "") + "&variantId=" + window.LL_VARIANT_ID ;
a[A] = function() { for (m = 0; a = c[t][m++];) /dtpCallback\.l/.test(a[g]) && (a[g] = decodeURIComponent(a[g]).match(/dtpCallback\.l="([^"]+)/)[1]);
y() };
n.parentNode.insertBefore(a, n);
h && C("vl-" + h, "1", x)
}, 0), setTimeout(y, 7E3))
})(window, document, localStorage, encodeURIComponent, "onreadystatechange", "links", "href", "className", "onerror", "dtpCallback", 0, "REPLACE_ME_CUSTOM_DOMAIN/d/REPLACE_ME_CAMPAIGN_ID.js", "savedCep");
</<b>script</b>>
<<b>noscript</b>>
<<b>link</b> href="REPLACE_ME_CUSTOM_DOMAIN/d/REPLACE_ME_CAMPAIGN_ID.js?noscript=true&lpurl=" rel="stylesheet" /></<b>noscript</b>>A/B-Testing mit Redtrack einrichten
Zu guter Letzt setzen wir dasselbe Setup für Redtrack um. Dieser Tracker hat einen beachtlichen Marktanteil und bietet dieselben Funktionen wie ClickFlare und Voluum.
Im Unterschied zu den anderen beiden Trackern muss die variantID hier einem bestimmten Token zugewiesen werden, da einige davon für System-Tokens reserviert sind. In diesem Beispiel wurde die variantID sub18 zugewiesen, und das wird auch im Direct-Tracking-Script übernommen.

„REPLACE_ME_CAMPAIGN_ID“ und „REPLACE_ME_CUSTOM_DOMAIN“ müssen ersetzt werden, danach ist der Code in LanderLab einsatzbereit.
<script>
function getCookie(name) {
var value = "; " + document.cookie;
var parts = value.split("; " + name + "=");
if (parts.length === 2) {
return parts.pop().split(";").shift();
}
}
var trackerURL = "REPLACE_ME_CUSTOM_DOMAIN";
var campaignID = "REPLACE_ME_CAMPAIGN_ID";
var cachebuster = Math.round(new Date().getTime() / 1000);
var rtkClickID;
var rtkfbp = getCookie('_fbp') || '';
var rtkfbc = getCookie('_fbc') || '';
var LL_VARIANT_ID = window.LL_VARIANT_ID;
var locSearch = window.location.search;
var urlParams = new URLSearchParams(locSearch);
var pixelParams = "&" + locSearch.substr(1) + "&sub18=" + LL_VARIANT_ID + "&sub19=" + rtkfbp + "&sub20=" + rtkfbc
if (campaignID == "") {
campaignID = urlParams.get('rtkcmpid')
}
var initialSrc = "https://"+ trackerURL + "/" + campaignID + "?format=json";
function stripTrailingSlash(str) {
return str.replace(/\/$/, "");
}
var rawData;
function fixHrefWithClick(
_rawData,
_cachebuster,
_rtkClickID
) {
document.querySelectorAll('a').forEach(function(el) {
if (el.href.indexOf(trackerURL + "/click") > -1) {
if (el.href.indexOf('?') > -1) {
el.href = stripTrailingSlash(el.href) + "&clickid=" + (_rtkClickID || _rawData.clickid) + "&rtkck=" + _cachebuster
} else {
el.href = stripTrailingSlash(el.href) + "?clickid=" + (_rtkClickID || _rawData.clickid) + "&rtkck=" + _cachebuster
}
}
if (el.href.indexOf("clickid={clickid}") > -1) {
el.href = el.href.replace(/{clickid}/, _rawData.clickid) + "&rtkck=" + _cachebuster;
}
});
}
setTimeout(function() {
if (!urlParams.get('rtkcid')) {
xhr = new XMLHttpRequest;
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
rawData = JSON.parse(xhr.responseText);
rtkClickID = rawData.clickid
setCookie();
// fixHrefWithClick(rawData, cachebuster)
document.querySelectorAll('a').forEach(function(el) {
if (el.href.indexOf(trackerURL + "/click") > -1) {
if (el.href.indexOf('?') > -1) {
el.href = stripTrailingSlash(el.href) + "&clickid=" + rawData.clickid + "&rtkck=" + cachebuster
} else {
el.href = stripTrailingSlash(el.href) + "?clickid=" + rawData.clickid + "&rtkck=" + cachebuster
}
}
if (el.href.indexOf("clickid={clickid}") > -1) {
el.href = el.href.replace(/{clickid}/, rawData.clickid) + "&rtkck=" + cachebuster;
}
});
xhrr = new XMLHttpRequest;
xhrr.open("GET", "https://"+ trackerURL +"/view?clickid=" + rawData.clickid)
xhrr.send();
}
}
xhr.open("GET", initialSrc + pixelParams)
xhr.send();
} else {
rtkClickID = urlParams.get('rtkcid')
setCookie();
xhrTrack = new XMLHttpRequest;
xhrTrack.open("GET", "https://"+trackerURL+"/view?clickid=" + rtkClickID)
xhrTrack.send();
// fixHrefWithClick(rawData, cachebuster, rtkClickID)
document.querySelectorAll('a').forEach(function(el) {
if (el.href.indexOf(trackerURL+ "/click") > -1) {
if (el.href.indexOf('?') > -1) {
el.href = stripTrailingSlash(el.href) + "&clickid=" + rtkClickID + "&rtkck=" + cachebuster
} else {
el.href = stripTrailingSlash(el.href) + "?clickid=" + rtkClickID + "&rtkck=" + cachebuster
}
}
if (el.href.indexOf("clickid={clickid}") > -1) {
el.href = el.href.replace(/{clickid}/, rawData.clickid) + "&rtkck=" + cachebuster;
}
});
}
}, 5e1)
function setCookie() {
var cookieName = "rtkclickid-store",
cookieValue = rtkClickID,
expirationTime = 86400 * 30 * 1000,
date = new Date(),
dateTimeNow = date.getTime();
date.setTime(dateTimeNow + expirationTime);
var date = date.toUTCString();
document.cookie = cookieName + "=" + cookieValue + "; expires=" + date + "; path=/;"
}
</script>Fazit
Da die Daten nun in Ihrem Tracker erfasst werden, lässt sich tatsächlich messen, wie viele Events eine bestimmte Variante einbringt. Sobald Sie die Gewinnervariante kennen, beenden Sie einfach den A/B-Test und legen sie als Hauptvariante fest. Starten Sie noch heute mit Split-Testing in LanderLab und eliminieren Sie dabei das Risiko, gesperrt zu werden.


