Naar de inhoud
SyncMyShop

Systemen

AFAS webshop koppeling: je webshop koppelen aan AFAS Profit

Een AFAS webshop koppeling zet orders en nieuwe klanten uit je webshop in Profit en haalt artikelen, voorraad en prijzen per debiteur op. AFAS geeft die gegevens vrij via GetConnectoren en UpdateConnectoren, die de beheerder van jouw omgeving eerst in een app connector moet klaarzetten.

Wat is AFAS Profit en wie gebruikt het?

AFAS Profit is het ERP-pakket van AFAS Software: financieel, ordermanagement, CRM, projecten en HRM in één database. Het wordt vooral in Nederland en België gebruikt. Bij handelsbedrijven is Profit het systeem waar artikelen, voorraad, debiteuren en prijsafspraken in staan. Naast Profit bestaat AFAS SB voor kleine ondernemers, met een eigen API. Deze pagina gaat over Profit.

Wie op "AFAS koppeling" zoekt, komt vooral bij HR en salaris uit. Een webshopkoppeling gebruikt een ander deel van Profit: verkooprelaties, verkooporders, artikelen, voorraad per magazijn en prijslijsten per debiteur. De API-documentatie van AFAS beschrijft die onderdelen onder Verkoop en Orders, Artikelen, Magazijn en Organisaties en personen. De specificatie die hier is gebruikt heeft versienummer 8.8.11 en is op 3 oktober 2026 nagelezen.

Wat je met AFAS koppelt

Profit is in de meeste koppelingen leidend voor artikelen, voorraad en prijzen. De webshop is leidend voor de order en voor nieuwe klanten. Elke stroom loopt via een eigen connector:

Stroom Richting Connector in Profit
Orders webshop naar AFAS UpdateConnector FbSales
Klanten webshop naar AFAS KnSalesRelationOrg en KnSalesRelationPer
Artikelen AFAS naar webshop GetConnector Profit_Article
Voorraad per magazijn AFAS naar webshop Profit_Stock
Prijslijst per debiteur AFAS naar webshop Profit_SalesPrice
Pakbonnen AFAS naar webshop Profit_Deliverynotes

Profit_SalesPrice is de connector die een B2B-webshop nodig heeft: hij geeft per verkooprelatie en peildatum de verkoopprijs, de korting en de nettoprijs per artikel, met de staffels erbij als het filter Volume aanstaat. Wat de webshop daarmee doet staat op klantspecifieke prijzen en staffelprijzen.

Twee stromen lopen de andere kant op. Gebruikt jouw klant AFAS als inkoopsysteem en bestelt hij vanuit Profit in jouw webshop, dan is dat OCI: zie OCI koppeling met AFAS. Vraagt een afnemer om orders en facturen als EDI-bericht, zie dan AFAS EDI koppeling.

Hoe AFAS data vrijgeeft

App connector, gebruikersgroep en OAuth

Externe software komt Profit alleen binnen via een app connector. Daarin legt de beheerder vast welke GetConnectoren en UpdateConnectoren de koppeling mag aanroepen. Een connector die er niet in staat, bestaat voor de koppeling niet. Toegang vraagt drie dingen tegelijk: de gebruiker zit in de gekoppelde gebruikersgroep, de aanmelding is geldig en de app connector is niet geblokkeerd.

Profit kent twee manieren van aanmelden. OAuth is volgens AFAS de standaard voor nieuwe koppelingen: de koppeling vraagt met de client credentials flow een access token op bij /ProfitRestServices/oauth/token en stuurt dat mee als Authorization: Bearer .... Het token is 3.600 seconden geldig en er komt geen refresh token bij, dus na een uur vraagt de koppeling een nieuw token aan. Het oudere classic token is een vaste sleutel die Base64-gecodeerd in elke aanroep meegaat: Authorization: AfasToken PHRva2VuPjx2ZXJza.... AFAS faseert het classic token uit:

Datum Wat er gebeurt met classic tokens
15 februari 2027 Bestaande tokens verlopen, volgens het Help Center van AFAS
1 mei 2027 Bestaande tokens verlopen, volgens de ontwikkelaarsdocumentatie (bijgewerkt 30 september 2026)
Na 31 augustus 2027 Geen app connector met een classic token werkt nog

De twee bronnen van AFAS spreken elkaar tegen over de eerste datum; reken met 15 februari 2027. Een bestaande koppeling op een classic token gaat voor die datum over op OAuth. Vanaf Profit 9 kan dat volgens AFAS in de bestaande app connector, met de gekoppelde connectoren en IP-restricties erbij; daarvoor vraagt de overstap een nieuwe app connector.

