Purser AdvisoryController · FP&A · CFO
← Work
Case Study · Multi-Entity Close & Consolidation

Five entities, three systems,
one monthly close

A travel and hospitality group carrying $46.4M in assets was closing every month by hand-copying five trial balances into a 33-tab workbook nobody fully understood. I rebuilt it from source. The close now produces a consolidated statement package, feeds the board deck and the liquidity report, and holds up under the annual review.

IndustryTravel & hospitality
Structure5 entities · parent + 4 OpCos
Assets$46.4M
Source systems3 · no common COA
EngagementOngoing monthly close
Total assets
$46.4M
Entities consolidated
5
History restated
40 months
Balance sheet residual
$0
01 /

What it produces

The point was never the workbook. It was a close the group could run, report from, and defend.

The board used to get a spreadsheet printed to PDF, too many rows across too many columns to read. Now the president and the board get a deck that shows them where the business is.

The president closes the month himself. He drops in the trial balance files, runs the normalizer, checks the integrity guard, and moves one date cell. Every statement and chart in the workbook re-dates behind it.

One data layer feeds all of the reporting: the consolidated statement package, the monthly board deck, the liquidity and credit report, and the schedules the outside reviewer asks for each year. When a number is questioned, the answer is a row in a visible table rather than a formula chain nobody wants to open.

Forty months of history sit behind it, so any prior period can be restated without rebuilding anything. Two of the group’s own accountants now work inside the procedure.

They chose the format. What sits on each page, in what order, and which figures lead came out of what the president and the board said they wanted to look at. The lodge reports in USALI because that is the language its owner and its lender already speak. Month, year to date, and trailing twelve months sit side by side because the entities run on opposite seasons and an average hides it. Management adjustments are broken out line by line because add-backs are what a board argues about. When someone asks for a new cut, it shows up in next month’s deck.

Sample board review deck, page one: consolidated profit and loss with monthly and year-to-date actual, budget, variance and prior year columns, balance sheet and leverage cards, and financial ratios.
Sample board review deck, page 03: Group financial statements, credit and liquidity, EBITDA bridge.Sample board review deck, page 06: EBITDA bridge, management adjustment schedule, written commentary.Sample board review deck, page 07: Entity page in USALI summary format for owners.
SampleFour pages from the ten-page monthly package, rebuilt as a sample. The layout is the client’s own, built to what their board asked to see. The company and the numbers are invented, and the statements still foot: the balance sheet balances by entity, cash flow ties to balance sheet cash in every column, and the EBITDA bridge reconciles month, year to date, and trailing twelve months. Read the full sample deck (PDF)
Consolidation
Consolidated IS · BS · Cash Flow, period-aware and driven by one date cell
Entity statements
All five entities — IS, cash flow, and BS history
Operating report
Line-of-business dashboard with KPI panel, EBITDA bridge, and monthly trend
Liquidity & credit
Group liquidity and credit metrics
Capital detail
Capital-in-progress detail
Data layer
Fact_Table · Fact_Eliminations · Fact_Adjustments · COA_Mapping, visible and auditable
02 /

What was broken

Month-end close had become a liability.

Close ran on a 33-tab manual Excel workbook. Every month meant hand-copying five trial balances and reconciling intercompany by hand, hoping nothing broke on the way through. The formula chains had outlived the people who wrote them. There was no audit trail, and restating a prior period meant hours of manual work.

The group ran on three unrelated systems: a specialist reservations platform for tour operations, Xero, and QuickBooks Online across three companies. Each exported a different trial balance format on a different period basis, and no common chart of accounts existed anywhere in the group.

An annual review sat on top of all of it, which meant the fragility had an audience.

Before: data flow
Reservations TB
Xero TB┼→33-tab manual workbook
QBO (×3) TB
Hand-copy · Manual reconcile · No history · Fragile
03 /

The rebuild

Trial-balance-first and append-only, with eliminations stored as auditable data rather than formulas.

After: data flow
Reservations
Xero┼→NormalizerFact_Table
QBO (×3)
Fact_Eliminations
Excel (pure SUMIFS)Statement package
Append-only · Auditable · Restatable

Repairing the existing workbook would have preserved the problem, so I rebuilt from source. A normalizer ingests all five trial balance formats, resolves them to a single-month basis, classifies every account against a 43-category common chart of accounts, and writes a flat Fact_Table. The workbook reads that table with pure SUMIFS. No volatile functions, no external links.

It is append-only. Each month adds rows and updates one date cell. Prior periods are never touched. That is what makes forty months of loaded history worth something.

Eliminations are data. Intercompany entries are stored in Fact_Eliminations in journal-entry form, period-stamped, with non-controlling interest handled the same way. Adding a period’s eliminations is an append rather than a formula edit, and a reviewer can read the entries directly.

04 /

What made it hard

Most of the work was accounting judgment about data nobody had looked at closely.

Contaminated year-to-date exports
One entity’s reservations platform carries unclosed prior-year P&L inside retained earnings, so its YTD column cannot be trusted. The single-month income statement is derived from the Change column only, while the balance sheet uses the Ending column. Handled in the normalizer and documented so the next person can see why.
Hierarchical account codes
QuickBooks exports colon-separated account paths (parent:child:leaf). The normalizer extracts the leaf code and suppresses parent aggregate rows wherever children are present. Skip that step and every line item double-counts.
Three period bases in one group
The entities do not agree on what a period is. One reports on a different basis than the other four, so its income statement comes from the Month columns and its balance sheet from the YTD columns. The difference is resolved in the normalizer, and the downstream workbook never sees it.
Anchor delta math
Two of the three systems export YTD-cumulative figures. A hidden anchor tab stores the prior YTD after each close, so a single-month income statement is the current export minus that anchor. Closing a month requires only the current trial balance files, never a folder of prior ones.
A workbook standard tooling corrupts
Dashboard conditional formatting, a web add-in, and dynamic array tables get silently stripped when common Python libraries save the file. Every structural edit goes through direct XML manipulation instead, preserving the calculation flag and a strict row-ordering invariant.
05 /

What it runs today

The build was the beginning of the engagement. Every month the group gets a consolidated statement package, a board deck, and a liquidity and credit report off the same data layer, and the annual review is managed through to completion against those same schedules.

The procedure is documented and two client accountants are being developed against it, which is the part that decides whether any of this survives a change in who is doing the work.

Multi-entity consolidationIntercompany eliminationsNon-controlling interestGAAPQuickBooks OnlineXeroExcelPython
← Start a conversation