Integrationen

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.

Bruno Agalliu2 Min. Lesezeit

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.

A/B-Test

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.

VariantID in ClickFlare

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.

VariantID in Voluum

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.

VariantID in Redtrack

 

„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.

Möchten Sie A/B-Testing mit Ihrem Tracker optimieren?
Starten Sie jetzt Ihre kostenlose Testphase, um mit LanderLab fortgeschrittenes A/B-Testing zusammen mit ClickFlare, Voluum oder Redtrack zu nutzen!

Weiterlesen

Mehr aus dem Blog.

Themen

Nach Thema stöbern

Jeder Beitrag gehört zu einem Thema. Beginnen Sie mit dem Thema, das Ihrer laufenden Kampagne am nächsten kommt.

Lesen Sie das Playbook.Bauen Sie dann die Seite.

Kostenlos starten: Bauen Sie die Landingpage, veröffentlichen Sie sie auf Ihrer eigenen Domain und leiten Sie jeden Lead an Ihren Abnehmer weiter, bevor die nächste Kampagne live geht.

Von einem Prompt zu qualifizierten Leads

Sehen Sie, wie aus einem Prompt ein laufender Solar-Angebots-Funnel wird, jeder Lead bei Ihrem Abnehmer ankommt und die Lecks gemeldet werden, bevor sie Ihr Budget auffressen.

0:00
0:59