Skip to content
Rechnungskit
E-invoicing software · made in Germany

Invoices for no-code and AI app builders

AI app builders such as Lovable, Bolt, Replit or v0 build your app and connect Stripe, but they do not create a legally valid e-invoice. Rechnungskit fills the gap with a REST API: in the server-side function your builder sets up for the Stripe webhook, you report the order to Rechnungskit with one API call. As soon as the Stripe payment arrives, a GoBD-compliant ZUGFeRD invoice under EN 16931 is created automatically, with your own number sequence, a DATEV export and archiving.

One API call from your builder's server-side function, whether that's Lovable, Bolt, Replit or v0, and every sale becomes a compliant e-invoice with a DATEV export.

No credit card · set up in under an hour · personal onboarding
Your app
Espresso set Stripe Checkout · paid
€49.00
POST /v1/orders
RE-2026-0517 E-invoice created
Espresso set €41.18
Date of supply = shipping day · plus 19% VAT
ZUGFeRD to EN 16931 · GoBD-archived
Shipping date from /v1/fulfillments (§ 13 UStG)
DATEV export · VAT rate per EU country
The gap

Writing invoices is easy. Writing compliant ones is not.

The difference between a PDF and a compliant e-invoice matters at the next tax audit. Rechnungskit closes exactly this gap.

Without RechnungskitWith Rechnungskit
The builder handles checkout and Stripe, but no invoice One fetch in the existing backend function, and the invoice is created automatically
No EN 16931 e-invoice, no GoBD archive and no VAT logic Every payment becomes a ZUGFeRD invoice with your own number sequence
German tax rates per country and reverse charge would be yours to build Tax rate per country, OSS for B2C and reverse charge for B2B handled automatically
No ready-made DATEV export for your tax advisor (Steuerkanzlei) GoBD archive and a ready DATEV export, without accounting logic of your own
How it works

Four steps to a compliant e-invoice.

  1. 01
    Create an API key
    In Rechnungskit, go to Connections → API and create a key with the orders:write permission (plus invoices:read for fetching invoices). Use rk_test_ for testing and rk_live_ for live operation. Store the value in your builder's secrets store, never in the frontend.
  2. 02
    Connect Stripe once
    Your builder uses your own Stripe account. Connect that same account once in Rechnungskit under Connections → Connect and set your API orders as the sales basis. Rechnungskit then matches the Stripe payment to the order you reported via the API. It's a click in the dashboard, not code.
  3. 03
    Report the order from the backend
    Almost every builder sets up a server-side function for Stripe, often with a webhook (an edge function in Lovable and Bolt, a server endpoint in Replit, a Next.js route in v0). Add a call to POST /v1/orders there, with the buyer address, line items in whole cents and the Stripe payment reference. The key stays on the server, and the call is a single fetch.
  4. 04
    The invoice is created automatically
    Once the Stripe payment reaches Rechnungskit and matches the order, the e-invoice is created: validated against EN 16931, with the correct tax rate, archived to GoBD standards and ready for the DATEV export. For physical goods you also report the shipment via POST /v1/fulfillments. GET /v1/orders/{orderNo} returns the finished invoice.

Your builder makes the app, not the invoice

AI app builders like Lovable, Bolt, Replit or v0 build you an app in hours and connect Stripe. What's missing only shows up when the tax office or your tax advisor (Steuerkanzlei) asks: these tools create a payment, but not an invoice in the sense of German law. There's no structured document under EN 16931, no GoBD archive (GoBD being the German rules for keeping digital records), no VAT logic per country and no DATEV export. Rebuilding all of that yourself is exactly the work you picked a builder to avoid.

Rechnungskit closes that gap with a REST API, at the point where your builder already handles the payment: the server-side function behind your Stripe webhook. One API call turns the sale into a ZUGFeRD invoice with your own number sequence, archived in an audit-proof way and ready for booking in DATEV.

Does your builder fit? An honest overview

