Open Source · MIT · Jungherz GmbH

Stripe revenue into DATEV — in one command.

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

The problem

Stripe knows nothing about debtors. DATEV knows nothing about Stripe.

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.

1 commandinstead of an hour of manual work a month
EXTF 700the booking batch DATEV expects
SKR 03/04both charts of accounts, fully configurable
0 servicesnobody sits between you and Stripe
The output

An archive your tax firm accepts as is.

One ZIP per account and period — plus a manifest with counts, totals and checksums as a record of what was delivered.

DATEV_Stripe_…_2026-07.zip ├── EXTF_Stripe_Zahlungen_….csv booking batch: payments, fees, payouts ├── EXTF_Stripe_Rechnungen_….csv booking batch: invoices and credit notes ├── Stripe_PRAP_….xlsx deferred revenue per subscription invoice ├── Income_By_Product_….xlsx net revenue per product — weekly, monthly, yearly └── documents.zip invoice PDFs + BEDI index

Complete booking records

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.

Documents included

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.

VAT derived, not configured

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.

How it goes

Set up, export, upload.

Set up once

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

Export monthly

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

Upload to DATEV

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
With AI assistants

Drivable by Claude Code — without reading the docs.

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?
Confidence

Why you can trust the figures.

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.

  • Never guesses. Anything that cannot be classified with confidence goes to the suspense account — with a warning in the log and the manifest.
  • Nothing falls through. Even transaction types it has never seen are booked rather than skipped.
  • Audit trail. Every archive comes with a manifest listing period, counts, totals and SHA-256 checksums.
  • Repeatable. An already exported period is not silently overwritten, and concurrent runs lock each other out.
  • Open to inspection. Every booking rule exists as source code and as documentation in the repository.
Privacy

Payment data stays between you, Stripe and your tax firm.

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.

  • Two outbound connections, both from your own machine: to the Stripe API and — only when explicitly switched on — to your own mail server.
  • No telemetry, no usage reporting, no update check. Verifiable in the open source.
  • Read-only access. A restricted Stripe key with read permissions is enough; the tool never writes.
  • No data retention. Nothing is stored beyond the archive in your own output directory — no database, no cache.
Get started

Install it and export last month.

# 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.