See all services Shopify Plus Partner

Integration / Makro Middleware

NetSuite to Shopify Plus, built to fit.

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.

NetSuite system of record Middleware map · reconcile · audit Shopify Plus buyer self-serve
Live sync feed prod · atlas
NetSuite → Shopify · one wayOrders travel both ways

The real problem

NetSuite runs the business. The store runs the customer.

The work is the space between: finance, inventory, pricing and order management on one side, B2B buyer self-serve on the other.

01 / backbone

NetSuite is the ledger

Finance, inventory, pricing, order management. The authoritative record the business is run on.

02 / front door

Shopify is self-serve

Where B2B buyers place repeat orders without a phone call, a rep, or an EDI batch.

03 / the gap

The middle is where it breaks

Duplicate customers. Orders written twice. Pricing that drifts. Silent failures at month-end close.

Our position

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

One direction for master data. Both directions for orders.

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

NetSuite

read · never overwritten

The platform

Makro Middleware.

map · reconcile · audit

The storefront

Shopify Plus B2B

where buyers self-serve

Master data: NetSuite → Makro Middleware → Shopify, one way
Orders: Shopify → NetSuite, status returns
SuiteQL over RESTDelta extraction in SQL-92, paged and watermarked. We pull only changed records with Prefer: transient, paged by limit and offset against a hard 100,000-result ceiling per query.NetSuite → MK
SuiteTalk REST + RESTletsRecord and Query endpoints for standard CRUD, RESTlets for server-side logic. Custom sales and purchase transactions that REST cannot model are covered by a narrow RESTlet rather than a workaround.NetSuite ↕ MK
Map/Reduce · SuiteAnalytics ConnectBulk and initial loads run server-side, never as thousands of single calls. Heavy catalog and customer loads avoid per-record traffic that would consume the concurrency budget; very large extracts use SuiteAnalytics Connect.NetSuite → MK
OAuth 2.0 M2MServer-to-server auth on a dedicated least-privilege role. A JWT signed with a private key, no shared secret on the wire, 60-minute tokens, and it satisfies NetSuite's mandatory 2FA requirement.handshake
Sales order + !transformOrders captured in Shopify are written into NetSuite, status flows back. A webhook is HMAC-verified, deduplicated by event id, transformed and pushed once; downstream Item Fulfillments and Invoices are created by !transform from the Sales Order.Shopify ↕ NetSuite

The console

This is not a connector. It is something you operate.

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.

console.makro.agency / atlas-building-supply / sync
live
Sync Monitor
Sync Monitor Dead Letter Queue Observability Entity Key Map Schedules Order Relations
Records / 24h
48,210
across 9 entities
Queue depth
3 pending
2 retrying · 1 review
Avg latency
1.2s
event → Shopify
Last reconcile
04:00
0 drift detected
Activitylive · last 60s
Throughputrecords / hr
In queue
3
of 48,210 processed
Auto-retrying
2
transient · concurrency
Needs review
1
permanent
Resolved / 24h
41
38 auto · 3 manual
Dead Letter Queuenothing is dropped in silence
TimeEntityError classAttemptsNextAction
08:13:04salesOrder · SO-10288PERMANENT · validation3 / 3heldInspect
07:55:22customer · CUST-00910TRANSIENT · timeout2 / 509:50Retry now
06:40:11inventoryItem · ITEM-44120CONCURRENCY · paced1 / 5pacedInspect
Sync volume7-day · records
Circuit breakersper endpoint
NetSuite · SuiteQLlast trip · never
closed
Shopify · Admin APIlast trip · 3d ago
closed
Avalara · AvaTaxlast trip · never
closed
Uptime · 90 dayserror rate 0.03%
customer · Atlas West Yardentity_key_map
internal idCUST-004182
externalIdeid:atlas-west-yard
shopify gidgid://shopify/Company/61…
checksuma91f… unchanged
versionv17
→ decision: SKIP · already in sync

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.

