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
▶ 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 themesFrom 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 languagesGerman, English, French, Italian and Spanish, with the number formats, VAT rates and invoicing rules of six countries. |
🧮 Calculated for youGroups with subtotals, bundles, discounts, several VAT rates and prepayments: every total is computed for you. |
💶 Paid fasterAn EPC QR code for banking apps, cash discounts, SEPA direct debit and card payments. |
🧾 E-invoice includedZUGFeRD / Factur-X and XRechnung, made from the numbers the page prints and checked against EN 16931 while you write (experimental). |
✅ Nothing missingA draft marks missing invoice data and lists it with its legal basis; |
Ten Looks, One Line
#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
![]() Themes |
![]() Languages |
![]() Line items |
![]() Payments |
![]() 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





