Paisa · What it does
Product · Accounts receivable

What you are owed, as at any date.

Invoices and contract billings feed one control account, and the subledger is rebuilt as it stood on the date you ask about — not as it stands today.

Implemented in src/invoices.ts, src/erp/revrec.ts
As-atbalances rebuilt as they stood, not as they stand
Why it is built this way

3 decisions that carry the weight.

A state machine, not a status field

Draft → sent → partially paid → paid, with each transition posting its own journal entry. An invoice cannot be paid before it is sent.

No stored balance

What is outstanding is derived from recorded payments, so the invoice and the ledger cannot drift apart.

As-at, not as-of-today

An invoice raised after a period end does not leak into that period's balance, and one settled afterwards is still counted as open then.

Capabilities

What it does, in full.

Invoicing with tax

Per-line taxable value and rate, with output tax posted alongside revenue at the moment the invoice is sent.

Aging buckets

Current, 1–30, 31–60 and 60+ days, computed from due dates rather than maintained as a report.

Collections signals

Overdue invoices ranked by days outstanding, and a continuous agent that raises stale receivables past a threshold — with the note that past ninety days this is usually a provision decision, not a chasing problem.

Contract billing

Instalments from a revenue contract post to the same AR control account, clearing any unbilled receivable before creating deferred revenue.

Partial payments

Payments are recorded against the document and cannot exceed what is outstanding. The status follows the arithmetic rather than being set by hand.

Control-account tie-out

The AR subledger is reconciled to its GL account as part of every close, and a difference blocks the close.

Related

Works with

See it against a real ledger.

The demo runs on a seeded company with a live close waiting — two real blockers and agents holding proposals.