<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Duty27 blog</title>
    <link>https://duty27.com/blog</link>
    <description>EU VAT for developers: rates, rules and data.</description>
    <language>en</language>
    <item>
      <title>The EU's official VAT rate database got history wrong. Here's how we caught it.</title>
      <link>https://duty27.com/blog/eu-vat-rate-database-tedb-errors</link>
      <guid isPermaLink="true">https://duty27.com/blog/eu-vat-rate-database-tedb-errors</guid>
      <pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate>
      <description>TEDB, the European Commission's VAT rate database, returned wrong historical rates for Greece and Germany, and later changed one answer without notice. What we found and how we check.</description>
      <content:encoded><![CDATA[<p>If you need EU VAT rates in code, you will probably end up at TEDB, the European Commission&#39;s Taxes in Europe Database. It is free, it is official, and it has a SOAP API that answers one useful question: what was the VAT rate in this country on this date?</p>
<p>We built Duty27&#39;s rate history on it. Then we checked its answers against the law, and some of them were wrong.</p>
<h2>How a wrong rate hides</h2>
<p>We queried TEDB for every EU country four times a year, back to 2016, and flagged every place where the rate changed between two checkpoints. Each flagged change was then checked against the national law that made it.</p>
<p>That catches a change TEDB reports. It cannot catch one TEDB doesn&#39;t report. If TEDB returns the same wrong number before, during and after a real change, there is nothing to flag. The data looks perfectly calm.</p>
<h2>Two standard-rate errors</h2>
<table>
<thead>
<tr>
<th>Country</th>
<th>Date</th>
<th>Our August 2026 import</th>
<th>TEDB on 10 October 2026</th>
<th>Actual rate</th>
</tr>
</thead>
<tbody><tr>
<td>Greece</td>
<td>1 March 2016</td>
<td>24%</td>
<td>24%</td>
<td>23%</td>
</tr>
<tr>
<td>Germany</td>
<td>1 July 2020</td>
<td>19%</td>
<td>16%</td>
<td>16%</td>
</tr>
<tr>
<td>Germany</td>
<td>1 October 2020</td>
<td>19%</td>
<td>16%</td>
<td>16%</td>
</tr>
</tbody></table>
<p><strong>Greece</strong> raised its standard rate from 23% to 24% on 1 June 2016 (<a href="https://www.e-nomothesia.gr/kat-oikonomia/nomos-4389-2016-phek-94a-27-5-2016.html">Law 4389/2016, article 52</a>). TEDB reports 24% for the months before that too, and still did when we checked again on 10 October 2026. Any invoice, refund or correction for the first five months of 2016 that trusts TEDB uses the wrong rate.</p>
<p><strong>Germany</strong> cut its standard rate from 19% to 16% for the second half of 2020 (<a href="https://dejure.org/BGBl/2020/BGBl._I_S._1512">Zweites Corona-Steuerhilfegesetz</a>). Our August 2026 import from TEDB recorded 19% for both 1 July and 1 October 2020, so the cut was invisible to our checkpoints. When we queried the same dates again in October, TEDB returned 16%. Something changed in between. We didn&#39;t keep TEDB&#39;s raw August responses, so we can&#39;t show exactly what it sent then, and we saw no notice of a correction.</p>
<p>Germany has a second trap that is still there today. For those dates TEDB returns two entries marked &quot;standard&quot;: an import VAT entry at 19% and the real 16%. Code that takes the first entry it finds gets 19%.</p>
<p>We found both errors by comparing against the Commission&#39;s own historical &quot;VAT rates applied in the Member States&quot; document, a separately compiled table that covers every member state up to 2020.</p>
<h2>The reduced rates were worse</h2>
<p>Reduced rates (the lower rates for things like e-books, newspapers and magazines) were noisier. These findings are from our August 2026 checks:</p>
<ul>
<li><strong>Austria&#39;s e-book rate came back as 10% and 20% at the same time</strong> for every checkpoint in 2018 and 2019.</li>
<li><strong>A placeholder start date.</strong> Several countries&#39; digital publication rates were dated 1 January 2018. In reality they took effect at different points, mostly in 2019 after the EU allowed reduced rates on electronic publications. The 2018 date was never a real legal event anywhere it appeared.</li>
<li><strong>Spain was missing entirely.</strong> Spain cut VAT on electronic books, newspapers and magazines to 4% on 23 April 2020 (Real Decreto-ley 15/2020). TEDB had no data for those categories at all.</li>
</ul>
<p>Of the 34 country and category combinations we investigated, 21 needed a correction: a wrong rate, a wrong date, or a rate that never existed.</p>
<h2>Why it matters</h2>
<p>VAT is due at the rate that applied on the date of the sale. A current-rates table can&#39;t answer that, and a historical table is only as good as its history. The dates that need it most are the old ones:</p>
<ul>
<li>a refund or credit note for a sale made before a rate change,</li>
<li>a correction to an OSS return from an earlier quarter,</li>
<li>a tax audit asking you to show that the rate you charged was right on the day.</li>
</ul>
<h2>What we do now</h2>
<ul>
<li><strong>Every rate change cites its source.</strong> Each change in Duty27&#39;s data points to the law or the tax authority statement we actually read, and the build fails if a change has no source. You can see them on the <a href="https://duty27.com/vat-rates/history">EU VAT rate history page</a>.</li>
<li><strong>TEDB is a starting point, not the answer.</strong> We use it to find candidate changes, then confirm each one against the law or another independent source.</li>
<li><strong>The data is free to use.</strong> The full standard-rate history since 2016 is available as <a href="https://duty27.com/data/eu-standard-vat-rates.csv">CSV</a> and <a href="https://duty27.com/data/eu-standard-vat-rates.json">JSON</a>, with a source for every change.</li>
</ul>
<h2>If you use TEDB yourself</h2>
<ol>
<li><strong>Treat it as a lead, not a source.</strong> The Commission itself describes the database as information supplied by the member states, not a reference for legal purposes.</li>
<li><strong>Check for conflicting values on the same date</strong>, not only for changes between dates. That is how the Austria and Germany problems show up.</li>
<li><strong>Keep the raw responses.</strong> We didn&#39;t save TEDB&#39;s raw August answers, so for Germany we can show what our import recorded, but not exactly what TEDB sent. Store them, and you can prove what the source said on the day.</li>
<li><strong>Cite every change</strong> to the law that made it. When a source disagrees with the law, the law wins.</li>
</ol>
]]></content:encoded>
      <category>vat</category>
      <category>eu</category>
      <category>data</category>
      <category>api</category>
    </item>
    <item>
      <title>Selling e-books and templates? They're taxed at different VAT rates</title>
      <link>https://duty27.com/blog/ebooks-and-templates-different-vat-rates</link>
      <guid isPermaLink="true">https://duty27.com/blog/ebooks-and-templates-different-vat-rates</guid>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <description>In most EU countries and the UK, an e-book gets a reduced VAT rate and a template doesn't. Why, what counts as an e-book, and what that means for your checkout.</description>
      <content:encoded><![CDATA[<p>Plenty of digital sellers have a store that looks like this: a couple of e-books, a pack of Notion templates, a set of spreadsheets, maybe a course. To a payment processor it&#39;s all &quot;digital products&quot;. To VAT law it isn&#39;t.</p>
<h2>E-books get reduced rates. Templates don&#39;t.</h2>
<p>Since 2018, EU countries have been allowed to apply reduced VAT rates to electronic publications: books, newspapers and periodicals supplied electronically. Most of them do. The UK went further and zero-rated e-publications from 1 May 2020.</p>
<p>Templates, spreadsheets, stock files, software and most other downloads are &quot;electronically supplied services&quot;. They get the standard rate.</p>
<table>
<thead>
<tr>
<th>Country</th>
<th>E-book</th>
<th>Template or other download</th>
</tr>
</thead>
<tbody><tr>
<td>Germany</td>
<td>7%</td>
<td>19%</td>
</tr>
<tr>
<td>France</td>
<td>5.5%</td>
<td>20%</td>
</tr>
<tr>
<td>Italy</td>
<td>4%</td>
<td>22%</td>
</tr>
<tr>
<td>Spain</td>
<td>4%</td>
<td>21%</td>
</tr>
<tr>
<td>Netherlands</td>
<td>9%</td>
<td>21%</td>
</tr>
<tr>
<td>Ireland</td>
<td>0%</td>
<td>23%</td>
</tr>
<tr>
<td>United Kingdom</td>
<td>0%</td>
<td>20%</td>
</tr>
</tbody></table>
<p>So a checkout that applies one rate per country to every product is wrong for at least one of them. With the standard rate everywhere, your e-book buyers are overcharged. With the e-book rate everywhere, you under-collect VAT on templates and owe the difference yourself.</p>
<h2>What counts as an e-book</h2>
<p>The reduced rate is for publications. Roughly: something that would be a book, newspaper or magazine if it were printed.</p>
<ul>
<li><strong>Usually an e-book:</strong> a novel, a guide or handbook, a workbook, a cookbook, a PDF version of a printed book.</li>
<li><strong>Usually not:</strong> templates and planners meant to be filled in or reused, spreadsheets, stock photos, presets, fonts, software.</li>
<li><strong>Excluded explicitly:</strong> publications that are wholly or mainly advertising, or mainly video or music. Both the EU rule and the UK&#39;s say so.</li>
</ul>
<p>The edges are blurry, and countries draw them differently. A &quot;planner&quot; that is mostly blank pages is a template, not a book. A guide with a few worksheets at the back is still a guide. When a product is genuinely borderline, ask an accountant before picking the lower rate.</p>
<h2>Bundles</h2>
<p>A bundle of an e-book and templates sold for one price is a common headache. Depending on the country, a bundle may need splitting into its parts at their own rates, or may be taxed as one product. If bundles are a big part of your sales, get advice for your main markets rather than guessing.</p>
<h2>What to do in your store</h2>
<ol>
<li><strong>Tag each product</strong> with its VAT category: e-book (publication) or standard.</li>
<li><strong>Make your tax calculation use the tag</strong>, per country, on the date of the sale. Reduced rates change too, and not always at the same time as the standard rate.</li>
<li><strong>Check your merchant of record&#39;s settings</strong> if you use one: whether you can mark a product as an e-book, and which rate it uses if you don&#39;t.</li>
<li><strong>Keep the reasoning</strong> for any borderline product, in case a tax authority asks later.</li>
</ol>
<hr>
<p>Duty27&#39;s API (EU countries) takes a <code>category</code> field (<code>EBOOK</code>, <code>NEWSPAPER</code> or <code>PERIODICAL</code>) and returns the right rate for that country on that date, falling back to the standard rate where no reduced rate applies. See the <a href="https://duty27.com/docs">docs</a>, or <a href="https://duty27.com/vat-rates">EU VAT rates by country</a>.</p>
]]></content:encoded>
      <category>vat</category>
      <category>eu</category>
      <category>uk</category>
      <category>ebooks</category>
      <category>digital-products</category>
    </item>
    <item>
      <title>Why price × standard rate is the wrong way to calculate EU VAT</title>
      <link>https://duty27.com/blog/price-times-standard-rate-is-wrong</link>
      <guid isPermaLink="true">https://duty27.com/blog/price-times-standard-rate-is-wrong</guid>
      <pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate>
      <description>Multiplying the price by the country's standard rate is how most VAT code starts. Five ways it goes wrong: dates, product categories, business customers, where you are based, and rounding.</description>
      <content:encoded><![CDATA[<p>Most EU VAT code starts like this:</p>
<pre><code class="language-js">const vat = price * (standardRate[country] / 100);
const total = price + vat;
</code></pre>
<p>It works for the first sale and the demo. It is also wrong in at least five ways that show up later, usually at the worst possible time: during a refund, a correction or an audit.</p>
<h2>1. Rates change, and VAT uses the rate on the date of the sale</h2>
<p>A table of today&#39;s rates answers the wrong question. VAT is due at the rate that applied when the sale happened.</p>
<p>Rates change more often than people expect. Germany cut its standard rate from 19% to 16% for the second half of 2020. Finland went from 24% to 25.5% in September 2024. Each change means:</p>
<ul>
<li>a refund for a sale before the change must use the old rate,</li>
<li>a sale made in December and invoiced in January can straddle a change,</li>
<li>a correction to an earlier quarter&#39;s return uses that quarter&#39;s rates.</li>
</ul>
<p>So the lookup needs a date: <code>rate(country, date)</code>, not <code>rate(country)</code>. Historical rate data needs checking too: even official sources get past rates wrong.</p>
<h2>2. Not everything uses the standard rate</h2>
<p>EU countries may apply reduced rates to some products. For digital sellers the big one is electronic publications: e-books, e-newspapers and e-magazines.</p>
<table>
<thead>
<tr>
<th>Country</th>
<th>Standard rate</th>
<th>E-books</th>
</tr>
</thead>
<tbody><tr>
<td>Germany</td>
<td>19%</td>
<td>7%</td>
</tr>
<tr>
<td>France</td>
<td>20%</td>
<td>5.5%</td>
</tr>
<tr>
<td>Italy</td>
<td>22%</td>
<td>4%</td>
</tr>
<tr>
<td>Spain</td>
<td>21%</td>
<td>4%</td>
</tr>
<tr>
<td>Netherlands</td>
<td>21%</td>
<td>9%</td>
</tr>
<tr>
<td>Ireland</td>
<td>23%</td>
<td>0%</td>
</tr>
</tbody></table>
<p>If you sell e-books and multiply by the standard rate, you overcharge your customers. If you sell e-books and templates and use one rate for both, one of them is wrong.</p>
<h2>3. Business customers usually pay no VAT at all</h2>
<p>When the customer is a business with a valid VAT number in another EU country, you normally don&#39;t charge VAT. The customer accounts for it under the reverse charge, and your invoice says so.</p>
<p>That means the calculation depends on who the customer is, and the VAT number needs checking in VIES (the EU&#39;s VAT number lookup) before you rely on it. A number the customer typed into a form proves nothing until it&#39;s checked.</p>
<h2>4. Where you are based changes the answer</h2>
<p>For a business established in one EU country, cross-border sales of digital services to consumers below €10,000 a year can be taxed at the seller&#39;s own rate. Above it, the customer&#39;s rate applies. The test also looks at the previous year.</p>
<p>For a business outside the EU, there&#39;s no threshold: the customer&#39;s rate applies from the first sale.</p>
<p>So <code>standardRate[customerCountry]</code> can be wrong for a small EU seller, and right for a US one, for the same sale.</p>
<h2>5. Floating-point money and rounding</h2>
<pre><code class="language-js">0.1 + 0.2 === 0.30000000000000004 // true
</code></pre>
<p>Money in binary floating point drifts, and VAT amounts need rounding to the cent at a defined point. Rounding each invoice line and then adding gives a different total from adding and then rounding. Use integer cents or a decimal type, and pick one rounding rule on purpose.</p>
<h2>What the calculation actually needs</h2>
<p>Put together, a correct VAT calculation needs at least:</p>
<ul>
<li>the customer&#39;s <strong>country</strong>,</li>
<li>the <strong>date</strong> of the sale,</li>
<li>the <strong>product category</strong> (standard, or e-book and similar),</li>
<li>whether the customer is a <strong>business</strong>, and if so a <strong>checked VAT number</strong>,</li>
<li>where <strong>you</strong> are established, and for an EU seller, your cross-border sales so far this year and last year,</li>
<li><strong>decimal arithmetic</strong> with an explicit rounding rule.</li>
</ul>
<p>That is a lot more than a multiplication. It&#39;s the reason Duty27 exists. A request looks like this:</p>
<pre><code class="language-json">{
  &quot;country_code&quot;: &quot;DE&quot;,
  &quot;date&quot;: &quot;2020-08-01&quot;,
  &quot;amount&quot;: &quot;100.00&quot;,
  &quot;amount_type&quot;: &quot;NET&quot;,
  &quot;b2b&quot;: false,
  &quot;category&quot;: &quot;EBOOK&quot;
}
</code></pre>
<p>The response gives you the rate that applied on that date (<code>rate_percent</code>), the net, tax and gross amounts as decimal strings, and whether the reverse charge applies. You can <a href="https://duty27.com/">try a calculation on the homepage</a> without signing up, and the <a href="https://duty27.com/docs">API docs</a> cover the rest, including business customers and the €10,000 threshold.</p>
]]></content:encoded>
      <category>vat</category>
      <category>eu</category>
      <category>api</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