Drie eigenschappen bepalen de planning:

  • Een client secret voor OAuth heeft een geldigheidsduur, vanaf Profit 9 standaard 180 dagen. Daarna weigert Profit tokenaanvragen met die secret, dus de koppeling krijgt op tijd een nieuwe.
  • Een classic token is na het afronden van de wizard in Profit niet meer te raadplegen. Is het kwijt, dan wordt het oude verwijderd en een nieuw aangemaakt.
  • Op de app connector kan een IP-restrictie staan, in CIDR-notatie. IPv6 wordt daarbij nog niet ondersteund. De koppeling moet dan vanaf een vast IPv4-adres komen dat de beheerder toelaat.

Dit inrichtingswerk ligt bij de beheerder van jouw omgeving, niet bij ons. In de praktijk is dat de stap waar een koppeling op wacht. Wij leveren vooraf de volledige lijst: welke GetConnectoren en UpdateConnectoren, welke velden, welke gebruikersgroep.

Drie omgevingen, drie adressen

Het adres van de API bevat het nummer van de omgeving en het omgevingstype:

Omgeving Adres
Productie https://12345.rest.afas.online/ProfitRestServices
Test https://12345.resttest.afas.online/ProfitRestServices
Accept https://12345.restaccept.afas.online/ProfitRestServices

De acceptomgeving krijgt een nieuwe Profit-versie als eerste. Daar test de koppeling tegen de nieuwe versie voordat productie volgt.

GetConnectoren: lezen in pagina's

Een GetConnector is een endpoint op basis van een gegevensverzameling in Profit. AFAS levert er een aantal mee, en de beheerder kan eigen GetConnectoren samenstellen met precies de velden die nodig zijn. De aanroep is een GET op /connectors/Profit_Article?skip=0&take=5000&orderbyfieldids=ItemCode.

Zonder skip en take komen altijd alleen de eerste 100 regels terug. Een koppeling die dat mist, ziet 100 artikelen en geen foutmelding. Bij bladeren hoort altijd een sortering, anders kan de volgorde tijdens het ophalen verschuiven en valt er een regel tussen twee pagina's.

AFAS noemt geen aantal aanroepen per minuut. De grenzen liggen bij de omvang:

  • Kolommen keer regels kleiner dan 150.000 per aanroep. Dit is een advies, en AFAS kondigt aan dat het een harde limiet wordt.
  • Een aanroep is maximaal 75 MB.
  • Een verbinding die langer dan ongeveer 15 minuten openstaat krijgt een time-out.
  • Een filter in de URL is maximaal 2.048 tekens.

De rekensom voor 18.000 artikelen. Profit_Article heeft 19 velden, dus 150.000 / 19 = 7.894 regels per aanroep. Met een take van 7.500 zijn dat 3 aanroepen. Een eigen GetConnector met alleen artikelcode, omschrijving, eenheid, btw-tariefgroep, barcode en wijzigingsdatum heeft 6 velden: 150.000 / 6 = 25.000 regels, dus de hele set in 1 aanroep. Voor prijzen ligt het anders. Profit_SalesPrice filtert op verkooprelatie, dus 500 debiteuren zijn 500 aanroepen per ronde. Die ronde draait 's nachts.

Webhooks zijn er alleen op dossieritems en workflows. Voor wijzigingen in artikelen en voorraad vraagt de koppeling op vaste momenten wat er sinds de vorige ronde is gewijzigd, met een filter op het veld gewijzigd op (operatortypes=2, groter of gelijk). Hoe je de duur van zo'n ronde uitrekent staat in doorvoer berekenen.

UpdateConnectoren: schrijven met vaste veldcodes

Schrijven gaat met POST voor nieuw, PUT voor wijzigen en DELETE voor verwijderen. De veldnamen zijn korte codes. Dit is order 10482 van Bakker Installatie B.V., met één artikelregel en een regel verzendkosten:

POST /ProfitRestServices/connectors/FbSales HTTP/1.1
Host: 12345.rest.afas.online
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6...
Content-Type: application/json

