Customer Statements for Perfex CRM
Statements that stay correct when a customer is invoiced in more than one currency, with ageing beside them.
$49 one payment, no subscription, updates included
Demo: crmdemo.lumadro.com/admin · demo@lumadro.com / demo
The problem
Perfex has a statement of account on the customer profile. Open it for a customer you have invoiced in two currencies and read the closing balance: it sums the totals and prints the result in one currency, which is wrong in both. There is no ageing anywhere in Perfex, no way to send statements to everyone who owes you, and no way to get any of it out as a file.
This module fixes those four things and leaves the rest of Perfex alone.
What you get
- A statement of account for any customer over any date range: opening balance, every invoice, payment and credit, a running balance, a closing balance.
- Receivables ageing with buckets you set, on the statement and across every customer, filtered by sale agent or customer group.
- Credit limits, which Perfex has no concept of, flagged on the ageing report when a balance passes one.
- Scheduled statements, sent once a month to everyone carrying a balance, using the Perfex cron you already run.
- A pay link on every unpaid line, showing what is still owed rather than the original charge.
- PDF with a tear-off remittance slip, and every statement in one PDF for a print run.
- Email through your own Perfex templates, so your SMTP settings, sender name and queue all apply.
- CSV export of any statement, the ageing report or the chase list.
- WhatsApp sharing with the balance and the age of the oldest invoice already written. No API, no account, no per-message fee.
- A dashboard widget, a send history, and supplier statements if you run a purchasing module.
Four things this refuses to get wrong
| Rule | Why |
|---|---|
| Currencies never mix | A balance in two currencies is two balances. One number would be wrong in both, and a collections call made from it is worse than no call. |
| Drafts and cancelled invoices never appear | Neither is a debt. Nor are payments recorded against them, which Perfex's own statement still subtracts. |
| Outstanding is computed, not read | An invoice's total, less payments against it, less credits applied. A status field cannot tell you what a part-paid invoice still owes. |
| One engine, both directions | Supplier statements run through the same tested ledger rather than a second copy that drifts. |
Tested, not just written
190 assertions across three suites: the arithmetic and exports, the real model against a real database, and the access rules that decide who may read whose statement.
One matters more than the others. The closing balance and the ageing total come from completely different queries, and they are asserted equal on every build. If they ever disagree, one of them is showing your customer a wrong number.
A schema check, because guessing is not a plan
Perfex publishes no schema reference. Rather than assume, the module ships a page that reads your database, confirms every table and column it needs, and tells you exactly what to correct if your install differs. Run it once after installing, before you trust a balance.
Who should not buy this
If you invoice in one currency, never need ageing, never send in bulk and never need a file, the statement built into Perfex is enough and you should keep your money.
If you want full bookkeeping, the Accounting and Bookkeeping module does that, including ageing, once you map invoices and payments into a chart of accounts. If you want collections workflow with cases, promises and disputes, two dunning modules do that properly. This is the document and the ageing, not the ledger and not the workflow.
Requirements
Perfex CRM 3.2 or newer, PHP 8.1 or newer, tested on 3.4.1. No third-party service, no subscription, no external API. Nothing phones home and nothing expires.
Full refund within 14 days if it does not do what this page says. Tell me what went wrong first, because most problems are a five-minute fix.