Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Taxes & Currencies

How tax classes, tax rates and your base currency work together – from your first German VAT rule to automatic exchange rate imports.

KAPITEL 4 Unterkapitel

Tax Classes and Tax Rules

<div class="prose prose-hyva max-w-none"><p>How product, customer and shipping tax classes combine into a tax rule, and how to sensibly preset your default classes.</p><p>Magento's tax calculation rests on three building blocks that only produce an actual tax rate once combined: a <strong>tax class</strong> for the product, a <strong>tax class</strong> for the customer, and a <strong>tax rate</strong> for a geographic zone. A <strong>tax rule</strong> under <em>Stores &gt; Taxes &gt; Tax Rules</em> ties all three together into an actual calculation instruction.</p> <h3>Product tax classes</h3> <p>Every product carries the <strong>Tax Class</strong> attribute in the pricing area of the product edit form. Out of the box, Magento ships with "Taxable Goods" and "None". Create your own classes (e.g. a "Reduced Rate" class for books or groceries in Germany) under <em>Stores &gt; Settings &gt; Tax Rules</em>, or directly from the product form via the small "+" link next to the dropdown – handy if your catalog mixes 19% and 7% items.</p> <h3>Customer tax classes</h3> <p>Similarly, every customer group (see the "Customer Groups" chapter) carries a <strong>Customer Tax Class</strong>, usually "Retail Customer". For B2B stores this is the lever that lets you automatically move business customers into a tax-exempt class once their VAT ID has been validated (see the next subchapter).</p> <h3>Assembling tax rules</h3> <p>A tax rule combines one or more product tax classes, one or more customer tax classes and one or more previously created tax rates (see the next subchapter) into a named rule with a priority and a calculation order. <strong>Priority</strong> controls whether multiple simultaneously matching rules are added together or calculated in a cascading fashion (relevant for combined state and municipal taxes in the US, for example – for the standard German case, a single rule with priority 0 is enough).</p> <h3>Default classes save time</h3> <p>Under <em>Stores &gt; Configuration &gt; Sales &gt; Tax</em>, group <strong>Tax Classes</strong>, you set which class gets assigned automatically to new products and shipping line items. This saves you from manually setting the tax class on every single new product – a real time saver once your catalog passes a hundred items.</p> <img loading="lazy" src="{{media url=wysiwyg/handbuch/1kapitel/taxclasses4kategorie.png}}" alt=" TaxClasses" /> <p><strong>Practical tip:</strong> keep the number of tax classes low. Every additional product/customer class combination multiplies the number of rules you have to maintain – for most German stores, two product classes (standard 19%, reduced 7%) plus one or two customer classes (retail, tax-exempt B2B) are enough.</p></div>
Weiterlesen

Tax Zones and Rates

<div class="prose prose-hyva max-w-none"><p>How to create and maintain individual tax rates, and import them via CSV – from a flat German 19% rate to country-specific ZIP code ranges.</p><p>Under <em>Stores &gt; Taxes &gt; Tax Zones and Rates</em> you maintain the actual percentages a tax rule applies later on – independent of product and customer classes.</p> <h3>Creating a new tax rate</h3> <p>The <strong>Add New Tax Rate</strong> button opens a form with the fields <strong>Tax Identifier</strong> (an internal name, e.g. "DE-19"), <strong>Country</strong>, an optional <strong>State</strong> (for countries with states, like the US), <strong>Zip/Post Code</strong> (an asterisk <code>*</code> acts as a wildcard for "all"), and <strong>Rate Percent</strong>. For Germany, one rate with country "Germany", ZIP <code>*</code> and rate <code>19.0000</code> is usually enough – add a second one the same way for the reduced <code>7.0000</code> rate.</p> <img Steuerzonen src="{{media url=wysiwyg/handbuch/1kapitel/Steuerzonen4kategorie.png}}" alt="Steuerzonen" /> <h3>ZIP ranges for regional differences</h3> <p>For countries with regionally different tax rates (US states, and in some cases Canada), the ZIP/post code field supports ranges (<code>Range From</code>/<code>Range To</code>) instead of a single value – enable this via the <strong>Zip/Post is Range</strong> checkbox right in the form.</p> <h3>Editing an existing rate</h3> <p>Clicking a row in the tax rate grid opens the same form in edit mode. Important: changing a rate that's already been used in orders only affects future calculations – completed orders keep the amount that was valid at the time of the order, Magento never recalculates retroactively.</p> <h3>Import/export via CSV</h3> <p>The <strong>Import Tax Rates</strong>/<strong>Export Tax Rates</strong> buttons at the top of the same page let you maintain many rates at once – useful if you ship to multiple US states and don't want to create every single rate by hand. The CSV columns map exactly to the form fields; exporting a template before your first import saves you formatting mistakes.</p></div>
Weiterlesen

Price Display and VAT ID Validation

