Vom eingegangenen Auftrag zur gemeldeten SendungAlle Beiträge

Vom eingegangenen Auftrag zur gemeldeten Sendung

Teillieferungen sind im Teilehandel der Normalfall. Dieser Fall zeigt, warum Entscheidung und Sendung positionsbezogen sind und nicht auftragsbezogen.

Veröffentlicht: 2026-09-12Lesezeit: 4 mintapinomahub API & Prozesse
API & ProzesseAutomotive AftermarketTeilehandelAPIFahrzeughandelLogistik & Lager

Ein Auftrag über drei Positionen kommt herein. Zwei Teile liegen im Regal, das dritte ist beim Nachzählen nicht auffindbar. Ein System, das nur den ganzen Auftrag annehmen oder ablehnen kann, zwingt jetzt zu einer schlechten Entscheidung: alles stornieren oder etwas versprechen, was nicht da ist.

Vom eingegangenen Auftrag zur gemeldeten SendungEingang: ein Auftrag, der auf einem Kanal entstanden ist und im eigenen System landen muss 1. Aufträge abholen (GET /commerce/v1/orders): Seitenweise mit nextCursor; die Cursor-Paginierung ist stabil 2. Auftrag lesen (GET /commerce/v1/orders/{salesOrderId}): lines, totals, taxes, fees sowie shipTo und billTo getrennt ausgewiesen 3. Entscheiden (POST /commerce/v1/orders/{salesOrderId}/decision): Annahme oder Ablehnung je Position mit reasonCode statt stillem Verfallen 4. Sendung melden (POST /commerce/v1/shipments): carrierCode, trackingReference und shippedAt je Sendung, dazu die Positionen mit Mengen Ausgang: eine Entscheidung je Position und eine gemeldete Sendung mit Mengen und trackingReference Teilmengen sind der Normalfall, nicht der Sonderfall. Eine Sendung nennt die versandten Positionen mit Mengen und hält die Teillieferung nachvollziehbar.Vom eingegangenen Auftrag zur gemeldeten SendungEingang: ein Auftrag, der auf einem Kanal entstanden ist und im eigenen System landen muss01Aufträge abholenGET /commerce/v1/ordersSeitenweise mit nextCursor; die Cursor-Paginierung ist stabil02Auftrag lesenGET /commerce/v1/orders/{salesOrderId}lines, totals, taxes, fees sowie shipTo und billTo getrennt ausgewiesen03EntscheidenPOST /commerce/v1/orders/{salesOrderId}/decisionAnnahme oder Ablehnung je Position mit reasonCode statt stillem Verfallen04Sendung meldenPOST /commerce/v1/shipmentscarrierCode, trackingReference und shippedAt je Sendung, dazu die Positionen mit MengenAusgang: eine Entscheidung je Position und eine gemeldete Sendung mit Mengen und trackingReferenceTeilmengen sind der Normalfall, nicht der Sonderfall. Eine Sendung nennt die versandten Positionen mit Mengenund hält die Teillieferung nachvollziehbar.
Vier Aufrufe vom Abholen bis zur Sendung. Entschieden und versandt wird je Position, nicht je Auftrag.

Deshalb sind Entscheidung und Sendung in diesem Vertrag positionsbezogen. Die Teilmenge ist nicht der Sonderfall, für den es einen Umweg gibt, sondern der vorgesehene Weg — und abgeholt wird mit einer Cursor-Paginierung, die der Vertrag als stabil beschreibt.

FlächeRollen
CommerceTeilehandel, Fahrzeughandel, Softwarehaus

