Import Reference
Every CSV import surface, column, and error message in one place
One import engine, many surfaces
Ardent Seller imports CSV files directly in your browser through one shared engine. Inventory, entities (vendors, customers, locations, charities), transactions, procedures, and several Settings registries each have their own import with their own columns — this page is the full reference for all of them. Every import uses the same flow: pick a file, map its columns to Ardent Seller fields, validate every row, and only then save. For a gentler, inventory-focused walkthrough with a worked example, start with Importing from CSV.

Where Import and Download Template live
On every importable list page, open the ⋯ ("more") menu in the table's action bar. It contains Download Template (a CSV with that surface's exact header row) and Import from CSV (pick your file and start the import). Imports are per-surface: you import inventory items on an inventory list, vendors on the Vendors page, and so on. The import surfaces are:
- Inventory — every inventory list, for example Source → Ingredients, Create → Finished Goods, or Deliver → Products.
- Entities — Source → Vendors, Deliver → Customers, Optimize → Charities, and the Locations page (linked from Settings).
- Transactions — transaction lists such as Source → Purchases and Deliver → Sales.
- Procedures — Create → Recipes.
- Settings registries — Tax Categories, Transaction Methods, Referral Sources, Pricing Tiers, and Attributes (detailed below).
Some surfaces are export-only — stocktake counts, the income statement, price lists, inventory valuation, donations, and customer sales reports can be downloaded as CSV but not imported back.
The column-mapping flow
Your file's headers do not have to match the template exactly — after you pick a file, a mapping step matches your CSV columns to Ardent Seller fields. The import runs in three stages:
- Select the file. Only .csv files up to 10 MB are accepted. The file is parsed in your browser; nothing is uploaded yet.
- Map the columns. Ardent Seller pre-matches your headers to its fields — exact matches first, then common synonyms ("qty" for Quantity, "item code" for SKU), then close-typo matches. You review the suggestions next to a preview of the first 5 rows of your file and can change any assignment. Every required field must be mapped before you can continue, and each CSV column can be used for only one field.
- Validate and import. Every row is checked — required values, valid categories, states, and units, numeric fields, and references to existing records. Only when every row passes is anything saved.
Values for list-based columns (Category, State, Unit, Status, and so on) are matched case-insensitively, and a near-miss gets a "Did you mean?" suggestion in the error list.
Validation is all-or-nothing
One invalid row aborts the whole import — nothing is saved until every row is valid. Errors are reported with their row numbers, so fix the listed rows and upload the file again. You will never end up with half a file imported.
Inventory columns
One row per item; add extra rows for variants (see the Variant columns below). Name, SKU, Category, State, and Unit are required — they must be mapped and filled in on every row.
| Column | Required | Description | Valid values / example |
|---|---|---|---|
Name | req | The item name. | e.g. Vanilla Extract |
SKU | req | A unique identifier for the item. | e.g. VAN-001 |
Category | req | The item type. Use "raw" for raw materials. | raw, food, subassembly, packaging, finished, mro, equipment, labor, product, service |
State | req | The item lifecycle state. Use "active" for items in use. | draft, active, archived |
Unit | req | The tracking unit — the full unit NAME, not the abbreviation ("gram", not "g"). | e.g. unit, gram, kilogram, ounce, pound, milliliter, liter, hour |
Description | opt | Free-text notes about the item. | e.g. Pure Madagascar bourbon |
BinLocation | opt | Where the item is physically stored. | e.g. Shelf A3 |
DefaultEntity | opt | Must exactly match an existing location or vendor name, or be left blank. | e.g. Main Kitchen |
Food | opt | Marks the item as a food item (enables allergen and expiry tracking). | true / false |
Price | opt | The item's SELLING price (not purchase cost). Leave blank for pure raw materials. | numeric, e.g. 6.00 |
Quantity | opt | Opening on-hand stock in the item's Unit. Pairs with UnitCost to seed the opening-balance transaction. Item level only — leave blank on variant rows. | numeric, 0 or more |
UnitCost | opt | Purchase cost per unit in your account currency. Pairs with Quantity for the opening balance. | numeric, 0 or more |
Allergens | opt | Comma-separated allergens present in the item. | milk, eggs, fish, shellfish, tree nuts, peanuts, wheat, soybeans, sesame |
MinimumOrderQuantity | opt | The smallest quantity you can order, in the item's Unit. | numeric, e.g. 12 |
OrderIncrement | opt | The step size in which the item is ordered. | numeric, e.g. 6 |
LeadTimeDaysOverride | opt | Overrides the vendor's default lead time, in days. | integer, e.g. 14 |
ReplenishPoint | opt | Low-stock trigger, in the item's Unit. On-hand at or below this flags the item. | numeric, 0 or more |
ReplenishQuantity | opt | Suggested top-up amount when the item runs low. | numeric, 0 or more |
Tags | opt | Semicolon-separated EXISTING tag names (matched case-insensitively). Import never creates tags. Item level only. | e.g. bestseller;fall-line |
VariantSKU | opt | SKU for a variant. On a variant row, repeat the item Name and SKU and fill this in. | e.g. SOAP-100-LG |
VariantDescription | opt | A description of the variant. | e.g. Large bar |
VariantPrice | opt | The selling price for this variant. | numeric, e.g. 9.00 |
VariantQuantity | opt | Opening stock for this variant, on the variant's row. Leave item-level Quantity blank or stock is double-counted. | numeric, 0 or more |
VariantUnitCost | opt | Purchase cost per unit for this variant. Pairs with VariantQuantity. | numeric, 0 or more |
AttributeName | opt | An item-level attribute. Must already exist under Settings > Attributes. | e.g. Scent |
AttributeValue | opt | The value for that attribute. Must be one of its defined options. | e.g. Lavender |
VariantAttributeName | opt | A variant-level attribute. Must already exist under Settings > Attributes. | e.g. Size |
VariantAttributeValue | opt | The value for the variant attribute. Must be one of its defined options. | e.g. Large |
Variant opening stock: never fill both levels
Quantity and UnitCost seed an opening-balance transaction for the item, setting on-hand stock and starting average cost in one step. For an item with variants, put opening stock on the variant rows via VariantQuantity and VariantUnitCost and leave the item-level columns blank — filling in both levels double-counts the stock, because each pair creates its own opening-balance transaction. See How Stock Moves for how opening balances work.
A variant row repeats the item's Name and SKU, then fills in the Variant columns. Attributes named in AttributeName or VariantAttributeName must already exist under Settings → Attributes with the value as a defined option, and Tags names must already exist in your tag registry — import never creates them.
Entity columns: vendors, customers, locations, charities
The same column set covers all entity lists. Name, Category, and State are required — except that on a list fixed to a single category (such as Vendors), the Category column does not need to be mapped.
| Column | Required | Description | Valid values / example |
|---|---|---|---|
Name | req | The entity name (business or person). | e.g. Bulk Supplies Co. |
Category | req | The entity type. Not required to map on single-category lists such as Vendors. | vendor, customer, charity, primary, secondary, storage, production, sales |
State | req | Lifecycle state. | draft, active, archived |
FirstName | opt | Contact first name. | e.g. Dana |
LastName | opt | Contact last name. | e.g. Reyes |
StreetAddress1 | opt | Address line 1. | e.g. 12 Main St |
StreetAddress2 | opt | Address line 2. | e.g. Suite 4 |
City | opt | City. | e.g. Austin |
StateProvince | opt | State or province. | e.g. TX |
PostalCode | opt | Postal or ZIP code. | e.g. 78701 |
Country | opt | Country name from the supported list. | e.g. United States |
Email | opt | Contact email address. | e.g. hello@example.com |
Phone | opt | Contact phone number. | e.g. 555-0100 |
Website | opt | Website URL. | e.g. example.com |
Source | opt | Customers only. An EXISTING referral-source name (matched case-insensitively); never auto-created. | e.g. Farmers Market |
Groups | opt | Customers only. Semicolon-separated EXISTING group names; never auto-created. | e.g. Wholesale;VIP |
LeadTimeDays | opt | Vendors only. Typical lead time in days. | integer, 0 or more |
MinimumOrderValue | opt | Vendors only. Minimum order value in your account currency. | numeric, 0 or more |
OrderingNotes | opt | Vendors only. Free-text ordering notes. | e.g. Order by Wednesday |
Source and Groups only apply to customers, and LeadTimeDays, MinimumOrderValue, and OrderingNotes only to vendors — they are rejected on other categories. Source and group names must already exist in your registries; import never creates them.
Transaction columns
One row per transaction line item. The Entity and Inventory values must match records that already exist in your account.
| Column | Required | Description | Valid values / example |
|---|---|---|---|
InitiationDate | req | When the transaction started. | date, e.g. 2026-07-01 |
TransactionNumber | opt | Order, invoice, or receipt reference. | e.g. INV-1042 |
Entity | req | The vendor, customer, or other entity — must match an existing entity name. | e.g. Bulk Supplies Co. |
Category | req | The transaction category. | initial, purchase, adjustment, waste, loss, donation, stocktake, manufacture, assembly, send, receive, sale, expense, income, consumption |
Status | req | The transaction status. Only completed transactions move stock. | initiated, in progress, completed, canceled, returned |
CompletionDate | opt | When the transaction completed. | date, e.g. 2026-07-03 |
Surcharge | opt | Surcharge amount. | numeric |
Discount | opt | Discount amount. | numeric |
Tax | opt | Tax amount. | numeric |
Shipping | opt | Shipping amount. | numeric |
Fees | opt | Other fees. | numeric |
MethodFees | opt | Payment-processing fees. | numeric |
Inventory | req | The inventory item on this line — must match an existing item. | e.g. Lavender Soap |
BatchNumber | opt | Batch or lot number for the line. | e.g. LOT-88 |
BrandName | opt | Brand of the purchased goods. | e.g. Acme |
ProductName | opt | The vendor's own product name. | e.g. Soap Base 5kg |
CountryOfOrigin | opt | Country of origin from the supported list. | e.g. United States |
ExpirationDate | opt | Expiry date for perishable goods. | date |
PackageUnit | req | The unit each package is measured in — full unit name. | e.g. gram, unit, liter |
QuantityInPackage | req | How much of the item one package contains. | numeric |
PackageCost | req | Cost (or sale price on sales) per package. | numeric |
PackageQuantity | req | How many packages this line covers. | numeric |
TaxCategory | opt | An existing tax-category name. | e.g. Supplies |
Description | opt | Line description. | free text |
Notes | opt | Free-text notes. | free text |
Tags | opt | Semicolon-separated EXISTING tag names; never auto-created. | e.g. market-day |
Status must be completed for stock to move
Imported transactions follow the same rule as everything else in Ardent Seller: only completed transactions change on-hand quantities. If you import historical purchases or sales with a Status of initiated or in progress, your stock will not move until each transaction is marked completed. See How Stock Moves.
Procedure columns: recipes and production
A procedure spans multiple rows: the first row carries the procedure-level fields, and additional rows repeating the Name carry one ingredient or one step each. The TargetInventory item must already exist.
| Column | Required | Description | Valid values / example |
|---|---|---|---|
Name | req | The recipe or procedure name. Repeated on every ingredient and step row. | e.g. Lavender Soap Batch |
Description | opt | Free-text description. | free text |
BatchNumber | opt | Batch or lot number. | e.g. LOT-88 |
Category | req | The procedure type. | recipe, production |
State | req | Lifecycle state. | draft, active, archived |
TargetInventory | req | The item this procedure produces — must match an existing producible item. | e.g. Lavender Soap |
TargetVariantSKU | opt | Targets the recipe at a specific variant of the target item. Must match one of its VariantSKUs; blank targets the whole product. | e.g. SOAP-100-LG |
InitiationDate | opt | Start date. | date |
CompletionDate | opt | Completion date. | date |
BatchUnit | req | The unit the batch output is measured in — full unit name. | e.g. unit, gram, liter |
QuantityInBatch | req | How much one batch yields, in the BatchUnit. | numeric |
BatchQuantity | opt | Number of batches. | numeric |
Ingredient | opt | One ingredient per row — must match an existing item allowed for this target. | e.g. Lavender Oil |
IngredientUnit | opt | The unit for the ingredient quantity — full unit name. | e.g. milliliter |
IngredientQuantity | opt | How much of the ingredient one batch uses. | numeric |
StepNumber | opt | One step per row; steps are ordered by this number. | integer, e.g. 1 |
StepInstruction | opt | What the step does. | e.g. Melt the base |
StepDurationQuantity | opt | How long the step takes. | numeric |
StepDurationUnit | opt | The time unit for the duration. | e.g. minute, hour |
Tags | opt | Semicolon-separated EXISTING tag names on the first row; never auto-created. | e.g. fall-line |
Settings registries and custom fields
Five Settings registries have their own ⋯ menu import. Each is a small, flat CSV — download the registry's template to see the headers.
| Registry | Required columns | Optional columns |
|---|---|---|
| Tax Categories | Name, CategoryType, State | IRSCategory, Description, SortOrder |
| Transaction Methods | Name, State | Description, ApplicableCategories (semicolon-separated), FixedFee, PercentageFee |
| Referral Sources | Name, State | Description |
| Pricing Tiers | Name, Tier Type, Value Type, Value, State | Description |
| Attributes | Name, State | Options (semicolon-separated name:abbreviation pairs) |
Custom fields are imported as extra columns on the surfaces that host them: after you define a field under Settings → Custom Fields, its exported header looks like CF: Field name and appears in the mapping step like any other column. The field definitions themselves are created in Settings, not by CSV. Tag and customer-group registries do not have a CSV import either — create tags and groups in Settings first, then reference them by name in the Tags and Groups columns of the imports above.
Common errors and what they mean
These are the exact messages the importer shows (row numbers and values vary with your file).
Please select a CSV file.
The file is not a .csv. Export or save your spreadsheet as CSV first — .xlsx and other formats are not accepted.
File is too large (12.4 MB). Maximum size is 10 MB.
The 10 MB limit is per file. Split a large export into smaller files and import them one at a time.
The CSV file contains no data rows.
The file has headers but nothing beneath them. Add at least one data row.
CSV parsing error (Row 3): ...
The file itself is malformed at that row — often an unclosed quote or a ragged row. Re-export from your spreadsheet program.
"Name" is required. Choose the CSV column that contains it.
A required field is not mapped to any CSV column. In the mapping step, assign a column to every field marked required.
The CSV column "Product Name" is mapped to more than one field (Name, SKU). Each column can only be used once.
Two fields point at the same CSV column. Change one of them — every field needs its own column.
Row 4: Category is required. Valid values: raw, food, subassembly, ...
A required cell is blank on that row. Fill it in with one of the listed values.
Row 4: Invalid Unit "g". Did you mean "gram"?
The value is close to a valid one but not exact. Values are matched case-insensitively, but abbreviations are not accepted — use the suggested full name.
No account selected. Please try again.
The app lost track of your active account. Reload the page and retry the import.
Account changed during import. Please try again.
You switched accounts while the import was running. Switch back and run the import again — nothing was saved.
Failed to import data: ...
The rows validated but the server rejected the save; the message contains the reason. Fix it and retry, or contact support via the in-app help form if it persists.
What import never does
Import fills in your data — it never invents reference records from the values it finds. Specifically, import never auto-creates:
- Locations or vendors — a
DefaultEntityorEntityvalue must match an existing entity by name. - Attributes or attribute options — define them under Settings → Attributes first.
- Tags — names in the
Tagscolumn must match existing registry tags; unrecognized names are reported as errors. - Customer groups or referral sources — the
GroupsandSourcevalues must match existing names.
It also never saves part of a file: validation is all-or-nothing, so a failed import leaves your account exactly as it was. Create the reference records first, then import — if an import fails, the row-numbered errors tell you which values were not found.
Related articles
Importing from CSV
How to bulk-import inventory, entities, transactions, and more into Ardent Seller from CSV — including opening stock quantities and unit costs.
How Stock Moves
How inventory quantities change in Ardent Seller — which transaction categories add or remove stock, and why nothing moves until a transaction is Completed.
Troubleshooting
Fix the most common Ardent Seller problems — stock that did not move, production runs that consumed nothing, inventory missing after switching locations, CSV import errors, and save failures.