Checking a business against the benchmarks before lodgement is a useful review step, and it is usually done by hand: find the industry page, work out which turnover band applies, add up the right accounts and divide.
This tool does that on your own machine, with no network call in the runtime, and it records which account went into which figure so a second reviewer can check your working later. It applies the ATO’s own narrow definitions rather than a rough 'expenses over income': wages sitting inside cost of sales come out of that ratio, and payments to associated persons come out of total expenses before the division.
The workflow is 2 steps on purpose. First, the tool drafts a mapping from the profit and loss, suggesting a bucket for each account from its name alone. Then a person reviews and corrects that mapping, because no account name on its own tells you whether wages went to an associate.
What this tool does
- Reads a profit and loss and maps each account to the ATO’s benchmark categories, with a person reviewing that mapping before anything is compared.
- Applies the ATO’s own narrow definitions of turnover, cost of sales and total expenses, for example excluding wages inside cost of sales from that ratio and deducting payments to associated persons from total expenses.
- Prints the figures behind each ratio and shows whether it sits inside or outside the ATO’s published range.
Worked example: cost of sales excluding wages
This synthetic example comes from the ratio tests in ato-benchmark-compare v0.1.6. It starts with mapped totals:
- Turnover: $100,000.
- Cost of sales excluding wages: $30,000.
- Wages recorded within cost of sales, mapped separately: $10,000.
The cost of sales ratio is $30,000 ÷ $100,000 = 30%. The $10,000 of wages remains in reported total expenses, which are $40,000 in this example.
A person must review the mapping and select the relevant industry, year and turnover band before comparing that 30% with an ATO range. This example does not establish whether a business falls within a benchmark.
Reproduce this exact example
In a fresh folder, with Git and uv installed, run the test at the release used above:
git clone https://github.com/ryanduguid/australian-accounting.git
cd australian-accounting
git checkout ato-benchmark-compare/v0.1.6
cd packages/ato-benchmark-compare
uv run --locked --extra dev --python 3.12 pytest -q tests/test_ratios.py::test_cost_of_sales_ratio_excludes_wages_inside_cost_of_sales
Expected: one passing test and exit 0. The test asserts the figures above. The broader sample under Get it contains different inputs.
Limits
It is not tax advice, and sitting outside a range is not a finding that anything is wrong. The ATO publishes ranges because businesses differ.
Get it
Needs Python 3.11 or later. A command-line tool for whoever runs Python at your firm. Development checkout: these commands clone the default branch and install it, not a tagged release; the worked example above is pinned to a tagged release and names it.
git clone https://github.com/ryanduguid/australian-accounting.git
cd australian-accounting/packages/ato-benchmark-compare
pip install .
Source on GitHub · Primary source: the ATO’s small business benchmarks.
One known limitation is recorded against this tool. When a bucket a ratio needs is absent from the supplied totals, it reaches the command-line comparison as exactly the nil that a genuine zero produces, while the Python library marks it not_supplied. The two output paths differ in releases up to 0.1.7. Release 0.1.8 gates the command line on the same presence rules as the library, so a bucket no account was mapped to reads not_supplied on both. That is separate from a profit and loss account with no mapping entry, which stops the comparison with a mapping error before any ratio is produced. Check the required buckets, including income fields, before relying on a ratio. See Known limitations.
Software issue using fictional data? Open an issue or email with the tool named in the subject. If the email link does not open, the contact page spells the address out.
Common questions
What are the ATO small business benchmarks?
Ranges the ATO publishes for around 100 industries, showing the usual relationship between figures such as cost of sales and turnover. The ATO uses them to decide which businesses to examine.
Does being outside a benchmark range mean something is wrong?
No. Businesses differ, which is why the ATO publishes a range rather than a point. A ratio outside the range is a prompt to explain why.
Does this tool send my client data anywhere?
No. It runs on your own machine with no network call in the runtime, and it records which account went into which figure so a colleague can check the comparison later.
Why does a person have to review the account mapping?
Because no account name on its own tells you whether wages went to an associated person, and the ATO’s definitions turn on that. The tool drafts the mapping, a person corrects it, and only then is anything compared.