Customer invoices card

Unpaid invoices lead, oldest due first, with settled ones folded away behind a count that says how many are back there.

What it is

A collapsible dashboard card headed with the outstanding total or All paid in full. Unpaid rows sort by due date and carry an overdue state computed from the due date. Paid and void invoices fold into a single toggle that names the count. Rows open the full invoice document in place. Draft invoices never appear.

Also called: what do I owe · my invoices · outstanding balance · paid receipts

See it, piece by piece
01

The one live question is answered before they scroll

The card heads with the outstanding total, or with All paid in full when there is nothing owing. On a job billed six times, five settled invoices used to push the single outstanding bill down the list and bury the only thing the customer opened the page to find out. Unpaid rows lead; a customer who is square with you is told so instead of being handed a list to audit.

02

Oldest due first, and overdue says overdue

Unpaid invoices sort by due date so the one to pay next is the one at the top, and a bill past its date carries an overdue marker worked out from the date itself rather than from a status somebody remembered to change. Chasing a draw is a phone call; a customer who can see which one is late often does not need the call.

04

A half-written invoice cannot appear on their page

Drafts are excluded before the list ever leaves the server, and an invoice you deleted is gone from the customer's view as well. Of every surface that has to honour a deletion, this is the one where getting it wrong is visible to the person who was billed — and a customer who sees a number you were still working on will treat it as a bill.

Invoicing
AllDraftSentViewedPartialOverduePaidVoidAll customersSearch number, title, customer, or project…
Yoder — 40×64×14 Shop4 invoices
Marlin Yoder·$80,242.35total·$58,380.00 paid·$21,862.35 due
1Paid2Partially Paid3Overdue4Draft
1INV-2026-0036Down Payment — 40×64 ShopPaid
Issued May 4, 2026 · Due May 18, 2026
$26,535.00
PDF
2INV-2026-0038Delivery DrawPartially Paid
Issued Jun 22, 2026 · Due Jul 6, 2026
$35,380.00
$12,380.00 due
PDF
3INV-2026-0041CO-3 — Overhead DoorsOverdue
Issued Jul 9, 2026 · Due Jul 23, 2026
$9,482.35
PDF
4INV-2026-0044Final PaymentDraft
Issued Aug 20, 2026
$8,845.00
The Draft row on your own list — the customer's card never carries one. The real screen, drawn from the product’s own design system. Sample data — no customer information appears here.
How it works
  1. 1GET /api/client-portal/invoices resolves the link to its project and returns customer-safe columns
  2. 2Draft invoices are excluded server-side so admin work in progress never leaks
  3. 3Unpaid rows sort oldest-due first; settled rows sort the other way behind the toggle
  4. 4Overdue is derived by comparing the due date to now
  5. 5A row opens /invoice/{portal_token}?embed=1 inside a modal
Why we built it

On a job billed six times, five settled invoices pushed the one outstanding bill down the list and buried the answer to the only question the customer had. Unpaid invoices sort to the top and paid ones fold into a group that stays one tap away. Folded never means dropped: a paid invoice is the customer's receipt, and it is the thing they come back for at tax time.

The problem
  • Outstanding bills buried under settled history
  • Receipts becoming unreachable once paid
  • Draft invoices leaking to a customer surface
Sound familiar?
What you get
The live question, is anything due, is answered at a glance
Old receipts stay one click away at tax time
Only sent invoices are ever visible

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 →