---
title: "How to price wholesale products at cost plus a markup"
description: "Process Wholesale cost plus markup prices each item for tagged wholesale customers at its Shopify Cost per item plus a markup percentage, for example cost 10.00 plus 20% = 12.00. Create it under Discounts > Cost-Plus Discounts on the Professional plan."
type: how-to
plans: [Professional]
keywords:
  [
    cost plus pricing,
    cost-plus discount,
    markup pricing,
    cost per item,
    unit cost,
    margin based wholesale price,
    wholesale markup,
    distributor pricing,
    cost plus percentage,
  ]
questions:
  - "How do I set wholesale prices at cost plus a markup on Shopify?"
  - "Where does Process Wholesale get the product cost from?"
  - "What happens to a product with no cost per item?"
  - "How long does it take for a cost change to reach checkout?"
  - "Can cost plus markup raise a price above the regular price?"
  - "Can cost plus markup combine with flat or tier discounts?"
  - "Is the markup a margin?"
  - "Does cost plus markup work on the Enterprise plan?"
last_verified: 2026-11-11
order: 7
---

# How to price wholesale products at cost plus a markup

Cost plus markup in Process Wholesale sets the price a wholesale customer (B2B customer) pays for each eligible item to the item's cost plus a markup percentage you choose: with a cost of 10.00 and a 20% markup, the customer pays 12.00. Process Wholesale reads the cost from the **Cost per item** field of each variant in Shopify. Create it in the Process Wholesale app under **Discounts > Cost-Plus Discounts > Create new Cost-Plus Discount**. It applies at Shopify checkout to logged-in customers tagged `B2B` who carry its discount tag, and it needs the Professional plan.

**At a glance**

- **Plan:** Professional. Up to 100 cost plus markup discounts.
- **Where:** Process Wholesale > **Discounts > Cost-Plus Discounts**
- **Applies to:** Logged-in customers tagged `B2B` who also carry the discount tag
- **Price:** Cost per item × (1 + markup ÷ 100), per unit. Never above the regular price.
- **Products without a cost:** get no cost plus markup discount
- **Applied by:** the Shopify automatic discount **B2B Cost Plus Markup Discount**

## Before you start

- The store is on the Professional plan. On other plans the **Cost-Plus Discounts** tab shows **Upgrade to Professional** instead of the create button.
- Every product the discount will cover has a **Cost per item** in Shopify admin. Process Wholesale checks this when you save.

## Steps to create a cost plus markup discount

1. In Shopify admin, open the **Process Wholesale** app, select **Discounts**, then the **Cost-Plus Discounts** tab.
2. Select **Create new Cost-Plus Discount**.
3. In **Discount tag name**, enter the name of the discount, which is also the customer tag that grants it, for example `costplus25`. The field starts with a suggested name such as `newcostplusmarkup615`. Use lower-case letters and numbers only, and do not include `b2b`.
4. In **Markup Percentage**, enter the markup ("This will be applied to the cost of the product to determine the final price."). The field starts at 0, takes up to 2 decimals and has no upper limit.
5. In **Applies to**, choose **All products**, **Select individual products** (then **Select product**), **Select collections** (then **Select collection**) or **Select individual variants** (then **Select variant**).
6. Select **Save** in the save bar. Process Wholesale shows "We're checking to ensure all of the added products have a unit cost set. Please wait a moment" while it checks the costs.
7. If every checked variant has a cost, Process Wholesale shows "Discount created". If any checked variant has no cost, the save stops with "Some of the selected products have no unit cost set" and a link to each of those variants in Shopify admin. Add the cost in Shopify, then save again.
8. For the first cost plus markup discount in your store, a window "First Cost Plus Markup Discount created" explains that "The first cost plus discount created takes a few moments to take effect due to data sync. Please wait a few minutes before checking." Select **Ok, I understand**.
9. Give the discount tag to customers from the **Customers** page, by auto-assign on approval, or with **Bulk assign discount**. See [How to assign discounts to wholesale customers](assign-discounts-to-customers.md).

