Ein Kunde widerruft, ein Teil kommt beschädigt zurück, ein anderes passt nicht. Drei verschiedene Vorgänge, die im Alltag oft in derselben Gutschrift verschwinden. Am Monatsende stimmt dann weder das Lager noch die Buchhaltung, und niemand kann sagen, welche Erstattung zu welcher Rücksendung gehörte.
Der Vertrag trennt die drei Vorgänge deshalb und verbindet sie über Kennungen: Die Erstattung verweist immer auf den Auftrag und, wenn returnId gesetzt ist, auf die Rücksendung. Damit lässt sich jede erfasste Erstattung einem Auftrag zuordnen und bei gesetzter Rücksendung auch dieser — rückwärts wie vorwärts.
| Fläche | Rollen |
|---|---|
| Commerce | Teilehandel, Fahrzeughandel |
Was dieser Fall voraussetzt
- Ein Auftrag mit Positionen. Storniert und zurückgenommen wird je Position und Menge, nicht pauschal; erstattet wird ein Betrag zum Auftrag.
- Ein Zeitpunkt des Eintreffens. Die angemeldete Rücksendung ist etwas anderes als die eingetroffene; den Eingang hält
receivedAtfest. An dieses Feld knüpft der Vertrag die Erstattung nicht. - Begründungen je Vorgang. Widerruf, Transportschaden und Fehlbestellung sind drei Gründe mit drei Folgen für das Lager.
- Eine Buchhaltung, die Korrekturbelege verarbeitet. Korrekturbelege stehen getrennt von der Rechnung und verweisen auf Rechnung und Auftrag; einen Verweis auf Erstattung oder Rücksendung enthalten sie nicht.
Der Ablauf
Die Tabelle nennt je Stufe den zuständigen Aufruf und das, was danach vorliegt. Die Begründung, warum die Stufe nicht übersprungen werden kann, steht darunter.
| Stufe | Aufruf | Was danach vorliegt |
|---|---|---|
| Vor dem Versand stornieren | POST /commerce/v1/cancellations | reasonCode für die Stornierung, Mengen je Position; storniert wird die Menge, nicht pauschal der Auftrag |
| Rücksendung erfassen | POST /commerce/v1/returns | receivedAt trennt die angemeldete von der eingetroffenen Rücksendung |
| Erstatten | POST /commerce/v1/refunds | amount mit amountMinor und currency, gebunden an salesOrderId; returnId optional |
| Beleg ziehen | GET /commerce/v1/credit-notes | Korrekturbelege mit Verweis auf Rechnung (invoiceId) und Auftrag (salesOrderId) |
Warum jede Stufe nötig ist
- Vor dem Versand stornieren.
POST /commerce/v1/cancellationsnimmtsalesOrderId,reasonCodeund die Positionen mit Mengen. Solange nichts das Haus verlassen hat, ist das der günstigste Weg — es entsteht keine Rücksendung, die niemand bezahlen will. - Die Rücksendung erfassen.
POST /commerce/v1/returnsträgtreceivedAt. Dieses Feld trennt die Ankündigung von der Tatsache. An dieses Feld knüpft der Vertrag die Erstattung nicht. - Erstatten.
POST /commerce/v1/refundsnimmtsalesOrderId,amountmitamountMinorundcurrencysowiereasonCode;returnIdist optional. Gehört die Erstattung zu einer Rücksendung, sollte diese Bindung überreturnIdgesetzt werden, denn der Vertrag erzwingt sie nicht: Eine Erstattung ohne Vorgang lässt sich später niemandem erklären. - Den Beleg ziehen.
GET /commerce/v1/credit-noteslistet Korrekturbelege, getrennt von der Rechnung; jeder verweist überinvoiceIdauf die Rechnung und übersalesOrderIdauf den Auftrag. Einen Verweis auf die Erstattung selbst sieht der Vertrag im Korrekturbeleg nicht vor; mit ihr teilt er nur densalesOrderId.
curl -X POST \
-H 'X-Api-Key: <API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: erstattung-4711-ruecksendung-1' \
-d '{"salesOrderId":"<salesOrderId>","returnId":"<returnId>","amount":{"amountMinor":8900,"currency":"EUR"},"reasonCode":"return"}' \
'https://commerce-preview.invalid/commerce/v1/refunds'Was am Ende vorliegt
Am Ende ist jede erfasste Erstattung über salesOrderId einem Auftrag zugeordnet, und jeder Korrekturbeleg verweist über invoiceId und salesOrderId auf Rechnung und Auftrag. Eine Erstattung, die mit returnId angelegt wurde, lässt sich zu ihrer Rücksendung zurückverfolgen.
Wo das in der Dokumentation steht
Die verbindlichen Feldlisten, Fehlercodes und Beispielantworten stehen im OpenAPI-Vertrag dieser Fläche unter docs.tapinomahub.com (tapinoma-commerce). Alle Anwendungsfälle nach Fläche und Rolle geordnet: Übersicht der Anwendungsfälle.
Quellen und Rechtsgrundlagen
Häufige Fragen
Warum nicht einfach stornieren und gut?
Weil ein Storno vor dem Versand etwas anderes ist als eine Rücksendung danach. Das erste berührt das Lager nicht, das zweite schon — und nur das zweite braucht eine Wareneingangsprüfung.
Was, wenn der Kunde die Rücksendung ankündigt, aber nichts kommt?
Dann gibt es einen Vorgang ohne Eintreffen. Der Zeitpunkt des Eingangs receivedAt bleibt dann leer. An dieses Feld knüpft der Vertrag die Erstattung nicht; ob erstattet wird, entscheiden Sie.
Kann ich teilweise erstatten?
Ja. Die Erstattung trägt einen Betrag und ist an den Auftrag gebunden, optional auch an die Rücksendung; der Zahlungsstatus des Auftrags kennt partially_refunded. Erstattungen sind im Vertrag noch nicht aktiviert.
