erpification.com  ·  the definition, and the service

Erpification  /  Guides  /  Chart of accounts

A chart of accounts you will not regret

Design from the decisions you make, not the chart you inherited. Three of those decisions are one-way doors. Everything else you can change on a wet Tuesday.

Three decisions in a chart of accounts are irreversible. The segment list itself, and which of those segments every transaction must carry. The grain of each natural account, because an account can never be split backwards. And which facts you pushed into the chart instead of leaving in the subledger, because from then on two lists have to be kept in step forever. Account names, numbering, report hierarchies, new values inside a segment you already have, anything computed in the reporting layer: all of that is cheap, and you can change it in an afternoon.

Most advice here points at a long redesign of the whole chart. This page points at three decisions and then tells you to stop. It is written for the first real ERP: one controller, an external bookkeeper, a decade of QuickBooks or Sage history, two or three cities, no FP&A team.

What is locked and what is free

Everyone knows a chart of accounts is hard to change later. Which parts, and how hard, is the part you can act on. There are only three answers: free, forward only, and never.

The changeReversible?What it costs
Add a segment every line must carryNever, in practiceNothing already posted has a value for it. Choose between blank history and a reimplementation.
Make an optional segment mandatoryForward onlyEvery report grouped by it stays wrong for earlier periods, and the report still runs.
Add a value inside an existing segmentFreeA request form and one approval.
Split one account into twoNever backwardsOpen the second account today. Last year stays merged unless you rekey or restate.
Merge two accounts into oneFreeHistory keeps the detail it already has.
Rename or renumber an accountFreeOne mapping line and a note in the close file.
Rebuild a report hierarchy or rollupFree, as often as you likeNo posting is touched.
Derive a measure in the reporting layerFreeNothing in the chart changes.
Encode a fact a subledger already holdsNever cheap againTwo lists to keep in step for the life of the system. They drift within a year.

Forward only is the quiet killer. A segment added in month fourteen looks like it worked, because new transactions carry it. Then every year-on-year comparison built on it is wrong for a year, and whoever is asked why the two halves of a comparative disagree finds out first.

The five-way placement test

The question is usually posed as a choice of two: a new account, or a new dimension. There are five places a fact can live, and the order you ask in is the method. Stop at the first one that fits.

  1. Subledgera record already carries it
  2. Natural accountthe nature of the money differs
  3. Segmentevery line can answer it
  4. Tag or flagtrue of some lines only
  5. Reporting layerderivable from the rest

Ask in this orderStop at the first place that fits. Most bad charts fail at question one, encoding customers, sites or projects as segment values.

One: does a subledger record already carry this? Customer, vendor, item, project, employee, fixed asset, site. If one of them does, it is not a segment, ever. The commonest mid-market failure is a segment value per customer or per site: the segment list then has to be maintained alongside the customer list for the life of the system, and nobody owns both.

Two: does it change the nature of the money? A salary is not a rent. Natural account.

Three: is it a stable, finite list of places the money belongs that every transaction can answer? That, and only that, is a segment.

Four: is it true of some transactions and unanswerable for others? A tag, or a flag on a master record. Never a required segment.

Five: can it be derived from the other four? Build nothing, and compute it in the reporting layer.

Locked one: the segment list, and what it costs to carry

Count the segments you intend to make mandatory. For each one, name the master record the value defaults from: vendor, customer, item, employee, site, or the user's profile. A segment with no default source is one a human types on every line, and a finance team of two can sustain exactly one of those.

Candidate segmentDefaults fromVerdict
Site or branchCustomer record, or the user's profileMandatory, defaulted, safe
Department or cost centreEmployee record, vendor recordMandatory, defaulted, safe
Product lineItem recordMandatory, defaulted, safe
ProjectNothing. It is a subledger recordReport it from the project ledger
Funding source, campaign, initiativeNothing. A human types itAt most one typed segment in the design

A dimension you can neither default nor make mandatory should be deleted from the design. Partially populated is worse than absent: the report under-reports quietly, the total still looks plausible, and nobody finds out until somebody ties it back to the trial balance.

Cause and effect get stated backwards here more often than not. The structure is rarely the binding constraint; coding at the moment of entry is. Four dimensions produce rubbish if the dimension is optional on the purchase invoice screen, if the default on the vendor record is wrong, or if the integration from the field app posts everything to one code. Which dimensions are defaulted, typed, or enforced by validation belongs in the process design stage, with the chart itself.

Locked two: the grain of each account

This is the only irreversible choice inside the account list, and it has a one-question test. For any two things posting to the same account, ask whether you would ever need to see them apart for a period that has already closed. If yes, separate accounts from day one: a segment added later is populated going forward only, and one account can never be split backwards. If no, merge them, because a sibling account next year is free.

Travel and meals: split, because the tax treatment differs and you will be asked about prior years. Courier and postage: merge, because nobody has needed those apart for a closed month. Run the test down the chart and you land on the coarsest set of accounts that still produces every line below.

Locked three: what you pushed into the chart

