Skip to main content

Shopify Tax Setup for Slovenian Merchants: A Developer's Guide

How to configure DDV (VAT), OSS thresholds, B2B reverse charge, and invoice numbering for a Shopify store registered in Slovenia. Covers what most apps and consultants miss.

Read in Slovenian

Slovenian Shopify merchants get tax setup wrong more often than any other configuration step. The defaults look correct, FURS (Slovenian tax authority) is fine for years, then OSS reporting season arrives and everyone is in a hurry.

This post is the developer-side checklist for getting it right the first time. It is not legal or accounting advice — a Slovenian accountant should sign off on the actual numbers. But the technical setup is engineering, and engineering can be checklist-driven.

The mental model

A Slovenian Shopify store sells to four categories of customer, with different VAT (DDV) treatment for each:

CustomerWhereVAT rate appliedInvoice notes
Slovenian consumerSI22% (standard) or 9.5% (reduced) or 5% (books)DDV included in price
EU consumernon-SI EUOSS rate of destination countryOSS scheme, reported quarterly
EU business with valid VAT IDnon-SI EU0% (reverse charge)“Reverse charge — Article 138” note required
Non-EU customeroutside EU0% (export)“Export, exempt — Article 146” note required

Shopify can handle all four — but only if you configure it correctly. Out-of-the-box you get rule #1 and not the others.

Step 1 — Register the right tax IDs in Shopify

Shopify Admin → Settings → Taxes and duties → Slovenia.

What to fill in

  • Tax ID: your VAT ID, formatted as SI12345678 (8 digits, prefixed with SI).
  • EU OSS number (if registered for OSS): same VAT ID is reused as your OSS reference; FURS does not issue a separate one.
  • Default tax rates: Slovenia 22%, Reduced 9.5%, Super-reduced 5% (books, certain food items, periodicals).

Verify

After saving, place a test order at €100 to a Slovenian address. The order summary must show:

  • Item: €81.97 (excl. DDV)
  • DDV (22%): €18.03
  • Total: €100.00

If the math is off by even one cent, Shopify is using the wrong rate. Common cause: a Shopify “Markets” override that sets a default 20% rate (EU average) — overrides Slovenia until manually corrected.

Step 2 — Configure OSS (One-Stop Shop)

If you sell more than €10 000 / year to other EU consumers, you must charge their country’s VAT rate, not Slovenia’s 22%. The OSS scheme lets you report all of this through FURS instead of registering in every country.

Shopify setup

Settings → Taxes and duties → European Union → “Collect VAT” → enable for all EU countries you ship to. For each country:

  • Default tax rate: auto-populated by Shopify based on EU rates (kept current by Shopify Tax).
  • OSS scheme registration: toggle “Use OSS to collect tax for sales to this country.”

This delegates the rate calculation to Shopify Tax, which is updated whenever an EU country changes rates (e.g., Germany’s temporary 7% → 19% restaurant VAT changes during COVID).

Common gotcha

If you also have a local VAT registration in (say) Germany — common for stores using a German warehouse — disable OSS for Germany specifically. Sales to German consumers go on your German VAT return, not OSS. Shopify supports per-country toggles for exactly this reason.

Step 3 — B2B reverse charge

A non-Slovenian EU business with a valid VAT ID buys from your store. The correct invoice has 0% DDV and a “reverse charge” note. The customer self-accounts for VAT in their country.

Shopify setup

This requires the B2B for Shopify Plus plan (€2000+/month) or a workaround on Basic/Advanced plans:

On Shopify Plus B2B:

  • Settings → Customers → Companies → enable “B2B.”
  • Per-company set tax exemption with reason “EU VAT registered.”
  • Create a “B2B” customer tag; new B2B sign-ups go into a separate Markets bucket.

On non-Plus plans:

  • Install VAT validator app (Sufio, Sherpas, or similar — all under €20/month).
  • App validates VAT ID against VIES at checkout.
  • If valid + customer is non-SI EU → app applies 0% tax and adds the reverse-charge note to the invoice.

Critical: VIES validation must happen at checkout, not after. A retroactive credit note for “we charged you VAT but you were exempt” is a tax accountant’s nightmare.

Invoice text required

Slovenian DDV law (ZDDV-1, article 82) requires the following exact-meaning text on a reverse-charge invoice:

“Davek na dodano vrednost (DDV) je obračunan po sistemu obrnjene davčne obveznosti v skladu s členom 138 Direktive 2006/112/ES.”

In English:

“Reverse charge — Article 138 of Directive 2006/112/EC.”

Both languages on the invoice if you serve both audiences. Sufio and similar apps include this as a template variable; verify it actually renders on a test order.

