AUSSCHREIBUNGEine Ausschreibung gewonnen, die PunchOut verlangt?Tender Kit herunterladen

Individueller Shop · Entwickler

PunchOut-Integrationsspezifikation für individuelle Shops

Was Ihr individueller oder Headless-Shop implementieren muss, um mit dem PunchOut Rocket Gateway dieselben Funktionen wie unsere Plugins zu bieten: PunchOut-Sitzungen mit automatischer Anmeldung, Warenkorbrückgabe, Kategoriezuordnung sowie mit dem Premium-Tarif Bestellungen, Auftragsbestätigungen und Versandmeldungen. Das Gateway übernimmt cXML und OCI gegenüber dem Kunden.

  • Dieselben Funktionen wie die Plugins
  • JSON über HTTPS
  • cXML und OCI übernimmt das Gateway

Was Ihr Shop implementiert

Jede Funktion ist ein kleiner JSON-Endpunkt oder ein Browserformular in Ihrem Shop. Implementieren Sie zuerst die erforderlichen Funktionen; Bestellungen und deren Aktualisierungen können folgen.

Funktionen, Implementierung im Shop und erforderlicher Tarif
AbschnittFunktionWas Ihr Shop implementiertErforderlichTarif
2–3PunchOut-Sitzung (create, edit, inspect) mit automatischer AnmeldungKlon-Endpunkt und SSO-AnmeldungJaAlle Lizenzen
4Warenkorbübertragung zurück an das EinkaufssystemAutomatisch gesendetes Formular an PunchOut RocketJaAlle Lizenzen
5Kategoriezuordnung, zum Beispiel UNSPSCKategorien-EndpunktEmpfohlenAlle Lizenzen
6Bestellungen (cXML OrderRequest)Endpunkt zur AuftragserstellungOptionalPremium-Tarif
7Auftragsbestätigungen und Versandmeldungen (cXML ConfirmationRequest, ShipNoticeRequest)Auftragsstatus-EndpunktOptional, benötigt 6Premium-Tarif + Option OC & ASN
8Sofortige AuftragsaktualisierungenBenachrichtigung an PunchOut RocketOptional, benötigt 7Premium-Tarif + Option OC & ASN
–Vordefinierte WarenkörbeNichts: PunchOut Rocket zeigt sie dem Kunden und sendet den gewählten Warenkorb selbst an das Einkaufssystem–Premium-Tarif

Die kostenlose Testphase umfasst die Funktionen des Premium-Tarifs. Auftragsbestätigungen und Versandmeldungen sind eine Option des Premium-Tarifs (OC & ASN): Kontaktieren Sie uns zur Aktivierung.

1. Einrichtung in PunchOut Rocket

E-Commerce-Website

Website-Felder für eine individuelle Plattform
FeldWert
E-commerce PlatformCustom
Site URLBasis-URL Ihres Shops, zum Beispiel https://your-store.example.com. Sie kann einen Pfad enthalten (https://example.com/shop); ein abschließender / wird entfernt
API KeyEin Geheimnis mit mindestens 10 Zeichen. PunchOut Rocket sendet es bei jedem Aufruf Ihres Shops: Der Shop muss denselben Wert kennen
Custom Clone EndpointPfad des Klon-Endpunkts. Wenn leer: /api/punchout/clone
Custom Categories EndpointPfad des Kategorien-Endpunkts. Wenn leer: /api/punchout/categories
Custom Create Order EndpointPfad des Endpunkts zur Auftragserstellung. Wenn leer: /api/punchout/create-order
Custom Order Status EndpointPfad des Auftragsstatus-Endpunkts. Wenn leer: /api/punchout/order-status
Use Reverse Proxy, Reverse Proxy URLStandardmäßig aktiviert. Reverse Proxy URL ist schreibgeschützt und wird aus Site Name erzeugt, zum Beispiel https://your-store.punchoutrocket.com: Kunden öffnen darüber Ihren Shop, wodurch SameSite- und CORS-Probleme in Einkaufssystemen vermieden werden. Schema und Host der zurückgegebenen sso_url werden durch die dieser URL ersetzt; Pfad und Abfrage bleiben erhalten

Endpunktpfade werden unverändert an Site URL angehängt und müssen deshalb mit / beginnen. Beispiel: Site URL https://your-store.example.com + /api/punchout/clone → https://your-store.example.com/api/punchout/clone.

