Naar de inhoud
SyncMyShop

Systemen

SAP Business One koppeling met je webshop: orders, voorraad en klantprijzen via de Service Layer

Een SAP Business One koppeling zet webshoporders en klanten in SAP en haalt artikelen, voorraad per magazijn en speciale prijzen per relatie terug. De gegevens lopen via de Service Layer, de OData-API van SAP Business One, met een sessie die na 30 minuten verloopt en een standaardpagina van 20 records.

Wat is SAP Business One en wie gebruikt het?

SAP Business One is het ERP-pakket van SAP voor het mkb: financieel, verkoop, inkoop, voorraad, magazijn en productie in één database per bedrijf. Het wordt verkocht en ingericht door SAP-partners en draait op een eigen server of bij een hostingpartij, op SAP HANA of op Microsoft SQL Server. In Nederland staat het vooral bij groothandels, importeurs en productiebedrijven, vaak als vestiging van een internationale groep.

Voor een koppeling zijn twee dingen bepalend: de database en de versie. Ze bepalen welke API beschikbaar is. Een installatie op SAP HANA heeft de Service Layer. Een installatie op SQL Server heeft hem vanaf versie 10.0 PL01. Daaronder blijven de DI API en de DI Server over.

Wat je met SAP Business One koppelt

SAP Business One is in de meeste koppelingen leidend voor artikelen, voorraad, prijzen en facturen. De webshop is leidend voor de order en voor nieuwe klanten.

Stroom Richting Entiteit in de Service Layer
Orders webshop naar SAP Orders met DocumentLines
Klanten webshop naar SAP BusinessPartners met BPAddresses
Artikelen SAP naar webshop Items
Voorraad per magazijn SAP naar webshop ItemWarehouseInfoCollection op Items
Prijslijsten SAP naar webshop ItemPrices op Items
Speciale prijzen per relatie SAP naar webshop SpecialPrices
Leveringen SAP naar webshop DeliveryNotes

Een order gaat in één aanroep naar binnen, met de regels erin. Dit is order 10482 van Bakker Installatie B.V., relatie C10432:

POST /b1s/v2/Orders
Cookie: B1SESSION=PTRzIjYK-weN6-1Lx1; ROUTEID=.node1
Content-Type: application/json

{
  "CardCode": "C10432",
  "NumAtCard": "WEB-10482",
  "DocDate": "2026-10-02",
  "DocDueDate": "2026-10-05",
  "DocumentLines": [
    { "ItemCode": "KB-2210", "Quantity": 12,
      "UnitPrice": 17.08, "VatGroup": "V2" }
  ]
}

SAP antwoordt met 201 Created en twee nummers: DocEntry, de interne sleutel, en DocNum, het ordernummer dat je medewerkers zien. De koppeling bewaart beide naast het webshopordernummer. Een order verwijderen kan niet via de API; een order die vervalt wordt gesloten of geannuleerd. Welke velden per stroom meegaan staat op orders, klanten en verzending.

Hoe SAP Business One data vrijgeeft

Service Layer, DI API of DI Server

SAP Business One heeft drie API's die op dezelfde bedrijfsobjecten werken. De Service Layer is een OData-service over HTTPS, standaard op poort 50000. Het adres is https://{server}:50000/b1s/v1 voor OData versie 3 en /b1s/v2 voor OData versie 4, en alle uitwisseling is JSON. De DI API is gebouwd op Microsoft COM en draait alleen op Windows. De DI Server biedt dezelfde objecten via SOAP.

Nieuwe koppelingen bouwen wij op de Service Layer. SAP noemt zelf wat hij niet kan en de DI API wel: directe SQL via een RecordSet, import en export van XML, en transacties die over meerdere aanroepen lopen. Voor leeswerk dat buiten de standaardentiteiten valt, bestaat sinds 10.0 FP 2011 de entiteit SQLQueries, waarmee een vooraf opgeslagen query via de Service Layer wordt uitgevoerd. De volledige beschrijving staat in SAP's handleiding Working with SAP Business One Service Layer.

Inloggen met een sessie

Sessie op de Service Layer van SAP Business One De koppeling logt in op de Service Layer en krijgt een cookie B1SESSION met een time-out van 30 minuten. Na 31 minuten zonder aanroep geeft de volgende aanroep 401. De koppeling logt opnieuw in en herhaalt de aanroep. Koppeling bij ons Service Layer poort 50000 SAP Business One database POST /b1s/v2/Login 200 OK, cookie B1SESSION, SessionTimeout 30 POST /b1s/v2/Orders order met regels 201 Created, DocEntry 22 31 minuten zonder aanroep GET /b1s/v2/Items 401 Invalid session POST /b1s/v2/Login 200 OK, nieuwe B1SESSION GET /b1s/v2/Items, poging 2 Inloggen is volgens SAP een zware bewerking. De koppeling hergebruikt de sessie en logt alleen opnieuw in na een 401.
Een sessie op de Service Layer verloopt na 30 minuten zonder aanroep. De koppeling vangt de 401 op, logt opnieuw in en herhaalt de aanroep.

