# Automatisierter Sales-Abgleich

Beim Sales-Abgleich gleichen Sie die getrackten Transaktionen mit Ihrem Shop- oder Warenwirtschaftssystem ab: Was bezahlt und behalten wurde, wird bestätigt, was storniert oder retourniert wurde, wird storniert. Diese Seite beschreibt den kompletten Ablauf, das Dateiformat und die drei Wege, auf denen die Ergebnisse zurück ins System kommen.

## Überblick

Der Abgleich läuft immer in drei Schritten:

1. **Offene Transaktionen holen:** als Datei aus der Transaktionsliste oder automatisch über die Daten-API.
2. **Abgleichen:** in Ihrem System entscheiden, welche Transaktion bestätigt, storniert oder im Umsatz korrigiert wird.
3. **Ergebnis zurückspielen:** per Upload, per SFTP oder per Webservice-API.

| Weg | Geeignet für | Automatisierbar | Ergebnis sehen Sie unter |
|---|---|---|---|
| **Upload im Transaktionsimport** | monatlichen oder wöchentlichen Abgleich von Hand | nein | Transaktionsimport, Historie |
| **SFTP-Ordner „Sales-Abgleich“** | regelmäßige Dateien aus Ihrer Warenwirtschaft | ja, Abholung alle 15 Minuten | Transaktionsimport, Historie und ExternalSources Monitor |
| **Webservice-API (PUT Orders)** | direkte Anbindung Ihres Systems, auch einzelne Transaktionen | ja | Antwort des Aufrufs und Historie der Transaktion |

Alle drei Wege ändern nur **bestehende** Transaktionen. Neue Transaktionen legt keiner dieser Wege an, solange Sie die Transaktions-ID (`id`) mitgeben.

---

## Die Abgleichsdatei

Für Upload und SFTP brauchen Sie eine CSV-Datei. Für die API gelten dieselben Felder, nur als JSON.

### Diese Spalten reichen

| Spalte | Pflicht | Inhalt |
|---|---|---|
| `id` | ja | Transaktions-ID aus unserem System. Nicht Ihre Bestellnummer. Sie steht in jedem Export in der ersten Spalte. |
| `status` | ja | Neuer Status, siehe unten. |
| `turnover` | nein | Korrigierter Netto-Umsatz, zum Beispiel nach einer Teilretoure. Nur mitgeben, wenn er sich geändert hat. |
| `cancel_reason` | nein | Stornogrund als Freitext, zum Beispiel `Retoure`. Sinnvoll bei Status 2. |

