Systemen
NetSuite koppeling met je webshop: ook voor de Nederlandse vestiging in OneWorld
Een NetSuite koppeling zet webshoporders als sales order in NetSuite en haalt artikelen, voorraad per locatie en verzendingen terug. De grens zit in het aantal gelijktijdige verzoeken: 5 op een Standard-account, gedeeld met elke andere koppeling. Voor een Nederlandse vestiging komen daar de subsidiary en het btw-nummer bij, en de subsidiary ligt na de eerste boeking vast.
Wat is NetSuite en wie gebruikt het?
NetSuite is het cloud-ERP van Oracle: grootboek, voorraad, orderbeheer, inkoop en CRM in één systeem. Een bedrijf met vestigingen in meerdere landen draait OneWorld, de editie voor meerdere juridische entiteiten: één account met een subsidiary per land. De Nederlandse B.V. is er daar één van, met eigen valuta, btw-instellingen en vaak een eigen webshop.
Elk account heeft een eigen API-adres in de vorm 1234567.suitetalk.api.netsuite.com, en de sandbox een eigen adres ernaast. Voor de koppeling betekent OneWorld dat elke klant, elk artikel en elke order bij een subsidiary hoort, en dat de koppeling dat bij elke order goed moet hebben.
Wat je met NetSuite koppelt
| Stroom | Richting | Record in NetSuite |
|---|---|---|
| Orders | webshop naar NetSuite | Sales Order |
| Klanten | webshop naar NetSuite | Customer, met subsidiary en vatregnumber |
| Betalingen | webshop naar NetSuite | Customer Deposit |
| Artikelen en varianten | NetSuite naar webshop | Inventory Item, matrix items |
| Voorraad per locatie | NetSuite naar webshop | beschikbaar per Location |
| Verzendingen | NetSuite naar webshop | Item Fulfillment |
| Prijzen | NetSuite naar webshop | price levels |
De sales order krijgt het webshopordernummer als external ID. De koppeling schrijft hem met PUT /services/rest/record/v1/salesOrder/eid:WEB-10482: bestaat de order nog niet, dan maakt NetSuite hem aan, bestaat hij al, dan wordt hij bijgewerkt. Een nieuwe poging na een time-out maakt zo nooit een tweede order. Het inkoopordernummer van een zakelijke klant gaat naar otherrefnum, het veld PO #. Zie dubbele klanten en debiteuren.
Let op de status van een nieuwe order. Gebruikt je bedrijf een goedkeuringsstap voor sales orders, dan is Pending Approval de standaardstatus; anders Pending Fulfillment. Een webshoporder in Pending Approval wordt niet gepickt tot iemand hem goedkeurt. Welke status de koppeling meegeeft, leggen we per webshop vast.
Hoe NetSuite data vrijgeeft
REST, SuiteQL, RESTlets en SOAP
| Ingang | Waarvoor | Grens |
|---|---|---|
| SuiteTalk REST | records lezen en schrijven, upsert op external ID | 1.000 resultaten per pagina |
| SuiteQL via REST | grote hoeveelheden lezen met SQL | 100.000 rijen per query |
| RESTlet (SuiteScript) | één aanroep die een order met alle opzoekingen maakt | 5.000 usage units per aanroep |
| SuiteTalk SOAP | oudere koppelingen | alle endpoints uit met release 2028.2 |
Nieuwe koppelingen gaan op REST met OAuth 2.0. Een access token is 60 minuten geldig. Een koppeling zonder mens ertussen gebruikt de client credentials flow met een certificaat; dat certificaat is maximaal twee jaar geldig, en een integration record kan er vijf tegelijk actief hebben. De koppeling draait onder een eigen rol met alleen de rechten voor zijn stromen, nooit als Administrator.
Gelijktijdige verzoeken per account
| Service tier | Gelijktijdige verzoeken |
|---|---|
| Standard | 5 |
| Premium | 15 |
| Enterprise en Ultimate | 20 |
| Per SuiteCloud Plus-licentie | 10 erbij |
Dat getal geldt voor het hele account. Een Standard-account met een 3PL-koppeling, een EDI-partner en een rapportage-export heeft drie andere partijen op dezelfde 5 plekken. Daarboven antwoordt REST met een 429:
{
"status": 429,
"o:errorDetails": [{
"detail": "Concurrent request limit exceeded. Request blocked.",
"o:errorCode": "CONCURRENCY_LIMIT_EXCEEDED"
}]
}
De rekensom voor een achterstand van 3.000 orders na een storing, op een Standard-account waar de webshopkoppeling 2 van de 5 plekken krijgt. Als het wegschrijven van één order 2 seconden duurt (een aanname; het hangt af van regels en scripts op je account), verwerkt elke plek 30 orders per minuut, samen 60. De 3.000 orders zijn dan in 50 minuten binnen. Sneller gaat alleen met meer plekken: een SuiteCloud Plus-licentie, of minder andere koppelingen tegelijk. Meer over deze som staat op doorvoer berekenen.
Governance units in een RESTlet
Een RESTlet heeft 5.000 usage units per aanroep. Een sales order is een transactierecord: aanmaken of laden kost 10 units, opslaan 20. Een SuiteQL-query kost 10. Een order met twee opzoekingen, voor de klant en voor de artikelen, kost dus 10 + 10 + 10 + 20 = 50 units. In één RESTlet-aanroep passen 5.000 / 50 = 100 orders. Met een Customer Deposit erbij, nog eens 10 + 20, wordt het 80 units per order en passen er 62. De koppeling stuurt batches van 50 orders en houdt zo ruimte voor een order die een nieuwe klant nodig heeft.
Waar het bij NetSuite op vastloopt
Subsidiary, valuta en btw-nummer
In OneWorld hoort een klant bij één subsidiary. NetSuite schrijft in de veldhelp dat die keuze vastligt zodra er een transactie voor de klant geboekt is. Een webshopklant die onder de verkeerde subsidiary belandt, krijgt dus een tweede klantrecord. Een order voor subsidiary 3 kan alleen artikelen bevatten die voor subsidiary 3 beschikbaar zijn; anders volgt een foutcode met één regel uitleg, bijvoorbeeld:
INVALID_KEY_OR_REF: Invalid item reference key 4417 for subsidiary 3.
De koppeling bepaalt de subsidiary met een vaste regel per webshop, controleert artikel en klant vooraf, en meldt een fout met de artikelnaam in plaats van het interne id. Het btw-nummer van een zakelijke klant gaat naar vatregnumber op de klant. Zie bedragen en btw mappen.
Custom fields en matrix items
Elk NetSuite-account heeft eigen velden met de voorvoegsels custbody (orderkop), custcol (orderregel), custitem (artikel) en custentity (klant), ooit benoemd door wie het account inrichtte. custbody_web_order_no naast custitem14 is normaal. De mapping begint met een lijst: welke velden verplicht zijn, welke een script vult en welke niemand meer gebruikt.
Varianten zijn matrix items: een parent met subitems, één per combinatie van opties, tot 2.000 combinaties. Alleen de subitems komen op een order. De webshop kent één product met varianten, dus de koppeling houdt per subitem bij welke variant erbij hoort. Zie varianten.
Adressen zonder huisnummerveld
Een NetSuite-adres heeft addr1 en addr2, elk tot 50 tekens, addr3, en addressee en attention voor de naam op het label. Er is geen veld voor huisnummer of toevoeging. Van de webshop naar NetSuite gaat dat goed: Dorpsstraat 12 A past in addr1. De andere kant op is het werk: een 3PL of vervoerder die straat, huisnummer en toevoeging los wil hebben, krijgt ze uit een regel die de koppeling eerst moet splitsen. Zie adresvelden mappen.
Platformen die we aan NetSuite koppelen
De koppeling wordt gebouwd op jouw account: jouw subsidiaries, custom fields en limiet. De platformen staan op Shopify koppeling, WooCommerce koppeling en Magento koppeling. Andere ERP-systemen: Business Central koppeling, SAP Business One koppeling en Odoo koppeling. De ERP-kant in het algemeen staat op ERP koppeling met je webshop, alle stromen 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 order welke klant, subsidiary en status in NetSuite zouden ontstaan, zonder dat er iets wordt geschreven. Vertel welke service tier en subsidiaries je hebt, dan hoor je hoeveel ruimte er is voor de webshop.
Veelgestelde vragen
Hoeveel verzoeken kan NetSuite tegelijk aan?
Per account 5 op Standard, 15 op Premium en 20 op Enterprise en Ultimate. Elke SuiteCloud Plus-licentie geeft er 10 bij. Die grens geldt voor REST, SOAP en RESTlets samen, van alle koppelingen op het account. Het getal voor jouw account staat onder Setup, Integration, Integration Management, Integration Governance.
Wat gebeurt er als de grens bereikt is?
NetSuite weigert het verzoek. REST geeft HTTP 429 met CONCURRENCY_LIMIT_EXCEEDED, een RESTlet HTTP 400 met SSS_REQUEST_LIMIT_EXCEEDED. Oracle verwacht dat de client het later opnieuw probeert, met een pauze die groeit. Onze koppeling houdt het verzoek in een wachtrij en draait met minder gelijktijdige verzoeken dan het account toestaat. Zie wat is een rate limit.
Werkt de koppeling met onze sandbox?
Ja, en de sandbox heeft dezelfde limiet als productie. Bij elke sandbox-refresh verwijdert NetSuite de token key en token secret; die worden daarna opnieuw aangemaakt. Interne id's van records die alleen in de sandbox bestonden zijn na een refresh weg. Daarom mappen we op script-id's en external ID's.
Moeten we nog iets met SOAP?
Als je huidige koppeling SOAP gebruikt wel. Volgens Oracle is het 2025.2-endpoint het laatste geplande, vanaf 2027.1 kunnen er geen nieuwe SOAP-koppelingen meer gebouwd worden en met release 2028.2 gaan alle SOAP-endpoints uit. Een bestaande SOAP-koppeling moet voor die release naar REST. Zie bestaande koppeling vervangen.
Kan een bestaande klant naar een andere subsidiary?
Niet meer zodra er een transactie voor die klant geboekt is. NetSuite legt de subsidiary op de klant vast na de eerste boeking. Een webshopklant die per ongeluk onder de Amerikaanse moeder is aangemaakt, wordt dan een nieuwe klant onder de Nederlandse B.V. De koppeling kiest de subsidiary daarom met een vaste regel per webshop.
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