{ "FbSales": { "Element": {
  "Fields": {
    "DbId": "10432", "RfCs": "WEB-10482", "OrDa": "2026-10-02",
    "War": "01", "PaCd": "14"
  },
  "Objects": [ { "FbSalesLines": { "Element": [
    { "Fields": { "VaIt": "2", "ItCd": "KB-2210", "BiUn": "stk",
                  "QuUn": 12, "Upri": 17.08 } },
    { "Fields": { "VaIt": "6", "ItCd": "VERZ", "BiUn": "*****",
                  "QuUn": 1, "Upri": 6.95 } }
  ] } } ]
} } }

DbId is de verkooprelatie, RfCs de referentie van de klant, War het magazijn, PaCd de betaalvoorwaarde. VaIt is het type item: 2 voor een artikel, 6 voor kosten, 3 voor een tekstregel. Alle codes moeten in Profit bestaan. De REST-documentatie van AFAS beschrijft de opbouw; de velden per connector staan in de metainfo van jouw eigen omgeving.

Een webshoporder naar de UpdateConnector FbSales in AFAS Profit Het e-mailadres van de klant wordt via een opzoektabel het debiteurnummer in DbId. Het ordernummer gaat naar RfCs. SKU, aantal en prijs gaan naar ItCd, QuUn en Upri. Het btw-percentage wordt een btw-tariefgroep in VaRc. De verzendkosten worden een eigen orderregel met itemtype 6. Webshoporder AFAS Profit, FbSales customer.email inkoop@bakker.example order_number 10482 line.sku KB-2210 line.quantity 12 line.price 17.08 line.tax_rate 21% shipping_total 6.95 geen artikel DbId 10432 verkooprelatie RfCs WEB-10482 referentie, max 100 tekens ItCd KB-2210 met VaIt 2, artikel QuUn 12 Upri 17.08 VaRc code uit Profit btw-tariefgroep, max 4 tekens regel met VaIt 6 ItCd VERZ, Upri 6.95 kostenregel opzoektabel voorvoegsel btw-tabel eigen regel
Een webshoporder naar FbSales. Klant, btw en verzendkosten gaan niet één op één over: ze lopen via een opzoektabel, een btw-tabel en een eigen kostenregel.

Waar het bij AFAS op vastloopt

Wat er misgaat Oorzaak in Profit Wat de koppeling doet
Order geweigerd Betaalvoorwaarde, magazijn of eenheid bestaat niet als code Tabel per code, gevuld bij de bouw; onbekende waarde naar de controlelijst
Dubbele verkooprelatie MatchOga op 6: altijd nieuw toevoegen Eerst zoeken op debiteurnummer, KvK-nummer en e-mail
Adres afgekeurd of verminkt Straat, huisnummer en toevoeging zijn drie velden Adresregel splitsen voor het versturen
Verzendkosten ontbreken Kosten zijn een eigen regel met itemtype 6 Vaste kostencode per verzendmethode
Variant komt als los artikel aan Profit kent twee artikeldimensies per regel Dimensiecodes mappen op de opties in de webshop

Codes in plaats van waarden

De webshop levert waarden: 21% btw, betaald met iDEAL, per stuk. Profit vraagt codes: een btw-tariefgroep in VaRc van maximaal 4 tekens, een betaalvoorwaarde in PaCd van maximaal 5, een eenheid in BiUn. Welke code bij welke waarde hoort, verschilt per omgeving. Een order met een code die Profit niet kent wordt geweigerd. De koppeling houdt per code een tabel bij en zet een order met een onbekende waarde op een controlelijst in het dashboard, met de reden erbij.

Het veld OrPr bepaalt hoe Profit de order verwerkt: 1 is pakbon met factuur na levering, 3 is factuur met levering na vooruitbetaling. Een webshoporder die al betaald is en een order op rekening van een zakelijke klant vragen een andere waarde. Ook dat ligt in de mapping vast, per betaalmethode.

Verkooprelaties: organisatie of persoon, en hoe er gezocht wordt

Een zakelijke klant gaat naar KnSalesRelationOrg, een consument naar KnSalesRelationPer. Bij het aanmaken geeft de koppeling in MatchOga op hoe Profit naar een bestaande organisatie zoekt: 0 op nummer, 1 op KvK-nummer, 2 op fiscaal nummer, 3 op naam, 4 op adres, 6 altijd nieuw toevoegen. Met 6 ontstaat bij elke gastbestelling een nieuwe relatie. Met 3 hangt het af van een gelijke naam, en Bakker Installatie B.V. en Bakker Installatie BV zijn dan twee relaties. De koppeling zoekt daarom eerst zelf, in een vaste volgorde, en maakt pas daarna aan. De achtergrond staat in dubbele klanten en debiteuren.

