Elk multinationaal financeteam loopt uiteindelijk tegen dezelfde muur aan: het ERP-systeem heeft voor elke buitenlandse transactie, elke dag, voor elk valutapaar dat het bedrijf raakt, een wisselkoers nodig — en iemand typt die nog steeds handmatig in. Een wisselkoers-API voor ERP-integratie lost dit op door de dagelijkse koersload om te zetten in een geplande taak die draait voordat het boekhoudteam inlogt. Deze gids behandelt hoe NetSuite, SAP S/4HANA en Microsoft Dynamics 365 Finance elk koersen verwerken, hoe u één enkele koerspijplijn bouwt die alle drie voedt, en de randgevallen die de maandafsluiting stilletjes corrumperen als u ze verkeerd aanpakt.
Waarom ERP-systemen een externe koersfeed nodig hebben
Elk ERP-systeem met meerdere valuta ingeschakeld slaat zijn eigen wisselkoerstabel op. NetSuite heeft de Currency Exchange Rates-lijst, SAP heeft tabel TCURR (onderhouden via transactie OB08), en Dynamics 365 Finance heeft de pagina Currency exchange rates. Niets in uw grootboek leest rechtstreeks een marktfeed — boekingen lezen die interne tabel.
Dat ontwerp is bewust gekozen en het is de juiste keuze. Financiële boekingen moeten reproduceerbaar zijn: als een auditor een journaalpost uit maart opnieuw uitvoert, moet die hetzelfde getal opleveren als in maart. Een tabel met gedateerde, onveranderlijke koersen biedt u dat. Een live marktoproep doet dat niet.
Het probleem is hoe die tabel wordt gevuld. In de praktijk zijn er drie gangbare benaderingen:
- Handmatige invoer. Iemand opent de ECB-site of een banksite, kopieert koersen en voert ze handmatig in. Dit is traag, foutgevoelig en onmogelijk goed te auditen — er is geen vastlegging van waar het getal vandaan kwam.
- De ingebouwde provider van het ERP. NetSuite, SAP en Dynamics leveren allemaal een vorm van ingebouwde feed. Deze werken, maar u krijgt de valutadekking, koersbron en updateschema die de leverancier heeft gekozen, en ze zijn lastig te reconciliëren met andere systemen.
- Een specifieke valuta-API die een geplande taak voedt. U beheert de bron, de timing, de valutalijst en het audittrail — en dezelfde feed kan tegelijk uw facturatieplatform, uw datawarehouse en uw ERP bedienen.
Optie 3 is wat deze gids bouwt. Het doorslaggevende voordeel is consistentie tussen systemen: als uw Stripe-facturatie, uw BI-dashboards en uw ERP allemaal uit dezelfde momentopname putten, houdt uw omzetreconciliatie op onverklaarbare FX-verschillen te produceren.
Eisen voor een koersfeed van ERP-niveau
Niet elke valuta-API is geschikt voor boekhouding. Op trading gerichte feeds optimaliseren voor latentie; ERP-feeds optimaliseren voor reproduceerbaarheid. Dit is wat er werkelijk toe doet.
Dagelijkse momentopnames, geen tickdata
Uw grootboek heeft geen koersen tot op de seconde nodig. Het heeft één gezaghebbende koers per valutapaar per dag nodig, genomen op een consistent tijdstip en consistent toegepast. Een feed die u een licht ander getal geeft afhankelijk van de seconde waarop u belde, is een risico, geen functie. Wat u wilt is een stabiele dagelijkse slotwaarde die u opnieuw kunt ophalen en waarbij u hetzelfde antwoord krijgt.
Historisch eindpunt met volledige terugvulling
U zult voortdurend historische koersen nodig hebben: om terug te vullen na een storing, om saldi uit voorgaande periodes te herwaarderen, om een boeking van drie weken geleden te corrigeren, en om te voldoen aan auditverzoeken. Een historische wisselkoers-API die jaren teruggaat, is niet onderhandelbaar. Als uw provider alleen "laatste" koersen levert, hebt u een speeltje gekocht.
Brede valutadekking, inclusief dunne paren
Grote paren zijn eenvoudig. De paren die ERP-loads doen breken, zijn die waarin uw dochteronderneming in Nairobi of uw Vietnamese leverancier factureert. Controleer of uw provider de lange staart dekt — Finexly dekt meer dan 170 valuta's — voordat u de leemte tijdens de afsluiting ontdekt.
Deterministische, gedocumenteerde afronding
ERP-systemen slaan koersen op met een vaste precisie, en die precisie verschilt per systeem. Afrondingsfouten in koersen stapelen zich op over duizenden boekingen. Bepaal uw afrondingsregel eenmalig, documenteer deze en pas ze overal identiek toe — onze gids over valuta-afronding en decimalen behandelt de valkuilen in detail.
Een audittrail die u zelf beheert
Voor elke geladen koers wilt u het volgende vastleggen: bron, basis- en tegenvaluta, koers, ingangsdatum, tijdstempel van de ophaling, en de ID van de taakuitvoering. Auditors vragen "waar komt dit vandaan?" en "wie zou dit hebben kunnen wijzigen?" — en een antwoord als "de ingebouwde provider van het ERP, denken we" is een zwak antwoord. Dit is nog belangrijker voor wisselkoersen in belastingrapportage, waar autoriteiten vaak koersen van een specifieke bron eisen, consistent toegepast over een periode.
Hoe elk ERP-systeem koersen verwerkt
De pijplijn is gedeeld; alleen de laatste leveringsstap verschilt per systeem.
NetSuite
NetSuite biedt drie routes. De ingebouwde functie Currency Exchange Rate Integration (ingeschakeld via Setup > Company > Enable Features) werkt koersen eenmaal per dag automatisch bij vanuit een geïntegreerde provider. De Import Assistant neemt een CSV met wisselkoersen. En SuiteScript kan koersrecords rechtstreeks schrijven, wat de route is die u kiest als u uw eigen bron en uw eigen schema wilt.
Een geplande SuiteScript 2.x-script dat gegevens ophaalt uit uw API en currencyrate-records aanmaakt, geeft u volledige controle:
/**
* @NApiVersion 2.1
* @NScriptType ScheduledScript
*/
define(['N/https', 'N/record', 'N/runtime'], (https, record, runtime) => {
const fetchRates = (base, symbols) => {
const res = https.get({
url: `https://api.finexly.com/v1/latest?base=${base}&symbols=${symbols.join(',')}`,
headers: { Authorization: `Bearer ${runtime.getCurrentScript().getParameter({ name: 'custscript_fx_key' })}` }
});
if (res.code !== 200) throw Error(`Finexly returned ${res.code}`);
return JSON.parse(res.body);
};
const execute = () => {
const base = 'USD';
const symbols = ['EUR', 'GBP', 'JPY', 'CAD', 'AUD', 'CHF', 'SEK', 'MXN'];
const payload = fetchRates(base, symbols);
Object.entries(payload.rates).forEach(([quote, rate]) => {
const rec = record.create({ type: 'currencyrate' });
rec.setValue({ fieldId: 'basecurrency', value: currencyIdFor(base) });
rec.setValue({ fieldId: 'transactioncurrency', value: currencyIdFor(quote) });
rec.setValue({ fieldId: 'effectivedate', value: new Date(payload.date) });
rec.setValue({ fieldId: 'exchangerate', value: rate });
rec.save();
});
};
return { execute };
});Let goed op de richting. Het exchangerate-veld van NetSuite verwacht de koers uitgedrukt als eenheden basisvaluta per eenheid transactievaluta in sommige contexten en het omgekeerde in andere, afhankelijk van uw dochterondernemingsconfiguratie. Laad één paar handmatig, controleer wat het grootboek produceert, en pas die richting toe — dit is de meest voorkomende oorzaak van een koersload die probleemloos draait maar achterstevoren boekt.
SAP S/4HANA en ECC
SAP slaat koersen op in TCURR en biedt verschillende laadpaden. Transactie OB08 onderhoudt koersen handmatig. Transactie TBD4 is de standaardroute voor geautomatiseerde updates van een marktgegevensleverancier. BAPI_EXCHANGERATE_CREATE schrijft koersen programmatisch, wat de meeste maatwerkintegraties gebruiken. Sommige teams genereren in plaats daarvan het marktgegevensbestand dat SAP's standaard import verwacht en plaatsen dit op de applicatieserver voor een geplande taak.
Twee SAP-specifieke concepten om rekening mee te houden:
- Wisselkoerstypen. SAP onderscheidt
M(standaardomrekening, gebruikt door de meeste boekingen),B(bank aankoop),G(bank verkoop), en vaak aangepaste types voor planning- of budgetkoersen. AlleenMladen is meestal het juiste startpunt; bevestig met het FI-team welke types daadwerkelijk zijn geconfigureerd in uw omgeving. - Koersfactoren.
TCURFbevat de van/naar-factoren voor een paar. Voor valuta met grote numerieke verhoudingen (JPY, KRW, IDR, VND ten opzichte van EUR of USD) is de factor vaak 1:100 of 1:1000. Als u een ruwe koers laadt zonder de bijbehorende factor in te stellen, wijken uw bedragen twee of drie ordes van grootte af — en erger nog, ze zien er plausibel genoeg uit om een snelle controle te doorstaan.
Een gangbaar patroon is om vanuit uw API een laadbestand te genereren en dit door een geplande ABAP-taak te laten verwerken:
import csv
from datetime import date
import requests
API = "https://api.finexly.com/v1/latest"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
BASE = "EUR"
SYMBOLS = ["USD", "GBP", "JPY", "CHF", "PLN", "CZK", "SEK", "NOK"]
RATE_TYPE = "M"
def build_tcurr_load(target: date, path: str) -> None:
r = requests.get(API, headers=HEADERS,
params={"base": BASE, "symbols": ",".join(SYMBOLS)}, timeout=15)
r.raise_for_status()
payload = r.json()
with open(path, "w", newline="") as fh:
w = csv.writer(fh, delimiter=";")
for quote, rate in payload["rates"].items():
# SAP expects the rate at the precision configured for the pair;
# 5 decimals is a safe default for majors.
w.writerow([RATE_TYPE, BASE, quote,
target.strftime("%Y%m%d"), f"{rate:.5f}"])
build_tcurr_load(date.today(), "/interface/fx/tcurr_load.csv")Microsoft Dynamics 365 Finance
Dynamics 365 Finance wordt geleverd met een exchange rate provider-framework en een periodieke taak, Import currency exchange rates, die op een schema gegevens ophaalt bij een geconfigureerde provider. Standaard krijgt u een handvol centralebankproviders. Het framework is uitbreidbaar: u kunt een aangepaste provider implementeren in X++, zodat uw eigen API een volwaardige optie wordt in dezelfde interface die het financeteam al gebruikt.
Als u liever geen X++ schrijft, is het pragmatische alternatief om koersen via het Data Management Framework door te sturen met behulp van de wisselkoers-data-entiteit, aangestuurd door een Azure Function of Logic App op een timer. Dat houdt de integratie in een taal die uw team al onderhoudt en voorkomt een codedeployment bij elke schemawijziging.
De pijplijn bouwen
Ongeacht de bestemming is de vorm van de taak hetzelfde. Eenmaal ophalen, per ERP transformeren, laden, verifiëren.
Stap 1: Eén momentopname ophalen
Haal eenmaal per dag één momentopname op en behandel deze als de bron van waarheid voor elk downstream-systeem:
curl "https://api.finexly.com/v1/latest?base=USD&symbols=EUR,GBP,JPY,CAD,AUD,CHF" \
-H "Authorization: Bearer YOUR_API_KEY"{
"base": "USD",
"date": "2026-09-03",
"rates": {
"EUR": 0.8631,
"GBP": 0.7402,
"JPY": 151.28,
"CAD": 1.3574,
"AUD": 1.4938,
"CHF": 0.8025
}
}Sla die ruwe respons letterlijk op voordat u iets transformeert. Wanneer een controller in november vraagt waarom de koers van september was wat hij was, geeft de opgeslagen payload het antwoord in enkele seconden.
Stap 2: Leid de paren af die uw ERP daadwerkelijk nodig heeft
Uw API geeft koersen terug ten opzichte van één basisvaluta. Uw ERP heeft mogelijk GBP→JPY nodig, en uw dochterondernemingen kunnen elk hun eigen functionele valuta hebben. Leid kruiskoersen af uit de enkele momentopname in plaats van per paar een aparte oproep te doen — dit houdt elke afgeleide koers intern consistent en houdt uw aantal requests laag:
def cross_rate(rates: dict, base: str, quote: str) -> float:
"""Both legs come from the same snapshot, so the cross is consistent."""
if base == quote:
return 1.0
return rates[quote] / rates[base]
# GBP -> JPY from a USD-based snapshot
gbp_jpy = cross_rate(payload["rates"], "GBP", "JPY") # 151.28 / 0.7402 = 204.38Als de rekenkunde van kruiskoersen u onbekend is, legt onze uitleg over kruiskoersen dit grondig uit.
Stap 3: Laden, dan verifiëren
Behandel een succesvolle HTTP 200 van het ERP nooit als bewijs dat het laden gelukt is. Lees na het schrijven een steekproef van paren terug en vergelijk deze met de momentopname. Een verificatiestap van drie regels vangt omgekeerde richtingen, stilletjes weggevallen rijen en precisieafkapping op voordat het boekhoudteam boekt op basis van foute gegevens.
Stap 4: Plannen met verstandige foutafhandeling
Voer de taak uit op een schema op werkdagen, ruim voordat het financeteam begint, en bouw het volgende gedrag in:
- Opnieuw proberen met backoff bij tijdelijke netwerkstoringen — drie pogingen verspreid over tien minuten lost bijna alles op.
- Val terug op de laatst bekende goede koers in plaats van niets te laden, en markeer dit duidelijk. Een ERP met een verouderde maar gelabelde koers is veel beter dan een ERP met een gat.
- Waarschuw een mens bij de tweede opeenvolgende mislukking. Stille storingen in de FX-taak worden pas bij de maandafsluiting ontdekt, het slechtst denkbare moment.
- Vul terug bij herstel. Wanneer de taak weer opstart, laad elke gemiste datum, niet alleen die van vandaag. Onze gids over caching en foutafhandeling behandelt de algemene patronen hierbij.
Valkuilen die de maandafsluiting breken
Weekenden en feestdagen. FX-markten sluiten. De meeste ERP-systemen verwachten een koers voor elke boekdatum, inclusief zaterdagen. Bepaal uw beleid expliciet — draag de koers van vrijdag door, of gebruik de eigen gatvulling van het ERP — en documenteer dit, want auditors zullen ernaar vragen.
Omgekeerde koersrichting. Hierboven besproken voor NetSuite, maar het risico is universeel. Elk ERP heeft een opvatting over of het opgeslagen getal eenheden-basis-per-tegenvaluta is of het omgekeerde. Valideer aan de hand van een bekend paar waarbij de richting duidelijk is: als USD→JPY uitkomt op 0,0066 in plaats van 151, hebt u het achterstevoren.
Timingverschil tussen systemen. Als uw facturatieplatform koersen om 00:00 UTC vastlegt en uw ERP-taak om 06:00 lokale tijd draait, gebruiken facturen en grootboekboekingen verschillende getallen en zal iemand een week besteden aan het reconciliëren van het verschil. Leg één keer een momentopname vast en verdeel die over alles.
Koersfactoren bij valuta met hoge coupurewaarden. Het SAP TCURF-probleem hierboven heeft equivalenten elders. Elke valuta waarbij één eenheid basisvaluta duizenden eenheden tegenvaluta koopt, verdient een specifiek testgeval.
Retroactieve correcties. Wanneer een koers verkeerd is geladen en er al boekingen zijn gemaakt, kunt u de tabel meestal niet zomaar overschrijven — de boekingen dragen de oude koers. Plan de correctieworkflow met uw financeteam voordat u het nodig hebt.
Eerlijk gezegd: zelf bouwen of kopen
Een koerspijplijn is werkelijk een kleine hoeveelheid code — een paar honderd regels inclusief tests. Wat u koopt bij een valuta-API-provider zijn de gegevens, de uptime en het historische archief, niet de integratielogica.
| Handmatige invoer | Ingebouwde ERP-provider | Specifieke API + geplande taak | |
|---|---|---|---|
| Opzetinspanning | Geen | Laag | 1–3 dagen |
| Doorlopende inspanning | 15–30 min/dag | Minimaal | Bijna nul |
| Valutadekking | Wat u opzoekt | Lijst van provider | 170+ |
| Consistent tussen systemen | Nee | Nee | Ja |
| Eigen audittrail | Zwak | Beperkt | Volledig |
| Historische terugvulling | Handmatig | Beperkt | Volledig |
Zodra de pijplijn bestaat, voedt dezelfde momentopname vanzelfsprekend aanpalende systemen — integraties met boekhoudsoftware, facturatie in meerdere valuta en BI-dashboards willen allemaal precies de gegevens die u al ophaalt.
Veelgestelde vragen
Kan ik een gratis valuta-API gebruiken voor het laden van ERP-koersen?
Voor een kleine entiteit met een handvol valuta's en één dagelijkse load, ja — één oproep per dag valt ruim binnen de meeste gratis lagen, waaronder het gratis plan van Finexly. Wat gratis lagen doorgaans beperken is de historische diepte en het terugvulvolume, precies wat u nodig hebt na een storing of tijdens een audit. Controleer het historische bereik voordat u zich vastlegt.
Hoe vaak moet de ERP-koersload draaien?
Voor de meeste organisaties eenmaal per werkdag, gepland voordat het boekhoudpersoneel begint te werken. Bedrijven met een hoge FX-blootstelling voegen soms een tweede load tijdens de dag toe voor prijsbepaling op transactieniveau, terwijl ze één enkele dagelijkse koers aanhouden voor grootboekboekingen. Vaker dan dat creëert reconciliatiewerk zonder de nauwkeurigheid te verbeteren.
Welke koers moet ik gebruiken — spot, slotkoers of een gemiddelde?
Standaardpraktijk onder zowel IFRS als US GAAP is de koers op de transactiedatum voor individuele transacties, en vaak een gemiddelde koers voor resultatenrekeningposten over een periode. Uw financeteam, niet uw engineeringteam, is verantwoordelijk voor deze beslissing; uw taak is om welke koers zij ook kiezen, reproduceerbaar beschikbaar te maken. Het onderscheid tussen spot- en termijnkoersen is hier ook van belang als het bedrijf hedgt.
Moet ik de ingebouwde provider van het ERP vervangen of beide laten draaien?
Laat beide kort parallel draaien en vergelijk de resultaten — dit is de goedkoopst mogelijke validatie van uw nieuwe pijplijn. Zodra u een week lang overeenkomende resultaten hebt, schakelt u de ingebouwde provider uit. Beide onbeperkt laten draaien creëert onduidelijkheid over welke koers gezaghebbend is, wat erger is dan elke optie afzonderlijk.
Hoe ga ik om met een valuta die mijn provider niet dekt?
Leid deze af via een kruiskoers als er een liquide tussenliggend paar bestaat. Zo niet — en dit is werkelijk zeldzaam buiten de lange staart — documenteer dan een handmatig proces met een genoemde eigenaar en een gedefinieerde bron. Vervang nooit stilzwijgend een proxyvaluta; dat is het soort ding dat twee jaar later in een audit naar boven komt.
Aan de slag
Klaar om te stoppen met het handmatig intypen van wisselkoersen in uw ERP? Vraag uw gratis Finexly API-sleutel aan — geen creditcard vereist. U krijgt meer dan 170 valuta's, historische gegevens voor terugvulling en audits, en een REST API die u in een middag kunt koppelen aan NetSuite, SAP of Dynamics. Begin met het gratis plan, bekijk de API-documentatie, en stap pas over naar een betaald plan wanneer uw belvolume dat daadwerkelijk vereist.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →