Storno, Rücksendung und Erstattung als ein VorgangAlle Beiträge

Storno, Rücksendung und Erstattung als ein Vorgang

Eine Erstattung ohne erfassten Vorgang ist ein Verlust ohne Beleg. Dieser Fall zeigt die Kette von der Stornierung über Rücksendung und Erstattung bis zum Korrekturbeleg.

Veröffentlicht: 2026-09-12Lesezeit: 4 mintapinomahub API & Prozesse
API & ProzesseLogistik & LagerAutomotive AftermarketAPITeilehandelFahrzeughandel

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.

Storno, Rücksendung und Erstattung als ein VorgangEingang: ein Kunde will nicht mehr, oder die Ware ist zurück auf dem Hof 1. Vor dem Versand stornieren (POST /commerce/v1/cancellations): reasonCode für die Stornierung, Mengen je Position; storniert wird die Menge, nicht pauschal der Auftrag 2. Rücksendung erfassen (POST /commerce/v1/returns): receivedAt trennt die angemeldete von der eingetroffenen Rücksendung 3. Erstatten (POST /commerce/v1/refunds): amount mit amountMinor und currency, gebunden an salesOrderId; returnId optional 4. Beleg ziehen (GET /commerce/v1/credit-notes): Korrekturbelege mit Verweis auf Rechnung (invoiceId) und Auftrag (salesOrderId) Ausgang: eine Erstattung, die dem Auftrag und, wo angegeben, der Rücksendung zugeordnet ist Eine Erstattung verweist auf den Auftrag und optional über returnId auf die Rücksendung. Eine Erstattung ohne Vorgang ist ein Verlust ohne Beleg.Storno, Rücksendung und Erstattung als ein VorgangEingang: ein Kunde will nicht mehr, oder die Ware ist zurück auf dem Hof01Vor dem Versand stornierenPOST /commerce/v1/cancellationsreasonCode für die Stornierung, Mengen je Position; storniert wird die Menge, nicht pauschalder Auftrag02Rücksendung erfassenPOST /commerce/v1/returnsreceivedAt trennt die angemeldete von der eingetroffenen Rücksendung03ErstattenPOST /commerce/v1/refundsamount mit amountMinor und currency, gebunden an salesOrderId; returnId optional04Beleg ziehenGET /commerce/v1/credit-notesKorrekturbelege mit Verweis auf Rechnung (invoiceId) und Auftrag (salesOrderId)Ausgang: eine Erstattung, die dem Auftrag und, wo angegeben, der Rücksendung zugeordnet istEine Erstattung verweist auf den Auftrag und optional über returnId auf die Rücksendung. Eine Erstattung ohneVorgang ist ein Verlust ohne Beleg.
Vier Aufrufe der Rückabwicklung. Die Erstattung hängt am Auftrag und, wo angegeben, an einer erfassten Rücksendung.

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ächeRollen
CommerceTeilehandel, 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 receivedAt fest. 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.

Die Aufrufkette dieses Anwendungsfalls
StufeAufrufWas danach vorliegt
Vor dem Versand stornierenPOST /commerce/v1/cancellationsreasonCode für die Stornierung, Mengen je Position; storniert wird die Menge, nicht pauschal der Auftrag
Rücksendung erfassenPOST /commerce/v1/returnsreceivedAt trennt die angemeldete von der eingetroffenen Rücksendung
ErstattenPOST /commerce/v1/refundsamount mit amountMinor und currency, gebunden an salesOrderId; returnId optional
Beleg ziehenGET /commerce/v1/credit-notesKorrekturbelege mit Verweis auf Rechnung (invoiceId) und Auftrag (salesOrderId)

Warum jede Stufe nötig ist

  1. Vor dem Versand stornieren. POST /commerce/v1/cancellations nimmt salesOrderId, reasonCode und 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.
  2. Die Rücksendung erfassen. POST /commerce/v1/returns trägt receivedAt. Dieses Feld trennt die Ankündigung von der Tatsache. An dieses Feld knüpft der Vertrag die Erstattung nicht.
  3. Erstatten. POST /commerce/v1/refunds nimmt salesOrderId, amount mit amountMinor und currency sowie reasonCode; returnId ist optional. Gehört die Erstattung zu einer Rücksendung, sollte diese Bindung über returnId gesetzt werden, denn der Vertrag erzwingt sie nicht: Eine Erstattung ohne Vorgang lässt sich später niemandem erklären.
  4. Den Beleg ziehen. GET /commerce/v1/credit-notes listet Korrekturbelege, getrennt von der Rechnung; jeder verweist über invoiceId auf die Rechnung und über salesOrderId auf den Auftrag. Einen Verweis auf die Erstattung selbst sieht der Vertrag im Korrekturbeleg nicht vor; mit ihr teilt er nur den salesOrderId.
Eine Erstattung gegen eine erfasste Rücksendung buchen
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.