Für SaaS-Gründer:innen & Entwickler:innen

Stripe DATEV Export – automatisch.Du hast Stripe eingebaut. Die Buchhaltung musst du nicht auch noch programmieren.

finHero holt deine Stripe-Zahlungen, Gebühren, Erstattungen und Auszahlungen ab und macht daraus einen fertigen DATEV-Buchungsstapel inklusive Belegen. Deine Steuerkanzlei importiert ihn direkt – ohne CSV-Gefrickel und ohne eigene Export-Skripte.

✓ DATEV-Buchungsstapel + Belege✓ SKR03 & SKR04✓ Monatlich kündbar
finHero · DATEV-Export
Buchungsstapel Juni 2026Heute · automatisch aus Stripe synchronisiert
SK10
Stripe Payments
Umsatzerlöse · SKR03 8400
12.480,00 €
Gebucht
SK11
Stripe Billing
Abo-Erlöse · monatlich
3.899,00 €
Exportiert
GEB
Stripe Gebühren
Aufwand · SKR03 4970
− 214,90 €
Belegexport
RAP
Passive Rechnungsabgrenzung
Jahresabos · pRAP
7.600,00 €
Abgrenzung

Stripe-Daten sind nicht buchhaltungsfertig

Der CSV-Export aus Stripe sieht nach Buchhaltung aus – ist es aber nicht. Spätestens beim Jahresabschluss kommen die Rückfragen deiner Kanzlei.

„Paid“ ist kein Geldeingang

Stripe zahlt netto und gebündelt aus. Gebühren, Erstattungen und Disputes müssen getrennt gebucht werden, sonst stimmen die Salden nicht.

Belege fehlen

Jede Buchung braucht einen Beleg. Rechnungen und Gutschriften jeden Monat einzeln herunterladen und zuordnen kostet Stunden.

Abos müssen abgegrenzt werden

Wer Jahresabos verkauft, muss den Umsatz periodengerecht verteilen (pRAP). Von Hand ist das fehleranfällig.

Selbst bauen frisst Zeit

Ein Export-Skript ist schnell geschrieben. DATEV-Format, Kontenrahmen, Sonderfälle und Wartung kosten dich aber Wochen, die ins Produkt gehören.

Das bekommt deine Steuerkanzlei

Jeden Monat ein fertiger Export im DATEV-Format – nachvollziehbar bis zur einzelnen Stripe-Transaktion.

  • ✓Buchungsstapel im DATEV-Format, direkt importierbar
  • ✓Rechnungen und Gutschriften als PDF, mit den Buchungen verknüpft
  • ✓Stripe-Gebühren und Auszahlungen sauber getrennt gebucht
  • ✓Transaktions-IDs im Buchungstext für schnelle Rückverfolgung
  • ✓Kontierung nach SKR03 oder SKR04, abgestimmt mit deiner Kanzlei
Buchungsstapel · DATEV-Format
Umsatz €KontoGegenkontoBuchungstext
49,0013608400Stripe Zahlung · Pro-Abo · ch_3Q…8xK
1,9949701360Stripe Gebühr · ch_3Q…8xK
490,001360990Jahresabo · Abgrenzung (pRAP)
19,0084001360Erstattung · re_3Q…2Lm
2.384,4012001360Stripe Auszahlung · po_1Q…7Vb

In drei Schritten zum automatischen DATEV-Export

Kein Code, keine Webhooks, kein Cronjob.

1

Stripe verbinden

Installiere die finHero-App aus dem Stripe Marketplace. Ein paar Klicks, keine Programmierung.

2

Konten festlegen

Wähle SKR03 oder SKR04 und hinterlege bei Bedarf eigene Konten – gern gemeinsam mit deiner Kanzlei.

3

Export erhalten

Jeden Monat liegt dein DATEV-Export bereit. Herunterladen, an die Kanzlei schicken, fertig.

finHero im Stripe App Marketplace ansehen

Klar, das könntest du auch selbst bauen.

Als Entwickler:in liegt der Gedanke nahe. Das steckt allerdings dahinter:

Selbst gebaut

  • DATEV-Buchungsstapel-Format korrekt erzeugen
  • Gebühren, Auszahlungen, Erstattungen und Disputes sauber abbilden
  • Belege abrufen und den Buchungen zuordnen
  • pRAP für Jahresabos berechnen
  • Bei jeder Änderung an Stripe-API oder Kontenplan nachziehen

Mit finHero

  • Läuft ab dem ersten Monat
  • Buchungslogik mit deiner Kanzlei abstimmbar
  • Auch rückwirkende Exporte möglich
  • Monatlich kündbar
  • Deine Zeit bleibt beim Produkt

Für Entwickler:innen: Stripe Checkout in Next.js einbauen

Falls Stripe bei dir noch nicht läuft: drei typische Setups mit realistischen Defaults (inkl. productId/priceId & Subscription). Sobald die ersten Zahlungen eingehen, übernimmt finHero den DATEV-Export – ohne weiteren Code.

1) Checkout-Session (Subscription) – API Route

code
// app/api/checkout/session/route.ts
import Stripe from "stripe";

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: "2023-10-16" });

