Data Import & Onboarding
If you are migrating from another system — or setting up a new tenant — the Data Import tool lets you bulk-load your master data and opening balances without entering records one by one.
Go to Settings → System → Data Import to access the tool.
How it works
Every entity follows the same three-step flow:
- Download the template — an Excel file with column headers, field notes in row 2, and sample rows
- Fill in your data — replace the sample rows with your real data; do not change the headers in row 1
- Upload and review — the system validates every row and shows a colour-coded result table before you apply
Only rows that pass validation are imported. Rows with errors or duplicates are skipped and shown with a specific error message — you can correct the file and re-upload.
What you can import
Master data
Import master data first — transactions reference these records.
| Entity | Key fields | Notes |
|---|---|---|
| Customers | Name, Phone | Name must be unique |
| Vendors | Name, Type, Phone | Type must be: Fuel · Maintenance · Border Agent · Spare Parts · Subcontractor · Other |
| Drivers | Name, License Number, License Expiry, Phone, Status | License Expiry in YYYY-MM-DD; Status: Active · On Trip · On Leave · Suspended. Optional Truck / Trailer columns take a vehicle's Reg Number and auto-assign the driver to it — import Fleet first, since the lookup only matches existing, non-deleted vehicles of the matching type |
| Fleet | Reg Number, Type, Make, Model | Type: Truck · Trailer |
| Routes | Name, Origin, Destination, Distance (km), Estimated Days | Checkpoints optional — semicolon-separated (e.g. Mikumi;Iringa;Mbeya) |
| Chart of Accounts | Account No, Name, Category, Type, Debit/Credit | Supplements the Tanzania Standard CoA — existing accounts are never overwritten |
| Items | Code, Name, Type, Unit, Selling Price, VAT Applied | Type: Product · Service; VAT Applied: true · false. Optional columns: Description, Barcode (must be unique across your catalog), Brand, Menu Category (Food · Beverage, for Restaurant POS), Item Category (must match Settings → Invoicing & Tax → Item Categories), Store(s) (comma-separated store names; blank = sells at every store), Cost Price, Revenue/Expense Account No (validated against your Chart of Accounts), Expense Category, Status (Active · Inactive, defaults to Active), Variant Group Code and Variant Label (see below). Barcode, Brand, Menu Category, Item Category, Store(s) and the variant columns apply to Products only and are ignored on Service rows |
| Fixed Assets | Name, Category, Acquisition Date, Acquisition Cost, Depreciation Method, Status | TRA Class is optional and auto-fills the depreciation method and rate if provided |
| Rooms | Room Number, Room Type Code | Hotel Management only. Room Type Code must match a room type you've already added on the Rooms page. Optional: Floor, Property (defaults to your main property), Housekeeping Status (defaults to Clean), Known Issues |
| Leads | Business Name, Phone, Status, Assigned Rep, Package Interest | Internal-only — only appears for tenants with Field Activity's Sales Playbook enabled; see Permissions for why lead.* isn't in the general permission set |
Item variants (sizes, colours): to group the sizes or colours of one style, give those rows the same Variant Group Code (for example SHOE-001) and put what makes each row different in Variant Label (for example Size 40). Codes are matched regardless of upper/lower case. A code that doesn't exist yet creates the variant group, named after the first row's item name. Each size is still its own item with its own Code and Barcode. A Variant Label without a Variant Group Code on the same row is an error. Leave both blank for an item with no variants.
Updating existing Items: Items is the one entity that supports re-uploading against records you've already created. Tick Update existing records on the upload step and a row whose Code matches an existing item fills in that item's blank optional fields from the file — Description, Barcode, Brand, Menu Category, Item Category, Cost Price, Revenue/Expense Account No and Expense Category; Store(s) only if the item has no store assignment yet; and a variant group only if the item isn't already in one (an item is never moved to a different group). A field the item already has a value for is never overwritten, and required fields (Name, Type, Unit, Selling Price, VAT Applied, Status) are left alone entirely even if the file's value differs. Rows matching an existing item are marked Update on the review screen. Off by default; every other entity is always skip-if-exists.
Each entity has its own licensing requirement — an entity missing from your import screen almost always means a licensing gap, not a bug:
- Chart of Accounts, Opening Balances — require the Accounting module
- Items, Vendor Invoices — require Accounting, Point of Sale, or Spare Parts (any one is enough), or Diesel Yard
- Fixed Assets — requires the Assets module specifically (having Accounting alone isn't enough)
- Stock Levels — requires Point of Sale or Spare Parts, or Diesel Yard
- Rooms — requires Hotel Management with Room Management turned on
Transactions (migration)
Use these to carry over open records from your previous system.
| Entity | What it creates | Notes |
|---|---|---|
| Customer Invoices | Customer invoices | Customer Name must match an existing customer — import Customers first |
| Quotations | Quotations | Client Name is matched to an existing customer if found, but is not required to exist — free text is fine |
| Vendor Invoices | Vendor bills (purchase invoices) | Vendor Name must match an existing vendor — import Vendors first |
| Opening Balances | A single Draft journal entry | All rows become lines in one journal — review and post it in Accounting → Journal Entries |
| Stock Levels | Stock ledger entries | Item Code must match an existing Product-type Item — import Items first |
Validation rules
The system checks each row before applying:
| Check | What fails |
|---|---|
| Required fields | Row with an empty required column is rejected |
| Enum values | Value not in the allowed list (e.g. wrong Status) is rejected |
| Numeric fields | Non-numeric value where a number is expected |
| Date format | Date not in YYYY-MM-DD format |
| Boolean fields | Value that is not true or false |
| Lookup fields | A value that has to match an existing record isn't found — e.g. Customer Name, Vendor Name, Account No, driver Truck or Trailer Reg Number, Item Code, Store, Expense Category, Item Category, Room Type Code, or a lead's Assigned Rep |
| Duplicates | Record with the same key already in the system — skipped with a warning (unless Update existing records is ticked for Items) |
| Batch duplicates | Two rows in the same file with the same key — the second one is an error |
| Barcode clashes | An item Barcode already used by a different item, or repeated in the same file — that row is an error |
Opening balances
Opening balances represent your GL account balances at the point you switch to this system. They are imported differently from other entities:
- Each row in the template becomes one journal line
- All lines are combined into a single Draft journal entry named
Opening Balances Import - The journal is created in Draft status — you can review it in Accounting → Journal Entries
- Check that total Debits equal total Credits (the review screen shows both totals)
- When satisfied, click Post to lock the opening balances into the General Ledger
If your opening balances do not balance (total debits ≠ total credits), investigate before posting. Common causes: missing retained earnings account, transfers or owner equity not accounted for.
Recommended onboarding order
Follow this sequence to avoid lookup errors between entities:
1. Customers
2. Vendors
3. Drivers
4. Fleet
5. Routes
6. Chart of Accounts (or use Tanzania Standard CoA seed)
7. Items
8. Fixed Assets
9. Rooms (Hotel Management — add room types first)
10. Opening Balances → review draft journal → post
11. Stock Levels (opening counts, once Items and Stores exist)
12. Customer Invoices (outstanding / pending invoices)
13. Quotations (open or historical quotes)
14. Vendor Invoices (unpaid vendor bills)
Customer invoices — migration notes
When migrating outstanding invoices:
- Invoice No is optional — if blank, one is auto-generated (
IMP-{timestamp}-{row}) - Amount is the subtotal before VAT
- VAT Rate (%) defaults to 18 if left blank; enter
0for exempt or zero-rated services - Status: use
Sentfor unpaid invoices the customer is aware of;Draftfor invoices not yet sent;Paidfor historical invoices you want in the system for records;Overduefor a Sent invoice already past its due date - The import creates a single-line invoice — you can open any imported invoice and edit it for multiple lines
Quotations — migration notes
When migrating open or historical quotations:
- Quote No is optional — if blank, one is auto-generated (
QT-IMP-{timestamp}-{row}) - Client Name does not need to exist in your Customers list — if it matches an existing customer by name, the quote is linked to that customer's contact details; otherwise it's kept as plain text
- Valid Until is required — enter the date the quote expires or expired
- Amount is the subtotal before VAT
- VAT Rate (%) defaults to your tenant's rate if left blank; enter
0for exempt or zero-rated quotes - Status: use
Sentfor quotes awaiting a client response,AcceptedorRejectedfor decided quotes,Draftfor unfinished ones,Expiredfor a Sent quote past its Valid Until date.Convertedis not available on import — a converted quote needs a real linked job or invoice, which a plain migration can't create. Convert it manually after import if needed. - The import creates a single-line quotation — open any imported quote and edit it for multiple line items, or use Excel line-item import on the quote itself
Vendor invoices — migration notes
- Amount is the subtotal before VAT
- VAT Applied: enter
trueif the vendor charged VAT;falseotherwise - Status:
Approvedfor bills you have already verified;Draftfor unreviewed bills;Paidfor settled bills - Approved bills are visible in AP Aging reports
Stock levels — migration notes
Use this to set opening stock counts when onboarding a new store, or to make a bulk stocktake correction instead of adjusting items one at a time:
- Item Code must match an existing Product-type Item — import Items first
- Store is optional — leave it blank to use your default store; otherwise it must match an existing, active store name. Naming a store also limits that item to selling only at that store from then on — leave it blank if the item should keep selling everywhere
- Movement Type:
Opening Balancefor an initial starting count,Adjustmentfor a correction to existing stock, orStocktake Countwhen you've counted what's actually on the shelf - Quantity — for Opening Balance, the starting count; for Adjustment, the change as a positive/negative number (e.g.
-3for shrinkage); for Stocktake Count, your new total on hand (the system works out the difference for you) - Unit Cost is optional — defaults to the item's cost price if left blank
- Reason is required on every row — it's the same audit-trail requirement as a manual stock adjustment in POS Reports
- Every row becomes a new entry in the stock ledger — re-uploading an Opening Balance or Adjustment file adds more movements rather than overwriting, so double-check the file before importing
For a stocktake, click ↓ Download Current Stock (.xlsx) instead of the blank template. You get a sheet with every active product, its store, and its current on-hand count, already set to Stocktake Count. Overwrite the Quantity column with what you counted, add a Reason, and upload it.
Limits and exclusions
The import tool does not support:
- Historical Jobs or Trips — operational history cannot be reconstructed from a spreadsheet
- Payments linked to specific invoices — mark invoices as
Paidin the invoice import instead - GL Entries directly — use the Opening Balances journal flow to set GL balances
There is no hard row limit per file, but very large files (10 000+ rows) may be slow to validate in the browser. For large datasets, split into batches of 2 000–3 000 rows per file.
Related
- Settings → System → — entry point for Data Import
- Point of Sale → — set up Items and Stores before importing Stock Levels
- Quotations Module → — manage and edit quotations after import
- Chart of Accounts → — set up your account structure before importing opening balances
- Journal Entries → — review and post the opening balances journal
- Quick Start → — general platform onboarding guide