De Service Layer werkt met een sessie, niet met een token per aanroep. De koppeling stuurt POST /b1s/v2/Login met de bedrijfsdatabase, een gebruikersnaam en een wachtwoord, en krijgt een cookie B1SESSION terug met een SessionTimeout van 30 minuten. Elke volgende aanroep stuurt die cookie mee. Een tweede cookie, ROUTEID, houdt de sessie op dezelfde node van de load balancer.

Na 30 minuten zonder aanroep is de sessie weg en geeft de Service Layer 401 Unauthorized met de melding "Invalid session or session already timeout". SAP noemt inloggen zelf een zware bewerking. De koppeling logt daarom niet per aanroep in, maar hergebruikt de sessie en logt alleen opnieuw in na een 401. De gebruiker waarmee de koppeling inlogt is een gewone SAP-gebruiker; zijn autorisaties bepalen wat de koppeling mag lezen en schrijven.

Pagina's van 20 records

SAP documenteert voor de Service Layer geen limiet in verzoeken per minuut. De doorvoer hangt af van je eigen server en van de paginagrootte.

Instelling Standaard Aanpassen
Records per pagina 20 PageSize in b1s.conf, of per aanroep met Prefer: odata.maxpagesize=...
Duur van een sessie 30 minuten SessionTimeout
Webhooks per bedrijf 16 MaxNumberOfWebHooks
Nieuwe pogingen voor een webhook 3, met 2 seconden ertussen (de FAQ van SAP noemt tot 5, van 2 tot 32 seconden) WebhookRetryTimes, WebhookRetryInterval
Time-out van een webhookaanroep 10 seconden WebhookRequestTimeout

De rekensom voor een artikelbestand van 15.000 artikelen. Op de standaardpagina van 20 zijn dat 15.000 / 20 = 750 aanroepen, elk met een odata.nextLink naar de volgende pagina. Met Prefer: odata.maxpagesize=500 zijn het er 30. De koppeling vraagt met $select alleen de velden op die de webshop gebruikt en haalt na de eerste volledige ronde alleen artikelen op die sinds de vorige ronde zijn gewijzigd. Hoe je zo'n som zelf maakt staat in doorvoer berekenen.

Webhooks sinds 10.0 FP 2602

Sinds SAP Business One 10.0 FP 2602 verstuurt de Service Layer meldingen bij een gebeurtenis, bijvoorbeeld sap.b1.Orders.Created.v1. Voor orders bestaan de gebeurtenissen aangemaakt, gewijzigd, verwijderd, gesloten, geannuleerd en heropend. De functie staat per bedrijf standaard uit en heeft een extra onderdeel op de server nodig, de Webhook Messenger Service.

De melding bevat standaard alleen de sleutel van het record. Sinds FP 2608 voegt BizObjProps er extra enkelvoudige velden aan toe, bijvoorbeeld CardCode en DocTotal; orderregels en artikelprijzen kunnen er niet in. De koppeling haalt het record daarna op. SAP's handleiding geeft twee regels voor nieuwe pogingen: de instellingentabel noemt standaard 3 pogingen met 2 seconden ertussen, de FAQ tot 5 pogingen na 2, 4, 8, 16 en 32 seconden. In beide gevallen zijn de pogingen binnen ongeveer een minuut voorbij, en een bericht ouder dan 24 uur wordt weggegooid. Een ontvanger die langer dan een minuut onbereikbaar is, mist dus meldingen. Naast de webhooks draait daarom een controleronde op de wijzigingsdatum, en op versies voor FP 2602 is die ronde de enige weg.

Waar het bij SAP Business One op vastloopt

Speciale prijzen per relatie

Een artikel heeft een prijs per prijslijst (ItemPrices), en een relatie hangt aan één prijslijst. Daarbovenop kent SAP Business One speciale prijzen: een prijs of korting voor één artikel bij één relatie, met perioden (DateFrom en Dateto) en per periode een staffel op aantal. De meeste webshops kennen die drie lagen niet in deze vorm.

De koppeling rekent de lagen daarom om naar wat het platform aankan: een prijslijst per klantgroep, een vaste prijs per klant, of een staffelregel. Loopt een periode af, dan vervalt de prijs in de webshop op dezelfde dag. Zie klantspecifieke prijzen en staffelprijzen.

Voorraad per magazijn is drie getallen

Per artikel en magazijn geeft SAP drie waarden: InStock (ligt er), Committed (toegezegd aan klanten) en Ordered (besteld bij leveranciers). Geen van de drie is het getal dat de webshop moet tonen. Ligt er van artikel KB-2210 in magazijn 01 een voorraad van 20, waarvan 4 toegezegd en 10 in bestelling, dan is er 20 - 4 = 16 vrij te verkopen. De 10 in bestelling tellen pas mee als ze binnen zijn.