Was dieser Fall voraussetzt

  • Ein gespeicherter Cursor. Mit dem zuletzt erhaltenen nextCursor setzen Sie den seitenweisen Abruf fort; der Abgleich arbeitet dagegen mit eigenen Prüfpunkten.
  • Eine Zuordnung der Positionen zu Ihrem Lager. Die Entscheidung je Position setzt voraus, dass Sie je Position wissen, was verfügbar ist.
  • Begründungen, die Sie vertreten können. Eine Ablehnung trägt einen reasonCode.
  • Die Bereitschaft, Teilmengen zu versenden. Wer nur vollständig liefert, verschenkt die zwei Positionen, die da sind.

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
Aufträge abholenGET /commerce/v1/ordersSeitenweise mit nextCursor; die Cursor-Paginierung ist stabil
Auftrag lesenGET /commerce/v1/orders/{salesOrderId}lines, totals, taxes, fees sowie shipTo und billTo getrennt ausgewiesen
EntscheidenPOST /commerce/v1/orders/{salesOrderId}/decisionAnnahme oder Ablehnung je Position mit reasonCode statt stillem Verfallen
Sendung meldenPOST /commerce/v1/shipmentscarrierCode, trackingReference und shippedAt je Sendung, dazu die Positionen mit Mengen

Warum jede Stufe nötig ist

  1. Die Aufträge abholen. GET /commerce/v1/orders liefert seitenweise mit nextCursor. Der Vertrag beschreibt diese Cursor-Paginierung als stabil.
  2. Den Auftrag lesen. GET /commerce/v1/orders/{salesOrderId} gibt lines, totals, taxes und fees sowie shipTo und billTo getrennt zurück. Die Trennung ist wichtig für die Buchhaltung: Eine Gebühr ist kein Rabatt, und eine Versandkostenposition ist kein Artikelpreis.
  3. Entscheiden. POST /commerce/v1/orders/{salesOrderId}/decision nimmt je Position Annahme oder Ablehnung mit reasonCode und Menge. Statt eines Auftrags, der stillschweigend verfällt, steht hier eine benannte Entscheidung; ob sie bestätigt ist, zeigt acknowledgementStatus.
  4. Die Sendung melden. POST /commerce/v1/shipments nimmt salesOrderId, die Positionen mit Mengen, carrierCode, trackingReference und shippedAt. Positionsgenau, weil zwei Teile heute und eines nächste Woche rausgehen darf, ohne dass der Auftrag den Zustand verliert.
Eine Teilsendung positionsgenau melden
curl -X POST \
  -H 'X-Api-Key: <API_KEY>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: sendung-4711-position-1' \
  -d '{"salesOrderId":"<salesOrderId>","lines":[{"lineId":"<lineId>","quantity":1}],"carrierCode":"DHL","trackingReference":"00340434","shippedAt":"2026-09-12T09:30:00Z"}' \
  'https://commerce-preview.invalid/commerce/v1/shipments'

Was am Ende vorliegt

Am Ende steht ein Auftrag mit einer Entscheidung je Position und gemeldeten Sendungen; Abweichungen im Auftrags- und Sendungszustand zwischen Kanal und Ihrem System stellt ein Abgleich fest, der im Vertrag noch nicht aktiviert ist. Dazu kommt ein Kunde, der eine Teillieferung mit Sendungsverfolgung bekommt statt einer Stornierung. Die abgelehnte Position trägt einen Grund, den man nachlesen kann.

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

Muss ich den Cursor speichern?

Um den Abruf fortzusetzen, ja: Mit dem gespeicherten nextCursor holen Sie die nächste Seite. Abweichungen zwischen Quelle und Ziel stellt der Abgleich über eigene Prüfpunkte fest, nicht der Auftrags-Cursor.

Kann ich eine einzelne Position ablehnen?

Genau dafür ist die Entscheidung positionsbezogen. Sie nennt je Position Menge und Grund; was mit den übrigen Positionen geschieht, legt der Vertrag nicht fest.

Warum stehen Gebühren in einem eigenen Feld?

Weil sie etwas anderes sind als der Artikelpreis: Auftrag und Position führen jeweils ein eigenes Feld fees, an der Position getrennt von unitPrice und itemSubtotal. Wer sie verrechnet, kann die einzelnen Gebührenbeträge später nicht mehr getrennt nachvollziehen.