Invoices that get paid

Write, send and chase your invoices in one place, and know at a glance what is owed.

Everything between the quote and the payment

What our customers say

Simple pricing

Questions

Send your next invoice with Northwind

As a customer — Dana, who uses NorthwindAs the SaaS's creator — Sam, who runs it

Three parts

Your product, at /app: Northwind's invoicing here — the only part a buyer writes.

Account, at /account: billing, the team, settings. Done.

Admin, at /admin: revenue, sign-ups, workspaces, support. Done.

Every row below is one answer to npm run setup. Your copy runs on what you choose; nothing else in the code changes.

Product

This demo: Northwind's invoicing, an example

Your copy: Start from a blank page — your product goes there

npm run setup -- --product blank

Database

This demo: In memory: a copy of its own for each visitor

Your copy: SQLite — a file, Turso or D1

npm run setup -- --data sqliteadapters: { data: 'sqlite' }

.env asks for: DATABASE_URL — file:./data.db | libsql://<db>.turso.io?authToken=… | d1://<BINDING>

Accounts

This demo: The demo's: any password signs in

Your copy: Real accounts — Better Auth

npm run setup -- --auth better-authadapters: { auth: 'better-auth' }

.env asks for: BETTER_AUTH_SECRET, BETTER_AUTH_URL

Sign in with

This demo: Nothing: email and password only

Your copy: Google

npm run setup -- --auth better-auth --oauth google

.env asks for: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET

Mail

This demo: The outbox: Settings → Outbox

Your copy: Resend

npm run setup -- --auth better-auth --mail resendadapters: { mail: 'resend' }

.env asks for: RESEND_API_KEY

Payments

This demo: The demo's checkout: no card

Your copy: Stripe

npm run setup -- --payments stripeadapters: { payments: 'stripe' }

.env asks for: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_AUTOMATIC_TAX