Do Shopify draft orders use B2B catalog prices? I tested it.
23 September 2026
The answer you will find repeated in forums and app listings is no: draft orders price at retail, because they do not know about B2B catalogs. I repeated it myself, in public, for weeks. Then I measured it, and it is wrong.
What I measured
Two runs against a real Shopify store with B2B enabled, a company, a company location, and a catalog with a price list attached to that location.
Through the API, on 17 September 2026. A
draftOrderCreate whose line item carried nothing but a
variantId and a quantity, and whose input carried a complete
purchasing entity:
"purchasingEntity": {
"purchasingCompany": {
"companyId": "gid://shopify/Company/…",
"companyLocationId": "gid://shopify/CompanyLocation/…",
"companyContactId": "gid://shopify/CompanyContact/…"
}
}
The line came back at $8.00. Retail on that variant is $10.00. Shopify resolved the catalog price on its own, with no price set by me.
The same mutation with no purchasingEntity at all priced the
line at $10.00. That is the retail fallback everybody
describes, and it is real. It is just conditional.
In the admin, on 23 September 2026. A draft order with the company location attached, against a price list with a 10% decrease and some fixed overrides:
| Price type | Retail | On the draft order |
|---|---|---|
| Fixed price in the price list | $10.00 | $8.00 |
| Percentage adjustment (10% off) | $75.00 | $67.50 |
| Quantity break at 100 units | $10.00 | $7.00 |
So it is not one narrow case. Fixed prices, relative adjustments and volume breaks all resolve.
Where the wrong answer came from
There is a forum thread from September 2023 where a developer reports exactly this problem: product is $10 on the page, $8 in the catalog, and the draft order comes back at $10. A Shopify staff member asked for reproduction steps. The thread went quiet. It has been cited ever since.
That report may well have been accurate in 2023. B2B was Plus-only then, catalogs attached directly to company locations, and market-level assignment for non-Plus stores did not arrive until April 2026. What nobody did, for three years, was re-test it.
I built product copy on that thread. It was in my App Store listing, on this website, in the app's own onboarding, and in a reply I posted to that same thread. All of it is now corrected. The lesson is cheaper to read than it was to learn: an unresolved forum thread is a question, not a finding.
So when do you need priceOverride?
For a price you negotiated away from the catalog. Not to get catalog pricing.
If you agree $7.25 on a line whose catalog price is $8.00, you must set
priceOverride on that line. Shopify will otherwise resolve
$8.00 from the catalog, which is correct behaviour for an ordinary B2B
order and wrong for a negotiated one. This is the distinction that
actually matters, and the blanket "draft orders price at retail" framing
hides it.
Note that priceOverride is for line items built from a
variant. originalUnitPriceWithCurrency is for custom line
items, and using it in place of the other is a common way to end up with a
total that looks plausible and is wrong.
If you are seeing retail with a complete purchasing entity
The mutation shape is probably not your problem. Things worth checking, in the order I would check them:
- Is the variant actually in the price list? A catalog attached to a location does not mean every product has a price in it, and a product that has none falls back to retail. That is correct behaviour rather than a bug, and it is the single most common cause.
-
Is the catalog active, and attached to that exact location?
A company with several locations makes this easy to get wrong, and
companyLocationIdpoints at precisely one of them. - Does the catalog's market cover the address country? Catalogs resolve through markets, and the address on the draft order is an input to that.
One related gotcha, if you query prices yourself
ProductVariant.contextualPricing takes a context, and that
context needs country alongside companyLocationId.
Omit the country and it returns prices that quietly disagree with what the
buyer sees on the storefront. Nothing errors. The numbers are simply
different, which is the worst failure mode money code has.
Also worth knowing: contextualPricing carries no provenance.
It returns five fields, and none of them says whether a price came from a
fixed entry or a percentage adjustment. If you need that distinction, it
is PriceListPrice.originType, and it costs a second query.
What this does and does not settle
It settles that Shopify's B2B pricing is more capable than the folklore says. If you are building an integration that creates B2B orders, attach a complete purchasing entity and let Shopify do the pricing.
What it does not settle is quoting. A quote has to show a company their catalog price weeks before any order exists, has to survive a negotiation, and has to record what was offered. Shopify ships the companies, the catalogs, the price lists and the payment terms, and nothing to quote with. That gap is real, and unlike the other one, I have tested it.
I am Jack Petersen, and I build Counterline, a B2B quoting app for Shopify (App Store listing). It is a paid app, with a free plan on development stores. Everything above is measurable on your own store without it.