1. Paste your invoices
2. What it found
Clients by share of revenue
| Client | Revenue | Share |
|---|
Findings
| Rule | Level | Detail |
|---|
Prefer a CLI, or want a monthly check?
Same logic, zero dependencies, one command — reads a file or stdin:
node cli.mjs analyze invoices.csv cat invoices.csv | node cli.mjs analyze - node cli.mjs analyze invoices.csv --costs 24000 --months 12 node cli.mjs analyze invoices.csv --warn-top1 20 --json --fail-on warn
Get cli.mjs and engine.mjs — Node 18+, nothing to install, no network call. Exit code 1 on a finding, so a cron job or CI step can tell you the month a client crosses the line. More: How much revenue from one client is too much, and what to do about it.
What's recognised
| Input | Handling |
|---|
Warning levels are rules of thumb (25% / 40% for one client, 60% / 80% for the top three); invoice date, not payment date, is used; contract length, churn risk and how easily a client could be replaced are not modelled.
Common questions
Does this connect to my accounting software?
No. It reads the invoice rows you paste and never contacts QuickBooks, Xero, FreshBooks, Stripe or any bank. Every figure is arithmetic on the rows you gave it, so nothing here leaves your device.
How do I get the numbers?
Export an invoice or sales-by-customer report from your accounting tool and keep three columns: customer, invoice date and amount. A header row is read by name, so most exports paste as they are. Date is optional; with dates the last 12 months are used.
What counts as too concentrated?
There is no legal line. Lenders, acquirers and insurers each pick their own, and 25% of revenue from one client is a common level at which they start asking questions, 40% a level at which they often price the risk in. The tool uses 25/40 for one client and 60/80 for the top three as defaults you can change.
What is the effective number of clients?
One divided by the sum of each client's squared share. Ten clients of equal size give 10; one client at 70% and nine small ones give about 1.9. It says how many equal clients your revenue behaves like, which is a better guide than a raw count.
Is my data uploaded anywhere?
No. The browser page runs on the text in your own browser and never sends it anywhere. The CLI reads a local file or stdin and makes no network call.