Formular Add E-commerce Site für eine individuelle Plattform: Site Name, Site URL, Use Reverse Proxy mit schreibgeschützter Reverse Proxy URL, die vier individuellen Endpunkte, API Key mit Generate, DUNS und ANID
Website-Einstellungen für eine individuelle Plattform

Bestellungen (Abschnitt 6) und vordefinierte Warenkörbe sind im Premium-Tarif enthalten, auch während der kostenlosen Testphase: Ihr Tarif aktiviert sie für die Website, und die Endkundenseite zeigt dann die Abschnitte Orders und Predefined Carts. Auftragsbestätigungen und Versandmeldungen (Abschnitte 7–8) benötigen zusätzlich die Option OC & ASN.

Endkunde

Jedes Kundenunternehmen ist ein Endkunde Ihrer Website. Neben seinen Protokoll-Zugangsdaten (cXML-Identitäten und Shared Secret oder OCI-Benutzername und Passwort) betreffen diese Felder Ihren Shop:

Endkundenfelder, die Ihren Shop betreffen
FeldVerwendet für
E-commerce User to CloneBenutzername (oder E-Mail-Adresse) eines Shop-Benutzers. Wird als username an den Klon-Endpunkt und als customer_email zur Auftragserstellung gesendet: Die PunchOut-Benutzer des Kunden werden daraus geklont und seine Aufträge diesem Benutzer zugeordnet. Weisen Sie ihm die für diesen Kunden vorgesehenen Preise, Rabatte und Adressen zu
Default UNSPSCKategoriecode für Produkte, deren Kategorien keinen zugeordneten Code haben (Abschnitt 5)
Default Lead TimeLieferzeit in Tagen, die mit jedem OCI-Artikel gesendet wird (Standard 3)
EA Override, BX OverrideErsetzen die von Ihrem Shop gesendete Maßeinheit EA oder BX (Abschnitt 4) durch den vom Kunden erwarteten Code. Gilt nur, wenn Ihr Shop diesen Code sendet: Eine leere Einheit wird ohne Überschreibung zu EA
Category MappingIhre mit „Update from e-commerce“ geladenen Kategorien, jeweils einem Code zugeordnet (Abschnitt 5)
Shipping Method, Payment MethodWerden zur Auftragserstellung gesendet (Abschnitt 6). Leer lassen, damit Ihr Shop seine Standardwerte verwendet
Send order status updates, Order status URL, Supplier shared secretAktivieren die Abschnitte 7–8 für diesen Kunden: URL und Geheimnis stammen aus seinem Einkaufssystem
Seite Edit End Customer mit den Abschnitten General, PunchOut Connection, Cart Defaults, Category Mapping und Orders
Endkundeneinstellungen

Die übrigen Website- und Endkundenseiten funktionieren wie bei den anderen Plattformen: siehe Dokumentation.

Allgemeine Regeln

Sie gelten für jeden Aufruf Ihrer Endpunkte durch PunchOut Rocket (Abschnitte 2, 5, 6 und 7):

  • Methode und Format: immer POST mit JSON-Body (Content-Type: application/json). Antworten Sie mit JSON.
  • Authentifizierung: Der Body enthält immer api_key. Vergleichen Sie ihn mit dem im Shop konfigurierten Schlüssel und lehnen Sie den Aufruf bei Abweichung mit HTTP 401 ab.
  • Nur HTTPS.
  • Fehler: Antworten Sie mit einem HTTP-Status außerhalb von 2xx und {"status": "error", "message": "<reason>"} (error_code ist optional). Formulieren Sie die Meldung eindeutig, zum Beispiel Product X-100 not found: Sie erscheint in den Protokollen und Fehler-E-Mails an den Website-Inhaber.
  • Zeitlimits: Aufrufe zur Auftragserstellung und zum Auftragsstatus werden nach 30 Sekunden abgebrochen. Antworten Sie schnell und erledigen Sie langsame Arbeiten danach.

2. Klon-Endpunkt

Standardpfad: /api/punchout/clone. Wird aufgerufen, wenn ein Kunde Ihren Shop aus dem Einkaufssystem öffnet. Ihr Shop erstellt einen aus username geklonten Benutzer (oder verwendet ihn erneut), bindet ihn an diese PunchOut-Sitzung und gibt eine SSO-URL zurück, die ihn anmeldet (Abschnitt 3).

Anfrage-Body

