Invoicing
Invoices built from the work itself
Invoices, quotes and credit notes live next to the hours, retainers and domains they bill. You pick what is still outstanding instead of retyping it, the document carries your design, and what you see on screen is exactly the page that prints as PDF. Payment can happen online; the bookkeeper gets UBL 2.1.
One engine, two documents
An invoice and a quote are the same document with a different lifecycle: the same lines, the same VAT rates, the same currency and the same templates. Issuing allocates the number from your own format, with separate series for invoices and quotes and a yearly restart if you want one. An accepted quote converts to an invoice at the prices and VAT it was accepted at, so a rate change from last week never rewrites what the client signed. Open quotes expire on their validity date by themselves, so the list doesn't fill up with proposals from six months ago. The list carries tiles for Openstaand, Vervallen, Concepten, Betaald dit jaar and Openstaande offertes, each filtering the list it counts.
- Invoice: draft → issue → send → register payment
- Quote: draft → issue → send → accept → convert to invoice
- Number format with {year}, {yy} and {seq}, 2026-0001 and Q2026-0001 by default
Four kinds of line, and three pickers
The line editor knows four kinds of line: Uren, Abonnementen, Domeinen and Diensten. You don't type the first three, you pick them: each opens its own picker over what is still outstanding for this client, and the line arrives priced, dated and with the right unit. Every line remembers what it bills, so editing a draft never bills the same work twice, and removing a line puts that work straight back on the picker. Periods that were already billed stay visible, labelled "al gefactureerd" instead of quietly disappearing — answering by omission is exactly how a duplicate invoice happens. The Facturatie → Nog te factureren screen does the same for the whole agency, with four tiles and a grouping by day, week, month, year, client, project or employee, and lists exactly what the nightly run is going to bill: whatever is past its invoice date included, and a domain renewal with no price as a zero line marked "geen prijs" rather than not at all.
- Uren kiezen: approved, billable hours that sit on no invoice yet
- Periodes kiezen: subscription periods not yet billed
- Verlengingen kiezen: domain renewals per year, billed in advance for the year ahead, at the TLD rate or that domain's own price
- Diensten: free lines, one click from your own Producten en diensten list
What you see is what prints
You edit the template in a visual editor beside a preview that is the API's real renderer, not an approximation of it. You switch blocks on and off and drag them into order (Logo, sender, recipient, payment details, lines, VAT breakdown, totals, notes, footer, QR code), give fields your own labels, choose an accent colour and optionally lay a watermark on the background with its own opacity, size, position and rotation. Legally required parts — the number, the date, the VAT breakdown, the reverse-charge notice — may be moved but never switched off. There is one render: the preview, the printout and the PDF are the same page. What you record yourself reaches that paper too: your own fields set to "Op het document tonen", a subscription's notes where it is set to print them (with variables like {{company_name}} already filled in), and the client's name on the invoice where it differs from the name everyone knows them by, in the UBL export as well. Formatting follows the document and not the viewer, so a Dutch agency invoicing a German client prints amounts and dates in that document's language and currency, whoever opens it.
- Klassiek: the default design, with your logo and accent colour
- Briefpapier: your own words on the letterhead, your own colour on the rules
- Eigen HTML: your own Jinja and CSS, sandboxed and with no network access
Credit notes, payments and what is outstanding
Once an invoice is issued, the money on it is fixed: amounts, lines and VAT stop being editable, and you correct with a credit note. Cancel an invoice the client already has and schakl. suggests the same: reverse it with a credit note, created and issued in one go, because a cancellation exists only here while a credit note also exists in your client's books. Crediting hands you a draft with the same lines at negative amounts, which you can trim down for a partial credit. When the credit note covers the original in full, the hours, subscription periods and domain years are released to be billed again. You register payments with a date, an amount and a method, and partial payments are fine: outstanding is total minus paid minus credited, and "overdue" is derived from the due date every day rather than stored anywhere. Process fields stay editable, so changing a reference, a note, a due date or the document language never costs you a credit note.
- Methods: bank transfer, cash, card or other; "online" is only ever written by the provider
- Deleting a draft un-bills exactly the work it held
- Deleting an issued invoice takes an explicit confirmation naming its number, and is refused while payments sit on it
Paying online, and the client looking in
An open invoice carries the Online betalingen card: one button creates a payment page for exactly the outstanding amount, computed server-side, and hands you a link to mail or copy. A client with a portal login sees "Nu betalen" there instead. When the provider confirms, the payer gets a thank-you page and an ordinary payment row is written on the invoice, so the status, the reminders and the export all know at once; an hourly check picks up whatever a missed notification left behind. Mollie is the first provider and you connect your own account under Instellingen → Mollie; the key is write-only and card details never touch schakl. A test payment runs the whole route like a real one, payment row included, so a rehearsal actually proves something. In the portal a signed-in client sees only their own company's issued invoices, never a draft and never anyone else's, Clients without a login need none: every issued invoice has its own public link on which exactly that one invoice can be viewed and paid, and the optional QR code on paper and the button in the mail point there. Switch those links off and the ones already sent stop working too.
Your old invoices come along
An agency switching over has years of invoices in Moneybird, SnelStart or a spreadsheet, and without that history every client's outstanding balance starts on migration day. Under Instellingen → Facturatie → Bestaande facturen overnemen they come in through the same import wizard as every list, with a check beforehand that names the row and column of whatever is wrong. An imported invoice is an ordinary invoice with a provenance: the totals are the fact and are taken as they stand on the original, never recomputed, and the payment state becomes an ordinary payment row with a date. Then you attach the PDFs your clients actually received, one at a time on the invoice or as a zip in which each file is named after its invoice number. From then on the invoice page, the download and the public link show exactly that document, with its fingerprint beside it. The invoice list keeps Exporteren; importing deliberately stays in the settings, because it is a move, not a way of working.
- No notifications and no reminders about old invoices unless the file asks for them
- A zip matches on invoice number; whatever does not fit is named, never guessed
- Afterwards, set the next invoice number past the highest imported one
Automatic invoicing, chasing and handover
Automatic invoicing is a level, not a switch. You set it agency-wide and override it per subscription or per domain, so the fixed hosting retainer runs on its own while the client you renegotiate every month stays manual. Payment reminders are off by default; switch them on and you set the schedule yourself in days past the due date (7, 14 and 30, for instance), at most one mail goes out per step, and you can pause them per invoice. The three client-facing mails — invoice, quote and reminder — are rewritable per language under Instellingen → E-mail. And the bookkeeper gets a UBL 2.1 file per issued invoice that Exact Online, SnelStart, Moneybird and e-Boekhouden import, carrying your own ledger code per VAT rate; with SnelStart it can also run live, and what has been paid there comes back as an ordinary payment row. Invoicing is an extension module: the core of schakl. is open source (AGPL) and extensions run on a licence key the administrator installs under Instellingen → Licentie; when it lapses the module goes read-only and your invoices, PDFs and UBL files stay reachable.
- Off: you make every invoice yourself
- Prepare a draft: the draft is waiting, you review it
- Prepare and issue: numbered and ready to send
- Prepare, issue and mail: the client already has it
Want to know more?
The documentation describes every module in detail, from installation to permissions.