---
title: CSV Product Import
slug: csv-product-import
docTags: 
createdAt: 2026-01-07T13:40:45.676Z
---

## Bulk Import Products Using CSV

Bulk import is the fastest way to add many products at once. Instead of creating items one by one, you fill a CSV file (Excel/Google Sheets) and upload it.

***

## Navigating to the Product Import Section&#x20;

- To import products, go to **Admin Panel > Merchants**, and use the **Auto-Login** option to access the merchant panel.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/BtRWJ0xuC2PpQKCa-lrlR_image.png)

- In the merchant panel, go to the **Catalogue&#x20;**&#x73;ection and click on **Import&#x20;**&#x74;o select your preferred import method.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/IehIoOUCVfx5BJF-Gq_sZ_image.png)

***

:::hint{type="info"}
**Required Fields for Successful Product Import**

**Important:** The following fields MUST be filled for a product to import successfully. If any of these are missing, the import will fail.



### Mandatory Fields

- **Product Name**&#x20;
- **Selling Price**&#x20;
- **Cost Price**&#x20;
- **Product Category**
:::



### Product ID (Product.ID)

:::hint{type="danger"}
The **Product.ID** column needs to be blank. It will be filled automatically as the system generates the product ID for each product.
:::



### Product Name (Product.Name)

**What this column is:**
&#x20;The name of the product as customers will see it.

**Rules:**

- Required&#x20;
- Plain text&#x20;
- One product per row&#x20;

**Example: "**&#x50;izza"

***

### Description (Product.Description)

**What this column is:**
&#x20;A short explanation of the product.

**Rules:**

- Optional&#x20;
- Text only (no HTML required)&#x20;

**Example:&#x20;**"Classic pizza with tomato sauce and mozzarella cheese"

***

### Importing Product Names and Descriptions in Multiple Languages via CSV

To add product names and descriptions in additional languages, first import your product CSV successfully. Once the import is complete, export the existing product CSV from the platform.

In the exported file, update only the **Product Name** and **Product Description** fields with the translations for your desired language. Do not modify any other fields or product data within the CSV.

After updating the translations, navigate back to the **Import Products** section. Before uploading the file, ensure that the menu language dropdown in the top-right corner matches the language used in the translated CSV. For example, if the product names and descriptions have been translated into French, select **French** as the menu import language.

Once imported, the platform will match the existing products and automatically add the translated product names and descriptions for the selected language without creating duplicate products.

***

### SKU (Product.SKU)

**What this column is:**
&#x20;A unique identifier for your product (used internally and in reports).

:::hint{type="info"}
SKU can be nullable, but cannot be duplicated
:::



**Rules:**

- Optional but recommended&#x20;
- Must be unique per product&#x20;

**Example:&#x20;**"PIZZA-MARG-001"

***

### Price Compare (Product.Price.Compare)

**What this column is:**
&#x20;Shows the “original price” crossed out (used for discounts/marketing).
&#x20;Customers will see something like: ~~$18.99~~ **$14.99**

**Rules:**

- This should be **higher than your selling price**&#x20;
- Numeric only (no currency signs)&#x20;

Example:

- Price (Sell): 14.99&#x20;
- Price Compare: 18.99&#x20;

If you don’t want to compare pricing → leave its value blank.

***

### Min Quantity / Max Quantity (Product.Min.Max.Quantity)

**What it does:**
&#x20;Controls how many units of the product a customer can add to the cart per order.

- **Min Quantity** = the minimum customer must buy&#x20;
- **Max Quantity** = the maximum customer can buy&#x20;

Examples (Pizza):

- Min Quantity: 1&#x20;
- Max Quantity: 5 (customer can buy up to 5 pizzas)
- Therefore, in the CSV file, you have to write it as 1,5

***

### Base Price (Product.Price.Selling)

**What this column is:**
&#x20;The base price of the product **before add-ons**.

**Rules:**

- Numeric value&#x20;
- No currency symbol&#x20;

**Example:&#x20;**&#x31;2.99

***

### Cost Price (Product.Price.Cost)

**What this column is:**
&#x20;Internal cost price (used for reports only).

**Rules:**

- Optional&#x20;
- Numeric value&#x20;

**Example: 5**

***

### Tax Percent (Product.Tax\_Percent)