Klon-Endpunkt: Anfragefelder
FeldTypBedeutung
usernamestring„E-commerce User to Clone“ des Endkunden
api_keystringAPI-Schlüssel der Website
session_tokenstringPunchOut-Sitzungs-ID (cXML BuyerCookie oder UUID für OCI). Aufbewahren: Sie wird im Warenkorbformular zurückgesendet (Abschnitt 4)
end_customer_idintegerEndkunden-ID in PunchOut Rocket. Aufbewahren: Sie wird im Warenkorbformular zurückgesendet (Abschnitt 4)
operationstringcreate, edit oder inspect bei cXML; bei OCI immer create
gateway_base_urlstringPunchOut Rocket Basis-URL: Das Warenkorbformular (Abschnitt 4) sendet an {gateway_base_url}/start-sso-checkout
selected_itemobject, optionalNur cXML: das vom Kunden im Katalog des Einkaufssystems gewählte Produkt. Enthält supplier_part_id (SKU) und/oder supplier_part_auxiliary_id (Produkt-ID), nur die vom Kunden gesendeten Werte
cart_itemsarray, optionalNur cXML edit und inspect: der wiederherzustellende Warenkorb. Fehlt, wenn das Kundensystem keine Artikel gesendet hat
Jeder Artikel aus cart_items, wie vom Einkaufssystem zurückgesendet
FeldTypBedeutung
skustringSKU (kann leer sein)
product_idstringProdukt-ID in Ihrem Shop (kann leer sein)
quantitystringMenge, zum Beispiel "2"
pricestringStückpreis, Punkt als Dezimaltrennzeichen, zum Beispiel "15.95". Nur zur Information: Der Warenkorb verwendet Ihre aktuellen Preise
descriptionstringProduktbeschreibung
currencystringISO-4217-Code

quantity und price sind Zeichenketten: Vor der Verwendung umwandeln.

Anfrage: create, mit gewähltem Artikel

{
  "username": "buyer123",
  "api_key": "site-api-key-abc",
  "session_token": "sess-012345",
  "operation": "create",
  "end_customer_id": 2,
  "gateway_base_url": "https://middleware.example.com",
  "selected_item": {
    "supplier_part_id": "X-100",
    "supplier_part_auxiliary_id": "19853"
  }
}

Anfrage: edit, mit dem wiederherzustellenden Warenkorb

{
  "username": "buyer123",
  "api_key": "site-api-key-abc",
  "session_token": "sess-67890",
  "operation": "edit",
  "end_customer_id": 2,
  "gateway_base_url": "https://middleware.example.com",
  "cart_items": [
    {"sku": "ABC-001", "product_id": "19852", "quantity": "2", "price": "15.95",
     "description": "Example description", "currency": "EUR"},
    {"sku": "XYZ-002", "product_id": "19854", "quantity": "1", "price": "249.00",
     "description": "Another example description", "currency": "EUR"}
  ]
}

Erfolgsantwort

HTTP 2xx

HTTP 200
{
  "status": "success",
  "sso_url": "https://your-store.example.com/punchout/sso?token=eyJ..."
}

sso_url ist das einzige gelesene Feld: Es ist erforderlich und muss eine absolute http://- oder https://-URL sein. PunchOut Rocket leitet den Browser des Kunden dorthin (bei cXML über das Einkaufssystem, bei OCI direkt).

Fehlerantworten

Jeder Status außerhalb von 2xx oder eine Antwort ohne gültige sso_url lässt den PunchOut scheitern: Der Kunde erhält einen Fehler im Einkaufssystem. Ihre Antwort (Status und Body) wird im PunchOut-Sitzungsprotokoll gespeichert; erläutern Sie deshalb den Grund in der Meldung.

Klon-Endpunkt: Fehlerantworten
HTTPWannBody
400Fehlende oder ungültige Felder{"status": "error", "error_code": "invalid_request", "message": "Missing field: operation"}
401Falscher api_key{"status": "error", "error_code": "unauthorized", "message": "Invalid api_key"}
422SSO nicht möglich, zum Beispiel username nicht gefunden{"status": "error", "error_code": "sso_unavailable", "message": "User buyer123 not found"}
500Interner Fehler{"status": "error", "error_code": "internal_error", "message": "..."}

3. SSO-Anmeldung

Wenn der Kunde sso_url öffnet, führt Ihr Shop Folgendes aus:

  1. verbraucht das Token (einmalige Verwendung) und meldet den geklonten Benutzer an;
  2. bei edit und inspect: füllt den Warenkorb exakt mit den Produkten und Mengen aus cart_items und zeigt ihn an (aktuelle Preise gelten);
  3. bei create: zeigt das Produkt selected_item, falls es gesendet wurde und noch existiert, sonst die Shop-Startseite.

