Accounting
Cambodian chart of accounts, KHR + USD dual-currency books with no rounding drift, GDT e-VAT, withholding tax, salary tax, and monthly e-filing. Built for auditors here — not adapted from a US template.
A long-form page for Accounting with sample build, case study, and pricing band is coming. Until then, scope it directly with us.
Why Cambodian SMBs migrate off QuickBooks and Peachtree
QuickBooks and Peachtree were the right tools for a different era. They fail Cambodian businesses on three specific pressure points: no native KHR currency code (QuickBooks Online is USD-only in practice), no GDT e-VAT API integration, and no multi-entity consolidation. When any one of those gaps becomes a compliance or growth bottleneck — and GDT's 2025–2026 compliance push has made all three urgent — migration becomes cheaper than workarounds.
QuickBooks Desktop and Peachtree (Sage 50) still run the books for a significant share of Phnom Penh SMBs — particularly businesses established before 2015 that grew up on Windows-desktop accounting. The software worked. Month-end closed, invoices went out, accountants managed the rest. The trouble is that the rest now includes: submitting e-VAT to GDT every month (Prakas 1033), converting KHR/USD at the NBC daily rate on each invoice date, and managing withholding tax (WHT) at three different rates depending on counterparty type. None of these are things QuickBooks or Peachtree do without manual workarounds.
The alternative is not always Odoo. The right modern system depends on entity count, transaction volume, government-contract exposure (CamInvoice mandate), and whether the business needs a custom ERP or can work within a configurable platform. The migration conversation starts with mapping what the current system actually does versus what the business actually needs — those two lists are always different, and the gap between them defines the scope.
What does an accounting system migration cover?
A full accounting migration is not a data export. It covers six distinct work streams: chart-of-accounts (COA) mapping, opening-balance migration, accounts-receivable and accounts-payable roll, fixed-asset register rebuild, historical-report strategy, and GDT compliance setup in the new system. Each has its own risks and timelines.
COA mapping is the work most firms underestimate. QuickBooks uses a flat account list; Odoo and other modern ERPs use a structured chart with account groups, tax mappings, and currency assignments. Every QuickBooks or Peachtree account needs to be mapped to its equivalent in the new system before a single transaction moves. Accounts with no clear equivalent — common for legacy miscellaneous or suspense accounts — require a decision: absorb into an existing account, create a new one, or close out the balance before migration.
Opening balances need to be reconciled to a specific cut-off date: the last closed trial balance in the old system becomes the opening entry in the new one. This is straightforward for cash and bank accounts but more complex for AR/AP ageing (open invoices carry over), fixed assets (cost and accumulated depreciation must both migrate), and KHR-denominated accounts (the KHR/USD rate at the cut-off date must be documented and defensible to a GDT auditor).
Historical reports — the invoices, journals, and trial balances from before the cut-off — typically stay in the old system as a read-only archive. Most businesses plan to keep QuickBooks or Peachtree running in archive mode for 3–5 years so accountants and auditors can pull prior-period data. This is the right approach: migrating 5+ years of historical journals into a new system is expensive and rarely used. Document the archive policy and location before closing the old system.
GDT compliance setup in the new system covers: Cambodia tax codes (VAT 10%, VAT 0%, VAT exempt, WHT 7%/14%/15%), the KH chart-of-accounts localization module (if using Odoo), NBC daily rate integration for multi-currency conversion, and — if the business is B2G — CamInvoice adapter scoping. This work runs in parallel with the migration; it cannot be left until after go-live. See /services/integration/api for the GDT and CamInvoice integration scope.
How long does an accounting system migration take?
A single-entity SMB migrating from QuickBooks to Odoo takes 8–13 weeks end-to-end. Peachtree migrations typically run 10–15 weeks because Peachtree's flat-file data is harder to extract than QuickBooks's structured export formats. Multi-entity or mid-market scope adds 4–8 weeks per additional entity.
- Week 1 — Discovery: COA audit, system access, cut-off date decision, stakeholder alignment.
- Weeks 2–3 — COA mapping: every account classified, gap decisions made, migration template signed off.
- Weeks 3–5 — New system setup: Odoo install, KH localization module, tax codes, multi-currency config, bank journals.
- Weeks 4–6 — Data migration: opening balances, open AR/AP invoices, fixed asset register, customer/vendor master (including TIN field population).
- Weeks 6–9 — Parallel run: both systems run simultaneously through one full month-end cycle. Reconcile to the riel and the cent before sign-off.
- Week 9–10 — Cutover: close old system, switch to new system as system of record, confirm GDT filing runs from new system.
- Week 10+ — GDT adapter go-live (if in scope): first live filing from new system, monitored for 30 days.
What does an accounting migration cost?
A QuickBooks → Odoo migration for a single-entity SMB (one legal entity, one accounting system, standard VAT) is typically quoted in the $4,000–$9,000 range on a fixed-scope basis. Peachtree migrations sit $1,000–$2,000 higher due to the harder data extraction. Multi-entity and mid-market projects are quoted after a paid discovery sprint.
We quote fixed scope, fixed price after a 1-week discovery engagement ($500, deducted from the project fee if you proceed). Discovery produces a COA mapping document, a data migration plan, a gap register, and a final quote. The reason for discovery-first pricing: migration cost varies sharply based on how clean the source data is. A QuickBooks file with 8 years of unreconciled suspense entries costs more to migrate than a clean file with 2 years of history — and that difference is not visible without looking.
Ongoing Odoo costs after migration: $0/year for Odoo Community (self-hosted), or Odoo Enterprise at approximately $150–$300 per user per year [TBC on current Enterprise pricing]. Hosting on a managed VPS or Odoo.sh runs $50–$200/month depending on scale. The GDT e-VAT adapter (if in scope) is a separate line item — see /services/integration/api for that pricing. The total cost of ownership over three years is typically lower than continuing to pay QuickBooks Online per-user licensing ($30–$90/user/month) while also paying a manual GDT filing clerk.
Common migration pitfalls in Cambodia
Most accounting migrations that stall or overrun do so because of predictable problems — all of them avoidable if caught in discovery.
- KHR rounding drift: QuickBooks stores amounts in USD only (or USD-primary). When those amounts are converted to KHR for GDT filings, the exchange rate used and the rounding method matter. A difference of ±1 riel per invoice line compounds across thousands of transactions into a material filing discrepancy. The migration must document the NBC rate used on each historical invoice date and use consistent rounding in the new system.
- GDT e-VAT re-do: migrating to a new accounting system resets the GDT integration. If the old system had any GDT connection (manual or automated), the new adapter must be built from scratch — it does not carry over. Plan the GDT go-live as a parallel project starting at week 1, not an afterthought at week 10.
- Multi-currency reconciliation gaps: businesses that invoiced in both KHR and USD in QuickBooks often have inconsistent exchange rates across historical invoices — different rates on the same day because someone typed a rate manually rather than pulling NBC. These inconsistencies surface during the parallel-run reconciliation. The fix is to document and accept the historical variance, then enforce NBC-rate discipline in the new system from day one.
- KH chart-of-accounts mapping errors: the Cambodia chart of accounts (installed via Odoo's KH localization module) uses account numbering that does not match QuickBooks or Peachtree defaults. Accounts mapped incorrectly produce wrong VAT return totals from the first filing. The mapping must be reviewed by an accountant with GDT filing experience, not just a technical implementer.
- TIN field gaps on customer and vendor records: GDT requires a TIN on every B2B invoice. QuickBooks does not mandate this field. When customer records migrate, TINs are frequently missing. These must be collected before go-live — not during the first GDT filing.
- Training underestimated: switching accounting systems is a change-management project as much as a technical one. Bookkeepers and accountants trained on QuickBooks or Peachtree need structured training on the new system before go-live, not a 1-hour walkthrough. Budget 2–5 days of structured training per accounting user, plus 30 days of supported use post-go-live.
Frequently asked questions — accounting system migration
Can we keep our existing QuickBooks or Peachtree data?
Yes. Historical transactions stay in the old system as a read-only archive. We migrate opening balances and open items (unpaid invoices, outstanding purchase orders) to the new system; prior-period journals stay in QuickBooks or Peachtree. Most businesses keep the old system on an archived workstation or cloud backup for 5–7 years, which satisfies Cambodia's 7-year record-retention requirement under the Law on Accounting and Auditing 2016.
What happens to historical reports after migration?
Prior-period reports — trial balances, P&L, balance sheet — remain accessible in the old system. The new system starts from the cut-off date opening balance and generates forward-looking reports from there. If you need a multi-year comparative (e.g. 2023 vs 2024 vs 2025), you will need to pull 2023–2024 from QuickBooks and 2025 from the new system and combine them manually or in a reporting tool. For critical historical reports, export them from the old system in PDF and Excel before closing it — once the licence lapses, access may not be guaranteed.
Do we need to switch at year-end?
No — but year-end is the cleanest cut-off point because the trial balance is closed. Migrating mid-year is possible and common; it requires agreeing on a cut-off date (typically end of a completed month) and migrating an in-year opening balance rather than a full prior-year closing balance. Mid-year migrations add 1–2 weeks to reconciliation because the parallel run must agree on a mid-year opening position, not a clean year-end close.
How does the migration affect our GDT compliance?
The migration period requires careful GDT filing management. During the parallel run, one system is the system of record for GDT filing purposes — do not submit from both. We recommend continuing to file from the old system during parallel run and switching GDT filing to the new system on the same day as cutover. If the GDT adapter for the new system is not ready by cutover, the old manual filing workflow continues until the adapter goes live — which is a known risk and must be planned for explicitly. Do not assume the new system will automatically produce GDT filings; the adapter is a separate project. See /services/integration/api.
What about withholding tax (WHT) setup in the new system?
WHT setup is one of the more complex parts of the Odoo migration. Odoo requires separate WHT tax codes for each rate (7% resident company, 14% resident individual, 15% non-resident/royalties) and each must be linked to a specific ledger account. The default Odoo KH localization includes these codes, but the ledger account mapping must be verified against your specific COA. Additionally, each vendor record must be classified by counterparty type (resident company, resident individual, non-resident) so the correct WHT rate applies automatically at invoice posting. This classification must happen during the vendor-master migration — it cannot be retrofitted easily after posting begins.
We sell in both KHR and USD. How is that handled?
Odoo handles multi-currency natively. You configure a KHR journal and a USD journal, each linked to the correct bank account. The NBC daily exchange rate is pulled via an automated rate feed or entered manually. Invoices are raised in the appropriate currency; Odoo records the KHR equivalent using the declared daily rate. For GDT filing, all amounts are reported in KHR — the adapter converts USD amounts at the invoice-date NBC rate before submission. The key discipline: use NBC rates consistently, not rounded or static approximations. Discrepancies between your filed KHR amounts and the NBC-rate equivalent audited by GDT trigger review queries.
Can we migrate from Peachtree if we no longer have the original install files?
Usually yes. Peachtree stores its company data in flat files (.DAT / .PTB formats) that can be read without the original install CD. If the files are intact on the machine or backup, data extraction is possible. If the files are corrupted or missing, recovery depends on what backups exist. In worst-case scenarios, businesses rebuild the chart of accounts and enter opening balances from the last printed trial balance and open invoices from paper records — tedious but not uncommon for businesses that have been on Peachtree for 10+ years.
Should we consider Xero, Zoho Books, or QuickBooks Online instead of Odoo?
For very small businesses (under 5 staff, USD-only, no government contracts, below the GDT VAT threshold), Xero or Zoho Books are reasonable choices. The trade-off: none of them have native KH GDT integration either, so you will still need a custom adapter. Odoo Community's advantage is zero per-user licensing, the availability of a KH localization module, and the ability to extend it into a full ERP if the business grows into inventory, manufacturing, or payroll. The choice between platforms depends on whether accounting-only is the scope or whether ERP expansion is on the roadmap.