StripeJack turns a Stripe account into the package German bookkeeping expects: an EXTF booking batch, the invoice PDFs as a BEDI document archive, and a deferred-revenue schedule for subscriptions. It runs on your own machine — no intermediary service, no sign-up, no third party that gets to see your payment data.
# Set up, then export the last completed month $ npx @jungherz-de/stripe-jack init $ npx @jungherz-de/stripe-jack export → out/DATEV_Stripe_…_2026-07.zip (58 transactions, 7 documents)
Node.js 20 or newer · MIT licence · SKR 03 and SKR 04 · runs as a cron job
Anyone taking payments through Stripe while keeping books in Germany knows the monthly chore. Stripe credits the amount net of fees, but the invoice is for the gross. The payout lands in the bank account days later and bundles several payments together. Subscriptions run across month boundaries and have to be deferred. And depending on where the customer sits and whether they hold a VAT identification number, the revenue belongs on a different account.
A CSV export from the Stripe dashboard solves none of that. It knows neither receivable accounts nor posting keys, attaches no documents, and has no notion of money in transit or deferred revenue. What DATEV expects is an EXTF booking batch in format 700 — field by field, with document dates, debit/credit markers and linked documents.
StripeJack closes exactly that gap. It reads a period's transactions and invoices from the Stripe API, turns them into complete booking records, and attaches the invoice PDFs as documents. One command, one archive, ready to upload to DATEV Unternehmen online.
One ZIP per account and period — plus a manifest with counts, totals and checksums as a record of what was delivered.
Payments clear receivables, fees become an expense, payouts move through a money-in-transit account. Refunds reverse the same account pair, so tax automation on the revenue accounts keeps working.
The invoice PDFs ship as a BEDI archive and are linked to their booking through Beleglink. A payment settling an invoice from an earlier month still finds its document.
Domestic standard and reduced rates, intra-community reverse charge, One-Stop-Shop, third countries — all follow from the customer's country, their VAT id and the rate that was actually charged.
The guided prompt asks for your Stripe key and the numbers from your tax firm, then defaults every account from the chart of accounts you pick. It validates before writing.
$ stripe-jack init
With no arguments StripeJack takes the last completed month — exactly what a cron job needs. Periods can be given explicitly.
$ stripe-jack export $ stripe-jack export --month 2026-07
The archive waits in your output directory, ready for DATEV Unternehmen online. If you prefer, StripeJack mails it to your tax firm.
# optional, off by default
MAIL_ENABLED=true
The package ships a SKILL.md: a machine-readable guide that teaches agents like Claude Code the commands, what the exit codes mean, and the order in which to set things up.
In practice that means you describe what you want in plain language instead of assembling account numbers in a .env. The assistant first checks whether any configuration exists at all, then asks for the values it cannot guess — consultant number, client number, chart of accounts — and knows which account numbers belong to SKR 03 and SKR 04.
It also knows where care is needed: that a receivable account must sit between 10000 and 69999, because otherwise DATEV books it as a general-ledger account and every payment silently loses its customer. And that when in doubt, the suspense account is the right answer — never a plausible guess.
None of this requires an assistant: stripe-jack init performs the same setup on its own.
You Set up StripeJack for my Stripe account and export last month. Claude Code Checking the configuration first … $ stripe-jack accounts → no .env found I need three values from the letter of your tax firm: 1. Beraternummer (consultant number) 2. Mandantennummer (client number) 3. Chart of accounts — SKR 03 or 04?
StripeJack was not guessed from the format specification. It is verified against a real, DATEV-accepted export of the same month — field by field, line by line. That comparison runs as an automated test on every change and is reproducible from the repository.
The built-in stripe-jack verify does the same with your own data: it produces the export for a month and holds it against an existing reference file. If you are migrating from another tool, you see before the switch whether anything changes.
StripeJack is a tool, not a service. There is nothing to sign up for, and no server of ours that ever sees anything.
An export carries personal data: customer names, addresses, invoice amounts and the documents themselves. With a SaaS product for the same job, that data additionally flows through a third party's systems — with everything that entails: a processing agreement under Art. 28 GDPR, an entry in your record of processing activities, an assessment of the server location.
Because StripeJack runs locally, all of that falls away. The parties involved are your own company, Stripe — which already holds the data — and the tax firm you hand your bookkeeping to anyway. No additional provider is introduced.
# install globally $ npm install -g @jungherz-de/stripe-jack # or try it without installing $ npx @jungherz-de/stripe-jack export --month 2026-07 --dry-run
Requires Node.js 20 or newer. --dry-run fetches the same data as a real run but writes nothing — a good way to check the permissions on your Stripe key.
The full documentation lives in the repository. It is written in German, because the domain is.