Geben Sie dem Token einige Minuten statt Sekunden Gültigkeit: Bei Endkunden mit vordefinierten Warenkörben sieht der Kunde zuerst deren Auswahlseite und öffnet sso_url erst, wenn er zum Shop weitergeht.

4. Warenkorbübertragung (automatisch gesendetes Formular)

Bei PunchOut-Benutzern darf die Checkout-Schaltfläche nicht Ihren Checkout starten: Sie sendet stattdessen den Warenkorb an PunchOut Rocket. Ihr Shop gibt eine HTML-Seite zurück, die ein verborgenes Formular automatisch absendet, idealerweise mit einer Ladeanzeige.

  • URL: {gateway_base_url}/start-sso-checkout (gateway_base_url aus der Klonanfrage)
  • Methode: POST, application/x-www-form-urlencoded (normales Absenden eines Browserformulars)
  • Kein api_key: Die Sitzung wird durch session_token und end_customer_id identifiziert.
Felder der Warenkorbübertragung
FeldErforderlichBedeutung
session_tokenJaAus der Klonanfrage
end_customer_idJaAus der Klonanfrage
products[i][sku]JaSKU. Wird zur cXML SupplierPartID oder zur OCI-Lieferantenmaterialnummer
products[i][product_id]JaProdukt-ID in Ihrem Shop. Wird zur cXML SupplierPartAuxiliaryID: Der Kunde sendet sie bei edit und in Bestellungen zurück
products[i][description]JaProduktname oder -beschreibung. HTML-Tags werden entfernt
products[i][quantity]JaMenge, Punkt als Dezimaltrennzeichen
products[i][price]JaStückpreis, Punkt als Dezimaltrennzeichen, kein Tausendertrennzeichen
products[i][currency]JaISO-4217-Code
products[i][unit_of_measure]NeinUN/CEFACT-Einheitencode. Standard EA
products[i][manufacturer_name]NeinHersteller
products[i][category_ids]NeinKommagetrennte IDs der Kategorien, denen das Produkt direkt angehört (Blätter des Baums), wie vom Kategorien-Endpunkt zurückgegeben (Abschnitt 5). Dienen zur Ermittlung des UNSPSC des Produkts

i beginnt bei 0 und ist lückenlos: PunchOut Rocket beendet das Lesen beim ersten fehlenden Index. Denken Sie daran, die Werte für HTML zu maskieren.

Beispielseite, die beim Checkout zurückgegeben wird

<!doctype html>
<html>
<body>
<p>Sending your cart to your procurement system…</p>
<form id="punchout_repost" method="post" action="https://middleware.example.com/start-sso-checkout">
  <input type="hidden" name="session_token" value="sess-012345"/>
  <input type="hidden" name="end_customer_id" value="2"/>
  <input type="hidden" name="products[0][sku]" value="ABC-001"/>
  <input type="hidden" name="products[0][product_id]" value="19852"/>
  <input type="hidden" name="products[0][description]" value="Example description"/>
  <input type="hidden" name="products[0][quantity]" value="2"/>
  <input type="hidden" name="products[0][price]" value="15.95"/>
  <input type="hidden" name="products[0][currency]" value="EUR"/>
  <input type="hidden" name="products[0][unit_of_measure]" value="EA"/>
  <input type="hidden" name="products[0][manufacturer_name]" value="3M"/>
  <input type="hidden" name="products[0][category_ids]" value="1145,3398"/>
  <input type="hidden" name="products[1][sku]" value="XYZ-002"/>
  <input type="hidden" name="products[1][product_id]" value="19854"/>
  <input type="hidden" name="products[1][description]" value="Another example description"/>
  <input type="hidden" name="products[1][quantity]" value="4"/>
  <input type="hidden" name="products[1][price]" value="10.90"/>
  <input type="hidden" name="products[1][currency]" value="EUR"/>
  <input type="hidden" name="products[1][manufacturer_name]" value="DEWALT"/>
  <input type="hidden" name="products[1][category_ids]" value="2146"/>
</form>
<script>document.getElementById('punchout_repost').submit();</script>
</body>
</html>

PunchOut Rocket sendet den Warenkorb dann an das Einkaufssystem und beendet die Sitzung. Eine Sitzung akzeptiert nur einen Warenkorb:

Warenkorbübertragung: Fehlerantworten
HTTPWann
400session_token oder end_customer_id fehlt oder ist ungültig, oder keine Sitzung stimmt überein
409Für diese Sitzung wurde bereits ein Warenkorb gesendet