Active schedules
7
all workflows enabled
Runs today
96
0 failures
Next run
09:46
inventory levels
Nightly batch
01:00
Map/Reduce · 48,210 records
Workflowstenant · atlas
Item delta syncSuiteQL · watermarkednear-real-time 09:38 · 142 recordsdelta-drivenRun now
Inventory levelsQuantity Availablenear-real-time 09:41 · 3 SKUson changeRun now
Price listsflattened price cubehourly 09:00 · 1,204 rowsnext 10:00Run now
Customers & companiesSuiteQL · deltanear-real-time 09:40 · 6 recordsdelta-drivenRun now
Order status returnNetSuite → Shopifyon fulfillment 09:42 · 11 orderson changeRun now
Full catalog batchMap/Reduce exportnightly · 01:00 01:00 · 48,210 recordsnext 01:00Run now
Daily reconciliationboth systems vs key mapdaily · 04:00 04:00 · 0 driftnext 04:00Run now
Shopify order#1042
gidgid://shopify/Order/57…
companyAtlas West Yard
line 1ITEM-99320 × 12
line 2ITEM-44120 × 4
total$8,420.00
NetSuite sales orderSO-77231
tranIdSO-77231
entityCUST-004182
line 199320 · qty 12
line 244120 · qty 4
statuspending fulfillment
Order journey#1042 → SO-77231 · 5s end to end
09:42:04webhook received 09:42:04HMAC ✓ · dedup ✓ 09:42:05transformed 09:42:06upsert by eid: 09:42:09SO-77231 created 09:42:09status → Shopify
drag, scroll, or use the tabs

Checksum change detection

50,000items in the catalog
12real edits today
12records synced · not 50,000

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

Feature by feature.

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

Integrations are judged by how they fail.

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.

01

It arrives

A record fails to write to Shopify or NetSuite. Instead of disappearing into a log, it enters the pipeline and gets a verdict.

captured
02

It gets classified

Every 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.

transientconcurrencypermanent
classified
03

Transient retries

Transient failures retry with exponential backoff. A SSS_REQUEST_LIMIT_EXCEEDED error backs off against the shared concurrency pool until it clears.

retrying
04

Permanent is held

A permanent failure routes straight to the dead-letter queue for review. It is never retried blindly or lost.

held for review
05

You replay it

Fix the cause, replay from the queue. A daily reconciliation pass catches anything the live path missed.

replayed · reconciled

The failure modes no vendor page admits

Where off-the-shelf connectors break.

NetSuite to Shopify integrations break at predictable points. The native connector and most iPaaS templates handle the happy path and skip these.

10/10 severity

Shopify Payments payout reconciliation

Connectors sync order-level payment data but fail to reconcile actual bank deposits, netted of fees, refunds and chargebacks.

→ deposit-level reconciliation against NetSuite
8/10 severity

Multi-currency and FX rounding

Shopify and NetSuite settle on different rates, producing persistent penny variances auditors flag.

→ NetSuite as source of truth + FX-tolerance account
8/10 severity

Avalara / tax handoff

Cart-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 ledger
7/10 severity

Partial refunds and cancellations

App-store connectors collapse multi-line refunds into single-line credit memos, losing SKU-level audit detail.

→ multi-line credit memos with line-level tax
core to Plus

B2B price lists and subsidiaries

NetSuite resolves price through hierarchy; Shopify Plus B2B resolves by fixed price-list entry. These are structurally different.

→ per-company price lists, mapped at sync time
days to surface

Overselling on shared stock

Publish On Hand and you sell inventory already reserved for other orders. We sync Quantity Available, per location, delta-driven.

→ Quantity Available, not On Hand

Claims you can check

What you will hear, and what the docs actually say.

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.