It comes down to one question: can your builder make an API call on the server (with a secret key that never reaches the browser) and process Stripe payments through a webhook? If so, the connection works.

  • Very well suited, with a dedicated guide: Lovable and Bolt. Both set up edge functions for Stripe, which is the environment the connection needs (Lovable docs, Bolt docs).
  • Very well suited: Replit (a real backend plus a secrets store) and v0 by Vercel (Next.js with server-side code, v0 docs). The call goes into your Stripe webhook endpoint.
  • Suited with a backend: WeWeb with its own backend or together with Supabase or Xano (WeWeb docs), as well as Bubble (backend workflows) and FlutterFlow (Cloud Functions).
  • Needs a layer in between: Framer has no backend for your own server code. There, the call runs through a small serverless function (for example on Cloudflare or Vercel) that you put in between. Softr calls external APIs directly from its workflows on the Professional plan and above; below that you need the same layer in between.
  • Probably not needed: builders with their own invoicing feature, such as Wix or Jimdo. Do check whether their documents are EN 16931 e-invoices and how they are archived, though.

The call you add

Whatever builder you use: in the function that processes your Stripe webhook, add a fetch to POST /v1/orders in the success branch. Amounts go in whole cents, the Stripe payment reference goes in paymentRef, and the key comes from the secrets:

// Your builder's backend function, in the Stripe webhook after a successful payment
const res = await fetch('https://api.rechnungskit.de/v1/orders', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.RECHNUNGSKIT_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': session.id
  },
  body: JSON.stringify({
    orderNo: session.id,
    paymentRef: session.payment_intent, // pi_... from Stripe
    email: session.customer_details?.email,
    billingAddress: {
      name: session.customer_details?.name,
      country_code: session.customer_details?.address?.country, // required for VAT
      postal_code: session.customer_details?.address?.postal_code,
      city: session.customer_details?.address?.city,
      street: session.customer_details?.address?.line1
    },
    items: [{ name: 'Pro plan', quantity: 1, unitGrossCents: 2900, taxRate: 19 }]
  })
})

The invoice isn't created by this call. It's created as soon as the Stripe payment reaches Rechnungskit and matches the order. There is deliberately no paid field.

One-time setup, stated plainly

The code is simple; a few things you set up once:

  • Connect Stripe in the dashboard and set it to API (Connections → Connect, with API orders as the sales basis). It's a click, not code.
  • Send the country code. Without country_code in the billing address the order is rejected.
  • Set an Idempotency-Key. Every POST needs the header; otherwise a duplicate webhook creates two orders.
  • Verify the Stripe signature in your builder and retry on 5xx, so no order gets lost.

Show your AI the docs

Rechnungskit publishes a complete OpenAPI 3.1 specification at api.rechnungskit.de/v1/openapi.json. Give it to your builder's AI and ask it to report an order to Rechnungskit in the Stripe webhook after a successful payment. The full reference with working examples is in the API documentation.

FAQ

FAQ

Any builder that comes with a server-side function and a Stripe connection. Lovable and Bolt fit best (edge functions plus a Stripe integration), along with Replit (a real backend plus secrets) and v0 by Vercel (Next.js with server-side code). WeWeb now has a backend of its own, or you can put Supabase or Xano behind it. Bubble and FlutterFlow work too, through their backend workflows and Cloud Functions respectively. Framer has no backend for your own server code, so you need a small layer in between (for example a Cloudflare or Vercel function) that makes the call on the server. Softr can call external APIs from its workflows on the Professional plan and above; on smaller plans you need the same layer in between.
Last reviewed:

Rechnungskit is not a tax advisory or law firm. This article explains general principles and does not replace advice from a tax advisor (Steuerberater, § 5 StBerG) or a lawyer (§ 3 RDG). Rechnungskit is built for businesses based in Germany and prepares documents, tax rates and bookings automatically. How your specific case is treated remains your decision, ideally together with your tax advisor or a lawyer.

Ready for the e-invoicing mandate?

Create an account, connect your payment provider, check everything in free test mode. Billing starts when you go live.

Try it now
de en