Opening Balances in BC — Done Right : A practical guide for consultants who’ve been burnt by a client saying “just upload the trial balance.”
Every BC go-live reaches the same moment: the client hands you a trial balance and says “can we just upload this?” Here’s everything you need to know about why that’s not quite right — and how to do it properly.
Opening balances are one of those things that look straightforward on the surface but have a dozen ways to go wrong. Get them right and nobody notices. Get them wrong and you’ll be untangling reconciliation issues months after go-live. This post walks through each area — customers, vendors, bank, fixed assets, and G/L — and ties it all together with the suspense account approach that makes the whole thing clean and auditable. (Not talking about inventory in this post. Probably a separate post for that.)
Start Here: The Suspense Account
Before you touch a single journal, create one G/L account that will do the heavy lifting throughout the entire opening balance upload. Call it Opening Balance Suspense and give it a code that screams “temporary” — something like 99999 (depending on how many numbers you have in the Chart of Accounts) at the very end of your chart of accounts.
Set it as a Balance Sheet / Equity type. Not Income, not Expense — those flow through the P&L and if anything lingers there even for a day, your financial statements are dirty. Equity is the right home because it conceptually represents the net worth being brought into the system.
The golden rule
This account must be zero when you’re done. If it’s not, something’s missing or doubled up. That’s actually a feature — it’s your built-in validation check for the entire opening balance process.
Customer Opening Balances
Customer balances go through the General Journal using Account Type = Customer. The golden question here is: do you post one lump sum per customer, or one line per invoice?
If the client needs aging reports and wants to manage collections from day one — and they almost always do — post per invoice. That preserves due dates and document numbers, so the aged debtors report on day one of go-live is actually meaningful.
| Posting Date | Account Type | Account No. | Doc. Type | Description | Bal. Account No. | Amount |
|---|---|---|---|---|---|---|
| 31/03/2025 | Customer | C001 | Invoice | Opening Bal – Inv 1023 | 99999 | 5,200.00 |
| 31/03/2025 | Customer | C001 | Invoice | Opening Bal – Inv 1031 | 99999 | 3,800.00 |
| 31/03/2025 | Customer | C002 | Invoice | Opening Bal – Inv 2207 | 99999 | 11,500.00 |
Notice that the balancing account is 99999 — our suspense account. BC automatically posts to the Accounts Receivable control account (from the Customer Posting Group), so you never touch that account directly.
Pro tip
Use a Configuration Package to import customer journal lines from Excel rather than keying them manually. For any client with more than 20 customers, this will save you hours and eliminate keying errors.
Vendor Opening Balances
Same approach as customers, just mirrored. Account Type = Vendor and again post per invoice if the client wants to run aged creditors reports and manage payment runs properly from day one.
| Posting Date | Account Type | Account No. | Doc. Type | Description | Bal. Account No. | Amount |
|---|---|---|---|---|---|---|
| 31/03/2025 | Vendor | V010 | Invoice | Opening Bal – PO 4451 | 99999 | -7,200.00 |
| 31/03/2025 | Vendor | V022 | Invoice | Opening Bal – PO 4488 | 99999 | -2,900.00 |
BC posts to the Accounts Payable control account automatically via the Vendor Posting Group. Again — never post directly to the control account in the G/L.
Bank Opening Balances
Bank is slightly different. You’re not just getting the G/L balance right — you also need to create Bank Ledger Entries so that the bank reconciliation module actually works from day one.
The technique: post a General Journal line that debits and credits the same bank G/L account, while posting to the Bank Account sub-ledger. This creates the bank ledger entry (for reconciliation) without disturbing the G/L balance — because it nets to zero on the G/L account itself.
Important
Microsoft’s own documentation specifically warns: do not post bank opening balances by directly debiting the bank G/L account. Always go through the Bank Account sub-ledger method so reconciliation entries are created properly.
| Posting Date | Account Type | Account No. | Description | Bal. Acc. Type | Bal. Acc. No. | Amount |
|---|---|---|---|---|---|---|
| 31/03/2025 | Bank Account | HSBC-MAIN | Opening Balance | G/L Account | 12000 | 45,000.00 |
| 31/03/2025 | G/L Account | 12000 | Opening Balance – offset | G/L Account | 99999 | -45,000.00 |
Fixed Assets — Two Entries, Not One
This is where most implementations get lazy, and it causes real problems later. When uploading fixed asset opening balances, you must post two separate FA journal entries per asset:
-
Acquisition Cost — the gross original cost of the asset, posted with FA Posting Type = Acquisition Cost
-
Accumulated Depreciation — the total depreciation to date, posted as a negative amount with FA Posting Type = Depreciation
Why not just post the net book value (NBV) in one line? Because Business Central stores FA Ledger Entries by posting type. The FA card shows gross cost and accumulated depreciation separately. If you post only NBV, those fields are wrong, the depreciation calculation going forward is based on incorrect figures, and your balance sheet will show the asset at cost as being lower than it actually is. It’s a silent error that doesn’t surface until someone looks at the fixed asset register properly.
| FA No. | FA Posting Type | Description | Bal. Account No. | Amount |
|---|---|---|---|---|
| FA-001 | Acquisition Cost | Delivery Vehicle – Cost | 99999 | 85,000.00 |
| FA-001 | Depreciation | Delivery Vehicle – Accum. Dep. | 99999 | -34,000.00 |
| FA-002 | Acquisition Cost | Office Equipment – Cost | 99999 | 12,000.00 |
| FA-002 | Depreciation | Office Equipment – Accum. Dep. | 99999 | -7,500.00 |
BC posts to the FA Acquisition Cost account and Accumulated Depreciation account automatically, based on the FA Posting Group setup. The balancing side goes to your suspense account 99999.
G/L Opening Balances — The Final Step
Now that sub-ledgers are done, you post the remaining balance sheet accounts from the trial balance — equity, long-term loans, tax payables, accruals, prepayments, and so on — directly via a G/L journal.
Here’s the critical point: skip the control account lines from the trial balance. Don’t post to Accounts Receivable, Accounts Payable, bank accounts, or FA accounts in the G/L journal — BC already created those balances when you posted the sub-ledger entries. If you post them again, you’ll double them up.
The suspense account 99999 is your plug line. After posting all the remaining TB lines, add a final line that brings the suspense account to zero — this is the mathematical proof that your entire opening balance is correct.
Final check
Run the Trial Balance report in BC and compare it line-by-line to the client’s opening TB. They should match exactly. Then confirm account 99999 shows a zero balance. If both are true, your opening balances are clean.
What If the Client Just Wants to “Upload the Trial Balance”?
This comes up on almost every project. The client sees the TB, sees a list of numbers, and asks why you can’t just put them all into BC directly.
You can. But here’s what they’re actually agreeing to:
| What won’t work | Why it matters |
| Aged Debtors / Creditors reports | No customer/vendor ledger entries = no aging detail |
| Payment runs | BC can’t match payments against open invoices |
| Bank reconciliation | No bank ledger entries to reconcile against |
| FA depreciation runs | No FA ledger entries = depreciation won’t calculate |
In short: the G/L will balance, but the system won’t actually function as an ERP. It becomes a glorified spreadsheet with a nice interface.
The conversation to have with the client is straightforward: “We can upload the trial balance totals into the G/L only, but your AR, AP, and Fixed Asset modules won’t work — no aging, no depreciation. Is that what you want?” Nine times out of ten, once they understand what they’re giving up, they want the proper approach.
When TB-only is acceptable
There are a few genuine exceptions: shell companies with minimal transactions, interim go-lives where the client will re-upload detail later, or scenarios where the legacy system is being kept live in parallel for AR/AP. Document the decision and get sign-off — you don’t want to own that choice six months later.
