OCI en PunchOut
PunchOut koppeling: je klant bestelt in jouw webshop en de order komt als cXML terug
Een PunchOut koppeling opent jouw webshop vanuit het inkoopsysteem van je klant en stuurt de winkelmand terug als inkoopaanvraag. Met cXML gaan daarna ook de inkooporder, de orderbevestiging, het verzendbericht en de factuur als berichten tussen jullie systemen.
Bijgewerkt op
Wat is een PunchOut koppeling?
Een PunchOut koppeling verbindt het inkoopsysteem van je klant met jouw webshop, in twee richtingen. Het inkoopsysteem opent een sessie in je webshop, de inkoper vult daar een winkelmand, en die winkelmand gaat terug naar zijn eigen systeem als inkoopaanvraag. Na goedkeuring stuurt het inkoopsysteem de inkooporder naar jou.
Er zijn twee protocollen. OCI is het protocol van SAP: de inlog en de winkelmand gaan als formuliervelden via de browser, en na de winkelmand houdt de specificatie op. cXML PunchOut gebruikt XML-berichten van server naar server en heeft ook berichten voor de order, de orderbevestiging, het verzendbericht en de factuur. Deze pagina gaat over cXML. OCI staat uitgewerkt op OCI en PunchOut en in wat is een OCI koppeling.
cXML wordt gepubliceerd op cxml.org. De huidige cXML-referentie is versie 1.2.071 van 14 augustus 2026, uitgegeven door SAP. De berichtnamen, attributen en statuscodes op deze pagina komen daaruit, gecontroleerd op 3 oktober 2026.
Zo verloopt een PunchOut-sessie met cXML
Een inkoper van Bakker Installatie B.V. bestelt drie artikelen vanuit Coupa:
- Hij klikt in Coupa op de tegel van jouw webshop.
- Coupa stuurt een
PunchOutSetupRequestnaar het PunchOut-adres van je webshop, met de identiteit van de klant, een gedeeld geheim, eenBuyerCookieen het retouradres inBrowserFormPost. - De koppeling controleert het geheim, zoekt de klant en antwoordt met
Status 200en een start-URL inStartPage. - Coupa stuurt de browser van de inkoper naar die URL. Hij is ingelogd en ziet zijn eigen assortiment en contractprijzen.
- In plaats van afrekenen klikt hij op overnemen. De webshop stuurt een
PunchOutOrderMessagevia zijn browser naar het retouradres. - Coupa maakt er een aanvraag van, die langs budget en goedkeurders gaat.
- Na goedkeuring post Coupa een
OrderRequestmet inkoopordernummer 4500001234 naar je orderadres. - Jij stuurt de orderbevestiging, het verzendbericht en de factuur terug.
| # | Bericht | Van | Naar | Transport |
|---|---|---|---|---|
| 1 | PunchOutSetupRequest |
inkoopsysteem | koppeling | HTTPS POST |
| 2 | PunchOutSetupResponse |
koppeling | inkoopsysteem | antwoord op 1 |
| 3 | PunchOutOrderMessage |
webshop | inkoopsysteem | formulier via de browser |
| 4 | OrderRequest |
inkoopsysteem | koppeling | HTTPS POST |
| 5 | ConfirmationRequest |
koppeling | inkoopsysteem | HTTPS POST |
| 6 | ShipNoticeRequest |
koppeling | inkoopsysteem | HTTPS POST |
| 7 | InvoiceDetailRequest |
koppeling | inkoopsysteem | HTTPS POST |
Bij SAP Ariba lopen berichten 1, 2 en 4 via SAP Business Network. Het netwerk controleert de klant, zet zichzelf in het Sender-veld en voegt het gedeelde geheim van de leverancier toe. Coupa stuurt de setup request rechtstreeks naar je webshop.
Wat je webshop moet leveren
Voor de sessie zijn het drie dingen: een adres dat de setup request aanneemt, een start-URL die de inkoper zonder inlogscherm binnenlaat, en een overdracht die de winkelmand als cXML terugstuurt. Per onderdeel:
| Onderdeel | Wat de referentie vraagt | Wat de koppeling doet |
|---|---|---|
BuyerCookie |
Het enige verplichte element van de setup request, nieuw per sessie | Bewaren en ongewijzigd terugsturen in de winkelmand |
StartPage/URL |
Uniek, tijdelijk, verwijst naar de sessie maar bevat hem niet | Een korte sleutel die na een paar minuten vervalt |
| Formulierveld | cXML-urlencoded of cXML-base64; base64 heeft de voorkeur |
Het hele bericht in één verborgen veld |
ItemIn |
Per regel quantity, SupplierPartID, UnitPrice, Description, UnitOfMeasure, Classification |
Ontbrekende velden aanvullen uit het ERP |
UnitOfMeasure |
Een code uit de UN/CEFACT-lijst | "stuk" vertalen naar EA |
Eén regel uit de winkelmand van Bakker Installatie, de kabelbinders die per zak van 100 worden verkocht:
<ItemIn quantity="5">
<ItemID><SupplierPartID>30377</SupplierPartID></ItemID>
<ItemDetail>
<UnitPrice><Money currency="EUR">3.75</Money></UnitPrice>
<Description xml:lang="nl">Kabelbinder 200 mm, zak 100 st</Description>
<UnitOfMeasure>PK</UnitOfMeasure>
<Classification domain="UNSPSC">(UNSPSC-code)</Classification>
</ItemDetail>
</ItemIn>
De drie regels samen: 12 × 17,08 = 204,96 voor de wandcontactdozen, 2 × 149,00 = 298,00 voor de groepenkasten en 5 × 3,75 = 18,75 voor de kabelbinders. Het Total in de kop van het bericht is 204,96 + 298,00 + 18,75 = 521,71. Volgens de referentie staan btw en verzendkosten daar niet in. Bij OCI moet dezelfde kabelbinder met een prijseenheid van 100 worden doorgegeven, omdat het prijsveld maar 3 decimalen heeft. In cXML verkoop je hem per zak, of je gebruikt het element PriceBasisQuantity.
Daarna komt de order. Het OrderRequest heeft in de kop orderID, orderDate, type (new, update of delete) en de verplichte elementen Total en BillTo. Het antwoord is een Status. Een 200 zegt dat het bericht is ontvangen en gelezen, niet welke regels je kunt leveren. Dat zeg je met een ConfirmationRequest, met een van de acht typen uit de referentie: accept, allDetail, detail, backordered, except, reject, requestToPay en replace.
Waar het misgaat
Een PunchOut koppeling faalt meestal zonder melding aan jouw kant. De inkoper ziet een foutscherm in zijn eigen systeem, of de order komt nooit aan. Dit zijn de oorzaken die terugkomen:
| Wat er gebeurt | Oorzaak | Wat de koppeling doet |
|---|---|---|
Setup request krijgt 401 |
De klant wordt gezocht op de identiteit in Sender. Via SAP Business Network staat daar het netwerk |
Geheim in Sender controleren, klant zoeken op From |
| Winkelmand afgewezen | Eenheid als "stuk" of "each" in plaats van een UN/CEFACT-code | Eenheden per artikel vertalen naar EA, PK of een andere code |
| Winkelmand komt niet bij de juiste aanvraag | BuyerCookie niet of gewijzigd teruggestuurd |
De cookie bij de sessie bewaren en letterlijk terugzetten |
| Order dubbel in het ERP | Het antwoord op het OrderRequest ging verloren en het bericht kwam opnieuw |
Op payloadID en orderID controleren; een herhaling krijgt 200 en maakt niets aan |
| Order komt niet aan | Webshop langer onbereikbaar dan de pogingen van het inkoopsysteem | Order aannemen in een wachtrij, los van de webshop |
| Lege winkelmand terug | Een PunchOutOrderMessage zonder ItemIn betekent annuleren |
De annuleerknop bewust zo laten werken, niet per ongeluk |
De pogingen zijn in de referentie vastgelegd. Op een 4xx-status probeert het inkoopsysteem het niet opnieuw. Op een 5xx-status of een antwoord dat geen geldige cXML is, beveelt de referentie 10 nieuwe pogingen aan, een keer per uur, met minimaal een venster van zes uur. Komt de order om 02:10 en is je server tot 05:30 offline, dan levert de poging van 06:10 hem af, vier uur later. Duurt de storing langer dan 10 × 1 uur = 10 uur, dan blijft de order bij een systeem dat de aanbeveling volgt liggen tot iemand hem opnieuw verstuurt.
OCI of cXML
| OCI | cXML PunchOut | |
|---|---|---|
| Start van de sessie | Parameters via de browser, met gebruikersnaam en wachtwoord | PunchOutSetupRequest van server naar server, met gedeeld geheim |
| Winkelmand terug | NEW_ITEM-velden met vaste lengtes, bijvoorbeeld 40 tekens omschrijving |
Een PunchOutOrderMessage in één formulierveld |
| Eenheid | ISO-code van 3 tekens | UN/CEFACT-code |
| Order, bevestiging, factuur | Niet in de specificatie | OrderRequest, ConfirmationRequest, ShipNoticeRequest, InvoiceDetailRequest |
AFAS en Elari combineren de twee: OCI voor de winkelmand, cXML voor de order. De vergelijking per onderdeel staat in OCI of cXML.
Welke inkoopsystemen erom vragen
- Coupa. cXML PunchOut, met de setup request rechtstreeks naar je webshop.
- SAP Ariba. cXML via SAP Business Network, ook voor order, bevestiging, verzendbericht en factuur.
- AFAS Profit met InSite. OCI voor de winkelmand, een cXML-order na goedkeuring. Zie OCI koppeling AFAS.
- Elari, voorheen Spend Cloud. OCI voor de winkelmand; de order komt als cXML via HTTPS of SFTP, of als pdf per e-mail. Zie OCI koppeling Spend Cloud.
- SAP SRM. OCI, het protocol waar het mee begon.
Voor de webshop zelf verschilt het per platform hoe de sessie en de overdracht worden gebouwd. Shopify, Magento en WooCommerce staan op OCI koppeling webshop. Wil je klant na de order ook documenten zonder sessie uitwisselen, dan is dat EDI.
Wat wij bouwen
Wij bouwen het PunchOut-adres, de sessie op je bestaande webshop, de overdracht van de winkelmand en de ontvangst van de order, en zetten die order in je ERP. Daarna hosten en bewaken we de koppeling: een 401 op een setup request, een winkelmand zonder order en een order die opnieuw is verstuurd staan in het log van het dashboard.
Elk bericht dat binnenkomt, staat eerst in een wachtrij. Een OrderRequest krijgt dus antwoord, ook als je ERP even niet bereikbaar is. Het hele verloop met prijzen en assortiment per klant staat op OCI en PunchOut. Vertel welk inkoopsysteem je klant gebruikt.
Veelgestelde vragen
Is PunchOut hetzelfde als een OCI koppeling?
PunchOut is het principe: vanuit het inkoopsysteem naar de webshop van de leverancier en met de winkelmand terug. OCI en cXML zijn twee protocollen daarvoor. In Nederland heet het vaak allemaal OCI koppeling, ook als er cXML onder zit. De verschillen per onderdeel staan in OCI of cXML.
Welk protocol moet mijn webshop ondersteunen?
Dat bepaalt het inkoopsysteem van je klant. Coupa en SAP Ariba vragen om cXML. SAP SRM vraagt om OCI. AFAS en Elari, de nieuwe naam van Spend Cloud, gebruiken OCI voor de winkelmand en sturen de order daarna als cXML. Vraag de beheerder bij je klant om een voorbeeldbericht: daaraan zie je het protocol en de velden.
Is de winkelmand die terugkomt al een order?
Nee. De cXML-referentie noemt de winkelmand uit een PunchOut-sessie een offerte. De order bestaat pas als het OrderRequest binnenkomt, na goedkeuring bij je klant. Tot dat moment kan de klant regels wijzigen of de aanvraag afkeuren.
Wat gebeurt er als mijn server plat ligt als de order komt?
Een inkoopsysteem dat de aanbeveling uit de cXML-referentie volgt, probeert het bij een 5xx-antwoord of geen antwoord opnieuw: 10 keer, een keer per uur. Wie langer dan die 10 uur onbereikbaar is, mist de order tot iemand bij de klant hem opnieuw verstuurt. Een koppeling met een eigen wachtrij neemt de order aan en verwerkt hem als je webshop of ERP weer bereikbaar is.
Moet ik ook orderbevestigingen en facturen in cXML sturen?
Dat spreek je per klant af. De referentie kent er eigen berichten voor: ConfirmationRequest, ShipNoticeRequest en InvoiceDetailRequest. Een klant die facturen automatisch matcht met order en levering, heeft die berichten nodig. Zonder die berichten komt je factuur als pdf binnen en typt iemand bij de klant hem over.
Vertel wat je nodig hebt
Vertel welke systemen je gebruikt en wat je wilt verbeteren. Je krijgt binnen één werkdag een persoonlijk antwoord. We helpen je de werkzaamheden helder te krijgen en spreken de prijs en planning af voordat je iets toezegt.
- Je weet de prijs en de doorlooptijd voordat je iets toezegt
- Wij zoeken uit welke koppeling het werk uit handen neemt
- Wij verzorgen de bouw, hosting, bewaking en het onderhoud
- Je team krijgt minder overtypwerk en minder uitzoekwerk