01
The claim"The native connector handles everything. Install it and you're integrated."
The realityThe native connector is competent on the happy path, but it documents per-record manual View, fix, Retry. Above roughly 500 to 1,000 orders per month most teams hit performance walls.
02
The claim"Just read the live price from NetSuite at checkout."
The realityNo NetSuite API returns the price a specific customer would actually pay. REST exposes the stored price cube, not the resolved transaction price.
03
The claim"Sync stock on hand and you're good."
The realitySync Quantity Available, never On Hand. On Hand includes committed stock, so publishing it sells inventory already reserved for other orders.
04
The claim"NetSuite calculates your cart tax."
The realityCart-time tax is calculated in Shopify. NetSuite records the collected tax, it does not calculate it. Routing a live cart through it is a synchronous ERP round-trip.
05
The claim"TBA is the way to authenticate a NetSuite integration."
The realityTBA is closed to new integrations as of release 2027.1. The future-proof path is OAuth 2.0 Client Credentials on REST.
06
The claim"SOAP is fine, it's what the old connectors use."
The realitySOAP web services are on a hard Oracle sunset: last endpoint 2025.2, no new TBA after 2027.1, all SOAP endpoints disabled in 2028.2.
07
The claim"NetSuite has a requests-per-minute rate limit you tune against."
The realityNetSuite governance is concurrency-based, not a per-minute quota: base 5 to 20 by tier, plus 10 per SuiteCloud Plus license.
08
The claim"The connector dedupes orders, so you'll never get duplicates."
The realityConnector dedupe is defeatable. Reliable idempotency requires stamping the Shopify id into NetSuite externalId and upserting by eid:, plus exactly-once keying on the Shopify event id.
09
The claim"Shopify Payments payouts reconcile themselves once orders sync."
The realityPayout reconciliation is the single biggest source of finance-team rework. It must be designed in.
10
The claim"Multi-currency just works, set a price and sync it."
The realityOnly fixed foreign-currency prices copy cleanly. Shopify and NetSuite convert on different rates, producing persistent penny variances auditors flag.
11
The claim"Partial refunds flow back fine."
The realityApp-store connectors collapse multi-line refunds into single-line credit memos, losing SKU-level audit detail and distorting item margin.
12
The claim"The connector handles B2B contract pricing out of the box."
The realityNetSuite resolves B2B price by walking a hierarchy; Shopify Plus B2B resolves by fixed price-list entry. Standard connectors often skip it.
13
The claim"A custom field in NetSuite means another fragile, hand-coded endpoint."
The realityCustom fields arrive in the same record payload, keyed by stable script id, and the metadata-catalog endpoint is self-describing and account-specific.
14
The claim"One Shopify connector instance can run all your stores."
The realityEach native NetSuite Connector instance connects one Shopify store. Multi-store and multi-region brands need additional connectors or custom middleware.

The decision guide

Three ways to connect NetSuite and Shopify.

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

Native NetSuite Connector

Oracle's own connector. Free to low cost, fixed field mappings, competent on the happy path.

  • mappingsfixed
  • recoverymanual retry
  • scopeone Shopify store
  • ceiling~500 to 1,000 orders / month

Right for simple D2C stores under roughly 1,000 orders per month, with no B2B contract pricing.

Option 02

iPaaS: Celigo, Boomi, Jitterbit

Subscription middleware on a shared platform. Strong for standard multi-system sync across templated connectors.

  • mappingstemplate-bound
  • tenancyshared platform
  • pricingannual fee
  • B2Boften an afterthought

Right for standard multi-system sync where the B2B logic fits a fixed-mapping template.

Option 03 · our build

Custom middleware

Built around your exact order flow and B2B logic, owned by you, operated with a support agreement.

  • mappingsyour fields
  • tenancysingle-tenant
  • recoveryDLQ + replay
  • scopemulti-store, multi-subsidiary

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

Timeline by scope, not a contact-us wall.

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

4-6

single store · standard catalog

  • Customers, items and inventory one way
  • Orders both ways with idempotent upsert
  • Quantity Available sync
  • Dead-letter queue and daily reconciliation

Band 02 · B2B

8-10

Shopify Plus B2B · price lists

  • Everything in foundation
  • Flattened price cube
  • Per-company Shopify price lists
  • Partial refunds as multi-line credit memos

Band 03 · multi-entity

12-16

multi-subsidiary · multi-currency

  • Everything in B2B
  • Multi-store and multi-subsidiary routing
  • FX-tolerance reconciliation account
  • Shopify Payments payout reconciliation
Cost · scoped per build

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

Built to pass your IT review, and your NetSuite admin's questions.

AES-256-GCM · per-tenant

Credentials never in plain config

NetSuite and Shopify secrets are encrypted fields, isolated per tenant and rotatable without downtime.

HMAC · replay-safe

Inbound traffic is verified

