A public page at /invoice/{portal_token} rendering the same branded document the builder approved, with payments received listed, payment instructions, a Print/Save PDF button and — when the business has a card processor connected — a Pay button. Opening it stamps viewed_at on the invoice.
Also called: customer portal invoice · invoice link · view invoice online · pay link
Your customer opens the bill in one tap, with no account to make
Every invoice has its own link that opens a branded page carrying the document, the payments received against it, your payment instructions, and a Pay button when you have a processor connected. There is no login, because a customer who has to create an account to look at a bill is a customer who pays later. It is also not a PDF attachment to be lost in an email thread.
The link is the security, so it is not a guessable one
The token is 24 bytes of cryptographic randomness generated when the invoice is created. It is the access boundary around the amounts, the line items and the payment details, so it is deliberately not built from a timestamp or an everyday random number, both of which are partly predictable. Nobody works their way from one customer's invoice to another's.
Opening the link is what stamps the invoice as viewed
The first time the customer opens their page, the invoice moves from sent to viewed, with the time recorded. “I never got it” becomes a question with an answer, and your follow-up can tell an invoice that was never opened from one that was read and ignored.
The same page prints as a clean PDF
The customer's page renders the same branded layout as the copy you approved, and print or save-as-PDF strips the surrounding chrome so the output matches whichever screen it was opened from. A link on the end opens straight into the print dialog, for the copy that has to go into a file or across to a lender.
- 1The token is 24 cryptographically-random bytes (48 hex chars) generated with crypto.getRandomValues at invoice creation.
- 2The page fetches /api/client-portal/invoice?token=… which returns the invoice, line items, payments, branding, and whether payments are enabled.
- 3?embed=1 renders it inside the portal dashboard's modal and opens Stripe in a new tab, because Stripe refuses to load in a frame.
- 4?print=1 fires the print dialog on load.
Customers will not create an account to look at a bill, and a password reset loop is how an invoice goes unpaid for a fortnight. The invoice opens from a link instead — which means that link is the only thing between a stranger and the customer's amounts, line items and payment details, so it is generated the way a credential is generated rather than from a clock reading. The customer's page draws the same branded layout as the office copy, so printing it produces the same document.
- Login friction stopping customers viewing or paying a bill.
- PDF attachments lost in email threads.
- No read receipt on a sent invoice.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →