Naar de inhoud
SyncMyShop

WooCommerce en AFAS

WooCommerce AFAS koppeling

Webshoporders staan als verkooporder in AFAS Profit, op de juiste verkooprelatie en met een adres dat in de drie adresvelden van AFAS past. Artikelen, voorraad en prijzen per debiteur komen uit AFAS terug. Gebouwd op de GetConnectoren en UpdateConnectoren van jouw omgeving, en daarna door ons gedraaid en bewaakt.

Wat je tussen WooCommerce en AFAS koppelt

AFAS Profit geeft gegevens vrij via connectoren. Een GetConnector leest, een UpdateConnector schrijft. De koppeling gebruikt aan de AFAS-kant per stroom een vaste connector en aan de WooCommerce-kant de REST API v3.

Stroom Richting WooCommerce AFAS Profit
Orders naar AFAS GET /wc/v3/orders UpdateConnector FbSales
Klanten naar AFAS billing en shipping KnSalesRelationOrg of KnSalesRelationPer
Artikelen naar WooCommerce /products GetConnector Profit_Article of een eigen
Voorraad naar WooCommerce stock_quantity GetConnector Profit_Stock_per_Warehouse
Prijzen per debiteur naar WooCommerce B2B-plugin GetConnector Profit_SalesPrice
Zending naar WooCommerce status completed GetConnector op pakbonnen

Een verkooporder in FbSales heeft één verplicht kopveld, DbId, de verkooprelatie. Elke regel heeft er vier: VaIt, ItCd, QuUn en BiUn. Zo ziet order 10482 van Bakker Installatie B.V. eruit, met één regel:

{
  "FbSales": {
    "Element": {
      "Fields": {
        "DbId": "10412",
        "OrDa": "2026-10-03",
        "RfCs": "WEB-10482",
        "War": "01",
        "InVa": false
      },
      "Objects": {
        "FbSalesLines": {
          "Element": {
            "Fields": { "VaIt": "2", "ItCd": "10482", "BiUn": "stk", "QuUn": 12, "Upri": 17.08 }
          }
        }
      }
    }
  }
}

VaIt 2 betekent dat de regel een artikel is. BiUn is de eenheid uit AFAS. WooCommerce stuurt geen eenheid mee, dus de koppeling haalt hem bij het artikel op. Het ordernummer van AFAS, OrNu, is 12 tekens. Het WooCommerce-nummer gaat daarom naar RfCs, de referentie van 100 tekens, en AFAS geeft zijn eigen nummer uit. De opzet van zo'n koppeling in het algemeen staat op ERP koppeling met je webshop.

Welk systeem is leidend, per gegeven

Gegeven Leidend Richting Gedrag
Artikelcode, omschrijving, eenheid AFAS naar WooCommerce ItCd wordt sku
Productteksten en afbeeldingen WooCommerce blijft in WooCommerce de koppeling schrijft er niet overheen
Voorraad per magazijn AFAS naar WooCommerce opgeteld over de magazijnen die meetellen
Basisprijs en prijslijst per debiteur AFAS naar WooCommerce nachtelijk, staffels inbegrepen
Order WooCommerce tot de import naar AFAS één keer, met RfCs als sleutel
Verkooprelatie AFAS match, anders aanmaken organisatie of persoon
Prijs inclusief of exclusief btw de order zelf naar AFAS InVa op de orderkop
Directe levering door de leverancier AFAS regel in AFAS DiDe op de orderregel

Bij AFAS zegt de order zelf of de prijzen inclusief btw zijn, met InVa. De koppeling neemt prices_include_tax van de WooCommerce-order daarvoor over.

Wat WooCommerce en AFAS anders bewaren

Organisatie of persoon

AFAS heeft twee soorten verkooprelaties, elk met een eigen UpdateConnector: KnSalesRelationOrg voor een organisatie en KnSalesRelationPer voor een persoon. WooCommerce heeft één klantmodel met een optioneel veld company. De koppeling beslist op dat veld en op het btw-nummer. Zonder dat tweede kenmerk komt een eenmanszaak die het bedrijfsveld leeg laat als persoon in AFAS, en bij de volgende bestelling met bedrijfsnaam nog een keer als organisatie. De matchvolgorde staat in dubbele klanten en debiteuren.