**What it does:**
&#x20;Adds tax to the product price based on a percentage.

:::hint{type="info"}
If your catalog items have a fixed tax, it's recommended to use Global Tax through [Custom Charges](https://help.hyperzod.com/general#TsS3l). If the product tax varies by item, utilize this feature to configure the tax percentage accordingly.
:::

**How to fill it:**

- Enter only the number&#x20;
- Don’t use %&#x20;

Example:

- Tax Percent: 10 → means 10% tax

***

### Status (Product.Status)

**What this column is:**
&#x20;Controls whether the product is visible.

**Values:**

- active&#x20;
- inactive

***

### Inventory (Product.Inventory)

**What it does:**
&#x20;How many units are available.

Example:

- Inventory Quantity: 30 (30 pizzas available)

***

### Labels (Product.Labels)

**What it does:**
&#x20;Labels are usually used for **store-facing filters/highlights** like:

- “Best Seller”&#x20;
- “New”&#x20;
- “Popular”&#x20;
- “Chef Special”

***

### Category (Product.Category)

**What this column is:**
&#x20;The category under which the product will appear in your store.

Example: "Fast Food" category for "Pizza"

***

### Tags (Product.Tags)

**What it does:**
&#x20;Tags help with **internal organization + filtering/search** (and can be used for better discovery depending on your setup).

Good tags are descriptive, like:

- “Vegetarian”&#x20;
- “Cheese”&#x20;
- “Spicy”

***

### Image URL (Product.Images)

**What this column is:**
&#x20;A publicly accessible image URL for the product.

**Rules:**

- Must be a valid, publicly accessible link&#x20;
- HTTPS recommended

Example: "https\://img.freepik.com/free-psd/pictou-county-pizza-isolated-transparent-background\_191095-32844.jpg"

***

## Product Options / Variants &#x20;

Product options allow you to add choices to a product. In the CSV, each option is defined first, and its variants are defined afterward in a specific format.&#x20;

### Option Name (Option1.Name)

This is where you define **what choice the customer is making**.

**Example - &#x20;**

**Option Name:&#x20;**"Pizza Size"

***

### Option Type (Option1.Type)


Defines how many variants can be selected.

**Allowed values:**

- Single → User can select **only one**&#x20;
- Multiple → User can select **multiple**

***

### Option Enable Range (Option1.Enable\_Range)

Controls whether **min/max selection rules** apply.

**Allowed values:**

- NO → No min/max restriction&#x20;
- YES → Min/max selection required

***

### Option Range (Option1.Range)

Used **only if ENABLE\_RANGE = YES**.&#x20;

Example: If the range is enabled, then define it as 1,3, indicating "1" is the minimum quantity and "3" is the maximum quantity. If the enable\_range = "NO", then simply define here as 0,0

***

### Option Required (Option1.Required)

Whether the customer **must** select this option.

**Allowed values: "**&#x59;e&#x73;**" OR "**&#x4E;o.**"**

***

### Option View (Option1.View)

Controls how options are displayed on the app.

**Allowed values:**

- LIST&#x20;
- CARD

***

### Basic Variant Structure (Option1.Variants)

Each variant follows this format:

:::BlockQuote
VariantName,Price,MinQty,MaxQty,Description,ImageURL \{ nested\_addons }
:::

Variants are separated by semicolons ;

**Example from Your CSV (Simplified)**

:::BlockQuote
Small,30,0,5,Small size,https\://img...jpg
:::

***

## Multi-Level Add-ons (Nested Options)

This is where **advanced customization** happens.

Nested options are defined **inside curly braces \{}**

:::hint{type="info"}
**CSV Rules for Nested Add-Ons**

- If you **do not want to define a value** in the **Multi-Level Variants**(such as minQty, maxQty, price, description, or image), **do not remove it**. Instead, **leave it empty by adding commas**. Example: Medium,0,0,,&#x20;
- **Commas ( , )** are used to separate values within the same option or variant.
  &#x20;Even empty values must keep their comma position.&#x20;
- **Semicolons ( ; )** are used to indicate that **one variant is finished and the next variant begins**. Each variant must be separated using a semicolon.&#x20;
- **Curly brackets \{ }** are used to define **nested or multi-level add-ons**.
  &#x20;Every opening **\{ must be closed with }**, otherwise the import will fail.&#x20;
