What this page does

The Imports tool lets you upload CSV files and immediately apply changes to your data. It supports four import types: inventory, products, customers, and prices.

All imports are upserts - they update existing records and add new ones when needed. Nothing is deleted by an import.

Before you start

  • Save as UTF-8 CSV with a header row.
  • Separator must be a comma. If a value contains a comma, wrap it in quotes, for example: "Large, Blue".
  • Dates use YYYY-MM-DD. Quantities are integers. Prices use two decimals, for example 12.50.
  • Any referenced sku, warehouse_code, or customer_code must already exist unless otherwise noted below.

Quick tour

  1. Open Imports. You will see a list of prior uploads with status and counts.
  2. Start a new import. Use the New Import button.
  3. Choose the import type. Pick one: inventory, products, customers, or prices.
  4. Select your CSV. Choose a file and submit.
  5. Review results. After processing completes, the detail view shows per-row status and any errors.
Tip: Use small test files first to validate your headers, then run larger files.

CSV formats by type

inventory - set on-hand stock by warehouse

Required: sku, warehouse_code, qty_on_hand.
If a product+warehouse row exists it is updated; if not, it is created. Any change writes a ledger entry.

sku,warehouse_code,qty_on_hand
ABC-001,MAIN,120
ABC-001,SECONDARY,30
KIT-500,MAIN,0
DEF-777,MAIN,-5

products - create or update product master data

Required: sku, name.
Optional: description,unit_of_measure,case_pack_qty,weight_grams,length_mm,width_mm,height_mm,base_price,is_active.

sku,name,description,base_price,unit_of_measure,case_pack_qty,weight_grams,length_mm,width_mm,height_mm,is_active
ABC-001,Widget A,"Aluminum body, blue",12.50,ea,12,250,100,50,30,1
KIT-500,Starter Kit,,49.00,set,1,,,,,yes
DEF-777,Gizmo D,,0.00,ea,,120,,,,0

customers - create or update buyer companies

Required: code, name.
Optional: email,phone,order_minimum,credit_terms,credit_limit,is_active,bill_to_*,ship_to_*.
credit_terms: one of prepaid, net15, net30, net45, net60.

code,name,email,phone,order_minimum,credit_terms,credit_limit,is_active,bill_to_address1,bill_to_city,bill_to_region,bill_to_postal,bill_to_country,ship_to_address1,ship_to_city,ship_to_region,ship_to_postal,ship_to_country
ACME,ACME Corp,ap@acme.com,555-123-9999,250.00,net30,5000.00,yes,1 Main St,Springfield,IL,62704,US,1 Warehouse Rd,Springfield,IL,62704,US
BETA,Beta Stores,,555-222-3333,0.00,prepaid,,1,88 High St,Portland,OR,97201,US,88 High St,Portland,OR,97201,US

prices - customer overrides or price lists

A) Customer specific pricing

Required: customer_code, sku, price.
Optional: currency, starts_at, ends_at. Exact date windows replace existing overlaps.

customer_code,sku,price,currency,starts_at,ends_at
ACME,ABC-001,10.00,USD,2025-01-01,2025-12-31
BETA,ABC-001,11.25,USD,,
BETA,KIT-500,45.00,USD,,

B) Price list pricing

Required: price_list, sku, price for price rows.
Optional: currency, map_customer_code to link customers to the list.
The list is auto-created if it does not exist.

price_list,sku,price,currency,map_customer_code
Wholesale,ABC-001,11.00,USD,
Wholesale,KIT-500,47.50,USD,
Wholesale,, , ,ACME
Wholesale,, , ,BETA
Tip: Rows with only price_list and map_customer_code (blank sku and price) map the customer to the list.

How processing works

  • Validation. Each row is validated for required fields and basic formats.
  • Per row result. The import detail page shows each row as OK or Error with an error message.
  • Transaction scope. Rows are processed inside a transaction for the file. If a database error occurs, the transaction is rolled back.
  • Inventory ledger. Changes to on hand quantities write an inventory_tx ledger entry with type adjust and reference csv_import.
  • File copies. Your uploaded CSV is stored under your tenant folder for audit and download.

Status and counts

Status
processing, completed, or failed
Rows
Total rows read from the file
Errors
How many rows ended in Error
Timestamps
Uploaded At and Processed At for audit

Common errors and fixes

  • Missing sku, warehouse_code, or customer_code. Add the missing values or create the referenced records first.
  • Unknown product sku. Import the product first (products), then run the inventory or prices import.
  • qty_on_hand must be integer. Remove decimals or text. Use whole numbers, including negatives if needed.
  • Invalid date. Use YYYY-MM-DD and ensure the date is a real calendar date.
  • Price not a number. Only digits, optional decimal point, and sign are allowed. Example: 12.50
  • Duplicate headers or typos. Header names must match exactly as shown. Avoid accidental spaces or different casing.

Best practices

  • Keep a master CSV template per import type and reuse it.
  • Test with 5 to 10 rows before a large upload.
  • Schedule inventory updates during low traffic hours.
  • Use price lists to manage groups of customers more easily.

Reference: field rules

  • Booleans: 1, 0, yes, no, true, false. Blank defaults to active.
  • Numbers: quantities are integers, prices allow decimals such as 12.50.
  • Dates: YYYY-MM-DD format.
  • Currency: defaults to USD if blank.

FAQ

Can I reupload the same file?
Yes. Reprocessing will upsert again. Nothing is deleted.

Can I download my original file?
Yes. The import detail view provides a download for the stored file.

What about very large files?
Start with smaller batches to confirm formatting, then upload the full file.

Do imports notify buyers?
No. Imports only update your admin data.

Quick checklist

  • File is UTF-8 CSV with headers.
  • Dates are YYYY-MM-DD. Quantities are integers. Prices have two decimals.
  • All referenced codes exist (except auto-created price lists).
  • You tested with a small sample first.

Glossary

Upsert - Update if the record exists, insert if it does not.

On hand - Physical stock quantity at a warehouse, not including reserved.

Price list - A named set of product prices that can be mapped to customers.