Skip to content
SyncMyShop

Industries

Integrations for distribution and wholesale: contract prices, terms and stock from your ERP

A distributor sells thousands of SKUs on contract prices, net terms and tax exemptions, from several warehouses, through a B2B store, Faire and retailer EDI at once. The integration takes those rules from the ERP, puts them in every channel, and brings each order back on the right account with its PO number.

Where wholesale integrations break

The same five problems come back at almost every distributor:

  • Contract prices per account. A price comes from a price level, a quantity break and a contract with one customer. A connector that carries one price per item shows that customer the wrong number.
  • Net terms, credit limits and resale certificates. A B2B order is placed on Net 30 against a credit limit, and a reseller with a certificate on file pays no sales tax. Each of those lives on the customer record in the ERP.
  • Stock in several warehouses. 8,000 SKUs in 3 warehouses is 24,000 stock levels. Which warehouses may ship web orders is a rule, not a sum.
  • Cases, inners and eaches. The ERP sells by the each, a retailer orders by the case of 12, and a marketplace wants the case size and a minimum order.
  • More than one channel. Your own B2B store, a wholesale marketplace such as Faire, and retailers that send X12 purchase orders all write orders into the same ERP.

Each of these is a data flow with its own source and its own limit. Below is what moves per flow and where it stops.

The flows that matter most

Flow Source What moves In depth
Contract prices ERP price levels, quantity breaks, contract prices per account customer-specific pricing
Accounts and terms ERP company, locations, terms, resale exemption, credit limit B2B terms
Stock ERP or WMS available quantity per warehouse multi-location inventory
Orders store, Faire, EDI sales order on the account, PO number, ship-to orders
Retailer EDI trading partner 850 in; 855, 856 and 810 out EDI integration

Accounts, terms and tax exemptions

A wholesale customer from NetSuite to a Shopify B2B company location The NetSuite customer record holds terms, price level, resale number, taxable flag and credit limit. The integration maps terms to a Shopify payment terms template, price level to a catalog, and the resale number with the ship-to state to a state reseller exemption on the company location. Shopify has no credit limit field, so the limit is checked against NetSuite when the order comes in. NetSuite customer Shopify company location terms Net 30 pricelevel Distributor B resalenumber 32098765432 taxable false creditlimit 25000.00 no field on the Shopify side paymentTermsTemplate NET, dueInDays 30 catalog Distributor B price list taxRegistrationId 32098765432 taxExemptions US_TX_RESELLER_EXEMPTION term to template one catalog per level plus ship-to state
One wholesale account, five NetSuite fields. Four have a place in Shopify B2B; the credit limit stays in NetSuite and is checked when the order comes in.

On the NetSuite customer record, terms holds the invoice terms, pricelevel the default price level, creditlimit the receivables limit, and resalenumber the tax license number of a customer that resells, with taxable cleared. Shopify B2B keeps terms on the company location as a payment terms template of type NET with dueInDays, and tax as taxSettings with a taxRegistrationId and a list of exemptions. Shopify's exemption list has one reseller value per state plus DC, US_TX_RESELLER_EXEMPTION for Texas. NetSuite has one resale number per customer, so the integration sets the state from the ship-to address and assigns the exemption only where a certificate is on file.

Shopify has no credit limit field. The integration checks it when the order arrives: an account with a limit of $25,000 and $21,400 open that places a $4,900 order reaches $26,300, so the order goes to review in the dashboard before it is released in NetSuite.

Contract prices and stock

NetSuite's REST inventory item record leaves out the quantity pricing fields quantitypricingdiscount and quantitypricinglevel, so quantity breaks are read with SuiteQL. On the Shopify side, priceListFixedPricesAdd takes up to 250 prices per call. 120 contract accounts with 150 contract items each are 18,000 fixed prices: 18,000 / 250 = 72 calls. Stock works the same way: 24,000 stock levels at 250 quantities per inventorySetQuantities call is 96 calls for a full run, and after that only the levels that changed.

Systems distributors run

