Products file
Your catalogue: what a rep can sell, at what price, and how much of it you have. Reps see products in the catalogue grid, on the product page and in the cart.
File name: Products.csv, Products_2026-11-01.json or Products-export.xml. The name starts with the record type, in any case, and anything after a _ or - is yours.
Required: ItemCode; PriceRRP for a new record. Everything else may be left out or left blank.
Example
One complete record, in each format. All three import as the same record. The CSV is the sample file for products.
ItemCode,Barcode,Brand,Manufacturer,MPN,SupplierCode,ParentSKU,CountryOfOrigin,Description,LongDescription,CategoryPaths,BulletPoints,Attributes,PriceLists,PriceRRP,PriceSale,IsOnSale,Currency,CostPrice,PriceValidFrom,PriceValidTo,TaxCode,MOQ,OrderMultiple,MaxOrderQty,QtyInner,QtyOuter,QtyPallet,QtyBreaks,Weight,Dimensions,HazardousFlag,ShippingClass,StockQty,IncomingQty,AllowBackorder,IncomingDate,RelatedSKUs,SubstituteSKUs,Status,DiscontinuedDate,WarrantyInfo,BatchLotTracking,CustomData
WH002,5012345678900,Example Cellars,Example Wines Ltd,EC-RR-75,SUP-EC,,ES,Rioja Reserva 75cl,Aged for three years in oak.,WINE|WINE-RED,75cl|13.5% ABV|Vegan,"{""Region"": ""Rioja""}",TRADE:11.50|WHOLESALE:9.99,15.99,13.99,Yes,GBP,8.20,2026-11-01,2026-12-31,T1,6,6,600,6,12,600,24:9.50|48:8.75,1.3,8 x 8 x 30 cm,No,STANDARD,240,120,Yes,2026-12-01,WH001,WH003,Active,,Replaced if faulty on delivery,Yes,"{""Vintage"": ""2021""}"[
{
"sku": "WH002",
"barcode": "5012345678900",
"brand": "Example Cellars",
"manufacturer": "Example Wines Ltd",
"mpn": "EC-RR-75",
"supplier_code": "SUP-EC",
"country_of_origin": "ES",
"title": "Rioja Reserva 75cl",
"description": "Aged for three years in oak.",
"categories": [
"WINE",
"WINE-RED"
],
"bullets": [
"75cl",
"13.5% ABV",
"Vegan"
],
"attributes": {
"Region": "Rioja"
},
"prices": {
"TRADE": 11.5,
"WHOLESALE": 9.99
},
"rrp": 15.99,
"sale_price": 13.99,
"on_sale": true,
"currency": "GBP",
"cost_price": 8.2,
"price_valid_from": "2026-11-01",
"price_valid_to": "2026-12-31",
"tax": "T1",
"moq": 6,
"order_mult": 6,
"max_order_qty": 600,
"inner": 6,
"outer": 12,
"pallet": 600,
"qty_breaks": {
"24": 9.5,
"48": 8.75
},
"weight": 1.3,
"dimensions": "8 x 8 x 30 cm",
"hazardous": false,
"shipping_class": "STANDARD",
"stock": 240,
"incoming": 120,
"backorder": true,
"incoming_date": "2026-12-01",
"related": [
"WH001"
],
"substitutes": [
"WH003"
],
"status": "Active",
"warranty": "Replaced if faulty on delivery",
"batch_tracking": true,
"custom_data": {
"Vintage": "2021"
}
}
]<?xml version="1.0" encoding="UTF-8"?>
<Feed>
<Product>
<SKU>WH002</SKU>
<Barcode>5012345678900</Barcode>
<Brand>Example Cellars</Brand>
<Manufacturer>Example Wines Ltd</Manufacturer>
<MPN>EC-RR-75</MPN>
<SupplierCode>SUP-EC</SupplierCode>
<CountryOfOrigin>ES</CountryOfOrigin>
<Title>Rioja Reserva 75cl</Title>
<Desc>Aged for three years in oak.</Desc>
<Categories>WINE|WINE-RED</Categories>
<Bullets>75cl|13.5% ABV|Vegan</Bullets>
<Attributes>{"Region": "Rioja"}</Attributes>
<Prices>
<TRADE>11.50</TRADE>
<WHOLESALE>9.99</WHOLESALE>
</Prices>
<RRP>15.99</RRP>
<SalePrice>13.99</SalePrice>
<OnSale>Yes</OnSale>
<Currency>GBP</Currency>
<CostPrice>8.20</CostPrice>
<PriceValidFrom>2026-11-01</PriceValidFrom>
<PriceValidTo>2026-12-31</PriceValidTo>
<TaxCode>T1</TaxCode>
<MOQ>6</MOQ>
<OrderMult>6</OrderMult>
<MaxOrderQty>600</MaxOrderQty>
<Inner>6</Inner>
<Outer>12</Outer>
<Pallet>600</Pallet>
<QtyBreaks>24:9.50|48:8.75</QtyBreaks>
<Weight>1.3</Weight>
<Dimensions>8 x 8 x 30 cm</Dimensions>
<Hazardous>No</Hazardous>
<ShippingClass>STANDARD</ShippingClass>
<Stock>240</Stock>
<Incoming>120</Incoming>
<Backorder>Yes</Backorder>
<IncomingDate>2026-12-01</IncomingDate>
<Related>WH001</Related>
<Substitutes>WH003</Substitutes>
<Status>Active</Status>
<Warranty>Replaced if faulty on delivery</Warranty>
<BatchTracking>Yes</BatchTracking>
<CustomData>{"Vintage": "2021"}</CustomData>
</Product>
</Feed>In XML each record is a <Product> element; the element around them can be called anything.
Fields
ItemCode
Your product code. A row with a code already on the tablet updates that product.
| CSV column | JSON | XML |
|---|---|---|
ItemCode | sku | SKU |
- Format: Text, matched exactly, capitals included.
- Required: Yes.
- Example:
WH002 - Tip: Product photographs are matched to it exactly, case included: WH001.jpg, and WH001-2.jpg for a second picture.
Barcode
The barcode number (EAN, UPC or your own). Scanning with the camera or a Bluetooth scanner finds the product by it.
| CSV column | JSON | XML |
|---|---|---|
Barcode | barcode | Barcode |
- Format: Text, matched exactly, capitals included.
- Required: No.
- Example:
5012345678900
Brand
Brand name.
| CSV column | JSON | XML |
|---|---|---|
Brand | brand | Brand |
- Format: Text.
- Required: No.
- Example:
Example Cellars
Manufacturer
Who makes it.
| CSV column | JSON | XML |
|---|---|---|
Manufacturer | manufacturer | Manufacturer |
- Format: Text.
- Required: No.
- Example:
Example Wines Ltd
MPN
The manufacturer’s own part number.
| CSV column | JSON | XML |
|---|---|---|
MPN | mpn | MPN |
- Format: Text, matched exactly, capitals included.
- Required: No.
- Example:
EC-RR-75
SupplierCode
Your supplier’s code for it.
| CSV column | JSON | XML |
|---|---|---|
SupplierCode | supplier_code | SupplierCode |
- Format: Text, matched exactly, capitals included.
- Required: No.
- Example:
SUP-EC
ParentSKU
The ItemCode of the product this is a variant of, if any.
| CSV column | JSON | XML |
|---|---|---|
ParentSKU | parent_sku | ParentSKU |
- Format: Text, matched exactly, capitals included.
- Required: No.
CountryOfOrigin
Where it was made: a country name or two-letter code.
| CSV column | JSON | XML |
|---|---|---|
CountryOfOrigin | country_of_origin | CountryOfOrigin |
- Format: Text.
- Required: No.
- Example:
ES
Description
The product name reps see on the tile. Keep it short.
| CSV column | JSON | XML |
|---|---|---|
Description | title | Title |
- Format: Text.
- Required: No.
- Example:
Rioja Reserva 75cl - Tip: A new product with no name is shown by its ItemCode.
LongDescription
The full description on the product page.
| CSV column | JSON | XML |
|---|---|---|
LongDescription | description | Desc |
- Format: Text.
- Required: No.
- Example:
Aged for three years in oak.
CategoryPaths
The categories it belongs in.
| CSV column | JSON | XML |
|---|---|---|
CategoryPaths | categories | Categories |
- Format: Codes separated by
|, each matched exactly. In JSON, a list. - Required: No.
- Example:
WINE|WINE-RED - Tip: Use each category’s CategoryId from the categories file, not its name.
BulletPoints
Key features, shown on the product page.
| CSV column | JSON | XML |
|---|---|---|
BulletPoints | bullets | Bullets |
- Format: Items separated by
|. In JSON, a list. - Required: No.
- Example:
75cl|13.5% ABV|Vegan
Attributes
Name and value pairs for the specification table on the product page.
| CSV column | JSON | XML |
|---|---|---|
Attributes | attributes | Attributes |
- Format: A JSON object. In a CSV the cell is quoted and its own quotes doubled; in JSON, a real object; in XML, the JSON as text.
- Required: No.
- Example:
{"Region": "Rioja"}
PriceLists
Contracted prices by price list. A customer whose PriceList is TRADE pays the TRADE price.
| CSV column | JSON | XML |
|---|---|---|
PriceLists | prices | Prices |
- Format: Name and price pairs separated by
|:TRADE:11.50|WHOLESALE:9.99. In JSON, an object; in XML, an element per price list. - Required: No.
- Example:
TRADE:11.50|WHOLESALE:9.99 - Tip: Names match a customer’s PriceList whatever the case. A price list can also be a column of its own, or a row of its own: see the field reference.
PriceRRP
The list price everybody without a contract pays.
| CSV column | JSON | XML |
|---|---|---|
PriceRRP | rrp | RRP |
- Format: A number such as
9.99. A currency symbol, thousands separators and a decimal comma are read too. - Required: For a record the tablet does not have yet.
- Example:
15.99 - Tip: A new product with no list price is refused rather than imported at nothing. If your catalogue has no list prices at all, remove this column from the profile and price through price lists.
PriceSale
A sale price, charged while IsOnSale is Yes.
| CSV column | JSON | XML |
|---|---|---|
PriceSale | sale_price | SalePrice |
- Format: A number such as
9.99. A currency symbol, thousands separators and a decimal comma are read too. - Required: No.
- Example:
13.99 - Tip: Never charged above a customer’s contracted price.
IsOnSale
Yes to charge PriceSale.
| CSV column | JSON | XML |
|---|---|---|
IsOnSale | on_sale | OnSale |
- Format: Yes or no: see Yes and no below.
- Required: No.
- Example:
Yes - Tip: PriceValidFrom and PriceValidTo narrow a sale to those dates; they never start one by themselves.
Currency
The currency these prices are in, as a three-letter code such as GBP or EUR.
| CSV column | JSON | XML |
|---|---|---|
Currency | currency | Currency |
- Format: Text, matched exactly, capitals included.
- Required: No.
- Example:
GBP
CostPrice
What it costs you, kept for reference.
| CSV column | JSON | XML |
|---|---|---|
CostPrice | cost_price | CostPrice |
- Format: A number such as
9.99. A currency symbol, thousands separators and a decimal comma are read too. - Required: No.
- Example:
8.20
PriceValidFrom
First day the sale price applies. Blank means already started.
| CSV column | JSON | XML |
|---|---|---|
PriceValidFrom | price_valid_from | PriceValidFrom |
- Format: A date.
2026-12-31is always read; other shapes are in Dates. - Required: No.
- Example:
2026-11-01
PriceValidTo
Last day the sale price applies, that day included. Blank means no end.
| CSV column | JSON | XML |
|---|---|---|
PriceValidTo | price_valid_to | PriceValidTo |
- Format: A date.
2026-12-31is always read; other shapes are in Dates. - Required: No.
- Example:
2026-12-31
TaxCode
The VAT code that sets its rate.
| CSV column | JSON | XML |
|---|---|---|
TaxCode | tax | TaxCode |
- Format: Text, matched exactly, capitals included.
- Required: No.
- Example:
T1 - Tip: T1 is 20%, T5 is 5%, T0 is zero-rated and T2 is exempt, with no setup. Other codes and rates are added in Business Rules.
MOQ
The fewest that can be ordered.
| CSV column | JSON | XML |
|---|---|---|
MOQ | moq | MOQ |
- Format: A whole number.
- Required: No.
- Example:
6
OrderMultiple
Ordered in multiples of this, such as 6 for a case of six.
| CSV column | JSON | XML |
|---|---|---|
OrderMultiple | order_mult | OrderMult |
- Format: A whole number.
- Required: No.
- Example:
6
MaxOrderQty
The most one order may take.
| CSV column | JSON | XML |
|---|---|---|
MaxOrderQty | max_order_qty | MaxOrderQty |
- Format: A whole number.
- Required: No.
- Example:
600
QtyInner
Units in an inner pack.
| CSV column | JSON | XML |
|---|---|---|
QtyInner | inner | Inner |
- Format: A whole number.
- Required: No.
- Example:
6
QtyOuter
Units in an outer case.
| CSV column | JSON | XML |
|---|---|---|
QtyOuter | outer | Outer |
- Format: A whole number.
- Required: No.
- Example:
12
QtyPallet
Units on a pallet.
| CSV column | JSON | XML |
|---|---|---|
QtyPallet | pallet | Pallet |
- Format: A whole number.
- Required: No.
- Example:
600
QtyBreaks
Volume prices: a lower price each from a quantity up.
| CSV column | JSON | XML |
|---|---|---|
QtyBreaks | qty_breaks | QtyBreaks |
- Format: Quantity and price pairs separated by
|:24:9.50is 9.50 each from 24 up. In JSON, an object. - Required: No.
- Example:
24:9.50|48:8.75
Weight
Weight of one unit, in kilograms.
| CSV column | JSON | XML |
|---|---|---|
Weight | weight | Weight |
- Format: A number; decimals allowed.
- Required: No.
- Example:
1.3
Dimensions
Size, written however you like.
| CSV column | JSON | XML |
|---|---|---|
Dimensions | dimensions | Dimensions |
- Format: Text.
- Required: No.
- Example:
8 x 8 x 30 cm
HazardousFlag
Yes if it is classed as hazardous.
| CSV column | JSON | XML |
|---|---|---|
HazardousFlag | hazardous | Hazardous |
- Format: Yes or no: see Yes and no below.
- Required: No.
- Example:
No
ShippingClass
Your own shipping class code, if you use one.
| CSV column | JSON | XML |
|---|---|---|
ShippingClass | shipping_class | ShippingClass |
- Format: Text, matched exactly, capitals included.
- Required: No.
- Example:
STANDARD
StockQty
How many you have.
| CSV column | JSON | XML |
|---|---|---|
StockQty | stock | Stock |
- Format: A whole number.
- Required: No.
- Example:
240 - Tip: Reps see it less what their own tablet has already sold.
IncomingQty
How many are on order from your supplier.
| CSV column | JSON | XML |
|---|---|---|
IncomingQty | incoming | Incoming |
- Format: A whole number.
- Required: No.
- Example:
120
AllowBackorder
Yes to let reps order it when stock runs out.
| CSV column | JSON | XML |
|---|---|---|
AllowBackorder | backorder | Backorder |
- Format: Yes or no: see Yes and no below.
- Required: No.
- Example:
Yes - Tip: Only when Business Rules allow out-of-stock ordering as well.
IncomingDate
When the incoming stock is due.
| CSV column | JSON | XML |
|---|---|---|
IncomingDate | incoming_date | IncomingDate |
- Format: A date.
2026-12-31is always read; other shapes are in Dates. - Required: No.
- Example:
2026-12-01
RelatedSKUs
ItemCodes of products to suggest alongside this one.
| CSV column | JSON | XML |
|---|---|---|
RelatedSKUs | related | Related |
- Format: Codes separated by
|, each matched exactly. In JSON, a list. - Required: No.
- Example:
WH001
SubstituteSKUs
ItemCodes to offer when this one is out of stock.
| CSV column | JSON | XML |
|---|---|---|
SubstituteSKUs | substitutes | Substitutes |
- Format: Codes separated by
|, each matched exactly. In JSON, a list. - Required: No.
- Example:
WH003
Status
Active, Coming Soon, Clearance or Discontinued, in any case.
| CSV column | JSON | XML |
|---|---|---|
Status | status | Status |
- Format: Text.
- Required: No.
- Example:
Active - Tip: Discontinued hides it from reps. Coming Soon and Clearance show with a badge.
DiscontinuedDate
When it was or will be discontinued.
| CSV column | JSON | XML |
|---|---|---|
DiscontinuedDate | discontinued_date | DiscontinuedDate |
- Format: A date.
2026-12-31is always read; other shapes are in Dates. - Required: No.
WarrantyInfo
Warranty terms.
| CSV column | JSON | XML |
|---|---|---|
WarrantyInfo | warranty | Warranty |
- Format: Text.
- Required: No.
- Example:
Replaced if faulty on delivery
BatchLotTracking
Yes if it is tracked by batch or lot.
| CSV column | JSON | XML |
|---|---|---|
BatchLotTracking | batch_tracking | BatchTracking |
- Format: Yes or no: see Yes and no below.
- Required: No.
- Example:
Yes
CustomData
Anything else you want kept with the product.
| CSV column | JSON | XML |
|---|---|---|
CustomData | custom_data | CustomData |
- Format: A JSON object. In a CSV the cell is quoted and its own quotes doubled; in JSON, a real object; in XML, the JSON as text.
- Required: No.
- Example:
{"Vintage": "2021"} - Tip: In a CSV, any column the profile does not name is kept here too. In XML, child elements of CustomData are read as its fields.
Rules for every field
- A blank cell keeps what the tablet has, with Ignore blank cells on, as it ships. Switched off, a blank clears the field.
- A column the file does not have always keeps what the tablet has, whatever that setting says.
- A value that cannot be read, such as a date, number or yes/no in a shape the app does not know, stops that record importing. The sync log names the field and the value, and the record keeps what it had. A field whose tip says otherwise is the exception.
- Column names are matched without case and ignoring surrounding spaces.
Yes and no
In any case:
- Yes:
true,t,yes,y,1,-1,x,on,active,enabled - No:
false,f,no,n,0,off,inactive,disabled