See all services Shopify Plus Partner

Integration · Makro Middleware

Infor M3 Shopify Plus

Your ERP stays the system of record. Shopify Plus becomes where the order gets placed.

Live sync feed prod · northbridge
Infor M3 → Shopify · one wayOrders ↕ both ways

The real problem

M3 runs the business. The store runs the customer. The work is the space between.

01 / backbone

Infor M3 is the ledger

Finance, warehouse inventory, agreement pricing, order management. The authoritative record the distribution, manufacturing or fashion business is run on.

02 / front door

Shopify is self-serve

Where B2B dealers and wholesale 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 positionWe built a product around that exact gap. Infor M3 plugs into it as a first-class, path-mapped adapter.

Speaking M3's language: ION, BODs, API Gateway and the Event Hub

One direction for master data. Both directions for orders.

Products, images, attributes, pricing and availability are read out of Infor M3 and pushed to Shopify. The storefront never writes to the ledger. Orders, returns, shipments and fulfillment status are the only thing that travels both ways. M3 stays the system of record for catalog and stock; Shopify owns the order capture.

System of record
Infor M3
read · never overwritten
master data →
← order status
The platform
Makro Middleware.
map · reconcile · audit
master data →
← orders
The storefront
Shopify Plus B2B
where buyers self-serve
Master data: Infor M3 → Shopify, one way Orders: Shopify → Infor M3, status returns
ION API GatewayM3 does not integrate point to point. In CloudSuite, everything goes through the Infor OS API Gateway, the cloud entry point at /M3/m3api-rest/execute. It fronts the surface and enforces governance.handshake
MI programs · m3api-restSynchronous writes and lookups across roughly 6,000 transactions. MI uses a strict verb convention, Get / Lst / Add / Chg / Del, for items, customers, orders, prices and warehouse balances.M3 ⇄ MK
M3 Event HubM3 announces a change instead of being polled. Ordered before and after change events are pushed, so the platform picks updates up as they happen, with delta reads as the fallback.M3 → MK
ION BOD flowsGuaranteed-delivery master-data sync as OAGIS Business Object Documents. Items via SyncItemMaster, customers, shipments via ProcessShipment / SyncShipment.M3 → MK
Data Lake · CompassBulk catalog and price reads that don't burn the API quota. Heavy initial loads pull from Data Lake so per-record gateway calls never throttle the storefront.M3 → MK
OAuth 2.0 · IONMachine-to-machine auth on a dedicated service account. The gateway resolves a service account via a per-tenant .ionapi file; M3 never sees a password from our code.handshake
OIS100MI · batch orderOrders captured in Shopify are written into M3, status flows back. A webhook is HMAC-verified, deduplicated, transformed, and submitted once via AddBatchHead → AddBatchLine → Confirm.Shopify ↕ M3

The decision guide

The three ways to connect Infor M3 and Shopify, and when each fits.

Buyers have three paths: the official Infor eCommerce Connector (free, M3 CE, daily-bulk), a third-party iPaaS like Commercient SYNC, Alumio, Netgains or DCKAP, or a custom integration built on M3's ION / BOD layer and Shopify's Admin API. Each trades control and real-time accuracy against speed to stand up.

Option 01

Infor eCommerce Connector

Infor's own free connector, BOD-based, targeting M3 CE. Basic B2C for standard products from stock, the buyer's default.

  • cadencedaily bulk jobs, not real time
  • ordersonly newly created, header level
  • customersdoes not sync customer data
  • recoverya dashboard retry button

Right for a simple M3-CE B2C store on standard, in-stock items with no contract pricing.

Option 02

iPaaS (Commercient, Alumio, DCKAP)

Subscription middleware on a shared platform. Strong for standard managed sync across templated connectors.

  • mappingsconfigurable, template-bound
  • tenancyshared platform, row filtering
  • pricingannual fee, grows with volume
  • B2Bagreement pricing often an afterthought

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

Option 03 our build

Custom middleware

