# Technische Implementierung

# Technische Implementierung: Schritt für Schritt

Diese Seite dient als Roadmap für die Einrichtung deines Private Networks mit easy.Affiliate. Sämtliche Trackingrelevanten Dokus sind in unserem Dokusystem über die Suche zu erreichen.

---

## 1. Grundkonfiguration: Kampagnen anlegen
Eine **Kampagne** ist das logische Gefäß für dein Partnerprogramm. In der Regel entspricht eine Kampagne einem Webshop oder einer spezifischen Ländereinheit.
* Legen Sie den Namen, die Ziel-URL und die grundlegenden Laufzeiten fest.
* Hier definierst du, welcher Shop für die Zuordnung der Sales verantwortlich ist.

## 2. Werbemittel (Creatives) bereitstellen
Ohne Material können deine Partner nicht arbeiten. Hinterlege innerhalb der Kampagne:
* **Banner:** Klassische Image-Anzeigen in gängigen Formaten.
* **Textlinks:** Vorformulierte Links für Blogs oder Social Media.
* **Product Feeds:** (Optional) Falls deine Publisher Produktdaten (XML/CSV) benötigen.

## 3. Provisionslogik: Trigger definieren
Hier legst du fest, wie viel Geld ein Publisher verdient. Ein **Trigger** erkennt das Attribut eines Sales und weist die passende Provision zu.
* **Beispiel Neukunde vs. Bestandskunde:** Unterschiedliche Prozentsätze basierend auf dem Kundenstatus.
* **Aktionsbasierte Trigger:** Höhere Provisionen für bestimmte Produktkategorien.

## 4. Onboarding: Publisher-Management
Ein Netzwerk lebt von seinen Partnern.
* **Einladung:** Lade Publisher direkt über das System ein oder nutze die öffentliche Registrierungsseite.
* **Verbindung:** Publisher müssen mit der jeweiligen Kampagne **verbunden** (freigeschaltet) werden, damit sie Zugriff auf Links und Tracking haben.

## 5. Shop-Integration: Tracking-Code verbauen
Damit easy.Affiliate weiß, wann ein Kauf stattgefunden hat, muss der **Tracking-Code** auf der "Danke-Seite" (Order Confirmation Page) deines Shops integriert werden.
* Er erfasst die Order-ID, den Warenkorbwert und ggf. die Trigger-Informationen.
* **First-Party-Vorteil:** Durch die Integration auf deiner Domain ist das Tracking extrem präzise.

## 6. Der eatms-Container (Tag-Management)
Zusätzlich zum Tracking-Code integrierst du den **eatms-Container** im Shop. 
* **Funktion:** Dieser fungiert als Container für Third-Party-Trackingcodes.
* **Vorteil:** Du kannst Skripte von Drittanbietern oder Partnern bequem über das easy.Affiliate Backend steuern, ohne den Quellcode deines Shops erneut bearbeiten zu müssen.

---

### Checkliste für den Go-Live
- [ ] Kampagne ist aktiv geschaltet?
- [ ] Mindestens ein Textlink/Banner ist hinterlegt?
- [ ] Provisions-Trigger sind getestet (greift der Neukunden-Bonus)?
- [ ] Testbestellung durchgeführt: Erscheint der Sale im Dashboard?
- [ ] eatms-Container feuert korrekt?

# Attribution & Tracking-Logik

In diesem Kapitel erfährst du, wie easy.Affiliate Klicks und Sales einander zuordnet. Dank unseres **First-Party-ID-Trackings** sind wir unabhängig von unsicheren Third-Party-Cookies und bieten maximale Datengenauigkeit.

---

## 1. Das Herzstück: Die EMID
Unser Tracking basiert auf einer eindeutigen Kennung, der **EMID**. 
* **Funktionsweise:** Klickt ein User auf ein Werbemittel eines Publishers, wird er zum Zielshop weitergeleitet. Dabei wird die EMID automatisch als URL-Parameter an die Ziel-URL angehängt.
* **Übergabe:** Diese ID muss vom Shop-System aufgenommen und beim Abschluss des Kaufs an den **Conversioncode** übergeben werden.