5. Kategorien-Endpunkt

Standardpfad: /api/punchout/categories. Wird aufgerufen, wenn der Website-Inhaber im Category Mapping eines Endkunden auf „Update from e-commerce“ klickt. Die Kategorien werden dann manuell den Codes des Kunden zugeordnet, zum Beispiel UNSPSC.

Anfrage

{"api_key": "site-api-key-abc"}

Erfolg: HTTP 200, status success oder ok

HTTP 200
{
  "status": "success",
  "categories": [
    {"id": 1345, "name": "Office Supplies", "parent_id": 0},
    {"id": 1847, "name": "Pens", "parent_id": 1345},
    {"id": 2345, "name": "Electronics", "parent_id": 0}
  ]
}
Kategorien: Felder
FeldBedeutung
idKategorie-ID in Ihrem Shop, Ganzzahl ungleich 0: dieselben IDs, die Sie in category_ids senden (Abschnitt 4)
nameAnzeigename. Kategorien ohne Namen werden übersprungen
parent_idID der übergeordneten Kategorie, 0 für oberste Kategorien

Geben Sie den gesamten Baum in einer Antwort zurück. Jede Aktualisierung gleicht die Endkundenliste an Ihre Antwort an: Nicht mehr zurückgegebene Kategorien werden samt zugeordnetem Code entfernt. Halten Sie die IDs daher stabil.

Category Mapping mit der Schaltfläche Update from e-commerce und einem Kategoriebaum mit UNSPSC-Codes
Category Mapping eines Endkunden

So erhält ein Warenkorbprodukt seinen Code:

  1. der einer seiner category_ids zugeordnete Code;
  2. sonst der Code der nächsten übergeordneten Kategorie, die einen besitzt;
  3. sonst der Default UNSPSC des Endkunden.

6. Endpunkt zur Auftragserstellung

Standardpfad: /api/punchout/create-order. Wird aufgerufen, wenn das Einkaufssystem des Kunden eine Bestellung sendet (cXML OrderRequest). Ihr Shop erstellt den Auftrag und gibt dessen ID sowie die ID der für jede PO-Zeile erstellten Auftragsposition zurück. PunchOut Rocket antwortet dem Einkaufssystem mit dem Ergebnis. Erfordert das Premium-Tarif.

Der Kunde sendet Bestellungen an die „Order request URL“ im Bereich Orders des Endkunden. Dort werden auch Shipping Method, Payment Method und die Auftragsstatus-Aktualisierungen (Abschnitt 7) eingestellt:

Bereich Orders eines Endkunden mit Order request URL, Shipping Method, Payment Method und Schalter Send order status updates mit Order status URL und Supplier shared secret
Orders-Einstellungen des Endkunden

Anfrage-Body

Auftragserstellung: Anfragefelder
FeldTypBedeutung
api_keystringAPI-Schlüssel der Website
gateway_urlstringPunchOut Rocket Basis-URL für die Statusbenachrichtigung (Abschnitt 8)
customer_emailstring„E-commerce User to Clone“ des Endkunden (derselbe Wert wie username in der Klonanfrage, daher nicht unbedingt eine E-Mail-Adresse): Ordnen Sie den Auftrag diesem Benutzer zu
order_idstringPO-Nummer des Kunden. Im Auftrag speichern: Das ist die dem Kunden bekannte Referenz
order_datestringPO-Datum, wie vom Kunden gesendet (ISO 8601)
currencystringISO 4217
totalstringPO-Gesamtbetrag, Punkt als Dezimaltrennzeichen
shipping_methodstringShipping Method des Endkunden. Kann leer sein: Verwenden Sie Ihren Standardwert
payment_methodstringPayment Method des Endkunden, zum Beispiel Überweisung. Kann leer sein: Verwenden Sie Ihren Standardwert
billing_address, shipping_addressobjectname, street (mehrere durch \n getrennte Zeilen, zum Beispiel eine „Attn:“-Zeile vor der Straße), city, state, postal_code, country_code (ISO 3166-1 alpha-2), email. In der PO fehlende Felder sind leere Zeichenketten
itemsarrayPO-Zeilen, siehe unten
Auftragserstellung: jeder Artikel
FeldTypBedeutung
line_numberstringPO-Zeilennummer: In der Antwort zurückgeben
skustringSKU (cXML SupplierPartID)
product_idstringProdukt-ID (cXML SupplierPartAuxiliaryID). Kann leer sein: Dann das Produkt anhand von sku suchen
quantityintegerBestellte Menge
unit_pricestringStückpreis in der PO (vom Kunden freigegebener Preis), Punkt als Dezimaltrennzeichen
currencystringISO 4217
descriptionstringZeilenbeschreibung