Built on M3's ION / BOD layer and Shopify's Admin API, around your exact order flow and agreement pricing. Owned by you, operated with a support agreement. Where M3 shops end up.

  • mappingsyour fields, per-company price lists
  • tenancysingle-tenant, isolated per client
  • recovery7 failure classes, DLQ, replay
  • scopeconfigurable, style-SKU, multi-warehouse

Right for Shopify Plus B2B contract pricing, configurable or style-SKU items, real-time multi-warehouse inventory, or a large industrial catalog that outgrows the basic connector.

The limits no vendor page admits

Where the standard M3 connector stops.

The free Infor eCommerce Connector is a starter integration for simple M3-CE stores. It handles the happy path and skips the failure modes that define real distribution, manufacturing and fashion catalogs. A custom middleware layer is built to handle every one of them, explicitly.

B2C only, paid in full at order entry

core gap

The standard connector is B2C and assumes paid-in-full at order entry. It does not sync customer data, so customer-group and contract-pricing-by-customer flows fall outside its reach entirely. No credit terms, no dealer accounts.

→ map each Shopify company to an M3 CUNO

No promotions, discounts, rebates or charges

8/10 severity

A flat price-list export misses the real price. M3 prices by search sequence: item base, price list, blanket agreement, promotion, discount model. Agreements and promotions outrank standard price lists, so the exported number is wrong at the second unit.

→ live-resolve OIS320MI.GetPriceLine at cart

"Normal" items only

8/10 severity

The standard integration is explicitly normal items only: no styles and SKUs, no configurable, no attribute-controlled, no core items. A known gap for fashion and apparel and for distribution, where one Shopify product with variants can map to multiple M3 ITNOs.

→ load-bearing SKU ↔ ITNO join, mapped at sync time

Daily bulk, not real-time inventory

days to surface

Inventory and pricing sync as daily bulk jobs, not continuously. Because Shopify commits at a specific warehouse location at checkout, a daily push on a high-velocity catalog is exactly where overselling happens between syncs.

→ event-driven via the Event Hub, per-warehouse available

Header-level order detail only

7/10 severity

The connector carries only newly created Shopify orders and only at header level. Line-level detail, returns, multi-warehouse splits and the full order journey are not modeled. You cannot reconcile what you never captured.

→ full line-level orders, returns and shipments both ways

No durable error recovery

silent failures

ION retries only connection-class failures. A business-logic rejection emits a Confirm BOD and stops, with no documented replay queue, dead-letter store or reconciliation. The connector's entire error story is a dashboard retry button. Basic tools fail silently.

→ dead-letter queue, per-order tracing, standing reconciliation

Claims you can check

Custom middleware vs the official connector vs iPaaS, what the docs actually say.

