Why the OSS return is per country AND per rate
The whole point of the One Stop Shop is that you charge the VAT rate of the country where your consumer lives, and then settle all of those foreign VAT amounts through one return at home instead of registering in every member state. Because each country sets its own rates, the return cannot collapse into a single number: the Belastingdienst has to forward the right VAT to the right country, so it needs the figures already split per destination country.
On top of the country split, the return is also per VAT rate. Most EU countries have a standard rate and at least one reduced rate. If everything you sell to a country falls under one rate, that country gets one line. But the moment you sell goods that are taxed differently, that country needs two (or more) lines.
The classic example is Germany. Suppose in one quarter you sell electronics (German standard rate 19%) and books (German reduced rate 7%) to German consumers. That is not "sales to Germany at an average rate". It is two separate declarations: the net amount and VAT at 19%, and the net amount and VAT at 7%, both under the country Germany.
Get this structure right and the rest of the return is mostly arithmetic. Get it wrong, by averaging rates or by lumping countries together, and you produce a return that cannot be reconciled and is likely to need correction.
Which figures you need each quarter
For every (destination country, VAT rate) bucket the OSS return asks for two values: the net taxable amount (your sales excluding VAT) and the VAT amount due at that rate. Both are net-based, which is the single most important thing to internalise about OSS reporting.
Net matters in two places. First, the €10,000 threshold that decides whether you are in OSS at all is measured on net cross-border B2C turnover, summed across all EU countries and all channels, your own webshop plus marketplaces like bol.com, Amazon and a WooCommerce store. Second, the amounts you declare per bucket are net plus the VAT computed on that net.
So if a German customer paid €119 gross for standard-rated goods, the net taxable amount is €100 and the VAT is €19 at the German 19% rate. You declare €100 net and €19 VAT, not €119.
You also need to be sure each sale belongs in the OSS return in the first place. OSS is B2C only and EU only. Domestic Dutch sales stay on your normal BTW return. Sales to the US, UK or any non-EU country are out of scope (0% export). And intra-EU B2B sales to a customer with a valid VAT number are reverse-charge and belong on the ICP / EC Sales List, never in OSS.
Finally, keep the underlying transaction data, orders, VAT rates applied, customer country evidence, for 10 years. This is a hard OSS requirement and the basis on which any audit will reconstruct your figures.
Step by step: from your transactions to a complete return
The reliable way to build an OSS return is to start from the raw transactions and filter down, rather than trying to read totals off a dashboard that was never designed for this split. The path is always the same five moves.
1. Collect all sales for the quarter. Pull every order across every channel: your own webshop and each marketplace. The OSS threshold and return are channel-agnostic, so a fragmented view across platforms is exactly where mistakes start.
2. Exclude what does not belong. Remove domestic Dutch sales (they stay on the normal BTW return), remove non-EU sales (0% export, out of scope), and remove B2B reverse-charge sales to valid EU VAT numbers (these go on the ICP report). What remains is cross-border B2C to EU consumers, the OSS population.
3. Group by destination country. Sort the remaining sales by the consumer's country. Germany, France, Italy and so on each become a group.
4. Split each country by VAT rate. Within each country, separate sales by the rate that was charged, standard versus reduced. This is where the per-rate buckets appear, e.g. Germany 19% and Germany 7%.
5. Total each bucket and enter it. For each (country, rate) bucket, sum the net taxable amount and the VAT. Those totals are what you type into the OSS portal, one block per country, one line per rate within it. Cross-check that net × rate equals the VAT in each line before submitting.
Stop rebuilding your OSS return by hand
Winkel Factuur aggregates every sales channel into a ready-to-file OSS report, split per country and per VAT rate, with a live €10,000 threshold indicator and CSV/JSON export.
A worked mini-example
Imagine a single quarter where you sold to German, French and Italian consumers. In Germany you sold standard-rated goods (19%) and books at the reduced rate (7%). In France everything was standard-rated (20%). In Italy you sold standard-rated goods (22%) and reduced-rated food (10%). All figures below are net.
| Country | VAT rate | Net amount | VAT due |
|---|---|---|---|
| Germany | 19% (standard) | €4,000.00 | €760.00 |
| Germany | 7% (reduced) | €1,000.00 | €70.00 |
| France | 20% (standard) | €3,000.00 | €600.00 |
| Italy | 22% (standard) | €2,000.00 | €440.00 |
| Italy | 10% (reduced) | €500.00 | €50.00 |
| Total | €10,500.00 | €1,920.00 |
Notice that this quarter produces five lines across three countries: Germany and Italy each carry two rate lines because they had mixed-rate sales. Three countries, five buckets.
Each line is independently checkable: €4,000 × 19% = €760, €1,000 × 7% = €70, €3,000 × 20% = €600, €2,000 × 22% = €440, €500 × 10% = €50. The portal totals the VAT to €1,920, which becomes the single OSS payment you remit alongside the return.
This is the level of detail the portal expects. There is no "€10,500 of EU sales" shortcut, the structure is the deliverable.
Common mistakes that trigger corrections
Using gross instead of net for the threshold. The €10,000 line is net cross-border B2C turnover across all EU countries and all channels. Measuring it on the gross amount customers paid overstates your position and can make you think you crossed when you did not, or the reverse.
Charging home VAT instead of destination VAT. Once you are in OSS, a German consumer pays German VAT (19%), not Dutch 21%. Continuing to apply the home rate produces wrong VAT on every cross-border order and a return that does not match your invoices.
Forgetting the reduced-rate bucket. If you sell anything at a country's reduced rate, books, certain foods, that country needs a second line. Declaring everything at the standard rate is a common and visible error.
Mixing in B2B reverse-charge. Intra-EU B2B sales to a valid VAT number are reverse-charge and belong on the ICP / EC Sales List. Dropping them into the OSS return double-counts them and corrupts both reports.
Missing the deadline. The OSS return and payment are due by 30 April (Q1), 31 July (Q2), 31 October (Q3) and 31 January (Q4). Late filing or payment can lead to penalties and, if it persists, exclusion from OSS, which forces individual registrations in each country. For edge cases (rate classification of a specific product, place-of-supply nuances) raadpleeg een BTW-adviseur / consult a tax advisor.
Generating the per-country/per-rate report automatically
Rebuilding the (country, rate) buckets by hand each quarter is exactly the kind of work software should do. Winkel Factuur ships a VAT reports page with an OSS-rapport tab: you pick a year and quarter and get the per-destination-country table with the per-VAT-rate breakdown, the net amount and VAT for each rate in each country, already aggregated across all your sales channels and stores.
The same page shows a live €10,000 threshold indicator measured on net cross-border B2C turnover, so you can see how close you are to OSS obligations before the quarter closes rather than discovering it afterwards.
When you are ready to file, the report offers CSV and JSON export of the per-country/per-rate figures, the same structure the OSS portal asks for, so transferring the numbers is a matter of reading them off rather than reconstructing them.
Alongside the OSS-rapport there is a separate ICP report for B2B intra-EU reverse-charge sales and a Dutch BTW return summary, which keeps the three reporting streams cleanly separated, the boundary that the common mistakes above tend to blur.
Your OSS return, already split per country and rate
Pick a quarter, read off the per-country, per-rate net and VAT figures aggregated across every channel, and export them ready for the OSS portal.
Try It Free →Stop rebuilding your OSS return by hand
Winkel Factuur aggregates every sales channel into a ready-to-file OSS report, split per country and per VAT rate, with a live €10,000 threshold indicator and CSV/JSON export.