Step 4 — Invoice numbering compliance

FURS audits notice this first. Slovenian DDV law requires:

  1. Sequential, gap-free numbering within a calendar year. No INV-001, INV-003. Shopify’s default order numbers (#1001, #1002, ...) are fine; do not override with a custom sequence that skips.
  2. Reset annually or never (your choice; document and stick to it).
  3. Visible on the customer-facing invoice, the order confirmation email, and the order in admin.
  4. Stored 10 years — Shopify keeps order data indefinitely; for FURS specifically, also export annually to your accountant’s archive (CSV).

Sufio / Order Printer setup

The native Shopify “Order Printer” app meets FURS minimum requirements but is bare. Sufio is the de facto standard for Slovenian Shopify stores — it ships with:

  • Sequential invoice numbering (separate from order numbers).
  • Bilingual SI / EN templates.
  • Reverse-charge text built in.
  • Credit note (dobropis) generation that maintains sequential numbering across invoices + credit notes.
  • Export to e-SLOG XML (required for B2B e-invoicing with Slovenian public sector and some large private buyers).

If you have B2B customers, you almost certainly need e-SLOG export. Sufio handles it.

Step 5 — FURS connection (cash registers)

If your Shopify store is the only sales channel, you do not need a FURS cash register connection — those rules only apply to physical POS systems.

If you also have a Shopify POS in a physical store in Slovenia, FURS connection (davčna blagajna) is mandatory. Shopify POS in Slovenia is not FURS-certified out of the box. You need:

  • A FURS-certified middleware: Pantheon POS, Saop, or [Datalab Pantheon Cloud].
  • Or: switch the physical-store POS to one of the local certified solutions and leave Shopify for online only.

This is the most common reason a Slovenian merchant cannot use Shopify POS. Plan around it; do not work around it.

Step 6 — Integration with Slovenian accounting (Moj Račun, Pantheon, Minimax)

The merchant’s accountant will want a clean sync from Shopify to their accounting software. Common patterns:

Accounting softwareIntegration approach
Moj RačunAPI + custom middleware (most reliable); webhook from Shopify Orders → POST to Moj Račun API
Pantheon (Datalab)Pantheon’s Shopify connector; pull every 15 min, syncs orders + customers + invoices
MinimaxMinimax Shopify app; native integration
e-računi.comManual export, or Make.com integration

For Moj Račun and other API-driven flows, build a small middleware: a Cloudflare Worker or AWS Lambda that listens to Shopify webhooks and posts to the accounting API. Avoid “all-in-one” apps that try to sync products + customers + orders + inventory — too many failure modes; pick orders only and reconcile other entities manually.

Step 7 — Inventory in customs warehouses

If you import stock from outside the EU (e.g., Chinese suppliers), you may use a customs warehouse — paying VAT only on items that leave the warehouse for EU consumers.

Shopify cannot natively distinguish “stock in customs warehouse” from “stock cleared for EU sale.” You need:

  • A separate Shopify location for the customs warehouse.
  • A custom app or middleware that flags orders fulfilled from that location and applies the correct customs declaration.

This is niche. Talk to your accountant before assuming you need it.

Common audit findings (and how to avoid them)

After dozens of small-store FURS audits, the recurring issues are:

  1. Missing reverse-charge text on B2B EU invoices. Fix: Sufio with the template variable correctly populated.
  2. Sequential numbering gaps caused by deleted test orders or app-generated invoices that bypass Shopify’s numbering. Fix: never delete orders; mark as voided + issue a credit note.
  3. OSS quarterly return mismatch with Shopify’s tax report. Fix: use Shopify’s Tax finance report (Admin → Reports → Finance → Taxes) as the source of truth, exported per quarter, matched against Klaviyo / GA4 revenue figures.
  4. Wrong VAT rate on books — Slovenia has 5% on physical books; some Shopify product type defaults set 22%. Fix: tag book SKUs with a tax-rate: 5 metafield and override in Shopify Tax settings.

Realistic costs

For a small Slovenian Shopify merchant (≤€500k revenue, ≤2000 SKUs):

  • Sufio: ~€19/month
  • VAT validator app (if non-Plus): ~€15/month
  • Custom Moj Račun / Pantheon middleware: one-time €1500–3000 to build, ~€20/month hosting
  • Annual FURS accountant fee: €600–1500 depending on complexity

Total: €60–80/month + €1500–3000 one-time. Small compared to the cost of a tax penalty for misclassified VAT.


I configure Shopify tax + invoicing for Slovenian merchants and the Moj Račun integration in particular. Get in touch if you are setting up a new store or untangling an old one.