Shopify en SAP Business One
Shopify SAP Business One koppeling
Relaties uit SAP Business One worden bedrijven in Shopify B2B, prijslijsten en speciale prijzen worden catalogi, en magazijnen worden locaties. Orders, met het inkoopordernummer van de klant, gaan als verkooporder naar SAP. Gebouwd op jouw SAP-inrichting en jouw Shopify-plan, en daarna door ons gedraaid en bewaakt.
Wat je tussen Shopify en SAP Business One koppelt
Shopify geeft gegevens vrij via de GraphQL Admin API, SAP Business One via de Service Layer, de OData-API op poort 50000. Bij deze combinatie draait het meestal om B2B: relaties met eigen prijzen die in Shopify als bedrijf bestellen.
| Stroom | Richting | Shopify | SAP Business One |
|---|---|---|---|
| Relaties | naar Shopify | companyCreate, companyLocationCreate |
BusinessPartners |
| Artikelen | naar Shopify | productSet, varianten met sku |
Items |
| Prijzen | naar Shopify | catalogus met prijslijst | PriceLists, SpecialPrices |
| Voorraad | naar Shopify | inventorySetQuantities per locatie |
ItemWarehouseInfoCollection |
| Orders | naar SAP | webhook orders/create, poNumber |
Orders met DocumentLines |
| Leveringen | naar Shopify | fulfillment met trackingnummer | DeliveryNotes |
Een B2B-order in Shopify weet via purchasingEntity voor welk bedrijf en welke locatie hij is geplaatst. Die locatie hoort bij een CardCode in SAP, en zo komt de order op de juiste relatie zonder te zoeken op e-mailadres. Hoe dit in een ERP-koppeling past staat op ERP koppeling met je webshop.
Welk systeem is leidend, per gegeven
| Gegeven | Leidend | Richting | Gedrag |
|---|---|---|---|
Relatie, CardCode, adressen |
SAP | naar Shopify | bedrijf plus een locatie per afleveradres |
| Contactpersonen die inloggen | Shopify | blijft in Shopify | de koppeling maakt geen logins aan |
ItemCode, omschrijving |
SAP | naar Shopify | sku op de variant |
| Prijslijst en speciale prijzen | SAP | naar Shopify | één catalogus per locatie, in de SAP-volgorde |
| Voorraad per magazijn | SAP | naar Shopify | per locatie, met de verwachte waarde erbij |
Order en poNumber |
Shopify | naar SAP | één keer, Shopify-ordernummer als sleutel |
Wat Shopify en SAP Business One anders bewaren
Speciale prijzen tegenover catalogi
Een relatie in SAP hangt aan één prijslijst (PriceListNum). Daarboven staan speciale prijzen per artikel en relatie, met perioden (DateFrom, Dateto) en per periode een staffel. Een speciale prijs gaat in SAP voor op alle andere prijzen van die relatie.
Shopify B2B werkt met catalogi. Een catalogus heeft een prijslijst met vaste prijzen per variant en hangt aan een of meer bedrijfslocaties. Heeft een locatie meer dan één catalogus, dan krijgt de koper de laagste prijs. Geef je de locatie van relatie C10432 de groothandelscatalogus van € 9,20 en een eigen catalogus met de afgesproken € 9,60, dan betaalt de klant € 9,20. De koppeling rekent daarom per locatie zelf de prijs uit zoals SAP hem zou rekenen, en geeft de locatie één catalogus: de speciale prijs waar die bestaat, en de prijslijst voor de rest.
Dat kost catalogi. 300 relaties met eigen speciale prijzen zijn 300 catalogi. Onder Plus zijn er 3 actieve catalogi; op Plus 10.000 per winkel en 25 per locatie. Een prijslijst in Shopify heeft geen begin- of einddatum, dus de koppeling zet een periodeprijs op de begindatum in de catalogus en haalt hem op de einddatum weg. Zie klantspecifieke prijzen.
Magazijnen tegenover locaties
Per artikel en magazijn geeft SAP InStock, Committed en Ordered. Een magazijn heeft een WarehouseCode van maximaal 8 tekens. Shopify heeft locaties: 10 op Basic, Grow en Advanced, 200 op Plus. Per locatie houdt Shopify zelf bij wat er aan open orders hangt (committed), en wat er te koop is heet available.
SAP en Shopify trekken dezelfde order dus allebei af, op een ander moment:
| Moment | SAP InStock / Committed |
Shopify committed |
Wat de koppeling als available schrijft |
|---|---|---|---|
| Order geplaatst, nog niet in SAP | 20 / 0 | 4 | 20 - 0 - 4 = 16 |
| Order in SAP | 20 / 4 | 4 | 20 - 4 = 16 |
| Geleverd in SAP, fulfillment in Shopify | 16 / 0 | 0 | 16 |
De koppeling trekt van InStock het toegezegde aantal af en daarnaast de Shopify-orders die SAP nog niet heeft. Hij schrijft met inventorySetQuantities en geeft sinds API-versie 2026-04 bij elke regel changeFromQuantity mee: de waarde die hij verwacht. Is de voorraad in Shopify intussen veranderd, door een order of een correctie in de winkel, dan weigert Shopify de wijziging en leest de koppeling eerst opnieuw. Zie welke voorraad toon je in je webshop.
Ordernummers en het inkoopordernummer
Een Shopify-order heeft een naam als #1042. Een B2B-order heeft daarnaast het poNumber van de koper. In SAP is NumAtCard het veld waarmee de klant de order herkent, en dat staat op pakbon en factuur. Bij een B2B-order gaat daar het poNumber in. Het Shopify-ordernummer gaat in een eigen veld (U_ShopifyOrder), en daarop zoekt de koppeling voordat hij een order aanmaakt. Een nieuw eigen veld is in de Service Layer pas bereikbaar na een herstart van de Service Layer; die plannen we in bij de inrichting.
De technische werkelijkheid van deze combinatie
| Onderwerp | Shopify | SAP Business One, Service Layer |
|---|---|---|
| Limiet | herstel van 100 punten per seconde, 200 op Advanced, 1.000 op Plus | geen gedocumenteerd; de grens is je server |
| Boven de grens | 200 OK met fout THROTTLED |
trage antwoorden |
| Per verzoek | invoerlijsten tot 250 items | 20 records per pagina, aan te passen |
| Webhooks | 8 nieuwe pogingen in 4 uur, daarna opgeheven | vanaf FP 2602: 3 pogingen, 2 seconden ertussen |
| Toegang | app met access token en scopes | sessie, verloopt na 30 minuten zonder aanroep |
Nagelezen op 3 oktober 2026 in de documentatie van Shopify en de handleiding Working with SAP Business One Service Layer.
Voorraad doorgerekend. 4.000 varianten op 3 locaties zijn 12.000 voorraadregels. inventorySetQuantities neemt 250 regels per aanroep: 12.000 / 250 = 48 aanroepen. Uit SAP is het voorraadoverzicht per artikel te lezen met $select op ItemCode en ItemWarehouseInfoCollection: 4.000 artikelen bij 500 per pagina zijn 8 aanroepen. Na de eerste ronde gaan alleen gewijzigde regels mee. Je eigen aantallen reken je door met doorvoer berekenen.
Throttling ziet er anders uit. Een vertraagd verzoek aan Shopify geeft geen 429 maar 200 OK met de fout THROTTLED in het antwoord. Een koppeling die alleen op de statuscode let, ziet dat als gelukt. De koppeling leest de fout en het veld throttleStatus en wacht tot er weer punten zijn. Meer in Shopify API-limieten.
Webhooks aan twee kanten. Shopify probeert een webhook 8 keer in 4 uur en heft het abonnement daarna op. SAP probeert standaard 3 keer met 2 seconden ertussen en gooit een bericht na 24 uur weg. Aan beide kanten draait daarom een controleronde op de wijzigingsdatum, zodat een gemiste melding de volgende ronde alsnog binnenkomt.
Wat een standaardkoppeling hier niet doet
Apps in de Shopify App Store die SAP Business One koppelen, beschrijven wat ze doen. Bij een van die apps stond:
- Artikelen en artikelgroepen, één kant op. Items worden producten en artikelgroepen categorieën, van SAP naar Shopify.
- Geen orders, prijzen of voorraad per locatie in de beschrijving van de app.
- SAP Business One 10.0 op HANA als voorwaarde, met de Service Layer ingericht door je SAP-partner.
Een gebouwde koppeling schrijft orders met inkoopordernummer naar SAP, rekent speciale prijzen per locatie om naar catalogi en houdt de voorraad per magazijn gelijk.
Als het misgaat
| Wat er misgaat | Wat de koppeling doet | Wat je ziet |
|---|---|---|
Shopify antwoordt THROTTLED |
wachten op punten, verzoek herhalen | niets |
changeFromQuantity klopt niet meer |
voorraad opnieuw lezen, dan schrijven | een regel in het logboek |
SAP-sessie verlopen, 401 |
opnieuw inloggen, aanroep herhalen | niets |
Bedrijfslocatie zonder CardCode |
de order wacht, andere orders gaan door | de order en het bedrijf |
| Catalogus vol, 25 per locatie | geen nieuwe catalogus, prijs niet gezet | de locatie en de prijzen |
| Webhook-abonnement opgeheven | opnieuw aangemaakt, gemiste orders opgehaald | een regel in het logboek |
Een order die blijft falen wordt met de oorspronkelijke inhoud bewaard en gaat opnieuw mee zodra de oorzaak is opgelost. Voor livegang draait de koppeling als dry run: per bedrijfslocatie welke catalogus en welke prijzen er in Shopify zouden komen, en per order welke relatie en regels er in SAP zouden ontstaan, zonder iets te schrijven.
Wij hosten en bewaken de koppeling en passen hem aan als Shopify een nieuwe API-versie uitbrengt of SAP een feature pack. De systeemkant staat op SAP Business One koppeling, de platformkant op Shopify koppeling, en alle stromen op koppelingen. Verwante combinaties: WooCommerce SAP Business One koppeling en Magento SAP Business One koppeling. Vertel welk Shopify-plan en welke SAP-versie je hebt.
Veelgestelde vragen
Heb ik Shopify Plus nodig?
Voor B2B niet: bedrijven, catalogi, staffelprijzen en inkoopordernummers zitten in Basic, Grow, Advanced en Plus. Onder Plus zijn er 3 actieve catalogi, en een catalogus direct aan een bedrijfslocatie hangen kan alleen op Plus. Heb je in SAP speciale prijzen voor tientallen relaties, dan is Plus nodig, met tot 25 catalogi per locatie en 10.000 per winkel.
Welke SAP Business One-versie heb ik nodig?
Een versie met de Service Layer: op SAP HANA, of op Microsoft SQL Server vanaf 10.0 PL01. Webhooks uit SAP vragen 10.0 FP 2602. Op een oudere versie haalt de koppeling wijzigingen in artikelen en voorraad op met een filter op de wijzigingsdatum.
Hoe worden SAP-magazijnen locaties in Shopify?
Elk magazijn dat online mag verkopen wordt een locatie, met de WarehouseCode als sleutel. Shopify heeft 10 locaties op Basic, Grow en Advanced en 200 op Plus. Magazijnen die niet online verkopen, zoals een showroom, laat de koppeling weg of telt hij op bij een andere locatie.
Wat gebeurt er met een speciale prijs met een einddatum?
Een prijslijst in Shopify heeft geen begin- of einddatum. De koppeling zet de speciale prijs op de begindatum uit SAP in de catalogus en haalt hem op de einddatum weg, waarna de prijs uit de gewone prijslijst weer geldt. Je ziet in het logboek welke prijzen op welke dag zijn gewijzigd.
Gaat het inkoopordernummer van de klant mee naar SAP?
Ja. Een B2B-order in Shopify heeft een poNumber. Dat gaat naar NumAtCard, het referentieveld van de klant op de SAP-order, zodat het op de pakbon en factuur staat. Het Shopify-ordernummer bewaart de koppeling in een eigen veld, bijvoorbeeld U_ShopifyOrder, en gebruikt het als sleutel tegen dubbele orders.
Kunnen staffelprijzen uit SAP naar Shopify?
Ja. Een speciale prijs in SAP kan per periode een staffel op aantal hebben. In Shopify worden dat prijsbreuken op aantal in de prijslijst van de catalogus, en die zitten in alle vier de plannen met B2B. Zie staffelprijzen.
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