Every distributor we have worked with reached the same point: an online store that worked, an ERP that worked, and a team re-keying between them. Orders exported and re-entered. Stock maintained twice. Payments matched by hand. The integration project is usually framed as “connect the store to NetSuite”, and the API is the easy part. The decisions that determine whether it holds up are about ownership and failure.
Rule 1: one system owns each fact
Before writing any code, write a table with one row per kind of data (product, price, inventory, customer, order, payment, shipment) and one column: which system is allowed to change it. For a distributor, NetSuite owns products, prices, inventory and finance. The store owns the shopping session and the order until it is placed, and then NetSuite owns that too. Nobody edits a price in nopCommerce.
This single table resolves most of the arguments that otherwise surface six months in. It also tells you the direction of every sync.
Rule 2: sync incrementally and idempotently
Full catalogue syncs feel safe and are not. They are slow, they hammer the NetSuite API limits, and when one fails halfway you do not know what state you are in. Instead:
- Pull changes since the last successful run, using NetSuite’s last-modified timestamps, with a small overlap so nothing falls in the gap.
- Make every write idempotent: applying the same change twice produces the same result. Key on the NetSuite internal ID, never on a name or SKU string that someone might edit.
- Record the high-water mark only after the batch commits. A failed run re-processes the same window and nothing is duplicated.
With this in place, a sync that breaks at 2 a.m. is a nuisance, not an incident. Re-run it.
Rule 3: model pricing the way the ERP does
B2B pricing is where integrations quietly go wrong. NetSuite price levels, customer-specific pricing and quantity breaks have to map onto nopCommerce customer roles, tier prices and discounts so that the price a retailer sees online matches the price on the invoice, every time. Map these explicitly, test them with real customer accounts, and make the store show the price source so sales can explain it. A retailer who finds a different price on the invoice stops trusting the store.
Rule 4: treat inventory as a hint, orders as the truth
Stock levels synced every few minutes are always slightly stale. Design for that: show availability, not an exact count; validate stock again when the order is placed; and let NetSuite reject or backorder a line rather than pretending the store can be authoritative. Orders, by contrast, are facts. They go to NetSuite as soon as they are placed, with a retry queue, and the store records the NetSuite order ID when it comes back so support can find them in either system.
Rule 5: payments deserve their own design
Distributors often do not want card processing; their retailers pay on account by bank debit. In one engagement we generated NACHA files for ACH payments on a schedule, sent them to the client’s bank, and fed settlement results back into NetSuite. The lesson generalises: payment is a separate flow with its own reconciliation, not a checkbox on the order sync. Build the reconciliation report first; it is what finance will actually use.
Rule 6: make failure visible
Every sync job writes a run record: what window it covered, how many records it touched, what failed and why. Surface that in an admin page and in an alert. The team that used to re-key data will trust the integration only when they can see it working, and the first time something does go wrong, they will know in minutes instead of discovering it on a customer call.
What this looks like done
In the engagement described in our NetSuite integration case study, 1,100+ SKUs stay in step between NetSuite and the store, retailers order and pay online, and finance stopped matching payments by hand. The code is not exotic. The rules above are what made it stay working.
Have a similar problem?
Tell us what you are building. Hiten reads every enquiry and replies within one working day.