The first two locks are choices you can see on a design document. This one is invisible until it has already happened, so it needs a test you can run on a finished design.

The test: for each segment, name who adds a value, and what else that person has to add at the same moment. If opening a new customer, site, project, vendor or employee also requires somebody to open a matching segment value, that fact is pushed. You now have two lists that mean the same thing, maintained by two different hands, and only one of them refuses to post when it is wrong. The customer list refuses. The segment list silently accepts the stale value, which is why the drift is always discovered from the reporting side.

Run it on every mandatory segment. One answer of “and a matching code” is a design defect worth fixing before go-live. Two means the chart is already being maintained twice, and the second copy has no owner.

The reason respectable designs fail this test is almost always the same, and it is worth naming: somebody tried to make one chart serve statutory, management and consolidation reporting natively, and encoded a fact for each. The three are listed as objectives everywhere. What to do when they disagree is not, and they do disagree: a tax line that needs its own account in one entity and must disappear in the group pack, or a subsidiary that needs a segment the others cannot populate.

That is settled by a decision, not by a cleverer design. Pick the one reporting view the chart serves natively and serve the others by mapping. For twenty to two hundred people it is usually management reporting, because that is the pack somebody reads monthly, while statutory output is produced a few times a year from a mapping an accountant maintains. Choosing the other way round is defensible. Not choosing is how facts get pushed.

PlaceAdded after go-liveApplies to closed periodsWho maintains the listLeft blank meansSurvives a migration
Natural accountFree to add, never to splitYesControllerCannot be blankYes, it is the ledger
SegmentForward onlyNoOne named owner eachReports under-reportUsually, with a mapping
Subledger recordFreeYes, attributes restatableThe function that owns itIt will not postYes
Tag or flagFreeYes, can be set laterWhoever asked for itNothing breaksOften not
Report hierarchyFree, any number of timesYes, retroactivelyWhoever writes the packNot applicableRebuilt, not migrated

The sequence, run backwards from how most projects run it

Most projects start from the chart they have and tidy it. Start from the outputs instead.

01 Write the outputs first

  • aThe monthly management pack: actual pages, actual lines, actual cuts
  • bThe statutory and tax outputs each entity owes
  • cThe questions you were asked last year and could not answer

02 Derive, do not invent

  • dKeep only segments that appear on more than one of those outputs
  • eNatural accounts: the coarsest set that still produces every line

03 Protect the history

  • fBuild the legacy to new mapping and check it is many-to-one
  • gFreeze the legacy chart, no new accounts, before cutover

Outputs firstA segment that appears on only one report is a report, not a segment. The freeze at step g stops the old chart growing a tail while you are migrating it.

The mapping table decides how much history you keep

Not migrating the legacy chart as-is is advice about the target. It says nothing about the twelve years of transactions you still report against. Legacy accounts must map many-to-one onto new accounts. Wherever one legacy account maps to two new ones, you have a choice with no third option.

One legacy account has to become two new accounts. The history cannot be split.

Option one

Let history collapse

Everything posted before cutover sits in one of the two. Year one comparatives are produced on the merged line, with a note, and the split starts at cutover.

Option two

Keep the legacy trial balance readable

Hold the old trial balance as a read-only side by side. It costs a decision about where it lives and who may read it, and it answers questions about the old years.

Decide this account by account, in writing, before cutover, and never during the load weekend, where the only hands available belong to people who do not own the answer. The mapping table is a permanent deliverable: whoever gets a question about the old years has to be able to read it, and that may be an auditor three years from now. How much history to carry, opening balances against full detail, is covered in the data migration checklist.

Six counts on the chart you have, before you design anything

Run these against the live file. They take an afternoon.

  1. Accounts with zero postings in the last twelve months.
  2. Accounts whose name contains Other, Misc, Sundry, a year, a person's name or a city.
  3. Families of accounts that differ only by a dimension you already have: Travel Sales, Travel Ops, Travel Admin.
  4. Segment combinations used fewer than three times in the year.
  5. Accounts that exist because one person wanted one report, once.
  6. Whether the monthly pack and the tax return come from the chart directly, or from a spreadsheet that remaps it.

The sixth count is the one that matters. If a spreadsheet sits between the chart and every output anyone reads, the chart has already failed and the spreadsheet is the real chart of accounts. Design the new chart to produce what that spreadsheet produces. If the file you are counting is QuickBooks or Sage, settle first whether you need new software at all: outgrown QuickBooks, or outgrown your process.

§

The whole governance policy, in five lines

Chart governance is usually written as a twenty-page policy that is never reopened after sign-off. Five lines, enforced by whoever closes the month, does the same work, because the enforcement is what governs.

Clearing discipline is what keeps a clean chart clean. A chart does not degrade through bad design. It degrades one convenient account at a time, each one opened to park something for a month. That is failure by accretion rather than by decision, which is the shape most of them take: why implementations fail traces each mode back to the stage where nobody was watching.

Before you redesign anythingIf you are not certain the business needs a new system at all, start with the readiness check. Twenty scored statements, and it tells you when the honest answer is no.

Read next