- Once all variants of an option are defined and the **final closing } is added**, that option is considered complete.&#x20;
- After completing one option (for example, OPTION1), you can **move on to define the next option** (OPTION2, OPTION3, etc.) using the same structure.
:::

### Understanding the Syntax&#x20;

| Symbol | Meaning                                         |
| ------ | ----------------------------------------------- |
| ,      | Separates values inside a variant               |
| ;      | Separates multiple variants in a nested add-ons |
| \{ }   | Indicates a child option exists                 |
| ( )    | Contains child variants                         |

### Nested Option Structure

:::BlockQuote
option\_name, type, required, range, view, list \{
&#x20;   variant1&#x20;
&#x20;   (variant2
&#x20;   ...
&#x20; )
};
:::

:::hint{type="info"}
The symbol "\{" indicates the child options, and the symbol "(" indicates the child variants within the child options.
:::

:::hint{type="info"}
**NOTE:** **Child option range** must be in format **"\[min, max]"** with square brackets enclosed in double quotes,
e.g., " \[0,0]" or " \[1,3]".

:::

### Real Example (Toppings inside Size)

:::BlockQuote
\{
topping,single,no,"\[0,0]",no,list(
&#x20; chicken,10,0,,;
&#x20; desi chicken,10,0,,;
&#x20; chinese chicken,10,0,,
)
}
:::

**Here is another example demonstrating two levels of add-ons:&#x20;**

### Real Example: Size → Crust (2 Levels)

:::BlockQuote
Small,12.99,5.00,,,"" \{
&#x20; Crust,single,no,"\[0,0]",yes,list (
&#x20;   Thin,0,0,,,"";
&#x20;   Thick,1.00,0,,,""
&#x20; )
}
:::

***

## Review & Edit (Spreadsheet Editor)

Once the items have been uploaded in the CSV and imported, this screen appears for **both** import methods after the file has been processed. It is your last chance to check the data before products are created.

 

### Edit any cell

Click directly into a cell and type to correct values.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/bxjmY7OtC1vE8p75ylgul_image.png)

&#x20;

### Edit variants

Click the variants cell to open a pop-up editor for sizes, prices, and inventory per variant. You can define each variant’s name (e.g., Half, Full, Large), set selling and cost prices, manage inventory (quantity counter), add descriptions, and upload images for each variant.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/c4mjpDaTS_TeEqhkztBfk_image.png)

::Image[]{src="https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/5K0MDBGEBSCLuOBOM2oi-_image.png" size="80" width="1111" height="891" position="center" darkWidth="1111" darkHeight="891" showCaption="false"}



### Delete rows

Select rows using the checkboxes and click **Delete Selected&#x20;**&#x74;o remove unwanted products.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/sOsucLFtHAfvcsWlPHGw__image.png)

&#x20;

### Download CSV

Click **Download CSV&#x20;**&#x69;n the toolbar to save a local copy of the current data.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/USA5tmQp2KXiYH5eLje0w_image.png)

&#x20;

### Save progress

Click **Save&#x20;**&#x74;o save your edits without confirming yet. You can return later and resume by selecting **Review&#x20;**&#x66;rom the Import History section.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/z-8eotQqQxl3iQN0XeMBo_image.png)

&#x20;

### Confirm Import

Click **Confirm Import&#x20;**&#x77;hen ready. This starts the final import process and creates the products.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/YfEPWj8vY-BK1R996Yy4E_image.png)

&#x20;

### Cancel Import

Click **Cancel&#x20;**&#x74;o discard this import. This action cannot be undone.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/5B2W5luZzW69CYJG6ofon_image.png)

***

##  Managing Your Imports

The **History** table below the upload area shows all past and active imports. Each row displays

- **Date -&#x20;**&#x57;hen the import was created.
- **Type** - CSV or IMAGE
- **Status** - Completed, Processing, Pending, Failed, or Discarded
- **Products** - The number of products extracted or imported
- **Downloads** - Download the source file or the mapped CSV
- **Actions**: Resume, Review, or View Progress, depending on the current stage.

![](https://api.archbee.com/api/optimize/A6k4A417O1V2DGm4H5kN0/_eR_47Jm-pssyBtWzuBCB_image.png)