### Validation messages on the cost plus markup form

| Message                                                                                         | Cause                                                                                                                     |
| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Discount tag name is required. Please enter a discount tag name.                                | **Discount tag name** is empty                                                                                            |
| A tier discount with the tag name "x" already exists. Please use a different tag name.          | Another cost plus markup discount already uses the name (the message says "tier discount")                                |
| Markup percent value must be a positive number.                                                 | **Markup Percentage** is not a valid number                                                                               |
| Selected items are missing. Please select at least one product for individual product discount. | **Select individual products** with nothing selected (the same message names collection or variant for the other options) |
| Some of the selected products have no unit cost set                                             | A checked variant has no **Cost per item**                                                                                |
| Error checking product units costs, please try again later                                      | The cost check could not run; try again                                                                                   |

## Where the cost comes from and how it stays in sync

Process Wholesale uses the **Cost per item** of each variant in Shopify, in your store currency.

- **First discount:** when you create the first cost plus markup discount, Process Wholesale copies the cost of every variant in your store. This takes a few minutes.
- **Cost changes:** when you change a variant's **Cost per item** in Shopify, Process Wholesale picks up the new cost automatically, and a background sync about once an hour catches up any changes it missed.
- **No cost:** a variant with no **Cost per item** gets no cost plus markup discount. The customer pays the regular price for it, unless another wholesale discount applies.

> **Important:** Clearing a variant's **Cost per item** in Shopify does not clear the cost Process Wholesale already copied. Cost plus markup keeps using the last cost it had for that variant. To stop the discount on a product, change **Applies to** to leave the product out, or enter the correct cost instead of clearing it.

## What your customers see

- **On product pages:** with the [Product Wholesale block](../storefront/product-page-wholesale-prices.md), a logged-in customer with a tag that contains `b2b` and the discount tag sees one row: quantity "Any", the discount and the wholesale price. For a 20.00 product with a cost of 8.00 and a 50% markup, the row reads "Any | $8.00 | $12.00". The theme's own price stays the regular price.
- **In Quick Buy:** customers tagged `B2B` see the cost plus price in the [Quick Buy](../storefront/quick-buy-prices.md) form, for example 12.00 for a cost of 8.00 and a 50% markup. A variant with no cost shows the regular price.
- **On the storefront, cost plus markup comes first.** When a customer has a cost plus markup discount that covers the product, the Product Wholesale block and Quick Buy show the cost plus price instead of a price list, tier or flat price.
- **At checkout:** each eligible item gets a discount labeled with `PW :` and the discount tag, for example `PW : costplus25`.

## How cost plus markup is calculated at checkout

Process Wholesale applies cost plus markup only when the store is on Professional, the customer is logged in (or the order is a draft order with a customer), has the tag `B2B` in any capitalization, and has the discount tag.

1. For each item, Process Wholesale picks the customer's highest-priority cost plus markup discount that covers it (1 is the highest priority).
2. Target price = cost × (1 + markup ÷ 100), converted to the customer's currency.
3. Discount per unit = the item's price − the target price. When that is 0 or less, the item gets no discount, so cost plus markup never raises a price.

**Example.** A product sells for 20.00 and its **Cost per item** is 10.00. With a 20% markup the target price is 10.00 × 1.20 = 12.00, so each unit gets 8.00 off and costs 12.00. Ten units cost 120.00 instead of 200.00.

**Example in another currency.** The same product, and the customer pays in a currency whose exchange rate is 1.5. The price in that currency is 20.00 and the target price is 12.00 × 1.5 = 18.00, so each unit gets 2.00 off.

**Example with no discount.** A product sells for 12.00 with a cost of 10.00 and a 20% markup. The target price is 12.00, the same as the price, so there is no discount.

**Priority.** The **Cost-Plus Discounts** list has the columns **Priority**, **Customer Tag**, **Markup**, **Products**, **Collections** and **Manage**. Use the arrows to change the order when a customer carries more than one cost plus markup discount.

## How cost plus markup combines with other wholesale discounts

