storetown-media / module-tax-sync
Automatic EU VAT rate synchronization for Magento 2 — imports and updates all European tax rates including automatic Tax Rule creation. Free open-source under MIT.
Storetown EU Tax Rate Sync for Magento 2

Automatische Synchronisierung aller EU-Mehrwertsteuersätze für Magento 2
📦 Packagist · 📚 Produktseite · 💼 Storetown-Media Org
🇪🇺 Überblick
Diese kostenlose Extension importiert und aktualisiert automatisch alle EU-Mehrwertsteuersätze in Ihrem Magento 2 Shop. Nie wieder manuelle Pflege von Steuersätzen bei Änderungen!
✨ Features
- 27 EU-Länder + Schweiz, Norwegen und Großbritannien
- Standard- und ermäßigte Sätze werden separat importiert
- Automatische Tax Rules werden erstellt und mit den Rates verknüpft
- Cron-basierte Synchronisierung (täglich, wöchentlich oder monatlich)
- E-Mail-Benachrichtigungen bei Änderungen
- Admin-Benachrichtigungen im Magento Backend
- CLI-Befehle für manuelle Synchronisierung
- Fallback-Daten falls die API nicht erreichbar ist
📦 Installation
Via Composer (empfohlen)
composer require storetown/module-tax-sync
bin/magento module:enable Storetown_TaxSync
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush
Manuelle Installation
- Erstellen Sie den Ordner
app/code/Storetown/TaxSync - Kopieren Sie alle Dateien in diesen Ordner
- Führen Sie folgende Befehle aus:
bin/magento module:enable Storetown_TaxSync
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush
⚙️ Konfiguration
Navigieren Sie zu Stores → Configuration → Storetown → EU Tax Rate Sync
General Settings
| Option | Beschreibung |
|---|---|
| Enable Auto Sync | Aktiviert die automatische Cron-Synchronisierung |
| Sync Frequency | Täglich, Wöchentlich oder Monatlich |
| Data Source | API-Quelle (vat-api.eu empfohlen) |
| Include Non-EU | CH, NO, GB mit einbeziehen |
Tax Rules
| Option | Beschreibung |
|---|---|
| Auto-Create Tax Rules | Erstellt automatisch Tax Rules für jeden Steuersatz |
| Customer Tax Classes | Kundengruppen für die Rules |
| Product Tax Classes | Produktklassen für die Rules |
Notifications
| Option | Beschreibung |
|---|---|
| Email Notifications | E-Mail bei Änderungen senden |
| Notification Email | Empfänger-Adresse |
| Admin Notification | Benachrichtigung im Admin-Panel |
🖥️ CLI-Befehle
Manuelle Synchronisierung
bin/magento tax:sync:run
Mit ausführlicher Ausgabe:
bin/magento tax:sync:run -vvv
Status anzeigen
bin/magento tax:sync:status
🌍 Unterstützte Länder
EU-Mitgliedstaaten (27)
| Land | Code | Standard | Ermäßigt |
|---|---|---|---|
| Österreich | AT | 20% | 10% |
| Belgien | BE | 21% | 6% |
| Bulgarien | BG | 20% | 9% |
| Kroatien | HR | 25% | 13% |
| Zypern | CY | 19% | 5% |
| Tschechien | CZ | 21% | 12% |
| Dänemark | DK | 25% | - |
| Estland | EE | 24% | 9% |
| Finnland | FI | 25,5% | 14% |
| Frankreich | FR | 20% | 5,5% |
| Deutschland | DE | 19% | 7% |
| Griechenland | GR | 24% | 13% |
| Ungarn | HU | 27% | 18% |
| Irland | IE | 23% | 13,5% |
| Italien | IT | 22% | 10% |
| Lettland | LV | 21% | 12% |
| Litauen | LT | 21% | 9% |
| Luxemburg | LU | 17% | 8% |
| Malta | MT | 18% | 7% |
| Niederlande | NL | 21% | 9% |
| Polen | PL | 23% | 8% |
| Portugal | PT | 23% | 13% |
| Rumänien | RO | 21% | 11% |
| Slowakei | SK | 23% | 5% |
| Slowenien | SI | 22% | 9,5% |
| Spanien | ES | 21% | 10% |
| Schweden | SE | 25% | 12% |
Nicht-EU (optional)
| Land | Code | Standard | Ermäßigt |
|---|---|---|---|
| Schweiz | CH | 8,1% | 2,6% |
| Großbritannien | GB | 20% | 5% |
| Norwegen | NO | 25% | 15% |
Datenquelle & ermäßigte Sätze: Standardsätze werden live von vat-api.eu bezogen (kostenlos, ohne API-Key); bei nicht erreichbarer API greifen die gepflegten Fallback-Daten. Da viele Länder mehrere ermäßigte Sätze haben (super-reduziert / ermäßigt / Park), importiert die Extension pro Land einen ermäßigten Hauptsatz (Bücher, Medikamente, Grundnahrungsmittel). Diesen können Sie pro Land jederzeit unter Stores → Tax Zones and Rates anpassen.
📋 Anforderungen
- Magento 2.4.x
- PHP 8.1 oder höher
- Cron muss konfiguriert sein (für Auto-Sync)
🔧 Fehlerbehebung
Logs prüfen
tail -f var/log/tax_sync.log
Cache leeren
bin/magento cache:flush
DI neu kompilieren
rm -rf generated/code/*
bin/magento setup:di:compile
🐛 Bug Reports & Feature Requests
- Bug Report: Issue eröffnen mit Bug-Report-Template
- Feature Request: Issue eröffnen mit Feature-Request-Template
- Frage oder Diskussion: GitHub Discussions
- Sicherheitsproblem (kritisch): Bitte NICHT als Issue, sondern direkt an [email protected] — siehe SECURITY.md
Pull Requests sind willkommen! Siehe CONTRIBUTING.md.
💼 Kommerzielle Schwester-Extensions
Diese Extension ist dauerhaft kostenlos. Storetown-Media finanziert die Entwicklung über kommerzielle Magento-2-Extensions:
| Extension | Was sie löst | Ab |
|---|---|---|
| ⚡ Smart One Page Checkout | Checkout auf 1 Seite, 8 Payment-Provider, mobile-optimiert | 389 € |
| 🔐 B2B Register | B2B-Kundenfreischaltung mit Admin-Approval | 149 € |
| 📎 Attachment Pro | PDF-Datenblätter & Zertifikate am Produkt mit Auto-Zuweisung | 149 € |
| 💰 Surcharge Max | Zuschnitt-, Sperrgut- & Kategorie-Zuschläge transparent im Checkout | 99 € |
Hub: storetown-media.de/produkt-kategorie/downloads/magento-extensions/
📄 Changelog
Siehe CHANGELOG.md
📜 Lizenz
Diese Extension ist unter der MIT-Lizenz veröffentlicht — frei nutzbar, frei modifizierbar, kommerzielle Nutzung erlaubt.
🏢 Über Storetown Media
Storetown Media ist eine E-Commerce Agentur aus Hamburg/Tornesch, spezialisiert auf:
- 🛒 Magento 2 Entwicklung & Betreuung
- 🛍️ Shopware 6 Implementierung
- 🌐 WooCommerce Lösungen
- 🔗 ERP-Integrationen (SAP, Microsoft Dynamics, Oracle NetSuite)
Kontakt
- 🌐 Website: www.storetown-media.de
- 📧 E-Mail: [email protected]
- 📍 Standort: Hamburg / Tornesch, Deutschland
Made with ❤️ in Hamburg
Changelog
Alle wichtigen Änderungen an dieser Extension werden in dieser Datei dokumentiert.
Das Format basiert auf Keep a Changelog,
und dieses Projekt folgt Semantic Versioning.
[1.4.1] - 2026-06-16
Behoben
- Admin „Letzte Synchronisierung" zeigte ein falsches Datum (z. B. 17.12.2021) und schien sich nach „Jetzt synchronisieren" nicht zu ändern. Ursache: Der Anzeige-Block reichte den gespeicherten
Y-m-d H:i:s-UTC-Zeitstempel anTimezoneInterface::date()weiter — das parst Strings über das SHORT-Format der Locale und verwürfelt ISO-Datumswerte (falsches Datum, fehlende Sekunden). Der Zeitstempel wurde stets korrekt gespeichert, nur die Darstellung war defekt; der Sync (CLI wie Admin-Button) funktionierte. Fix: expliziter Parse als UTC + Umrechnung in die Shop-Zeitzone inBlock/Adminhtml/System/Config/LastSync.php.
[1.4.0] - 2026-06-16
Behoben
- CRITICAL: Veraltete Datenquelle. Die bisherige Primärquelle
euvatrates.comwird seit 2016 nicht mehr gepflegt ("last_updated":"2016-01-01") und liefert falsche Standardsätze (z. B. Rumänien 20 % statt aktuell 21 %). Da der Endpunkt weiterhin mit HTTP 200 und gültigem JSON antwortet, wurde er von der Verfügbarkeitsprüfung fälschlich als „erreichbar" eingestuft — der Fallback griff nie.EuVatRatesist jetzt dauerhaft als nicht verfügbar markiert und wird nicht mehr ausgewählt.
Hinzugefügt
Model/Api/VatApiEu.php— neue, gepflegte Primärquelle vat-api.eu (kostenlos, ohne API-Key). Liefert aktuelle Standardsätze für alle 27 EU-Mitgliedstaaten und ist neuer Standard (tax_sync/general/api_source = vatapieu).Model/Data/EuVatReducedRates.php— kuratierte Map der ermäßigten Sätze (Hauptsatz pro Land) als einzige Quelle der Wahrheit, gemeinsam genutzt vonVatApiEuundFallback(kein Drift mehr zwischen Live-Quelle und Fallback).Model/Data/NonEuVatRates.php— geteilte statische Sätze für CH/GB/NO. Da vat-api.eu nur die 27 EU-Staaten liefert, ergänzt die Live-Quelle diese Länder, sodass „Nicht-EU-Länder einbeziehen" jetzt auch mit der Live-Quelle funktioniert (zuvor wurden CH/NO über die Live-Quelle nie synchronisiert).- Strukturprüfung in
VatApiEu: Antworten mit weniger als 20 verwertbaren Ländern werden abgelehnt (Schutz gegen degradierte, aber HTTP-200-antwortende API).
Geändert
- Hybrider Datenansatz: Der Standardsatz wird live aus vat-api.eu gezogen (rechtlich kritisch, häufig geändert, zuverlässig); der ermäßigte Satz kommt aus der kuratierten Map. Hintergrund: Länder haben mehrere ermäßigte Sätze (super-reduziert/ermäßigt/Park) ohne maschinenlesbaren Typ, und vat-api.eu enthält bei ermäßigten Sätzen vereinzelt Fehler (z. B. FI 13,5 % statt 14 %).
- Aktualisierte statische Fallback-Daten (Stand Juni 2026): Estland Standard 22 % → 24 % (seit 2025-07-01); Rumänien Standard 19 % → 21 % und ermäßigt 9 % → 11 % (seit 2025-08-01); Slowakei ermäßigt 10 % → 5 % (alter 10 %-Satz 2025 abgeschafft).
Model/Config/Source/ApiSource.php— Dropdown: „VAT-API.eu (Empfohlen)" als erste Option;euvatratesals „(Veraltet – Daten von 2016)" gekennzeichnet.etc/csp_whitelist.xml— CSP-Whitelist-Host voneuvatrates.comaufvat-api.euumgestellt.
Hinweis zum Update
- Bestehende Installationen mit gespeicherter Quelle
euvatrateswechseln automatisch auf vat-api.eu (die alte Quelle ist nicht mehr wählbar/verfügbar). Kein Setup-Upgrade nötig — nach Composer-Update genügtbin/magento setup:di:compileundcache:flush.
[1.3.1] - 2026-06-09
Behoben
- Magento 2.4.7 / 2.4.8 Kompatibilität: Composer-Constraint
magento/module-email: ^101.2auf^101.1korrigiert. Version101.2existiert in keinem Magento-2.4.x-Release (höchste ist101.1.x), wodurchcomposer require storetown/module-tax-syncmit „could not be resolved" fehlschlug. Betraf alle bisherigen Releases (1.1.0–1.3.0).
[1.3.0] - 2026-05-14
Geändert
- Erstes öffentliches Open-Source-Release auf GitHub unter MIT-Lizenz
- Distribution via Packagist —
composer require storetown/module-tax-syncohne Custom-Repository möglich
Entfernt (für OSS-Release)
stm/module-licenseDependency auscomposer.json— Extension läuft jetzt ohne Lizenz-Check, voll funktional für alle UserSTM_License-Sequence ausetc/module.xmlSTM\License\Model\ExtensionRegistry-Block ausetc/di.xmlLicenseServiceInterface-Import + Constructor-Injection + License-Check inModel/TaxSyncService.php
Hinzugefügt (OSS-Hygiene)
.github/ISSUE_TEMPLATE/bug_report.md— strukturiertes Bug-Report-Template.github/ISSUE_TEMPLATE/feature_request.md— Feature-Request-TemplateSECURITY.md— Security-Policy mit responsible-disclosure-WorkflowCONTRIBUTING.md— Contributor-Guide (PSR-12, Magento-2-Standards, Conventional Commits)composer.json—support.issues,support.source,support.docsaktualisiert auf den neuen GitHub-Repo- README erweitert um Cross-Linking zu den 4 kommerziellen Schwester-Extensions
[1.2.0] - 2026-03-09
Hinzugefügt
- STM License Integration — Lizenzprüfung über
stm/module-licenseModul di.xml— Extension-Registrierung beiSTM\License\Model\ExtensionRegistry(Key:storetown_taxsync)
Geändert
composer.json— Dependencystm/module-license: ^1.0hinzugefügtmodule.xml—STM_Licensein Modul-Sequence aufgenommen
[1.1.0] - 2026-03-07
Behoben
- CRITICAL: Cron-Job lief nie — Backend Model
CronFrequencyerstellt, das Frequenz-Auswahl in Cron-Expression schreibt - HIGH:
ApiSourcePoolkonnte bei fehlendem Fallback crashen — Defensive Prüfung mitLocalizedExceptionhinzugefügt - HIGH:
TaxSyncService::getLastSyncDate()versuchte auf geschütztesscopeConfig-Property zuzugreifen — Methode inConfigHelper verlagert - HIGH: Generische Exceptions durch
LocalizedExceptionersetzt - HIGH: Concurrency-Schutz via
LockManagerInterfaceim Sync-Prozess - HIGH: Fehlendes
lockManager-Argument indi.xmlergänzt - HIGH:
<e>Tag inStatusCommanddurch<error>ersetzt (Symfony Console 6.x Kompatibilität) - MEDIUM: Modul-Versionanzeige in Info-Block nutzt jetzt
PackageInfostatt veraltetessetup_version - MEDIUM: Hardcoded German Strings in
NotificationServicedurch__()Aufrufe ersetzt (i18n-fähig)
Hinzugefügt
Model/Config/Backend/CronFrequency.php— Backend Model für Cron-Frequenz-Konfigurationview/adminhtml/email/sync_error.html— Fehler-Benachrichtigungs-E-Mail-Templateetc/csp_whitelist.xml— CSP-Whitelist für euvatrates.com API-Aufrufei18n/de_DE.csv— Deutsche Übersetzungen (34 Strings)phpunit.xml.dist— PHPUnit Konfiguration- 9 PHPUnit Test-Dateien mit 82 Tests und 471 Assertions
- Copyright-Header auf allen PHP-Dateien
- PHPCS Magento2 Coding Standard — vollständig compliant (0 Errors, 0 Warnings)
Geändert
module.xml—setup_versionentfernt (Magento 2.4+ Best Practice), Sequence-Dependencies erweitertcomposer.json—magento/module-cronDependency hinzugefügt, Version-Constraints auf^(Caret) umgestelltconfig.xml— Standard Cron-Schedule0 3 * * 1(Montag 3:00 Uhr) als Default hinzugefügt- Code-Qualität: Alle Dateien auf PHPCS Magento2 Standard geprüft und angepasst
[1.0.3] - 2026-01-22
Hinzugefügt
NotificationService— Zentrale Klasse für E-Mail- und Admin-Benachrichtigungen- E-Mail-Template
rate_changed.htmlfür Steuersatz-Änderungen - Admin-Notification über
Magento\AdminNotification\Model\Inboxbei Änderungen - Konfigurationsoptionen für Benachrichtigungen unter
tax_sync/notifications/ email_templates.xml— Template-Registrierung für Transaktions-E-Mails
Geändert
TaxSyncService::sync()ruft jetztNotificationServicenach erfolgreicher Synchronisierung aufdi.xml—NotificationServiceals Dependency fürTaxSyncServiceergänzt- Admin-Konfiguration um Benachrichtigungs-Tab erweitert (
system.xml)
Behoben
- Rate-Vergleich nutzt jetzt Toleranz
abs($old - $new) > 0.001statt striktem!=(Float-Precision) - Sync-Ergebnis enthält jetzt detailliertes
changes-Array mit altem und neuem Steuersatz
[1.0.2] - 2025-12-12
Hinzugefügt
Block/Adminhtml/System/Config/SyncButton.php— Manueller Sync-Button in Admin-KonfigurationBlock/Adminhtml/System/Config/LastSync.php— Anzeige des letzten Sync-ZeitpunktsBlock/Adminhtml/System/Config/Info.php— Modul-Infoanzeige mit Version und StatusController/Adminhtml/Sync/Run.php— AJAX-Controller für manuellen Sync aus Adminetc/adminhtml/routes.xml— Admin-Routen für Sync-Controlleretc/acl.xml— ACL-RessourceStoretown_TaxSync::configfür Zugriffskontrolle- Admin-Konfiguration um Sync-Tab mit Buttons und Status-Anzeige erweitert
Geändert
system.xml— Komplette Überarbeitung der Admin-Oberfläche mit drei Tabs (Allgemein, Tax Rules, Sync)ConfigHelper umgetLastSyncDate()erweitertTaxSyncService::sync()speichert jetzt Timestamp des letzten Syncs in Core-Config
Behoben
- Country-Filter: API-Daten werden jetzt korrekt gegen konfigurierte Länderliste gefiltert
- Reduced-Rate wird nur importiert wenn > 0 (verhindert leere 0%-Steuersätze)
[1.0.1] - 2025-11-18
Hinzugefügt
Model/Api/VatComply.php— Alternative API-Quelle (vatcomply.com) als zweite DatenquelleModel/ApiSourcePool.php— Source-Pool-Pattern für flexible API-Quellen-VerwaltungApi/TaxRateSourceInterface.php— Interface für austauschbare API-QuellenModel/Config/Source/ApiSource.php— Dropdown für API-Quellen-Auswahl in Admin- Konfigurationsoption
tax_sync/general/api_sourcezur Auswahl der Datenquelle - Automatischer Fallback: Wenn primäre API nicht erreichbar, wird nächste Quelle probiert
StatusCommand— CLI-Befehltax:sync:statuszeigt aktuellen Sync-Status und KonfigurationLogger/Logger.phpundLogger/Handler.php— Dediziertes Logging nachvar/log/tax_sync.log
Geändert
TaxSyncServicerefactored — API-Aufruf überApiSourcePoolstatt direktem HTTP-Clientdi.xml— Source-Pool mit konfigurierbarer Quellen-Listesystem.xml— API-Quellen-Auswahl im Admin hinzugefügt- Logging von
Psr\Log\LoggerInterfaceauf dediziertenTaxSync\Logger\Loggerumgestellt
Behoben
- Tax Rate Code-Format vereinheitlicht:
{COUNTRY}-Standard/{COUNTRY}-Reduced(vorher inkonsistent) - Fehlerbehandlung bei API-Timeouts: Exception wird geloggt statt Abbruch
[1.0.0] - 2025-02-03
Hinzugefügt
- Erster Release
- Import aller 27 EU-Länder Steuersätze (Standard + ermäßigt)
- Optionaler Import von CH, GB, NO (Nicht-EU-Länder)
- Automatische Tax Rule Erstellung pro Land mit konfigurierbaren Customer/Product Tax Classes
- Cron-basierte Synchronisierung (täglich/wöchentlich/monatlich wählbar)
- CLI-Befehl
tax:sync:runfür manuellen Sync mit--forceOption - EU VAT Rates API (euvatrates.com) als primäre Datenquelle
Model/Api/Fallback.php— Statische Fallback-Daten (Stand Januar 2025)- Vollständige Admin-Konfiguration unter Stores > Configuration > Storetown > Tax Sync
Helper/Config.php— Zentrale Konfigurationsverwaltung mit allen Getter-MethodenModel/TaxSyncService.php— Kern-Service für Steuersatz-SynchronisierungCron/SyncTaxRates.php— Cron-Handler für automatische AusführungModel/Config/Source/Frequency.php— Frequenz-Options für Admin-Dropdown
Datenquellen
- Primär: EU VAT Rates API (euvatrates.com)
- Fallback: Statische Daten, manuell gepflegt
Unterstützte Magento-Versionen
- Magento 2.4.x
- PHP 8.1+
Support
Bei Fragen oder Problemen kontaktieren Sie uns:
| Version | Stability | QA Status | Compatibility | Released |
|---|---|---|---|---|
| v1.5.1 | stable | Not tested | Not yet tested Details | 2026-08-23 11:57:31 |
| v1.5.0 | stable | Not tested | Not yet tested Details | 2026-08-23 11:54:50 |
| 1.4.2 | stable | Fail | Magento 2.4.7-2.4.9 Details | 2026-06-17 13:10:12 |
| 1.4.1 | stable | Not tested | Not yet tested Details | 2026-06-16 11:01:00 |
| 1.4.0 | stable | Not tested | Not yet tested Details | 2026-06-16 09:51:59 |
| 1.3.1 | stable | Not tested | Not yet tested Details | 2026-06-09 15:48:40 |
| 1.3.0 | stable | Not tested | Not yet tested Details | 2026-05-14 15:33:57 |
Requires 9
| Package | Constraint |
|---|---|
| magento/framework | ^103.0 |
| magento/module-admin-notification | ^100.4 |
| magento/module-backend | ^102.0 |
| magento/module-config | ^101.2 |
| magento/module-cron | ^100.4 |
| magento/module-email | ^101.1 |
| magento/module-store | ^101.1 |
| magento/module-tax | ^100.4 |
| php | ^8.1 |
No QA results yet
QA pipelines haven't run for this version. Compatibility and quality results appear here once the vendor publishes a tagged release that gets ingested.
More from Storetown Media
View vendorMagento 2 surcharge module with category- and product-level rules, named reusable rules with per-product binding and bulk-assign from the catalog grid, tier and customer-group pricing, conditional caps (min/max/free-threshold) and country-based shipping restriction.
Adds file attachments (PDF, Office, images, videos, YouTube) to products with frontend download and inline preview (PDF, images, txt/csv, Word, Excel, PowerPoint), mass assign, CSV import, auto-assign rules and category grouping for Adobe Commerce / Magento Open Source.
One Page Checkout for Magento 2 — All checkout steps on a single page with AJAX validation, real-time shipping calculation, and responsive design. Compatible with Luma, Blank, and Hyvä themes.
B2B customer registration with admin approval workflow for Magento 2 / Adobe Commerce. Adds a dedicated B2B signup form with company data, VAT ID, and reCAPTCHA, holds new accounts in a pending state until a store admin reviews them, and triggers separate transactional emails for the customer and the shop owner.
Turn an existing module into recurring revenue.
If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.