Every reality below is verified against a primary Infor 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"Just install the free Infor eCommerce Connector and you're integrated."
The realityThe free Infor eCommerce Connector is real and BOD-based, but it is a basic B2C integration for standard products from stock. Inventory and pricing run as daily bulk jobs, not real-time, it syncs only newly created Shopify orders, it does not sync customer data, and its entire error story is a dashboard retry button. A starter connector for simple M3-CE stores, not a fit for the complex M3 shops that are complex by definition.
02
The claim"M3 has a normal API, just point Shopify at it."
The realityM3 does not integrate point to point. In CloudSuite everything goes through the Infor OS / ION API Gateway with OAuth 2.0, fronting roughly 6,000 MI transactions, with change events as BODs over ION. A correct build is a blend of MI REST for writes and lookups, the Event Hub for change push, ION BOD flows for master data, and Data Lake for bulk reads.
03
The claim"M3 has a requests-per-minute rate limit you just tune against."
The realityThe real ceiling is two-sided governance, not one number. The ION API Gateway enforces a configurable per-endpoint quota (documented example 1,000 req / 60s), a default request timeout of 1 minute, extendable to a max of 5, and a 10 MB buffered-payload cap. A naive per-order or per-product synchronous sync blows the throttle: design for batching, the Event Hub, and bulk reads from Data Lake.
04
The claim"Inject the Shopify order straight into M3 and you're done."
The realityYou cannot direct-write an M3 order. External orders land as temporary batch orders (OIS275) via OIS100MI AddBatchHead → AddBatchLine → Confirm, and only earn a real order number (ORNO) after async validation. Build for eventual consistency and status-code handling. The real scaling ceiling is M3's batch-job queue (MNS300 Max active jobs), not an HTTP rate cap.
05
The claim"The connector dedupes orders, so you'll never get duplicates."
The realityM3 has no native upsert and no automatic dedupe. The MI layer is verb-explicit: Add creates, Chg changes. Idempotency must be engineered in the middleware: stamp the Shopify reference into CUOR / YREF, read before write, and hold the Shopify-order ↔ ORNO map yourself, because the final ORNO doesn't exist at submit time and a naive retry creates a duplicate order.
06
The claim"Sync stock on hand and you're good."
The realityPush per-warehouse available, never raw on hand. M3 is warehouse-native (WHLO); read the available figure M3 returns via MMS200MI/GetItmWhsBal, don't recompute it. Map M3 allocated → Shopify committed, M3 on-hand → Shopify on_hand, and let Shopify derive its own available. Locking the warehouse ↔ Shopify-location map is the number-one oversell prevention.
07
The claim"Read the live price from M3, or just export a price list once."
The realityA flat price-list export misses the real price. M3 prices by search sequence (item base → price list → blanket agreement → promotion → discount model), and contract agreements (OIS060) and promotions (OIS840) outrank standard price lists. Resolve, don't replicate: OIS320MI.GetPriceLine returns the fully resolved customer net price (NETP). Bulk-seed the catalog, then live-resolve the true B2B price at cart.
08
The claim"The connector handles B2B contract pricing and accounts out of the box."
The realityThe free connector is B2C, paid-in-full, and does not sync customer data, so customer-group and contract-pricing-by-customer flows are out of its reach. B2B done right maps each Shopify company to an M3 customer (CUNO) so agreements and promotions resolve, and M3 customer price lists map to Shopify Plus B2B catalog price lists with M3 as the single source of truth.
09
The claim"M3 can calculate your cart tax."
The realityM3 calculates tax at customer invoicing, not at order entry. The only order-time hook (OIS100MI GetHead / GetOrderValue behind "Include tax in MI") is a synchronous round-trip on a roughly 30-second-timeout path. Calculate cart tax in Shopify (native, or the same Avalara or Vertex engine M3 uses via CRS794) and let M3's invoice tax be the financial record.
10
The claim"Configurable, style-SKU and attribute-controlled items will sync."
The realityThe standard integration is normal items only: explicitly no styles and SKUs, configurable, attribute-controlled or core items, a known gap for fashion and distribution. In M3, one Shopify product with variants can map to multiple ITNOs, so the SKU ↔ ITNO join is load-bearing, not product ↔ item. Mapping matrix and fashion items correctly is custom work, exactly the kind the basic connector skips.
11
The claim"ION just retries until it succeeds, failures self-heal."
The realityION retries only connection-class failures (401 / 500 / 503 / 504). A business-logic rejection (bad item number, closed period, duplicate order, mapping mismatch) is treated as a configuration error: ION emits a Confirm BOD and stops. There is no documented per-message replay queue, retry interval, or dead-letter store. Whoever owns the integration owns catching, parking and idempotently reprocessing those messages.
12
The claim"It's the official native, certified Shopify ERP app, so it fits."
The realityNative and certified (the Shopify Global ERP Program, with Infor a launch partner) is a trust and listing signal: Shopify certifies the Shopify-side app, not the M3-side data model your team spent years customizing. Certification is no guarantee the app fits a given estate's customizations, BOD mappings or volume profile. And disambiguate: Infor's SX.e eCommerce Connector is a different ERP, same branding, different product.

