A free, open-source command-line tool to file your German E-Bilanz — the electronic balance sheet that every German company is legally required to submit to the tax office.
Fill in an Excel template, run one command. ebilanz-submit validates your figures, generates an HGB-compliant XBRL document, and transmits it to the Finanzamt through the official ERiC (ELSTER) interface. Local, free, open source — no cloud, no subscription, no telemetry.
The E-Bilanz can only be filed through software — and all of it costs money.
Since 2013 (§5b EStG), every German company that prepares a balance sheet — every GmbH, and most other businesses — must transmit its balance sheet and profit-and-loss statement to the tax office electronically, in XBRL format. There is no opting out.
And there is no manual way to do it. Unlike an income-tax return, the E-Bilanz cannot be typed into a free ELSTER web form — it can only be transmitted through software that speaks the official ERiC interface. ERiC itself is free, but until now every application built on top of it has been commercial:
- Priced for tax advisors, not founders. Licenses run into the hundreds of euros per year.
- Overblown for a small company. Most packages are bloated with features a one-person GmbH will never touch.
- So you must pay just to comply. To meet a legal obligation, a small company either buys software it barely uses, or hands the job — and a few hundred euros — to its Steuerberater, every single year.
A legal requirement should not be paywalled. ebilanz-submit is the missing free path: it drives the same official, free ERiC interface from a simple Excel template, on your own machine — so a small, owner-run company can file its own E-Bilanz without paying anyone, and without its financial data ever leaving the building.
Scope: GmbH and UG (haftungsbeschränkt) (§266 Abs. 1 HGB), balance sheet + P&L (Gesamtkostenverfahren). No cash-flow statement, notes, or management report — deliberately focused on the simple balance sheets of small companies. Contributions extending the scope are welcome.
- Solo-Unternehmer mit kleiner GmbH oder UG (haftungsbeschränkt) (§266 Abs. 1 HGB)
- Die keine teure Steuerberater-Software benötigen
- Die ihre E-Bilanz selbst erstellen und übermitteln möchten
Scope:
- ✅ GmbH und UG (haftungsbeschränkt) — keine AG, keine Personengesellschaften
- ✅ Bilanz + GuV (Gesamtkostenverfahren)
- ❌ Keine Kapitalflussrechnung
- ❌ Kein Anhang, kein Lagebericht
✅ Excel-basierte Dateneingabe — Einfaches Template statt komplizierter Software ✅ Automatische Validierung — 12 Prüfregeln für korrekte Bilanzen ✅ HGB Taxonomie 6.8 — Aktuelle XBRL-Standards ✅ ElsterBasis-Wrapper — Korrekte XML-Struktur für ELSTER ✅ Test-Modus — Vorproduktion-Server zum Testen ✅ macOS-native — Entwickelt und getestet auf macOS
brew install cmake pugixml cli11 spdlog nlohmann-json catch2git clone <repository-url>
cd ebilanz
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(sysctl -n hw.ncpu)Nutze templates/ebilanz-template.xlsx:
| Sheet | Inhalt |
|---|---|
| Stammdaten | Firmendaten, Steuernummer, BuFa-Nr, Wirtschaftsjahr |
| Bilanz | Aktiva & Passiva nach HGB §266 (aktuelles + Vorjahr) |
| GuV | Gewinn- und Verlustrechnung (Gesamtkostenverfahren) |
Hinweis:
- Rechtsform (Zeile 6): Pflicht, Dropdown mit
GmbHoderUG (haftungsbeschränkt). Steuert das Mindestkapital in der Validierung und die Rechtsform im XBRL (legalStatus.GMBHbzw.legalStatus.UG). Ältere, von Hand angelegte Vorlagen ohne Eintrag in B6 werden jetzt mit einem Fehler abgewiesen — Zelle nachtragen. - HerstellerID (Zeile 24): Pflicht für die Übermittlung. Jeder Hersteller benötigt eine eigene, bei ELSTER registrierte HerstellerID — siehe Abschnitt „HerstellerID & DatenLieferant". Alternativ via
--hersteller-id. - DatenLieferant (Zeile 25): Optional, falls abweichend vom Firmennamen
./build/ebilanz-submit --validate meine-bilanz.xlsxPrüft:
- ✅ Bilanz ausgeglichen (Aktiva = Passiva)
- ✅ Jahresüberschuss konsistent (Bilanz = GuV)
- ✅ Gezeichnetes Kapital passend zur Rechtsform (GmbH ≥ 25.000 EUR, UG ≥ 1 EUR)
- ✅ Steuernummer-Format korrekt
- ✅ Alle Pflichtfelder vorhanden
./build/ebilanz-submit --output /tmp meine-bilanz.xlsxErzeugt:
/tmp/ebilanz-2024.xbrl— Pure XBRL (zum Inspizieren)/tmp/ebilanz-2024-elster.xml— ElsterBasis-Wrapper (zur Übermittlung)
./build/ebilanz-submit --test --cert zertifikat.pfx meine-bilanz.xlsxDie HerstellerID identifiziert die übermittelnde Software gegenüber ELSTER. Es ist keine HerstellerID eingebaut — jeder Nutzer/Hersteller muss seine eigene, bei ELSTER registrierte HerstellerID verwenden. Ohne HerstellerID bricht die Übermittlung mit einem Fehler ab.
HerstellerID beantragen: https://www.elster.de/elsterweb/entwickler
Setzen:
- Via CLI:
--hersteller-id XXXXX - Via Excel: Eintragen in Stammdaten Zeile 24
Priorität: CLI-Flag > Excel-Feld (B24)
Was ist das?
- Name des Datenlieferanten (wer übermittelt die Daten)
- Standard: Ihr Firmenname aus Stammdaten
- Kann überschrieben werden
Wann überschreiben?
- Steuerberater übermittelt für Mandant
- Dritter übermittelt in Ihrem Auftrag
Wie nutzen?
- Standard: Automatisch = Firmenname
- Override: Eintragen in Stammdaten Zeile 25
ebilanz-submit [OPTIONEN] <bilanz.xlsx>| Parameter | Beschreibung |
|---|---|
<bilanz.xlsx> |
Excel-Datei mit Bilanzdaten |
| Option | Beschreibung |
|---|---|
-v, --validate |
Nur validieren, nicht übermitteln |
-t, --test |
Test-Modus (Vorproduktion-Server) |
-o, --output <dir> |
XBRL-Dateien speichern (ohne Übermittlung) |
| Option | Beschreibung |
|---|---|
-c, --cert <file> |
ELSTER-Zertifikat (.pfx) |
-p, --password <pw> |
Zertifikat-Passwort ( |
--hersteller-id <id> |
ELSTER HerstellerID (Pflicht; alternativ Excel-Feld B24) |
| Option | Beschreibung |
|---|---|
--verbose |
Ausführliche Debug-Ausgabe |
--quiet |
Nur Fehler anzeigen |
--log <file> |
Log-Datei (Standard: ebilanz.log) |
| Option | Beschreibung |
|---|---|
--taxonomie <json> |
Taxonomie-Config-Datei |
--bufa <json> |
BuFa-Verzeichnis-Datei |
| Option | Beschreibung |
|---|---|
--version |
Versionsnummer anzeigen |
-h, --help |
Hilfe anzeigen |
Validierung:
./ebilanz-submit --validate bilanz-2024.xlsxXBRL generieren (ohne Übermittlung):
./ebilanz-submit --output /tmp bilanz-2024.xlsxTest-Übermittlung:
./ebilanz-submit --test --cert zertifikat.pfx bilanz-2024.xlsxProduktiv-Übermittlung:
./ebilanz-submit --cert zertifikat.pfx bilanz-2024.xlsxMit Passwort-Datei:
./ebilanz-submit --cert zertifikat.pfx --password "Geheim123!" bilanz-2024.xlsxAlternative: Nutze --output zum Generieren der XML-Dateien und übermittle diese manuell über das ELSTER-Portal.
-
Download: https://www.elster.de/elsterweb/entwickler Datei:
ERiC-43.3.2.0-Darwin-universal.jar(oder aktueller) -
Extrahieren:
cd ~/Downloads unzip -q ERiC-*.jar -d eric-extracted
-
Kopieren:
cd /pfad/zum/ebilanz-projekt mkdir -p external/eric-sdk cp -r ~/Downloads/eric-extracted/ERiC-*/Darwin-universal/include external/eric-sdk/ cp -r ~/Downloads/eric-extracted/ERiC-*/Darwin-universal/lib external/eric-sdk/
-
macOS Security Fix:
# Quarantine entfernen xattr -d com.apple.quarantine external/eric-sdk/lib/*.dylib 2>/dev/null || true find external/eric-sdk/lib/plugins -name "*.dylib" -exec xattr -d com.apple.quarantine {} \; 2>/dev/null || true # Ad-hoc Signieren codesign --force --deep --sign - external/eric-sdk/lib/*.dylib 2>/dev/null || true find external/eric-sdk/lib/plugins -name "*.dylib" -exec codesign --force --deep --sign - {} \; 2>/dev/null || true
-
Neu bauen:
cmake -B build -DWITH_ERIC=ON cmake --build build
Das Tool prüft automatisch:
| # | Regel | Typ | Bedingung |
|---|---|---|---|
| 1 | Bilanz ausgeglichen | ERROR | |Aktiva - Passiva| < 0,01 € |
| 2 | Jahresüberschuss konsistent | ERROR | |Bilanz.JÜ - GuV.JÜ| < 0,01 € |
| 3 | Rechtsform & Mindestkapital | ERROR / WARNING | GmbH ≥ 25.000 €, UG (haftungsbeschränkt) ≥ 1 € |
| 4 | Steuernummer Format | ERROR | Pattern: XX/XXX/XXXXX |
| 5 | BuFa-Nummer | ERROR | 4-stellig numerisch |
| 6 | Bundeseinh. Steuernummer | ERROR | 13-stellig numerisch |
| 7 | Handelsregister | ERROR | Pattern: HRB XXXXX |
| 8 | Pflichtfelder | ERROR | Alle Stammdaten vorhanden |
| 9 | Erstjahr-Konsistenz | WARNING | Vorjahr = 0 wenn Erstjahr |
| 10 | Ergebnisverwendung | ERROR | Ausschüttung > 0 wenn nicht Thesaurierung |
| 11 | Wirtschaftsjahr | WARNING | Dauer ≤ 18 Monate |
| 12 | Bilanzstichtag | ERROR | = Wirtschaftsjahr-Ende |
Regel 3 im Detail (Rechtsform aus Stammdaten B6):
rechtsform— ERROR, wenn B6 leer oder unbekannt ist (erlaubt:GmbH,UG (haftungsbeschränkt)). Dann greift keine Kapitalprüfung.gmbh_kapital— ERROR, wenn GmbH und gezeichnetes Kapital < 25.000 € (§ 5 Abs. 1 GmbHG).ug_kapital— ERROR, wenn UG und gezeichnetes Kapital < 1 € (§ 5a Abs. 1 GmbHG); WARNING ab 25.000 €, weil dann die Sonderregeln des § 5a GmbHG entfallen.ug_ruecklage— WARNING, wenn bei einer UG die geplante Ausschüttung mehr als 75 % des Jahresüberschusses beträgt (gesetzliche Rücklage nach § 5a Abs. 3 GmbHG). Reiner Hinweis, keine Blockade.
Die UG-Unterstützung ist durch die Testsuite und lokal erzeugte XBRL-Dateien abgedeckt; eine ERiC-Testübermittlung für eine UG steht noch aus.
ebilanz/
├── CMakeLists.txt # Build-Konfiguration
├── README.md # Diese Datei
├── CLAUDE.md # Entwickler-Anweisungen
├── config/
│ ├── taxonomie-6.8.json # HGB Taxonomie 6.8 Mapping
│ └── bufa-verzeichnis.json # Bundesland → BuFa Mapping
├── templates/
│ └── ebilanz-template.xlsx # Excel-Vorlage für Nutzer
├── scripts/
│ └── add_rechtsform_dropdown.py # Rechtsform-Dropdown in die Vorlage schreiben
├── external/
│ └── eric-sdk/ # ERiC SDK (optional, nicht im Repo)
├── src/
│ ├── main.cpp # CLI Entry Point
│ ├── excel_parser.* # Excel-Parsing (xlnt)
│ ├── validator.* # Datenvalidierung
│ ├── xbrl_generator.* # XBRL-Generierung (HGB 6.8)
│ ├── elster_wrapper.* # ElsterBasis XML Wrapper
│ ├── eric_connector.* # ERiC SDK Integration
│ ├── steuernummer.* # Steuernummer-Konvertierung
│ └── ...
├── tests/
│ ├── test_*.cpp # Unit & Integration Tests
│ └── testdata/ # Test-Excel-Dateien
└── docs/
└── lastenheft-*.md # Vollständige Spezifikation
cd build
ctest --output-on-failureTest-Abdeckung: 55 Test-Cases, 272 Assertions
- ✅ Excel-Parsing inkl. Rechtsform aus B6
- ✅ Validierung (12 Regeln, inkl. GmbH-/UG-Mindestkapital und § 5a Abs. 3 GmbHG)
- ✅ Steuernummer-Konvertierung (3 Bundesländer)
- ✅ XBRL-Generierung inkl.
legalStatusje Rechtsform - ✅ ElsterBasis-Wrapper
- ✅ ERiC-Integration
Wird templates/ebilanz-template.xlsx über create_test_data neu erzeugt, fehlt danach das Rechtsform-Dropdown (xlnt schreibt keine Data Validations). Danach einmal python scripts/add_rechtsform_dropdown.py ausführen.
→ ERiC SDK Bibliotheken müssen signiert werden (siehe ERiC SDK Setup)
→ macOS blockiert ERiC-Plugins aufgrund von Code-Signing-Problemen
→ Workaround: Nutze --output und übermittle XML manuell
→ Prüfe Excel: Summe Aktiva muss exakt Summe Passiva entsprechen
→ Eine GmbH benötigt mindestens 25.000 € Stammkapital (§ 5 Abs. 1 GmbHG)
→ Bei einer UG: in Stammdaten B6 UG (haftungsbeschränkt) wählen — dann gilt 1 € als Untergrenze
→ Zelle B6 im Sheet "Stammdaten" akzeptiert nur GmbH oder UG (haftungsbeschränkt)
Contributions are very welcome — this tool exists to save small companies money, and every improvement compounds across everyone who uses it. Good places to start:
- Broaden the scope: further legal forms (AG, Personengesellschaften), or balance-sheet positions not yet mapped.
- Annual taxonomy updates: the HGB taxonomy changes most years; the mapping is data, not code — see
config/taxonomie-6.8.json. - Cross-platform: Windows/Linux build and packaging (the core is portable C++17; only password entry and the ERiC setup are platform-specific).
- Tests for new validation rules or taxonomy positions.
Please open an issue to discuss anything non-trivial first, and run ctest before opening a PR. Codebase conventions and architecture live in CLAUDE.md.
Disclaimer: This tool does not constitute tax advice. You are responsible for the correctness of the data you submit. When in doubt, consult a Steuerberater.
MIT License — siehe LICENSE-Datei
Entwickelt für Solo-Unternehmer mit GmbH oder UG (haftungsbeschränkt), die die Kontrolle über ihre E-Bilanz behalten möchten.
Dependencies:
- xlnt — Excel-Verarbeitung
- pugixml — XML-Generierung
- CLI11 — Command-Line Parsing
- spdlog — Logging
- nlohmann/json — JSON-Parsing
- Catch2 — Testing
ELSTER:
- ERiC SDK © Bayerisches Landesamt für Steuern
- HGB Taxonomie © XBRL Deutschland e.V.
- Issues: GitHub Issues
- Fragen: Siehe
docs/lastenheft-*.mdfür Details - ELSTER Support: https://www.elster.de/elsterweb/entwickler
Hinweis: Dieses Tool ersetzt keine steuerliche Beratung. Konsultiere bei Unsicherheiten einen Steuerberater.