## 2. Standard-Attribution: Last-Click
Standardmäßig arbeitet easy.Affiliate nach dem **Last-Click-Prinzip**:
* Wird eine EMID beim Aufruf der Seite mitgeliefert, wird diese für die Attribution des Sales priorisiert.
* Der Publisher, dessen EMID zuletzt "geliefert" wurde, erhält die Provision.

## 3. Erweitertes Tracking via eatms-Container
Ist der **eatms-Container** in deinem Shop verbaut, wird das Tracking noch robuster. Das System setzt dann automatisch zwei wichtige First-Party-Cookies:

1.  **EMID-Cookie:** Speichert die ID direkt in deiner Domain als First-Party-Cookie.
2.  **TRS-Cookie:** Speichert die aktuelle Session-Information des Nutzers.

### Der Vorteil des Cookie-Backups:
Sollte ein Nutzer den Shop später ohne direkten Affiliate-Link erneut besuchen (z. B. durch Direkteinstieg am nächsten Tag), greift unser System auf das **EMID-Cookie** zurück. So stellen wir sicher, dass Sales auch dann korrekt zugeordnet werden, wenn im Moment der Conversion keine EMID mehr in der URL steht.

## 4. Individuelle Attributions-Modelle
Dank der EMID-Logik hast du als Advertiser theoretisch die volle Freiheit:
* Du könntest technisch gesehen auch eigene Attributions-Logiken umsetzen (z. B. **First-Click**), indem du die erste EMID eines Nutzers dauerhaft speicherst und Folgende ignorierst.
* Da unser System die EMID transparent übergibt, behältst du die volle Kontrolle über deine Datenstrategie.

---

> ### 🆘 Sonderwünsche & Support
> Du planst ein spezielles Attributions-Modell (z. B. Customer Journey Multi-Touch) oder hast Fragen zu komplexen Setups? 
> 
> Wende dich bitte direkt an unsere Experten unter: 
> 📧 **[support@easy-m.de](mailto:support@easy-m.de)**

# Trackingeinrichtung einer Kampagne in easy.AFFILIATE mit Basket-Tracking

Um das Tracking in **easy.AFFILIATE** zu gewährleisten, sind lediglich zwei Einbauschritte notwendig. 

Das System generiert beim Redirect von der Publisher-Seite auf Ihren Shop eine ID, mit der der Sale später erfasst werden kann. Diese ID (nachfolgende EMID genannt) wird shopseitig von einem Code-Snippet aufgenommen und im **Local Storage** sowie in einem **Cookie** gespeichert. Bei der Conversion-Erfassung wird diese EMID über ein anderes Code-Snippet zurück an das Trackingsystem gespielt.

---

## 1. Code-Snippet (einzubauen auf jede Seite)

Dieser Code nimmt die EMID auf, die im Redirect erzeugt wird, und schreibt sie in den LocalStorage sowie in einen Cookie (jeweils mit dem Key `emid`).

**Einbauort:** Auf sämtlichen Seiten des Shops (am einfachsten im Footer-Template).

```javascript
(function() {
    // The expiration time of the cookie (normally 60 days)
    // Die Laufzeit des Cookies (im Regelfall 60 Tage)
    var emidCookieExpirationDays = 60;

    // Please do not change below here!
    // Ab hier bitte nicht verändern!
    var getKey = 'emid';
    var getValue = getParameterByName(getKey);
    var storageKey = 'emid';
    var emidCookieKey = 'emid';
    var emidCookieDomain = window.location.hostname;

    if(getValue) {
        window.localStorage.setItem(storageKey, getValue);
        setEmidCookie(emidCookieKey, getValue, emidCookieExpirationDays,  emidCookieDomain);
    }

    function setEmidCookie(cname, cvalue, exdays, cdomain) {
      var d = new Date();
      d.setTime(d.getTime() + (exdays * 24*60*60*1000));
      var expires = "Expires="+ d.toUTCString();
      document.cookie = cname + "=" + cvalue + ";" + expires + ";Path=/;SameSite=none;Domain=" + cdomain + ";Secure";
    }
    
    function getParameterByName(e,n){n||(n=window.location.href),e=e.replace(/[[]]/g,"\$&");var r=new RegExp("[?&]"+e+"(=([^&#]*)|&|#|$)").exec(n);return r?r[2]?decodeURIComponent(r[2].replace(/\+/g," ")):"":null}
})();
```

