chartofaccounts.uk

Chart of
Accounts
Design

How the world's leading ERP systems solve the hardest problem in finance — and why data explosion changes everything.

Oracle EBS — Flex Fields & Descriptive Flex Fields
Workday — Worktags
JD Edwards — Subledger, Category Codes & Subsidiary
Epicor — Controlled & Dynamic Segments
Dynamics — Business Unit Model

The Fundamental Question

What dimensions do you want to measure?

Every chart of accounts design starts with the same question. The answer determines the architecture of your entire finance system — and makes the difference between elegant reporting and a maintenance nightmare.

Type 1 — Double Entry Dimensions

These are the segments that must balance. Every debit requires a matching credit. They form the structural backbone of your general ledger.

CompanyLegal entity — must balance
DepartmentCost centre — drives trial balance
DivisionBusiness unit — segment P&L
AccountNominal — the core classification

Type 2 — Analysis Dimensions

These dimensions do not need to balance. They tag transactions for reporting and analysis without creating ledger obligations — and this distinction is critical to avoiding data explosion.

ProjectAnalysis — does not need to balance
CustomerAnalysis — does not need to balance
ProductAnalysis — does not need to balance
EmployeeAnalysis — does not need to balance

When ERP systems force analysis dimensions into the main account structure, the result is data explosion.

Dimension Type Needs Balance? Impact on Account Count Recommended Approach
CompanyDouble Entry✓ YesMultiplicativeControlled segment
DivisionDouble Entry✓ YesMultiplicativeControlled segment
Cost CentreDouble Entry✓ YesMultiplicativeControlled segment
Nominal AccountDouble Entry✓ YesMultiplicativeControlled segment (150–300 max)
ProductAnalysis✗ NoExplosive if in GLEpicor: Dynamic Segment
Workday: Worktag
Oracle: DFF
JDE: Subledger / Category Code
ProjectAnalysis✗ NoExplosive if in GLEpicor: Dynamic Segment
Workday: Worktag
Oracle: DFF
JDE: Subledger / Category Code
EmployeeAnalysis✗ NoExplosive if in GLEpicor: Dynamic Segment
Workday: Worktag
Oracle: DFF
JDE: Subledger / Category Code
CustomerAnalysis✗ NoExplosive if in GLEpicor: Dynamic Segment
Workday: Worktag
Oracle: DFF
JDE: Subledger / Category Code
VendorAnalysis✗ NoExplosive if in GLEpicor: Dynamic Segment
Workday: Worktag
Oracle: DFF
JDE: Subledger / Category Code

Data Explosion — why more segments destroy your chart of accounts

The moment analysis dimensions are baked into the main GL structure, account counts multiply catastrophically. This is the single biggest design failure in ERP implementations.

A typical mid-size business

Companies
5
Divisions
10
Cost Centres
50
Nominal Accounts
250
Core GL combinations
625,000

5 × 10 × 50 × 250 = already unmanageable

Now add analysis dimensions…

If you embed customers, products and vendors into the GL account structure, the combinations multiply to an impossible number.

1,000 Customers
500 Vendors
2,500 Products
// Theoretical account combinations
625,000
× 1,000 // customers
× 500 // vendors
× 2,500 // products
= 781,250,000,000,000
// 781 trillion possible accounts

This is why dynamic segments, worktags, descriptive flexfields and category codes exist — they decouple the analysis from the core GL structure, providing rich reporting without creating astronomical account proliferation.

The golden rule of chart of accounts design

If a dimension does not need to balance, it should never be a controlled segment in the main GL. Analysis metadata belongs outside the core account string — attached to transactions, not embedded in account codes.

System Architecture

How each ERP system solves the problem

Every major ERP vendor has developed a mechanism for capturing analysis data without forcing it into the core GL structure. Here is how they compare — and how each performs against the data explosion challenge.

Oracle EBS
Key Flexfields & Descriptive Flexfields

