---
title: "Price list CSV format reference"
description: "The CSV format Process Wholesale accepts for price list imports: accepted column headers, how prices are read, how rows are matched, the 50,000-row limit, the template, the export columns and every message."
type: reference
plans: [Professional]
keywords:
  [
    price list CSV columns,
    CSV headers,
    price list template,
    CSV file format,
    unmatched rows,
    import error messages,
    SKU Handle Price,
    wholesale price sheet format,
  ]
questions:
  - "What columns does a Process Wholesale price list CSV need?"
  - "Which column names are accepted for SKU, Handle and price?"
  - "How does Process Wholesale read prices with commas and dots?"
  - "What does each unmatched row reason mean?"
  - "What columns does the price list export contain?"
last_verified: 2026-11-11
order: 7
---

# Price list CSV format reference

Process Wholesale imports a [price list](../discounts/price-lists.md) from a `.csv` file that has a header row, a price column and at least one of a SKU column or a Handle column, with up to 50,000 data rows. Rows are matched to your product variants by SKU first, then by Handle. This page lists every accepted header, how prices are read, the template, the export columns and every message the import can show. For the steps, see [How to import, update and export a price list with CSV](../discounts/price-list-csv-import.md). Price lists need the Professional plan.

## File requirements

| Item                   | Requirement                                                     |
| ---------------------- | --------------------------------------------------------------- |
| File type              | `.csv`, one file per import                                     |
| Header row             | Required, in the first row                                      |
| Required columns       | One price column, and a SKU column or a Handle column (or both) |
| Other columns          | Ignored, for example `Title` in an exported file                |
| Maximum rows           | 50,000 data rows                                                |
| Blank lines            | Ignored                                                         |
| Row numbers in reports | The header is row 1, so the first data row is row 2             |
| Prices                 | In your store currency, without thousands separators            |

## Accepted column headers

Headers are matched ignoring capitals and surrounding spaces. When a file has more than one accepted header for the same column, the first one in this table's order is used.

| Column | Accepted headers, in order of preference                            |
| ------ | ------------------------------------------------------------------- |
| SKU    | `sku`, `skus`, `variant sku`                                        |
| Handle | `handle`, `url handle`, `product handle`, `slug`, `url handle slug` |
| Price  | `fixed price`, `price`, `wholesale price`, `wholesale`, `amount`    |

| File from                  | Columns                                  | Accepted as it is?                                                         |
| -------------------------- | ---------------------------------------- | -------------------------------------------------------------------------- |
| Process Wholesale template | `sku`, `handle`, `price`                 | Yes                                                                        |
| Process Wholesale export   | `SKU`, `Handle`, `Title`, `Price`        | Yes. `Title` is ignored.                                                   |
| Shopify B2B catalog export | `SKU`, `Handle`, `Fixed Price`           | Yes                                                                        |
| Shopify product export     | `Variant SKU`, `Handle`, `Variant Price` | No. `Variant Price` is not an accepted price header. Rename it to `Price`. |

## How prices are read

Process Wholesale removes everything except digits, dots, commas and minus signs. When a value has both a comma and a dot, the one that comes last is the decimal separator. A comma on its own is a decimal separator. Prices are not rounded.

| Value in the file | Price imported                                   |
| ----------------- | ------------------------------------------------ |
| `$4.79`           | 4.79                                             |
| ` 6.59`           | 6.59                                             |
| `1,299.99`        | 1299.99                                          |
| `1.299,99`        | 1299.99                                          |
| `12,50`           | 12.5                                             |
| `1,299`           | 1.299 (the comma is read as a decimal separator) |
| `1299`            | 1299                                             |
| `0`               | 0 (accepted; the variant is free on the list)    |
| `-5`              | Not imported: "Negative price"                   |
| empty or `abc`    | Not imported: "Invalid price"                    |

## How rows are matched

| Order | Rule                                                          | Result                                                                                          |
| ----- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| 1     | The price is checked                                          | An invalid or negative price is not matched                                                     |
| 2     | SKU, ignoring capitals and surrounding spaces                 | One variant with that SKU: matched. Several variants: not matched, and the Handle is not tried. |
| 3     | Handle, ignoring capitals, when the SKU is empty or not found | A product with one variant: matched. A product with several variants: not matched.              |
| 4     | Nothing found                                                 | Not matched                                                                                     |
| 5     | Several rows match the same variant                           | The last row wins                                                                               |

## Template

**Download template** in the import window downloads `price-list-template.csv`:

```
sku,handle,price
SKU-001,example-product,9.99
SKU-002,another-product,19.50
```

## Export columns

**Export to CSV** downloads `price-list-<name>.csv`, one row per variant on the list.

| Column   | Content                                                      |
| -------- | ------------------------------------------------------------ |
| `SKU`    | The variant SKU                                              |
| `Handle` | The product handle                                           |
| `Title`  | The variant title (ignored when the file is imported)        |
| `Price`  | The list price as stored, for example `7` rather than `7.00` |

Variants deleted from your store are not in the export.

