Wir haben CHF 17’508 ARR mit einem selbstgebauten Partner-Programm generiert, das aus nur 30 Zeilen Code besteht. Hier steht, wie es funktioniert

Unser MarTec-Startup Friendly generiert aktuell einen jährlich wiederkehrenden Umsatz (ARR) von CHF 24’663. Mit CHF 17’508 kamen ganze 71% davon über unsere Agentur-Partner und Affiliates:

Sechs aktive Kunden kamen über Agentur-Partner und Affilates, darunter unser grösster Kunde. Ein weiterer ist noch in der Testphase.

Ich habe mich entschieden, das Partner-Programm selber zu entwickeln und nicht auf eine vorhandene Lösung wie Rewardful zu setzen. Dafür hatte ich drei Gründe:

  1. Ich wollte die maximale Kontrolle über das Partner-Programm haben, um jeden Aspekt selber beeinflussen zu können.
  2. Die Integrität unserer Partner und Affiliates sind für mich von höchster Bedeutung. Es gibt viele Möglichkeiten, wie schlechte Affiliates Dir sogar schaden können. Daher wollte ich gar keine vollautomatisierte Lösung. Stattdessen mache ich Dinge, die nicht skalieren: ich führe mit jedem potentiellen Partner ein persönliches Gespräch per Videoanruf, bevor wir zusammenarbeiten.
  3. Ein weiterer Aspekt sind natürlich die Kosten – eine eigene Lösung spart Gebühren für ein Tool. Das war allerdings nicht der Hauptgrund für meine Entscheidung.

In diesem Artikel stelle ich die Umsetzung unseres Partner-Programms gerne im Detail in drei einfachen Schritten vor.

Wichtige Vorbemerkung: wenn Du Dich nicht mit Web-Entwicklung beschäftigen möchtest oder ein vollautomatisches Tool suchst, dann ist dieser Artikel nichts für Dich. In diesem Fall würde ich ein externes Tool wählen.

Schritt 1: Definiere einen URL-Parameter für Deine Partner und Affiliates und und speichere den Wert in ein Cookie

Als erstes solltest Du einen Parameter definieren, den Deine Partner bei Postings auf Social Media, in Blogposts etc. verwenden können. Mit diesem Parameter kannst Du nachvollziehen, von welchem Partner ein Lead gekommen ist.

Wir verwenden den Parameter «ref» für unser Partner-Programm. Beispiel:

https://friendly.is/?ref=jessica

In diesem Fall weiss ich, dass ein Lead von unsere Partnerin Jessica gekommen ist. Alternativ kannst Du auch jeden anderen Namen als Parameter nehmen, z.B. «via=jessica».

Aus technischen Gründen wirst Du diesen Parameter allerdings nur einmal sehen – beim ersten Seitenaufruf über diesen Affiliate-Link. Klickt die Person auf eine andere Seite Deiner Website, verschwindet der Parameter.

Daher musst den Parameter sofort in ein Cookie speichern, welches Du später wieder auslesen kannst – z.B. während des Kaufprozesses. Das geht ganz einfach per Javascript, indem Du dieses Code-Snippet auf jede Deiner Seiten einbaust:

<script type='text/javascript'>

/* Simple affiliate tracking script
 * @author      Stefan Vetter
 * @link        https://friendly.is
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

/* Affiliate cookie settings */

	// Set the URL parameter name to "ref". You can choose any other name here
var paramName = "ref";

	// Set the duration to one year. You can just change the duration by changing the numbers below (it's the duration in seconds that the cookie should last)
var cookieDuration = 3600 * 1000 * 24 * 365;


/* You should not need to edit below this point */

	// Get an URL parameter
function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, '\\$&');
    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

	// Get a specific cookie
getCookie = function (name) {
	var value = "; " + document.cookie;
	var parts = value.split("; " + name + "=");
	if (parts.length == 2) return parts.pop().split(";").shift();
}   

	// Get the domain name from an URL
function getDomainFromUrl(url) {
    var a = document.createElement('a');
    a.setAttribute('href', url);
    return a.hostname;
}


	// If the URL contains parameters (the stuff after a "?"), proceed
if (window.location.search) {   

			// If the visitor does not come from a search engine, proceed (I don't want our affiliates to buy ads on Google etc.)
    if (/google|bing/i.test(getDomainFromUrl(document.referrer)) == false ) {

				// If there is not already a cookie for an affiliate set, proceed
	    if (!getCookie(paramName)) {
				// Set the cookie
			var expires = new Date(Date.now () + cookieDuration );
			document.cookie = paramName + '=' +getParameterByName(paramName) + ';path=/; expires=' + expires.toUTCString() + ';';

		}
    }   
}

</script>

Du kannst den Code natürlich auch in eine eigene .js-Datei auslagern und diese dann in die Website einbinden:

<script type='text/javascript' src='path/to/your/file.js'></script>

Hier kannst Du das Script als JavaScript-Datei herunterladen: affiliate.js

Schritt 2: Affiliate-Cookie bei Checkout auslesen

