Zurück zum Blog

Exchange Rate API für ERP: Währungskurse in NetSuite, SAP und Dynamics 365 automatisieren

V
Vlado Grigirov
September 03, 2026
Currency API Exchange Rates ERP NetSuite SAP Dynamics 365 Integration

Jedes multinationale Finance-Team stößt früher oder später auf dieselbe Wand: Das ERP-System benötigt für jede Fremdwährungstransaktion, jeden Tag, für jedes vom Unternehmen genutzte Währungspaar einen Wechselkurs – und irgendjemand tippt diese immer noch von Hand ein. Eine Exchange Rate API für ERP-Integration löst dieses Problem, indem sie den täglichen Kursimport in einen geplanten Job verwandelt, der läuft, bevor das Buchhaltungsteam sich einloggt. Dieser Leitfaden zeigt, wie NetSuite, SAP S/4HANA und Microsoft Dynamics 365 Finance jeweils Kurse verarbeiten, wie man eine einzige Kurs-Pipeline aufbaut, die alle drei Systeme versorgt, und welche Randfälle den Monatsabschluss stillschweigend verfälschen, wenn man sie falsch handhabt.

Warum ERP-Systeme einen externen Kurs-Feed benötigen

Jedes ERP-System mit aktivierter Mehrwährungsfunktion speichert seine eigene Wechselkurstabelle. NetSuite hat die Liste der Currency Exchange Rates, SAP die Tabelle TCURR (gepflegt über die Transaktion OB08), und Dynamics 365 Finance hat die Seite Currency exchange rates. Nichts in Ihrem Hauptbuch liest direkt einen Marktdaten-Feed – Buchungen lesen aus dieser internen Tabelle.

Dieses Design ist bewusst gewählt und es ist das richtige. Finanzbuchungen müssen reproduzierbar sein: Führt ein Prüfer eine Buchung aus dem März erneut aus, muss sie dieselbe Zahl liefern wie im März. Eine Tabelle mit datierten, unveränderlichen Kursen bietet genau das. Ein Live-Marktabruf tut das nicht.

Das Problem liegt darin, wie diese Tabelle gefüllt wird. In der Praxis gibt es drei gängige Ansätze:

  1. Manuelle Eingabe. Jemand öffnet die EZB-Website oder die Seite einer Bank, kopiert Kurse und tippt sie ein. Das ist langsam, fehleranfällig und lässt sich kaum sauber prüfen – es gibt keine Aufzeichnung darüber, woher die Zahl stammt.
  2. Der eingebaute Provider des ERP-Systems. NetSuite, SAP und Dynamics liefern alle eine Art integrierten Feed mit. Diese funktionieren, aber Sie bekommen genau die Währungsabdeckung, Kursquelle und den Aktualisierungsrhythmus, den der Hersteller gewählt hat, und sie lassen sich nur schwer mit anderen Systemen abgleichen.
  3. Eine dedizierte Währungs-API, die einen geplanten Job speist. Sie kontrollieren die Quelle, das Timing, die Währungsliste und den Audit-Trail – und derselbe Feed kann gleichzeitig Ihre Abrechnungsplattform, Ihr Data Warehouse und Ihr ERP-System bedienen.

Option 3 ist das, was dieser Leitfaden aufbaut. Der entscheidende Vorteil ist Konsistenz über alle Systeme hinweg: Wenn Ihre Stripe-Abrechnung, Ihre BI-Dashboards und Ihr ERP-System alle aus demselben Snapshot schöpfen, erzeugt Ihre Umsatzabstimmung keine unerklärlichen FX-Abweichungen mehr.

Anforderungen an einen ERP-tauglichen Kurs-Feed

Nicht jede Währungs-API eignet sich für die Buchhaltung. Trading-orientierte Feeds sind auf Latenz optimiert; ERP-Feeds sind auf Reproduzierbarkeit optimiert. Hier ist, worauf es tatsächlich ankommt.

Tägliche Snapshots statt Tick-Daten

