Universe

Create project in app

One invoice in five of the ten looks of invoice-pro

Professional invoices in Typst.
Calculated, compliant and e-invoice ready, from a few lines of code.

Documentation · Themes · E-Invoicing · GitHub


See It in One Minute

Video: invoice-pro in one minute

▶ Items, a discount, payment, two themes, a brand color, a language and the e-invoice, each in a line or two. The video plays in the documentation.

Highlights

🎨 Ten themes

From a DIN 5008 business letter to a poster look. Your brand color and logo in one line, on page layouts for the window envelopes of several countries.

🌍 Five languages

German, English, French, Italian and Spanish, with the number formats, VAT rates and invoicing rules of six countries.

🧮 Calculated for you

Groups with subtotals, bundles, discounts, several VAT rates and prepayments: every total is computed for you.

💶 Paid faster

An EPC QR code for banking apps, cash discounts, SEPA direct debit and card payments.

🧾 E-invoice included

ZUGFeRD / Factur-X and XRechnung, made from the numbers the page prints and checked against EN 16931 while you write (experimental).

✅ Nothing missing

A draft marks missing invoice data and lists it with its legal basis; validation: "strict" stops the build instead.

Ten Looks, One Line

The example invoice in the ten looks, each named

#show: invoice.with(
  theme: theme.bold.with(theme.custom.brand(
    color: rgb("#0f766e"),
    logo: image("logo.svg", alt: "Atelier Nord"),
  )),
  // sender: .., recipient: .., invoice-nr: ..
)

Without a theme, an invoice uses theme.classic. Each look has a page with a sample and a quick start in the documentation.

Quick Start

Start a project from the template:

typst init @preview/invoice-pro

or write the invoice yourself:

#import "@preview/invoice-pro:0.6.0": *

#show: invoice.with(
  locale: locale.en-de,
  sender: (
    name: "Atelier Nord GmbH",
    address: "Hafenstraße 12",
    city: "20457 Hamburg",
    vat-id: "DE123456789",
  ),
  recipient: (
    name: "Acme Corporation",
    address: "Market Street 5",
    city: "80331 Munich",
  ),
  invoice-nr: "2026-0142",
)

#line-items[
  #item([Brand strategy], price: 2400)
  #item([Web design], quantity: 3, unit: unit.day, price: 900)
  #discount([Loyal customer], amount: 5%)
]

#payment-terms(days: 14)
#bank-details(
  bank: "Hamburger Sparkasse",
  iban: "DE75512108001245126199",
  bic: "SOLADEST600",
)

Learn More

Video: themes
Themes
Video: languages
Languages
Video: line items
Line items
Video: payments
Payments
Video: e-invoicing
E-invoicing
All guides and
the API reference →

Status

The data model (line-items, item, group, bundle) is stable. The theme API is stable since v0.6.0: theme.classic, theme.plain, the tokens, the layouts and the part names are frozen; the other presets may still be refined. The locale API may still change. E-invoicing is experimental: Typst cannot write the Factur-X XMP metadata yet, so PDF validators reject the PDF although its XML is valid (workaround).

Credits

invoice-pro uses sepay for the EPC QR code (with ibanator for the IBAN check) and loom for reactive rendering. Thanks to classy-german-invoice by Kerstin Humm, which inspired the template and the EPC QR code, to Michael Fuchs (theexiile1305), whose first ZUGFeRD export in v0.4.0 started the e-invoicing, and to letter-pro, which drew the DIN 5008 page up to v0.5. Everyone who has helped with code, bug reports or ideas is on the contributors page.

License

MIT