Anfrage

{
  "api_key": "site-api-key-abc",
  "gateway_url": "https://middleware.example.com",
  "customer_email": "buyer123",
  "order_id": "PO-4500123",
  "order_date": "2026-11-10T10:00:00+01:00",
  "currency": "EUR",
  "total": "280.90",
  "shipping_method": "Standard",
  "payment_method": "Bank transfer",
  "billing_address": {"name": "ACME Spa", "street": "Via Roma 1", "city": "Milano",
    "state": "MI", "postal_code": "20100", "country_code": "IT", "email": "ap@acme.example"},
  "shipping_address": {"name": "ACME Spa - Warehouse", "street": "Attn: Mario Rossi\nVia Milano 5",
    "city": "Torino", "state": "TO", "postal_code": "10100", "country_code": "IT", "email": ""},
  "items": [
    {"line_number": "1", "sku": "ABC-001", "product_id": "19852", "quantity": 2,
     "unit_price": "15.95", "currency": "EUR", "description": "Example description"},
    {"line_number": "2", "sku": "XYZ-002", "product_id": "19854", "quantity": 1,
     "unit_price": "249.00", "currency": "EUR", "description": "Another example description"}
  ]
}

Erfolgsantwort

HTTP 2xx

HTTP 200
{
  "status": "success",
  "order_id": "100045",
  "items": [
    {"line_number": "1", "order_item_id": "5501"},
    {"line_number": "2", "order_item_id": "5502"}
  ]
}
Auftragserstellung: Antwortfelder
FeldErforderlichBedeutung
statusJaExakt success
order_idJaAuftrags-ID in Ihrem Shop: PunchOut Rocket übergibt sie an den Auftragsstatus-Endpunkt (Abschnitt 7). Sie darf sich während der Lebensdauer des Auftrags nicht ändern
itemsEmpfohlenFür jede erstellte PO-Zeile die ID ihrer Auftragsposition (dieselben IDs wie in der Antwort des Status-Endpunkts). Werden zwei Zeilen zu derselben Auftragsposition (gleiches Produkt), führen Sie beide line_number-Werte mit dieser order_item_id auf

items ermöglicht PunchOut Rocket, die PO zeilenweise zu bestätigen und Versandmeldungen zu senden. Ohne dieses Feld können Teilbestätigungen und Teilsendungen nicht gemeldet werden: Der Auftrag wird vollständig bestätigt und nur die erste Sendung als vollständige Lieferung gemeldet.

Fehler

Jeder Status außerhalb von 2xx oder ein status ungleich success bedeutet, dass der Auftrag nicht erstellt wurde: Das Einkaufssystem erhält einen Fehler und der Website-Inhaber eine E-Mail mit Ihrer Meldung. Typische Fälle: customer_email nicht gefunden, Produkt nicht gefunden, Auftrag kann nicht erstellt werden.

Wird ein Produkt nicht gefunden, können Sie den Auftrag ohne dieses Produkt erstellen und dessen line_number in items weglassen: Diese Zeile wird dann in der Auftragsbestätigung abgelehnt.

PunchOut Rocket erkennt keine doppelt gesendete PO: Wenn Ihr Shop bereits einen Auftrag für diese order_id und diesen Benutzer hat, geben Sie ihn zurück, statt einen zweiten zu erstellen.

7. Auftragsstatus-Endpunkt

Standardpfad: /api/punchout/order-status. Wird nur für Endkunden mit aktiviertem „Send order status updates“ und für Aufträge aus Abschnitt 6 aufgerufen: stündlich für 60 Tage ab Auftrag und sofort nach einer Benachrichtigung (Abschnitt 8). Erfordert die Option OC & ASN. Aus der Antwort sendet PunchOut Rocket an das Einkaufssystem des Kunden:

  • eine Auftragsbestätigung (cXML ConfirmationRequest), einmalig, wenn der Auftrag angenommen oder storniert wird;
  • eine Versandmeldung (cXML ShipNoticeRequest) für jede neue Sendung eines bestätigten Auftrags.

PunchOut Rocket merkt sich seine Sendungen: Antworten Sie immer mit dem aktuellen Auftragszustand, und PunchOut Rocket ermittelt die Änderungen.

Anfrage: order_id ist die von Ihrem Endpunkt zur Auftragserstellung zurückgegebene ID

