Import Product Costs from a CSV or Excel File
Updated October 3, 2026
With many products, a spreadsheet is faster than typing costs one by one. Download a template with all your variants, fill in the costs in Excel or Google Sheets, and upload the file. The import checks every row before anything is saved.
- Where
- In the sidebar, open Product Costs. The import sits in the menu next to Cost sync.
- Who
- Stores with many products, or anyone who keeps costs in a spreadsheet.
- Time
- About 10 minutes, most of it filling in the file.
- Updates
- With All orders, past orders are recalculated in the background. Large stores take a few minutes.
Step 1: Download the Template#


Step 2: Fill In Your Costs#
Each row is one variant. Fill in unit_cost and, if you have one, handling_cost. Leave the other columns as they are.
| Column | What it holds |
|---|---|
variant_id | Identifies the variant. Filled in by the template. |
sku | The variant's SKU from Shopify. A file without variant_id is matched by this column. |
product_title | For your reference. Not imported. |
variant_title | For your reference. Not imported. |
unit_cost | What one unit costs you, as a plain number. Rows without it are skipped. |
handling_cost | Optional extra cost per unit for packing and preparing, see What Is the Handling Cost?. Empty means 0. |
currency | Your store currency, filled in by the template. Costs are always saved in the store currency, whatever this column says. |
A filled-in row:
| variant_id | sku | product_title | variant_title | unit_cost | handling_cost | currency |
|---|---|---|---|---|---|---|
| 3100000101 | NW-PIL-SAND | Linen Throw Pillow | Sand | 8.40 | 0.60 | USD |
Only variant_id or sku and unit_cost are needed. If you build the file from your own SKU list, the columns sku and unit_cost are enough.
Enter the cost of one unit as a plain number with a period as the decimal separator: 8.40, not $8,40. For a pack of 10 at $59.00, enter 5.90.
Excel can turn long variant IDs into scientific notation, for example 3.1E+09, and drops leading zeros from SKUs such as 00123. Those rows then no longer match. Format the variant_id and sku columns as Text before you save, and keep the header row unchanged.
Step 3: Upload the File#
Open Import Costs from the same menu and click Next.

To import different costs per region, upload one file per zone. Several files for the same zone are merged.
A file that cannot be used stays in the list with the reason under its name, for example a missing variant_id or sku column, or more than half of its rows with errors. Remove it with the cross, fix the file and drop it in again.
Step 4: Resolve Problems#
When some rows need a decision, the Resolve step shows them one at a time. Without problems, this step is skipped.

| Problem | What you can do |
|---|---|
| Repeated SKU | The same SKU or variant appears more than once. Pick the cost to keep, or Skip this SKU. |
| SKU not in your store | No variant has this SKU. Pick one of the closest SKUs from your store, or search for the right variant. |
| Cost is not a number | For example €8,90. Accept the suggested reading (Use 8.90), or type the cost into Or enter it. |
Step 5: Review the Rows#
The Review step lists every row of every file with what will happen to it.

| Status | Meaning |
|---|---|
| Ready | The cost is applied. |
| Fixed | You repaired the row in the Resolve step. It is applied. |
| Merged | Another file for the same zone has the same cost. It is saved once. |
| Replaced | Another file for the same zone has a different cost, and that one is kept. |
| No cost | unit_cost is empty. Skipped. |
| Duplicate | The variant appears again in the file, and the other row is kept. Skipped. |
| Not found | No variant in your store has this SKU. Skipped. |
| Invalid | The cost or the match column cannot be read. Hover the badge for the reason. |
A row whose currency differs from your store currency shows Will be stored as with your currency: the number is saved as it is, without conversion.
Step 6: Apply the Costs#

| Option | What it does |
|---|---|
| New orders only | The imported cost applies from today. Past orders keep the cost they had, and orders of products that had no cost stay without one. |
| All orders | Replaces the current cost and applies the imported cost to every past order. Use it for products that had no cost or had a wrong cost. |
Example
The Linen Throw Pillow (Sand) had a cost of $8.00. You import $8.40. An order from last month with 2 pillows:
| Option | Product cost of that order |
|---|---|
| New orders only | 2 × $8.00 = $16.00 |
| All orders | 2 × $8.40 = $16.80 |
An import replaces the current cost of every imported variant, including costs you typed by hand. With All orders it also removes quantity breaks set for those variants, because the file holds one cost per variant.
What Happens Next#
- The wizard shows Costs imported with how many costs were created and updated, per zone. Rows that matched nothing when saving are listed by SKU or variant ID.
- Imported costs show the CSVbadge (CSV) in the Source column. In the order details, the items show CSV Import.
- With All orders, the affected orders are recalculated in the background and the progress shows in the header. With New orders only, nothing is recalculated.
Limits#
- One cost per variant and file. Quantity breaks, price changes with dates and bundle costs are not part of the import: see How to Add Quantity-Based Costs (Quantity Breaks) and How to Add Cost Changes Over Time (Price Changes).
- Costs are not converted from another currency.
- Only the first sheet of an Excel file is read.
- SKU matching is exact, including upper and lower case. When several variants share a SKU, all of them get the cost.
- The template leaves out products and variants that were deleted in Shopify. See Add Costs for Deleted Products and Variants.
Common questions
Related articles
Was this article helpful?