Welke magazijnen meetellen leg je per koppeling vast. Een showroom of een afkeurmagazijn dat wordt meegeteld, zet te veel voorraad in de webshop. Zie meerdere magazijnen.

Sleutels, adressen en eigen velden

Veld Wat SAP documenteert Gevolg voor de mapping
CardCode sleutel van de relatie, 15 tekens, verplicht de webshop kent een klant bij e-mailadres; er komt een vertaaltabel tussen
CardName 100 tekens past voor vrijwel elke bedrijfsnaam
Street 100 tekens straat en huisnummer staan vaak samen in dit veld
StreetNo "For Brazil only" in de SDK-documentatie waar het huisnummer staat lezen we uit je bestaande relaties
U_... eigen veld, pas bereikbaar na herstart van de Service Layer een nieuw veld vraagt een geplande herstart

Het adres is het vaakst de plek waar een order blijft hangen: de webshop levert straat, huisnummer en toevoeging los of juist in één regel, en de vervoerder wil ze weer anders. De regels daarvoor staan in adresvelden mappen.

Twee medewerkers en een koppeling die dezelfde order wijzigen, overschrijven elkaar zonder controle. Sinds 10.0 FP 2102 geeft de Service Layer bij orders, leveringen en facturen een ETag mee. De koppeling stuurt die bij een wijziging terug in de header If-Match; is de order intussen gewijzigd, dan weigert SAP de aanroep en haalt de koppeling eerst de nieuwe stand op.

Platformen die we aan SAP Business One koppelen

De koppeling wordt gebouwd op jouw SAP Business One: jouw versie, jouw database, jouw prijslijsten en eigen velden. Per combinatie staat op een eigen pagina wat er specifiek speelt:

Andere ERP-systemen staan op Business Central koppeling, Exact Globe koppeling en Exact Online koppeling. Het overzicht van alle stromen staat op koppelingen, de ERP-kant in het algemeen op ERP koppeling met je webshop.

Wij bouwen de koppeling voor een vaste prijs, en hosten, draaien en bewaken hem daarna voor een vast bedrag per maand. Voor de livegang draait hij als dry run: je ziet per order welke relatie, prijs en regels in SAP zouden ontstaan, zonder dat er iets wordt aangemaakt. Vertel welke versie en database je draait en welke webshop je hebt, dan hoor je welke API beschikbaar is en welke gegevens daarover kunnen.

Veelgestelde vragen

Werkt het ook met SAP Business One op Microsoft SQL Server?

Ja, vanaf SAP Business One 10.0 PL01. Sinds die versie draait de Service Layer ook op Windows met Microsoft SQL Server; daarvoor bestond hij alleen in de versie voor SAP HANA. Een oudere installatie op SQL Server heeft de DI API en de DI Server. De DI API is gebouwd op Microsoft COM en draait op een Windows-machine naast SAP, de DI Server werkt met SOAP.

Is dit hetzelfde als een koppeling met SAP S/4HANA of SAP ECC?

Nee. SAP Business One is een ander product met een eigen database en eigen API's: de Service Layer, de DI API en de DI Server. Wat op deze pagina staat over sessies, entiteiten en velden geldt alleen voor SAP Business One.

Kan de koppeling klantspecifieke prijzen uit SAP Business One halen?

Ja. De Service Layer heeft een entiteit SpecialPrices met als sleutel de relatie en het artikel (CardCode en ItemCode). Daaronder hangen perioden met een begin- en einddatum en staffels per aantal. De koppeling leest ze per relatie en zet ze om naar wat je webshop aankan. Zie klantspecifieke prijzen.

Heeft SAP Business One webhooks?

Sinds SAP Business One 10.0 FP 2602. Ze staan per bedrijf standaard uit en een bedrijf kan standaard 16 webhooks aanmaken. Een melding bevat standaard alleen de sleutel van het record, bijvoorbeeld DocEntry; sinds FP 2608 kun je er met BizObjProps extra enkelvoudige velden aan toevoegen, maar geen orderregels. Op een oudere versie haalt de koppeling wijzigingen op met een filter op de wijzigingsdatum. Zie wat is een webhook.

Komen onze eigen velden mee?

Ja. Eigen velden (user-defined fields) staan in de Service Layer op dezelfde entiteit als de standaardvelden, met het voorvoegsel U_. Een veld dat net is aangemaakt, is pas bereikbaar nadat de Service Layer opnieuw is gestart. Dat staat in de beperkingen die SAP zelf opsomt, en we plannen het herstarten in bij een nieuw veld.

Hoe voorkom je dubbele orders in SAP Business One?

Het ordernummer van de webshop gaat in NumAtCard, het referentieveld van de klant op de order, 100 tekens lang. Voor het aanmaken zoekt de koppeling of er al een order met die referentie bestaat. Een aanroep die halverwege een time-out krijgt, levert bij de nieuwe poging dus geen tweede order op.

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