System How it exposes data What to watch
NetSuite REST web services, SuiteQL, RESTlets 5, 15 or 20 concurrent requests by service tier, plus 10 per SuiteCloud Plus license, shared with every integration on the account
Business Central API v2.0 and OData 6,000 OData requests per 5 minutes per user; item.inventory is one number, stock per location needs a custom API page
Acumatica contract-based REST API the license sets API sessions, concurrent requests and requests per minute; requests are delayed from 50% of the per-minute limit
SAP Business One Service Layer (OData) TaxCode on document lines is a US property; Europe uses VatGroup

On the channel side, Shopify has B2B on Basic, Grow, Advanced and Plus, with 10 locations on Basic to Advanced and 200 on Plus. Faire publishes an API for orders, products and stock, with a case size in unit_multiplier, a minimum_order_quantity that is a multiple of it, and available stock as on hand minus committed. A product sold in cases of 12 with a 48-unit minimum is 48 / 12 = 4 cases per order line.

Standards a distributor meets

Standard What it is for What it means for the integration
GTIN (GS1 US) identification of each, inner and case the GTIN-12 is the U.P.C. on the each; a GTIN-14 identifies a case and is not for point of sale; stored as text so leading zeros survive
X12 850, 855, 856, 810 purchase order, acknowledgment, ship notice, invoice mapped to sales order, fulfillment and invoice in the ERP; see 850 and 856
SSCC-18 one serial number per carton or pallet printed as a GS1-128 label and repeated in the 856; see SSCC labels
cXML and OCI PunchOut a buyer shops from their own procurement system cart returned to the buyer, order back as cXML; see PunchOut

Retailers check the 856 against the delivery. Kroger, for example, requires the ship notice at least 90 minutes before the truck arrives and 100% accurate on license plates, case codes and quantities. The integration builds the ship notice from the fulfillment in the ERP or WMS, not from the order, so a short shipment is reported as shipped. Units are the other recurring issue; units of measure covers each, case and pallet conversions.

What this means for your integration

We build the integration on your ERP, your channels and your rules for prices, terms, tax and warehouses. Each piece of data has one system that owns it. Then we host and monitor it: every run has a log and a diff, and an order the ERP rejects stays in the queue with the reason until it is resolved.

The flows are described in full on integrations, the other industries on industries. Tell us which ERP and channels you run, and you hear which of these flows saves you the most work.

Frequently asked questions

Can each customer see their own contract prices in the store?

Yes, after login. NetSuite price levels become Shopify B2B catalogs with a price list each, and contract prices per account become fixed prices on that account's catalog. Below Shopify Plus a store has 3 active B2B catalogs; on Plus the limit is 10,000 per store and 25 per company location. See customer-specific pricing.

How do tax-exempt resellers buy without being charged sales tax?

The resale number and the not-taxable setting come from the ERP and go onto the Shopify company location as a tax registration ID and a state reseller exemption, such as US_TX_RESELLER_EXEMPTION. Shopify has one reseller value per state, so an account that ships to three states gets the exemptions for the states where its certificates are on file.

Does Shopify check a customer's credit limit?

No. A Shopify company location has payment terms but no credit limit field. The integration reads the open balance and the credit limit from the ERP when the order arrives, and an order that would exceed the limit goes to review instead of straight to fulfillment. See B2B terms.

Can Faire orders go into the same ERP as our own B2B orders?

Yes. Faire's API returns orders with state, a purchase_order_number and amounts in minor units, and takes stock per SKU. Faire sends no webhooks, so the integration reads orders on a schedule sorted by updated_at. Each order lands in the ERP under one Faire customer or per retailer, depending on how you invoice.

Do we need EDI to sell to retailers?

Retailers that trade by EDI use X12: an 850 purchase order in, an 855 acknowledgment, an 856 ship notice and an 810 invoice out, with SSCC-labeled cartons. The integration maps those documents straight to sales orders, fulfillments and invoices in the ERP. See EDI 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

Suppliers, products, orders per day, a rough estimate is fine.

Or email directly: carsten@syncmyshop.com