A buyer with a negotiated 12% volume discount and net-60 terms logs in and sees list price at checkout. Somewhere between the contract your sales team signed and the storefront, the number got lost. That gap, between what a buyer actually negotiated and what the storefront shows them, is where contract pricing breaks down on most B2B stores, and it's rarely a Shopify problem. It's usually a data-ownership problem.
This guide covers what contract pricing actually means in B2B ecommerce, how it's different from simple tiered pricing, and how to structure it on Shopify so the number a buyer sees is always the number they agreed to.
What Is Contract Pricing in B2B Ecommerce?
Contract pricing is a negotiated pricing agreement between a seller and a specific buyer account, often tied to a defined contract period, minimum volume commitment, or set of product-specific rates. Unlike a general discount, it's not something every buyer in a segment gets. It's the specific number one account negotiated, usually through a sales process that happened well before that buyer ever logged into a storefront.
That distinction matters because it determines where the pricing has to live. A general volume discount can reasonably be configured directly in a storefront's pricing rules. A contract price, tied to one account's specific negotiated terms and an expiration date, needs to trace back to the actual agreement, which usually means the ERP or CRM system where that contract was recorded, not a rule built independently inside the storefront.
Contract Pricing vs. Tiered and Volume Pricing
These get used interchangeably, but they solve different problems. Tiered or volume pricing applies a price break based on quantity or purchase volume, available to any buyer who qualifies, and it's something Shopify B2B supports natively through quantity rules and price breaks on a catalog.
Contract pricing is narrower and more specific. It's a negotiated rate for one account, sometimes on specific products only, sometimes for a defined time period, and it typically doesn't apply to any other buyer even in the same segment. Native volume pricing can approximate simple contract scenarios, but it starts to break down once contracts involve product-specific overrides, expiration and renewal dates, or terms that vary meaningfully account to account.
Most B2B sellers actually need both: tiered pricing as the general structure, and a layer of true contract pricing on top for the accounts with individually negotiated terms.
Where Contract Pricing Should Actually Live
The single most common reason contract pricing breaks on a storefront is that it lives in two places at once, the ERP or CRM where the contract was actually negotiated, and a separate set of rules configured directly in the storefront, and the two drift out of sync the moment either one changes.
The fix is architectural, not cosmetic. Contract pricing should have one system of record, almost always the ERP, and the storefront should reflect that pricing in real time rather than maintaining its own parallel copy. Uncap Connect keeps customer-specific pricing, credit terms, and account data synced between Shopify and your ERP, so a contract update made in the system of record shows up on the storefront automatically, instead of requiring someone to manually update pricing rules in two places and hope they stay matched.
This also solves the expiration problem. A contract that lapsed six months ago but is still being honored at checkout isn't a storefront bug, it's a sign the storefront never had visibility into the contract's actual terms in the first place.
How to Structure Contract Pricing on a Shopify B2B Storefront
Build the account foundation first. Company accounts with accurate contact roles and purchasing permissions are the prerequisite for any contract pricing to apply correctly. Uncap Commerce builds this foundation for wholesale sellers moving negotiated relationships onto a self-serve storefront.
Use catalogs to scope what a contract account actually sees. A contract account often has access to specific products, at specific prices, that shouldn't be visible to every buyer. Shopify B2B's catalog structure is built for exactly this, restricting both visibility and pricing to the accounts a contract actually applies to.
Let the ERP own the source of truth for the rate itself. The storefront should be a display layer for contract pricing, not the place where the rate is decided or maintained. When the rate needs to change, it changes once, in the system where the contract lives, and propagates automatically.
Handle contract expiration explicitly, not silently. When a contract lapses, the storefront needs to know to fall back to standard pricing or flag the account for renewal, rather than continuing to apply an expired rate because nothing told it otherwise.
Route renegotiation through a real workflow, not an email thread. When a buyer's volume changes enough to warrant a new rate, or a contract is up for renewal, Uncap Quotes gives that conversation a structured path inside Shopify instead of a side conversation that never makes it back into the pricing data.
What Native Shopify B2B Pricing Tools Actually Do
It's worth being specific about what Shopify B2B already gives you natively, since the gap between "native feature" and "true contract pricing" is where most confusion starts.
Company-specific catalogs let you assign a specific set of products and prices to a specific company account. This is the closest native building block to contract pricing, one company sees one price list.
Quantity rules set minimum, maximum, and increment order requirements per product, useful for enforcing purchasing patterns tied to a contract's terms, like a minimum case quantity.
Volume price breaks apply a lower price automatically as order quantity increases, configured per catalog. This handles the simplest contract scenario: a flat negotiated discount at defined quantity thresholds.
What native Shopify doesn't do on its own is connect any of these structures back to an actual contract record with an expiration date, a volume commitment, or product-specific overrides negotiated outside the platform. That connective layer, keeping the catalog and price break configuration in sync with what the CRM or ERP says the contract actually is, is the part that has to be built or synced deliberately. It's rarely a limitation of the catalog and pricing structure itself, it's a gap in what keeps that structure current.
A Concrete Example: Where Contract Pricing Actually Breaks
Picture a distributor with a national account on a two-year agreement: 15% off a defined product list, net-60 terms, and a volume commitment reviewed quarterly. That agreement gets negotiated by a sales director, recorded in the CRM, and referenced in an ERP price list tied to the account.
Six months in, the buyer's procurement contact logs into the Shopify storefront and orders at list price, because the storefront was configured with a standalone 15% discount rule set up at launch, and nobody connected it to the actual CRM record. The volume commitment was never checked against actual order history, so nobody notices the account has fallen well short of the commitment that justified the discount in the first place. Neither side of that mismatch shows up anywhere until the buyer complains about a wrong price, or finance notices margin on the account doesn't match what the contract should be producing.
Nothing in that scenario is a Shopify limitation. It's a sequence of small, disconnected pricing decisions, made in different systems, by different people, with no single place tracking whether they still agree with each other. That's the failure mode contract pricing has to be built to prevent.
Auditing Contract Pricing Before It Costs You Margin
Contract pricing that was correct at setup drifts the same way any manually maintained data drifts. A few checks worth running on a regular cadence:
Reconcile storefront rates against the contract record. Periodically log in as a sample of contract accounts and confirm the price they see matches what the actual agreement, in the CRM or ERP, says it should be. This is the single most direct way to catch drift before a buyer does.
Track volume commitments against actual order history. A contract discount tied to a volume commitment that isn't being met is a renewal conversation waiting to happen, not something to let ride silently until the contract's review date.
Flag contracts approaching expiration before they lapse. A pricing team that finds out a contract expired because a buyer asked why their price changed has already lost some goodwill in that account relationship. Reviewing upcoming expirations proactively keeps that conversation on your terms.
Common Contract Pricing Mistakes
Configuring contract rates as one-off storefront rules. This works until the contract changes, at which point someone has to remember to update the storefront rule separately from whatever system actually tracks the agreement. That's the exact drift that causes a buyer to see the wrong price.
Letting sales reps manually override pricing at the point of sale. A rep who applies a discount manually to save a deal creates pricing that exists nowhere else, invisible to the storefront and to anyone auditing account profitability later.
Treating every negotiated deal as a permanent exception. A contract price without a review or expiration cadence tends to become a permanent discount long after the original justification for it has expired, quietly eroding margin on that account indefinitely.
Not testing what a contract account actually sees. The only reliable way to confirm contract pricing is working is to check it from the buyer's side, logged in as that account, not just from the admin configuration.
Where to Start
Contract pricing works when it has one source of truth and a storefront that reflects it accurately, not when it's recreated independently in two systems and left to drift.
Uncap has been a Shopify Platinum Partner since 2013, building B2B storefronts and ERP-synced pricing for manufacturers and distributors with genuinely negotiated account relationships. See how that work comes together in Uncap's case studies.
Talk to our experts about whether your contract pricing is actually synced to its source of truth, or quietly drifting.
Frequently asked questions
Does Shopify B2B support contract pricing natively?
Shopify B2B natively supports tiered and volume pricing through quantity rules and customer-specific catalogs, which covers many contract pricing scenarios. True contract pricing with product-specific overrides, expiration dates, and ERP-sourced terms typically requires syncing that data from the system where the contract actually lives, rather than configuring it as a standalone storefront rule.
What's the difference between contract pricing and a discount code?
A discount code is typically available to any buyer who has it, often for a limited promotional window. Contract pricing is tied to a specific account's negotiated agreement, isn't shared across buyers, and usually reflects a longer-term, individually negotiated relationship rather than a promotion.
How do I know if my contract pricing is out of sync?
The most reliable check is comparing what a specific contract account sees at checkout against the actual terms in your ERP or CRM. If those don't match, or if pricing rules exist only inside Shopify with no link back to the source contract, that's the sign the data has drifted or was never properly connected in the first place.
Can Shopify B2B handle product-specific contract overrides?
Company-specific catalogs can restrict pricing to specific products for a specific account, which covers many product-specific override scenarios. More complex cases, where the override depends on a contract's specific terms rather than a static catalog assignment, generally need that catalog kept in sync with the contract record rather than maintained as a one-time manual setup.
Who should own contract pricing accuracy, sales or ops?
Neither in isolation. Sales typically negotiates the terms and ops typically maintains the systems, but contract pricing accuracy depends on a clear handoff between the two, ideally through a single system of record both sides reference, rather than sales holding institutional knowledge that ops has no visibility into.
What happens if a contract price and a volume price break conflict?
This depends on how the catalog and pricing rules are structured, but conflicts like this are usually a sign the pricing logic wasn't designed with contract accounts and general volume pricing running at the same time. Sorting out precedence rules before launch avoids buyers seeing an unpredictable price depending on which rule happens to apply.