Oracle separates the chart of accounts into Key Flexfields (KFF) — the structural segments that form the GL account — and Descriptive Flexfields (DFF) — configurable additional fields attached to transactions, invoices, or any entity. DFFs can be context-sensitive, appearing only when certain conditions are met. This gives powerful analysis capability without polluting the core account structure.

Does NOT create new GL accounts
Workday
Worktags

Workday's architecture is built around the concept of Worktags — dimension values tagged to financial transactions at the line level. The core account string stays clean (ledger account + cost centre), while worktags capture everything else: project, grant, fund, programme, region, customer, supplier, etc. Reporting is multi-dimensional by design. Worktags are the purest implementation of analysis-outside-the-account-string.

Does NOT create new GL accounts
Microsoft Dynamics / JD Edwards
Business Unit Model

Dynamics uses a Business Unit + Account model where the financial dimension is the primary unit of balance. Additional financial dimensions (department, cost centre, project) can be configured. However, each unique combination of dimensions that is posted to creates a distinct account combination — which means careful design is essential to avoid combinatorial explosion in the account framework table.

Combinations can grow rapidly
JD Edwards
Subledger, Category Codes & Subsidiary

A JDE account has four parts: Business Unit . Object . Subsidiary . Subledger. The Subledger is the fourth element — it acts as a descriptive field attached to journal lines, capturing the specific entity (customer, supplier, asset, employee) behind a transaction without creating new GL accounts. Combined with Category Codes (up to 23 configurable UDC fields on the Business Unit and Account masters), JDE provides rich analysis whilst keeping the core account structure compact.

Subledger & Category Codes do NOT create new GL accounts
Epicor
Controlled & Dynamic Segments

Epicor's architecture distinguishes between Controlled Segments — which form real ledger accounts requiring double-entry — and Dynamic Segments — which are applied via posting rules and do not create ledger accounts. Dynamic segments are tagged automatically by transaction type, line item context, or user input, delivering rich multi-dimensional analysis without the account explosion problem. Up to 20 segments with multi-book and multi-company capability.

Dynamic segments do NOT create GL accounts

Oracle EBS

Flexfields — separating structure from analysis

Key Flexfields (KFF)

The Key Flexfield defines the Accounting Flexfield — the actual GL account structure. Segments within the KFF form real accounts in the general ledger. Each unique segment combination that receives a posting becomes a code combination ID (CCID). Oracle enforces cross-validation rules to prevent invalid combinations from being created.

A typical Oracle EBS account string might look like:

01 . 110 . 4100 . 000 . 0000
// Company . Dept . Account . Sub-account . Future

The problem arises when organisations embed product lines, customers or projects into KFF segments — instantly multiplying the CCID count into the millions.

Descriptive Flexfields (DFF)

Descriptive Flexfields are configurable attribute columns attached to Oracle's standard tables. They appear in transaction entry screens as additional fields. Crucially, they do not create ledger accounts — they store metadata against the transaction line.

DFFs can be context-sensitive: different segments appear based on the value of a context field. For example, a DFF on AR Invoice lines might show "Project Code" and "Grant Reference" only when the account is an expense type.

-- DFF segments stored on transaction, not account
AP_INVOICE_LINES_ALL.ATTRIBUTE1 -- Project
AP_INVOICE_LINES_ALL.ATTRIBUTE2 -- Region
AP_INVOICE_LINES_ALL.ATTRIBUTE3 -- Product Line
-- No new GL accounts created ✓
Key insight: Use KFF segments only for dimensions that must balance. Move everything else to DFFs. A well-designed Oracle implementation has 150–300 active CCIDs, not 300,000.

Workday

Worktags — the purest multi-dimensional approach

Workday was designed from inception for multi-dimensional finance. The architecture is fundamentally different from legacy ERP systems: the ledger account is kept deliberately simple, while Worktags carry all the analytical richness.

A Workday journal entry might have an account of simply 4000 — Sales Revenue with the following worktags attached:

Account: 4000 Sales Revenue
Cost Centre: CC-EMEA-NORTH
// Worktags — no GL accounts created:
Region: United Kingdom
Product: Enterprise Software
Customer: Acme Corporation
Sales Rep: J. Smith
Campaign: Q1-2026-EMEA
// Same nominal account: 4000 — just tagged ✓

Why this eliminates data explosion

Because worktags are metadata on transactions, not structural account segments, there is no combinatorial multiplication. 1,000 customers × 2,500 products does not create 2.5 million accounts — it creates zero new accounts. The analysis lives in the worktag index.

Workday's reporting engine (Prism Analytics, Adaptive) natively understands worktags and can pivot, filter and aggregate along any dimension in real time.

Design principle: In Workday, your chart of accounts can be as lean as 200–400 accounts. Worktags do the heavy lifting for reporting. This is the system architecture working as intended.

Worktag types

Workday provides built-in worktag types and allows custom types. Common examples include: Cost Centre, Region, Fund, Grant, Program, Project, Customer, Supplier, Product, Initiative, and Custom dimensions.

JD Edwards

Subledger, Category Codes & Subsidiary — four dimensions in one system

The JDE Account Structure

JD Edwards uses a four-part account structure: Business Unit . Object . Subsidiary . Subledger. Each element serves a distinct purpose, and understanding the difference between Subsidiary and Subledger is critical to good JDE design.

BUSINESS UNIT . OBJECT . SUBSIDIARY | SUBLEDGER
// Example journal line:
100 . 4000 .      | C-00452
// UK Co, Sales Revenue, (no sub) | Customer 00452

100 . 1200 .      | C-00452
// UK Co, AR Control, (no sub) | Customer 00452

100 . 6000 . MGMT | E-00712
// UK Co, Salaries, Mgmt sub | Employee 00712

The Subledger — JDE's descriptive field

The Subledger is the fourth element of the JDE account string and acts as a descriptive identifier attached to journal lines. It captures the specific entity behind a transaction — a customer number, supplier number, fixed asset, employee ID, or any reference — without creating new GL accounts.

The Subledger has a Type (e.g. A = Address Book, W = Work Order) which tells JDE what kind of entity the subledger refers to. This means the same nominal account 1200 AR Control can carry thousands of customer subledger values whilst remaining a single GL account.

Key insight: The Subledger is JDE's equivalent of Workday's Worktag or Oracle's DFF — it attaches analysis metadata to the transaction line without multiplying GL accounts. A receivables ledger with 1,000 customers still has just one AR Control account (1200) — the customer identity lives in the Subledger field.

Subsidiary vs Subledger — an important distinction

These two are often confused but serve very different purposes:

ElementPurposeCreates GL Account?Example
SubsidiarySub-classification of the Object account — part of the structural account code✓ Yes — it forms part of the account combination6000.MGMT, 6000.SALES, 6000.OPS
SubledgerDescriptive entity identifier on the journal line — who or what the posting relates to✗ No — stored as metadata on the transactionCustomer C-00452, Supplier S-00123, Asset A-007

The Subsidiary should be used sparingly — only where a genuine structural sub-classification is needed that must appear on the trial balance. Overuse of Subsidiary leads to account proliferation just like any other structural segment.

Category Codes in practice

On top of the account structure, JDE provides up to 23 Category Codes on the Business Unit master and additional codes on the Account master. These are UDC (User Defined Code) fields — completely configurable — holding product line, region, manager, reporting group, or any analytical dimension.

Category codes drive Smart Fields in JDE reporting, enabling roll-ups across business units and accounts without embedding those dimensions in the account number itself.

Best practice: Keep the Object account to 150–300 codes. Use the Subledger to identify the entity behind each posting (customer, supplier, employee). Use Subsidiary only for structural sub-classifications that must balance. Use Category Codes for all other analytical reporting dimensions.

Epicor

Controlled & Dynamic Segments — the most flexible architecture

Epicor's chart of accounts design is widely regarded as one of the most sophisticated in the ERP market. The distinction between controlled and dynamic segments gives finance teams the best of both worlds.

Epicor account structure — how segments work together