Eén adresregel tegenover drie velden

Het factuuradres uit WooCommerce als adres in AFAS WooCommerce levert straat, huisnummer en toevoeging in het ene veld address_1. AFAS vraagt drie velden: Ad voor de straat, HmNr als geheel getal en HmAd voor de toevoeging. De postcode wordt genormaliseerd en het land wordt omgezet naar de landcode van AFAS. WooCommerce, billing AFAS, KnBasicAddressAdr address_1 Dorpsstraat 12 A postcode 1234ab city Utrecht country NL ISO 3166-1, twee letters Ad Dorpsstraat straat, 60 tekens HmNr 12 geheel getal HmAd A toevoeging, 30 tekens ZpCd 1234 AB 15 tekens Rs Utrecht 50 tekens CoId NL landcode van AFAS: AT wordt A splitsen hoofdletters, spatie vertaaltabel
Eén adresregel uit WooCommerce wordt drie velden in AFAS. Het huisnummer is in AFAS een geheel getal.

WooCommerce bewaart straat, huisnummer en toevoeging in één veld, address_1. AFAS vraagt drie velden: Ad voor de straat, 60 tekens, HmNr voor het huisnummer en HmAd voor de toevoeging, 30 tekens. HmNr is een geheel getal. 12A in dat veld geeft een fout, dus de A moet naar HmAd.

De splitsing gaat fout bij adressen als Plein 1945 nr 3 en bij klanten die het huisnummer in address_2 zetten. Zo'n adres gaat naar een controlelijst en niet met een gok naar AFAS. Hoe de regels werken staat in adresvelden mappen.

Landcodes

WooCommerce levert het land als ISO-code van twee letters. AFAS heeft naast de ISO-code een eigen landcode. In de meeste UpdateConnectoren lever je de ISO-code aan, in het adres de eigen code van AFAS: Oostenrijk is daar A en niet AT. De koppeling gebruikt een vertaaltabel die uit jouw omgeving wordt gelezen.

Twee prijsvelden tegenover een prijslijst per debiteur

Profit_SalesPrice geeft per debiteur en per artikel een brutoprijs, een korting en een nettoprijs, met een hoeveelheid voor de staffel. WooCommerce heeft per product regular_price en sale_price. De omvang bepaalt de aanpak: 300 debiteuren met elk afspraken op 2.000 artikelen zijn 600.000 prijsregels. Die gaan niet per regel naar de webshop. De koppeling zet de prijslijsten over, koppelt elke klant aan zijn lijst en werkt alleen gewijzigde regels bij. Zie klantspecifieke prijzen.

Voorraad

AFAS geeft per magazijn twee getallen: StockActual, wat er ligt, en StockEconomic, de economische voorraad. WooCommerce heeft één geheel getal per product en verlaagt dat zelf zodra een order op processing komt. Welk getal uit AFAS naar de webshop gaat en welke magazijnen meetellen leg je per shop vast. Orders die nog in de wachtrij staan en AFAS dus nog niet hebben bereikt, trekt de koppeling van het getal af voordat hij het schrijft.

De technische werkelijkheid van deze combinatie

Onderwerp WooCommerce AFAS Profit
Limiet op verzoeken geen gedocumenteerd op wc/v3 fair use, geen getal
Tegelijk de server bepaalt het 5 aanroepen
Per aanroep 100 per pagina, 100 per batch 100 regels zonder take, 75 MB, 900 seconden
Wijziging melden webhook, uit na 5 mislukte afleveringen geen webhook, pollen
Toegang sleutelpaar app connector met token of OAuth

De getallen zijn op 3 oktober 2026 nagelezen in de documentatie van AFAS en WooCommerce. AFAS noemt op de ene pagina vijf en op de andere zes gelijktijdige aanroepen; de koppeling blijft op vijf.

