Systemen
Exact Online koppeling met je webshop: houd Exact, koppel de rest
Een Exact Online koppeling zet webshoporders als verkooporder, factuur of boeking in je administratie en stuurt voorraad, prijzen en leveringen terug naar je webshop. Wat er kan landen hangt af van je pakket, en hoe snel het gaat van twee getallen: 60 verzoeken per minuut en 5.000 per dag.
Wat is Exact Online en welke variant heb je?
Exact Online is het online boekhoud- en ERP-pakket van Exact, veel gebruikt in het Nederlandse mkb. Het bestaat uit pakketten per soort bedrijf, waaronder Boekhouden, Handel en Productie, elk in meerdere edities. Voor een koppeling is dat de eerste vraag, want de API geeft per resource aan in welk pakket hij werkt. De on-premise voorganger die bij veel groothandels draait is een ander product met een andere techniek: zie Exact Globe koppeling.
| Wat er in Exact landt of uit Exact komt | Resource in de API | Pakket volgens de API-documentatie |
|---|---|---|
| Verkoopboeking | salesentry/SalesEntries |
geen beperking genoemd |
| Verkoopfactuur | salesinvoice/SalesInvoices |
onder meer Boekhouden, Handel en Productie |
| Verkooporder | salesorder/SalesOrders |
Handel en Productie, alle edities |
| Levering met trackingnummer | salesorder/GoodsDeliveries |
Handel en Productie, alle edities |
| Voorraadpositie per artikel | sync/Inventory/StockPositions |
Handel en Productie, alle edities |
| Artikel per magazijn | inventory/ItemWarehouses |
Handel en Productie, alleen Plus, Professional en Premium |
De documentatie gebruikt de Engelse pakketnamen: Accounting voor Boekhouden, Wholesale & Distribution voor Handel, Manufacturing voor Productie. Met Boekhouden kan een webshoporder dus als factuur of boeking landen en niet als verkooporder. Voorraad per magazijn via ItemWarehouses vraagt een van de drie hoogste edities.
Wat je met Exact Online koppelt
In de meeste koppelingen is Exact Online leidend voor artikelen, voorraad en prijzen, en de webshop voor orders en nieuwe klanten. Per stroom ligt vast welke kant de waarheid heeft; dat principe staat uitgewerkt op ERP koppeling met je webshop.
| Stroom | Richting | Resource in Exact Online |
|---|---|---|
| Orders | webshop naar Exact | SalesOrders, SalesInvoices of SalesEntries |
| Klanten | webshop naar Exact | crm/Accounts en crm/Addresses |
| Artikelen | Exact naar webshop | logistics/Items |
| Voorraad | Exact naar webshop | sync/Inventory/StockPositions |
| Prijzen en prijsafspraken | Exact naar webshop | logistics/SalesItemPrices |
| Leveringen | Exact naar webshop | salesorder/GoodsDeliveries |
Een verkooporder heeft twee verplichte onderdelen: OrderedBy, de klant als GUID, en minstens één orderregel met Item, het artikel als GUID. De rest is mapping. Zo ziet het verzoek eruit voor order 10482 van Bakker Installatie B.V.:
POST /api/v1/1234567/salesorder/SalesOrders HTTP/1.1
Host: start.exactonline.nl
Authorization: Bearer eyJ0eXAi...
Content-Type: application/json
{
"OrderedBy": "8f3c1e52-7a40-4c1b-9d2e-5b1f0a6c3e77",
"YourRef": "WEB-10482",
"Description": "Webshoporder 10482",
"PaymentCondition": "30",
"SalesOrderLines": [
{
"Item": "b1d7a0c4-2f6e-4e0a-8c11-93a4d5e6f012",
"Quantity": 12, "NetPrice": 17.08, "VATCode": "4"
}
]
}
Het getal 1234567 in het pad is de divisie: het nummer van de administratie. VATCode en PaymentCondition zijn codes uit jouw administratie, geen percentages of dagen. In dit voorbeeld staat 4 voor 21% exclusief; in een andere administratie kan dat een andere code zijn.
Naast de webshop hangen aan dezelfde administratie vaak een magazijnsysteem, een verzendplatform en een marktplaats. Voor Picqer staat dat op Picqer Exact Online koppeling. Welke velden per stroom meegaan staat op orders, klanten en verzending en voorraad en beschikbaarheid.
Hoe Exact Online data vrijgeeft
REST API met een divisie in elk pad
Exact Online heeft een REST API op basis van OData, met JSON als antwoord. Elk pad begint met /api/v1/{division}/. Een koppeling die het verkeerde divisienummer gebruikt, boekt zonder foutmelding in een andere administratie waar dezelfde gebruiker rechten op heeft. Het nummer van de actieve administratie komt uit /api/v1/current/Me. Wij leggen de divisie per koppeling vast en controleren hem bij elke start.
Inloggen met OAuth 2.0
De koppeling krijgt toegang via OAuth 2.0. Een beheerder van de administratie logt één keer in bij Exact en geeft toestemming; het wachtwoord komt niet bij de koppeling terecht en de toestemming is in Exact weer in te trekken. Voor de tokens gelden vaste regels:
- Een access token is 600 seconden geldig, dus 10 minuten.
- Een nieuw access token is pas op te vragen 9 minuten en 30 seconden na het vorige. Eerder vragen geeft een 401.
- Bij elke verversing komt er een nieuw refresh token en vervalt het oude direct.
- Een refresh token is 30 dagen geldig. Staat de koppeling langer stil, dan moet de beheerder opnieuw toestemming geven.
Het derde punt is waar zelfgebouwde scripts op breken. Twee processen die tegelijk verversen krijgen elk een antwoord, en één van de twee bewaart een token dat al vervallen is. Daarna geeft elk verzoek een 401. Bij ons ververst één proces het token en lezen alle andere het uit dezelfde opslag.
De limieten: 60 per minuut, 5.000 per dag
Per app en per administratie staat Exact Online 60 verzoeken per minuut en 5.000 per dag toe. Wat erboven komt krijgt HTTP 429. Elk antwoord draagt vijf headers, waaronder X-RateLimit-Remaining voor wat er die dag nog over is en X-RateLimit-Minutely-Remaining voor de lopende minuut. De volledige regeling staat in de documentatie van Exact over API-limieten.
Een gewoon endpoint geeft 60 records per pagina. De bulk- en sync-endpoints geven er 1.000 en Exact raadt de sync-endpoints aan. Een sync-endpoint onthoudt niets voor je: de koppeling bewaart de hoogste Timestamp uit het vorige antwoord en vraagt daarna alleen wat nieuwer is. Dat verschil bepaalt het hele ontwerp:
- 12.000 artikelen ophalen via
logistics/Itemskost 12.000 / 60 = 200 verzoeken. - Dezelfde 12.000 artikelen via
sync/Logistics/Itemskost 12 verzoeken, en bij de volgende ronde 1 verzoek voor alleen de wijzigingen. - De voorraad per artikel opvragen via
read/logistics/StockPositionkost 1 verzoek per artikel: 12.000 verzoeken, ruim twee dagbudgetten voor één ronde.
Een dagindeling die past, met een voorraadronde elke 5 minuten en een ronde voor artikelen, prijzen en relaties elk uur:
| Stroom | Rekensom | Verzoeken per dag |
|---|---|---|
| Voorraad via sync | 12 rondes per uur x 24 uur | 288 |
| Artikelen, prijzen, relaties via sync | 3 endpoints x 24 uur | 72 |
| Orders, 400 per dag | 400 x 4 verzoeken | 1.600 |
| Totaal | 288 + 72 + 1.600 | 1.960 |
De 4 verzoeken per order zijn: debiteur zoeken, order aanmaken, levering ophalen en factuur ophalen. Voor orders blijft 5.000 - 360 = 4.640 over, dus het plafond ligt bij 4.640 / 4 = 1.160 orders per dag. Op een piekdag met 1.100 orders is er nog ruimte voor 240 verzoeken.
Ligt je piek hoger, dan gaat het aantal verzoeken per order omlaag: debiteuren uit de eigen opzoektabel in plaats van uit Exact, leveringen via de webhook in plaats van een vraag per order. De rekenmethode staat in Exact Online API limieten.
Webhooks voor een deel van de gegevens
Exact Online verstuurt webhooks voor onder meer SalesOrders, SalesInvoices, Items, Accounts, StockPositions en GoodsDeliveries. Het bericht bevat een verwijzing en een HashCode, een HMAC-SHA256 over de inhoud waarmee de ontvanger controleert dat het van Exact komt. De gegevens zelf haalt de koppeling daarna op, en dat verzoek telt mee voor het dagbudget. Een bericht dat niet aankomt probeert Exact 10 keer opnieuw, verspreid over 34 uur. Meer over die werking staat in wat is een webhook.
Waar het bij Exact Online op vastloopt
| Wat er misgaat | Oorzaak in Exact Online | Wat de koppeling doet |
|---|---|---|
| Debiteur niet gevonden, dus dubbel aangemaakt | Code is 18 tekens lang met voorloopspaties; een filter op 10432 vindt niets |
Zoeken met de aangevulde code, daarna op e-mail en btw-nummer |
| Orderregel geweigerd | Item is een GUID, de webshop kent alleen de artikelcode |
Opzoektabel van code naar GUID, gevuld uit de sync |
| Btw op de verkeerde code | De webshop geeft 21%, Exact vraagt een btw-code per regel | Vaste tabel per tarief, land en verlegging |
| Factuur zonder dagboek | Journal is verplicht bij facturen en boekingen |
Dagboek per verkoopkanaal in de mapping |
| App een uur geblokkeerd | Meer dan 10 fouten per uur op één endpoint | Valideren voor het versturen, fouten naar een controlelijst |
Debiteuren, btw-codes en dagboeken
De debiteurcode in crm/Accounts is een tekenreeks van 18 posities, aangevuld met spaties aan de voorkant. Een filter moet die spaties bevatten, anders komt er een leeg antwoord terug en maakt een onoplettende koppeling een tweede debiteur aan. Het enige verplichte veld bij een nieuwe relatie is Name. Btw-nummer, factuuradres en betalingsconditie moeten dus bewust gemapt worden, want Exact vraagt er niet om.
Btw-codes, dagboeken en grootboekrekeningen verschillen per administratie. Een webshop kent een percentage, Exact een code. Verkopen aan zakelijke klanten in de EU, btw verlegd en verzendkosten hebben elk een eigen code nodig. De achtergrond staat in bedragen en btw mappen.
Artikelen: één code, één afbeelding, geen varianten
De artikelresource heeft geen veld voor een hoofdartikel met varianten. Elke maat en kleur is een eigen artikel met een eigen code. De koppeling groepeert ze voor de webshop op een afgesproken kenmerk, bijvoorbeeld een vrij veld of een deel van de artikelcode. Een artikel heeft één afbeelding (PictureUrl), een omschrijving van 60 tekens en een extra omschrijving van 255. Productteksten en extra beelden komen daarom meestal uit de webshop of een PIM; zie productdata.
Voorraad: welk getal
StockPositions geeft per artikel en magazijn onder meer CurrentStock, ReservedStock, PlanningIn, PlanningOut en FreeStock. Welk getal naar de webshop gaat is een keuze per koppeling: 20 op voorraad met 6 gepland uit is 14 verkoopbaar. Bij meer dan één magazijn komt de vraag erbij welke magazijnen meetellen; zie meerdere magazijnen.
Fouten tellen mee
Exact staat per app, gebruiker, administratie en endpoint 10 fouten per uur toe. Daarboven wordt de sleutel tijdelijk geblokkeerd, en bij herhaling duurt de blokkade langer. Een koppeling die een order met een onbekend artikel blijft insturen, legt zo ook de goede orders stil. Daarom valideren wij elke order voor verzending: bestaat de debiteur, bestaat elk artikel, is er een btw-code. Wat niet door de controle komt gaat naar een controlelijst in het dashboard en niet naar Exact. Een afgeronde verkooporder is via de API niet meer te wijzigen; een wijziging uit de webshop na levering wordt dan een taak voor een medewerker.
Platformen die we aan Exact Online koppelen
De koppeling wordt gebouwd op jouw administratie en jouw webshop. De eigenschappen per combinatie staan op een eigen pagina:
- WooCommerce Exact Online koppeling
- Shopify Exact Online koppeling
- Magento Exact Online koppeling
- Shopware Exact Online koppeling
- Lightspeed Exact Online koppeling
- CCV Shop Exact Online koppeling
- Picqer Exact Online koppeling
De platformen zelf staan op WooCommerce koppeling en Shopify koppeling. Draai je een ander ERP naast of in plaats van Exact, zie dan AFAS webshop koppeling en Business Central 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 order en per artikel wat er naar Exact zou gaan, zonder dat er iets geboekt wordt. Vertel welk pakket en welke webshop je hebt, dan hoor je welke stromen in jouw editie kunnen en wat het dagbudget voor jouw aantallen betekent.
Veelgestelde vragen
Heb ik Exact Online Boekhouden of Handel nodig?
Dat hangt af van wat er moet landen. Verkoopfacturen en verkoopboekingen kan de API aanmaken in Boekhouden. Verkooporders, leveringen en voorraadposities staan in de API-documentatie alleen bij Handel en Productie. Wil je dat een webshoporder als verkooporder in Exact komt en dat de voorraad uit Exact naar je webshop gaat, dan heb je Handel of Productie nodig. Het verschil staat uitgewerkt in Exact Online Boekhouden of Handel.
Wat is het verschil tussen een verkoopboeking, een verkoopfactuur en een verkooporder?
Een verkoopboeking is een financiële boeking op een grootboekrekening, zonder artikelen en zonder factuur naar de klant. Een verkoopfactuur heeft factuurregels en een factuurnummer uit het dagboek, en gaat naar de klant. Een verkooporder is het logistieke document: hij telt mee als geplande uitgifte in de voorraad, leidt tot een levering en wordt daarna gefactureerd. De webshop levert steeds dezelfde order aan; de koppeling bepaalt welke van de drie er in Exact ontstaat.
Wat is het verschil met een app uit de Exact App Store?
Een app uit de App Store is een standaardkoppeling: de velden, de richting en het moment van synchroniseren liggen vast, en je stelt in wat de maker instelbaar heeft gemaakt. Wij bouwen de koppeling naar jouw administratie: je eigen btw-codes, dagboeken, prijsafspraken en magazijnen. Daarna hosten en bewaken we hem. Beide gebruiken dezelfde API. De limiet van 5.000 verzoeken per dag geldt per app en per administratie, dus een tweede app gaat niet van het budget van de eerste af.
Kan ik meerdere webshops op één administratie koppelen?
Ja. Elke webshop krijgt een eigen voorvoegsel in het veld YourRef, zodat order 10482 van shop A en order 10482 van shop B niet botsen, en waar nodig een eigen dagboek en grootboekrekening. De shops delen wel één dagbudget van 5.000 verzoeken, omdat de limiet per app en per administratie telt. Twee administraties zijn twee divisies in de API, elk met een eigen budget en een eigen mapping.
Hoe voorkom je dubbele boekingen bij een storing?
De koppeling zet elke order eerst in een wachtrij en legt vast welk OrderID Exact teruggeeft. Valt de verbinding weg tussen het verzoek en het antwoord, dan zoekt de volgende poging eerst op het webshopordernummer in YourRef. Bestaat de order al, dan wordt hij niet opnieuw aangemaakt. Zie ook dubbele klanten en debiteuren.
Kan de koppeling ook prijslijsten en klantprijzen aan?
Ja. De resource SalesItemPrices bevat per artikel een prijs met een vanaf-aantal (Quantity), een begin- en einddatum en optioneel een klant (Account). Met een klant erbij is het een prijsafspraak. Prijslijsten en hun staffelkortingen zijn via de API alleen te lezen. De koppeling leest ze uit en zet ze om naar klantgroepen, staffels of een prijslijst in je webshop. Zie klantspecifieke prijzen.
Wat gebeurt er als de dagelijkse API-limiet bereikt is?
Exact Online weigert dan elk verzoek met HTTP 429 tot het dagvenster opnieuw begint. Het tijdstip staat in de header X-RateLimit-Reset. Orders blijven in de wachtrij staan en gaan daarna in volgorde door. De koppeling houdt het resterende budget per verzoek bij en stelt bulkwerk, zoals een volledige artikelronde, uit voordat de limiet in zicht komt.
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