Ihr Hauptbuch braucht keine Sekundenbruchteil-Kurse. Es braucht einen maßgeblichen Kurs pro Währungspaar und Tag, erfasst zu einem konsistenten Zeitpunkt und konsistent angewendet. Ein Feed, der je nach Sekunde des Abrufs eine leicht andere Zahl liefert, ist ein Risiko, kein Feature. Was Sie wollen, ist ein stabiler täglicher Schlusswert, den Sie erneut abrufen können und der dieselbe Antwort liefert.

Historischer Endpunkt mit vollständigem Nachladen

Sie werden historische Kurse ständig brauchen: um nach einem Ausfall nachzuladen, um Salden früherer Perioden neu zu bewerten, um eine vor drei Wochen datierte Buchung zu korrigieren und um Prüfungsanfragen zu erfüllen. Eine historische Wechselkurs-API, die Jahre zurückreicht, ist nicht verhandelbar. Wenn Ihr Anbieter nur „latest" liefert, haben Sie ein Spielzeug gekauft.

Breite Währungsabdeckung einschließlich wenig gehandelter Paare

Hauptwährungspaare sind einfach. Die Paare, die ERP-Ladevorgänge zum Scheitern bringen, sind diejenigen, in denen Ihre Tochtergesellschaft in Nairobi oder Ihr vietnamesischer Lieferant Rechnungen stellt. Prüfen Sie, ob Ihr Anbieter die Long Tail abdeckt – Finexly deckt über 170 Währungen ab – bevor Sie die Lücke erst beim Abschluss entdecken.

Deterministische, dokumentierte Rundung

ERP-Systeme speichern Kurse mit fester Genauigkeit, und diese unterscheidet sich von System zu System. Rundungsfehler bei Kursen summieren sich über tausende Buchungen. Legen Sie Ihre Rundungsregel einmal fest, dokumentieren Sie sie und wenden Sie sie überall identisch an – unser Leitfaden zu Rundung und Nachkommastellen bei Währungen behandelt die Fallstricke im Detail.

Ein Audit-Trail, den Sie selbst kontrollieren

Für jeden geladenen Kurs sollten Sie festhalten: Quelle, Basis- und Zielwährung, Kurs, Stichtag, Zeitstempel des Abrufs und die Job-Run-ID. Prüfer fragen „Woher kommt das?" und „Wer hätte das ändern können?" – und eine Antwort wie „der eingebaute Provider des ERP, glauben wir" ist schwach. Das gilt umso mehr für Wechselkurse in der Steuerberichterstattung, wo Behörden häufig verlangen, dass Kurse aus einer festgelegten Quelle konsistent über eine Periode angewendet werden.

Wie jedes ERP-System Kurse verarbeitet

Die Pipeline ist gemeinsam; nur der letzte Zustellungsschritt unterscheidet sich je System.

NetSuite

NetSuite bietet drei Wege an. Das eingebaute Feature Currency Exchange Rate Integration (aktivierbar unter Setup > Company > Enable Features) aktualisiert Kurse automatisch einmal täglich von einem integrierten Anbieter. Der Import Assistant verarbeitet eine CSV-Datei mit Wechselkursen. Und SuiteScript kann Kurs-Datensätze direkt schreiben – der richtige Weg, wenn Sie Ihre eigene Quelle und Ihren eigenen Zeitplan möchten.

Ein geplantes SuiteScript-2.x-Skript, das Kurse von Ihrer API abruft und currencyrate-Datensätze erstellt, gibt Ihnen volle Kontrolle:

/**
 * @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 };
});

Achten Sie genau auf die Richtung. Das Feld exchangerate in NetSuite erwartet den Kurs je nach Kontext entweder als Basiswährungseinheiten pro Einheit der Transaktionswährung oder umgekehrt, abhängig von Ihrer Subsidiary-Konfiguration. Laden Sie ein Paar manuell, prüfen Sie, was das Hauptbuch erzeugt, und passen Sie die Richtung entsprechend an – dies ist die mit Abstand häufigste Ursache dafür, dass ein Kursimport sauber durchläuft, aber verkehrt herum bucht.

SAP S/4HANA und ECC

SAP speichert Kurse in TCURR und bietet mehrere Ladewege. Die Transaktion OB08 pflegt Kurse manuell. Die Transaktion TBD4 ist der Standardweg für automatisierte Updates von einem Marktdaten-Lieferanten. BAPI_EXCHANGERATE_CREATE schreibt Kurse programmgesteuert – das nutzen die meisten kundenspezifischen Integrationen. Manche Teams erzeugen stattdessen die Marktdatendatei, die SAPs Standardimport erwartet, und legen sie für einen geplanten Job auf dem Applikationsserver ab.

Zwei SAP-spezifische Konzepte sind zu beachten:

  • Wechselkurstypen. SAP unterscheidet M (Standardumrechnung, von den meisten Buchungen verwendet), B (Geldkurs der Bank), G (Briefkurs der Bank) und oft eigene Typen für Planungs- oder Budgetkurse. Nur M zu laden ist meist der richtige Einstieg; klären Sie mit dem FI-Team, welche Typen in Ihrer Instanz tatsächlich konfiguriert sind.
  • Kursfaktoren. TCURF enthält die Von-/Nach-Faktoren für ein Paar. Bei Währungen mit großen numerischen Verhältnissen (JPY, KRW, IDR, VND gegenüber EUR oder USD) liegt der Faktor häufig bei 1:100 oder 1:1000. Laden Sie einen Rohkurs ohne den passenden Faktor, liegen Ihre Beträge um zwei bis drei Größenordnungen daneben – und, schlimmer noch, sie sehen bei einer schnellen Durchsicht plausibel genug aus, um unentdeckt zu bleiben.

Ein gängiges Muster besteht darin, eine Ladedatei aus Ihrer API zu erzeugen und sie von einem geplanten ABAP-Job verarbeiten zu lassen:

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 bringt ein Exchange-Rate-Provider-Framework sowie eine periodische Aufgabe, Import currency exchange rates, mit, die Kurse nach Zeitplan von einem konfigurierten Anbieter abruft. Von Haus aus stehen einige Zentralbank-Anbieter zur Verfügung. Das Framework ist erweiterbar: Sie können einen eigenen Provider in X++ implementieren, sodass Ihre eigene API als vollwertige Option in derselben Oberfläche erscheint, die das Finance-Team ohnehin schon nutzt.

Wer kein X++ schreiben möchte, kann alternativ Kurse pragmatisch über das Data Management Framework mittels der Exchange-Rate-Datenentität einspielen, gesteuert von einer zeitgesteuerten Azure Function oder Logic App. Das hält die Integration in einer Sprache, die Ihr Team ohnehin schon beherrscht, und erspart bei jeder Zeitplanänderung ein Code-Deployment.

Die Pipeline aufbauen

Unabhängig vom Ziel ist die Form des Jobs immer dieselbe: einmal abrufen, pro ERP transformieren, laden, verifizieren.

Schritt 1: Einen Snapshot abrufen

Rufen Sie einmal täglich einen Snapshot ab und behandeln Sie ihn als Single Source of Truth für alle nachgelagerten Systeme:

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
  }
}

Speichern Sie diese Rohantwort wortwörtlich, bevor Sie irgendetwas transformieren. Wenn ein Controller im November fragt, warum der Septemberkurs war, wie er war, beantwortet die gespeicherte Payload die Frage in Sekunden.

Schritt 2: Die Paare ableiten, die Ihr ERP tatsächlich benötigt

Ihre API liefert Kurse gegen eine Basiswährung. Ihr ERP benötigt vielleicht GBP→JPY, und Ihre Tochtergesellschaften haben womöglich jeweils ihre eigene funktionale Währung. Leiten Sie Kreuzkurse aus demselben Snapshot ab, statt für jedes Paar einen separaten Aufruf zu machen – so bleibt jeder abgeleitete Kurs intern konsistent und Ihre Aufrufzahl niedrig:

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.38

Ist Ihnen die Arithmetik von Kreuzkursen nicht vertraut, erklärt unser Beitrag zu Kreuzkursen das Thema ausführlich.

Schritt 3: Laden, dann verifizieren

Betrachten Sie ein erfolgreiches HTTP-200 vom ERP niemals als Beweis dafür, dass der Ladevorgang funktioniert hat. Lesen Sie nach dem Schreiben eine Stichprobe von Paaren zurück und vergleichen Sie sie mit dem Snapshot. Ein dreizeiliger Verifizierungsschritt erkennt vertauschte Richtungen, stillschweigend verworfene Zeilen und Genauigkeitsverluste, bevor das Buchhaltungsteam auf fehlerhaften Daten bucht.

Schritt 4: Mit vernünftiger Fehlerbehandlung planen

Führen Sie den Job an Werktagen aus, deutlich bevor das Finance-Team mit der Arbeit beginnt, und bauen Sie folgendes Verhalten ein:

  • Retry mit Backoff bei vorübergehenden Netzwerkfehlern – drei Versuche über zehn Minuten decken fast alles ab.
  • Rückfall auf den letzten bekannten guten Kurs, statt gar nichts zu laden, und diesen deutlich kennzeichnen. Ein ERP mit einem veralteten, aber gekennzeichneten Kurs ist weit besser als ein ERP mit einer Lücke.
  • Einen Menschen alarmieren beim zweiten aufeinanderfolgenden Fehlschlag. Stille FX-Job-Fehlschläge werden erst beim Monatsabschluss entdeckt – dem denkbar schlechtesten Zeitpunkt.
  • Beim Wiederanlaufen nachladen. Wenn der Job wieder läuft, laden Sie jedes verpasste Datum nach, nicht nur den heutigen Tag. Unser Leitfaden zu Caching und Fehlerbehandlung behandelt die allgemeinen Muster dazu.

Fallstricke, die den Monatsabschluss ruinieren

Wochenenden und Feiertage. Devisenmärkte schließen. Die meisten ERP-Systeme erwarten für jedes Buchungsdatum einen Kurs, auch für Samstage. Legen Sie Ihre Richtlinie ausdrücklich fest – den Freitagskurs fortschreiben oder die eingebaute Lückenfüllung des ERP nutzen – und dokumentieren Sie sie, denn Prüfer werden danach fragen.

Vertauschte Kursrichtung. Oben für NetSuite behandelt, aber das Risiko ist universell. Jedes ERP-System hat eine eigene Meinung dazu, ob die gespeicherte Zahl Basiseinheiten pro Zieleinheit ist oder umgekehrt. Validieren Sie anhand eines Paares mit offensichtlicher Richtung: Kommt USD→JPY als 0,0066 statt 151 heraus, haben Sie es verkehrt herum.

Zeitliche Abweichungen zwischen Systemen. Erstellt Ihre Abrechnungsplattform Snapshots um 00:00 UTC und Ihr ERP-Job läuft um 06:00 Uhr Ortszeit, verwenden Rechnungen und Hauptbuchbuchungen unterschiedliche Zahlen, und jemand verbringt eine Woche mit dem Abgleich der Differenz. Einmal snapshotten, an alles verteilen.

Kursfaktoren bei hoch denominierten Währungen. Das oben beschriebene SAP-TCURF-Problem hat anderswo Entsprechungen. Jede Währung, bei der eine Einheit der Basis Tausende Einheiten der Zielwährung kauft, verdient einen eigenen Testfall.

Rückwirkende Korrekturen. Wird ein Kurs falsch geladen und wurden bereits Buchungen vorgenommen, können Sie die Tabelle in der Regel nicht einfach überschreiben – die Buchungen tragen weiterhin den alten Kurs. Planen Sie den Korrekturworkflow mit Ihrem Finance-Team, bevor Sie ihn brauchen.

Build vs. Buy – ehrlich betrachtet

Eine Kurs-Pipeline ist tatsächlich eine sehr kleine Menge Code – ein paar hundert Zeilen inklusive Tests. Was Sie bei einem Währungs-API-Anbieter kaufen, sind die Daten, die Verfügbarkeit und das historische Archiv, nicht die Integrationslogik.

Manuelle EingabeEingebauter ERP-ProviderDedizierte API + geplanter Job
EinrichtungsaufwandKeinerGering1–3 Tage
Laufender Aufwand15–30 Min/TagMinimalNahezu null
WährungsabdeckungWas auch immer Sie nachschlagenListe des Anbieters170+
Konsistent über Systeme hinwegNeinNeinJa
Eigener Audit-TrailSchwachBegrenztVollständig
Historisches NachladenManuellBegrenztVollständig
Wenn Sie die größere Frage abwägen, haben wir eine ausführlichere Betrachtung unter Build vs. Buy bei Wechselkursdaten. Für die meisten Teams lautet die ehrliche Antwort: Die Integration lohnt sich zu bauen, die Daten lohnt es sich nicht, selbst zu beschaffen.

Sobald die Pipeline existiert, versorgt derselbe Snapshot ganz natürlich benachbarte Systeme – Integrationen für Buchhaltungssoftware, Multi-Currency-Rechnungsstellung und BI-Dashboards wollen alle genau die Daten, die Sie ohnehin schon abrufen.

Häufig gestellte Fragen

Kann ich eine kostenlose Währungs-API für den ERP-Kursimport nutzen?

Für ein kleines Unternehmen mit einer Handvoll Währungen und einem täglichen Ladevorgang: ja – ein Aufruf pro Tag liegt bequem innerhalb der meisten kostenlosen Tarife, einschließlich Finexlys kostenlosem Plan. Was kostenlose Tarife typischerweise einschränken, sind die historische Tiefe und das Volumen beim Nachladen – genau das, was Sie nach einem Ausfall oder während einer Prüfung brauchen. Prüfen Sie den historischen Zeitraum, bevor Sie sich festlegen.

Wie oft sollte der ERP-Kursimport laufen?

Für die meisten Organisationen einmal pro Werktag, geplant bevor die Buchhaltung mit der Arbeit beginnt. Unternehmen mit hoher FX-Exposition ergänzen manchmal einen zweiten untertägigen Ladevorgang für die Preisbildung auf Transaktionsebene, während sie für Hauptbuchbuchungen bei einem einzigen Tageskurs bleiben. Häufiger als das schafft nur zusätzlichen Abstimmungsaufwand, ohne die Genauigkeit zu verbessern.

Welchen Kurs sollte ich verwenden – Spot, Schluss oder einen Durchschnitt?

Gängige Praxis nach IFRS und US GAAP ist der Kurs am Transaktionsdatum für einzelne Transaktionen und häufig ein Durchschnittskurs für Posten der Gewinn- und Verlustrechnung über eine Periode. Diese Entscheidung trifft Ihr Finance-Team, nicht Ihr Engineering-Team; Ihre Aufgabe ist es, den gewählten Kurs reproduzierbar verfügbar zu machen. Der Unterschied zwischen Spot- und Terminkursen spielt hier ebenfalls eine Rolle, wenn das Unternehmen hedgt.

Sollte ich den eingebauten Provider des ERP ersetzen oder beide parallel betreiben?

Betreiben Sie beide kurz parallel und vergleichen Sie die Ergebnisse – das ist die günstigste Validierung Ihrer neuen Pipeline. Sobald eine Woche übereinstimmender Ergebnisse vorliegt, schalten Sie den eingebauten Provider ab. Beide dauerhaft parallel laufen zu lassen schafft Unklarheit darüber, welcher Kurs maßgeblich ist – schlimmer als jede der beiden Optionen allein.

Wie gehe ich mit einer Währung um, die mein Anbieter nicht abdeckt?

Leiten Sie sie über einen Kreuzkurs ab, sofern ein liquides Zwischenpaar existiert. Falls nicht – und das ist oberhalb der Long Tail wirklich selten –, dokumentieren Sie einen manuellen Prozess mit einem benannten Verantwortlichen und einer definierten Quelle. Ersetzen Sie nicht stillschweigend durch eine Proxy-Währung; das ist genau die Art von Sache, die zwei Jahre später bei einer Prüfung ans Licht kommt.

Loslegen

Bereit, damit aufzuhören, Wechselkurse von Hand in Ihr ERP-System einzutippen? Holen Sie sich Ihren kostenlosen Finexly-API-Key – keine Kreditkarte erforderlich. Sie erhalten über 170 Währungen, historische Daten für Nachladen und Audits sowie eine REST-API, die Sie an einem Nachmittag in NetSuite, SAP oder Dynamics einbinden. Starten Sie mit dem kostenlosen Plan, lesen Sie die API-Dokumentation und wechseln Sie erst dann zu einem kostenpflichtigen Plan, wenn Ihr Aufrufvolumen es tatsächlich erfordert.

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 →

Diesen Artikel teilen