DEV Community

RAXXO Studios
RAXXO Studios

Posted on • Originally published at raxxo.shop

Solo Studio Invoicing in 2026: Stripe Tax + DATEV Export + USt-VA via API

  • Stripe Tax handles VAT calculation per customer location automatically across 40+ countries

  • A 50-line Node script exports the monthly DATEV CSV my tax advisor actually wants

  • USt-VA submission via the ELSTER ERIC API works, but sevDesk is the lazy fallback

  • Real numbers from a small Berlin studio: 18 to 30 invoices a month, 90 minutes total

The invoicing stack I had in 2023 was a Google Sheet, a PDF generator I forgot the password to, and a folder called "VAT-stuff-final-FINAL". By 2026 I run a small Berlin one-person studio and most of that is automated. Not all of it. Just enough that I do not dread the 10th of every month, when the VAT pre-declaration is due.

This is what the stack actually looks like, with the parts that work and the parts that still need a human.

Stripe Tax does the VAT math I used to do wrong

For years I calculated VAT manually based on where the customer was. EU B2B with valid VAT ID, reverse charge, no VAT on the invoice. EU B2C, charge their country's VAT rate. UK, charge UK VAT if registered there. Customer in Texas, no VAT but maybe sales tax. I got it wrong more than once.

Stripe Tax fixed this for me in about an hour of setup. I enabled it in the dashboard, registered the German tax IDs and OSS (One Stop Shop) for EU sales, and added the country list where I have nexus. Stripe checks the customer's address and tax ID against VIES at checkout, applies the right rate, and stores the calculation. The invoice PDF Stripe generates includes the correct line item, the correct VAT note ("Reverse charge: VAT to be paid by the recipient"), and a unique invoice number that meets the German continuous numbering requirement.

The cost is 0.5% on top of the transaction fee, which sounds small until you do the math on a year. For a studio doing roughly 18 to 30 invoices a month with mixed B2B and B2C, the extra Stripe Tax fee runs around 25 to 60 EUR a month for me. That is less than my old habit of paying my tax advisor to fix my VAT mistakes after the fact. I tested removing it once and immediately had to issue a credit note to a French B2B client because I had charged them German VAT instead of applying reverse charge. Back on it stayed.

What Stripe Tax does not do: it does not file your USt-VA. It does not push to DATEV. It does not know about your other income (cash invoices, marketplace payouts, a one-off Shopify sale that bypassed Stripe). For that, you need glue.

The 50-line Node script that makes my tax advisor stop emailing me

My Steuerberater (tax advisor) wants one thing from me each month: a DATEV-formatted CSV with all my Stripe transactions. Stripe's own dashboard export is not in DATEV format. Closest you can get is a custom report, which is fine for a single month but breaks every time DATEV updates the field spec.

So I wrote a script. It pulls the previous month's transactions via stripe.charges.list, maps them to DATEV's "Buchungsstapel" CSV columns (Umsatz, Soll/Haben-Kennzeichen, Konto, Gegenkonto, BU-Schluessel, Belegfeld 1, Datum, Buchungstext), and writes the file. The whole thing fits in 50 lines including imports and is the most boring code I own.

The skeleton, with details trimmed:


import Stripe from 'stripe';
import { stringify } from 'csv-stringify/sync';
import { writeFileSync } from 'fs';

const stripe = new Stripe(process.env.STRIPE_SECRET);
const start = new Date('2026-04-01').getTime() / 1000;
const end = new Date('2026-05-01').getTime() / 1000;

const charges = [];
for await (const c of stripe.charges.list({
  created: { gte: start, lt: end },
  limit: 100,
})) charges.push(c);

const rows = charges.map(c => ({
  Umsatz: (c.amount / 100).toFixed(2).replace('.', ','),
  Soll_Haben: 'H',
  Konto: '1200',
  Gegenkonto: c.metadata.account || '8400',
  BU_Schluessel: c.metadata.bu || '9',
  Belegfeld_1: c.id.slice(-12),
  Datum: new Date(c.created * 1000).toISOString().slice(0, 10),
  Buchungstext: (c.description || '').slice(0, 60),
}));