In Schritt 1 haben wir sichergestellt, dass wir die Affiliate-Quelle in ein Cookie hinterlegen.

In diesem Schritt werden wir dieses Cookie bei der Erstellung eines neuen Kunden-Kontos auslesen, um den Kunden dem entsprechenden Affiliate zuordnen zu können.

Falls Du PHP verwendest, geht das ganz einfach mit der System-Variable $_COOKIE:

$affiliate = htmlspecialchars($_COOKIE["ref"]);

Wenn Du eine andere Programmiersprache verwendest, suche einfach nach „cookie auslesen“ + die entsprechende Programmiersprache.

Falls Du ein No-Code-Tool wie Typeform für den Checkout verwendest, kannst Du das Cookie alternativ auch einfach mit Javascript auslesen und an den Checkout-Link anhängen.

Das ginge zum Beispiel mit diesem Code:

<script type='text/javascript'>

/* Simple affiliate no-code checkout script
 * @author      Stefan Vetter
 * @link        https://friendly.is
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

// Read cookie. Just change the name of the cookie to the one from step 1.
var affiliateName = getCookie("ref");

	// If an affiliate cookie is set, proceed. 
if (affiliateName) {

		// set listener to wait until DOM is fully loaded
    document.addEventListener("DOMContentLoaded", function(e) {

				// Get all the links on the site
			var links = document.getElementsByTagName("a");
	
			for (var i = 0; i < links.length; i++) {	
				
					// If link goes to a certain domain, append a parameter to transmit the affiliate name (just change domain name accordingly)
				if (links[i].getAttribute("href").match(/^https:\/\/yourname\.typeform\.com\/to\/WWaDcN/i)) {
				
						// Change the parameter name as needed
					links[i].setAttribute("href", links[i].getAttribute("href") + "#affiliate=" + affiliateName );
	
				}
			}
    });
}

	// Add getCookie function if not already set
if (typeof getCookie !== "function") { 

		// Get a specific cookie
	getCookie = function (name) {
		var value = "; " + document.cookie;
		var parts = value.split("; " + name + "=");
		if (parts.length == 2) return parts.pop().split(";").shift();
	}
}

</script>

You can download it here: affiliate-checkout.js

Schritt 3: Kommissions-Dashboard für Partner und Affiliates erstellen

Nachdem Du den Namen des Affiliates in Schritt 2 ausgelesen und übermittelt hast, solltest Du ihn natürlich in Deiner Kundendatenbank speichern.

Der letzte Schritt wäre nun, Deinen Affiliates Zugriff auf ein Dashboard zu geben, auf dem sie ihre Vermittlungen und Provisionen einsehen können.

Wir verwalten unsere Kunden aktuell noch ganz simpel in einer Tabelle. Künftig werden wir dafür sicher eine ausgereiftere Lösung haben – bislang hatten wir andere Prioritäten.

Mein Ziel war, aus dieser Tabelle für jeden Affiliate die entsprechenden Daten auszulesen. Jeder Affiliate sollte natürlich nur auf die Daten ihrer / seiner Kunden zugreifen können.

Ich habe das gelöst, indem ich für jeden Affiliate eine separate Google-Tabelle erstelle. Diese neue Tabelle gebe ich dann nur für den entsprechenden Affiliate frei.

So sieht das Dashboard eines unserer Affiliates aus:

Diese Daten importiere ich automatisch aus unserer Tabelle mit allen Kunden – auf die der Affiliate keinen Zugriff hat. Dafür nutze ich die IMPORTRANGE-Funktion von Google Spreadsheets als Teil der Google Query Language:

=QUERY(IMPORTRANGE("https://docs.google.com/spreadsheets/d/abc123","Tab Name!A:N"), "select Col1, Col2, Col3, Col4, Col11,Col6, Col7, Col8, Col7*Col8, Col9, Col12 where Col10 = 'Affiliate Name' LABEL Col7*Col8 'Commission per month'", 1)

Weil ich Daten aus einem anderen Dokument abfrage, kann ich nicht die Namen der Spalten verwenden, sondern spreche die Spalten mit einer Nummer an – „Col1“ ist hierbei die erste Spalte, „Col2“ die zweite und so weiter.

Unsere Affiliates stellen uns auf Grundlage dieses Dashboards dann jeden Monat eine Rechnung über ihre Provisionen.

Fazit

Bis jetzt funktioniert diese einfache Lösung für uns sehr gut. Partner und Affilates sind für Friendly die wichtigste Akquisequelle – nicht von der Anzahl Kunden her, aber vom Umsatz.

Sollten wir irgendwann Bedarf haben, unser Affiliate-Modell mehr zu skalieren, würden wir vor allem Schritt 3 (Affiliate-Dashboards und Abrechnung) mehr automatisieren – durch eigene Software oder externe Tools.

Fragen? Stelle sie mir gerne 🙂

P.S. Wir bauen Friendly als profitables und langfristiges Unternehmen auf. In unserem Newsletter dokumentieren wir diesen Weg und teilen Erkenntnisse zum Thema Marketing. Begleitete uns gerne!