Platformen
Shopify koppeling met ERP, boekhouding, magazijn en leveranciers
Een Shopify koppeling stuurt orders en klanten naar je ERP of boekhouding en schrijft voorraad per locatie, prijzen en verzendstatus terug in je shop. Je abonnement bepaalt de ruimte: 100 punten per seconde op de standaardplannen, 1.000 op Plus, 10 of 200 locaties en 3 of onbeperkt B2B-catalogi.
Wat is Shopify en wie gebruikt het?
Shopify is een gehost webshopplatform: Shopify draait de servers, jij richt de shop in. Er valt dus niets te installeren en niets te tunen aan de serverkant. Wat een koppeling kan en hoe snel, ligt vast in het abonnement.
| Standaard (Basic, Grow) | Advanced | Plus | |
|---|---|---|---|
| GraphQL Admin API | 100 punten per seconde | 200 punten per seconde | 1.000 punten per seconde |
| Locaties | 10 | 10 | 200 |
| Actieve B2B-catalogi | 3 | 3 | onbeperkt |
| Catalogus per bedrijf | nee | nee | ja |
Die vier regels bepalen de meeste ontwerpkeuzes: hoe lang een volledige voorraadronde duurt, of elk magazijn een eigen locatie kan zijn en of de prijslijsten uit je ERP één op één over kunnen.
Wat je met Shopify koppelt
Shopify is leidend voor orders en nieuwe klanten. Artikelen, voorraad en prijzen komen uit het systeem erachter.
| Stroom | Richting | In Shopify |
|---|---|---|
| Orders | Shopify naar ERP of boekhouding | webhook orders/create, daarna de order via de API |
| Klanten en bedrijven | Shopify naar ERP | klant, of bedrijf met bedrijfslocatie bij B2B |
| Voorraad per locatie | ERP of magazijn naar Shopify | inventorySetQuantities |
| Prijzen en prijslijsten | ERP naar Shopify | variantprijs, priceListFixedPricesAdd |
| Verzending | magazijn naar Shopify | fulfilment met trackingnummer |
| Extra velden | beide kanten op | metafields |
Voor alles wat Shopify niet als eigen veld heeft, zijn er metafields: een levertijd, het artikelnummer uit het ERP, een ETIM-klasse. De koppeling vult ze, het thema toont ze. Voorraad en levertijd uit een leveranciersbestand gaan langs dezelfde weg de shop in; zie leveranciersvoorraad koppelen. De stromen in het algemeen staan op voorraad en beschikbaarheid en orders, klanten en verzending.
Bouw je als bureau de shop en zoek je iemand voor de koppeling erachter, zie dan voor bureaus.
Hoe Shopify data vrijgeeft
GraphQL Admin API en een custom app
De API voor een koppeling is de GraphQL Admin API. De REST Admin API is sinds 1 oktober 2024 een legacy API, en nieuwe publieke apps moeten sinds 1 april 2025 volledig op GraphQL draaien. Wij bouwen op GraphQL.
Toegang loopt via een custom app met een eigen set rechten (access scopes). Custom apps worden aangemaakt in het Dev Dashboard; apps die voor 1 januari 2026 in de Shopify-admin zijn aangemaakt, blijven daar te beheren. De eigenaar van de shop kan een app aanmaken, een medewerker alleen met de permissie App development, Develop. De koppeling vraagt alleen de rechten die de stromen nodig hebben.
Punten in plaats van verzoeken
Shopify telt geen verzoeken maar kostenpunten. Elk veld in een query kost punten, en een query die meer opvraagt kost meer. Per combinatie van app en shop is er een emmer die continu bijvult: 100 punten per seconde op de standaardplannen, 200 op Advanced, 1.000 op Plus. Daarnaast gelden drie vaste grenzen:
- Eén query mag maximaal 1.000 punten kosten, op elk abonnement.
- Een lijst in de invoer bevat maximaal 250 items.
- Bladeren door een lijst stopt bij 25.000 objecten.
Elk antwoord vermeldt requestedQueryCost, actualQueryCost en onder throttleStatus wat er nog in de emmer zit. Is de emmer leeg, dan komt het antwoord THROTTLED terug. De details staan in de documentatie van Shopify over rate limits.
De rekensom voor het uitlezen van 15.000 varianten met voorraad, in pagina's van 250. Dat zijn 60 queries. Stel dat een query 400 punten kost (het echte getal staat in het antwoord en hangt af van de velden die je opvraagt). De ronde kost dan 60 x 400 = 24.000 punten:
| Abonnement | Bijvullen | Duur van de ronde |
|---|---|---|
| Standaard | 100 punten per seconde | 24.000 / 100 = 240 seconden |
| Advanced | 200 punten per seconde | 120 seconden |
| Plus | 1.000 punten per seconde | 24 seconden |
De emmer is per app en per shop. Een tweede app heeft een eigen emmer, maar alles wat de koppeling zelf doet deelt deze ene: een voorraadronde, een prijsronde en de orderverwerking tegelijk gaan elk van dezelfde 100 punten per seconde af. Hoe je zo'n ronde doorrekent staat in doorvoer berekenen.
Bulk operations voor grote sets
Voor de hele catalogus of alle orders van een periode zijn er bulk operations. De koppeling dient één query in, Shopify voert hem op de achtergrond uit en levert een JSONL-bestand. Bulk operations vallen buiten de kostenlimiet van losse queries. Vanaf API-versie 2026-01 mogen er per app en per shop vijf tegelijk lopen; daarvoor was het er één. Een bulk query moet binnen 10 dagen klaar zijn. Het einde meldt Shopify via de webhook bulk_operations/finish.
Webhooks en API-versies
Shopify verwacht binnen vijf seconden antwoord op een webhook. Blijft dat uit, dan volgen tot 8 nieuwe pogingen in vier uur, en daarna wordt het abonnement verwijderd. Hetzelfde bericht kan twee keer aankomen. De koppeling zet elk bericht daarom direct in een wachtrij, antwoordt, en verwerkt daarna. Een controleronde vangt op wat niet aankwam; zie wat is een webhook.
Elk kwartaal komt er een nieuwe API-versie, die minimaal 12 maanden wordt ondersteund. De header X-Shopify-Api-Version op elke webhook laat zien welke versie het bericht heeft gemaakt.
Waar het bij Shopify op vastloopt
Voorraad: acht toestanden en een stand die intussen verandert
Shopify kent per artikel en per locatie acht toestanden: available, committed, reserved, damaged, safety_stock, quality_control, incoming en on_hand. on_hand is wat er fysiek ligt. Een ERP levert meestal één getal. De eerste vraag is dus welk getal dat is: schrijft de koppeling 20 naar available terwijl het ERP de fysieke voorraad bedoelt en er 4 stuks in open orders zitten, dan verkoopt de shop er 4 te veel. Zie welke voorraad toon je in je webshop.
De tweede vraag is wat er gebeurt als de stand in Shopify verandert tussen lezen en schrijven. inventorySetQuantities heeft daarvoor het veld changeFromQuantity: de stand die de koppeling verwacht aan te treffen.
mutation {
inventorySetQuantities(input: {
name: "available"
reason: "correction"
quantities: [{
inventoryItemId: "gid://shopify/InventoryItem/30322695"
locationId: "gid://shopify/Location/124656943"
quantity: 18
changeFromQuantity: 20
}]
}) @idempotent(key: "4f5b6ebf-143c-4da5-8d0f-fb8553bfd85d") {
userErrors { code message }
}
}
Staat Shopify intussen op 17 omdat er een weborder van 3 stuks binnenkwam, dan weigert Shopify de wijziging met CHANGE_FROM_QUANTITY_STALE. Zonder die controle zou de koppeling 18 schrijven en de 3 verkochte stuks weer beschikbaar maken. Na de weigering leest de koppeling de stand opnieuw, verrekent de weborder die het ERP nog niet kende (18 - 3 = 15) en schrijft 15 met changeFromQuantity 17. De sleutel achter @idempotent is vanaf API-versie 2026-04 verplicht en voorkomt dat een herhaalde poging na een time-out de wijziging twee keer doorvoert.
Locaties
Elk magazijn, elke winkel en elke fulfilmentpartij is in Shopify een locatie, en voorraad staat per locatie. Basic, Grow en Advanced hebben 10 locaties, Plus 200. Gedeactiveerde locaties en apps die als locatie voorraad houden tellen niet mee. Heeft je ERP 14 magazijnen, dan kiest de koppeling onder Plus welke magazijnen samen één locatie vormen. Zie meerdere magazijnen.
Varianten
Een product heeft maximaal 2.048 varianten en 3 opties. Een artikel met maat, kleur, lengte en materiaal past dus niet in één product: de vierde eigenschap wordt een apart product of een metafield. Heeft een shop 500.000 varianten of meer, dan mogen er per dag nog 10.000 nieuwe bij; op Plus geldt die limiet niet. Een eerste import van een groothandelscatalogus plant de koppeling daarop. Zie varianten.
B2B-catalogi en prijslijsten
Een prijslijst in Shopify hangt aan een catalogus en bestaat uit een procentuele aanpassing plus vaste prijzen per variant. Vaste prijzen schrijft de koppeling met priceListFixedPricesAdd, in porties van maximaal 250. Onder Plus zijn er 3 actieve catalogi. Een ERP met 40 debiteurprijslijsten wordt dan teruggebracht tot drie niveaus, of de prijs per klant wordt op een andere manier in de shop gezet. Op Plus krijgt elk bedrijf zijn eigen catalogus. Welke producten een klant mag zien is dezelfde vraag; zie assortiment per klant.
Systemen die we aan Shopify koppelen
De koppeling wordt gebouwd op jouw shop, jouw abonnement en jouw systemen. Per combinatie staat op een eigen pagina wat er specifiek speelt:
- Shopify Exact Online koppeling
- Shopify AFAS koppeling
- Shopify Business Central koppeling
- Picqer Shopify koppeling
- Akeneo Shopify koppeling
De systemen zelf: Exact Online koppeling, AFAS webshop koppeling, Business Central koppeling en Picqer-koppeling. Draait je shop op WordPress, zie dan WooCommerce koppeling. Het overzicht van alle stromen en systemen staat op koppelingen.
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 variant en per locatie welke voorraad en prijs er in Shopify zou komen, zonder dat er iets wijzigt. Vertel welk abonnement je hebt en welke systemen achter je shop staan, dan hoor je hoe lang een volledige ronde duurt en of je prijslijsten in drie catalogi passen.
Veelgestelde vragen
Welk Shopify-abonnement heb ik nodig voor een koppeling?
Een koppeling werkt op elk abonnement. Het abonnement bepaalt wel de ruimte. De GraphQL Admin API geeft 100 punten per seconde op de standaardplannen, 200 op Advanced en 1.000 op Plus. Basic, Grow en Advanced hebben 10 locaties, Plus 200. B2B zit op alle vier, met 3 actieve catalogi onder Plus en onbeperkt op Plus.
Heb ik Shopify Plus nodig voor B2B-prijzen uit mijn ERP?
Niet per se. Bedrijven, bedrijfslocaties, staffelprijzen, hoeveelheidsregels en betaaltermijnen zitten ook op Basic, Grow en Advanced. De grens is het aantal catalogi: 3 actieve catalogi over al je B2B-markten. Een catalogus direct aan één bedrijf hangen, voor prijzen op klantniveau, kan alleen op Plus. Heeft je ERP 40 prijslijsten, dan passen die onder Plus niet één op één. Zie klantspecifieke prijzen.
Wie moet de app aanmaken waarmee de koppeling toegang krijgt?
De koppeling krijgt toegang via een custom app met alleen de rechten die de stromen nodig hebben. Custom apps maak je aan in het Dev Dashboard van Shopify. De eigenaar van de shop kan dat altijd; een medewerker heeft de permissie App development, Develop nodig. Een collaborator-account van een bureau heeft geen toegang tot het Dev Dashboard, dus de eigenaar of een medewerker zet deze stap.
Wat gebeurt er als de koppeling de limiet van Shopify raakt?
Shopify beantwoordt het verzoek dan met de foutcode THROTTLED, vergelijkbaar met een 429. De koppeling wacht tot er weer punten zijn; Shopify raadt een pauze van één seconde aan. Het verzoek blijft in de wachtrij en gaat daarna door. Elk antwoord vermeldt wat de query kostte en hoeveel punten er nog zijn, dus de koppeling remt af voordat de emmer leeg is. Zie Shopify API limieten.
Kan de koppeling orders ouder dan 60 dagen ophalen?
Standaard niet. De rechten voor orders geven toegang tot orders van de laatste 60 dagen. Voor oudere orders is het recht read_all_orders nodig, en dat moet bij Shopify worden aangevraagd. Voor een lopende koppeling is 60 dagen genoeg. Bij het overzetten van historie naar een nieuw ERP, of bij een retour op een order van drie maanden oud, is het extra recht nodig.
Moet de koppeling elk kwartaal worden aangepast?
Shopify brengt elk kwartaal een nieuwe API-versie uit en ondersteunt elke versie minimaal 12 maanden. Een koppeling die blijft vragen om een versie die niet meer bestaat, krijgt antwoord van de oudste versie die nog wel bestaat. Velden die daarin zijn vervallen, zijn dan zonder foutmelding weg. Wij volgen de wijzigingen per versie en zetten de koppeling over voordat een versie vervalt. Dat hoort bij het beheer.
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