Cost plus markup is applied by its own automatic discount. Under **Settings > Discount settings**, the card **Cost Plus Markup Discount combinations** (Professional) sets what it combines with: **Product Discounts**, **Order Discounts** and **Shipping Discounts**, all unchecked by default. The app explains the setting: "If you want normal B2B discounts (flat/tier) to be applied to the same order as a cost plus markup discount, Product discounts must be checked for the main discount combinations, and Order discounts must be checked for cost plus markup discount combinations". See [Which wholesale discount applies: priority and stacking rules](discount-priority-and-stacking.md).

## Limits and things to know

- **Professional only.** Cost plus markup is not applied at checkout on any other plan, including Enterprise.
- **100 discounts.** Professional allows up to 100 cost plus markup discounts; at that number the button on the **Cost-Plus Discounts** tab reads **Discount limit reached**. The create form also counts your flat, tier and price list discounts: when all four types together reach 100, the form shows "Professional plans are limited to 100 discounts. Redirecting to discounts." and returns to the **Discounts** page.
- **The cost check covers up to 200 variants.** With **All products**, Process Wholesale checks the first 200 variants in your store. Variants beyond that are not checked when you save, and any of them without a cost get no discount at checkout.
- **Markup is not capped.** **Markup Percentage** has no maximum. A markup that brings the price to the regular price or above gives no discount.
- **Tag names cannot be changed** after saving, and a tag name should not be reused by a discount of another type: a customer who carries the tag gets both discounts.
- **Deleting is immediate.** **Delete** has no confirmation step and removes the tag from every customer tagged `B2B`. See [Editing and deleting wholesale discounts](edit-or-delete-a-discount.md).

## Troubleshooting

| Symptom                                                        | Likely cause                                                                                       | Fix                                                                  |
| -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| "Some of the selected products have no unit cost set"          | A covered variant has no **Cost per item**                                                         | Select each linked variant, add its cost in Shopify, and save again. |
| A product gets no cost plus markup discount                    | It has no cost, cost plus markup is at or above its price, or a higher-priority discount covers it | Check the variant's **Cost per item** and the markup.                |
| The discount uses an old cost                                  | The cost was cleared in Shopify rather than changed                                                | Enter the correct cost in Shopify.                                   |
| The first discount does not apply right away                   | The first cost copy takes a few minutes                                                            | Wait a few minutes and check again.                                  |
| Flat or tier discounts disappear when cost plus markup applies | The combination settings do not allow both                                                         | Follow the in-app banner under **Settings > Discount settings**.     |
| The tab shows **Upgrade to Professional**                      | The store is not on Professional                                                                   | Upgrade from **Plan** in the app.                                    |

## Frequently asked questions

### Where does Process Wholesale get the product cost from?

From the **Cost per item** field of each variant in Shopify, in your store currency. Process Wholesale copies it when you create your first cost plus markup discount and keeps it up to date when you change it.

### What happens to a product with no cost per item?

It gets no cost plus markup discount, and the customer pays the regular price unless another wholesale discount applies. Saving a cost plus markup discount stops with "Some of the selected products have no unit cost set" when a checked variant has no cost.

### Can cost plus markup raise a price above the regular price?

No. When cost plus markup is at or above the item's price, the item gets no discount and keeps its regular price.

### Is the markup a margin?

No. The markup is added to the cost: a 25% markup on a cost of 40.00 gives 50.00.

### Does cost plus markup work on the Enterprise plan?

No. Cost plus markup needs the Professional plan. Current plan prices are shown on the Shopify plan page that opens from **Plan** in the app.

## Related articles

- [Wholesale discount types compared: flat, tier, price list and cost plus markup](discount-types.md)
- [How to create a wholesale price list with fixed prices](price-lists.md)
- [Which wholesale discount applies: priority and stacking rules](discount-priority-and-stacking.md)
- [How to assign discounts to wholesale customers](assign-discounts-to-customers.md)
- [Process Wholesale plans and what each plan includes](../account/plans-and-pricing.md)
