> For the complete documentation index, see [llms.txt](https://help.openloyalty.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.openloyalty.io/integrations-and-data-exchange/product-catalog/importing-your-catalog.md).

# Importing Your Catalog

Create your Product Catalog and load products in bulk with a CSV import.

Every tenant starts with an empty catalog. You create it once, then keep it current by re-uploading a CSV file whenever your assortment changes.

### 🛠️ Step-by-Step Setup

{% stepper %}
{% step %}

#### Create a Catalog

* From the left-hand menu, go to **Modules → Product catalog**.
* If no catalog exists yet, click **Create Catalog**.
  {% endstep %}

{% step %}

#### Name and Describe Your Catalog

* **Name** (required) — how the catalog is referenced across the system.
* **Description** (optional) — shown alongside the catalog to explain its meaning or context.
* Use **Add translation** if you need the name/description in additional languages.

Click **Create Catalog** to save. You'll see a confirmation and land on an empty product list.
{% endstep %}

{% step %}

#### Prepare Your CSV File

Download and fill in the sample file before uploading.

* **Required column:** `sku` — a unique product identifier.
* **Optional columns:** `action`, `name`, `category`, `brand`, `unit`, `unit_base_price`, `unit_cost`, and any custom `attr_<name>` attributes (e.g. `attr_color`).
* Use `upsert` in the `action` column to create or update a row, and `delete` to remove a product. Leaving `action` empty behaves like `upsert`.
* Save the file as UTF-8 CSV.

{% hint style="info" %}
For the full column reference and a downloadable sample file, see the article below:

[Product Catalog](/integrations-and-data-exchange/imports-exports/imports/sample-import-files/product-catalog.md)
{% endhint %}
{% endstep %}

{% step %}

#### Upload the File

* Click **Import** in the top-right corner of the Product Catalog list.
* Click **Click to upload** or drag and drop your CSV file (max. 100 MB).
* Click **Import**.
  {% endstep %}

{% step %}

#### Confirm and Track Progress

The import runs asynchronously and can take up to a few minutes for large files.

* Click **View list of imports** to track progress, or **Continue** to go back to the catalog.
* Once finished, review the import report for any rows that failed — valid rows are still imported even if some rows are rejected.
  {% endstep %}
  {% endstepper %}

***

### 🔄 Keeping the Catalog Current

Re-importing does not replace your whole catalog — it works as an **upsert by SKU**:

* A SKU present in **both** the existing catalog and the new file is **updated** — all its metadata is overwritten by the new row. Leaving a column empty **clears** the previous value for that SKU.
* A SKU present **only** in the new file is **added** to the catalog (unless its `action` is `delete`, in which case it's simply not added).
* A SKU present in the catalog but **absent** from the new file stays **unchanged** — it is only removed by uploading a row for it with `action` set to `delete`.

{% hint style="warning" %}
**Check your SKUs before uploading.** A missing `sku` column, a missing header row, or a duplicate SKU rejects the **entire** file. Other issues — like an invalid price or category — only affect the individual row; the rest of the file still imports.
{% endhint %}

{% hint style="info" %}
Custom attributes added in a re-import only apply going forward — they're not retroactively attached to transactions that were already processed by a campaign.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://help.openloyalty.io/integrations-and-data-exchange/product-catalog/importing-your-catalog.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
