01 / backbone
NetSuite is the ledger
Finance, inventory, pricing, order management. The authoritative record the business is run on.
Integration / Makro Middleware
Your ERP stays the system of record. Shopify Plus becomes where the order gets placed. We build custom NetSuite to Shopify Plus middleware for B2B, multi-currency, payouts and real-time inventory.
The real problem
The work is the space between: finance, inventory, pricing and order management on one side, B2B buyer self-serve on the other.
01 / backbone
Finance, inventory, pricing, order management. The authoritative record the business is run on.
02 / front door
Where B2B buyers place repeat orders without a phone call, a rep, or an EDI batch.
03 / the gap
Duplicate customers. Orders written twice. Pricing that drifts. Silent failures at month-end close.
We built a product around that exact gap. NetSuite plugs into it as a first-class adapter, running in production today.
How we build it
Customers, items, inventory and pricing are read out of NetSuite and pushed to Shopify. The storefront never writes to the ledger. Orders are the only thing that travels both ways, and NetSuite stays the source of truth.
System of record
read · never overwritten
The platform
map · reconcile · audit
The storefront
where buyers self-serve
The console
Every sync, every failure, every reconciliation is visible. This is the same Makro Middleware console your team would watch in production. Move through the views.
| Time | Entity | Error class | Attempts | Next | Action |
|---|---|---|---|---|---|
| 08:13:04 | salesOrder · SO-10288 | PERMANENT · validation | 3 / 3 | held | Inspect |
| 07:55:22 | customer · CUST-00910 | TRANSIENT · timeout | 2 / 5 | 09:50 | Retry now |
| 06:40:11 | inventoryItem · ITEM-44120 | CONCURRENCY · paced | 1 / 5 | paced | Inspect |
Every record carries three identities at once: its NetSuite internal id, the stamped externalId, and its Shopify gid. The middleware reads this row before every write and decides create, update, or skip.
We upsert by eid: so a retried create cannot silently duplicate. Sync a record twice and it updates. This is what stops duplicate customers and double-posted orders before they reach your ledger.
Change detection runs on the stored checksum, so a catalog of 50,000 items with 12 real edits syncs 12 records, not 50,000.
entity key map · every id matched before write
Checksum change detection
Change detection runs on the stored checksum, so unchanged records are skipped before they touch an API limit. Full-catalog resyncs stop being a monthly event.
Inside the platform
Ten engineered subsystems sit between NetSuite and Shopify Plus. None of them is a setting you toggle. Each is something we built, and something your team can watch run.
01 / 10
When a record fails
Follow one failed record. It is classified before it is retried, and nothing disappears into a log file. Colour carries the verdict: amber is sorted, teal retries, red is held, green replays.
A record fails to write to Shopify or NetSuite. Instead of disappearing into a log, it enters the pipeline and gets a verdict.
capturedEvery failure is sorted before anything is retried, so a bad record never loops forever. A SuiteCloud concurrency error is paced, a validation error is held.
classifiedTransient failures retry with exponential backoff. A SSS_REQUEST_LIMIT_EXCEEDED error backs off against the shared concurrency pool until it clears.
A permanent failure routes straight to the dead-letter queue for review. It is never retried blindly or lost.
held for reviewFix the cause, replay from the queue. A daily reconciliation pass catches anything the live path missed.
replayed · reconciledThe failure modes no vendor page admits
NetSuite to Shopify integrations break at predictable points. The native connector and most iPaaS templates handle the happy path and skip these.
Connectors sync order-level payment data but fail to reconcile actual bank deposits, netted of fees, refunds and chargebacks.
→ deposit-level reconciliation against NetSuiteShopify and NetSuite settle on different rates, producing persistent penny variances auditors flag.
→ NetSuite as source of truth + FX-tolerance accountCart-time tax should be calculated in Shopify, at the edge. NetSuite records the collected tax; it does not calculate the cart.
→ Shopify owns cart, NetSuite owns ledgerApp-store connectors collapse multi-line refunds into single-line credit memos, losing SKU-level audit detail.
→ multi-line credit memos with line-level taxNetSuite resolves price through hierarchy; Shopify Plus B2B resolves by fixed price-list entry. These are structurally different.
→ per-company price lists, mapped at sync timePublish On Hand and you sell inventory already reserved for other orders. We sync Quantity Available, per location, delta-driven.
→ Quantity Available, not On HandClaims you can check
Every reality below is verified against a primary Oracle source or a named vendor doc. This is the difference between a team that read the marketing and a team that shipped against the documentation.
The decision guide
There are three paths: native connector, iPaaS, or custom middleware. The right choice depends on order volume, B2B complexity, and how many systems must stay in sync.
Option 01
Oracle's own connector. Free to low cost, fixed field mappings, competent on the happy path.
Right for simple D2C stores under roughly 1,000 orders per month, with no B2B contract pricing.
Option 02
Subscription middleware on a shared platform. Strong for standard multi-system sync across templated connectors.
Right for standard multi-system sync where the B2B logic fits a fixed-mapping template.
Option 03 · our build
Built around your exact order flow and B2B logic, owned by you, operated with a support agreement.
Right for Shopify B2B contract pricing, parent and child accounts, multi-store or multi-region, high order volume, or non-standard fulfillment.
How long it takes
A NetSuite to Shopify Plus build lands in one of three bands depending on B2B complexity, subsidiaries, and how many break points are in play.
Band 01 · foundation
single store · standard catalog
Band 02 · B2B
Shopify Plus B2B · price lists
Band 03 · multi-entity
multi-subsidiary · multi-currency
We price a NetSuite integration as an engineering engagement: a build with a support agreement, not a per-record meter or a platform seat that renews forever. Enterprise iPaaS commonly runs $30,000 to $100,000+ a year before the work begins.
Security posture
NetSuite and Shopify secrets are encrypted fields, isolated per tenant and rotatable without downtime.
Every Shopify webhook is HMAC-verified before it is trusted, then deduplicated by event id.
Authentication runs on OAuth 2.0 Client Credentials using a dedicated role scoped to exactly what the integration touches.
An append-only audit trail logs every operation, source-tagged, so you can prove what happened during month-end close.
Frequently asked questions
The details that separate a team that read the docs from a team that shipped against them.
The framework underneath
Every ERP sits behind the same contract: authenticate, fetch master data, push orders, validate, report. The sync engine, mapping layer, error handling and Shopify integration never change when a new system plugs in.
Proof and outcomes
Clarius · NetSuite + Salesforce + Shopify PlusWe built a unified account page integrating Clarius' NetSuite ERP, Salesforce CRM and Shopify Plus into a single view of customer information, orders and invoices across three enterprise systems. Combined with Shopify Flow automation feeding order data into NetSuite, it eliminated manual order entry and reduced operational costs by over $100,000 a year.
Automated tests across 139 suites, run on every change.
Coverage gate enforced before any deploy.
End-to-end browser tests across Chromium, Firefox and WebKit.
Failure classes, each with its own pre-decided policy.
Credentials stored in plaintext, anywhere, ever.
A real conversation about your NetSuite account, your B2B catalog, and the break points you already know are coming.