---

## 2. Basket-Conversion-Code (einzubauen auf die Checkout-Successful-Seite)

Dieser Code erfasst die Bestellung und übergibt sie an das Trackingsystem. 

**Einbauort:** Ausschließlich auf der Bestellbestätigungsseite.

```javascript
(function () {
  // please insert the campaign_id here - you received it by your account manager
  var campaign_id = 'CAMPAIGN_ID';

  // please insert the unique ordernumber of the purchase here
  var token = 'ORDERTOKEN';

  // insert EVERY purchased item into the basket variable "basket" 
  var basket = [
    {
      article_number: "ARTICLE_NUMBER_1",
      amount: "ARTICLE_AMOUNT_1",
      price: "SINGLE_ARTICLE_TURNOVER_1",
      productname: "ARTICLE_NAME_1",
      category: "ARTICLE_CATEGORY_1"
    }, {
      article_number: "ARTICLE_NUMBER_2",
      amount: "ARTICLE_AMOUNT_2",
      price: "SINGLE_ARTICLE_TURNOVER_2",
      productname: "ARTICLE_NAME_2",
      category: "ARTICLE_CATEGORY_2"
    }, {
      article_number: "ARTICLE_NUMBER_N",
      amount: "ARTICLE_AMOUNT_N",
      price: "SINGLE_ARTICLE_TURNOVER_N",
      productname: "ARTICLE_NAME_N",
      category: "ARTICLE_CATEGORY_N"
    }
  ];

  // Please insert the URL / Domain des Systems
  var trackingDomain = 'DOMAIN-DES-SYSTEMS';

  // Please do not change below here!
  var storageKey = 'emid';
  var trigger_id = '1';

  var basketUrl = 'https://' + trackingDomain + '/trck/ebasket/ebasket.js';
  
  emid = window.localStorage[storageKey];

 if (typeof emid !== 'undefined') {
    var req = new XMLHttpRequest;
    req.withCredentials = true;
    req.open("GET", basketUrl),
      req.send(),
      req.onreadystatechange = function () {
        (req.readyState === 4) ? function () {
          eval(req.response);
          basket.forEach(function(elem) {
            eamTrckAddBasketItem(
              campaign_id,token,trigger_id,encodeURIComponent(elem.article_number),elem.amount,elem.price,emid,encodeURIComponent(elem.productname),encodeURIComponent(elem.category),{}
            );
          });
          eamTrckSubmitBasket();
        }() : null
      };
  }
})();
```

### Wichtige Hinweise zum Conversion-Code:

* **Platzhalter ersetzen:** Ersetzen Sie `CAMPAIGN_ID`, `ORDERTOKEN` und `DOMAIN-DES-SYSTEMS` durch Ihre spezifischen Daten.
* **Dynamische Inhalte:** Die Variable `basket` muss dynamisch mit allen Artikeln der Bestellung befüllt werden.
* **Mengensteuerung:** Jedes Produkt sollte nur einmal im Array erscheinen; die Anzahl wird über `ARTICLE_AMOUNT` gesteuert.
* **Netto-Werte:** Der Umsatz (`price`) muss als **Netto-Einzelpreis** (ohne Steuern und Versandkosten) übergeben werden.

### Erläuterung der Platzhalter:

| Platzhalter | Beschreibung |
| :--- | :--- |
| **CAMPAIGN_ID** | Fester Wert von Ihrem Account-Manager. |
| **ORDERTOKEN** | Die dynamische Bestellnummer aus Ihrem Shop. |
| **DOMAIN-DES-SYSTEMS** | Die Domain Ihres easy.AFFILIATE-Systems. |
| **ARTICLE_NUMBER_N** | Artikelnummer des jeweiligen Produkts. |
| **ARTICLE_AMOUNT_N** | Anzahl des jeweiligen Produkts im Warenkorb. |
| **SINGLE_ARTICLE_TURNOVER_N** | Netto-Umsatz des Einzelprodukts. |
| **ARTICLE_NAME_N** | Name des Produkts. |
| **ARTICLE_CATEGORY_N** | Kategorie des Produkts. |