Mehr ist für einen Abgleich nicht nötig. Die Provision müssen Sie nicht mitschicken, das System rechnet sie selbst (siehe [Provision](#bkmrk-provision)).

### Status

| Wert | Bedeutung |
|---|---|
| `0` | offen |
| `1` | bestätigt |
| `2` | storniert |

Statt der Zahl verstehen alle drei Wege auch die Wörter `offen`, `bestätigt`, `storniert` sowie `open`, `confirmed`, `cancelled`. Andere Werte werden abgewiesen.

Ausgezahlte Transaktionen (Status 3) sind abgerechnet und lassen sich über keinen der drei Wege mehr ändern. Setzen Sie Status 3 nie selbst, er entsteht bei der Auszahlung.

### Provision

Lassen Sie die Spalte `commission` weg, rechnet das System die Provision auf allen drei Wegen selbst:

- **Prozentuale Provision:** Ändert sich der Umsatz, wird die Provision aus dem neuen Umsatz berechnet.
- **Feste Provision:** bleibt, wie sie ist.
- **Warenkorb-Provision:** wird bei Upload und SFTP im Verhältnis zum neuen Umsatz angepasst.

Eine Spalte `commission` brauchen Sie nur, wenn Sie bewusst einen festen Betrag setzen wollen, der von der Provisionsgruppe abweicht. Steht sie in der Datei, wird ihr Wert genau so übernommen, auch wenn sich der Umsatz geändert hat.

### Format

- **Die erste Zeile ist die Kopfzeile** mit den Spaltennamen. Kein Titel, keine Beschreibung, keine Leerzeile darüber.
- Eine Zeile je Transaktion. Keine Summenzeile am Ende.
- Trennzeichen Semikolon `;`, Textbegrenzer doppelte Anführungszeichen `"`, Kodierung UTF-8.
- Beträge als reine Zahl: `12,49` oder `12.49`. Keine Währung, kein `EUR`, kein `€` in der Zelle.
- Eine leere Zelle bedeutet „nicht ändern“. Wer nur den Status setzen will, lässt `turnover` leer oder die Spalte ganz weg.
- Nur Transaktionen aufnehmen, die Sie tatsächlich entschieden haben. Offene, die offen bleiben, gehören nicht in die Datei.

**Beispiel:**

```
id;status;turnover;cancel_reason
4271510;1;;
4271509;2;;Retoure
4223190;1;89,90;
4223189;2;;Bestellung nicht bezahlt
```

Zeile 1 bestätigt, Zeile 2 storniert mit Grund, Zeile 3 bestätigt mit korrigiertem Umsatz, Zeile 4 storniert.

Weitere Spalten wie Publisher-Name oder Ihre eigenen Notizen stören nicht. Sie werden beim Upload einfach nicht zugeordnet. Beim SFTP-Weg werden nur die fest vorgegebenen Spalten gelesen (siehe Weg B).

### Wenn Sie die Datei erzeugen lassen

Erstellt ein Skript, ein Export Ihrer Warenwirtschaft oder ein KI-Assistent die Datei, geben Sie genau diese Vorgaben mit: Kopfzeile `id;status;turnover;cancel_reason` in Zeile 1, Beträge ohne Währung, keine Kopf- oder Summenzeilen, nur entschiedene Transaktionen. Prüfen Sie die erste Datei einmal im Transaktionsimport (Weg A), bevor Sie auf SFTP oder API umstellen.

---

## Schritt 1: Offene Transaktionen holen

### In der Transaktionsliste

1. **Transaktionen → Transaktionsliste** öffnen.
2. Zeitraum wählen und unter **Status & Typ** auf **Offen** filtern, bei Bedarf zusätzlich nach Kampagne.
3. **Liste aktualisieren** klicken.
4. Unter **Export** die Variante **Transaktionsabgleich** wählen und als **CSV** herunterladen.

![Export Transaktionsabgleich](https://docs.easy-m.de/uploads/images/gallery/2026-10/salesabgleich-05-export.png)

Der Export „Transaktionsabgleich“ enthält nur die Spalten, die für den Abgleich wichtig sind: `id`, `status`, `timestamp`, `campaign_id`, `ordertoken`, `project_id`, `type`, `commission`, `trigger_id`, `turnover`, `order_currency`, `cancel_reason`, dazu Projekt- und Kampagnenname. Die Bestellnummer aus Ihrem Shop steht in `ordertoken`, darüber finden Sie die Bestellung in Ihrem System.

Die Datei lässt sich direkt bearbeiten und wieder hochladen. **Löschen Sie vorher die Spalte `commission`**, wenn Sie Umsätze ändern. Sonst wird die alte Provision zurückgeschrieben, statt sie neu zu berechnen.

### Automatisch über die Daten-API

Unter **API → Daten-API** steht derselbe Export als fester Link zur Verfügung, Zeile **Transaktionsabgleich**. Ihr System kann ihn regelmäßig abrufen, zum Beispiel jede Nacht.

![Daten-API mit Transaktionsabgleich und Access-Token](https://docs.easy-m.de/uploads/images/gallery/2026-10/salesabgleich-06-daten-api.png)

```
https://<Ihre-Domain>/api/<ACCESS-TOKEN>/admin/<LOGIN-ID>/get-orders_small.csv?condition[l:status]=open&condition[period][from]=01.10.2026&condition[period][to]=31.10.2026
```

| Teil | Bedeutung |
|---|---|
| `<Ihre-Domain>` | die Adresse, unter der Sie sich anmelden |
| `<ACCESS-TOKEN>` | Ihr Access-Token, rechts auf der Seite Daten-API |
| `<LOGIN-ID>` | Ihre Login-ID |
| `.csv` | Format, alternativ `.xlsx`, `.xml`, `.json` |
| `condition[l:status]` | `open`, `confirmed`, `canceled`, `paid`, auch kombiniert: `open,confirmed` |
| `condition[period][from]`, `[to]` | Zeitraum im Format `TT.MM.JJJJ` |
| `condition[l:campaigns]` | nur bestimmte Kampagnen, zum Beispiel `1` |

Am einfachsten stellen Sie die Filter oben auf der Seite Daten-API ein und kopieren den fertigen Link. Alle Filter: [Transaktions-API](https://docs.easy-m.de/books/admin-api-dokumentation/page/transaktions-api-dokumentation).

Der Access-Token wirkt wie ein Passwort. Geben Sie Links mit Token nur an Personen und Systeme weiter, die diese Daten sehen dürfen.

---

## Schritt 2: Ergebnis zurückspielen

### Weg A: Upload im Transaktionsimport

**Transaktionen → Transaktionsimport** (bzw. **Administration → Transaktionsimport**).

**1. Datei.** „Transaktionen“ auswählen, die CSV hineinziehen, Trennzeichen Semikolon und Textbegrenzer doppelte Anführungszeichen stehen lassen, **Datei einlesen**. Eine Notiz wie „Abgleich Oktober“ hilft später in der Historie.

![Schritt Datei](https://docs.easy-m.de/uploads/images/gallery/2026-10/salesabgleich-01-datei.png)

**2. Zuordnung.** Heißen Ihre Spalten wie oben beschrieben, ordnet das System sie selbst zu: `id` → Transaktions-ID, `status` → Status, `turnover` → Umsatz, `cancel_reason` → Stornogrund. Unter jedem Feld steht der Wert aus der ersten Datenzeile, damit Sie sofort sehen, ob die Spalte passt. Heißen Ihre Spalten anders, wählen Sie sie hier von Hand aus.

Entscheidend ist der Hinweis über dem Formular:

- **blau, „Aktualisierung“:** Die Transaktions-ID ist zugeordnet, bestehende Transaktionen werden geändert. So muss es beim Abgleich aussehen.
- **grün, „Neuanlage“:** Keine Transaktions-ID zugeordnet, jede Zeile würde als neue Transaktion angelegt. Dann fragt das System nach Projekt-ID, Trigger-ID, Bestellnummer und Zeitpunkt. Für einen Abgleich ist das falsch: Spalte `id` prüfen.

![Schritt Zuordnung: Aktualisierung erkannt](https://docs.easy-m.de/uploads/images/gallery/2026-10/salesabgleich-02-zuordnung.png)

**3. Prüfung.** Vor dem Import zählt das System, was passieren würde. Für einen Abgleich steht die Zahl unter **Änderung, gültig**, bei **Neu** steht 0. Abgelehnte Werte erscheinen als Tabelle mit Zeile, Feld, Wert und Hinweis. Die Vorschau zeigt die ersten Zeilen, filterbar nach Fehlern und Dubletten.

![Schritt Prüfung](https://docs.easy-m.de/uploads/images/gallery/2026-10/salesabgleich-03-pruefung.png)

**4. Import.** **Import starten** schickt den Auftrag an den Importer, er beginnt innerhalb weniger Sekunden. Mit **Zur Freigabe vorlegen** wird der Auftrag erst ausgeführt, wenn ein zweites Konto ihn freigibt (Vier-Augen-Prinzip).

Danach steht der Auftrag in der Historie unter dem Formular. Ein Klick öffnet das Detail: Zahl der geänderten und übersprungenen Zeilen, jede abgelehnte Zelle mit Grund und ein Protokoll je Zeile mit dem Wert vorher und nachher. Dort sehen Sie für jede Transaktion, was der Abgleich geändert hat.

Mehr zum Transaktionsimport: [Transaktionsabgleich / Conversion](https://docs.easy-m.de/books/transaktionsverwaltung/page/transaktionsabgleich-conversion).

### Weg B: SFTP

Für regelmäßige Dateien richten Sie sich einen eigenen SFTP-Zugang ein. Den Abgleich übernimmt danach das System.

1. **Integrations → SFTP-Uploads** öffnen und oben rechts die Kampagne wählen.
2. **Zugang einrichten.** Das System legt den Zugang und die Ordner an und zeigt Host, Port, Benutzername und Passwort. Das Passwort wird nur dieses eine Mal angezeigt, speichern Sie es sofort in einem Passwortmanager. Ein neues lässt sich jederzeit erzeugen, das alte wird dabei sofort ungültig.
3. Ihre Abgleichsdatei in den Ordner **`/order_abgleich_import/`** hochladen.

Alle 15 Minuten holt das System neue Dateien aus dem Ordner, importiert sie und verschiebt sie danach nach `done/`. Jede Datei erscheint als eigener Auftrag in der Historie des Transaktionsimports, mit denselben Details wie bei Weg A.

Unterschiede zum Upload:

- Es gibt keinen Zuordnungsschritt. Die Spalten müssen genau so heißen: `id`, `status`, `turnover`, `cancel_reason`, optional `commission` und `description`.
- Trennzeichen ist immer das Semikolon, Textbegrenzer immer das doppelte Anführungszeichen.
- Ohne Spalte `commission` rechnet das System die Provision wie beim Upload.

Der Ordner `/order_tracking_import/` ist für **neue** Transaktionen gedacht, nicht für den Abgleich. Eine Datei mit Spalte `id` gehört immer nach `/order_abgleich_import/`.

### Weg C: Webservice-API

Mit der API ändert Ihr System Transaktionen direkt, einzeln oder viele auf einmal, ohne Datei.

**Ändern oder neu anlegen?** Das entscheidet die HTTP-Methode:

| Methode | Wirkung |
|---|---|
| `PUT` | ändert bestehende Transaktionen. Legt nie eine neue an. |
| `POST` | legt neue Transaktionen an, siehe [Create Orders](https://docs.easy-m.de/books/admin-api-dokumentation/page/create-easyaffiliate-rest-api-orders). |

Für den Abgleich nutzen Sie ausschließlich `PUT`.

#### Zugang

| Angabe | Wert |
|---|---|
| URL | `https://<Ihre-Domain>/ws/V6/admin/REST/Orders` |
| Methode | `PUT` |
| `Content-Type` | `application/json` |
| `X-Auth-ID` | Login-ID Ihres Admin-Benutzers |
| `X-Auth-Token` | Access-Token dieses Benutzers, zu finden unter **API → Daten-API** |
| `X-Network-ID` | `-1` (bzw. die ID Ihres Mandanten, wenn Sie mehrere haben) |

Mit einem Advertiser-Login lautet die URL `https://<Ihre-Domain>/ws/V6/advertiser/REST/Orders`, Login-ID und Access-Token sind dann die des Advertiser-Logins. Ein Advertiser-Login ändert nur Transaktionen der eigenen Kampagnen, ein Admin-Login mit Mandant nur die seines Mandanten.

Legen Sie für die Anbindung am besten einen eigenen Benutzer an, zum Beispiel „Salesabgleich API“. Dann ist in der Historie jeder Transaktion zu sehen, dass die Änderung aus der Anbindung kam.

#### Aufruf

```bash
curl -X PUT "https://<Ihre-Domain>/ws/V6/admin/REST/Orders" \
  -H "Content-Type: application/json" \
  -H "X-Auth-ID: <LOGIN-ID>" \
  -H "X-Auth-Token: <ACCESS-TOKEN>" \
  -H "X-Network-ID: -1" \
  -d '[
    { "id": 4271510, "status": 1 },
    { "id": 4271509, "status": 2, "cancel_reason": "Retoure" },
    { "id": 4223190, "status": 1, "turnover": 89.90 }
  ]'
```

| Feld | Pflicht | Inhalt |
|---|---|---|
| `id` | ja | Transaktions-ID |
| `status` | ja | `0`, `1` oder `2` |
| `turnover` | nein | korrigierter Netto-Umsatz als Zahl mit Punkt, zum Beispiel `89.90` |
| `cancel_reason` | nein | Stornogrund |
| `commission` | nein | nur für einen bewusst festen Betrag, siehe [Provision](#bkmrk-provision) |

Schicken Sie nur diese Felder. Eine `campaign_id` ist nicht nötig, die `id` reicht. Große Abgleiche teilen Sie auf mehrere Aufrufe auf.

#### Antwort: Woran Sie sehen, dass alles angekommen ist

Die Antwort enthält in `data` jede Transaktion, die geändert wurde, mit ihrem neuen Stand:

```json
{
  "data": [
    { "id": 4271510, "status": 1, "turnover": 19.99, "commission": 5, "cancel_reason": null, "status_change_date": "2026-10-28T14:50:44+00:00", ... },
    { "id": 4271509, "status": 2, "turnover": 19.99, "commission": 5, "cancel_reason": "Retoure", ... },
    { "id": 4223190, "status": 1, "turnover": 89.9, "commission": 8.99, ... }
  ]
}
```

- **Gleichen Sie die IDs in der Antwort mit den gesendeten ab.** Eine Transaktion, die in `data` fehlt, wurde nicht geändert: Die ID gibt es nicht, die Transaktion ist bereits ausgezahlt, sie gehört nicht zu Ihren Kampagnen, oder der Status war ungültig. In einer Liste meldet die API dafür keinen Fehler, die Zeile fehlt einfach. Schicken Sie ein einzelnes Objekt statt einer Liste, antwortet die API in diesen Fällen mit `"error": true`.
- `status`, `turnover` und `commission` in der Antwort sind die Werte, die jetzt im System stehen. Hier sehen Sie auch, ob die Provision neu berechnet wurde.
- `status_change_date` setzt das System selbst, sobald sich der Status ändert.
- Bei falschen Zugangsdaten kommt `{"error": true, "message": "Authentification failed."}`.

Testen Sie die Anbindung zuerst mit einer einzigen Transaktion und prüfen Sie das Ergebnis in der Transaktionsliste, bevor Sie den ganzen Abgleich schicken.

Weitere Felder und Beispiele: [Update Orders](https://docs.easy-m.de/books/admin-api-dokumentation/page/update-easyaffiliate-rest-api-orders).

---

## Häufige Fehler

| Was Sie sehen | Ursache | Lösung |
|---|---|---|
| „Es wurde nur eine Spalte erkannt“ und „Für die Neuanlage fehlen: Kampagnen-ID, Projekt-ID …“ | Über der Kopfzeile stehen Titel, Beschreibung oder Leerzeilen, oder das Trennzeichen stimmt nicht. | Alles über der Kopfzeile löschen. Trennzeichen im Schritt Datei prüfen. |
| Hinweis „Neuanlage“ statt „Aktualisierung“ | Die Spalte mit der Transaktions-ID fehlt oder heißt anders. | Spalte `id` nennen oder im Schritt Zuordnung bei Transaktions-ID auswählen. |
| Betrag abgelehnt: nicht als Zahl lesbar | Währung oder Text in der Zelle, zum Beispiel `12,49 EUR`. | Nur die Zahl eintragen. |
| Letzte Zeile ungültig | Summenzeile wie „Gesamt“ am Ende der Datei. | Summenzeile entfernen. |
| Provision hat sich geändert, obwohl nur der Status geändert werden sollte | Die Spalte `commission` aus dem Export wurde mitgeschickt. | Spalte `commission` vor dem Upload löschen. |
| Provision bleibt alt, obwohl der Umsatz geändert wurde | Die Spalte `commission` aus dem Export enthält noch den alten Wert. | Spalte `commission` vor dem Upload löschen. |
| Transaktion wurde nicht geändert | Sie ist bereits ausgezahlt (Status 3), oder die ID stimmt nicht. | ID in der Transaktionsliste suchen. Ausgezahlte Transaktionen korrigiert der Support. |

So sieht der Transaktionsimport aus, wenn über der Kopfzeile noch Text steht:

![Datei mit Text über der Kopfzeile](https://docs.easy-m.de/uploads/images/gallery/2026-10/salesabgleich-04-falsche-kopfzeile.png)

---

## Fragen

Für Abgleiche, die über diese Wege hinausgehen, etwa ein Abruf direkt aus Ihrem Warenwirtschaftssystem oder ein festes Dateiformat, das Sie nicht ändern können, schreiben Sie an support@easy-m.de. Wir richten die passende Strecke mit Ihnen ein.