<div class="prose prose-hyva max-w-none"><p>Whether prices show gross or net, and how Magento automatically checks via VIES whether a B2B customer qualifies for tax exemption.</p><p>Two practically relevant settings many store owners only miss once they've already gone live: price display and automatic VAT ID validation for EU business customers.</p> <h3>Price display settings</h3> <p>Under <em>Stores &gt; Configuration &gt; Sales &gt; Tax</em>, group <strong>Price Display Settings</strong>, you decide separately for the catalog, cart and invoice whether prices show <strong>Including Tax</strong>, <strong>Excluding Tax</strong>, or <strong>Including and Excluding Tax</strong> (both at once, e.g. "$19.99 incl. VAT, $16.80 net"). For B2C stores in Germany, "Including Tax" across all three levels is a legal requirement (Preisangabenverordnung); B2B stores commonly show net prices with a "plus VAT" note instead.</p> <img loading="lazy"src="{{media url=wysiwyg/handbuch/1kapitel/PriceDisplay4kategorie.png}}" alt="Price Display" /> <h3>Warnings for conflicting settings</h3> <p>Magento automatically shows a yellow warning in the configuration area when the chosen combination of price display and rounding settings could produce visibly different totals between the product page and the cart (e.g. when tax is rounded at line level instead of item level). Don't dismiss this warning – it points to real, customer-confusing rounding differences of a cent or two.</p> <h3>Enabling VAT ID validation</h3> <p>Under <em>Stores &gt; Configuration &gt; Customers &gt; Customer Configuration</em>, group <strong>Create New Account Options</strong>, enable <strong>Enable Automatic Assignment to Customer Group</strong> together with <strong>Validate VAT Number</strong>. Magento then checks the entered VAT ID live against the EU's <strong>VIES</strong> service (VAT Information Exchange System) and automatically assigns the customer to one of three configurable groups: a valid VAT ID in the same country, a valid VAT ID in a different EU country (typically the tax-exempt reverse-charge group), or invalid/non-EU.</p> <img src="{{media url=wysiwyg/handbuch/1kapitel/CreateNew4kategorie.png}}" alt="USt-ID-Validierung" /> <h3>Limits of the automatic check</h3> <p>VIES only checks the <strong>format and registration</strong> of a VAT ID, not whether tax-exempt invoicing is actually justified in a specific case – if the tax office ever asks questions, the burden of proof stays with the merchant. VIES is also occasionally unavailable for short maintenance windows on the EU side; in that case Magento falls back to the manually configured default customer group and re-checks the VAT ID the next time the account is edited.</p></div>
Weiterlesen

Currency Configuration and Exchange Rates

<div class="prose prose-hyva max-w-none"><p>Base currency, display currency and automatic exchange rate imports – and why you should lock in your base currency before going live.</p><p>Magento strictly separates the <strong>base currency</strong> (the one all prices are stored in internally and all metrics are calculated in) from one or more <strong>display currencies</strong> per store view.</p> <h3>Basic configuration</h3> <p>Under <em>Stores &gt; Configuration &gt; General &gt; Currency Setup</em> you set three values: <strong>Base Currency</strong> (the internal accounting currency, see the warning below), <strong>Default Display Currency</strong> (the default display currency for this store view), and <strong>Allowed Currencies</strong> (a multi-select of every currency customers may switch between via a storefront dropdown).</p> <img loading="lazy" src="{{media url=wysiwyg/handbuch/1kapitel/currency4kategorie.png}}" alt="Currency" /> <h3>Why the base currency is a one-way street</h3> <p>Once orders start coming in, changing the base currency is practically off the table: every stored price, discount, tax amount and historical order total exists in that currency, and changing it afterwards would corrupt every metric you have. Lock in your base currency before going live (see also the "Initial Setup After Installation" chapter).</p> <h3>Updating exchange rates</h3> <p>Under <em>Stores &gt; Currency &gt; Currency Rates</em> you maintain the conversion rates between your base currency and every allowed display currency. Two options are available: entering rates manually right in the table, or an automatic import via a configurable rate service (the <strong>Import Service</strong> dropdown at the top of the page, e.g. Webservicex). The <strong>Import</strong> button fetches current rates and fills the table; via a cron job (<em>System &gt; Cron Schedule</em>, see the "Import and Export" chapter) this import can also run automatically on a schedule instead of being triggered manually.</p> <img loading="lazy" src="{{media url=wysiwyg/handbuch/1kapitel/currentrates4kategorie.png}}" alt="Wechselkurseaktualisieren" /> <h3>Customizing currency symbols</h3> <p>Under <em>Stores &gt; Currency &gt; Currency Symbols</em> you can override the default symbol of an enabled currency (e.g. "CHF" instead of the default symbol) – separately per store view, e.g. if your German store uses "€" and your Swiss store uses "CHF".</p> <img loading="lazy" src="{{media url=wysiwyg/handbuch/1kapitel/CurrencySymbols4kategorie.png}}" alt="Währungssymbole" /> <p><strong>Practical tip:</strong> even with only one active currency, it's worth checking <em>Currency Rates</em> right after installation – Magento creates a rate of 1.0000 for the base currency against itself, and an accidentally different value there would silently miscalculate every price, even though only one currency is ever visible on the storefront.</p></div>
Weiterlesen