{"api_key": "site-api-key-abc", "order_id": "100045"}

Erfolgsantwort

HTTP 200

HTTP 200
{
  "status": "success",
  "order_status": "shipped",
  "items": ["5501", "5502"],
  "quantities": [
    {"order_item_id": "5501", "quantity": 2},
    {"order_item_id": "5502", "quantity": 1}
  ],
  "shipments": [
    {
      "id": "SH-1",
      "shipped_at": "2026-11-12T09:30:00+01:00",
      "carrier": "UPS",
      "tracking": "1Z999AA10123456784",
      "items": [{"order_item_id": "5501", "quantity": 2}]
    }
  ]
}
Auftragsstatus: Antwortfelder
FeldErforderlichBedeutung
statusJaExakt success
order_statusJaIhr Auftragszustand, einem der folgenden Werte zugeordnet
itemsJaIDs der noch im Auftrag enthaltenen Positionen. Eine entfernte Position fehlt hier
quantitiesEmpfohlenAktuelle Menge jeder Auftragsposition. Ohne dieses Feld gilt eine noch vorhandene Position als vollständig mit ihren PO-Zeilen enthalten: Eine reduzierte Menge kann nicht gemeldet werden
shipmentsEmpfohlenEin Eintrag je versendeter Sendung. Leer ([]), wenn Ihr Shop Sendungen nicht erfasst: Dann werden nur Bestätigungen und keine Versandmeldungen gesendet
order_status-Werte
WertBedeutungAn den Kunden gesendet
pendingEingegangen, noch nicht angenommenNichts
processingAngenommenBestätigung
shippedTeilweise oder vollständig versendetBestätigung, falls noch nicht gesendet, danach Versandmeldungen
deliveredZugestelltWie shipped
cancelledStorniertAblehnung des gesamten Auftrags, auch nach einer Bestätigung. Endgültig: Der Auftrag wird nicht mehr geprüft

Die Bestätigung wird einmalig gesendet, wenn der Auftrag erstmals processing, shipped oder delivered ist:

  • Sie akzeptiert den gesamten Auftrag, wenn jede PO-Zeile vollständig enthalten ist;
  • sonst akzeptiert sie jede Zeile mit der im Auftrag enthaltenen Menge und lehnt den Rest ab (entfernte Artikel, reduzierte Mengen). Eine über die PO hinaus erhöhte Menge wird mit der PO-Menge bestätigt;
  • wenn keine Zeile mehr vorhanden ist, wird nichts gesendet: Verwenden Sie cancelled, um den Auftrag abzulehnen.

Spätere Artikeländerungen werden nicht erneut bestätigt: Bearbeiten Sie den Auftrag vor der Annahme.

Jede Sendung
FeldErforderlichBedeutung
idJaSendungs-ID, innerhalb des Auftrags eindeutig und nie wiederverwendet: Jede ID wird einmal gemeldet
shipped_atEmpfohlenVersanddatum, ISO 8601 mit Zeitzonenversatz
carrierNeinName des Frachtführers
trackingNeinSendungsverfolgungsnummer. Der Frachtführer wird nur zusammen mit ihr gemeldet
itemsJaAuftragspositionen dieser Sendung und versendete Menge (order_item_id aus der Auftragserstellung). Eine Sendung ohne Artikel der PO wird nicht gemeldet

Melden Sie eine Sendung erst nach dem Versand. Änderungen nach ihrer Meldung werden nicht erneut gesendet. Lehnt das Einkaufssystem eine Bestätigung oder Versandmeldung ab, sendet PunchOut Rocket sie bei der nächsten Prüfung erneut; bis zur Annahme werden keine nachfolgenden Meldungen gesendet.

Auftragsstatus: Fehlerantworten
HTTPWannAuswirkung
404 mit {"status": "error", ...}Der Auftrag existiert nicht, zum Beispiel wurde er gelöschtProtokolliert, bei der nächsten Runde erneut geprüft
Andere Status außerhalb von 2xxJeder andere FehlerProtokolliert, bei der nächsten Runde erneut geprüft

8. Auftragsstatus-Benachrichtigung (optional)

Ohne sie liest PunchOut Rocket den Auftragsstatus stündlich. Damit Bestätigungen und Versandmeldungen innerhalb von Sekunden gesendet werden, benachrichtigen Sie PunchOut Rocket bei jeder Änderung eines Auftrags aus Abschnitt 6 (Zustand, Artikel, neue Sendung):

  • URL: {gateway_url}/order-status-changed (gateway_url aus der Anfrage zur Auftragserstellung)
  • Methode: POST, Content-Type: application/json
  • Keine Authentifizierung: Die Benachrichtigung enthält keine Daten und veranlasst PunchOut Rocket lediglich, Ihren Auftragsstatus-Endpunkt (Abschnitt 7) für diesen Auftrag aufzurufen.

