Invoice status tracking

Each invoice moves through draft, sent, viewed, partial, paid and void — and overdue is derived on read so nothing needs a nightly job.

What it is

The stored status records real transitions. 'Viewed' is stamped the first time the customer opens their portal link. 'Overdue' is not stored at all — effectiveStatus computes it whenever due_date has passed and a balance remains, so the list is always correct without a cron flipping rows.

Also called: overdue invoices · did the customer open it · unpaid invoices · invoice statuses

See it
Invoice status tracking
Prepared for
Marlin Hoover
1140 Ridge Line Rd · Fair Play
Shell package$37,405
Concrete & site$10,859
Doors & windows$7,240
Trim & finish$4,826
Total
$60,330
Signature
The status filter chips row (All / Draft / Sent / Viewed / Partial / Overdue / Paid / Void) with LED status dots, from src/components/invoices/InvoicingView.tsx. Sample data — no customer information appears here.
How it works
  1. 1Send stamps status='sent' and sent_at via /api/invoices/[id]/send.
  2. 2The customer opening the portal link calls markInvoiceViewed, flipping sent to viewed and stamping viewed_at.
  3. 3Recording a payment sets partial or paid and stamps paid_at when the balance clears within half a cent.
  4. 4effectiveStatus(inv) derives 'overdue' at render time from due_date + balance.
Why we built it

Overdue is the status a builder most needs to be right, and it is the one most easily broken by a nightly job that quietly fails to run — the invoices stay marked current and nobody chases them. Overdue is now worked out at the moment the list is drawn, from the due date and the balance still owing, so it is correct whether or not anything ran overnight. Draft, sent, viewed, partial and paid are recorded as they actually happen.

The problem
  • No visibility into whether a sent invoice was ever opened.
  • Overdue state going stale because a scheduled job did not run.
Sound familiar?
What you get
Overdue is always accurate the moment the page renders.
Follow-up can be aimed at 'sent but never opened' versus 'opened and ignored'.

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 →