BigCommerce and NetSuite
BigCommerce NetSuite integration
BigCommerce orders, companies and PO numbers go into NetSuite. Price levels, credit, payment terms, stock and tracking come back, for one storefront or several. The integration works across the BigCommerce API and the separate B2B Edition API, within both rate limits, and is hosted and run for you.
What moves between BigCommerce and NetSuite
BigCommerce takes the order, for consumers and for company accounts. NetSuite owns items, prices, credit and the books. With B2B Edition in use the data sits in two BigCommerce APIs, and the integration reads both.
| Flow | Direction | BigCommerce side | NetSuite side |
|---|---|---|---|
| Orders | to NetSuite | /v2/orders, order products, addresses |
Sales Order |
| PO number | to NetSuite | poNumber on the B2B Edition order |
PO # on the sales order |
| Companies and users | both ways | B2B Edition companies, users, roles | Customer, subcustomer, Contact |
| Price lists | to BigCommerce | /v3/pricelists/{id}/records |
price levels, quantity pricing |
| Credit and terms | to BigCommerce | company credit, payment terms | credit limit, balance, terms |
| Stock | to BigCommerce | /v3/inventory/adjustments/absolute |
quantity available per location |
| Shipments | to BigCommerce | /v2/orders/{id}/shipments |
Item Fulfillment with tracking |
| Invoices | to BigCommerce | B2B Edition invoices, externalId |
Invoice |
| Refunds | both ways | /v3/orders/{id}/payment_actions/refunds |
Credit Memo, Customer Refund |
The sales order keeps the BigCommerce order ID as its external ID. In the other direction BigCommerce has a field for it: external_order_id, with external_source naming the ERP.
Which system owns what
| Data | System of record | Direction | Sync behavior |
|---|---|---|---|
| Items, SKUs, variants | NetSuite | NetSuite to BigCommerce | 10 products or 50 variants per request |
| Product content, categories | BigCommerce | stays in BigCommerce | not touched |
| Price lists | NetSuite price levels | NetSuite to BigCommerce | 1,000 records per request, in sequence |
| Stock per location | NetSuite | NetSuite to BigCommerce | absolute adjustments, changed items |
| Company accounts | NetSuite once approved | both ways | company to customer, user to contact |
| Credit limit and hold | NetSuite | NetSuite to BigCommerce | recalculated after each invoice and payment |
| Payment terms | NetSuite | NetSuite to BigCommerce | mapped to the allowed values |
| Orders and PO numbers | BigCommerce until import | BigCommerce to NetSuite | webhook plus poll |
| Tax | one side, set once | with the order | amounts written, or recalculated |
What BigCommerce and NetSuite store differently
Companies and the customer hierarchy
A B2B Edition company has users with roles: admin, senior buyer, junior buyer. A hierarchy holds up to 5 layers and 500 companies. NetSuite's customer hierarchy holds up to 10,000 customers. A NetSuite parent with 800 ship-to subcustomers therefore does not fit as one B2B Edition hierarchy. The mapping decides per customer: a subcustomer that orders for itself becomes a company, one that is only a delivery point becomes an address.
A company links to one customer group, and a BigCommerce customer belongs to exactly one group. That group is what price lists attach to.
Price lists and price levels
A price list record holds price, sale_price, retail_price, map_price and bulk_pricing_tiers per variant and currency:
{
"sku": "TS-BLK-M",
"currency": "usd",
"price": 36.00,
"bulk_pricing_tiers": [
{ "quantity_min": 10, "quantity_max": 49, "type": "fixed", "amount": 31.50 },
{ "quantity_min": 50, "type": "fixed", "amount": 28.00 }
]
}
NetSuite stacks: a customer has a price level and can have item prices of their own on top. In BigCommerce that customer needs a price list and a customer group of their own. Without layers that list holds every price, resolved in advance. Cascading price lists, in open beta and available to all stores, add up to five fallback lists to a primary list: BigCommerce checks the primary list, then each layer in order, then the catalog price. The customer's own list then holds only their item prices, with the price level's list as its layer in layers. For 3 price levels and 8,000 SKUs the load is 24,000 records: 24 requests of 1,000, sent one after the other, since more parallel upserts than BigCommerce allows on one store return a 429. Price list changes fire no product webhook, so nothing else in your stack hears about them. See customer-specific pricing.
Payment terms and credit
B2B Edition accepts six payment term values: 0, 5, 15, 30, 45 and 60 days. NetSuite terms are free records: Net 30, Net 90, 2% 10 Net 30. Net 90 and any discount term have no equal on the BigCommerce side. They need a mapping table and a decision for each term without a match.
Credit is calculated in NetSuite. From the customer's credit limit the integration subtracts the open balance and the unbilled orders and writes the result to availableCredit. NetSuite's credit hold becomes creditHold, and limitPurchases decides whether checkout blocks an order above the available amount. More in B2B terms.
The PO number
The buyer's PO number is on the B2B Edition order as poNumber, not on the /v2/orders record. One B2B order therefore takes four reads: the order, its products, its shipping addresses, and the B2B Edition order. The webhook that announces it carries only the order ID.
Tax
A BigCommerce order arrives with total_tax, subtotal_ex_tax and a tax_provider_id: BasicTaxProvider for manual tax rules, AvaTaxProvider for automatic tax. If NetSuite calculates tax again on the sales order, every order where the two differ carries the wrong amount into the books. One side is the source and the other takes its numbers. A total_tax of 0 also does not mean the customer is exempt: exemption is on the customer record, in tax_exempt_category, and maps to the customer's tax status in NetSuite.
Variants
BigCommerce allows 600 SKUs per product and 250 values per option. A NetSuite matrix allows 2,000 combinations. A matrix of 12 sizes and 60 colors has 720 children and has to be split into two products. Details in variant mapping.
The technical reality of this pair
| Limit | BigCommerce | NetSuite |
|---|---|---|
| Throttle | 150 requests per 30 seconds on Standard and Plus, 450 on Pro | 5, 15 or 20 concurrent requests |
| Scope of the limit | shared by all apps on the store | shared by all integrations on the account |
| B2B data | B2B Edition API: 150 requests per minute | same account limit |
| Batch sizes | 10 products, 50 variants, 1,000 price records, 2,000 inventory items | 1,000 rows per SuiteQL page |
| Over the limit | HTTP 429, wait for X-Rate-Limit-Time-Reset-Ms |
HTTP 429 CONCURRENCY_LIMIT_EXCEEDED |
| Webhooks | ID only; 11 retries over 48 hours | none; polled or pushed by script |
The plan names are those of BigCommerce's developer documentation. Enterprise limits are set per plan.
Orders, worked through. At 4 reads per B2B order and 150 requests per 30 seconds, the BigCommerce API carries 37 orders per window if nothing else uses the quota. It rarely has the quota alone: a reviews app, a search app and a shipping app draw on the same 150. The B2B Edition call is the tighter one: 150 a minute is 150 B2B orders a minute at most. NetSuite then writes at its own rate: 2 slots at 3 seconds per sales order is 40 orders a minute. The integration reads X-Rate-Limit-Requests-Left on every response and slows down before the quota runs out.
Catalog, worked through. An update of 4,000 products at 10 per request is 400 requests: three windows of 30 seconds on Standard, if the quota is free. The same 4,000 as 12,000 variant updates at 50 per request is 240 requests. Stock for those 12,000 SKUs is 6 inventory requests of 2,000, each sent after the previous one returned 200. BigCommerce's documentation warns against running bulk inventory updates in parallel with bulk catalog or order updates, so the integration runs them in turn.
Webhooks. A webhook payload holds the ID and nothing else. BigCommerce retries a failed delivery after 60 seconds, then at growing intervals up to 24 hours, 11 times in all, and deactivates the webhook after 48 hours with an email to the store. If fewer than 90 percent of deliveries to a domain succeed within two minutes, the domain is blocked for three minutes. An endpoint that does its work before answering runs into that on a busy day. Ours answers 200 and queues.
The BigCommerce side is on the BigCommerce page. The NetSuite side of these numbers is on the NetSuite page and in NetSuite concurrency limits; the retry pattern is in API throttling and backoff.
Where standard connectors stop
The standard path of a packaged connector is the consumer store: orders in, shipments out, one price and one quantity out. The B2B half of this pair adds four things to that path.
- The second API. PO numbers, companies, payment terms and credit are in the B2B Edition API, with its own token headers (
X-Auth-TokenplusX-Store-Hashsince September 30, 2025) and its own limit. A connector built on/v2/ordersalone delivers the order without the PO number. - Price lists as a model. A price list per price level, with quantity tiers, per channel and per customer group, is a model, not a field mapping. So is a price list per customer.
- Six payment terms. A fixed mapping breaks on the first NetSuite term outside 0, 5, 15, 30, 45 and 60 days.
- Several storefronts.
channel_idhas to become a subsidiary, class or location in NetSuite, and one buyer with an account on two storefronts has to become one customer.
A built integration carries these as rules written for your account. The technical comparison is in custom integration vs iPaaS.
When it goes wrong
| What fails | What the integration does | What you see |
|---|---|---|
| BigCommerce answers 429 | waits for the reset header, continues | nothing |
| Price list upsert answers 429 | sends batches strictly in sequence | nothing |
| Webhook deactivated after 48 hours | poll on min_date_modified finds the orders; webhook is recreated |
an alert with the time |
| B2B Edition order not yet readable | order waits in the queue, read again | nothing, unless it lasts |
| Payment term without a mapping | holds the company update | the company and the term |
| NetSuite answers 429 | retries with a growing pause | nothing, unless it lasts |
| Tax differs between the two | writes the source side's amount, logs the difference | a line in the run diff |
An order that still fails after its retries is kept with its payload and can be sent again after the cause is fixed. Nothing is dropped without a trace.
Before go-live the integration runs as a dry run: it reads both BigCommerce APIs and NetSuite and shows the sales orders, price lists and credit amounts it would write, without writing. From then on every run leaves a diff per record in the dashboard. We host and monitor it as part of an e-commerce ERP integration, and adjust it when BigCommerce or Oracle changes an interface. Sibling pages: Shopify NetSuite integration, Magento NetSuite integration and WooCommerce NetSuite integration. Tell us how your BigCommerce store and NetSuite account are set up.
Frequently asked questions
Does the integration support BigCommerce B2B Edition?
Yes. B2B Edition has its own API with its own limit of 150 requests per minute. The integration reads companies, company users and the PO number of each order from it, and writes payment terms, credit and invoices back. A company maps to a NetSuite customer, a child company to a subcustomer, and a company user to a contact.
How do NetSuite price levels get into BigCommerce?
Each price level becomes a price list, assigned to a customer group and, with several storefronts, to a channel. Records go in batches of 1,000 per request, one batch at a time. Quantity pricing becomes bulk_pricing_tiers on the record. A customer with individual prices in NetSuite gets a price list and customer group of their own. With cascading price lists (open beta) that list holds only the exceptions and falls back to the price level's list.
Who calculates tax, BigCommerce or NetSuite?
One of the two, set once. The BigCommerce order arrives with total_tax and a tax_provider_id. If NetSuite also calculates tax on the sales order, the two amounts differ on some orders and the invoice no longer matches the payment. The integration either writes BigCommerce's tax amounts to NetSuite and switches recalculation off for web orders, or sends net amounts and lets NetSuite calculate.
Does it work with several storefronts?
Yes. Every order carries a channel_id, and the integration maps each channel to a NetSuite subsidiary, class or location. Customer email addresses are unique per channel in BigCommerce, not per store, so the same buyer can exist once per storefront. The integration matches them to one NetSuite customer. Stock is one quantity for all storefronts: the Inventory API is not channel aware.
How does stock from NetSuite reach BigCommerce?
Through absolute inventory adjustments, up to 2,000 items per request, sent one request after the other. NetSuite locations map to BigCommerce locations, of which a store has 4 to 100 depending on the plan. A buffer goes into safety_stock per location; BigCommerce then shows available_to_sell as on hand minus that buffer.
What happens when a webhook from BigCommerce is missed?
BigCommerce retries a failed webhook 11 times over 48 hours and then deactivates it. The integration answers every webhook with 200 at once and processes it from a queue, so failures are rare. It also polls orders by min_date_modified and checks that its webhooks are still active.
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