E-Rechnung aus SAP: das Feld-Mapping auf die finisma-API
Wer die E-Rechnung aus SAP erzeugen will, sucht als Erstes nach dem passenden Add-on und findet einen Wildwuchs aus Lizenzmodellen und Transportaufwand. Der kürzere Weg führt über die Schnittstelle: Ihr System hat die Rechnungsdaten längst, es fehlt nur die verlässliche Abbildung auf das EN-16931-Modell. Genau darum geht es hier, Feld für Feld, mit den SAP-Tabellen, den BT-Nummern der Norm und dem JSON, das finisma entgegennimmt.
1. Kein Add-on, eine Schnittstelle
Die Versuchung im SAP-Umfeld ist, jede neue Anforderung im System selbst zu lösen. Für die E-Rechnung ist das der teurere Weg. Ein Add-on bedeutet einen Namensraum, einen Transport durch drei Systeme, Wartungsfenster und eine Abhängigkeit, die bei jedem Support-Package wieder auf den Tisch kommt. Die Norm ändert sich derweil unabhängig von Ihrem Release-Stand: EN 16931 bekommt Errata, die KoSIT-Prüfregeln der XRechnung werden zweimal im Jahr aktualisiert.
finisma bleibt außerhalb. Was Sie brauchen, sind zwei Dinge, die Ihr System schon kann: Rechnungsdaten aus einer Faktura ziehen und einen HTTP-Request absetzen. Der Request geht an POST /api/v1/invoices, mit der Rechnungs-PDF und den strukturierten Daten als JSON. Zurück kommt die geprüfte ZUGFeRD-Rechnung. Kein Objekt wandert ins SAP-System, kein Server steht beim Kunden.
2. Wo die Rechnung in SAP entsteht
Bevor Sie ein einziges Feld abbilden, klären Sie die Quelle. In SAP liegt „die Rechnung“ an drei Stellen, und sie tragen unterschiedliche Daten:
- SD-Faktura (VBRK/VBRP). Der Regelfall für die Ausgangsrechnung. VBRK trägt den Kopf (Nummer, Datum, Währung, Partner, Vorgangsart), VBRP die Positionen (Material, Menge, Einheit, Nettowert). Hier holen Sie den Großteil des Mappings.
- FI-Buchhaltungsbeleg (BKPF/BSEG). Nur nötig, wenn die Rechnung rein in FI entsteht, etwa bei Rechnungen ohne SD-Prozess. Für den steuerlichen Aufriss ist ergänzend die Tabelle BSET gut, weil dort Steuerbasis und Steuerbetrag je Satz sauber getrennt stehen.
- Bestellung des Kunden (VBKD). Die Bestellnummer, die Ihr Kunde erwartet, steht in VBKD-BSTKD und gehört in ein eigenes Feld der E-Rechnung. Sie ist nicht die Leitweg-ID, dazu mehr in Abschnitt 4.
Für den häufigsten Fall, die Ausgangsrechnung aus dem Vertrieb, reicht die Kombination aus VBRK, VBRP und VBKD plus den Adress- und Bankstammdaten. Die folgende Tabelle geht von dieser Quelle aus.
3. Das Feld-Mapping: SAP → BT-Nummer → finisma-JSON
Die Norm nummeriert jedes Rechnungselement als „Business Term“ (BT). Das finisma-JSON benennt dieselben Elemente sprechend. Wenn Sie Ihr Mapping einmal gegen diese Tabelle sauber gezogen haben, sind Sie durch. Die BT-Nummer ist die Brücke: sie steht in jeder EN-16931-Dokumentation und macht das Mapping überprüfbar.
| Bereich | SAP-Feld / Quelle | BT | finisma-JSON |
|---|---|---|---|
| Kopf | VBRK-VBELN | BT-1 | invoiceNumber |
| Kopf | VBRK-FKDAT | BT-2 | issueDate |
| Kopf | VBRK-VBTYP | BT-3 | documentTypeCode |
| Kopf | VBRK-WAERK | BT-5 | currency |
| Kopf | Nettofälligkeit (ZTERM) | BT-9 | dueDate |
| Kopf | Leistungsdatum (VBRP-PRSDT) | BT-72 | deliveryDate |
| Kopf | BUT0ID (Typ DE:LWID) | BT-10 | buyerReference |
| Kopf | VBKD-BSTKD | BT-13 | purchaseOrderReference |
| Verkäufer | T001 / eigener BP: STCEG | BT-31 | seller.vatId |
| Verkäufer | ADRC: NAME1 | BT-27 | seller.name |
| Verkäufer | ADRC: STREET / CITY1 / POST_CODE1 / COUNTRY | BT-35/37/38/40 | seller.address.line1 / city / postalCode / countryCode |
| Käufer | KUNRG → BP / ADRC | BT-44/50/52/53/55 | buyer.name / buyer.address.* |
| Käufer | STCEG (nur bei § 13b) | BT-48 | buyer.vatId |
| Position | VBRP-ARKTX | BT-153 | lines[].name |
| Position | VBRP-FKIMG | BT-129 | lines[].quantity |
| Position | VBRP-VRKME | BT-130 | lines[].unitCode |
| Position | VBRP-MATNR | BT-155 | lines[].sellerArticleId |
| Position | VBRP-EAN11 (GTIN) | BT-157 | lines[].globalArticleId |
| Position | Konditionssatz Nettopreis (PRCD_ELEMENTS) | BT-146 | lines[].unitPriceNet |
| Position | Steuersatz aus MWST-Kondition | BT-152 | lines[].vatRatePercent |
| Position | VBRP-NETWR | BT-131 | lines[].lineNetAmount |
| Steuer | Steueraufriss je Satz (BSET) | BT-116/117/118/119 | vatBreakdown[] |
| Summen | Netto gesamt | BT-109 | totalNet |
| Summen | Steuerbetrag gesamt | BT-110 | totalVat |
| Summen | Bruttobetrag | BT-112 | totalGross |
| Zahlung | T052: Skonto % / Tage | BT-20 | payment.discountPercent / discountDays |
| Zahlung | Hausbank (T012K): IBAN / BIC | BG-16 | payment.iban / bic |
Zwei Dinge sind nicht in der Tabelle, weil sie in SAP oft anders heißen als man denkt. Erstens: Die Adresse ist eine line1, kein getrenntes Straßen- und Hausnummernfeld. Ziehen Sie Straße und Hausnummer aus ADRC zusammen. Zweitens: Es gibt kein Feld für die Steuernummer, nur vatId. Wer in SAP mit STCD1 statt STCEG arbeitet, hat für die B2B-E-Rechnung die falsche Kennung gezogen. Beide Punkte kosten im ersten Testlauf Zeit, deshalb stehen sie in Abschnitt 6 noch einmal ausführlich.
4. Leitweg-ID: der Wert, den SAP selten sauber liefert
Die Leitweg-ID gehört in buyerReference (BT-10) und ist bei Rechnungen an öffentliche Auftraggeber Pflicht. Ohne sie lehnt das Empfangsportal die Rechnung ab. Das Problem: SAP hat kein Standardfeld dafür. In der Praxis liegt der Wert an einer von zwei Stellen.
- als Geschäftspartner-Identifikation in
BUT0ID, unter einem eigenen Identifikationstyp, den viele HäuserDE:LWIDnennen, oder - im Adress-Zusatz über
ADR11(SSFID), wenn die Kennung am Rechnungsempfänger hängt.
Welche Stelle bei Ihnen gefüllt ist, hängt davon ab, wie die Stammdatenpflege den Wert einträgt. Legen Sie das früh fest, sonst schreibt Ihr Mapping mal die eine, mal die andere Quelle, und die Rechnungen an die Behörde fallen sporadisch durch. Was die Leitweg-ID im Detail ist und wie ihre Prüfziffer aufgebaut ist, steht im Artikel Leitweg-ID in der E-Rechnung. Verwechseln Sie sie nicht mit der Bestellnummer des Kunden: die geht als purchaseOrderReference nach BT-13 und stammt aus VBKD-BSTKD.
5. Gutschrift: der Typ trägt die Richtung
Der häufigste Denkfehler beim Mapping: eine Gutschrift mit negativen Beträgen zu schicken. Die Norm arbeitet anders. Die Richtung einer Rechnung steckt im Dokumenttyp, die Beträge bleiben immer positiv. finisma lehnt negative Summen ausdrücklich ab und meldet AMOUNT_NEGATIVE.
In SAP erkennen Sie den Fall an der Vorgangsart VBRK-VBTYP. Der Wert M steht für die Rechnung, O für die Gutschrift. Übersetzen Sie das in documentTypeCode:
| VBRK-VBTYP | Bedeutung | documentTypeCode |
|---|---|---|
| M | Rechnung | 380 (Standard) |
| O | Gutschrift | 381 |
Bei einer Gutschrift gehört zusätzlich der Bezug auf die Ursprungsrechnung dazu: precedingInvoiceNumber und precedingInvoiceDate. Wie der Dokumenttyp die Beträge steuert und warum das Minuszeichen in die Irre führt, vertieft der Artikel Gutschrift als E-Rechnung erstellen.
6. Drei Fallstricke, die jeden ersten Testlauf kosten
Diese drei tauchen bei fast jeder SAP-Anbindung auf. Wer sie vorher kennt, spart sich die erste Ablehnungsrunde.
USt-IdNr statt Steuernummer
SAP führt beide getrennt: die USt-IdNr in STCEG, die Steuernummer in STCD1 bis STCD5. Das finisma-Schema kennt nur vatId (BT-31 für den Verkäufer, BT-48 für den Käufer), kein Feld für die Steuernummer. Mappen Sie also STCEG. Zieht Ihr Programm versehentlich STCD1, steht in der Rechnung die falsche Kennung, und im Reverse-Charge-Fall nach § 13b fehlt die Pflicht-USt-IdNr des Empfängers ganz. Der Sonderfall ist im Artikel Reverse Charge in der E-Rechnung beschrieben.
Mengeneinheiten übersetzen
BT-130 (unitCode) erwartet einen Code nach UN/ECE Rec 20. SAP liefert in VBRP-VRKME die interne oder ISO-Einheit, und die stimmt nur selten überein. ST wird zu C62 (Stück), STD zu HUR (Stunde), M2 zu MTK. finisma kennt die gängigen Aliase und setzt fehlende Angaben auf C62; die vollständige Liste plus die akzeptierten Aliase liefert GET /api/v1/codelists/units. Prüfen Sie Ihre real verwendeten Einheiten einmal dagegen, dann ist der Punkt erledigt. Welche Codes trotz naheliegender Schreibweise abgelehnt werden, zeigt der Artikel Mengeneinheiten in der E-Rechnung.
Skonto strukturiert, nicht als Fließtext
In SAP steckt der Zahlungsrabatt in der Zahlungsbedingung (ZTERM, Tabelle T052) als Prozentsatz und Tagefrist. Bilden Sie ihn strukturiert ab, über payment.discountPercent und payment.discountDays. Nur dann kann das Empfängersystem den Skonto automatisch ziehen. Der reine Bedingungstext gehört zusätzlich in payment.terms, ersetzt die beiden Felder aber nicht. Warum viele Umwandlungen den Rabatt verlieren, steht im Artikel Skonto in der E-Rechnung.
7. Der Aufruf gegen /api/v1/invoices
Der Endpunkt nimmt multipart/form-data entgegen: den Teil pdf (die visuelle Rechnung) und den Teil invoice (die abgebildeten Daten als JSON). Authentifiziert wird per Bearer-Token. So sieht ein Aufruf aus, mit dem JSON auf das Wesentliche gekürzt:
curl -X POST https://finisma.de/api/v1/invoices \
-H "Authorization: Bearer fnsm_IHR_KEY" \
-F "pdf=@rechnung.pdf;type=application/pdf" \
-F 'invoice={
"invoiceNumber": "0090001234",
"documentTypeCode": "380",
"issueDate": "2026-09-01",
"currency": "EUR",
"buyerReference": "04011000-1234512345-06",
"purchaseOrderReference": "4500012345",
"seller": {
"name": "Muster GmbH",
"vatId": "DE123456789",
"address": { "line1": "Werkstr. 1", "postalCode": "20095",
"city": "Hamburg", "countryCode": "DE" }
},
"buyer": {
"name": "Kunde AG",
"address": { "line1": "Marktplatz 5", "postalCode": "10115",
"city": "Berlin", "countryCode": "DE" }
},
"lines": [
{ "name": "Beratung", "quantity": 10, "unitCode": "HUR",
"unitPriceNet": 100, "vatRatePercent": 19, "lineNetAmount": 1000 }
],
"vatBreakdown": [
{ "ratePercent": 19, "basisAmount": 1000, "taxAmount": 190,
"categoryCode": "S" }
],
"totalNet": 1000, "totalVat": 190, "totalGross": 1190
};type=application/json'Zurück kommt die ZUGFeRD-PDF binär im Body. Wer die Bytes in ABAP oder in der Middleware weiterverarbeitet, setzt Accept: application/json und bekommt { pdf_base64, bytes }. Braucht der Empfänger reine XRechnung ohne PDF, hängen Sie ?format=xml an und erhalten das CII-XML. Passen die Daten nicht zur Norm, etwa weil die Summen nicht aufgehen oder eine Pflichtangabe fehlt, antwortet die API mit strukturierten Fehlern samt Feldpfad statt mit einer Datei.
Die vollständige Referenz mit allen Feldern, Anhängen und Fehlercodes steht in der REST-API-Dokumentation. Wer lieber aus einem Workflow-Tool heraus fakturiert, findet den Weg über n8n beschrieben; die Anbindung als MCP-Server für KI-Agenten steht im Überblick zur E-Rechnung per API.
8. Die Schnittstelle fragt sich selbst ab
Ein Mapping altert. Codelisten wachsen, die Norm bekommt Errata. Damit Ihr Integrationscode nicht gegen fest verdrahtete Annahmen läuft, gibt die API über sich selbst Auskunft, maschinenlesbar:
| Endpunkt | Antwort |
|---|---|
| GET /api/v1/formats | unterstützte Formate, Operationen, Grenzen (Dateigröße, Zeilen) |
| GET /api/v1/codelists/units | gültige Mengeneinheiten (UN/ECE Rec 20), Aliase, Standard C62 |
| GET /api/v1/codelists/document-types | Dokumenttypen (380, 381, …), welche gutschriftartig sind |
| GET /api/v1/codelists/vat-categories | Steuerkategorien (S, AE, …), Standard S |
| GET /api/v1/openapi.json | die vollständige OpenAPI-Spezifikation für Client-Generierung |
Das JSON ist typisiert und mit OpenAPI beschrieben. Wer mag, generiert sich aus openapi.json einen typsicheren Client und muss die Felder aus der Tabelle oben nicht von Hand nachbauen. Die Codelisten-Endpunkte eignen sich gut, um Ihr Mapping in einem Test einmal automatisch gegen die aktuellen gültigen Werte zu prüfen, statt es bei jeder Normänderung nachzuziehen.
Alle vier Zugänge (REST, MCP, WebMCP, OAuth) mit Auth-Optionen und Feldern stehen in der Entwickler-Dokumentation. Den Grund, warum das Thema jeden im B2B betrifft, liefert der Überblick zur E-Rechnungspflicht ab 2027.
Ohne Integration testen
Eine einzelne SAP-Rechnung als PDF prüfen
Bevor Sie das Mapping bauen: Laden Sie eine gedruckte SAP-Rechnung hoch und sehen Sie, was finisma daraus als ZUGFeRD macht. Kostenlos, ohne Anmeldung, Dateien werden nach 5 Minuten gelöscht.
PDF hierher ziehen oder klicken
Nur PDF-Dateien · max. 20 MB
9. Häufige Fragen zur E-Rechnung aus SAP
Die wichtigsten Antworten kompakt, für alle, die schnell eine Einschätzung brauchen.
Braucht man für die E-Rechnung aus SAP ein zusätzliches Add-on im System?+
Nein. finisma läuft als externe Schnittstelle, es kommt kein Transport, kein Namensraum-Objekt und kein Server ins SAP-System. Ihr eigenes ABAP- oder Middleware-Programm sammelt die Rechnungsdaten aus VBRK/VBRP, schickt sie als JSON an POST /api/v1/invoices und bekommt die fertige ZUGFeRD-Rechnung zurück. Die Normarbeit (EN-16931-Schema, Geschäftsregeln, PDF/A-3) bleibt außerhalb des Systems.
Welches SAP-Feld wird zur Leitweg-ID in der E-Rechnung?+
Die Leitweg-ID gehört in BT-10 (buyerReference), nicht in die Bestellnummer. In SAP liegt sie meist als Geschäftspartner-Identifikation (Tabelle BUT0ID) unter einem eigenen Identifikationstyp, häufig 'DE:LWID', oder im Adress-Zusatz über ADR11/SSFID. Die Bestellnummer des Kunden ist ein getrenntes Feld (VBKD-BSTKD) und geht nach BT-13 (purchaseOrderReference).
Wie wird eine Gutschrift aus SAP in der E-Rechnung abgebildet?+
Über den Dokumenttyp, nicht über negative Beträge. Die Vorgangsart VBRK-VBTYP unterscheidet Rechnung ('M') und Gutschrift ('O'). Eine Gutschrift bekommt documentTypeCode 381, die Beträge bleiben positiv. finisma lehnt negative Summen ab (AMOUNT_NEGATIVE); die Richtung trägt allein der Typcode. Zusätzlich gehört der Bezug zur Ursprungsrechnung in precedingInvoiceNumber und precedingInvoiceDate.
Muss ich die SAP-Mengeneinheiten umsetzen?+
Ja. BT-130 (unitCode) erwartet einen Code nach UN/ECE Rec 20, während VBRP-VRKME die SAP-interne oder ISO-Einheit trägt. 'ST' wird zu C62 (Stück), 'STD' zu HUR (Stunde), 'M2' zu MTK. finisma kennt gängige Aliase und listet sie unter GET /api/v1/codelists/units; der Standardwert ist C62. Prüfen Sie Ihre verwendeten Einheiten einmal gegen diese Liste, dann ist das Mapping erledigt.
USt-IdNr oder Steuernummer aus SAP?+
Die USt-IdNr. Das Schema kennt nur vatId (BT-31 für den Verkäufer, BT-48 für den Käufer), kein Feld für die Steuernummer. In SAP steht die USt-IdNr in STCEG, die Steuernummer in STCD1 bis STCD5. Mappen Sie STCEG. Eine reine Steuernummer reicht für die B2B-E-Rechnung nicht, und bei Reverse Charge nach § 13b braucht auch der Empfänger seine USt-IdNr.
In welchem Format kommt die Rechnung zurück?+
Standardmäßig als ZUGFeRD-PDF (PDF/A-3 mit eingebettetem CII-XML, Profil EN 16931), binär im Response-Body. Mit Accept: application/json kommt stattdessen { pdf_base64, bytes }, mit ?format=xml nur das CII-XML ohne PDF. Ob Sie XRechnung oder ZUGFeRD brauchen, hängt vom Empfänger ab; für Behörden ist die reine XML üblich, im B2B das hybride ZUGFeRD.
Wie authentifiziert sich der Aufruf?+
Über einen API-Key als Bearer-Token: Authorization: Bearer fnsm_… Den Key erstellen Sie im Konto unter finisma.de/konto, er wird an das Abo gebunden und genau einmal angezeigt (finisma speichert nur einen Hash). Andere Header wie x-api-key werden bewusst nicht gelesen. Das Prüfen von Rechnungen geht auch ohne Key.
Quellen und weiterführende Informationen
- Forum elektronische Rechnung Deutschland (FeRD): ZUGFeRD-Spezifikation
- KoSIT / XRechnung: Standard und Prüftool
- EN 16931-1: Semantisches Datenmodell der elektronischen Rechnung (Business Terms)
- UN/ECE Recommendation 20: Codes für Maßeinheiten im Handel