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.

CSV
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""}"
JSON
[
  {
    "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
<?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 columnJSONXML
ItemCodeskuSKU
  • 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 columnJSONXML
BarcodebarcodeBarcode
  • Format: Text, matched exactly, capitals included.
  • Required: No.
  • Example: 5012345678900

Brand

Brand name.

CSV columnJSONXML
BrandbrandBrand
  • Format: Text.
  • Required: No.
  • Example: Example Cellars

Manufacturer

Who makes it.

CSV columnJSONXML
ManufacturermanufacturerManufacturer
  • Format: Text.
  • Required: No.
  • Example: Example Wines Ltd

MPN

The manufacturer’s own part number.

CSV columnJSONXML
MPNmpnMPN
  • Format: Text, matched exactly, capitals included.
  • Required: No.
  • Example: EC-RR-75

SupplierCode

Your supplier’s code for it.

CSV columnJSONXML
SupplierCodesupplier_codeSupplierCode
  • 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 columnJSONXML
ParentSKUparent_skuParentSKU
  • Format: Text, matched exactly, capitals included.
  • Required: No.

CountryOfOrigin

Where it was made: a country name or two-letter code.

CSV columnJSONXML
CountryOfOrigincountry_of_originCountryOfOrigin
  • Format: Text.
  • Required: No.
  • Example: ES

Description

The product name reps see on the tile. Keep it short.

CSV columnJSONXML
DescriptiontitleTitle
  • 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 columnJSONXML
LongDescriptiondescriptionDesc
  • Format: Text.
  • Required: No.
  • Example: Aged for three years in oak.

CategoryPaths

The categories it belongs in.

CSV columnJSONXML
CategoryPathscategoriesCategories
  • 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 columnJSONXML
BulletPointsbulletsBullets
  • 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 columnJSONXML
AttributesattributesAttributes
  • 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 columnJSONXML
PriceListspricesPrices
  • 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 columnJSONXML
PriceRRPrrpRRP
  • 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 columnJSONXML
PriceSalesale_priceSalePrice
  • 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 columnJSONXML
IsOnSaleon_saleOnSale
  • 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 columnJSONXML
CurrencycurrencyCurrency
  • Format: Text, matched exactly, capitals included.
  • Required: No.
  • Example: GBP

CostPrice

What it costs you, kept for reference.

CSV columnJSONXML
CostPricecost_priceCostPrice
  • 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 columnJSONXML
PriceValidFromprice_valid_fromPriceValidFrom
  • Format: A date. 2026-12-31 is 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 columnJSONXML
PriceValidToprice_valid_toPriceValidTo
  • Format: A date. 2026-12-31 is always read; other shapes are in Dates.
  • Required: No.
  • Example: 2026-12-31

TaxCode

The VAT code that sets its rate.

CSV columnJSONXML
TaxCodetaxTaxCode
  • 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 columnJSONXML
MOQmoqMOQ
  • Format: A whole number.
  • Required: No.
  • Example: 6

OrderMultiple

Ordered in multiples of this, such as 6 for a case of six.

CSV columnJSONXML
OrderMultipleorder_multOrderMult
  • Format: A whole number.
  • Required: No.
  • Example: 6

MaxOrderQty

The most one order may take.

CSV columnJSONXML
MaxOrderQtymax_order_qtyMaxOrderQty
  • Format: A whole number.
  • Required: No.
  • Example: 600

QtyInner

Units in an inner pack.

CSV columnJSONXML
QtyInnerinnerInner
  • Format: A whole number.
  • Required: No.
  • Example: 6

QtyOuter

Units in an outer case.

CSV columnJSONXML
QtyOuterouterOuter
  • Format: A whole number.
  • Required: No.
  • Example: 12

QtyPallet

Units on a pallet.

CSV columnJSONXML
QtyPalletpalletPallet
  • Format: A whole number.
  • Required: No.
  • Example: 600

QtyBreaks

Volume prices: a lower price each from a quantity up.

CSV columnJSONXML
QtyBreaksqty_breaksQtyBreaks
  • Format: Quantity and price pairs separated by |: 24:9.50 is 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 columnJSONXML
WeightweightWeight
  • Format: A number; decimals allowed.
  • Required: No.
  • Example: 1.3

Dimensions

Size, written however you like.

CSV columnJSONXML
DimensionsdimensionsDimensions
  • Format: Text.
  • Required: No.
  • Example: 8 x 8 x 30 cm

HazardousFlag

Yes if it is classed as hazardous.

CSV columnJSONXML
HazardousFlaghazardousHazardous
  • Format: Yes or no: see Yes and no below.
  • Required: No.
  • Example: No

ShippingClass

Your own shipping class code, if you use one.

CSV columnJSONXML
ShippingClassshipping_classShippingClass
  • Format: Text, matched exactly, capitals included.
  • Required: No.
  • Example: STANDARD

StockQty

How many you have.

CSV columnJSONXML
StockQtystockStock
  • 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 columnJSONXML
IncomingQtyincomingIncoming
  • Format: A whole number.
  • Required: No.
  • Example: 120

AllowBackorder

Yes to let reps order it when stock runs out.

CSV columnJSONXML
AllowBackorderbackorderBackorder
  • 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 columnJSONXML
IncomingDateincoming_dateIncomingDate
  • Format: A date. 2026-12-31 is always read; other shapes are in Dates.
  • Required: No.
  • Example: 2026-12-01

RelatedSKUs

ItemCodes of products to suggest alongside this one.

CSV columnJSONXML
RelatedSKUsrelatedRelated
  • 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 columnJSONXML
SubstituteSKUssubstitutesSubstitutes
  • 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 columnJSONXML
StatusstatusStatus
  • 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 columnJSONXML
DiscontinuedDatediscontinued_dateDiscontinuedDate
  • Format: A date. 2026-12-31 is always read; other shapes are in Dates.
  • Required: No.

WarrantyInfo

Warranty terms.

CSV columnJSONXML
WarrantyInfowarrantyWarranty
  • Format: Text.
  • Required: No.
  • Example: Replaced if faulty on delivery

BatchLotTracking

Yes if it is tracked by batch or lot.

CSV columnJSONXML
BatchLotTrackingbatch_trackingBatchTracking
  • Format: Yes or no: see Yes and no below.
  • Required: No.
  • Example: Yes

CustomData

Anything else you want kept with the product.

CSV columnJSONXML
CustomDatacustom_dataCustomData
  • 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