Open the chart of accounts for almost any struggling small business and you will find the same thing: 280 accounts, 90 of which have been used once, a dozen variations of "Office Supplies," and three accounts that nobody can explain. The owner can tell you exactly how much was spent at one particular vendor in 2022, but cannot tell you whether the business made money last quarter.
That is the paradox of a bloated chart of accounts. More accounts feel like more information. In practice they produce the opposite — a profit and loss statement so granular and so inconsistent that no one can read it. A good chart of accounts is not a filing cabinet with a drawer for everything. It is a reporting instrument, and like any instrument it works best when it is built to answer specific questions.
This guide walks through how to design a chart of accounts that actually tells you something: how to number it, how deep to nest it, when to use a sub-account versus a department or class, and how to recognize and cut the bloat that quietly makes financial statements useless.
What a Chart of Accounts Is Really For
A chart of accounts (COA) is the master list of every category your business uses to record money. Every transaction you book lands in one of these accounts, and every account rolls up into one of two reports: the balance sheet or the income statement.
The accounts fall into five families, and that order is not arbitrary — it mirrors the structure of your financial statements:
- Assets — what the business owns: cash, accounts receivable, equipment, inventory.
- Liabilities — what the business owes: accounts payable, loans, credit cards, unpaid taxes.
- Equity — the owners' residual stake: contributions, retained earnings, distributions.
- Revenue — what the business earns from its work.
- Expenses — what the business spends to operate, including the direct cost of what it sells.
The first three families build the balance sheet. The last two build the income statement. Everything you do in designing a COA is in service of making those two reports legible at a glance.
The test of a good chart of accounts is simple: when you print the income statement, can you look at any line and know what to do about it? If a line says "Miscellaneous — $14,200," the answer is no. That account is not telling you anything. It is hiding something.
Numbering: Build a Frame Before You Hang Anything
Account numbers are the skeleton. Even if your accounting software lets you work with names alone, a numbering scheme keeps accounts in a predictable order and makes the COA scannable.
The near-universal convention groups accounts by family in blocks of a thousand:
| Range | Account family |
|---|---|
| 1000–1999 | Assets |
| 2000–2999 | Liabilities |
| 3000–3999 | Equity |
| 4000–4999 | Revenue |
| 5000–5999 | Cost of goods sold |
| 6000–7999 | Operating expenses |
| 8000–9999 | Other income and expense |
Most small businesses do fine with four-digit numbers. A three-digit scheme works if you are very small and expect to stay that way, but four digits costs nothing and leaves far more room.
Two rules make a numbering scheme survive contact with reality:
Number in gaps. Do not assign 6000, 6001, 6002. Assign 6000, 6010, 6020 — or even 6100, 6200, 6300 for major groupings. When you inevitably need a new account between two existing ones, you slot it into the gap instead of renumbering everything below it. Leaving room is the single cheapest decision in COA design, and forgetting to do it is the most common regret.
Keep the first digit honest. A 6000-series number must always be an operating expense. The moment someone files a liability under a 5000 number "because it was close," your reports stop tying out and your numbering scheme has stopped doing its only job.
How Deep Should It Go? The Bloat Problem
Here is where most charts of accounts go wrong. Someone in the business asks a reasonable question — "How much are we spending on software?" — and the reflex is to create a new account. Then another. Then a separate account for each software vendor. The COA grows reactively, one well-intentioned account at a time, until it is unreadable.
This is COA bloat: the uncontrolled growth of ledger accounts created to satisfy reporting needs that should have been handled some other way. The mechanism is always the same — someone wants a new slice of data, so a new account gets added instead of a new attribute.
Bloat is expensive in ways that are easy to miss:
- Inconsistent coding. With 12 plausible places to book a software charge, two bookkeepers — or the same bookkeeper on two different days — will choose differently. Your trend lines become noise.
- Unreadable statements. A P&L with 140 expense lines is not more informative than one with 30. It is less informative, because no human can hold 140 numbers in mind.
- Slow closes. Every account is something to review, reconcile, and explain. Bloat turns a five-day close into a three-week one.
- Dead accounts. Half a bloated chart is accounts used once and abandoned, each one a small trap for a future miscoding.
As a rough benchmark, most small businesses need somewhere between 30 and 60 accounts in total. A handful of revenue accounts, a clean separation of cost of goods sold, 20 to 30 operating expense accounts, and the balance sheet accounts the business actually has. If your chart has 200 accounts and your business has 8 employees, the chart is not describing your business — it is describing every question anyone ever asked.
The discipline that prevents bloat is a single question asked before every new account: "Will I make a different decision because this line exists?" If splitting "Marketing" into "Facebook Ads" and "Google Ads" would change how you allocate budget, split it. If you would just glance at both numbers and move on, keep them together. An account earns its place by changing a decision, not by being theoretically distinct.
Accounts for Structure, Dimensions for Detail
Most bloat traces back to one mistake: using accounts to capture things that are not account-shaped.
A business does not just want to know what it spent money on. It wants to know where, for which project, in which location, for which customer. The wrong way to answer those questions is to multiply accounts:
6100 Payroll — Sales
6101 Payroll — Engineering
6102 Payroll — Operations
6110 Travel — Sales
6111 Travel — Engineering
6112 Travel — Operations
6120 Software — Sales
...Three departments and three expense types just produced nine accounts, and the COA still cannot tell you total payroll without addition. Add a fourth department and you are editing the chart again.
The right way is to keep one account per expense type and tag each transaction with the other facts:
6100 Payroll
6110 Travel
6120 SoftwareThe department — Sales, Engineering, Operations — is a separate field on the transaction. Accounting software calls this field different things: a class or location in QuickBooks, a tracking category in Xero, a dimension in Sage Intacct and NetSuite. The principle is identical. The account answers what kind of cost. The dimension answers which part of the business.
This separation has a compounding payoff. With one Payroll account plus a Department dimension, you can produce total payroll, payroll by department, total travel, travel by department, and total spend by department — all from the same data, no addition required. With nine duplicated accounts you can produce exactly one of those views and have to sum the rest by hand.
A useful rule of thumb: if a label describes the nature of the money, it is an account. If it describes a context the money happened in — a department, a project, a location, a customer, a grant, a funding round — it is a dimension. Plain-text accounting tools lean into this idea directly: in Beancount, you tag postings with metadata or use account hierarchies and let the reporting layer slice the data, rather than hard-coding every combination into the chart itself.
Sub-Accounts: Useful in Moderation
Sub-accounts — nesting a child account under a parent — are the legitimate, structural form of detail. 6200 Insurance with children 6210 General Liability, 6220 Workers Comp, and 6230 Health Insurance is reasonable: those are genuinely different costs, they behave differently, and a manager might act on each.
Sub-accounts earn their place when:
- The parent total is something you report on, and
- Each child is something you would separately investigate or act on.
They become bloat when they drift below the level of any real decision. Splitting Office Supplies into Paper, Pens, Toner, and Sticky Notes fails the test — nobody manages a sticky-note budget. One Office Supplies account is the honest level of detail.
Two practical limits: keep nesting to two levels deep at most — parent and child — because a third level is almost always a dimension wearing a disguise. And never post transactions to a parent account that also has children; post to the children and let the parent roll up, or your reports will double-count.
Separate COGS From Operating Expenses
One structural decision matters more than any other for a business that sells a product or a billable service: cost of goods sold must be its own block, separate from operating expenses.
Cost of goods sold (COGS) is the cost directly tied to delivering what you sell — materials, the labor that builds the product, merchant fees on a sale, subcontractors on a billable project. Operating expenses are the costs of simply existing — rent, the accounting subscription, the office manager's salary.
The separation is what produces gross profit — revenue minus COGS — the single most important number on a small business income statement. Gross profit tells you whether the core thing you do is profitable before overhead. If COGS is scattered into the 6000s alongside rent, gross profit is unknowable, and you have lost the most actionable line in your reporting. Keep COGS in the 5000s, operating expenses in the 6000s, and the statement does this math for you automatically.
Keep Books Clean From Day One
A chart of accounts is most valuable when it is built before the transactions start flowing — and most painful to fix afterward. Restructuring a live COA means remapping historical data, and the longer you wait, the more history there is to remap.
This is where plain-text accounting has a real advantage. Because Beancount.io stores your entire ledger as readable, version-controlled text, restructuring the chart is a transparent, reviewable change rather than a black-box migration — and the account hierarchy plus metadata gives you the accounts-for-structure, dimensions-for-detail split by design. You can explore your numbers in Fava, the visual dashboard, without ever losing the ability to see exactly what changed and why. Get started for free and build a chart of accounts that answers questions instead of hiding them.
A Quick Checklist
Before you call a chart of accounts finished, run it past these:
- Accounts are numbered in family blocks, with gaps for future growth.
- COGS sits in its own range, separate from operating expenses.
- Total account count is proportional to the business — tens, not hundreds.
- Every account would change a decision; nothing exists "just in case."
- Department, project, and location live in dimensions, not duplicated accounts.
- Sub-accounts go two levels deep at most, and parents are never posted to directly.
- You review the whole chart at least once a year and retire dead accounts.
Get those right and your income statement stops being a wall of numbers. It becomes what it was always meant to be — a short, honest report that tells you what is working, what is not, and where to look next.
Sources
- Best Practices for Customizing Your Chart of Accounts — FreshBooks
- Chart of Accounts: Definition, Best Practices, and Examples — NetSuite
- How to improve your chart of accounts — AccountingTools
- 6 Tips for Optimizing Your Chart of Accounts — Ramp
- Common Chart of Accounts Mistakes Small Businesses Make — KMK Ventures
- Multidimensional accounting — Intuit