How we build it: architecture, monitoring, error handling, ownership

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 / northbridge-industrial / 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 · rate-limit
Needs review
1
permanent
Resolved / 24h
41
38 auto · 3 manual
Dead Letter Queuenothing is dropped in silence
TimeEntityError classAttemptsNextAction
08:13:04order · ORNO not yet earnedPERMANENT · validation3 / 3heldInspect
07:55:22customer · CUNO-00910TRANSIENT · timeout2 / 509:50Retry now
06:40:11item · ITNO-44120RATE_LIMIT1 / 5pacedInspect
Sync volume7-day · records
Circuit breakersper endpoint
M3 · ION API Gatewaylast trip · never
closed
Shopify · Admin APIlast trip · 3d ago
closed
Avalara · AvaTaxlast trip · never
closed
Uptime · 90 dayserror rate 0.03%
customer · Northbridge Westentity_key_map
M3 CUNOCUNO-004182
canonical8f2a-c1d9-4e07-44b0
shopify gidgid://shopify/Company/61…
checksuma91f… unchanged
versionv17
→ decision: SKIP · already in sync

Every record carries three identities at once: its M3 id, a canonical id, and its Shopify gid. The middleware reads this row before every write and decides create, update, or skip.

M3 has no native upsert and no automatic dedupe, so the platform owns identity. The Shopify-order to ORNO map is held here too, because the final order number doesn't exist at submit time. 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
Data Lake · 48,210 records
Workflowstenant · northbridge
Item master syncMMS200MI · SyncItemMaster BODevery 15 min 09:38 · 142 ITNOsnext 09:53Run now
Inventory levelsMMS200MI/GetItmWhsBalEvent Hub + 5 min 09:41 · 3 WHLOnext 09:46Run now
Price resolutionOIS320MI · agreementslive at cart 09:00 · 1,204 NETPon demandRun now
Customers & companiesCRS610MI · CUNO deltaevery 15 min 09:40 · 6 recordsnext 09:55Run now
Order status returnM3 status 33/66/77/99every 5 min 09:42 · 11 ordersnext 09:47Run now
Full catalog batchData Lake bulk readnightly · 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…
companyNorthbridge West
line 1ITNO-99320 × 12
line 2ITNO-44120 × 4
total$8,420.00
M3 customer orderORNO-77231
ORNO77231
CUNOCUNO-004182
line 199320 · qty 12
line 244120 · qty 4
statusconfirmed · 25
Order journey#1042 → ORNO-77231 · batch order to confirmed
09:42:04webhook received 09:42:04HMAC ✓ · dedup ✓ 09:42:05AddBatchHead / Line 09:42:06OIS275 batch order 09:42:09Confirm → ORNO-77231 09:42:09status → Shopify
drag, scroll, or use the tabs

Inside the platform

Feature by feature.

Ten engineered subsystems, built on TypeScript and single-tenant. The same machine behind every adapter, the parts list your architect can verify.

01 / 10

When a record fails

Integrations are judged by how they fail. Follow one failed M3 order.

ION retries only connection-class errors. A business-logic rejection emits a Confirm BOD and stops. The dead-letter and replay lane below is exactly the gap Makro owns. Color carries the verdict: amber is sorted, teal retries, red is held, green replays.

01

It arrives

An M3 order write is rejected, a closed period or a bad item number. Instead of a Confirm BOD that stops in silence, it enters the pipeline.

captured
02

It gets classified

Every failure is sorted before anything is retried, so a bad record never loops forever and never creates a duplicate order.

transientrate-limitpermanent
classified
03

Transient retries

Connection-class and gateway-throttle failures retry with backoff and pacing, automatically, respecting the per-endpoint quota until they clear.

retrying
04

Permanent is held

A business-logic rejection routes straight to the dead-letter queue for review, with full context. It is never retried blindly or lost.

held
05

You replay it

Fix the cause, replay from the queue, idempotent on the held ORNO map. A daily reconciliation pass catches anything the live path missed.

replayed · reconciled

How long it takes

Timeline by scope, not a log-a-ticket wall.

An Infor M3 ⇄ Shopify Plus build lands in one of three bands depending on B2B complexity, the number of warehouses and legal entities, and how many of the limits above are in play.

