Koppelingen
Prijzen en klantafspraken: elke klant ziet in je webshop wat jullie hebben afgesproken
De basisprijs overzetten kan elke koppeling. Wij bouwen de koppeling die ook de prijslijst, de staffel en de afspraak per klant uit je ERP haalt, zodat de prijs in de webshop dezelfde is als op de factuur. Daarna draaien en bewaken we hem.
Algemene prijzen zijn het makkelijke deel
Een basisprijs is één veld per artikel. 6.000 artikelen zijn 6.000 waarden, en die zet elke koppeling over. B2B begint bij wat daarna komt: een prijslijst per klantgroep, staffels, een nettoprijs die je met één klant hebt afgesproken en een assortiment dat per klant verschilt.
De omvang bepaalt de aanpak. 800 debiteuren maal 6.000 artikelen zijn 4.800.000 mogelijke combinaties van klant en artikel. Geen ERP slaat die op. Het ERP bewaart regels: in het voorbeeld op deze pagina 14 prijslijsten, staffels en 1.150 losse klantafspraken. De koppeling zet die regels over, of rekent ze per klant uit als het webshopplatform de regel zelf niet kan bewaren.
Per gegeven is één systeem leidend:
| Gegeven | Leidend | Richting |
|---|---|---|
| Basisprijs, prijslijst, staffel, klantafspraak | ERP | naar de webshop |
| Welk webshopaccount bij welke debiteur hoort | ERP, via een vertaaltabel | beide kanten |
| Tijdelijke actieprijs | webshop, via de uitsluitingslijst | blijft in de webshop |
| De prijs op een geplaatste order | de orderregel | naar het ERP |
Eén voorwaarde geldt voor alles op deze pagina: de afspraak staat in een veld. Een korting die de binnendienst uit het hoofd toepast voor drie grote klanten, staat nergens en gaat dus met geen enkele koppeling mee. Die afspraak wordt eerst een regel in het ERP.
De vier prijslagen, in volgorde
Een B2B-prijs komt uit vier lagen, van algemeen naar specifiek. Hier met de plek waar Exact Online ze bewaart:
| Laag | Artikel 10482 | In Exact Online |
|---|---|---|
| 1. Basisprijs | € 12,50 per stuk | SalesItemPrices zonder Account |
| 2. Prijslijst per klantgroep | Installateurs: 15% korting | SalesPriceLists, klanten via SalesPriceListLinkedAccounts |
| 3. Staffel | vanaf 100 stuks 5% extra | SalesPriceListVolumeDiscounts met Quantity |
| 4. Klantafspraak | debiteur 10432: € 9,60 netto | SalesItemPrices met Account, StartDate en EndDate |
De som. Een installateur zonder eigen afspraak bestelt 100 stuks: 12,50 maal 0,85 is 10,625, maal 0,95 is 10,09375. Hij betaalt € 10,09 per stuk. Bakker Installatie B.V., debiteur 10432, heeft een vaste nettoprijs van € 9,60. Die vervangt de lagen erboven, en de staffel gaat er niet nog eens overheen.
Twee dingen staan per ERP vast voordat de webshop dezelfde prijs kan uitrekenen.
In welke vorm de korting staat. Een percentage, een bedrag of een vervangende nettoprijs. Exact Online legt per staffelregel vast welke van de twee leidend is: EntryMethod 1 is de korting, 2 is de nieuwe prijs. Zodra lagen stapelen zijn de vormen niet uitwisselbaar. 5% over de prijslijstprijs van 10,625 geeft € 10,09. 5% over de basisprijs van 12,50 is 0,625 en geeft € 10,00. Exact Online rekent elke staffelregel vanaf de basisprijs (korting maal BasePriceAmount) en slaat de korting op als fractie, dus treden stapelen daar niet. Wie in Exact 15% plus 5% extra wil, legt in de staffelregel 0,1925 vast: 1 min 0,85 maal 0,95.
Welke regel wint. In het ERP wint de specifiekste regel: de klantafspraak gaat boven de prijslijst. Niet elk platform rekent zo. Shopify toont de laagste prijs als een product in meerdere catalogi van dezelfde klant staat. Heeft een klant voor een artikel € 10,80 afgesproken, inclusief levering op de bouwplaats, terwijl zijn prijslijst € 10,63 geeft, dan factureert het ERP € 10,80 en toont de webshop € 10,63. De koppeling schrijft daarom per klant één uitgerekende prijs per artikel weg, en geen twee catalogi naast elkaar.
Wat er precies over de lijn gaat
Geen zwarte doos. Dit gaat er in deze stroom naar de webshop:
| Gegeven | Voorbeeld | Waar het op vastloopt |
|---|---|---|
| Basisprijs | € 12,50 excl. btw | exclusief in het ERP, inclusief in een webshop voor consumenten |
| Prijslijst en klantgroep | Installateurs, 212 klanten | in Exact Online hangt een klant aan één prijslijst tegelijk |
| Staffel | vanaf 1, 25 en 100 stuks | per artikel of over de hele order |
| Klantafspraak | debiteur 10432, € 9,60, tot 31-12-2026 | de einddatum gaat mee, anders blijft de prijs staan |
| Eenheid en verpakking | doos van 12, minimaal 1 doos | prijs per doos of per stuk |
| Adviesprijs | € 15,90 | als doorgestreepte prijs of als bovengrens |
| Assortiment per klant | 1.400 van de 6.000 artikelen | zichtbaarheid is een eigen regel naast de prijs |
Een prijsafspraak zoals Exact Online hem teruggeeft, ingekort tot de velden die het werk bepalen:
{
"ItemCode": "10482",
"AccountName": "Bakker Installatie B.V.",
"Price": 115.2,
"Currency": "EUR",
"Quantity": 1,
"Unit": "doos",
"NumberOfItemsPerUnit": 12
}
Price is een kommagetal zonder vaste decimalen: 115.2, geen 115,20. De prijs geldt per doos van 12. De webshop verkoopt per stuk, dus de koppeling rekent 115,20 gedeeld door 12 is 9,60 en schrijft 9.60 met de valuta erbij. Wie NumberOfItemsPerUnit overslaat, zet € 115,20 per stuk in de webshop. Shopify wil een bedrag met valutacode, WooCommerce bewaart regular_price als tekst.
De klant moet eerst herkend worden. De webshop kent een klant op zijn e-mailadres, het ERP op zijn debiteurnummer. Daartussen staat een vertaaltabel, en een debiteur die twee keer bestaat krijgt twee prijzen. Hoe dat wordt voorkomen staat in dubbele klanten en debiteuren. De eenheden zijn uitgewerkt in eenheden en verpakkingen.
Waar standaardkoppelingen ophouden
Standaardkoppelingen en koppelplatformen zetten prijzen over op het niveau van de klantgroep. Een prijslijst in het ERP wordt een klantgroep in de webshop en de klant komt in die groep. Voor de 14 prijslijsten uit het voorbeeld werkt dat. Voor de 1.150 klantafspraken werkt het niet: elke afspraak hoort bij één debiteur, en een klantgroep per klant is geen groep meer.
Wat het platform zelf kan bewaren bepaalt de rest:
| Systeem | Wat het bewaart | Grens |
|---|---|---|
| Shopify | catalogi met prijslijsten, staffels en bestelregels, op elk abonnement | 3 actieve catalogi op Basic, Grow en Advanced; een catalogus direct aan één bedrijf hangen kan alleen op Plus |
| Magento | staffelprijzen via /V1/products/tier-prices met customer_group, quantity en price_type (fixed of discount) |
de klantgroep is het laagste niveau in dat model |
| WooCommerce | regular_price, sale_price en een actieperiode per product |
geen prijs per klant of per aantal in de kern; een uitbreiding bewaart die, en de koppeling schrijft naar de velden daarvan |
| Exact Online | prijslijsten, staffels en prijsafspraken per klant | de endpoints voor prijslijsten zitten in de pakketten voor handel en productie |
Op een Shopify-abonnement onder Plus passen 14 prijslijsten dus niet in 3 catalogi, en een eigen catalogus voor debiteur 10432 vraagt Plus. De grenzen staan in de documentatie van Shopify en Adobe Commerce, nagelezen op 3 oktober 2026.
De tweede grens is het veld dat de API niet vrijgeeft. AFAS geeft gegevens vrij via GetConnectoren die de beheerder zelf samenstelt: staat het kortingspercentage niet in de GetConnector, dan bestaat het voor de koppeling niet. De oplossing is een export die het ERP wel kan maken, per nacht:
debiteur;artikelgroep;korting_pct;geldig_tot
10432;Fittingen;2,5;31-12-2026
10518;Fittingen;4;
10518;Pompen;1,5;30-06-2027
De koppeling voegt die regels samen met de prijzen uit de API. De lege einddatum op regel 2 betekent "tot wederopzegging", en dat ligt vast als regel en wordt niet geraden. De uitwerking per klant staat bij klantspecifieke prijzen; het verschil in aanpak in koppeling of koppelplatform.
Wat er stil misgaat
Een verkeerde prijs geeft geen foutmelding. De run slaagt, en de fout komt boven water op een factuur.
| Wat er gebeurt | Voorbeeld | Gevolg |
|---|---|---|
| Komma tegenover centen | 12,50 komt aan als 1250 |
factor 100 op de orderregel |
| Btw in of uit | € 12,50 exclusief is € 15,13 inclusief bij 21% | de klant ziet een prijs die 21% afwijkt |
| Eenheid | € 115,20 per doos van 12 als prijs per stuk | factor 12 |
| Afronden tussen de lagen | 10,63 maal 0,95 is 10,10; 10,625 maal 0,95 is 10,09 | € 1,00 verschil op 100 stuks |
| Verlopen afspraak | EndDate 31-12-2026 gaat niet mee |
de klant bestelt in januari tegen de oude prijs |
| Handmatige actieprijs | € 7,95 in de webshop gezet | de nachtelijke ronde zet de lijstprijs terug |
Afronden per regel of per order
Een order heeft drie regels van elk 3 stuks à € 4,13: drie keer € 12,39, samen € 37,17 exclusief btw. De webshop rekent de btw per regel: 12,39 maal 0,21 is 2,6019, afgerond € 2,60, drie keer is € 7,80. Totaal € 44,97. Het ERP rekent de btw over het ordertotaal: 37,17 maal 0,21 is 7,8057, afgerond € 7,81. Totaal € 44,98.
De klant betaalt € 44,97 en de factuur staat op € 44,98. Die ene cent is genoeg: de betaling wordt niet automatisch afgeletterd. De koppeling neemt daarom de afrondregel van het ERP over, of stuurt de bedragen per regel mee zodat het ERP niet opnieuw rekent. Meer hierover in bedragen en btw mappen.
Een prijswijziging tijdens het bestellen
Om 10:02 legt een klant 100 stuks in zijn winkelmand tegen € 10,63. Om 10:05 gaat de nieuwe prijslijst in: € 10,90. Om 10:07 plaatst hij de order. De webshop zegt € 1.063,00, het ERP rekent € 1.090,00 uit. Vooraf ligt vast welke geldt. De orderregel draagt de stuksprijs die de klant zag, met het tijdstip. Het ERP neemt die prijs over, of de order blijft staan tot iemand het verschil van € 27,00 heeft beoordeeld. Stil herrekenen gebeurt niet.
Doorvoer en limieten
Prijzen zijn de grootste stroom in aantallen regels. 14 prijslijsten maal 6.000 artikelen zijn 84.000 prijsregels, naast 1.150 klantafspraken. Een rekenvoorbeeld met Exact Online als bron en Shopify als webshop:
| Aanpak | Verzoeken | Wat het kost |
|---|---|---|
| Lezen per pagina van 60 regels | 84.000 gedeeld door 60 is 1.400 | 23 minuten en 20 seconden bij 60 per minuut, en 28% van het dagbudget van 5.000 |
| Lezen via bulk of sync, 1.000 regels per verzoek | 84 | 1 minuut en 24 seconden |
Alleen wijzigingen sinds de vorige Timestamp |
1 voor 400 gewijzigde prijzen | past in elke ronde |
| Schrijven naar Shopify, 250 prijzen per aanroep | 84.000 gedeeld door 250 is 336 | alleen bij de eerste vulling en bij een nieuwe prijslijst |
De prijs live bij het ERP opvragen op het moment dat de klant kijkt, loopt direct tegen dezelfde limiet. 40 ingelogde klanten die elk een categoriepagina met 24 artikelen openen, vragen 960 prijzen op. Met één verzoek per prijs is dat 16 minuten bij 60 verzoeken per minuut. De koppeling rekent de prijzen daarom vooraf uit en zet ze in de webshop.
De frequentie verschilt per laag. Prijslijsten gaan in een nachtelijke ronde. Klantafspraken gaan mee in een ronde die alleen wijzigingen ophaalt: elk kwartier is 96 verzoeken per dag. De limieten van Exact Online en de grens van 250 regels per aanroep bij Shopify zijn op 3 oktober 2026 nagelezen. De som voor je eigen aantallen maak je met doorvoer berekenen.
Jij houdt de controle
Een prijsfout kost direct geld. De eerste run is daarom een dry run: hij rekent alles uit en schrijft niets. Daarna stel je een drempel in waarboven een wijziging op goedkeuring wacht, bijvoorbeeld een daling van meer dan 30%. Artikelen met een actieprijs staan tot de einddatum van de actie op de uitsluitingslijst. Na elke run staat er per prijs wat er is gewijzigd en uit welke laag de nieuwe prijs komt:
run 03-10-2026 02:00 bron: exact online 2.310 wijzigingen
10482 prijslijst Installateurs 10,63 -> 10,90 prijslijst per 01-10
10482 debiteur 10432 9,60 blijft klantafspraak tot 31-12-2026
10517 basisprijs 12,50 -> 0,13 wacht op goedkeuring, daling 99%
10510 basisprijs overgeslagen actieprijs tot 31-10
De derde regel is de komma-fout uit de tabel hierboven, tegengehouden voordat hij in de webshop stond. Belt een klant over een prijs, dan zie je terug uit welke laag die prijs kwam en sinds wanneer. De onderdelen staan bij dry run en goedkeuring en audit trail.
Verdieping per onderwerp
| Onderwerp | Wat het regelt |
|---|---|
| Klantspecifieke prijzen | de afspraak per debiteur, zichtbaar na het inloggen |
| Staffelprijzen | de korting die meerekent als het aantal in de winkelmand verandert |
| Assortiment per klant | welke artikelen een klant ziet en mag bestellen |
| Inkoopprijzen | de inkoopprijs van je leverancier in ERP en margeregels |
De prijsstroom raakt drie andere stromen. Een klant die op rekening bestelt, heeft naast een prijs een betaalconditie en een kredietlimiet: zie bestellen op rekening onder orders, klanten en verzending. Een inkoper die via zijn inkoopsysteem binnenkomt, ziet dezelfde klantprijzen binnen de sessie: zie OCI en PunchOut. En een prijs voor een artikel dat niet leverbaar is, levert geen order op: zie voorraad en beschikbaarheid. Voor de groothandel staan de drie bij elkaar op groothandel en distributie.
Systemen en platformen
De prijs komt uit het ERP en gaat naar het platform waarop de klant inlogt.
| Groep | Systemen |
|---|---|
| ERP | Exact Online, AFAS, Business Central, SAP Business One, Exact Globe, Unit4, Odoo, NetSuite |
| Webshopplatformen | Shopify, WooCommerce, Magento, Shopware, Lightspeed, BigCommerce |
Drie verschillen die de opzet bepalen. Exact Online bewaart de klantafspraak als prijs met een Account, een begin- en een einddatum, en geeft Price als kommagetal. AFAS geeft alleen vrij wat in een GetConnector staat, en zonder take komen de eerste 100 regels terug: een prijslijst van 6.000 regels wordt in pagina's gelezen. Shopify bewaart een vaste prijs per variant in een prijslijst, en die prijs heeft geen veld voor een einddatum.
Het overzicht van alle vijf de stromen staat op koppelingen. Vertel in welk systeem je prijsafspraken staan, dan hoor je welke lagen de API vrijgeeft en welke uit een export komen.
Veelgestelde vragen
Zien klanten de standaardprijs naast hun eigen prijs?
Dat stel je in. De webshop toont alleen de klantprijs, of de klantprijs met de standaardprijs doorgestreept ernaast, zodat de waarde van de afspraak zichtbaar is. De koppeling levert in het tweede geval beide prijzen aan: € 9,60 als prijs en € 12,50 als vergelijkingsprijs.
Wat als een klant voor sommige producten een contractprijs heeft en voor andere niet?
De prijs wordt per artikel bepaald. Is er voor dat artikel een klantafspraak, dan geldt die. Is die er niet, dan geldt de prijslijst van de klantgroep met de staffel, en zonder prijslijst de basisprijs. Een klant met 40 contractprijzen ziet dus voor de overige 5.960 artikelen de prijs van zijn groep.
Kunnen tijdelijke actieprijzen bovenop staffels?
Ja. Een actie is een regel met een begindatum en een einddatum. Vooraf ligt vast of hij bovenop de staffel komt of de staffel vervangt, want 10% actiekorting over een staffelprijs van € 10,09 geeft € 9,08 en over de basisprijs van € 12,50 geeft € 11,25. Na de einddatum zet de koppeling de gewone prijs terug.
Hoe snel staat een nieuwe prijsafspraak in de webshop?
Dat bepaal je per laag. Prijslijsten wijzigen een paar keer per jaar en gaan in een nachtelijke ronde. Een afspraak die een verkoper vandaag met een klant maakt, gaat mee in een ronde die alleen de wijzigingen ophaalt, bijvoorbeeld elk kwartier. De grens is de limiet van het ERP: bij Exact Online 60 verzoeken per minuut en 5.000 per dag.
Wat ziet een klant die niet is ingelogd?
De basisprijs, of geen prijs met een verwijzing naar het inloggen. Klantprijzen en het assortiment per klant horen bij een debiteur, en de webshop weet pas na het inloggen welke debiteur dat is. Daarom gaat de koppeling van debiteuren naar webshopaccounts aan de prijzen vooraf.
Hoe komen orders met staffel- en actieprijzen in de boekhouding?
De orderregel draagt de stuksprijs en de korting zoals de klant ze zag, en het ERP boekt die regel. Daarvoor ronden beide systemen op dezelfde manier af, per regel of per order. Doen ze dat niet, dan wijkt de factuur een cent af van de betaling en wordt hij niet automatisch afgeletterd. De orderkant staat bij orders, klanten en verzending.
Mijn ERP geeft de klantkorting niet vrij via de API. Kan het dan toch?
Ja. Een korting die niet in de API zit, komt uit een export die het ERP wel kan maken: een CSV-bestand per nacht met debiteur, artikelgroep, percentage en einddatum. De koppeling voegt die regels samen met de prijzen uit de API voordat er iets naar de webshop gaat.
Gelden klantprijzen ook binnen een OCI-sessie?
Ja. De inkoper komt vanuit zijn inkoopsysteem binnen op het account van zijn bedrijf en ziet de prijzen en het assortiment van die debiteur. De winkelmand gaat met die prijzen terug naar het inkoopsysteem. Hoe de sessie verloopt staat bij OCI en PunchOut.
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