data migration

Import Data from Spreadsheets

Bulk-import customers, suppliers, products, opening balances, and historical transactions into IntBooks from CSV or Excel files. Covers column mapping and balance validation.

Last updated:

The IntBooks import wizard accepts CSV and Excel files for every major data type. This article covers the standard import flows: customers, suppliers, products, chart of accounts, opening balances, and historical transactions. The total time for a typical Malaysian SME is 1 to 3 days of effort spread over 2 to 4 weeks of parallel running.

What you can import

Data typeFormatValidation
CustomersCSV / ExcelTIN format, email format, duplicate detection
SuppliersCSV / ExcelTIN format, email format, duplicate detection
Products / servicesCSV / ExcelSKU uniqueness, default tax rate
Chart of accountsCSV / ExcelAccount code uniqueness, parent-child structure
Opening balancesCSV / ExcelDebits must equal credits
Historical invoicesCSV / ExcelCustomer existence, line totals balance
Historical billsCSV / ExcelSupplier existence, line totals balance
Journal entriesCSV / ExcelPer-entry debits = credits

Step 1: Export from your existing system

The import wizard handles column mapping automatically for the major Malaysian accounting tools — SQL Account, AutoCount, Xero, MYOB. If you’re coming from one of those, just export the standard CSV files from the Reports → Data Export menu (or equivalent) of your old system.

For SQL Account, export:

  • Customers
  • Suppliers
  • Stock items
  • Chart of accounts
  • General ledger transactions

For AutoCount, export the corresponding lists from Tools → Database Tools → Export Data.

For Xero, use Settings → Export your data under the organization menu.

For other systems or for spreadsheet-based bookkeeping, prepare a CSV with one row per record and a header row that names each column.

Step 2: Open the import wizard

Go to Settings → Data Migration → Import. Pick the data type from the dropdown:

  1. Customers / Suppliers — recommended first because they’re referenced by every other data type
  2. Products / services
  3. Chart of accounts — only if you’re not using the default Malaysian template
  4. Opening balances
  5. Historical transactions — invoices, bills, journal entries

Doing them in this order means each step’s records can reference data from earlier steps.

Step 3: Upload your file

Drag your CSV or Excel file onto the upload area. The wizard previews the first 10 rows and shows the detected column mapping.

For each column in your file, the wizard tries to match it to a IntBooks field. For known formats (SQL Account, AutoCount, Xero) the match is automatic. For custom CSVs you’ll need to map manually:

  • Drag a column header onto a IntBooks field, or
  • Click the dropdown next to each IntBooks field and pick the source column

Required fields are marked with a red asterisk. The wizard refuses to proceed until every required field has a source column mapped.

Step 4: Validate

Click Validate. The wizard runs every row through the same checks the application would apply at create time:

  • Required fields are present and non-empty
  • TIN format matches C######## or SG######## pattern
  • Email addresses are syntactically valid
  • Currency codes are ISO 4217
  • Account codes exist (for transaction imports)
  • Customer / supplier names exist (for transaction imports)
  • For opening balances and journal entries, debit total equals credit total

Validation errors appear in a table with one row per problem. You can fix the source file and re-upload, or click each error to fix it inline.

Step 5: Run the import

When the validation table shows zero errors, click Import All. The wizard:

  1. Processes records in batches of 500
  2. Shows a live progress bar
  3. Logs every record to the import audit trail
  4. Rolls back the entire batch if any record fails

For a typical SME import (1,000 customers, 5,000 invoices, 18 months of journal entries) the total run time is about 5 minutes.

Step 6: Reconcile

After the import completes, the wizard runs an automatic reconciliation:

  • Customer count in IntBooks matches the number of rows you imported
  • Supplier count matches
  • Total receivables matches the sum of unpaid invoice amounts
  • Total payables matches the sum of unpaid bill amounts
  • Opening trial balance balances (debits = credits)

If any of these don’t match, the wizard tells you which one and points to the affected records. Common causes:

  • Duplicates in the source file (the wizard de-duplicates by TIN or email)
  • Charge / refund pairs that net to zero in the source but were imported as separate transactions
  • Currency conversion rounding differences for non-MYR transactions

Step 7: Run in parallel for one month

We recommend running both your old system and IntBooks in parallel for one full month after import. At the end of that month, generate the same reports from both systems (Profit & Loss, Balance Sheet, Trial Balance) and compare them line by line. Any discrepancies are easy to fix at this point — much harder once your old system has been archived.

Common issues

My CSV has extra columns the wizard doesn’t recognize

Either ignore them (the wizard only imports columns you’ve mapped to IntBooks fields) or delete them from the CSV before upload. Extra columns do not cause errors.

The wizard says “TIN format invalid” for Sdn Bhd customers

LHDN TINs for Sdn Bhd companies start with C followed by 10 digits (e.g., C1234567890). If your source file has spaces, dashes, or different prefixes, run a find-and-replace on the source file before re-uploading.

Opening balances don’t balance

Your source data has a rounding difference between debit and credit totals. Open the source file in Excel, sum the debit and credit columns separately, find the difference, and add a balancing journal entry to your suspense account. Re-upload.

Historical invoices have a different invoice number format than my new ones

That’s fine — historical invoices keep their original numbers. IntBooks only generates new numbers for invoices you create after the import. The document sequence picks up after the highest existing number to avoid collisions.

What’s next?