Band 01 · foundation
basic catalog
single store · standard catalog · inventory · orders
  • Items, images and inventory one way, Infor M3 to Shopify
  • Orders both ways via OIS100MI batch with idempotent ORNO mapping
  • Per-warehouse available-to-sell sync and overselling prevention
  • Dead-letter queue, daily reconciliation, the console
Band 02 · standard
+ returns & warehouses
multi-warehouse · returns · multi-store
  • Everything in foundation, plus returns and shipment status both ways
  • Multi-warehouse WHLO to Shopify-location mapping, event-driven
  • Multi-store routing on a single M3 system of record
  • Avalara or Vertex tax handoff at the Shopify edge
Band 03 · full B2B
+ configurable & pricing
B2B · configurable / style-SKU · complex pricing
  • Everything in standard, plus live agreement and promotion pricing
  • Per-company Shopify Plus B2B catalog price lists from M3 CUNO
  • Configurable, attribute-controlled and style-SKU products via the SKU ↔ ITNO join
  • XtendM3 and CUGEX custom fields joined through the mapping engine
Cost · scoped per build

We price an Infor M3 integration as an engineering engagement: a build with a support agreement, not a per-record meter or a platform seat that renews forever. For market context, integration guides put a simple orders-and-inventory build at a few weeks and a complex multi-workflow build at several months, and enterprise iPaaS commonly runs into five and six figures a year. Your exact figure is scoped to the band and the limits in play, and we put it in writing before anything starts.

Security posture

Built to pass your IT review, and your Infor partner's questions.

Credentials never in plain config

The per-tenant .ionapi file and Shopify secrets are held as encrypted fields, isolated per tenant and rotatable without downtime. Nothing sits in plaintext, anywhere.

AES-256-GCM · per-tenant

Inbound traffic is verified

Every Shopify webhook is HMAC-verified before it is trusted, then deduplicated by event id, so a replayed webhook cannot create a second order.

HMAC · replay-safe

Least-privilege access to M3

OAuth 2.0 Resource Owner with a dedicated service account through the ION API Gateway, and at M3 a narrow MNS150 role with MNS090 API Security = 2, so unlisted transactions default to denied. The GRID-RunAsM3User role, never an admin login.

OAuth 2.0 · MNS090 = 2 · GRID-RunAsM3User

Everything is on the record

An append-only audit trail logs every operation, source-tagged. Every M3 call is auditable (SES510) and revocable, so you can prove what happened during month-end close.

append-only · source-tagged

Frequently asked questions

Where M3 integrations get hard, and where we land.

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

