Everything invoice follow-up needs. Nothing it doesn't.

Receivables, organised

Idempotent invoice import

CSV import with auto-mapped columns, per-row validation and a downloadable error report. Invoices match by number — re-imports reconcile balances, never duplicate.

Ageing buckets

Upcoming, due, 1–7, 8–21, 22–45 and 45+ days overdue — computed from due dates, filterable in one click.

Customer book

Auto-created from imports, with outstanding totals, invoice history and a do-not-contact switch that stops everything instantly.

Follow-up with guardrails

Editable reminder policy

Four escalating stages with plain-language templates and per-stage timing. Placeholders pull invoice facts only.

Approval-first sending

Drafts wait for a named approval; invoice status, contact preference and email presence are re-checked at send time.

Automatic stops

Payment in full, a dispute, a hold or do-not-contact cancels pending reminders for that invoice immediately.

Idempotent outbox

Retries and duplicates can't double-send; every message and its delivery status is recorded.

Customer-facing

Secure status page

Unguessable per-invoice link showing status and outstanding amount — no login needed for your customer.

Pay, promise, or dispute

Stripe payment when configured (simulated, clearly-labelled test payment in demo installs); promise-to-pay dates; dispute notes that pause reminders.

Neutral tone enforced

Templates never threaten or misstate consequences; the acceptable-use policy makes wording your responsibility with sane defaults.

Visibility & control

Reports

Outstanding, collected, collected-after-follow-up (labelled as attribution), average days-late, ageing table, recently-paid list.

Promises & disputes tracking

Open promises surface when due; disputes are logged with resolution history.

Roles & audit

Owner, admin, staff, viewer roles enforced server-side; every send, payment, dispute and policy change is audit-logged.

Export & deletion

Owners can export the whole workspace as JSON or delete it entirely.