export async function POST(req: Request) {
  const { email, productId, priceId, customerId } = await req.json();

  // Falls nur productId vorhanden → zu Price (recurring) auflösen
  let resolvedPriceId = priceId;
  if (!resolvedPriceId && productId) {
    const prices = await stripe.prices.list({ product: productId, active: true, limit: 10 });
    resolvedPriceId = prices.data.find(p => p.recurring)?.id || prices.data[0]?.id;
  }
  if (!resolvedPriceId) {
    return Response.json({ error: "Kein Price gefunden." }, { status: 400 });
  }

  // Customer wiederverwenden/erstellen
  const customer = customerId ? customerId : (await stripe.customers.create({ email })).id;

  const session = await stripe.checkout.sessions.create({
    mode: "subscription",
    customer,
    line_items: [{ price: resolvedPriceId, quantity: 1 }],
    success_url: `${process.env.NEXT_PUBLIC_APP_URL}/success?session_id={CHECKOUT_SESSION_ID}`,
    cancel_url: `${process.env.NEXT_PUBLIC_APP_URL}/cancel`,
    allow_promotion_codes: true,
    metadata: { source: "pre-landing", plan_hint: productId || "n/a" },
  });

  return Response.json({ sessionId: session.id });
}

2) Client – Redirect zu Checkout

code
// app/(marketing)/subscribe/page.tsx
"use client";
import { loadStripe } from "@stripe/stripe-js";
import { useState } from "react";

const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY!);

export default function SubscribePage() {
  const [loading, setLoading] = useState(false);

  async function handleSubscribe() {
    setLoading(true);
    const res = await fetch("/api/checkout/session", {
      method: "POST",
      body: JSON.stringify({
        email: "kunde@example.com",
        // eines von beiden:
        productId: "prod_ABC123", // → Server löst zu recurring price auf
        // priceId: "price_123",
      }),
    });

    const { sessionId } = await res.json();
    const stripe = await stripePromise;
    await stripe?.redirectToCheckout({ sessionId });
    setLoading(false);
  }

  return (
    <button className="btn btn-primary" onClick={handleSubscribe} disabled={loading}>
      {loading ? "Weiterleiten…" : "Abo starten"}
    </button>
  );
}

3) Webhook – Ereignisse verarbeiten (Basis)

code
// app/api/stripe/webhook/route.ts
import Stripe from "stripe";

export const config = { api: { bodyParser: false } }; // nur Pages Router; App Router liefert raw body

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: "2023-10-16" });

export async function POST(req: Request) {
  const sig = req.headers.get("stripe-signature")!;
  const raw = await req.text();

  let event: Stripe.Event;
  try {
    event = stripe.webhooks.constructEvent(raw, sig, process.env.STRIPE_WEBHOOK_SECRET!);
  } catch (err: any) {
    return new Response(`Webhook Error: ${err.message}`, { status: 400 });
  }

  if (event.type === "checkout.session.completed") {
    const session = event.data.object as Stripe.Checkout.Session;
    // TODO: Onboarding, Feature-Freischaltung …
  }

  if (event.type === "invoice.paid") {
    const invoice = event.data.object as Stripe.Invoice;
    // TODO: Rechnungsdaten für finHero/DATEV vorbereiten
  }

  return new Response("ok");
}

Häufige Fragen zum Stripe DATEV Export

Kann ich Stripe direkt nach DATEV exportieren?

Stripe selbst bietet keinen DATEV-Export. Der CSV-Export enthält Rohdaten, die erst in Buchungssätze, Konten und Belege übersetzt werden müssen. finHero übernimmt genau das und liefert einen importfertigen DATEV-Buchungsstapel.

Werden Stripe-Gebühren und Auszahlungen korrekt gebucht?

Ja. Gebühren werden separat auf das passende Aufwandskonto gebucht, Auszahlungen dienen als Abstimmungspunkt zum Bankkonto. So stimmen die Salden.

Wie kommen die Belege nach DATEV?

finHero exportiert Rechnungen, Gutschriften und Stornos als PDF und verknüpft sie mit den passenden Buchungen – fertig für deine Kanzlei.

Muss ich dafür etwas programmieren?

Nein. Die Verbindung läuft über die finHero-App im Stripe Marketplace. Du schreibst keinen Code und richtest keine Webhooks ein.

Funktioniert das mit Stripe Billing und Abos?

Ja. Abo-Rechnungen werden mit exportiert, Jahresabos auf Wunsch periodengerecht abgegrenzt (pRAP).

Kann ich vergangene Monate nachträglich exportieren?

Ja. Auch rückwirkende Exporte sind möglich – praktisch, wenn die Buchhaltung nachgeholt werden muss.

Mein Unternehmen sitzt nicht in Deutschland – geht das trotzdem?

DATEV ist der Standard bei deutschen Steuerkanzleien. Wenn deine Kanzlei ein anderes System nutzt, sind auch Exporte außerhalb von DATEV möglich.

Brauche ich für Stripe Checkout eine productId oder eine priceId?

Für Subscriptions übergibst du eine priceId. Wenn du nur die productId hast, kann dein Backend den passenden wiederkehrenden Preis auflösen – siehe Code-Beispiel oben.

Noch Fragen? Zum Hilfe-Center

Schluss mit Stripe-CSVs für die Buchhaltung.

Verbinde Stripe in wenigen Minuten und sieh dir deinen ersten DATEV-Export an.

7 Tage kostenlos testen

7 Tage kostenlos · monatlich kündbar