01Company
EMEADivision
CC100Cost Centre
4000Account
Creates GL Account ✓
PROD-AProduct
CUST-99Customer
PROJ-42Project
EMP-007Employee
Tagged to Transaction — NO new account
Controlled Segment — creates real GL accounts, requires double entry
Dynamic Segment — attached to transaction, does not create GL accounts

Controlled Segments

Controlled segments form the actual general ledger account structure. Every unique combination of controlled segments that is posted to creates a distinct GL account that appears on the trial balance, balance sheet, and P&L. These are your structural dimensions — the ones that must balance.

Epicor supports up to 20 configurable segments, but best practice is to keep controlled segments to 4–6 maximum to avoid the combination explosion described above.

Posting Rules — the automation engine

One of Epicor's most powerful features is its Posting Rules engine. These XML-driven rules automatically assign dynamic segment values based on transaction context — eliminating manual user input and ensuring consistent tagging.

<TranTypeID>ARInvoice</TranTypeID> <PostingRules> <Rule> <RuleID>ARINV_REV_ARCTL</RuleID> <Lines> <Line> <NaturalAcct>4000</NaturalAcct> <Segments> <!-- Dynamic: auto-tag customer from invoice --> <CustNum>InvcHead.CustNum</CustNum> <!-- Dynamic: auto-tag product from line --> <ProdCode>InvcDtl.ProdCode</ProdCode> </Segments> </Line> </Lines> </Rule> </PostingRules>

Dynamic Segments

Dynamic segments are the key innovation. They are applied at transaction level — derived automatically from the source document through posting rules, or entered by the user — but they do not create entries in the GL account master. They are stored against the journal line and indexed for reporting.

This means you can have 1,000 customers, 2,500 products and 500 projects as dynamic segment values, and still have only 625 controlled GL accounts. Your reporting engine can slice and dice across any combination.

Epicor capabilities summary
  • ✓ Up to 20 segments total
  • ✓ Multi-book & multi-calendar
  • ✓ Multi-company & multi-currency
  • ✓ Central chart mapping across companies
  • ✓ XML-driven posting rules for auto-tagging
  • ✓ BAQ (Business Activity Query) for ad-hoc reporting across all dimensions

Multi-book / Multi-calendar

Epicor allows subsidiary ledger books with different charts, currencies and calendars to post alongside the main book — enabling IFRS vs local GAAP, consolidation adjustments, and statutory reporting without a separate system.

Design Principles

Building a chart of accounts that lasts

Whether you are on Oracle, Workday, JD Edwards or Epicor, the principles of good chart of accounts design are the same. The system mechanism differs; the philosophy does not.

RULE 01

Keep nominal accounts to 150–300

Revenue, Cost of Sales, Operating Expenses — the nominal account classifies the nature of the transaction. It should not describe the business dimension. One account for Sales Revenue, not one per product line.

RULE 02

Separate structure from analysis

Ask of every proposed segment: does this need to balance? If no, it should be a worktag, DFF, category code or dynamic segment — not a controlled structural segment. Enforcing this separation protects your system for years.

RULE 03

Design for reporting, not data entry

Your chart of accounts is a reporting structure first. Design it top-down: start with the reports you need, then determine the minimum segments required to produce them. Not the other way around.

A well-structured nominal account — 150–300 codes

REVENUE
4000Sales Revenue
4100Service Revenue
4200Other Income
4300Royalties
COST OF SALES
5000Cost of Goods Sold
5100Direct Labour
5200Freight & Duties
5300Manufacturing O/H
OPERATING EXPENSES
6000Salaries & Wages
6100Payroll Taxes
6200Rent
6300Utilities

The anti-pattern to avoid

A chart of accounts where the same concept is repeated per-product-line or per-customer is a design failure. If you have 400010 Sales A, 400020 Sales B, 400030 Sales C — you have embedded an analysis dimension (product line) into the nominal account. This is data explosion in progress. You should have one 4000 Sales Revenue account with product line captured as a worktag, DFF, category code or dynamic segment.