CSV Import

CSV Importer

The Ka-ching backend offers a convenient way of importing products to the POS. You can maintain a small 'database' of products in the form of a spreadsheet, and export this as a CSV document.

This document can simply be drag/dropped to the import window, and the import will initiate.

CSV format details

The CSV format does not have any formal specification, but instead rely on conventions.

The following details apply to our interpretation of the CSV format.

  • We try to auto-detect field delimiters and should be able to handle both semicolon (;) and comma (,)
  • Similarly for decimal delimiters. Note that you may not use comma for both field delimiter and decimal delimiter for obvious reasons
  • We use line breaks (\n) as row delimiters
  • The file is expected to be encoded as UTF-8
  • The first line represents the fields to be imported. More about this below.
  • Field values may be surrounded by quotes (") in order to represent line breaks in the data (for instance for product descriptions). In order to represent a quote (") inside a quoted string, the quote must itself be escaped with an extra quote ("").

Product format

A product can be represented by as little as three values:

Required values

  • Unique identifier
  • Name
  • Retail price

The unique identifier is used to identify the product, so that if you import the CSV file repeatedly, then the product matching the identifier will be overwritten with the new values.

The name is required in order to logically identify the product in the POS, and in statistics, etc.

The retail price is required since otherwise we cannot sell the product.

Optional values

  • Bar code
  • Product description
  • Cost price
  • Sale price
  • Image URL

The bar code can be used to represent the textual value of the bar code on the physical product. This may correspond to an EAN code, an ISBN number or a SKU. If this value is present, the product can be added to the basket by scanning the bar code.

The Product description is shown when long-pressing a product in the POS.

If a cost price is added, then we can calculate the contribution margin when selling the product. This value is always represented without any taxes added.

If a Sale price is added, then a discount will be added when the product is added to the basket. So if a product normally cost 100 DKK and the sale price is 80 DKK, then the POS will 'cross out' the 100 DKK and write 'New price: 80 DKK'

You may import images for the products as described below, but if you already know of publically accessible URLs for the images on a CDN, you may also include the image URL directly. The images should be in JPEG or PNG format.

Localizable values

The product name and product description is localizable data. This means that instead of giving a product a fixed name, you may specify it in any of the 13 languages that we currently support:

  • Danish
  • English
  • French
  • Norwegian (Bokmål)

To specify a field in multiple languages, you just postfix the field with a dot (.) and the language code. The codes for the languages are:

  • da
  • en
  • fr
  • nb

So for instance, the 'product name' field is called 'field'. So the following imports two products with no localization of the name:

id;name;retail_price
p001;Coffee;10.50
p002;Tea;9.50

These products could be localized into Danish and English as follows:

id;name.da;name.en;retail_price
p001;Kaffe;Coffee;10.50
p002;Te;Tea;9.50

Tags

You can tag a product with one or more categories. The identifiers for the tags can be seen under the 'Tags' editor in the Portal. To add two tags to your products you can use the fields tags.0 and tags.1.

Example:

id;name;retail_price;tags.0;tags.1
p001;Coffee;10.50;beverage;caffeinated
p002;Tea;9.50;beverage;popular

Field names

Now we have described the overall product structure and the required and optional fields. Here is a list of all the currently supported field names:

  • id
  • name (localizable)
  • description (localizable)
  • retail_price
  • cost_price
  • sale_price
  • image_url
  • tag.0, tag.1, tag.2, etc.

Finally an example with all the above values represented:

id;name.da;name.en;description.da;description.en;retail_price;cost_price;sale_price;image_url;barcode;tags.0;tags.1
p001;Kaffe;Coffee;"Kaffe er en sund og dejlig drik.
Og denne beskrivelse strækker sig over flere linjer";"Coffee is a healthy and excellent beverage.
And this description spans several lines";10.50;3.00;9.00;http://example.com/coffee.jpg;ABCDEFG;beverage;caffeinated
p002;Te;Tea;"Te er en ""drik"" og dette er et eksempel på at bruge gåseøjne i et felt";"Tea is a ""beverage"" and this is an example of using quotes inside a field";9.50;1.50;8.00;http://example.com/tea.jpg;ABCDEFX;beverage;popular

Batch uploading images

You may drag/drop multiple images to be imported in one go. The image names should identify which product they should be attached to, so in the above example we could batch import images for the Coffee and Tea by naming the images p001.jpg and p002.jpg and drag/dropping both images to the product image import.

Sample CSV files

To get started, you may experiment with the following files:

Simple

Advanced