How do I import product data?
1. Creating and Updating Products by SKU
You can create or update products using their SKU as the unique identifier.
-
Creating Products: To create a new product, the following fields are required:
-
Parent
-
SKU
-
Name
-
Price
-
Category Path
-
-
Updating Products: You can update any product information by using the SKU only. For example:
SKU | Price |
SKU | Name |
SKU | Any other field |
Do not include the "Parent" column if you are updating products.
2. Building your CSV file
For a smoother experience, you can export your existing products and use the file as a template for updates. Alternatively, you can create your own CSV file.
Anything that has a 1 can be replaced with 2, 3, 4, and so on to create multiple values. To add more entries, simply include additional columns following the same pattern. For example, a column with image 1 can be expanded to image 2, image 3, image 4, etc., allowing for multiple sets of data.
Heading | Description | Value |
parent | This connects the variants to a parent product. As long as the parent is the same for all variants, it will create a single product | Number |
sku | Product Identifier | Text |
barcode | barcode | Text |
mpn | MPN | Text |
name | Product Name | Text |
category path | Product Category | Text |
brand name | Product Brand | Text |
price | Product Price | Number |
on sale | Is the product on sale? | true/false |
sale price | Product Sale Price | Number |
active | Is the product Active? | true/false |
visible | Is the product Visible? | true/false |
track stock | Does this product track stock? | true/false |
stock | Product Stock Level | Number |
tag 1 |
Product Tag | Text |
on website | Show in Categories, Groups and Search | true/false |
charge tax | Charge tax on this product | true/false |
description | Product description | Text (HTML allowed) |
cost price | Product Cost Price | Number |
default variant | Whether this child should be the default variant for the product | true/false |
slug | The URL slug for this product. If a valid slug Text is not provided we will automatically convert it to a valid slug format. | slug |
stock on order_date | The date stock is expected to come in. | date (YYYY-MM-DD) |
stock on order | This is used with stock_on_order_date to help keep track of incoming stock | Number |
weight | Product weight | Number |
weight unit | Product weight unit | kg |
can be purchased | Whether this product can be added to basket | true/false |
has serial number | When enabled serial numbers for the product can be entered when dispatching an order | true/false |
hide in categories | When true the product will not be visible on category pages | true/false |
limit one per order | When true the product can only be purchased once within the same order | true/false |
meta description | The description content to show on search engines. | Text |
meta title | The title of the product's page on search engines. Defaults to the product name if not provided. | Text |
preorder unavailable | If you store is configured to allow pre-orders and preorder_unavailable is set to false, customers wont be able to pre order this product | true/false |
promo text | The promotional text content to be applied to the product. | Text (HTML allowed) |
publish date | A date in the future the product should be published on in UTC time. Set to null or don't provide this property to publish immediately. Any value provided other than null will be overridden if active is set to true. | YYYY-MM-DD HH-MM-SS |
use canonical url | When true the same canonical URL will be used for all variants | true/false |
canonical override | Set the canonical URL of this product (Optional. Advanced SEO feature - use with caution) | slug |
image 1 |
Product Image URL. You can create as many columns as you need by increasing the number by one. For example: Image 2, Image 3 | URL |
attribute:name |
Substitute 'name' for the name of your attribute. For example Size. | Text |
quantity increment 1 : min |
This will set "Can buy any quantity" to false and create an Increment | number |
quantity increment 1 : max |
This will set "Can buy any quantity" to false and create an Increment | number |
quantity increment 1 : increment |
This will set "Can buy any quantity" to false and create an Increment | number |
custom field:cf_field |
Substitute 'cf_field1' for the name of your custom field. For example cf_region. | Text |
If you would like to add/update tabbed content or customisations, you can add multiple of them by adding more columns. Each additional tabbed content / customisation section follows the same format, with an increasing number to differentiate them. For example, beyond customisation 1 : label, customisation 1 : type, you can add customisation 2 : label, customisation 2 : type, customisation 3 : label, customisation 3 : type, and so on. Simply continue this pattern to accommodate as many customisation sections as needed.
Heading | Description | Value |
tabbed content 1 : name |
The title of the tab. | Text |
tabbed content 1 : type |
The type of content to be displayed. | video_carousel description promo_text reviews tech_spec text |
tabbed content 1 : content |
The content to show within the tab. Only applicable when using the type text | Text (HTML allowed) |
secondary image 1 : name |
The title of the block. Will be displayed on the product page. | Text |
secondary image 1 : description |
Text content to be displayed along with the secondary image. | Text |
secondary image 1 : url |
Image URL | URL |
video carousel 1 : id |
The ID of the video. For Youtube, this is the v query parameter. | Text |
video carousel 1 : type |
The source type of the video, either Youtube or Vimeo | Youtube/Vimeo |
video carousel 1 : name |
The name of the video. Will not be displayed on the product page. | Text |
video carousel 1 : url |
The full URL to the video | URL |
video carousel 1 : thumbnail |
The thumbnail to use for the video. Displayed when multiple videos are within the carousel. | image URL |
customisation 1 : label |
The label of the customisation. | Text |
customisation 1 : type |
The type of customisation | text text_font textarea_font textarea select checkbox product product_list file range distance |
customisation 1 : placeholder |
The placeholder to be displayed for the input. Only available for customisation types: text, text_font, textarea_font, textarea | Text |
customisation 1 : modifier type |
The method used to add the cost of the customisation to the products price. Only available for customisation types: text, text_font, textarea_font, textarea, select, checkbox, file, range | add multiply add_end multiply_end |
customisation 1 : price modifier |
The amount to adjust the products price by when this customisation is purchased. Only available for customisation types: text, text_font, textarea_font, textarea, select, checkbox, file | Number |
customisation 1 : list type |
The type of input displayed on the product page. | select radio |
customisation 1 : value |
The product ID to use. Only available for customisation types: product | Number |
customisation 1 : values 1 : name |
The option that will be displayed in the Select. Only available for customisation types: Select | Text |
customisation 1 : values 1 : price modifier |
The amount to adjust the products price by when this value is selected. | Number |
customisation 1 : extras : mandatory |
Is this customisation mandatory? | on |
customisation 1 : extras : visibility |
Where can the customer see this customisation? Only available for customisation types: select |
product_page_only basket_page_only both_pages |
customisation 1 : extras : max length |
Maximum number of characters that can be inputed. Only available for customisation types: text, text_font, textarea_font, textarea | Number |
customisation 1 : extras : pattern |
A regex pattern that will be used to validate the users input. Only available for customisation types: text, text_font, textarea_font, textarea | Regex |
customisation 1 : extras : max number of files |
The maximum number of files that can be uploaded. Only available for customisation types: file | Number |
customisation 1 : extras : once per add to basket |
When enabled the customisation can only be added to one product in the customers basket. Only available for customisation types: product, product_list | True/False |
customisation 1 : extras : min |
The minimum value that the user can enter. Only available for customisation types: range | Number |
customisation 1 : extras : max |
The maximum value that the user can enter. Only available for customisation types: range | Number |
customisation 1 : extras : step |
The increment that the input value will be increased or decreased by when using the arrows on a number input. Only available for customisation types: range | Number |
customisation 1 : extras : default |
The default value for the input. Only available for customisation types: range | Number |
You can access and download a template here
3. Uploading Your File
Once your CSV file is ready:
- Go to the products index page
- Click on import
- Select Products
- Upload file (up to 100K rows, up to 100MB)
-
If your column headings match our required values, they will be automatically mapped.
-
If you're importing a sheet from another inventory system (e.g., for a price update), you can import the file as-is and manually map the columns. This flexibility allows for seamless integration without reformatting your existing file.
Options will appear disabled if the format is incorrect. For instance, this can occur if a text Text is present in your price column when a numerical value is expected, or if a field is already in use.
Once you are happy with the mapping move to the next step
5. Reviewing Your Import
After mapping your columns, you’ll see a preview of how your products will be processed:
-
Updated: SKU exists and format is correct.
-
Created: SKU does not exist, and all required fields for creation are present.
-
Ignored: SKU does not exist, and the required Parent column is missing.
6. Start the Import!
Once everything looks good, hit Start Import and let the system handle the rest! 🎉
7. Downloading the Import Report
Once the import is complete, you can download a report to check if anything went wrong. The report will provide details on any errors or issues encountered during the import process, allowing you to make necessary adjustments and re-import if needed.