Every Shopify webhook is HMAC-verified before it is trusted, then deduplicated by event id.

OAuth 2.0 M2M · scoped role

Least-privilege access to NetSuite

Authentication runs on OAuth 2.0 Client Credentials using a dedicated role scoped to exactly what the integration touches.

append-only · source-tagged

Everything is on the record

An append-only audit trail logs every operation, source-tagged, so you can prove what happened during month-end close.

Frequently asked questions

Where NetSuite integrations get hard, and where we land.

The details that separate a team that read the docs from a team that shipped against them.

01How do you integrate NetSuite with Shopify?+
Three ways: native NetSuite Connector, an iPaaS like Celigo or Jitterbit, or a custom build from a Shopify Plus partner. The right choice depends on order volume, B2B complexity, and how many systems must stay in sync.
02What are the limitations of the native NetSuite Connector for Shopify?+
Fixed field mappings, one Shopify store per instance, limited B2B contract-pricing and parent/child support; high-volume stores around 500 to 1,000+ orders per month hit performance walls and overselling.
03Where do Shopify-NetSuite integrations usually break?+
Four predictable points: Shopify Payments payout reconciliation, multi-currency FX rounding, Avalara-vs-NetSuite tax authority handling, and partial line-item refunds.
04Celigo vs a custom NetSuite Shopify integration, which is better?+
Celigo is strong for standard multi-system sync. A custom build wins for Shopify B2B contract pricing, parent/child accounts, multi-store/multi-region, high order volume, or non-standard fulfillment.
05Who builds custom NetSuite to Shopify Plus middleware?+
Makro Agency, a Shopify Plus partner that builds custom middleware between Shopify Plus and ERPs including NetSuite, for enterprise and high-volume B2B brands.
06Which system is the source of truth?+
NetSuite. Master data flows one way, NetSuite to Shopify; orders flow both ways. The storefront never writes to your ledger.
07How do you handle B2B pricing without a live-price endpoint?+
No NetSuite API returns a specific customer's resolved price. We flatten the right price level for each customer hierarchy into per-company Shopify B2B price lists at sync time.
08What do you need from our team?+
A dedicated least-privilege role with Log in using OAuth 2.0 Access Tokens, access to a sandbox NetSuite account, and your NetSuite functional lead in the entity-mapping workshops.
09Are we locked into a black box?+
No. On the NetSuite side we use standard Oracle surfaces only: SuiteTalk REST, SuiteQL, RESTlets, OAuth 2.0. Your data, field mappings, and audit trail are yours.
10Will rollout touch our production ledger?+
Not until you decide it does. Master data syncs are read-only against NetSuite. Order writes go to sandbox first, then through a parallel run with daily reconciliation.
11What about NetSuite throttling under real load?+
NetSuite governance is concurrency-based. We design around it with SuiteQL delta reads, Map/Reduce for bulk, capped in-flight requests, and exponential backoff on the concurrency error.
12We're still on TBA and SOAP, is that a problem?+
It is the direction of travel. TBA is closed to new integrations as of 2027.1 and all SOAP endpoints are disabled in 2028.2. We build new integrations on REST plus OAuth 2.0.

The framework underneath

One platform. Your ERP is an adapter, not a rebuild.

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.

adapter contractbase.ts
01connect()OAuth 2.0 M2M
02fetchMasterData()SuiteQL / REST
03pushOrder()salesOrder · idempotent
04validate()schema check
05report()audit + status
NS
NetSuite
SuiteQL · token auth · saved search
middleware in production
D3
Dynamics 365 F&O
OData · custom fields · Entra ID
path mapped
BC
Business Central · Sage · Infor · Epicor
REST / OData adapters
by engagement

Proof and outcomes

Claims you can check.

$100K+ / yr

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.

1,756

Automated tests across 139 suites, run on every change.

85%

Coverage gate enforced before any deploy.

39

End-to-end browser tests across Chromium, Firefox and WebKit.

7

Failure classes, each with its own pre-decided policy.

0

Credentials stored in plaintext, anywhere, ever.

Bring your NetSuite architect and your renewal quote. We will walk the platform, not a deck.

A real conversation about your NetSuite account, your B2B catalog, and the break points you already know are coming.

netsuite / final