---
title: "Catalog CSV Import"
description: "Load your whole device price list in one upload, with a dry-run preview."
url: "https://docs.gytabuyback.com/features/catalog-import/"
---
## Catalog CSV Import

Catalog import loads your entire trade-in price list from a spreadsheet instead of building products one at a time. One row per device and condition — for example three rows for "Nova Phone 15" at Like new, Good and Cracked — and the import creates the product, its **Condition** variations, and the price for each condition.

It is the fastest way to launch a new catalog, and the fastest way to reprice one: keep the spreadsheet you uploaded, change the numbers, and upload the same file again — matched devices are updated in place rather than duplicated. There is no catalog export, so keep your own copy of the file. The **Dry run** box is ticked by default, so you can see what would happen before anything is written to your store.

![The catalog CSV import screen with a dry-run preview](../../assets/images/gb-catalog-import.png)

Catalog import is a **PRO feature**. Free users see an upgrade prompt on the Import tab in plugin settings.

## Where to Find It

Go to **Gyta Buyback → Settings → Import**. There is nothing to switch on — the tab holds the whole feature:

*   **Download sample CSV** — a ready-made file (**trade-in-catalog-sample.csv**) with the correct header row and four example rows.
*   A file picker for your **.csv** file.
*   A **Dry run** checkbox — "preview the result without saving anything". It is **ticked by default**; untick it to write the changes.
*   The **Import catalog** button.

Only users who can manage site options (administrators) can run an import or download the sample.

## What Goes in the CSV

The file needs a header row. Column names are matched case-insensitively and in any order, and the columns you don't need can be left out entirely:

*   **model** — required. The product title.
*   **price** — required. The buyback price for that row.
*   **sku** — optional but recommended. It is the preferred way the import recognizes a device you already sell.
*   **condition** — optional. Each distinct value becomes a variation, e.g. Like new / Good / Cracked. Leave it empty on every row for a device and it stays a simple product with one price.
*   **category** — optional. Written as **Parent > Child**, e.g. "Phones > Nova". Missing categories are created.
*   **capability** — optional. **sell**, **buyback**, **both**, or empty. This is the per-product override used by Dual store mode.

Only **model** and **price** are enforced — if either header is missing, the whole file is rejected with a message pointing you at the sample CSV.

**Price is read per row; sku, category and capability are read from the first row of each device.** If you spread three condition rows across a device, put the sku, category and capability on the first of them — values on the later rows are validated but not applied.

## How an Import Runs

The flow, in order:

*   Rows are **grouped into devices** by sku, or by model name when there is no sku. All rows in a group become one product.
*   Each group is **matched against your catalog**: first by sku, and if that finds nothing, by exact product title (drafts, pending and private products included).
*   A match is **updated**, no match is **created**. New products are created as published.
*   For devices with conditions, the import merges the condition values into a per-product (local) **Condition** attribute, updates the price of variations that already use that attribute — matched on the condition value, ignoring case — and creates the ones that are missing.
*   A row it cannot process is skipped with a plain-English reason and the rest of the file still runs. The two conflicts below — an ambiguous title and a product-shape mismatch — skip the whole device instead of a single row.
*   You are returned to the Import tab with a summary: **X device(s) would be created, Y updated, Z error(s)**, followed by the list of rows that need attention.

Run it as a dry run first, read the summary, fix the flagged rows, then untick **Dry run** and upload the same file again. A real import ends with "Changes are live."

## Good to Know

*   **Nothing is ever deleted.** The import only creates and updates. Products, variations and condition options that are not in your file are left exactly as they are, so you cannot use it to prune a catalog or retire a condition.
*   **500 rows per file.** Anything past row 500 is ignored and reported — split a bigger price list into several files.
*   **A dry run still creates categories.** Product categories named in the **category** column are created as the file is checked, even when nothing is saved. No products, prices or variations are written during a dry run.
*   **Categories are added, never replaced.** A device already filed under other categories keeps them; the one in your CSV is appended.
*   **Two products with the same exact title are skipped.** The import refuses to guess. Give those rows the sku that is already saved on the product you mean — a sku that matches nothing in your store falls through to the title lookup and hits the same error.
*   **It looks for its own local Condition attribute.** If a product's variations were built from a *global* attribute (Products → Attributes), the import does not recognise them: it adds a second, local **Condition** attribute and creates a fresh variation per condition alongside the ones you already have. The dry-run summary counts that device as "updated" and will not warn you. Use the CSV for products it created itself, or for products whose Condition attribute is defined on the product.
*   **It never changes a product's shape.** If your CSV has conditions but the existing product is simple — or the product has condition variations but your rows have none — that device is skipped and reported. Convert it by hand, or adjust the file.
*   **Conditions are all-or-nothing per device.** Once one row for a device has a condition, every row for that device needs one; rows without are flagged.
*   **Prices must be numbers.** Blank, non-numeric or negative prices are skipped row by row. Leave currency symbols and thousands separators out.
*   **An empty capability leaves the product alone.** Only a value of sell, buyback or both writes the setting; anything else is rejected for that row.
*   **The error report is temporary.** It is shown once, to the person who ran the import, and expires after 15 minutes. Up to 25 problems are listed, with a count of the rest — so work through them before running the next file.
*   **Re-running the same file is safe.** Matching devices are simply updated with the same values, so an accidental second upload does no damage. The one exception is the global-attribute case above, where the first run already added variations.
*   **Import fills in the essentials only.** Title, sku, price, category and capability. Images, descriptions and shipping details still get added on the product itself.
