Financial Report Structure
You have added a GL code — say EXPENSE-MARKETPLACE, for the commission the online marketplaces take from GadgetSphere Online — and it has movement in the ledger, and it is nowhere on the profit and loss. By the end of this page you will know why (its category is not linked to a report section), how to fix it in two minutes, and how the whole statement is put together, so that the next code you add lands on the right line the first time. There is one rule the engine applies that no screen shows you, and it is in the section Which sections are P&L.
The Chart of Account applet page lists every field on the screens involved; the Financial Report applet page describes how the month-end and snapshot engine runs. This page is about the structure they share.
Meet GadgetSphere
GadgetSphere’s three companies share one chart shape: mnemonic codes such as SALES-SMARTPHONE-KV01, COST-LAPTOP, EXPENSE-RENTAL, LIAB-SST-OUTPUT. Each code sits in a GL category (Sales – Smartphones, Cost of goods – Laptops, Rental), and each category is linked to one report section (SalesRevenue, CostOfGoodsSold, GeneralExpenses). The finance team is about to add the marketplace-commission code to GSO, and the balance sheet of GSD is missing a bank account somebody created last quarter.
Three levels, one join
A financial statement in BigLedger is assembled from three levels, and the middle one is the one people forget:
| Level | Record | What it is for | How many |
|---|---|---|---|
| Report section | bl_fi_report_section_hdr | A line of the statement — Sales Revenue, Current Assets, Retained Earnings. The engine decides P&L versus balance sheet by the section’s code | 90 of 90 tenants, typically 19 |
| GL category | bl_fi_mst_gl_category_list_hdr | A group of GL codes — Sales – Smartphones, Rental. Where a GL code is filed | 70 of 90 tenants, typically 81 |
| GL code | bl_fi_mst_glcode | The account you post to. Each GL code belongs to exactly one category | — |
The section and the category are joined by a link record, bl_fi_report_section_gl_category_link — one row that says “this category appears under this section”. You make it on the GL Category screen’s GL Section tab. It is present in 67 of 90 tenants, typically 72 links per tenant — that is, most categories are linked, not all.
Every report query in the engine — the month-end summary, the trial balance, the balance-sheet closing figures, the retained-earnings opening — walks the same path: GL code → its category → the link → the section. It is an inner join at every step, which means:
- A GL code with no category is invisible to every report.
- A category with no link to a section is invisible to every report, and so is every GL code in it. This is the
EXPENSE-MARKETPLACEproblem, and it is the single most common reason a figure is “missing” from a statement. Three of the 70 tenants that hold categories hold no links at all, so no statement can show a figure for them. - A category linked to two sections appears under both, and its GL codes are counted twice. Nothing stops you creating the second link — the link validator checks that the section and the category exist, and nothing else — so if a subtotal is too high by exactly one category’s balance, look for a double link.
The sections every tenant starts with
When a chart of accounts is created with the default GL codes, BigLedger seeds eighteen report sections, and a platform migration added a nineteenth (Dividend) to every tenant. That is the “19” you see in almost every tenant. The codes matter, because the engine matches on them — do not rename these:
| Section code | Statement | What goes under it |
|---|---|---|
SalesRevenue | P&L | Sales income |
SalesExpenses | P&L | Selling costs — marketplace commission, card fees, marketing |
CostOfGoodsSold | P&L | Cost of stock sold |
CostOfGoodsSold-Gains | P&L | Gains that reduce cost of sales |
CostOfGoodsSold-Expenses | P&L | Expenses that add to cost of sales |
GeneralExpenses | P&L | Rent, wages, utilities |
OtherRevenues | P&L | Interest received, sundry income |
OtherExpenses | P&L | Interest paid, sundry expenses |
TaxExpenses | P&L | Income tax |
Dividend | P&L | Dividends declared |
ProfitLoss | P&L | The result line |
CurrentAssets | Balance sheet | Cash, receivables, stock |
FixedAssets | Balance sheet | Property, fittings, equipment |
FixedAssets-AccumulatedDepreciation | Balance sheet | Accumulated depreciation |
OtherAssets | Balance sheet | Deposits, long-term receivables |
CurrentLiabilities | Balance sheet | Payables, SST payable, accruals |
LongTermLiabilities | Balance sheet | Loans, hire purchase |
ShareCapital | Balance sheet | Paid-up capital |
RetainedEarnings | Balance sheet | Accumulated profits — read specially, see below |
You can add sections on the GL Section screen (it writes the same table), and a tenant whose chart was created with a custom default list from an applet setting may have different ones. Adding is safe. Renaming a seeded code is not, for the reason in the next section.
Which sections are P&L — the rule no screen shows
The engine carries a fixed list of eleven section codes that it treats as profit and loss: SalesRevenue, SalesExpenses, CostOfGoodsSold, CostOfGoodsSold-Gains, CostOfGoodsSold-Expenses, GeneralExpenses, OtherRevenues, OtherExpenses, TaxExpenses, Dividend, ProfitLoss. Everything else is balance sheet. The list is in the code, not in any table or setting, and there is no flag on a section to change it.
Two consequences:
- A section you create —
MarketplaceFees, say — is a balance-sheet section, whatever you call it. If you want a new P&L line, put the category under one of the eleven and use the category name as the line. RetainedEarningsis read by name. The balance sheet’s retained-earnings line is the opening balance of the section whose code is exactlyRetainedEarnings, and the month-end retained-earnings journal sums the ten P&L sections other thanProfitLoss. Rename either and the balance sheet stops balancing.
There is no ordering column on a section. The statement shows sections in whatever order the screen sorts them; you cannot number them, and a section named to sort first will not.
Procedure: make a new category appear on the statement
Chart of Account → GL Category → Create; then the GL Section tab
The outcome: EXPENSE-MARKETPLACE shows on GSO’s profit and loss under Sales Expenses.
- Create the category. Name
Marketplace commission, codeMKT-COMM. Save. - Link it to a section. Open the category, GL Section tab, pick
SalesExpenses, save. One section. This writes the link row; without it the category is filed nowhere. - Put the GL code in it. On the GL code
EXPENSE-MARKETPLACE, set the category toMarketplace commission. (If you created the code first, it may already be in some other category — move it; a code has exactly one.) - Regenerate the report. The Financial Report is a snapshot read from month-end summary rows; an existing snapshot does not change when you add a link. Open it and REGENERATE, or re-run Month End Processing for the month if the movement was posted before the link existed — the month-end summary is itself built through the same join, so movement posted while the category was unlinked was never summarised.
That last point is the one that costs people an afternoon: linking the category fixes the structure, and the figures for past months only appear after Month End Processing for those months is run again.
Bulk, from a file. Import GL Category takes a CSV with columns GL_CATEGORY_CODE, GL_CATEGORY_NAME, PARENT_CATEGORY, DESC, ACCOUNT_NO and SECTION_CODE. Code, name and section code are required; each row creates the category and its link in one go. The section code must already exist as a section — a row with SECTION_CODE = Sales Revenue (with a space) fails with INVALID SECTION CODE, because the code is SalesRevenue. Failing rows are flagged on the import screen, not rejected as a file; fix the cell and re-import the row.
What success looks like
Open the Financial Report for GSO, last month, Profit And Loss tab. Under Sales Expenses there is a line Marketplace commission with the GL code EXPENSE-MARKETPLACE beneath it and the month’s figure beside it. On the Trial Balance tab the same code appears once — not twice — and the trial balance’s debits equal its credits. For the GSD bank account that was missing: it is a GL code in a category linked to CurrentAssets, and after REGENERATE it is on the Balance Sheet tab.
Common mistakes
| What people do | What actually happens | Do this instead |
|---|---|---|
| Create a category and start posting to its codes | Every report drops the codes — the category has no section | Link on the GL Section tab before the first posting |
| Link a category to a second section “so it shows in both places” | It is counted twice; subtotals are wrong by exactly its balance | One section per category; if a line belongs in two places, split the category |
Create a section called OperatingExpenses for a new P&L line | It is a balance-sheet section — only the eleven fixed codes are P&L | Add the category under GeneralExpenses or SalesExpenses and name the category for the line |
Rename RetainedEarnings or SalesRevenue to a house style | The engine reads those codes by name; the balance sheet stops balancing | Change the section’s name, never its code |
| Link the category, then look at last month’s report | The snapshot is unchanged; the summary rows were built before the link | REGENERATE the report; re-run Month End Processing for months already closed |
Import categories with Sales Revenue in the section column | INVALID SECTION CODE on every such row | Use the section code exactly: SalesRevenue |
Related documentation
- Chart of Account applet — the GL Section, GL Category and Import screens, field by field
- Financial Report applet — Month End Processing, REGENERATE, and the troubleshooting row for a code missing from every report
- Set of Books, fiscal years and fiscal periods — which ledgers a report reads and which months are locked
- Chart of accounts guide — building the codes and categories in the first place