01How do you integrate Infor M3 with Shopify?+
Infor M3 connects to Shopify through Infor ION and the Infor OS API Gateway, which exchange data as BODs: product, inventory and pricing flow from M3 to Shopify, and orders and returns flow from Shopify back to M3. There are three paths, the free official Infor eCommerce Connector (M3 CE, daily-bulk sync), a third-party iPaaS like Commercient or Alumio, or a custom integration built on M3's ION/BOD layer and Shopify's Admin API for real-time control.
02Does Infor M3 have an API for Shopify integration?+
M3 does not integrate point-to-point; it integrates through Infor ION and the Infor OS API Gateway. You authenticate a service account with OAuth 2.0, call M3's MI programs over m3api-rest, and use the Event Hub and ION BOD flows for change-driven sync. ION + API Gateway is the integration surface, not a direct REST resource model.
03Is the free Infor eCommerce Connector good enough?+
For a simple M3 CE store it can work, but it has real limits: inventory and pricing sync as daily bulk jobs (not real time), only newly created Shopify orders sync into the ERP, and it does not sync customer data. Fast-moving SKUs can oversell between daily syncs, and B2B customer-group or contract-pricing flows fall outside its scope, which is when a built integration is worth it.
04What's the difference between the free Infor connector and a custom integration?+
The free Infor eCommerce Connector is a configuration product on daily-bulk sync that you operate yourself through ION; a custom integration gives you real-time accuracy, customer/B2B-pricing flows, and a data model you own. "Free app" is not "free integration", you still run ION, the API Gateway, and the BOD flows either way.
05How does inventory sync work between Infor M3 and Shopify?+
Done correctly it is event-driven and prevents overselling, M3 is the system of record, and the integration publishes accurate per-warehouse available-to-sell quantities to the mapped Shopify location rather than a stale on-hand count. The free connector pushes inventory from M3 only as daily bulk jobs, so high-velocity catalogs usually need a more frequent or event-driven sync.
06Can Infor M3 drive Shopify Plus B2B pricing?+
Yes. M3 resolves a customer's net price through OIS320MI.GetPriceLine, honoring blanket agreements and promotions that outrank standard price lists, and M3 customer price lists map to Shopify Plus B2B catalog price lists so dealer and wholesale accounts see correct contract pricing with M3 as the single source of truth. This is outside the free connector's scope because it does not sync customer data.
07Will this work with on-premise Infor M3 or only M3 CE?+
The official Infor eCommerce Connector targets Infor M3 CE (CloudSuite). On-premise or older M3 environments can still integrate with Shopify, but through a different integration surface, so the M3 deployment (CE vs on-prem) must be confirmed before scoping.
08Can you handle a large industrial catalog from M3 in Shopify?+
Yes, Makro has mapped a 12,000-SKU Infor M3 catalog into Shopify using custom single-tenant middleware that writes M3 product data into Shopify metaobjects, keeping the storefront fast while M3 stays authoritative (Distribution Wire & Cable, 2026). The data model and BOD mapping are designed before any endpoint is wired, because at industrial SKU counts that is where these projects succeed or fail.

The framework underneath

A proven platform. Infor M3 is the next first-class adapter.

Every ERP sits behind the same contract: authenticate, fetch master data, push orders, validate, report. NetSuite runs in production today. Infor M3 is a registered target on that same framework, its path fully mapped to the ION API Gateway, MI programs, the Event Hub and ION BODs, with the M3 mechanics understood end to end.

We say this plainly: the credibility is a real platform and a precisely understood M3 path, proven by mapping a 12,000-SKU M3 catalog into Shopify metaobjects, not a decade of M3 production traffic. That distinction is exactly what your architect can verify, which is why we lead with it. The rest of the registry is an interface away.

adapter contractbase.ts
01authenticate()OAuth 2.0 / ION
02fetchMasterData()MI / BOD / Data Lake
03pushOrder()OIS100MI batch
04validate()schema check
05report()audit + status
NS
NetSuite
SuiteQL · token auth
middleware in production
M3
Infor M3
ION API · M3 · CloudSuite
path mapped

Proof, outcomes, Shopify Plus Partner credibility

Claims you can check.

Lead with the one real Infor M3 proof, then the platform numbers your architect can verify on any adapter.

Distribution Wire & Cable · Infor M3 → Shopify · 2026

Makro built custom single-tenant middleware that maps Infor M3 catalog data into Shopify metaobjects, powering a 12,000-SKU B2B storefront while keeping M3 authoritative as the system of record. The data model and BOD mapping were designed before any endpoint was wired. This is the proven M3 path, the same platform that runs NetSuite in production with the M3 mechanics fully mapped.

Clarius · NetSuite + Salesforce + Shopify Plus

We built a unified account page integrating Clarius' NetSuite ERP, Salesforce CRM and Shopify Plus into one view, and with Shopify Flow automation feeding order data into NetSuite, eliminated manual order entry and reduced operational costs by over $100,000 a year. Platform credibility for shipping enterprise ERP to Shopify integrations at outcome scale.

Test suite
1,756
Automated tests across 139 suites, run on every change. Counted in the repository, not rounded for the slide. No code reaches your production data without passing them.
85%
Coverage gate enforced before any deploy
7
Failure classes, each with its own pre-decided policy
39
End-to-end browser tests, Chromium, Firefox, WebKit
0
Credentials stored in plaintext, anywhere, ever

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

A real conversation about your M3 deployment, CE or on-prem, your data, and the three sharp questions you already have.