Das Problem
Wer in JTL-Wawi das OSS-Verfahren (One-Stop-Shop) korrekt abbilden möchte, steht vor einer bekannten Herausforderung: JTL liefert keine fertige OSS-Vorkonfiguration. Die bestehende Zone-EU muss in 27 einzelne Länderzonen aufgeteilt werden — jede mit eigenem Steuersatz, eigenem Steuerschlüssel und eigenem Buchungskonto für den DATEV-Export.
Das händische Anlegen über die JTL-Oberfläche ist möglich, aber zeitaufwändig. Pro Land sind mindestens diese Schritte nötig:
- Steuerzone anlegen
- Land zuweisen
- Land aus Zone-EU entfernen
- Steuersätze für Standard, Ermäßigt und Stark ermäßigt hinterlegen
- Steuerschlüssel mit Buchungskonto verknüpfen
- Versandarten pro Steuersatz zuweisen
- OSS-Verfahren auf „Firmensitz” setzen
Mal 27 Länder ergibt das mehrere Stunden Klickarbeit — mit entsprechendem Fehlerpotenzial.
Die Voraussetzungen
Bevor das Script ausgeführt werden kann, müssen in JTL-Wawi einige Vorarbeiten erledigt sein.
Steuerschlüssel anlegen: Für jedes OSS-Land wird ein eigener Steuerschlüssel mit dem vom Steuerberater vorgegebenen Buchungskonto benötigt. Der Weg dazu ist Admin → Steuern → Steuerschlüssel. In unserem Fall wurden die Schlüssel nach folgendem Schema benannt:
| Steuerschlüssel | Buchungskonto |
|---|---|
| OSS BE | 4000 |
| OSS BG | 4001 |
| OSS DK | 4002 |
| … | … |
| OSS CY | 4026 |
Die konkreten Kontonummern werden vom Steuerberater vorgegeben — sie hängen vom verwendeten DATEV-Kontenrahmen (SKR03 oder SKR04) und der gewünschten Granularität der Buchung ab.
Wichtig: Bei den Steuerschlüsseln darf die Checkbox „Automatikkonto” nicht aktiviert sein — sonst wird der Schlüssel beim DATEV-Export nicht übermittelt.
Die Datenbankstruktur
Bevor wir das Script schreiben, lohnt ein kurzer Blick auf die relevanten Tabellen:
tSteuerzone— enthält die Steuerzonen. Relevant:kFirma,cName,cLandISO. Das FeldcLandISObestimmt die Firmenzugehörigkeit — für alle deutschen Zonen muss hierDEstehen, nicht der ISO-Code des Lieferlandes.tSteuerzoneLand— verknüpft Länder mit Zonen. Das eigentliche Lieferland wird hier übercISOhinterlegt.tSteuersatz— enthält die Steuersätze pro Zone und Steuerklasse, inklusive der Steuerschlüssel-Verknüpfungen.tSteuersatzschluessel— enthält die Zuordnung von Steuersätzen zu Versandarten und Warengruppen.
Eine wichtige Erkenntnis aus der Praxis: cLandISO in tSteuerzone hat nichts mit dem Lieferland zu tun — es steuert die Firmenzugehörigkeit. Wer hier den Länder-ISO-Code einträgt, bekommt für jedes Land eine separate Firma in der JTL-Oberfläche angezeigt.
Das Script
Das Script arbeitet in einer Transaktion und legt pro Land folgende Datensätze an:
tSteuerzone— neue Zone mitkFirma = 1undcLandISO = 'DE'tSteuerzoneLand— Verknüpfung des LieferlandestSteuersatz— drei Einträge für Standard-, Ermäßigt- und Stark-ermäßigt-SatztSteuersatzschluessel— Versandarten-Zuordnung für alle drei Steuersätze, kopiert aus der bestehenden Zone-EU (kSteuersatz = 12)
Ein Ausschnitt für Belgien:
BEGIN TRANSACTION;
INSERT INTO tSteuerzone (kFirma, cName, cLandISO)
VALUES (1, 'Belgien BE', 'DE');
DECLARE @Z_BE INT = SCOPE_IDENTITY();
INSERT INTO tSteuerzoneLand (kSteuerzone, cISO, cKuerzelBundesland)
VALUES (@Z_BE, 'BE', '');
INSERT INTO tSteuersatz (kSteuerzone, kSteuerklasse, fSteuersatz,
kStSchl, kStSchlIGL, kStSchlUStIGL, kStSchlReverse)
VALUES (@Z_BE, 1, 21.0, 14, 14, 1, 1);
DECLARE @kSS_BE_Std INT = SCOPE_IDENTITY();
-- Versandarten aus Zone-EU als Vorlage kopieren
INSERT INTO tSteuersatzschluessel (kSteuersatz, kWarengruppe, kVersandart,
nPositionstyp, kSteuerschluessel,
kStSchlIGL, kStSchlUStIGL, kStSchlReverse)
SELECT @kSS_BE_Std, 0, kVersandart, 0, 14, 1, 1, 1
FROM tSteuersatzschluessel
WHERE kSteuersatz = 12 AND kWarengruppe = 0 AND nPositionstyp = 0;
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;
Das vollständige Script umfasst alle 27 Länder und folgt exakt diesem Muster — lediglich Zonenname, ISO-Code, Steuersatz und Steuerschlüssel-ID variieren pro Land.
Steuersätze aller 27 Länder
Zur Referenz — die aktuellen Steuersätze (Stand März 2026) die im Script hinterlegt sind:
| Land | Kürzel | Standard | Ermäßigt | Stark ermäßigt |
|---|---|---|---|---|
| Belgien | BE | 21% | 6% | 0% |
| Bulgarien | BG | 20% | 9% | 0% |
| Dänemark | DK | 25% | 0% | 0% |
| Estland | EE | 22% | 9% | 0% |
| Finnland | FI | 25,5% | 14% | 0% |
| Frankreich | FR | 20% | 5,5% | 2,1% |
| Griechenland | GR | 24% | 13% | 6% |
| Irland | IE | 23% | 13,5% | 4,8% |
| Italien | IT | 22% | 10% | 4% |
| Kroatien | HR | 25% | 13% | 5% |
| Lettland | LV | 21% | 12% | 0% |
| Litauen | LT | 21% | 9% | 0% |
| Luxemburg | LU | 17% | 8% | 3% |
| Malta | MT | 18% | 7% | 0% |
| Niederlande | NL | 21% | 9% | 0% |
| Österreich | AT | 20% | 10% | 13% |
| Polen | PL | 23% | 8% | 5% |
| Portugal | PT | 23% | 13% | 6% |
| Rumänien | RO | 19% | 9% | 5% |
| Schweden | SE | 25% | 12% | 6% |
| Slowakei | SK | 23% | 10% | 0% |
| Slowenien | SI | 22% | 9,5% | 5% |
| Spanien | ES | 21% | 10% | 4% |
| Tschechien | CZ | 21% | 12% | 0% |
| Ungarn | HU | 27% | 18% | 5% |
| Nordirland | XI | 20% | 5% | 0% |
| Zypern | CY | 19% | 9% | 0% |
Hinweis: Steuersätze ändern sich gelegentlich. Vor der Ausführung des Scripts sollte der Steuerberater die Werte bestätigen.
Fallstricke aus der Praxis
Beim Entwickeln und Testen des Scripts sind einige Punkte aufgefallen, die es zu beachten gilt.
cLandISO in tSteuerzone ist nicht das Lieferland. Wer hier den ISO-Code des Lieferlandes einträgt, bekommt für jedes Land eine separate Firma in der JTL-Oberfläche. Der korrekte Wert für eine deutsche JTL-Installation ist DE.
Stark ermäßigter Satz: Vorlage aus Zone-EU verwenden. Die originale Zone-EU hat für den stark ermäßigten Satz (kSteuersatz = 14) nur wenige Versandart-Einträge — weil dort historisch kaum ermäßigte Waren konfiguriert wurden. Für die OSS-Zonen empfiehlt es sich, die Versandarten aus dem Standard-Satz (kSteuersatz = 12) als Vorlage zu verwenden, damit alle Versandarten vollständig gesetzt sind.
Belgien-Zone war bereits vorhanden. In unserem Fall existierte Zone ID 9 bereits als manuell angelegter Testdatensatz. Das Script löscht diese Zone am Anfang und legt sie neu an — damit ist der Ablauf für alle 27 Länder einheitlich.
Positionstypen bleiben offen. Das Script setzt bewusst keine Positionstypen (Mehrzweckgutschein, Versandposition, Coupon etc.) — diese Zuordnung hängt von der individuellen Konfiguration des Mandanten ab und sollte mit dem Steuerberater abgestimmt werden.
Vorgehen bei der Ausführung
Das Script sollte nie direkt mit COMMIT ausgeführt werden. Das empfohlene Vorgehen:
- Datenbankbackup erstellen
- Script mit
ROLLBACKam Ende ausführen — prüfen ob Fehler auftreten - Bei Erfolg
ROLLBACKdurchCOMMITersetzen und erneut ausführen - JTL-Wawi neu starten — der Cache muss neu aufgebaut werden
- Länder händisch aus Zone-EU herausnehmen
- OSS-Verfahren pro Zone auf „Firmensitz” setzen
- Positionstypen mit dem Steuerberater abstimmen und nachpflegen
Ergebnis
Nach der Ausführung des Scripts sind alle 27 OSS-Länderzonen vollständig in JTL-Wawi angelegt — mit korrekten Steuersätzen, Buchungskonten und Versandart-Zuordnungen. Der DATEV-Export kann anschließend sauber nach Lieferland differenziert werden.
Was manuell mehrere Stunden Klickarbeit gekostet hätte, erledigt das Script in Sekunden — reproduzierbar, dokumentiert und bei Bedarf einfach anpassbar.
Fazit: JTL-Wawi bietet keine native OSS-Vorkonfiguration — aber die Datenbankstruktur ist gut dokumentierbar und per SQL vollständig automatisierbar. Wer die Tabellen einmal verstanden hat, kann nicht nur OSS-Zonen anlegen, sondern beliebige Steuerszenarien effizient umsetzen. Der Schlüssel liegt im Verständnis von
cLandISOals Firmenzugehörigkeit, nicht als Lieferland.