writeFileSync('export-04-2026.csv', stringify(rows, { header: true, delimiter: ';' }));

Enter fullscreen mode Exit fullscreen mode

I run it on the 5th of each month. The output goes into a Dropbox folder my Steuerberater has read access to. He used to send me 10 emails a month asking for clarifications. Now he sends one, in May, asking how my Spanish tax certificate is going.

The thing this script does not do: credit notes, partial reversals, disputes, marketplace transfers. For those I have a longer cousin script. If you want to see how the monthly close fits together, I covered that in Solo Studio Bookkeeping in 90 Minutes a Month.

USt-VA via ELSTER ERIC: the honest version

The USt-VA (Umsatzsteuer-Voranmeldung) is the German monthly VAT pre-declaration. Every month, by the 10th, you tell the Finanzamt how much VAT you collected, how much input VAT you can deduct, and you pay the difference. It is the single most-late filing in German freelance life because the official ELSTER portal is, generously, an experience.

There are three ways to file it.

The official path is ERiC, the ELSTER Rich Client, a binary library you can call from C, Java, or via a Python wrapper. It validates your XML against the Finanzamt schema and submits over a TLS-encrypted channel. I built a wrapper around it once, in 2024, and got it to submit a real USt-VA. It worked. It also took me a weekend, the docs are German tax German (different from regular German), and the schema changes every year. If you are the kind of person who enjoys decoding XSD files for fun, this path is free and reliable.

The pragmatic path is sevDesk or lexoffice. Both have proper APIs that wrap ELSTER. You push your invoices and expenses into their data model, click submit, and they handle the XML and the ERiC handshake. sevDesk's API costs me about 18 EUR a month on the smallest plan that includes ELSTER submission. It is the lazy version and I switched to it after a quarter of fighting ERiC directly. Worth it.

The wrong path is "I will file it through the web portal manually each month." You will forget. Three months from now you will get a friendly letter from your Finanzamt with a 50 EUR late fee, and the fee compounds. Pick one of the first two.

What I send my customers vs what goes to the Finanzamt

The invoice the customer gets is generated by Stripe and looks clean: my studio name, customer details, line items, VAT, total, IBAN, the German legal footer (Steuernummer, USt-IdNr, Kleinunternehmer status if applicable). Stripe stores it as a hosted PDF and sends a download link in the receipt email.

The data the Finanzamt eventually sees is different. They see aggregates, not individual invoices, and they only care about the per-month sum of taxable sales by VAT category (19%, 7%, reverse charge, OSS), the input VAT I deducted, and the resulting payment. They do not look at customer names. They will, however, audit me one day and at that point they want every individual invoice, in DATEV-readable form, with continuous numbering and matching bank movements.

This is why the boring script matters more than the pretty PDF. The PDF is for trust. The CSV is for survival. If you are running a studio at this scale, you will want both, and you want them to come out of one source of truth, not two systems you reconcile by hand on a Sunday night.

The other reason this stack works for me: I keep all expenses on one card. One business Shopify Balance card, one Stripe account, one DATEV-readable export. No personal-card-for-business-stuff. That alone removed about 40% of my month-end pain when I switched in 2024. For more on the wider picture of what running a small studio with this kind of plumbing looks like, Stripe Projects Changes Solo Maker Economics covers the operational side I do not get into here.

Bottom Line

The 2026 invoicing stack for a solo studio has gotten good enough that the math is not the hard part anymore. Stripe Tax handles the per-customer VAT logic. A 50-line Node script bridges Stripe to DATEV. Either ERIC directly or a service like sevDesk submits the USt-VA so I do not log into ELSTER manually.

What is left for me to do is the human part: categorising weird transactions, deciding if a marketplace payout is a service or a goods sale, remembering that the Spanish OSS threshold changed in 2024. That part still takes 90 minutes a month. The rest takes about as long as making coffee.

If you are looking for the complete picture of how the monthly routine fits together, the Studio page has the full RAXXO operating system, and I keep updating both as I find better tools. The boring infrastructure is what gives me time to make things people actually want to buy.

Top comments (0)