Naar de inhoud
SyncMyShop

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.

Een voorraadwijziging die botst met een weborder in Shopify De koppeling leest in Shopify een beschikbare voorraad van 20. Een weborder van 3 stuks brengt Shopify op 17. Het ERP meldt 18. De koppeling schrijft 18 met changeFromQuantity 20 en Shopify weigert met CHANGE_FROM_QUANTITY_STALE. De koppeling leest opnieuw, trekt de weborder af en schrijft 15 met changeFromQuantity 17. ERP telling Koppeling wachtrij Shopify locatie Magazijn lees available available: 20 Weborder van 3 stuks: Shopify staat nu op 17. telling: 18 stuks quantity 18, changeFrom 20 CHANGE_FROM_QUANTITY_STALE lees opnieuw available: 17 18 - 3 = 15 quantity 15, changeFrom 17 geslaagd, available: 15
Een voorraadwijziging die botst met een weborder. Door de laatst bekende stand mee te sturen overschrijft de koppeling de verkoop van 3 stuks niet.

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:

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

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

Of mail direct: carsten@syncmyshop.com