Zum Hauptinhalt springen
Ein Vertriebskanal (Sales Channel) bildet eine Marke deiner Organisation ab und bestimmt Branding, Domain, erlaubte Zahlungsmethoden, Coupon-Verhalten und Kundenbereich. Diese Seite erklärt das Verhalten aus Entwicklersicht. Die fachliche Einführung findest du unter Vertriebskanäle.
Jede Organisation hat immer einen Kanal mit dem technischen Namen default. Er ist der universelle Fallback und kann nicht gelöscht werden. Vertriebskanäle sind organisatorisch, sie isolieren keine Daten. Kunden, Subscriptions, Rechnungen, Produkte und Preise bleiben organisationsweit.
In den Beispielen ist $BASE_URL die Basis-URL deiner Fynn-API und $API_TOKEN ein API-Token, das als Authorization: Bearer mitgeschickt wird.

Kanal-Auflösung

Fynn löst den aktiven Vertriebskanal pro eingehendem Request auf, nachdem der Tenant feststeht. Es gewinnt der erste Treffer in dieser Kette:
1

Header X-Sales-Channel-Id

Expliziter Kanal per Header X-Sales-Channel-Id: <uuid>. Wird für interne Wallet- und Tool-Zugriffe genutzt, wenn der Aufrufer den Kanal kennt.
2

Header X-Cart-Token

X-Cart-Token: <token> löst den Warenkorb auf; dessen Kanal stammt aus dem CheckoutLink. Das ist der reguläre Weg im Checkout der Kundenfront.
3

Domain (Host / Origin / Referer)

Der Host der Anfrage wird über die Customerfront-Domain zum Kanal aufgelöst. Bei Cross-Origin-Aufrufen der Kundenfront-SPA (der Host ist dann die API-Domain) wird zusätzlich Origin, dann Referer, dann X-Source-Domain herangezogen, dieselbe Header-Reihenfolge, mit der auch der Tenant aufgelöst wird.
4

Default-Kanal

Greift keiner der Schritte, wird der default-Kanal der Organisation verwendet.
Cross-Tenant-Guard: Jeder aufgelöste Kanal wird gegen den Tenant des Requests geprüft. Gehört ein per Header oder Cart-Token referenzierter Kanal zu einer anderen Organisation, wird er still verworfen, und die Kette läuft zum nächsten Schritt weiter. Auf einen fremden Kanal fällt sie nie zurück.
Praktische Konsequenz: Verbindest du eine eigene Domain mit einem Kanal (siehe Eigene Domains), erreichen Aufrufe über diese Domain automatisch den richtigen Kanal, ohne dass du einen Header setzen musst. Eine Domain ist immer genau einem Kanal zugeordnet.

Der salesChannel am Kunden

Jeder Kunde gehört genau einem Vertriebskanal an. Die Zuordnung steuert, welches Branding der Kunde in Bestätigungen, Dokumenten und im Self-Service sieht.

Beim Anlegen und Aktualisieren (Eingabe)

Die Felder POST /customers und PATCH /customers/{id} akzeptieren ein optionales Feld salesChannel:
  • Wert ist die UUID oder der technische Name des Kanals (zum Beispiel "default").
  • Der Kanal muss existieren und zur aktuellen Organisation gehören, andernfalls antwortet die API mit 422 und einer Validierungsmeldung am Feld.
  • Lässt du das Feld bei der Anlage leer, weist Fynn den aktuell aufgelösten bzw. den default-Kanal zu.
Kunde einem Kanal zuordnen
Kanal eines Kunden ändern

In der Ausgabe (Lesen)

In Kunden-Antworten (sowie eingebettet in CheckoutLink, Cart und Webhook-Envelopes) erscheint der Kanal als kompakte Referenz:

Vertriebskanäle verwalten

Die folgenden Endpunkte verwalten Kanäle und ihre Einstellungen. Sie erfordern ein API-Token mit der Berechtigung sales-channel:read (lesend) bzw. sales-channel:write (schreibend).

Kanal anlegen

Beim Anlegen wird automatisch eine Standard-Customerfront-Domain aus name und einem festen Suffix erzeugt. Der name ist später unveränderlich, weil er in URLs und Logs auftaucht.

Kanal aktualisieren