Adressen in losse velden

Het adres in Profit bestaat uit Ad voor de straat (maximaal 60 tekens), HmNr voor het huisnummer, HmAd voor de toevoeging (maximaal 30), ZpCd voor de postcode en Rs voor de woonplaats. De meeste webshops leveren één adresregel. "Dorpsstraat 12 A" wordt dus Ad Dorpsstraat, HmNr 12, HmAd A. Een adres als "Plein 1945 nr. 3" breekt een eenvoudige splitsing. Zie adresvelden mappen.

Voorraad: welk getal uit Profit

Profit_Stock geeft per artikel, magazijn en locatie twee getallen: StockActual, op voorraad, en StockEconomic, de economische voorraad. De eerste is wat er ligt; in de tweede zijn openstaande verkoop- en inkooporders verrekend. Welke van de twee de webshop toont, en welke magazijnen meetellen, wordt per koppeling vastgelegd. Zie voorraad en beschikbaarheid.

Platformen die we aan AFAS koppelen

De koppeling wordt gebouwd op jouw Profit-omgeving en jouw webshop. Per combinatie staat op een eigen pagina wat er specifiek speelt:

De platformen zelf staan op WooCommerce koppeling en Shopify koppeling. Andere ERP-systemen: Exact Online koppeling en Business Central koppeling. Het overzicht van alle stromen 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 welke velden en codes naar Profit zouden gaan, zonder dat er iets wordt aangemaakt. Vertel welke webshop je hebt en wat er in Profit staat, dan krijg je de lijst met connectoren die jouw beheerder moet klaarzetten.

Veelgestelde vragen

Wie maakt de app connector in AFAS aan?

De applicatiebeheerder van jouw AFAS-omgeving. In Profit gaat dat via Algemeen, Beheer, App connector: een app connector met een gebruikersgroep, de GetConnectoren en UpdateConnectoren die de koppeling mag gebruiken, en voor een nieuwe koppeling OAuth met de client credentials flow. Een koppeling die nog op een classic token draait, gaat voor 15 februari 2027 over op OAuth. Wij leveren de lijst met connectoren en velden aan, zodat de beheerder het in één keer kan inrichten.

Hoe zit het met maatwerk als onze AFAS-inrichting afwijkt?

Dat is de normale situatie. Elke omgeving heeft eigen vrije velden, eigen btw-tariefgroepen, betaalvoorwaarden, magazijnen en vaak eigen GetConnectoren. De koppeling leest per UpdateConnector de metainfo uit, waarin ook de vrije velden staan, en de mapping wordt op jouw inrichting gebouwd. Verandert de inrichting later, dan passen wij de mapping aan.

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

Ja. Elke bron krijgt een eigen voorvoegsel in het referentieveld RfCs, zodat ordernummers niet botsen, en waar nodig een eigen magazijn of administratie in de order. AFAS raadt aan om per externe applicatie één app connector aan te maken. Zo is per koppeling te zien welke GetConnectoren en UpdateConnectoren hij mag gebruiken en is de toegang van één koppeling in te trekken zonder de andere te raken.

Heeft AFAS webhooks voor orders of voorraad?

Nee. Volgens de documentatie van AFAS zijn er alleen webhooks op dossieritems en workflows. Artikelen, voorraad, prijzen en pakbonnen haalt de koppeling op door op vaste momenten een GetConnector aan te roepen met een filter op de velden aangemaakt op en gewijzigd op. Hoe vaak dat gebeurt wordt per stroom gekozen; zie realtime of batch.

Zit er een limiet op het aantal aanroepen?

AFAS publiceert geen aantal per minuut of per dag. Er geldt een fair-use policy, een aanroep mag maximaal 75 MB groot zijn en een verbinding die langer dan ongeveer 15 minuten openstaat krijgt een time-out. Voor GetConnectoren adviseert AFAS: aantal kolommen keer aantal regels kleiner dan 150.000 per aanroep. De koppeling rekent de paginagrootte daarop uit.

Kan de koppeling eerst in een testomgeving draaien?

Ja. AFAS kent drie omgevingstypes met elk een eigen adres: productie op rest.afas.online, test op resttest.afas.online en accept op restaccept.afas.online. De acceptomgeving krijgt een nieuwe Profit-versie als eerste. Elke omgeving heeft een eigen app connector met eigen inloggegevens nodig. Definities van connectoren gaan via export en import van de ene omgeving naar de andere.

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