Guide
Build an invoice
This walkthrough builds a one-page invoice from an empty template. You end with a document where the letterhead, the customer, the dates and every line item come from data, the totals add themselves up, and the footer carries your company details and the page number.
You do not have to start from nothing. New template… on the Templates page opens a gallery that includes an Invoice, built the same way as the one below. Follow this guide to understand how each part works, so you can change it with confidence.
What you need first
- A new, blank template: New template…, then Blank.
- Some sample data. The editor shows your sample data on the page while you work, so you can see the finished look before any real invoice exists. Open Manage data in the toolbar, choose the JSON tab and paste this in (made-up values only — the sample is saved with the template):
{
"seller": { "name": "Northwind Studio", "street": "12 Harbour Street", "postcode": "LV-1050",
"city": "Riga", "country": "Latvia", "email": "billing@northwind.example",
"vatId": "LV40000000000" },
"customer": { "name": "Bluebird Cafe", "street": "4 Elm Road", "postcode": "LV-1011",
"city": "Riga", "country": "Latvia" },
"invoice": { "number": "2026-0042", "issueDate": "2026-10-01", "dueDate": "2026-10-15" },
"items": [
{ "description": "Brand identity workshop (2 days)", "qty": 2, "unitPrice": 1450, "amount": 2900, "vat": 551 },
{ "description": "Logo and visual system design", "qty": 1, "unitPrice": 3200, "amount": 3200, "vat": 608 },
{ "description": "Website templates, responsive", "qty": 6, "unitPrice": 385, "amount": 2310, "vat": 438.9 },
{ "description": "Stationery set: letterhead, cards", "qty": 1, "unitPrice": 740, "amount": 740, "vat": 140.6 }
]
}
Each line carries its own amount (quantity times unit price, after any discount) and its own
vat, the way an invoicing system sends them. The totals below add these up, so they can never
disagree with the lines.
Step 1 — The letterhead
- Add a Row (palette, or Search blocks and layouts). A Row puts blocks side by side. Use Add column (in the Row's menu) to make it three columns: a narrow one for the logo, a wide one for your company, and a 50 mm one for the word "Invoice" (select a block in a column and use the Column section: Fixed (mm) for the narrow ones, Auto (equal share) for the wide one).
- In the first column put an Image and choose your logo. In the second, a Stack holding two Text blocks: the company name and its address. In the third, a Text reading "Invoice", large, right-aligned.
- The company name and address are fields, not typed wording, so the same template serves any
seller: type
{{ $data.seller.name }}as the first text, and{{ $data.seller.street }}with the postcode and city on the lines below. (Select typed text and choose Make this a field to build these without typing the braces — see Fields and bindings.) - Under the Row add a Line in your accent colour to separate the letterhead from the body.
Step 2 — Who it is for, and the invoice details
- Add a second Row with two columns of equal share.
- Left column: a small grey Text reading "BILL TO", then a Text with the customer's name
and address as fields (
{{ $data.customer.name }}and so on, one per line). - Right column: a small "INVOICE DETAILS" Text, then three Label + value blocks —
"Invoice no.", "Issue date" and "Due date". For the value of the dates, use
{{ formatDate($data.invoice.issueDate, 'long') }}, which prints 1 October 2026 instead of the raw2026-10-01.
Step 3 — The line items
- Add a Table and, in the side panel, choose the list
itemsin the list chooser under Data path. The panel says what will print: "This table will print 4 rows, one per record, plus its header row". - Give each column a field under Columns: Description to
description, Qty toqty, Unit price tounitPrice(display format currency) and Amount toamount(also currency). Rename the headers by double-clicking them. - In Table style set Grid lines to horizontal rules only, and give the header a light Header fill.
A table filled from a list grows with the data: one row per line, and a long invoice continues on the next page with the header row repeated. See Table for everything the table offers, and Long content and page breaks for what happens across pages.
Step 4 — The totals
Add a Stack below the table and put three Label + value blocks in it, values set to:
- Subtotal:
{{ format(sum($data.items, 'amount'), 'currency') }} - VAT:
{{ format(sum($data.items, 'vat'), 'currency') }} - Total due:
{{ format(round(sum($data.items, 'amount') + sum($data.items, 'vat'), 2), 'currency') }}
sum(list, 'field') adds a field over every row, round(…, 2) keeps the total to the cent, and
format(…, 'currency') prints it with your template's currency (set under Document settings).
Because the totals are worked out from the lines, never typed, an invoice with more lines gets
correct totals without anyone touching the template.
Push the Stack to the right edge by giving it a left margin of about 100 mm (in its Box section), and make the "Total due" value bold.
Step 5 — A payment note
A short Text below the totals: Payable by {{ formatDate($data.invoice.dueDate, 'long') }}. Please quote invoice {{ $data.invoice.number }} with your transfer.
Step 6 — The footer with page numbers
- Select the section (click empty page area, then open the Section tab) and switch Footer on.
- Use + Add text block and write your company line as fields:
{{ $data.seller.name }} · VAT {{ $data.seller.vatId }} · {{ $data.seller.email }}. - Use + Add page number. Its text reads
Page {{ $page.number }} of {{ $page.count }}— change the wording to suit. See Headers & footers and Letterhead and footer.
What you should see
One A4 page. The letterhead sits across the top with "Invoice" at the right. Below it, "Bluebird Cafe" and its address on the left, and the invoice number 2026-0042 with 1 October 2026 and 15 October 2026 on the right. The table lists the four lines with euro amounts. The totals read €9,150.00 subtotal, €1,738.50 VAT and €10,888.50 total due. The footer shows the company line and "Page 1 of 1".
Variations
- No VAT line for a customer who does not pay it. Select the VAT block, turn on Only show
when… in its Visibility control, pick a field such as
invoice.vatApplies, and the conditionequalstrue. Add that field to your sample data ("vatApplies": true) and flip it to see the line disappear. See Fields and bindings. - Several languages. Replace fixed wording ("Bill to", "Invoice no.") with translations — see Translations.
- More than one page of lines. Add many rows to
itemsin a test scenario (see Fields and bindings, Test scenarios) and check how the table breaks. - Items grouped by project. Use Grouped line items with subtotals.
Output differences
PDF and HTML show the invoice as designed. A Word (.docx) download is an editable document, not a copy of the canvas, so spacing can differ slightly; the Row becomes a borderless table. The page-number footer carries over in all three formats.
If something looks wrong
- A total or a line prints blank. The field name does not match your data — a field the data does not have prints blank. Check the spelling under Data bindings in the toolbar, which lists the fields your sample really has.
- The table shows only its header. The Data path does not point at a list, or the list is empty; the panel under the chooser says which.
- The amounts have too many or too few decimals. Set the column's display format to currency, and check the currency under Document settings.
- The totals stick out past the right margin. The Stack's left margin is too small for its width; raise it, or make the Stack narrower.
- The company name wraps awkwardly. Make its column wider (Column section) or lower the font size.
Who this is for. Ristmark is for business use: build invoices for your company's customers, and do not put payment-card numbers, health or other sensitive personal data into templates or sample data. Businesses established in the United Kingdom are not served at launch.
The finished invoice from this guide is kept as the tested example build-an-invoice-1; it is checked automatically to lay out and produce PDF, Word and HTML without errors.