<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Malbašić</title>
    <description>The latest articles on DEV Community by Daniel Malbašić (@danielmalbasic).</description>
    <link>https://dev.to/danielmalbasic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4106129%2F17fff202-32cf-4a1a-8262-232cdb77e20a.jpg</url>
      <title>DEV Community: Daniel Malbašić</title>
      <link>https://dev.to/danielmalbasic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielmalbasic"/>
    <language>en</language>
    <item>
      <title>The same SaaS subscription is taxed four different ways in the EU</title>
      <dc:creator>Daniel Malbašić</dc:creator>
      <pubDate>Wed, 02 Sep 2026 13:04:21 +0000</pubDate>
      <link>https://dev.to/danielmalbasic/the-same-saas-subscription-is-taxed-four-different-ways-in-the-eu-19p</link>
      <guid>https://dev.to/danielmalbasic/the-same-saas-subscription-is-taxed-four-different-ways-in-the-eu-19p</guid>
      <description>&lt;p&gt;If you sell a software subscription from an EU country, the price on your pricing page is not the price. What you owe depends on who clicked subscribe, where they are, and whether they typed a VAT number into your checkout form.&lt;/p&gt;

&lt;p&gt;The same EUR 49 plan, sold from a Bulgarian company, is taxed in four different ways:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Buyer&lt;/th&gt;
&lt;th&gt;Treatment&lt;/th&gt;
&lt;th&gt;What your invoice says&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Business in another EU state, valid VAT ID&lt;/td&gt;
&lt;td&gt;Reverse charge, you charge nothing&lt;/td&gt;
&lt;td&gt;0%, with a reverse-charge note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consumer in another EU state&lt;/td&gt;
&lt;td&gt;VAT of &lt;strong&gt;their&lt;/strong&gt; country&lt;/td&gt;
&lt;td&gt;their national rate, reported through OSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anyone in Bulgaria&lt;/td&gt;
&lt;td&gt;Bulgarian VAT&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business or consumer outside the EU&lt;/td&gt;
&lt;td&gt;Usually outside EU VAT scope&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four branches, one product. This is not a tax problem that lives in your accountant's spreadsheet. It lives in your checkout.&lt;/p&gt;

&lt;h2&gt;
  
  
  The branch your code gets wrong first
&lt;/h2&gt;

&lt;p&gt;The EU B2B case looks like the easy one, no VAT, move on, but it has a precondition that is easy to skip: the customer's VAT number has to be &lt;strong&gt;valid&lt;/strong&gt;, and you have to have checked it.&lt;/p&gt;

&lt;p&gt;If it is valid, the reverse charge applies and the buyer accounts for the tax in their own country. If it is not valid, or you never checked, you are selling to what the rules treat as a consumer, and you owe VAT in the buyer's country. The difference between those two outcomes is one API call at checkout, and it is not one you can make retroactively when the customer is long gone.&lt;/p&gt;

&lt;p&gt;So the first thing your billing logic needs is not a tax table. It is a validation step, and a stored record of what that validation returned and when.&lt;/p&gt;

&lt;h2&gt;
  
  
  The B2C case is the one that scales badly
&lt;/h2&gt;

&lt;p&gt;Sell to a consumer in another EU country and you charge that country's rate, not yours. A consumer in Hungary pays Hungarian VAT; one in Luxembourg pays Luxembourgish VAT. Your price is the same, your liability is not.&lt;/p&gt;

&lt;p&gt;Without the One Stop Shop scheme, that means registering for VAT in every member state where you have a single consumer. OSS collapses that into one return filed in your own country, and it is the difference between a solvable problem and an unmanageable one.&lt;/p&gt;

&lt;p&gt;The engineering consequence: you need the customer's location established and &lt;strong&gt;stored as evidence&lt;/strong&gt;, not merely inferred at render time. Pick which pieces of evidence you keep, billing address, IP country, card issuer country, and keep them with the transaction, not in a log that rotates out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Non-EU is not automatically nothing
&lt;/h2&gt;

&lt;p&gt;Selling to a business outside the EU generally falls outside EU VAT scope. Selling to a &lt;strong&gt;consumer&lt;/strong&gt; outside the EU is where it stops being simple: many countries tax digital services supplied to their residents under their own rules, and those rules are not yours to ignore because you are elsewhere.&lt;/p&gt;

&lt;p&gt;That is a monitoring obligation rather than a coding one, but it belongs in the same decision tree so that it is a deliberate branch rather than a fallthrough.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like as logic
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;home_country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;home_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    &lt;span class="c1"&gt;# Bulgaria: 20%
&lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;in_eu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;validated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;note&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reverse charge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;rate_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buyer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# report via OSS
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                            &lt;span class="c1"&gt;# outside EU scope, check local rules separately
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four branches, and every one of them has an evidence requirement attached. The code is trivial. The record-keeping is the part that fails audits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deadlines are a systems constraint, not an accounting one
&lt;/h2&gt;

&lt;p&gt;In Bulgaria, VAT returns are monthly and payment is due by the &lt;strong&gt;14th of the following month&lt;/strong&gt;. Records, invoices, the customer's location evidence, VAT number validation results, any adjustments, are kept for &lt;strong&gt;ten years&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ten years is longer than most SaaS billing systems survive without a migration. If your evidence of why you charged 0% to a customer in 2026 lives only in a third-party service you later replace, you have a problem that surfaces years after anyone remembers the decision.&lt;/p&gt;

&lt;p&gt;Export it. Store it with the invoice. Treat it as part of the financial record, not as telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compliance around the rate
&lt;/h2&gt;

&lt;p&gt;The VAT branch above is one obligation among several. If you are running a Bulgarian company rather than only selling into it, the same evidence discipline applies to VIES reporting, monthly bookkeeping, payroll filings and the statutory annual accounts, which are due by 30 June.&lt;/p&gt;

&lt;p&gt;We recorded a walkthrough of what that actually covers, including the ten-year retention rule referenced above:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/VwtX6XS7RB4" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The rate is the least interesting number
&lt;/h2&gt;

&lt;p&gt;Most guides lead with 20%. The rate matters least. What decides your actual liability is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether you validated a VAT number, and whether you kept the result&lt;/li&gt;
&lt;li&gt;whether you can prove where a consumer was&lt;/li&gt;
&lt;li&gt;whether you registered for OSS before you needed it rather than after&lt;/li&gt;
&lt;li&gt;whether your evidence outlives your billing provider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those are tax questions. They are all storage and validation questions, and they are all decided in code long before an accountant sees them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I run a company formation and accounting practice in Bulgaria, so this is the jurisdiction I can write about at article level. The full version, including registration thresholds, OSS mechanics and the official source for each rule, is on our site: &lt;a href="https://www.bulgarian.llc/understanding-saas-vat-in-bulgaria-essential-guide-for-companies/" rel="noopener noreferrer"&gt;VAT for SaaS Companies in Bulgaria&lt;/a&gt;. The rules here derive from the EU VAT Directive as implemented in Bulgaria; specifics differ by member state and change, so check the current position for yours before shipping billing logic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>startup</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
