{"id":987801,"date":"2026-04-08T17:13:52","date_gmt":"2026-04-08T17:13:52","guid":{"rendered":"https:\/\/www.studio2c.ee\/?p=987801"},"modified":"2026-04-10T20:05:38","modified_gmt":"2026-04-10T20:05:38","slug":"the-complete-guide-to-setting-up-stripe-tax-adaptive-pricing-and-invoicing-for-european-indie-saas-founders","status":"publish","type":"post","link":"https:\/\/www.studio2c.ee\/es\/the-complete-guide-to-setting-up-stripe-tax-adaptive-pricing-and-invoicing-for-european-indie-saas-founders\/","title":{"rendered":"Gu\u00eda completa para configurar Stripe Tax, Adaptive Pricing y facturaci\u00f3n para fundadores europeos de SaaS independientes!"},"content":{"rendered":"<div class=\"vgblk-rw-wrapper limit-wrapper\">\n<p class=\"wp-block-paragraph\"><em>Last updated: April 2026<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re an indie hacker, freelancer, or small business owner based in Europe selling SaaS or digital products globally through Stripe, there&#8217;s a good chance your tax setup isn&#8217;t fully compliant. Not because you&#8217;re careless, but because the information you need is scattered across Stripe&#8217;s documentation, your country&#8217;s tax regulations, and dozens of generic articles that never quite address your specific situation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide is based on my own experience configuring Stripe for multiple SaaS products sold from Spain to customers worldwide. While some specifics are Spain-centric, the overall setup \u2014 multi-currency pricing, Adaptive Pricing, Stripe Tax, invoice customization, and payout configuration \u2014 applies to any EU-based seller using Stripe.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Who Is This Guide For?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Freelancers, solo founders, and small businesses based in the EU that sell digital services (SaaS, token packages, subscriptions, online courses, ebooks, etc.) through Stripe, with both domestic and international customers. If you use Stripe Checkout, Payment Links, or Stripe Billing to collect payments, this guide is for you.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 1: Multi-Currency Pricing Setup<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">The Problem With Single-Currency Pricing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When selling SaaS internationally, pricing in USD is the convention: $29, $49, $59. These are psychologically clean price points that work globally. But if you&#8217;re based in the EU, your accounting currency is likely EUR, and charging exclusively in USD creates friction:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Every sale requires a currency conversion for your bookkeeping.<\/li>\n\n\n\n<li>The exchange rate difference between invoice date and payout date creates foreign exchange gains or losses that must be recorded.<\/li>\n\n\n\n<li>Stripe applies a spread (implicit fee) when converting to EUR if your payouts are in euros but charges were in dollars.<\/li>\n\n\n\n<li>Your European customers see prices in a foreign currency, which can reduce conversion rates.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The Solution: Multi-Currency Prices in Stripe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe allows you to define prices in multiple currencies for the same product. You can have a plan that costs $29 USD <strong>and<\/strong> \u20ac27 EUR simultaneously. Each price is fixed and independent \u2014 there&#8217;s no dynamic conversion involved.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step-by-Step Configuration<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Stripe Dashboard \u2192 Products<\/strong> and select the product you want to edit.<\/li>\n\n\n\n<li>In the pricing section, click the three-dot menu (\u22ef) on an existing price, or create a new one with the <strong>+ Add another price<\/strong> button.<\/li>\n\n\n\n<li>When creating or editing a price, you&#8217;ll see an <strong>&#8220;Add another currency&#8221;<\/strong> option. Click it.<\/li>\n\n\n\n<li>Select <strong>EUR<\/strong> as the additional currency and set your desired euro price. Stripe will suggest an equivalent based on the current exchange rate, but you can enter whatever amount you want.<\/li>\n\n\n\n<li>Save your changes.<\/li>\n<\/ol>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"670\" height=\"777\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/stripe-add-a-price-by-currency.jpeg\" alt=\"Stripe: add a price by currency\" class=\"wp-image-987802\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/stripe-add-a-price-by-currency.jpeg 670w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/stripe-add-a-price-by-currency-259x300.jpeg 259w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/stripe-add-a-price-by-currency-10x12.jpeg 10w\" sizes=\"(max-width: 670px) 100vw, 670px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<p class=\"wp-block-paragraph\"><strong>Important:<\/strong> If a price has already been used in a transaction, Stripe won&#8217;t let you add additional currencies to it. In that case, you&#8217;ll need to create a new price with both currencies and update the <code>price_id<\/code> in your code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What Euro Prices to Set?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It depends on your pricing model:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Round psychological prices<\/strong> (subscriptions like $29, $49, $59): Set a clean euro equivalent. For example, \u20ac27, \u20ac45, \u20ac55. The goal is for European customers to see a tidy price.<\/li>\n\n\n\n<li><strong>Cost-based prices<\/strong> (token packages, usage-based): Convert at the current exchange rate and round reasonably. Or better yet, recalculate the cost directly in euros and apply the same margin.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Updating Your Code<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re using Stripe Checkout (common in Replit projects or any web app), your code references a <code>price_id<\/code>. When you create new multi-currency prices, you&#8217;ll get new <code>price_id<\/code> values that need to be updated in your codebase.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Before (single-currency USD price)\nprice_id = \"price_1ABC123...\"\n\n# After (new price with USD + EUR)\nprice_id = \"price_1XYZ789...\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe will automatically select the correct currency based on the customer&#8217;s location when using Checkout.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 2: Enabling Adaptive Pricing<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">What Is Adaptive Pricing?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Adaptive Pricing is a Stripe feature that automatically converts prices to the customer&#8217;s local currency in 150+ countries. You keep your base prices in USD (or EUR), and Stripe shows each buyer the equivalent in their local currency using machine learning to determine the most relevant presentment currency.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How It Works With Manual Multi-Currency Prices<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">They coexist perfectly. Manual prices you&#8217;ve set (e.g., your EUR price) take priority over Adaptive Pricing for those specific currencies. In practice:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A customer in Germany sees the fixed EUR price you defined.<\/li>\n\n\n\n<li>A customer in Japan sees the price automatically converted to JPY by Adaptive Pricing.<\/li>\n\n\n\n<li>A customer in the US sees your base USD price.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The conversion fee (2-4%) applied by Adaptive Pricing is passed to the customer \u2014 they see a slightly adjusted price in their local currency. You receive the amount in your base currency.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Requirements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Adaptive Pricing works with <strong>Checkout Sessions<\/strong>, <strong>Payment Links<\/strong>, and <strong>Hosted Invoice Pages<\/strong>. If you&#8217;re using Stripe Checkout from your application (the most common setup), you&#8217;re covered.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Watch out for this code issue:<\/strong> There&#8217;s a technical detail that can silently block Adaptive Pricing. If your Checkout Session creation code includes the parameter <code>payment_method_types=['card']<\/code>, this forces Stripe to show only card as a payment method and <strong>disables Adaptive Pricing<\/strong> along with local payment methods (iDEAL, SEPA Debit, Bancontact, etc.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix is to remove that parameter entirely:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># &#x274c; Before (blocks Adaptive Pricing)\nsession = stripe.checkout.Session.create(\n    line_items=&#91;{\"price\": price_id, \"quantity\": 1}],\n    mode=\"payment\",\n    payment_method_types=&#91;\"card\"],  # \u2190 Remove this line\n    success_url=\"https:\/\/yourdomain.com\/success\",\n)\n\n# &#x2705; After (Adaptive Pricing enabled)\nsession = stripe.checkout.Session.create(\n    line_items=&#91;{\"price\": price_id, \"quantity\": 1}],\n    mode=\"payment\",\n    success_url=\"https:\/\/yourdomain.com\/success\",\n)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Dashboard Activation<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Settings \u2192 Payments \u2192 Adaptive Pricing<\/strong>.<\/li>\n\n\n\n<li>You&#8217;ll see two sections:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Payment Links and Managed Payments<\/strong>: Always on (can&#8217;t be disabled).<\/li>\n\n\n\n<li><strong>Checkout, Elements, and Hosted Invoice Page<\/strong>: Toggle on &#8220;Enable Adaptive Pricing&#8221;.<\/li>\n<\/ul>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" width=\"858\" height=\"520\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Adaptative-Pricing.jpeg\" alt=\"Stripe: Adaptative Pricing\" class=\"wp-image-987803\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Adaptative-Pricing.jpeg 858w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Adaptative-Pricing-300x182.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Adaptative-Pricing-768x465.jpeg 768w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Adaptative-Pricing-18x12.jpeg 18w\" sizes=\"(max-width: 858px) 100vw, 858px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">How do you know Adaptive Pricing is actually working? Check the details of a payment from an international customer. If they paid in their local currency (e.g., Peruvian soles for a customer in Peru), Adaptive Pricing is active. If they paid in USD, either their currency isn&#8217;t supported for automatic conversion, or something in your code is blocking it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the Dashboard, Checkout payments will show in the Events section: <strong>&#8220;A Checkout Session was completed&#8221;<\/strong>. And in the Logs tab you&#8217;ll see <code>POST \/v1\/checkout\/sessions<\/code>.<\/p>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" width=\"729\" height=\"644\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Checkout-session-completed.jpeg\" alt=\"Stripe: Checkout Session Completed\" class=\"wp-image-987804\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Checkout-session-completed.jpeg 729w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Checkout-session-completed-300x265.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Checkout-session-completed-14x12.jpeg 14w\" sizes=\"(max-width: 729px) 100vw, 729px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 3: Configuring Stripe Tax<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most critical part, and the one most European indie founders get wrong \u2014 or skip entirely.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What Stripe Tax Does<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe Tax automatically calculates and applies the correct VAT on each transaction based on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Your business location (e.g., Spain, Germany, France).<\/li>\n\n\n\n<li>Your customer&#8217;s location (determined by billing address or IP).<\/li>\n\n\n\n<li>Whether your customer is a business (B2B) or individual (B2C).<\/li>\n\n\n\n<li>The type of product you sell (digital services, in our case).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The VAT Rules You Need to Know<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before configuring anything, it&#8217;s essential to understand the four tax scenarios that affect an EU-based seller of digital services:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario 1 \u2014 Domestic customer (same country as you):<\/strong><br>Standard VAT of your country applies (e.g., 21% in Spain, 19% in Germany, 20% in France). Declare in your regular quarterly VAT return.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario 2 \u2014 Business customer in another EU country (B2B intra-community):<\/strong><br>Invoice exempt from VAT (0%). The reverse charge mechanism applies: your customer self-assesses the VAT in their country. Requirements: the customer must have a valid VAT ID verifiable through VIES, and you must be registered for intra-community operations. Declared in the recapitulative statement (Model 349 in Spain, EC Sales List in other countries).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario 3 \u2014 Individual customer in another EU country (B2C intra-community):<\/strong><br>If your annual B2C sales to individual consumers across the EU don&#8217;t exceed \u20ac10,000, you can apply your domestic VAT rate. If you exceed that threshold, you must apply the VAT rate of the customer&#8217;s country and declare through the One-Stop Shop (OSS) system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario 4 \u2014 Customer outside the EU (anyone):<\/strong><br>Transaction not subject to VAT. Doesn&#8217;t matter if the customer is a business or individual. Invoice without VAT.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step-by-Step Configuration<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. Navigate to Settings \u2192 Tax<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In the Stripe Dashboard, go to <strong>Settings \u2192 Tax<\/strong>. You&#8217;ll see tabs for Business information, Integrations, Thresholds, and Advanced options.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Business Information<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Head office<\/strong>: Must be set to your country (e.g., <strong>Spain<\/strong>). Edit if needed.<\/li>\n\n\n\n<li><strong>Preset tax category<\/strong>: Select <strong>&#8220;Digital products &gt; Business and web services&#8221;<\/strong>. This is the correct category for SaaS, online tools, and digital services.<\/li>\n\n\n\n<li><strong>Taxes on shipping<\/strong>: Select <strong>&#8220;Determine automatically&#8221;<\/strong> (safe default even if you don&#8217;t sell physical goods).<\/li>\n\n\n\n<li><strong>Include tax in prices<\/strong>: Select <strong>&#8220;No&#8221;<\/strong>. This means tax will be added on top of the base price. A $29 product will cost a Spanish customer $29 + 21% = $35.09. This is the international standard for SaaS pricing.<\/li>\n<\/ul>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"765\" height=\"612\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-1.jpeg\" alt=\"Stripe: Setting Tax Business information 1\" class=\"wp-image-987805\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-1.jpeg 765w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-1-300x240.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-1-15x12.jpeg 15w\" sizes=\"(max-width: 765px) 100vw, 765px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"726\" height=\"646\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-2.jpeg\" alt=\"Stripe: Setting Tax Business information 2\" class=\"wp-image-987806\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-2.jpeg 726w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-2-300x267.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Stripe-Setting-Tax-Business-information-2-13x12.jpeg 13w\" sizes=\"(max-width: 726px) 100vw, 726px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<h4 class=\"wp-block-heading\">3. Integrations<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Check that Stripe Tax is connected to your payment flow. If you use Checkout Sessions, verify the integration is active. Typically, if Stripe Tax is enabled, Checkout uses it automatically.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. Registrations<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In the <strong>Registrations<\/strong> tab (within Tax settings), you tell Stripe where you&#8217;re registered to collect tax:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Click <strong>&#8220;Add registration&#8221;<\/strong>.<\/li>\n\n\n\n<li>Select your country (e.g., <strong>Spain<\/strong>) and enter your tax ID (NIF\/VAT number).<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This tells Stripe you&#8217;re registered for VAT in your country and that it should charge the domestic VAT rate to local customers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>About OSS<\/strong>: When your B2C sales to individual EU consumers approach the \u20ac10,000 threshold, you&#8217;ll need to register for the One-Stop Shop with your tax authority and add that registration in Stripe Tax as well. But if you&#8217;re just starting out, this probably doesn&#8217;t apply yet.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5. Verify With a Test Purchase<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Make a real or test purchase (using Stripe&#8217;s test mode) from your own country. The invoice should show:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tax base (your price before VAT).<\/li>\n\n\n\n<li>A VAT line item: &#8220;VAT &#8211; [Your Country] (XX% on $XX.XX)&#8221;.<\/li>\n\n\n\n<li>Total including VAT.<\/li>\n<\/ul>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"822\" height=\"715\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-euro-taxes.jpeg\" alt=\"Invoice: euro taxes\" class=\"wp-image-987807\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-euro-taxes.jpeg 822w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-euro-taxes-300x261.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-euro-taxes-768x668.jpeg 768w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-euro-taxes-14x12.jpeg 14w\" sizes=\"(max-width: 822px) 100vw, 822px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<p class=\"wp-block-paragraph\">Now simulate a purchase from a customer outside the EU. The invoice should show only the base price with no VAT.<\/p>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"827\" height=\"682\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-dollars-no-taxes.jpeg\" alt=\"Invoice: dollars no taxes\" class=\"wp-image-987808\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-dollars-no-taxes.jpeg 827w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-dollars-no-taxes-300x247.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-dollars-no-taxes-768x633.jpeg 768w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-dollars-no-taxes-15x12.jpeg 15w\" sizes=\"(max-width: 827px) 100vw, 827px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 4: Invoice Template Customization<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe automatically generates invoices for each transaction, which is a major advantage. But the default template may not fully comply with your country&#8217;s invoicing requirements. You&#8217;ll likely need to customize two things.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Adding Your Tax ID to the Invoice<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Settings \u2192 Invoices \u2192 Invoice template<\/strong> (or Branding \u2192 Invoice).<\/li>\n\n\n\n<li>In the sender details section, make sure your full legal name, fiscal address, and \u2014 critically \u2014 your <strong>tax identification number<\/strong> (NIF, VAT number, USt-IdNr., etc.) are displayed.<\/li>\n\n\n\n<li>If Stripe doesn&#8217;t have a dedicated field for the tax ID in the template, include it as part of the business name. For example: &#8220;Jane Smith (MyBrand) \u2014 NIF: ESXXXXXXXXX&#8221;.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Adding a Legal Footer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When an invoice doesn&#8217;t include VAT, most EU countries require you to state the legal reason. Since Stripe Tax generates invoices both with VAT (domestic customers) and without VAT (non-EU or B2B intra-community), you need a generic footer that covers all cases.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go to the invoice template settings and add the following text in the <strong>Footer<\/strong> or <strong>Memo<\/strong> field:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Where no VAT is shown: supply not subject to VAT under &#91;your country's relevant article] (non-EU customer) or reverse charge applies under &#91;your country's reverse charge article] (EU B2B). The customer is responsible for determining their local tax obligations.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example, for a Spanish business:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Where no VAT is shown: supply not subject to Spanish VAT under Art. 69.1 LIVA (non-EU customer) or reverse charge applies under Art. 84 LIVA (EU B2B). The customer is responsible for determining their local tax obligations.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This covers the two exemption scenarios and adds a liability disclaimer regarding the customer&#8217;s local tax treatment.<\/p>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"525\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-Default-footer-1024x525.jpeg\" alt=\"Invoice: Default footer\" class=\"wp-image-987809\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-Default-footer-1024x525.jpeg 1024w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-Default-footer-300x154.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-Default-footer-768x393.jpeg 768w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-Default-footer-18x9.jpeg 18w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Invoice-Default-footer.jpeg 1056w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 5: Payout Configuration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Switch Your Settlement Currency to EUR<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;ve been charging in USD and receiving payouts in dollars, it&#8217;s time to simplify. With Adaptive Pricing and multi-currency prices configured, the most efficient setup is to receive all payouts in euros:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Settings \u2192 Payouts<\/strong> (or <strong>Balance \u2192 Payout settings<\/strong>).<\/li>\n\n\n\n<li>If you have a bank account configured for USD payouts, remove it.<\/li>\n\n\n\n<li>Ensure only your local EUR bank account remains as the payout destination.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">From this point on, everything you collect \u2014 whether in USD, EUR, Peruvian soles, or any other currency via Adaptive Pricing \u2014 will be converted to EUR before the payout is sent to you.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Payout Frequency: Switch to Daily<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe offers three frequencies: daily, weekly, and monthly.<\/p>\n\n\n<\/div><!-- .vgblk-rw-wrapper --><div class=\"wp-block-image\"><div class=\"vgblk-rw-wrapper limit-wrapper\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"635\" src=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Sripe-Payouts-one-currency-1024x635.jpeg\" alt=\"Sripe: Payouts one currency\" class=\"wp-image-987810\" style=\"width:450px\" srcset=\"https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Sripe-Payouts-one-currency-1024x635.jpeg 1024w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Sripe-Payouts-one-currency-300x186.jpeg 300w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Sripe-Payouts-one-currency-768x476.jpeg 768w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Sripe-Payouts-one-currency-18x12.jpeg 18w, https:\/\/www.studio2c.ee\/wp-content\/uploads\/2026\/04\/Sripe-Payouts-one-currency.jpeg 1045w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div><!-- .vgblk-rw-wrapper --><\/div><div class=\"vgblk-rw-wrapper limit-wrapper\">\n\n\n<p class=\"wp-block-paragraph\"><strong>Recommendation: switch to Daily.<\/strong> Here&#8217;s why:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You receive money faster (typically 2-3 business days in Europe).<\/li>\n\n\n\n<li>The correspondence between invoice and receipt is more direct, simplifying bookkeeping reconciliation.<\/li>\n\n\n\n<li>The exchange rate applied will be closer to the sale date, reducing foreign exchange differences in your accounts.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> Stripe doesn&#8217;t allow one payout per individual transaction. Even on daily mode, it bundles all of the day&#8217;s transactions into a single payout. But you can see the exact breakdown of which transactions are included in each payout in the Dashboard, and you can export CSVs for your accountant.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How to Handle Bookkeeping<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reconciliation works in two separate layers:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Revenue (invoices):<\/strong> Each sale generates an invoice in Stripe. You record it as income at the moment of accrual (invoice date), not when the money arrives in your bank account.<\/li>\n\n\n\n<li><strong>Collections (payouts):<\/strong> When the payout hits your bank, you reconcile it against the invoices it includes.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe&#8217;s processing fees (shown in the monthly &#8220;Tax Invoice&#8221; that Stripe sends you) are a <strong>deductible expense<\/strong>. Record them separately.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 6: The Complete Checklist<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After following all the steps in this guide, your Stripe configuration should include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Products<\/strong> with prices in USD (base) and EUR (manual) for the European market.<\/li>\n\n\n\n<li><strong>Adaptive Pricing<\/strong> enabled in the Dashboard and unblocked in your code (no <code>payment_method_types<\/code> restriction).<\/li>\n\n\n\n<li><strong>Stripe Tax<\/strong> enabled with:<\/li>\n\n\n\n<li>Head office: your country.<\/li>\n\n\n\n<li>Tax category: Digital products &gt; Business and web services.<\/li>\n\n\n\n<li>Include tax in prices: No.<\/li>\n\n\n\n<li>Registration added for your country with your tax ID.<\/li>\n\n\n\n<li><strong>Invoice template<\/strong> customized with your tax ID and legal footer.<\/li>\n\n\n\n<li><strong>Payouts<\/strong> in EUR, daily frequency, to your local bank account.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">When to Register for OSS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Monitor your B2C sales to individual EU consumers outside your own country. When they approach \u20ac10,000\/year:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Register for OSS with your national tax authority.<\/li>\n\n\n\n<li>Add the OSS registration in Stripe Tax (Registrations tab).<\/li>\n\n\n\n<li>From that point on, Stripe Tax will automatically apply the customer&#8217;s country VAT rate.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Stripe Tax Costs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stripe Tax charges 0.5% per successful transaction (capped at $2). For low-volume SaaS businesses, this is manageable. If you scale significantly, alternatives like Quaderno or custom integrations may be more cost-effective for recurring subscriptions where the tax rate doesn&#8217;t change month to month.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Common Mistakes to Avoid<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Not configuring Stripe Tax at all.<\/strong> Many indie founders assume that because they sell internationally, they don&#8217;t need to worry about VAT. Wrong. If you have customers in your own country, you must charge VAT. And if you have EU customers, the rules are very specific.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Leaving <code>payment_method_types=['card']<\/code> in Checkout code.<\/strong> This silently disables Adaptive Pricing and local payment methods, costing you conversions without you knowing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Not including your tax ID on invoices.<\/strong> It&#8217;s a legal requirement in virtually every EU country and a common audit trigger if missing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ignoring the \u20ac10,000 OSS threshold.<\/strong> Once you cross it, you&#8217;re legally required to charge each EU customer&#8217;s local VAT rate. Not knowing doesn&#8217;t exempt you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Using a single currency for everything.<\/strong> You lose money on conversion spreads and your European customers see foreign-currency prices, reducing trust and conversion rates.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>&#x1f1ea;&#x1f1f8; Note for Spain-based founders:<\/strong> Spain has its own e-invoicing compliance regime called <strong>Verifactu<\/strong>, regulated by Royal Decree 1007\/2023 under the Antifraud Law. After Royal Decree-law 15\/2025 (December 2025), it becomes mandatory on <strong>January 1, 2027<\/strong> for companies and <strong>July 1, 2027<\/strong> for self-employed individuals (<em>aut\u00f3nomos<\/em>). Stripe itself is not a Verifactu-certified Invoice System (SIF), and doesn&#8217;t need to be \u2014 Stripe is a payment processor, and its invoices are commercial documents, not the legal Spanish invoice you&#8217;re required to issue. From those dates onward, you&#8217;ll need to issue your official Spanish invoices through certified billing software (Holded, Quaderno, Quipu, Anfix, Odoo, etc.), most of which already integrate with Stripe via API. If you&#8217;re based in Spain, plan this transition well before mid-2027. Other EU jurisdictions have parallel mandates rolling out (Italy&#8217;s SDI, France&#8217;s Factur-X \/ PPF, Germany&#8217;s e-invoicing rules) \u2014 check yours.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Setting up Stripe correctly for EU tax compliance isn&#8217;t difficult, but it requires understanding several pieces that are rarely explained together. The good news is that once configured, Stripe Tax handles most of the heavy lifting: it calculates the right VAT, generates compliant invoices, and gives you the reports you need for your tax returns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For your specific situation, always consult with a tax advisor. This guide covers the general framework, but every case has its nuances.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Found this guide useful? Share it with other indie founders selling from Europe. For more content on the technical and fiscal side of running SaaS products, follow me on @studio2cx or subscribe to the Studio2C blog feed.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><!-- .vgblk-rw-wrapper -->","protected":false},"excerpt":{"rendered":"<p>Last updated: April 2026 If you&#8217;re an indie hacker, freelancer, or small business owner based in Europe selling SaaS or digital products globally through Stripe, there&#8217;s a good chance your tax setup isn&#8217;t fully compliant. Not because you&#8217;re careless, but because the information you need is scattered across Stripe&#8217;s documentation, your country&#8217;s tax regulations, and&#8230;<\/p>","protected":false},"author":1,"featured_media":987811,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-987801","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/posts\/987801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/comments?post=987801"}],"version-history":[{"count":6,"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/posts\/987801\/revisions"}],"predecessor-version":[{"id":987841,"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/posts\/987801\/revisions\/987841"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/media\/987811"}],"wp:attachment":[{"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/media?parent=987801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/categories?post=987801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.studio2c.ee\/es\/wp-json\/wp\/v2\/tags?post=987801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}