PATCH /api/sales-channels/{id} ist partiell, nur übergebene Felder werden geändert.

Vollständige Kanal-Repräsentation

GET /api/sales-channels/{id} liefert die volle Sicht inklusive eingebetteter Appearance-Felder:

Coupon-Gate

allowCoupons ist ein Kanal-weites Gate. Steht es auf false, sind Coupons in keinem CheckoutLink dieses Kanals einlösbar, egal was der einzelne CheckoutLink erlaubt. Ein CheckoutLink kann Coupons nur weiter einschränken, nie gegen den Kanal erlauben. Neu angelegte Kanäle haben allowCoupons = true.

Zahlungsmethoden-Whitelist

allowedPaymentMethods wirkt als Whitelist:
  • Leeres Array → keine kanalspezifische Einschränkung; alle Methoden mit aktivem Gateway sind erlaubt.
  • Befülltes Array → nur die gelisteten Methoden, sofern ihr Gateway aktiv konfiguriert ist.
Beim Speichern validiert Fynn, dass jeder Wert auf ein für die Organisation aktiv konfiguriertes Payment-Gateway abbildbar ist. Die im Kontext verfügbaren Methoden liefert GET /api/sales-channels/payment-methods/available.

Eigene Domains

Jeder Kanal hat genau eine Standard-Domain (automatisch, nicht editierbar) und optional eine eigene Domain. Ein einzelner CNAME genügt, das TLS-Zertifikat wird automatisch ausgestellt und erneuert. Es gibt keinen selbstverwalteten TXT-Nachweis.

Domain hinzufügen

Die Antwort enthält die DNS-Anweisungen und beide Status:
dnsInstructions enthält immer den CNAME und zusätzlich etwaige Validierungs-Einträge, die du ebenfalls anlegen musst.

Die zwei Status

Eine eigene Domain hat zwei voneinander unabhängige Status: Die Domain wird erst produktiv (und zur Standard-Adresse des Kanals), wenn sslStatus = active ist. Ab da löst Fynn Anfragen über diese Domain auf den Kanal auf.

Verifizieren

POST /api/sales-channels/{id}/custom-domain/verify prüft den Status einmal synchron:
  • Ist der Status active, wird die Domain verifiziert und zur Standard-Customerfront-Domain des Kanals befördert.
  • pending / pending_validation werden ohne Fehler zurückgegeben, versuche es später erneut.
  • error (das Zertifikat kann nicht ausgestellt werden) führt zu einer Fehlerantwort.
Du musst nicht aktiv pollen: Ein wiederkehrender Reconcile-Job prüft den SSL-Status im Hintergrund und schaltet die Domain frei, sobald das Zertifikat steht. Der Verify-Endpunkt ist nur der „jetzt prüfen”-Pfad und idempotent, eine bereits aktive Domain bleibt unverändert.

Entfernen

DELETE /api/sales-channels/{id}/custom-domain entfernt die eigene Domain und setzt die Kanal-Adresse auf die Standard-Domain zurück. Der Checkout bleibt also durchgehend erreichbar.

Weiterleitungs-URLs und returnUrl

Die optionalen URLs auf dem Kanal steuern, wohin der Kunde nach dem Zahlvorgang geleitet wird. Bleibt eine URL leer, fällt der Kunde auf die Standardseite der Kundenfront (/self-service/transaction/{status}) zurück. Startest du Payment-Method-Setups über die API, wird nach Abschluss die Kanal-returnUrl aufgerufen. Lässt du sie leer, kannst du pro Request dynamisch ein redirectUrl im PaymentMethodSetup mitgeben, das stattdessen verwendet wird.

Webhooks

Jeder ausgehende Webhook trägt den Header X-Sales-Channel mit dem technischen Namen des Kanals, dem das auslösende Objekt zugeordnet ist (oder default, wenn keiner gesetzt ist). So routest du eingehende Events empfängerseitig nach Marke, ohne den Payload zu parsen.

Verwandte Themen

Vertriebskanäle (Anleitung)

Die Einstellungen in der Wallet, Schritt für Schritt mit Screenshots.

Kunden

Kundenverwaltung und das salesChannel-Feld im Kontext.

Eigene E-Mail-Domain

Sendedomain pro Kanal einrichten.

Webhooks

Echtzeit-Events empfangen und nach Kanal routen.