Fair use, met een voorbeeld van AFAS zelf. AFAS noemt geen aantal verzoeken per minuut. Het voorbeeld in de documentatie is wie elke minuut dezelfde dataset van 15 MB ophaalt: daar wordt contact over opgenomen. De koppeling haalt daarom geen volledige tabellen op, alleen wat sinds de vorige ronde is gewijzigd.

Paginagrootte doorgerekend. Een GetConnector zonder skip en take geeft de eerste 100 regels terug en meldt niet dat er meer zijn. AFAS adviseert het aantal kolommen maal het aantal regels onder 150.000 te houden. Een artikelconnector met 12 kolommen en 8.000 artikelen is 96.000: één aanroep. Met 20 kolommen is het 160.000 en wordt het twee pagina's van 4.000 regels. Bij skip en take is sorteren met orderbyfieldids verplicht.

Pollen in plaats van webhooks. Voorraad elke 10 minuten is 144 aanroepen per dag, artikelen elk kwartier 96. Elke aanroep bevat een filter op de wijzigingsdatum. Dat veld moet in de GetConnector zitten, anders valt er niets te filteren. AFAS raadt zelf aan een eigen GetConnector te maken in plaats van een meegeleverde te gebruiken; daar zet de beheerder dat veld in.

Tokens. Een klassiek token is na het aanmaken niet meer in Profit op te vragen en geldt voor één combinatie van omgeving, app connector en gebruiker. Op een app connector kan een IP-restrictie staan; een aanroep vanaf een ander adres krijgt een 403. Het adres waarvandaan de koppeling aanroept moet dus op die lijst staan.

Track-en-trace. AFAS heeft op de pakbon een veld voor track-en-trace, TrTr, van 255 tekens. Een WooCommerce-order heeft in de REST API geen veld voor een trackingnummer. Het gaat naar de Shipment Tracking-extensie of naar een ordernotitie voor de klant.

Het adres van de omgeving. De omgeving heet bijvoorbeeld O12345AA; in de URL staan alleen de cijfers: https://12345.rest.afas.online/profitrestservices/connectors/FbSales. Meer over de connectoren staat in AFAS-connectoren.

Wat een standaardkoppeling hier niet doet

Standaardkoppelingen en koppelplatformen voor dit paar documenteren hun eigen grenzen.

  • Zakelijke prijzen via één voorgeschreven plugin. Klantprijzen uit AFAS werken daar alleen met één bepaalde B2B-plugin in WooCommerce. Gebruik je een andere, dan gaat die stroom niet mee.
  • Een vaste set GetConnectoren. De leverancier laat zijn eigen connectoren installeren. Vrije velden die jullie in AFAS hebben toegevoegd zitten daar niet in.
  • Organisatie of persoon op één kenmerk. Is er een bedrijfsnaam, dan wordt het een organisatie, anders een persoon, met herkenning op e-mailadres. Bestaande relaties onder een ander adres worden zo dubbel aangemaakt.

Een gebouwde koppeling gebruikt de connectoren van jouw omgeving, met jullie vrije velden erin, en de plugin die al in je webshop zit.

Als het misgaat

Een UpdateConnector die een order afkeurt antwoordt met HTTP 500 en een bericht in gewone taal, bijvoorbeeld:

{
  "externalMessage": "De ingevulde waarde bij 'Eenheid' bestaat niet.",
  "profitLogReference": "B8213AF1C3C54E579686406A8DE71C6C"
}
Wat er misgaat Wat de koppeling doet Wat je ziet
500 met externalMessage de order blijft staan, andere orders gaan door het bericht van AFAS en de order
401 of 403 alle stromen pauzeren token ongeldig of IP-adres geweigerd
503 met retry_after wacht het aangegeven aantal seconden niets, tenzij het aanhoudt
Huisnummer niet te splitsen de order gaat naar de controlelijst het adres zoals de klant het invulde
GetConnector mist een veld na een wijziging in AFAS de ronde stopt, zonder halve gegevens te schrijven de GetConnector en het ontbrekende veld
Webhook van WooCommerce is uitgeschakeld de controleronde haalt de orders op een regel in het logboek

