Shopify B2B and NetSuite
Shopify B2B NetSuite integration
NetSuite customers and subcustomers as Shopify companies and locations, price levels and contract prices as catalogs, terms and credit status as checkout rules. B2B orders return to NetSuite on the right subcustomer with their PO number. Built to your NetSuite pricing, then hosted and run for you.
What moves between Shopify B2B and NetSuite
A B2B store adds four record types to the usual product, stock and order flows: the company, its locations, its buyers and its prices. NetSuite holds all four on the customer record and its children. Shopify holds them as separate objects.
| NetSuite | Shopify B2B | Direction |
|---|---|---|
| Customer, top-level parent | Company, with externalId |
to Shopify |
Subcustomer (parent set) |
Company location, with addresses | to Shopify |
| Contact on the customer | Customer as company contact, role per location | to Shopify |
pricelevel, group pricing, item pricing |
Catalog with a price list | to Shopify |
terms |
Payment terms template on the location | to Shopify |
creditlimit, balance, credit hold |
checkout to draft on the location | to Shopify |
Sales order, entity and otherrefnum |
Order with purchasingEntity and poNumber |
to NetSuite |
| Invoice and payment | Order payment status | to Shopify |
Stock per location, items and fulfillments run as on any Shopify NetSuite integration; those flows are on Shopify NetSuite integration. This page covers what B2B adds.
Which system owns what
| Data | System of record | Direction | Sync behavior |
|---|---|---|---|
| Company and location master data | NetSuite | to Shopify | changed customers, several times a day |
| Buyers and their roles | NetSuite contacts | to Shopify | one company contact per contact with a login |
| Price levels and contract prices | NetSuite | to Shopify | resolved per catalog, nightly and on change |
| Terms and credit status | NetSuite | to Shopify | terms on change, credit status hourly |
| B2B orders | Shopify until import, then NetSuite | to NetSuite | once, keyed on the Shopify order ID |
| Open balance and invoices | NetSuite | to Shopify | after each payment |
What Shopify and NetSuite store differently
Hierarchy. A NetSuite customer can be a subcustomer of another, and that one of a third. A Shopify company has one level of locations below it, up to 10,000. A NetSuite hierarchy holds at most 10,000 customers and subcustomers, so the counts match, but the depth does not. The integration flattens: every customer that orders becomes a location under its top-level parent, and the location's externalId holds the NetSuite internal ID.
Prices: most specific against lowest. NetSuite resolves a price from the specific to the general: an item price on the customer record overrides both the customer's group pricing and its price level. Shopify does the opposite when several catalogs apply: the buyer gets the lowest price across all of them. Assign a Wholesale catalog and a contract catalog to one location and a contract price that is higher than Wholesale will never show. So the integration resolves the NetSuite price first and writes one catalog per contract customer.
The sum for one customer. Customer 10432 buys from a catalog of 8,000 items. 80 items have an item price on the customer record. 634 more fall in a pricing group with its own level. The other 7,286 follow the customer's price level, Wholesale, at 20 percent below list. Shopify's catalog takes the 20 percent as one overall adjustment, and a fixed price overrides that adjustment per item. So the catalog needs 80 plus 634, which is 714 fixed prices: 3 calls of 250. Publishing the 8,000 products to the catalog's publication takes 160 operations of 50. More in customer catalogs.
Quantity pricing. NetSuite quantity pricing gives a price per break on each price level. Shopify allows up to 10 price breaks per product in a catalog, applied to each variant, and separate quantity rules for minimum, maximum and increment. The REST record for an inventory item leaves out quantitypricingdiscount and quantitypricinglevel, so the breaks are read with SuiteQL or a RESTlet. A NetSuite schedule with more breaks than Shopify accepts is reported, not cut.
Terms. NetSuite terms is a list you maintain, such as Net 30 or 2% 10 Net 30. Shopify chooses from its own payment terms templates, of type NET with dueInDays, FIXED, RECEIPT or FULFILLMENT. Net 30 maps to NET with 30 days. A discount for early payment has no Shopify field; the integration maps the term to its net days and NetSuite keeps the discount on the invoice. Details in B2B terms.
Credit. NetSuite has creditlimit, balance, unbilledorders, overduebalance and a credit hold setting on each customer. A Shopify company location has no credit limit field. What it does have is checkoutToDraft. The integration sets it on a location that is over its limit or on hold, so the next order waits for review.
The technical reality of this pair
| Limit | Shopify | NetSuite |
|---|---|---|
| Catalogs | 3 below Plus; 25 per location, 10,000 per store on Plus | price levels up to 1,000 |
| Hierarchy | 10,000 locations per company | 10,000 customers per hierarchy |
| Price writes | 250 per priceListFixedPricesAdd |
SuiteQL, 1,000 rows per page |
| Rate | 100 points per second, 1,000 on Plus | 5 to 20 concurrent requests by tier |
| Over the limit | THROTTLED in an HTTP 200 |
HTTP 429 CONCURRENCY_LIMIT_EXCEEDED |
Checked on October 3, 2026 in Shopify's catalog documentation and Oracle's concurrency documentation.
A full price load, worked through. 40 contract customers with a resolved catalog of 714 fixed prices each is 28,560 prices, or 115 calls of 250: 114.24 rounded up. Reading the same prices from NetSuite is 29 SuiteQL pages of 1,000 rows in one concurrency slot. On the nightly run only changed prices go, usually a few hundred.
Orders on the right subcustomer. A B2B order carries purchasingEntity with the company and location. The integration reads the location's externalId and writes the sales order with that subcustomer as entity, the PO number in otherrefnum and the location's terms. An order without a valid PO number, when your rules require one, is held. On a Standard NetSuite account with 5 concurrency slots, the order flow uses 2, so your other integrations and users keep 3. The calculation is in NetSuite concurrency limits.
Where standard connectors stop
Standard connectors and iPaaS templates handle consumer orders and B2B orders as two sets of flows, with a filter that keeps company orders out of the consumer set. The documented price model takes one NetSuite price level for the selling price and one for the compare-at price; further levels or customer prices need custom formulas and scripts. Credit limits and a customer hierarchy deeper than two levels are outside the template.
A built integration resolves prices the way NetSuite does, writes the catalogs Shopify's plan allows, and carries terms, PO numbers and credit status as rules. The comparison on technical grounds: custom integration vs iPaaS.
When it goes wrong
| What fails | What the integration does | What you see |
|---|---|---|
Location without externalId match |
order held, no new customer created | the order and the company |
| Contract price higher than the level price | written as a fixed price, so it shows | nothing |
| Price break schedule longer than Shopify allows | first 10 written, the item reported | the item and the breaks |
| Customer over credit limit | location switched to checkout to draft | the location and the balance |
| NetSuite 429 on an order | order stays in the queue, retried | nothing, unless it lasts |
| Catalog limit reached below Plus | extra price set not written | a message naming the price level |
An order that keeps failing is kept with its original payload and sent again once the cause is fixed. Each order carries its Shopify ID as external ID, so a retry updates the sales order instead of creating a second one. A reconciliation run compares recent B2B orders with NetSuite and picks up anything a webhook missed.
Before go-live the integration runs as a dry run: it builds the companies, locations and catalogs it would write and shows the price per customer for a sample of items, against your NetSuite sandbox. After that every run has a diff per record. We host and monitor it and change it when Shopify or Oracle releases a new version. The system side is on NetSuite integration, the platform side on Shopify integration, all flows on integrations. Sibling pages: Shopify NetSuite integration, BigCommerce NetSuite integration and Magento NetSuite integration. Tell us how your NetSuite pricing is set up.
Frequently asked questions
Do we need Shopify Plus for B2B?
No. Since April 2026 companies, catalogs, payment terms, checkout to draft, quantity rules and price breaks are on Basic, Grow, Advanced and Plus. Below Plus a store has 3 active catalogs across its B2B markets, and catalogs cannot be assigned to one company location. Plus allows 25 catalogs per location and 10,000 per store, which is what per-customer contract prices need.
Can a contract customer see their own prices without Plus?
Partly. The 3 catalogs carry your 3 main price levels. Contract prices for single customers then come through orders that check out to draft: the integration sets each line to the NetSuite price with priceOverride before the draft becomes an order. The buyer sees the catalog price in the store and the contract price on the order confirmation.
Does Shopify enforce our NetSuite credit limits?
Shopify has no credit limit field on a company location. The integration reads creditlimit, balance and unbilledorders from NetSuite. When a location is over its limit or on credit hold, it switches that location to checkout to draft, so new orders wait for your review instead of going straight to the warehouse.
Our customer hierarchy has three levels. Does that fit?
Shopify has two: a company and its locations. A NetSuite hierarchy deeper than that is flattened. Each customer that orders becomes a location under the company of its top-level parent, and its own NetSuite internal ID is stored as the location's externalId, so orders still land on the right subcustomer.
Can B2B and consumer orders run through the same store?
Yes. A B2B order carries a purchasingEntity with the company and location; a consumer order does not. The integration routes the first to the subcustomer with terms and PO number, the second to your web customer rules, often as a Cash Sale. Both share the same item ID map. Consumer orders are covered on Shopify NetSuite integration.
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