Pricing and customer terms
Customer-specific pricing: each logged-in buyer sees the price on their contract
The price a customer pays is recorded on the customer in your ERP: a price level, group pricing, prices per item. We carry those records to the store, so a buyer who logs in sees the price the ERP will invoice, including on Shopify plans that allow 3 catalogs.
A price per customer, and a login per buyer
A B2B price belongs to a customer record in the ERP. A store shows a price to a person who logged in. Between those two sit a company, a location and a contact, and each link has to be right before the number on the product page is.
Take 500 customers with 3 buyers each: 1,500 logins that have to resolve to 500 ERP customer records. With 50 customers a sales rep corrects a wrong price by phone. With 500, one buyer attached to the wrong location sees another customer's contract price, and a buyer does not report a price that is too low.
Which price layer wins, and how the layers add up, is on the pricing and customer terms page. This page covers the route of one customer's price from the ERP record to the product page and the order, per platform.
How it works
From login to ERP customer
| Step | Store, Shopify B2B as the example | ERP, NetSuite as the example |
|---|---|---|
| Who logged in | customer, assigned to a company location as a contact | contact on the customer |
| For whom they buy | company location, with the ERP customer ID in externalId |
customer or sub-customer 10432 |
| Which prices apply | the catalogs of that location, each with a price list | pricelevel, grouppricing and itempricing on the customer |
The ERP customer ID on the company location is the key. It is written when the company is created from the ERP and it never changes when the company is renamed.
Reading the price from the ERP
In NetSuite the customer record has a Price Level field, a Group Pricing sublist with a pricing group and a level per row, and an Item Pricing sublist with an item, a level, a unit price and a currency per row. Item pricing overrides group pricing and the customer's level. For customer 10432 the integration reads:
{
"customer": "10432",
"price_level": "Wholesale",
"group_pricing": [
{ "group": "Fasteners", "level": "Distributor" }
],
"item_pricing": [
{ "item": "10482", "unit_price": "9.60", "currency": "USD" }
]
}
An Item Pricing row has no start date and no end date. A contract that runs through December 31, 2026 has its end date somewhere else: on a contract record, in a custom field, or in a spreadsheet at sales. Where that date lives is one of the first mapping questions, because the integration has to stop publishing $9.60 on January 1. SAP Business One and Business Central carry the dates on the price itself: a validity period on a special price, a starting and ending date on a price list line.
One price per item
The three sources are resolved in the order the ERP applies them. Customer 10432, on a catalog of 8,000 items:
item pricing 80 items fixed price
group pricing, Fasteners at Distributor
640 items, 6 already in item pricing 634 items Distributor price
price level Wholesale 7,286 items list minus 20%
total 8,000 items
In Shopify that is one price list: a percentage adjustment of minus 20% for the 7,286 items, and 714 fixed prices that override it. Fixed prices go in arrays of up to 250, so the first load for this customer is 3 calls. A contract renewal that changes all 80 item prices is 1 call.
After writing, the integration reads the price back the way the buyer gets it. Shopify returns the final price of a variant for a company location through contextualPricing, and that number is compared with the ERP price. Item 10482 has to come back as 9.60 for the location of customer 10432 and as 10.00 for a Wholesale customer without the contract.
Quantity breaks
Shopify allows up to 10 price breaks per product in a catalog. A break belongs to the price list, so customer 10432 can have a break at 100 units that another customer on the same level does not have. Quantity rules sit next to it: a minimum, a maximum and an increment per variant. Whether a quantity break below the contract price applies is the ERP's rule: under most-specific-wins the 120 units from the hub example stay at $9.60, under best-price they drop to $9.50.
Shopify plans with 3 active catalogs
On Basic, Grow and Advanced a catalog is attached to a B2B market, and a B2B market is a set of company locations. The store has 3 active catalogs across all its B2B markets. Assigning a catalog directly to one company location is a Plus feature.
Three catalogs are three price sets on the storefront. Two levels and one large contract customer fit: two markets for the levels and one market that holds only the locations of that customer. A store with 6 levels and 40 contract customers needs 46 and does not fit.
A pricing function at checkout is not available either: Shopify runs Functions from a custom app on Plus stores only. What every plan has is the draft order. A company location can be set to submit all orders as drafts for review. The cart then arrives as a draft order and no payment is taken at checkout. The integration prices each line from the ERP and writes it to the draft with priceOverride.
A buyer of customer 10432 orders 60 units of item 10482. The storefront shows the Wholesale price: 60 times $10.00 is $600.00. The contract price is $9.60, so the draft is repriced to 60 times 9.60: $576.00. The draft is confirmed as an order on the customer's payment terms or sent as an invoice to pay. Prices on a draft submitted this way are locked by default, so a later price run does not change them.
When every contract customer has to see its own price on the product page, the limit is the plan: catalogs per company location are on Plus, 25 per location and 10,000 per store. Shopify lists the differences in its B2B features by plan, checked on October 3, 2026.
What goes wrong quietly
A buyer on the wrong location. A contact is added to the company by hand and assigned to the headquarters location, which has the contract catalog, while the buyer orders for a branch that does not. The store shows $9.60 and the ERP invoices $10.00 to the branch. Contacts and their locations come from the ERP, and a contact created in the store without an ERP counterpart is listed in the run report.
An order that bypasses the storefront. A sales rep creates a draft order, or a buyer reorders from last year's order. The line carries the price of that moment. Every order line is compared with the ERP price for that customer and quantity at import, and a difference is flagged with both amounts.
A second currency on the customer. An Item Pricing row has a currency, and a customer that buys in USD and CAD has rows in both. A Shopify price list has one currency. The rows are split into a price list per currency, and a row in a currency the store does not sell in is reported instead of converted.
An app that reads the base price. A product feed, a search index or a quote tool that reads the price field of a variant gets the list price of $12.50. The customer price exists only in the context of a company location. Every place that shows a price to a logged-in buyer is checked against contextualPricing during the build.
A new item with no customer price. Item 10533 is created in the ERP on Monday and added to the contract of customer 10432 on Thursday. For three days the store shows the level price, which is correct. On Thursday the contract row is an event and reaches the store within minutes; a nightly comparison catches the row when the event is missed.
What it covers
- Buyer to customer. Company, location and contact created from the ERP, with the ERP customer ID on the location.
- Every pricing source on the customer. Price level, group pricing and item pricing, resolved in the ERP's order.
- Quantity breaks and quantity rules. Per customer where the ERP has them per customer.
- Validity dates. Start and end dates evaluated by the integration, from the record where your contracts keep them.
- Read-back check. The price the store resolves for the buyer compared with the ERP price after each run.
Which systems
| System | Where a customer price lives | Limit or caveat |
|---|---|---|
| Shopify B2B on Plus | price list on a catalog, assigned to a company location | 25 catalogs per location, 10,000 per store, 10 price breaks per product |
| Shopify B2B below Plus | catalog on a B2B market | 3 active catalogs in total; contract prices on the draft order |
| Adobe Commerce B2B | custom prices in a shared catalog, assigned to companies | the customer group of a company user is read-only |
| BigCommerce | price list with a price record per variant, assigned to a customer group | 1,000 price records per bulk call; a price record replaces product-level bulk pricing |
| WooCommerce | one regular_price and one sale_price per product |
no customer price in core; it is added in the store's code |
| NetSuite | pricelevel, grouppricing, itempricing on the customer |
up to 1,000 price levels; no dates on an Item Pricing row |
| SAP Business One | special prices per business partner | validity periods, with a quantity scale per period |
| Business Central | sales price list lines per customer or customer price group | minimum quantity, unit of measure and dates per line; lowest valid price wins |
BigCommerce describes price records and assignments in its price list documentation. The pair page for Shopify B2B and NetSuite has the full mapping for that combination, and Shopify has the plan differences in one place.
Where standard connectors stop
Standard connectors and iPaaS platforms map one price level to the store's selling price and one to the compare-at price. More levels are added through custom fields on the item, which a script in the ERP has to keep filled. Quantity pricing is documented for one store platform as a mapping of website, customer group and price level, with the ERP's Quantity Pricing feature switched on and bundle products left out.
The Item Pricing sublist on the customer, the row that holds $9.60 for customer 10432, is not in those field lists. Neither is a rule for a plan with 3 catalogs.
In an integration built for your price structure, each pricing source on the customer is read, resolved in the ERP's order and written to the mechanism your store plan has. Which items an account may see at all is on per-customer catalogs; credit limits and payment terms are on B2B terms. Before the first live run, a dry run lists the price per customer and item that would be written. Send us the pricing records of one customer with exceptions. Tell us what you run.
Frequently asked questions
How does the store know which price belongs to which buyer?
Through the company location the buyer orders for. Each company location in the store carries the ID of the ERP customer it stands for, in Shopify in the externalId field. A buyer who logs in is a contact of that location, and the catalogs of the location hold the prices of that ERP customer. A contact that matches no ERP customer is listed in the run report and sees the list price until it is matched.
Can contract prices work on Shopify without Plus?
Yes, with a limit. Basic, Grow and Advanced allow 3 active catalogs across all B2B markets, so three price sets are visible on the storefront. Contract prices beyond those three are applied on the order: the company location submits orders as drafts, and the integration writes the ERP price to each draft order line before the buyer pays. A price per customer on the product page itself needs catalogs assigned to company locations, which is a Plus feature.
Can one buyer order for two locations with different prices?
Yes, within one company. In Shopify B2B a customer belongs to one company and can be assigned to several of its locations, and each order is placed for one location. The price follows the location, so the same person sees $9.60 for the Reno branch and $10.00 for a branch without the contract. In the ERP the two branches are two customer records, or a customer and a sub-customer.
How many quantity breaks can a customer price have?
Shopify allows up to 10 price breaks per product in a catalog, applied per variant. A BigCommerce price record can carry bulk pricing tiers of its own. An ERP price with more steps than the store accepts is reported in the run with the item and the number of steps. It is not cut off at the tenth step without a message.
Do we maintain prices in two places?
No. Prices are maintained in the ERP and written to the store by the integration. The store sends no price back. The one price that originates in the store is the price on a placed order, which goes to the ERP with the order and is compared there with the ERP price for that customer and item.
Is the price checked again when the order reaches the ERP?
Yes. Each order line is compared with the price the ERP calculates for that customer, item and quantity on the order date. When the two differ, the order is imported with the confirmed price and flagged with both amounts, for example $576.00 on the order against $600.00 in the ERP. The count of flagged orders per day is on the dashboard.
Tell us what you need
Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.
- You know the price and the timeline before you commit to anything
- We work out the connection that takes the work off your hands
- We handle the build, hosting, monitoring and maintenance
- Your team has less information to retype and fewer discrepancies to chase