Het profitLogReference is het nummer waaronder de beheerder de fout in AFAS terugvindt. Een order die blijft falen bewaart de koppeling met de oorspronkelijke inhoud, en hij biedt hem opnieuw aan zodra de oorzaak is opgelost. Voor elke nieuwe poging controleert hij op RfCs of de order al in AFAS staat, zodat een herhaling geen tweede verkooporder aanmaakt.

Wij hosten en bewaken de koppeling en passen hem aan als AFAS of WooCommerce iets wijzigt, zoals de overgang naar OAuth. De systeemkant staat op AFAS webshop koppeling, de platformkant op WooCommerce koppeling, en alle stromen op koppelingen. Verwante combinaties: Magento AFAS koppeling, Shopify AFAS koppeling en WooCommerce Business Central koppeling. Vertel hoe jullie AFAS is ingericht en welke plugins je webshop gebruikt.

Veelgestelde vragen

Wie maakt de connectoren aan in AFAS?

De beheerder van jullie AFAS-omgeving. Hij maakt een app connector aan, koppelt er een gebruiker aan en activeert de GetConnectoren en UpdateConnectoren die de koppeling mag aanroepen. Wij leveren de lijst met connectoren en velden aan. Zolang die niet in de app connector staan, kan de koppeling niets lezen of schrijven.

Blijft de koppeling werken nu AFAS de klassieke tokens uitfaseert?

Ja. Volgens de documentatie van AFAS werken app connectoren met een klassiek token na 31 augustus 2027 niet meer; nieuwe koppelingen gebruiken OAuth met een Bearer-token dat 3.600 seconden geldig is. Een nieuwe koppeling bouwen wij op OAuth, en een bestaande zetten we om voor die datum. Dit is nagelezen op 3 oktober 2026.

Hoe actueel is de voorraad als AFAS geen webhooks stuurt?

Zo actueel als de ronde. AFAS heeft alleen webhooks op dossiers en adviseert voor andere gegevens om regelmatig te pollen op nieuwe of gewijzigde records. De koppeling vraagt de voorraad bijvoorbeeld elke 10 minuten op met een filter op de wijzigingsdatum, zodat een ronde alleen de artikelen bevat die sinds de vorige ronde zijn veranderd.

Kunnen klantprijzen en staffels uit AFAS in WooCommerce staan?

Ja. AFAS levert ze via de GetConnector Profit_SalesPrice: de prijslijst per debiteur, met staffels. Een WooCommerce-product heeft in de REST API alleen regular_price en sale_price, dus een prijs per klant landt in het datamodel van de B2B-plugin die jij gebruikt. De koppeling schrijft in de plugin die je al hebt.

Kan ik meerdere webshops op één AFAS-omgeving koppelen?

Ja. Elke webshop heeft een eigen sleutelpaar in WooCommerce en een eigen voorvoegsel in de orderreferentie, zodat order 10482 uit de ene shop niet botst met order 10482 uit de andere. Per shop leg je vast op welk magazijn de orders binnenkomen, het veld War op de verkooporder, en welke magazijnen meetellen voor de voorraad.

Hoe gaat een order die de leverancier rechtstreeks levert?

AFAS heeft daar een veld voor op de orderregel: DiDe, direct leveren vanuit leverancier. De koppeling zet dat veld bij de artikelen waarvoor jij dat hebt vastgelegd. De inkoop bij de leverancier loopt daarna in AFAS, via inkoop per verkooporder. Een losse inkooporder schrijven kan ook, met de UpdateConnector FbPurch.

Is er een testomgeving?

AFAS heeft naast productie een test- en een acceptatieomgeving, elk met een eigen adres: resttest.afas.online en restaccept.afas.online in plaats van rest.afas.online. De koppeling draait eerst tegen de testomgeving en een kopie van de webshop, en gaat daarna als dry run mee met productie.

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