## Unmatched row file

**Download unmatched rows** downloads `unmatched-<name>.csv` with the columns `row`, `sku`, `handle` and `reason`, for up to 2,000 rows.

| Reason                                       | What it means                                                                              | How to fix it                                                                                   |
| -------------------------------------------- | ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- |
| Invalid price                                | The price is empty or not a number                                                         | Enter a number, such as `12.50`.                                                                |
| Negative price                               | The price is below 0                                                                       | Enter 0 or a positive price.                                                                    |
| SKU matches multiple variants in store       | More than one variant in your store has this SKU                                           | Give each variant a unique SKU in Shopify, then import again.                                   |
| Handle has multiple variants — provide a SKU | The row's SKU is empty or not found, and the product with this handle has several variants | Add the SKU of the variant you mean. Use one row per variant.                                   |
| No matching SKU or handle in store           | No variant has this SKU and no product has this handle                                     | Check the spelling against Shopify admin. The product may have been deleted or the SKU changed. |
| Row is missing both SKU and handle           | The SKU and Handle cells are both empty                                                    | Add a SKU or a handle, or delete the row.                                                       |

## Messages before the import starts

| Message                                                                                                                                    | What it means                                                                                      | How to fix it                                                                                        |
| ------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| Couldn't detect the required columns. The file needs a price column (e.g. “Fixed Price” or “Price”) and at least one of “SKU” or “Handle”. | No accepted price header, or no SKU or Handle header                                               | Rename the headers to accepted ones.                                                                 |
| Failed to parse the CSV file.                                                                                                              | The file could not be read as CSV. The window can also show the file reader's own message instead. | Save the file as CSV (comma separated) and try again.                                                |
| Enter a valid price list name (letters and numbers only, no "B2B") before importing.                                                       | The **Name** field is empty or not valid                                                           | Enter a name with lowercase letters and numbers only.                                                |
| Tag name is required, must be alphanumeric, and cannot contain 'B2B'.                                                                      | The list name is not valid                                                                         | Use letters and numbers only, without `b2b`.                                                         |
| The CSV has no rows to import.                                                                                                             | The file has a header but no data rows                                                             | Add rows below the header.                                                                           |
| Imports are limited to 50000 rows.                                                                                                         | The file has more than 50,000 data rows                                                            | Remove rows. Do not split one list across several files: each **Update from CSV** replaces the list. |
| A price list with the tag name "<name>" already exists. Please use a different tag name.                                                   | **Import from CSV** was used with a name that a list already has                                   | Choose a new name, or open that list and use **Update from CSV**.                                    |
| No price list named "<name>" to update.                                                                                                    | The list being updated no longer exists                                                            | Go back to the **Price Lists** tab and open the list again, or import it as a new list.              |
| Couldn't start the import. A store export may already be running — please try again in a minute.                                           | Another import or store export is running                                                          | Wait a minute and try again.                                                                         |
| Couldn't start the import.                                                                                                                 | The import could not start                                                                         | Try again.                                                                                           |
| Couldn't start the import. Please try again.                                                                                               | The connection was interrupted                                                                     | Check your connection and try again.                                                                 |

## Messages after the import runs

| Message                                                                                                                                                                    | What it means                                                                                                                                                                                       |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Import complete for "<name>".                                                                                                                                              | A new list was created. Counts: **{count} prices set** and **{count} unmatched**.                                                                                                                   |
| Update complete for "<name>".                                                                                                                                              | The list was replaced. Counts: **{count} added**, **{count} updated**, **{count} removed**, **{count} unmatched**.                                                                                  |
| Some rows couldn't be matched (no matching SKU/Handle, ambiguous match, or invalid price). Download unmatched rows to fix and re-import.                                   | The import finished, but some rows were not imported.                                                                                                                                               |
| The import failed: No rows matched a product by SKU or Handle. Check the file's columns and values, then try again. No price list was created. Please try again.           | Not one row matched a product.                                                                                                                                                                      |
| The update failed: No rows matched a product by SKU or Handle — the existing price list was left unchanged. Your existing price list was left unchanged. Please try again. | Not one row matched a product, and the list was not changed.                                                                                                                                        |
| The import failed: Variant export … / The update failed: Variant export …                                                                                                  | Your product catalog could not be read. Try again.                                                                                                                                                  |
| The import failed: Price sync … / The update failed: Price sync …                                                                                                          | The prices could not be published to checkout. Open the list on the **Price Lists** tab, then run **Update from CSV** again with the same file.                                                     |
| The import failed. No price list was created. Please try again. / The update failed. Your existing price list was left unchanged. Please try again.                        | The import stopped. Any other reason after "The import failed:" or "The update failed:" also means the import did not finish. Open the list on the **Price Lists** tab to check it, then try again. |

## Related articles

- [How to import, update and export a price list with CSV](../discounts/price-list-csv-import.md)
- [How to create a wholesale price list with fixed prices](../discounts/price-lists.md)
- [Price list CSV import problems](../troubleshooting/price-list-import-problems.md)
