OCI en PunchOut
OCI koppeling AFAS
Je klant bestelt vanuit AFAS InSite in jouw webshop en de goedgekeurde order komt als cXML-bericht bij je terug. Wij bouwen het inlogadres, de winkelmand in het formaat van de Profit-definitie en de ontvangst van de order, en draaien en bewaken de koppeling daarna.
Een AFAS OCI koppeling bestaat uit drie delen
AFAS beschrijft een OCI-koppeling als drie onderdelen: de instellingen, de mapping van het winkelmandje (PunchOut) en de mapping van de digitale order (cXML Order). Het winkelmandje komt binnen via OCI, de order gaat uit via cXML. Een leverancier die van een AFAS-klant de vraag om een OCI koppeling krijgt, bouwt dus twee protocollen.
Elk van de drie onderdelen heeft bij AFAS een eigen versienummer. Wijzigt er één, dan verhoogt Profit het versienummer van de definitie. De koppeling werkt alleen met InSite: de inkoper start vanuit het inkoopportaal en komt daar terug met zijn winkelmand.
Dit is de AFAS-uitwerking van de stroom die op OCI en PunchOut in het algemeen staat. De techniek van de sessie zelf staat in wat is een OCI koppeling. De gewone gegevensstromen met AFAS, zoals artikelen, voorraad en verkooporders via de connectoren van Profit, staan op AFAS webshop koppeling.
Wat AFAS van je vraagt voor het winkelmandje
Voor de eerste stap vraagt AFAS drie dingen van de leverancier: de URL van het winkelmandje, een gebruikersnaam en wachtwoord, en eventueel een klantnummer. De beheerder van je klant zet ze in het OCI-profiel. Het inlogadres is een URL met vaste plekken die Profit bij elke sessie invult:
https://webshop.example.nl/oci/login?USERNAME={gebruikersnaam}&PASSWORD={wachtwoord}
&CUSTOMER={debiteurnummer}&CART={uniqueid}
&NAME={aanvrager_naam}&EMAIL={aanvrager_e-mail}
De namen voor het isgelijkteken kies je zelf; de waarden tussen accolades zijn van AFAS. InSite plakt er HOOK_URL achter: het adres waar de winkelmand naartoe moet, in het voorbeeld van AFAS een adres op insite.afas.online met een token erin. {uniqueid} is bij elke aanroep een nieuwe GUID, zodat twee inkopers die met dezelfde gebruikersnaam binnenkomen elk een eigen winkelmand krijgen. De gebruikersnaam en het wachtwoord staan in de URL. Gebruik daarom een apart OCI-account dat niets anders kan dan deze sessie starten.
De winkelmand gaat terug als HTTPS POST naar HOOK_URL. Bij terugkomst controleert InSite het token. De Profit-definitie leest per regel deze velden:
| Veld | Wat Profit ermee doet | Grens |
|---|---|---|
NEW_ITEM-VENDORMAT |
Itemcode van de inkooprelatie; hieraan herkent Profit een artikel dat al bestaat | 30 tekens |
NEW_ITEM-DESCRIPTION |
Omschrijving van het artikel | |
NEW_ITEM-MATGROUP |
Productgroep van de leverancier, in het OCI-profiel gekoppeld aan een artikelgroep | |
NEW_ITEM-QUANTITY |
Aantal eenheden | |
NEW_ITEM-UNIT |
Eenheidscode | |
NEW_ITEM-PRICE en NEW_ITEM-PRICEUNIT |
Prijs per eenheid en prijsfactor | |
NEW_ITEM-CUST_FIELD1 |
Btw-percentage | Ook gelezen uit NEW_ITEM-VATPERCENTAGE, NEW_ITEM-VAT_PCT of NEW_ITEM-VAT |
NEW_ITEM-CUST_FIELD2 |
Verwachte leverdatum | Formaat DD-MM-YYYY |
NEW_ITEM-CUST_FIELD3 |
Referentie van de inkooprelatie | Afgekapt op 50 tekens |
NEW_ITEM-LEADTIME en NEW_ITEM-LONGTEXT |
Komen in de opmerking van de aanvraagregel | Levertijd alleen als hij groter is dan 0 |
Uit die velden maakt Profit vier dingen aan: het artikel met eenheid en prijs, de artikelgroep, de inkoopaanvraag en later de inkooporder. Een artikel dat Profit nog niet kent, wordt aangemaakt. De artikelgroep bepaalt bij je klant op welke grootboekrekening de inkoop wordt geboekt. Een productgroep die niet gekoppeld is, valt in de voorkeursartikelgroep van het profiel.
Wat AFAS van je vraagt voor de order
Voor de tweede stap vraagt AFAS vier dingen: de URL van je backoffice, een gebruikersnaam en wachtwoord, het klantnummer met het afleveradres, en een shared secret als je die gebruikt. Na goedkeuring van de inkoopaanvraag maakt Profit een cXML-order en stuurt die naar de Export-URL in het OCI-profiel. Dat adres mag HTTP of HTTPS zijn, en ook FTPS of SFTP.
Zo ziet de order voor de eerste regel van de winkelmand eruit, ingekort:
<OrderRequestHeader orderID="01885" orderDate="2026-10-02 00:00:00" type="new">
<Total><Money currency="EUR">521.71</Money></Total>
<ShipTo><Address isoCountryCode="NL" addressID="1280">...</Address></ShipTo>
<SupplierOrderInfo orderID="WM-004417" />
</OrderRequestHeader>
<ItemOut quantity="12" lineNumber="1" requestedDeliveryDate="2026-10-06">
<ItemID><SupplierPartID>10482</SupplierPartID></ItemID>
<ItemDetail>
<UnitPrice><Money currency="EUR">17.08</Money></UnitPrice>
<Description xml:lang="en_US">Wandcontactdoos 2-voudig met randaarde,</Description>
<UnitOfMeasure>PCE</UnitOfMeasure>
</ItemDetail>
</ItemOut>
Drie waarden verbinden de order met wat er eerder gebeurde. orderID is het inkoopordernummer van je klant; dat nummer wil hij terugzien op je factuur. SupplierPartID is het artikelnummer dat jij in NEW_ITEM-VENDORMAT meegaf. SupplierOrderInfo bevat de referentie die jij in NEW_ITEM-CUST_FIELD3 aan de winkelmand hing, hier WM-004417.
De shared secret is een extra wachtwoord van maximaal 255 tekens. Profit zet hem in het Sender-deel van de kop van het bericht. Bij de Profit-definitie is hij optioneel.
Twee dingen houden de eerste order tegen. Profit blokkeert standaard alle verkeer naar onbekende adressen: je klant dient een supportincident in bij AFAS om jouw Export-URL met poortnummer op de allowlist te laten zetten. En het communicatieprofiel Digitale inkooporders moet door de beheerder zijn gedeblokkeerd.
Welk systeem is leidend, per gegeven
| Gegeven | Leidend | Wat de andere kant ermee doet |
|---|---|---|
| Artikel, omschrijving, eenheid | Jouw webshop | Profit maakt het artikel aan bij de eerste bestelling en herkent het daarna aan jouw artikelnummer |
| Prijs | Jouw webshop | Profit slaat de prijs uit de winkelmand op als inkoopprijs en werkt hem bij elke bestelling bij |
| Artikelgroep en grootboekrekening | Profit | Jij stuurt je productgroep mee; de klant koppelt hem aan zijn eigen artikelgroep |
| Inkoopordernummer | Profit | Jouw order krijgt het nummer uit orderID als referentie |
| Referentie van de winkelmand | Jouw webshop | Profit stuurt de eerste 50 tekens terug in de order |
| Afleveradres | Profit | Het adres komt mee met een addressID: de code die jij en je klant per adres afspreken |
Drie typen koppeling
Het type bepaalt wat de inkoper na terugkeer in InSite nog aan de inkoopaanvraag mag wijzigen.
| Type | Na terugkeer in InSite | Wat jouw webshop bewaart |
|---|---|---|
| Inkoopaanvraag volledig aanpasbaar | De inkoopaanvraag is volledig te wijzigen | Niets. De order die terugkomt is leidend |
| Met conceptordernummer van de leverancier, aanpasbaar | Te wijzigen, met het conceptordernummer erbij | De winkelmand, onder een conceptordernummer |
| Met conceptordernummer van de leverancier, niet aanpasbaar | Niet meer te wijzigen. Wat er per regel nog kan, staat in de beschrijving per definitie | De winkelmand, onder een conceptordernummer |
Bij de laatste twee typen slaat de leverancier het winkelmandje zelf op. De webshop heeft dan opgeslagen winkelmanden nodig en een eigen nummering voor concepten, en de koppeling zoekt bij elke binnenkomende order de winkelmand met dat nummer erbij. Wijkt de order af van de bewaarde winkelmand, bijvoorbeeld 10 stuks in plaats van 12, dan is dat een verschil dat iemand moet zien. De koppeling verwerkt die order niet stil: het verschil staat in het dashboard en de order wacht op jouw goedkeuring.
De Profit-definitie of een gecertificeerde koppeling
AFAS heeft twee soorten definities. De Profit-definitie is de algemene: een leverancier die zich aan dat formaat houdt, heeft geen eigen definitie nodig. Daarnaast onderhoudt AFAS definities per leverancier. Op 3 oktober 2026 staan er 68 leveranciers op die lijst, waaronder ARP, Manutan en Technische Unie. AFAS schrijft erbij dat dit allemaal leveranciers zijn bij wie de mapping van het winkelmandje of de order afwijkt.
Voor een webshop die nog geen OCI heeft, is de Profit-definitie de route: de velden uit de tabel hierboven en de standaardopbouw van de cXML-order. Bij de Profit-definitie vult de klant de Productie-URL, de Test-URL en de Export-URL zelf in; bij een leveranciersdefinitie staan die vast. Alleen de Profit-definitie heeft de vrije velden NEW_ITEM-CUST_FIELD16 tot en met 20. De klant koppelt ze in zijn OCI-profiel aan eigen vrije velden van het type tekst of memo, en ze komen in de order terug als Cust_Field16 tot Cust_Field20. Leveranciers met vragen over een nieuwe koppeling verwijst AFAS naar oci@afas.nl.
Waar het op vastloopt
| Wat er misgaat | Oorzaak | Wat de koppeling doet |
|---|---|---|
| De hele winkelmand komt niet aan in InSite | Eén regel die Profit niet kan verwerken, houdt alle regels tegen | Elke regel controleren op de verplichte velden voordat het formulier wordt verstuurd |
| Artikelnummer past niet | AFAS noemt maximaal 30 tekens voor NEW_ITEM-VENDORMAT; de specificatie van SAP staat er 40 toe |
Artikelnummers langer dan 30 tekens melden bij het aansluiten |
| Projectcode komt half aan | Een waarde die langer is dan het vrije veld kapt Profit af, zonder melding | De lengte van elk vrij veld per klant vastleggen |
| Order op het verkeerde adres | De klant heeft meerdere afleveradressen in één OCI-profiel en de code per adres is niet afgesproken | addressID vertalen naar het afleveradres in je webshop of ERP |
| Order aangekomen volgens AFAS, niet bij jou | Jouw adres antwoordde zonder fout en verwerkte de order daarna niet | De order opslaan voor het antwoord, daarna pas verwerken |
Het laatste punt volgt uit hoe Profit verzendt. Krijgt Profit geen foutmelding terug, dan staat het bericht als succesvol verzonden in het communicatielog en ligt de fout volgens AFAS bij de ontvanger. Een adres dat 200 OK antwoordt en de order daarna kwijtraakt omdat het ERP niet bereikbaar was, heeft een order gemist die volgens je klant geplaatst is. De koppeling bewaart daarom elke order zodra hij binnenkomt en zet hem in een wachtrij; lukt het aanmaken in je ERP niet, dan volgt een nieuwe poging en blijft de order zichtbaar in het dashboard.
Testen loopt via de beheerder van je klant. Een openbare testomgeving is er niet: in het OCI-profiel staan de velden Test-URL en Export-Test-URL, en zolang die zijn aangevinkt gaan de sessie en de order naar jouw testadressen. Welke assen van de kostenverdeling in de order meekomen, verschilt per definitie: de Profit-definitie stuurt de verbijzonderingscodes van as 1 tot en met 5 mee, en AFAS documenteert een leveranciersdefinitie waarbij alleen as 1 meegaat.
Verstuurt je klant ook facturen en verzendberichten elektronisch, dan loopt dat buiten deze koppeling. Zie AFAS EDI koppeling en OCI of cXML. Wat je webshop zelf moet kunnen voor de sessie, staat per platform op OCI koppeling webshop.
Vertel op welk platform je webshop draait en welke klant om de koppeling vraagt, dan hoor je wat er voor de Profit-definitie nodig is.
Veelgestelde vragen
Moet mijn klant iets instellen in AFAS?
Ja. De beheerder van je klant voegt jou toe als inkooprelatie, maakt een OCI-profiel aan met jouw inlogadres, gebruikersnaam en wachtwoord, en zet het onderdeel OCI-profielen op het bestelportaal in InSite. Voor de order via cXML deblokkeert hij het communicatieprofiel Digitale inkooporders en laat hij jouw Export-URL door AFAS op de allowlist zetten.
Werkt het ook met AFAS InSite?
Het werkt alleen met InSite. De inkoper start de sessie vanuit het inkoopportaal in InSite en de winkelmand komt daar terug als inkoopaanvraag. Profit verwerkt daarna de goedkeuring en verstuurt de inkooporder.
Krijgt mijn klant zijn eigen prijzen te zien?
Ja. De sessie start met de gebruikersnaam van die klant en eventueel zijn debiteurnummer, dus de webshop toont zijn prijslijst en assortiment. De prijs in de winkelmand slaat Profit op als inkoopprijs bij het artikel, en bij een volgende bestelling werkt Profit die prijs bij.
Wat gebeurt er als AFAS een onderdeel bijwerkt?
De instellingen, de mapping van het winkelmandje en de mapping van de order hebben elk een versienummer. Wijzigt een van de drie, dan verhoogt Profit het versienummer van de definitie en kan het nodig zijn dat de beheerder van je klant het OCI-profiel ververst. Verandert daardoor een veld in de winkelmand of de order, dan passen wij de koppeling aan.
Kan het ook zonder cXML-order?
Ja. Neemt de leverancier geen XML-order aan, dan verstuurt Profit de inkooporder als pdf per e-mail. De winkelmand loopt dan nog steeds via OCI, en de order verwerk je zelf. Met de cXML-order staat hij zonder overtypen in je webshop of ERP, met het inkoopordernummer van je klant erbij.
Moet ik op de lijst van AFAS staan?
Nee. De lijst bevat leveranciers waarvoor AFAS een eigen definitie heeft gemaakt omdat hun winkelmand of order afwijkt. Elke andere leverancier koppelt via de algemene Profit-definitie. Vragen over een nieuwe koppeling beantwoordt AFAS via oci@afas.nl.
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