Skip to main content

How to create a Manual Pricing File

How to build the spreadsheet for a manual pricing rule — from a simple identifier-and-price file, to volume/quantity-break pricing, to advanced discount_type and price_source options.

S
Written by Shubham Nandeshwar

Creating a Manual Pricing File

Manual pricing lets you set wholesale prices in bulk by uploading a single spreadsheet (CSV or Excel) instead of editing products one by one. You map each product variant — by SKU, barcode, or variant ID — to the price your wholesale customers should pay. The file can be as simple as one identifier and one price, or as rich as tiered volume discounts driven by percentages off a chosen price source.

This guide builds up in three stages:

  1. A simple flat wholesale price.

  2. Volume (quantity-break) pricing.

  3. Advanced discounts using the optional discount_type and price_source columns.

Prerequisites

  • A manual pricing rule. In the app, go to Pricing → Create pricing rule → Manual. The upload happens on that rule's page, in the Price upload card.

  • At least one customer group assigned to the rule, so the prices apply to the right buyers.

  • Matching variants in your store. Every identifier in your file must match a real variant's SKU, barcode, or variant ID. Rows that don't match any variant are ignored.

  • Cost per item set on your variants — only if you plan to use the cost-based options in Stage 3 (COST_PRICE). Variants without a cost are skipped for those rows.

Tip: Download one of the three templates from the Supported templates list as your starting point. Pick the template that matches how you want to identify your products — by SKU, by barcode, or by variant ID.

Stage 1: A simple wholesale price

The smallest possible file has just two columns: one identifier and a price. Each row sets a single flat wholesale price for that variant.

Using SKUs:

sku,price
sku-gift-1,9.01
sku-gift-2,12.50

You can identify variants by barcode or variant ID instead — just change the first column header:

barcode,price
xlt-123-rtc,9.01

variantId,price
42524900950127,9.01

Notes:

  • You only need one identifier column. Use whichever is most reliable for your catalog.

  • The price is the exact amount the wholesale customer pays for one unit.

  • Headers are forgiving about capitalization and spacing — Variant ID, variant_id, and variantid all work.

Behind the scenes: After you upload, prices are recalculated in the background and synced to your storefront. For large catalogs this can take a few minutes — you can keep working elsewhere while it runs. Re-uploading a file replaces the previous prices for that rule.

Stage 2: Volume (quantity-break) pricing

To reward larger orders, add a quantity column and include multiple rows per variant — one per quantity break. The quantity is the minimum units at which that price kicks in.

sku,quantity,price
sku-gift-1,1,9.01
sku-gift-1,10,8.51
sku-gift-1,20,7.99

In this example, for sku-gift-1:

  • 1–9 units → 9.01 each

  • 10–19 units → 8.51 each

  • 20+ units → 7.99 each

Notes:

  • The quantity column is optional. If you leave it out (as in Stage 1), every row is treated as quantity 1.

  • You don't have to start at quantity 1. If your lowest break is, say, 10, then orders below 10 simply pay the variant's normal price.

  • One price per quantity. A variant can't have two rows with the same quantity — duplicates are rejected with an error that points to the conflicting rows (see Troubleshooting).

Stage 3: Discount types and price sources

By default every price value is treated as an exact wholesale price. Two optional columns let you instead express the price as a discount off (or markup on) one of the variant's existing prices:

  • discount_type — how the price value is interpreted.

  • price_source — which of the variant's prices the discount applies to.

discount_type values

Value

Meaning

FIXED_PRICE (default)

The price value is the exact wholesale price.

PERCENTAGE

The price value is a percentage off the chosen price source.

AMOUNT_OFF

The price value is an amount off the chosen price source.

PERCENTAGE_INCREASE

The price value is a percentage added on top of cost price. Cost price only.

AMOUNT_INCREASE

The price value is an amount added on top of cost price. Cost price only.

price_source values

Value

Meaning

PRICE (default)

The variant's retail price.

COMPARE_AT_PRICE

The variant's compare-at price.

COST_PRICE

The variant's cost per item.

How they combine

  • FIXED_PRICE ignores price_source — it's an absolute amount.

  • PERCENTAGE and AMOUNT_OFF discount down from the chosen source (retail, compare-at, or cost).

  • PERCENTAGE_INCREASE and AMOUNT_INCREASE mark up from cost — useful for "cost-plus" wholesale pricing.

Examples

20% off the compare-at price:

sku,quantity,price,discount_type,price_source
sku-gift-2,1,20,PERCENTAGE,COMPARE_AT_PRICE

$5 off the cost price:

sku,quantity,price,discount_type,price_source
sku-gift-3,1,5,AMOUNT_OFF,COST_PRICE

Cost price plus a 15% markup:

sku,quantity,price,discount_type,price_source
sku-gift-4,1,15,PERCENTAGE_INCREASE,COST_PRICE

Volume breaks with a percentage discount (note the same discount_type and price_source on every row for the variant):

sku,quantity,price,discount_type,price_source
sku-gift-5,1,10,PERCENTAGE,PRICE
sku-gift-5,10,15,PERCENTAGE,PRICE
sku-gift-5,20,20,PERCENTAGE,PRICE

Rules to keep in mind

  • One discount type and source per variant. Every row for the same SKU/barcode/variant ID must use the same discount_type and price_source. You can vary the amounts across quantity breaks, but not the type or source.

  • Markups are cost-only. PERCENTAGE_INCREASE and AMOUNT_INCREASE are only valid with price_source = COST_PRICE.

  • Still one price per quantity — the no-duplicates rule from Stage 2 always applies.

  • Leaving discount_type/price_source blank (or omitting the columns) falls back to FIXED_PRICE / PRICE, so older simple files keep working unchanged.

Behind the scenes: Cost-based prices are calculated at upload time and stored as fixed amounts. Retail- and compare-at-based percentages/amounts are applied live on the storefront, so they automatically follow any later changes to those prices.

Troubleshooting

Message

What it means / how to fix

Missing required headers: price

Your file has no price column. Add it.

At least one of these fields is required: sku, barcode, variantId along with the price field

Add at least one identifier column.

Invalid quantity at row N

The quantity in that row isn't a number. Remove it (defaults to 1) or fix it.

Invalid discount_type at row N

Use one of: FIXED_PRICE, PERCENTAGE, AMOUNT_OFF, PERCENTAGE_INCREASE, AMOUNT_INCREASE.

Invalid price_source at row N

Use one of: PRICE, COMPARE_AT_PRICE, COST_PRICE.

PERCENTAGE_INCREASE and AMOUNT_INCREASE can only be used with price_source COST_PRICE

Markups require cost price. Either switch the source to COST_PRICE or use a different discount type.

Conflicting discount_type/price_source for sku "X" between row A and row B

All rows for the same variant must share one discount type and one price source. Make them consistent.

Duplicate row for sku "X" at quantity Q (rows A and B)

You have two rows for the same identifier and quantity. Remove one. (Remember: a blank/missing quantity counts as 1, so two no-quantity rows for the same variant collide.)

A variant's price didn't update

Confirm the identifier matches a real variant, the rule is Active and assigned to the buyer's customer group, and — for cost-based rows — that the variant has a cost per item set. Allow a few minutes for background recalculation on large catalogs.

Did this answer your question?