Naar de inhoud
SyncMyShop

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.

OCI koppeling met AFAS: winkelmand via OCI, order via cXML AFAS InSite opent de webshop met USERNAME, PASSWORD en HOOK_URL in de URL. De webshop herkent debiteur 10482 en stuurt de winkelmand als NEW_ITEM-velden naar HOOK_URL. InSite maakt in Profit een inkoopaanvraag van 3 regels. Na goedkeuring stuurt Profit een cXML OrderRequest met orderID 01885 naar de Export-URL van de leverancier. Webshop met koppeling AFAS InSite inkoper AFAS Profit administratie GET /oci/login USERNAME, PASSWORD, HOOK_URL debiteur 10482 herkend, eigen winkelmand POST HOOK_URL, NEW_ITEM-velden inkoopaanvraag met 3 regels, artikelen aangemaakt goedkeuring in de workflow cXML OrderRequest naar de Export-URL, orderID 01885 200 OK Twee protocollen in één koppeling: OCI voor de winkelmand, cXML voor de order. De instellingen en de twee mappings hebben bij AFAS elk een eigen versienummer.
De winkelmand gaat via OCI naar InSite, de order komt via cXML uit Profit terug.

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

Leveranciers, producten, orders per dag, een ruwe schatting is prima.

Of mail direct: carsten@syncmyshop.com