Benachrichtigung und Antwort

POST {gateway_url}/order-status-changed
Content-Type: application/json

{"order_id": "100045"}

HTTP 202
{"status": "queued"}

Nach dem Speichern der Änderung senden, ohne den Benutzer warten zu lassen (Fire-and-forget, kurzes Zeitlimit). Fehler können ignoriert werden: Die stündliche Prüfung holt Änderungen nach.

9. Checkliste für den Produktivstart

  1. Konfigurieren Sie die Website (Abschnitt 1) und tragen Sie denselben API-Schlüssel in Ihrem Shop ein.
  2. Erstellen Sie einen Endkunden und setzen Sie dessen „E-commerce User to Clone“.
  3. Klicken Sie in seinem Category Mapping auf „Update from e-commerce“ und ordnen Sie die Kategorien zu; setzen Sie einen Default UNSPSC.
  4. Testen Sie einen PunchOut mit dem cXML-Testformular im Adminbereich: create, dann edit mit einem Warenkorb und anschließend den Warenkorb zurücksenden.
  5. Für Bestellungen (Premium-Tarif): Senden Sie einen Test-OrderRequest und prüfen Sie den Auftrag in Ihrem Shop.
  6. Für Statusaktualisierungen (Option OC & ASN): Aktivieren Sie „Send order status updates“ beim Endkunden, lassen Sie den Testauftrag Ihre Zustände durchlaufen und prüfen Sie, ob das Kundensystem Bestätigung und Versandmeldungen erhält.

Beachten Sie:

  • PunchOut-Benutzer dürfen keinen Checkout in Ihrem Shop abschließen: Ihr Warenkorb geht zurück an das Einkaufssystem (Abschnitt 4), und der Auftrag kommt später über Abschnitt 6.
  • Über Abschnitt 6 empfangene Aufträge sind bereits vom Einkaufssystem des Kunden freigegeben: Sie benötigen keine Onlinezahlung.

Sie brauchen einen Testkunden oder eine Prüfung Ihrer Implementierung? Sprechen Sie mit unseren Entwicklern, oder lassen Sie uns die Integration mit Go-Live Assist umsetzen.

FAQ

Fragen zur Integration

Welche Felder trage ich in PunchOut Rocket ein?

Mit E-commerce Platform auf Custom: Site URL und API Key. Die vier Endpunktpfade (Klonen, Kategorien, Auftragserstellung, Auftragsstatus) werden nur benötigt, wenn Sie nicht die Standardpfade verwenden.

Brauche ich den Kategorien-Endpunkt?

Er wird empfohlen. Damit ordnen Sie Ihre Kategorien den vom Kunden verlangten Codes wie UNSPSC zu; ohne ihn erhält jedes Produkt den Default UNSPSC des Endkunden.

Kann der SSO-Link wiederverwendet werden?

Nein. Das Token darf nur einmal über HTTPS funktionieren. Geben Sie ihm einige Minuten statt Sekunden Gültigkeit: Bei vordefinierten Warenkörben öffnet der Kunde den Link erst, nachdem er zum Shop weitergehen möchte.

Wie erreichen Bestellungen einen individuellen Shop?

Über Ihren Endpunkt zur Auftragserstellung: Das Gateway empfängt den cXML OrderRequest des Kunden und sendet ihn als JSON an Ihren Shop. Dies ist im Premium-Tarif enthalten, auch während der kostenlosen Testphase.

Kann mein Shop Auftragsbestätigungen und Versandmeldungen senden?

Ja, mit der Option OC & ASN des Premium-Tarifs (zur Aktivierung kontaktieren Sie uns). Implementieren Sie den Auftragsstatus-Endpunkt: Das Gateway liest den Zustand jedes Auftrags und sendet cXML ConfirmationRequest und ShipNoticeRequest an das Kundensystem.

30 Tage kostenlos testen · keine Kreditkarte

Ihr Kunde wartet. Legen wir los.

Installieren Sie das Plugin noch heute und führen Sie am Nachmittag Ihre erste Test-Session durch. Wenn Ihre Frist knapp ist, sagen Sie es uns: Wir bearbeiten Ihre Anfrage mit Priorität.