makro.×

Enterprise middleware, purpose-built for Shopify. Not rented by the year.

We build and run the integration layer between enterprise ERPs and Shopify Plus. Deployed single-tenant for each client, watchable in production, and priced as a build, not a subscription that renews forever.

Makro.Integration · in production since 2014 · 23 enterprise integrations · 1,756 automated tests

console.makro · atlas-building / sync live
Records / 24h
48,210
across 9 entities
Avg latency
1.2s
event → Shopify
Drift
0
at last reconcile
Activitylive · last 60s
single-tenant · Atlas Building Supply90-day uptime 99.97%

What you actually get

Your deployment ships with both. The console you operate, and the docs you operate from.

One surface, switch between the two. The admin UI your team watches in production, and the documentation your engineers and ours work from.

console.makro.agency / atlas-building / 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 · #SO-10288PERMANENT · validation3 / 3heldInspect
07:55:22company · CUST-00910TRANSIENT · timeout2 / 509:50Retry now
06:40:11product · ITEM-44120RATE_LIMIT1 / 5pacedInspect
Sync volume7-day · records
Circuit breakersper endpoint
NetSuite · SuiteQLlast trip · never
closed
Shopify · Admin APIlast trip · 3d ago
closed
AvaTaxlast trip · never
closed
Uptime · 90 dayserror rate 0.03%
company · Atlas Westentity_key_map
erp idCUST-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. The middleware reads this row before every write and decides create, update, or skip.

Sync a record twice and it updates. Delete and recreate it in one system, and the mapping still holds in the other. 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
bulk · 48,210 records
Workflowstenant · atlas-building
Product delta syncSuiteQL · watermarkedevery 15 min 09:38 · 142 recordsnext 09:53Run now
Inventory levelslevel pushevery 5 min 09:41 · 3 SKUsnext 09:46Run now
Price listsprice levels · per companyhourly 09:00 · 1,204 rowsnext 10:00Run now
Companies & customersSuiteQL · deltaevery 15 min 09:40 · 6 recordsnext 09:55Run now
Order status returnERP → Shopifyevery 5 min 09:42 · 11 ordersnext 09:47Run now
Full catalog batchbulk export · nightlynightly · 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
line 1ITEM-99320 × 12
line 2ITEM-44120 × 4
total$8,420.00
NetSuite sales orderSO-77231
tranIdSO-77231
customerCUST-004182
line 199320 · qty 12
line 244120 · qty 4
statusconfirmed
Order journey#1042 → SO-77231 · 5s end to end
09:42:04webhook received 09:42:04HMAC ✓ · dedup ✓ 09:42:05transformed 09:42:06pushed to NetSuite 09:42:09SO-77231 confirmed 09:42:09status → Shopify
connected · single-tenant · us-east-1 data refreshed 09:45:12
docs.makro.agency / middleware
v4.2

The position

Every connector vendor sells you the same thing: a seat on their platform, invoiced annually, forever.

Rented iPaaSCeligo · Boomi · Patchworks class Generic sync enginetemplate connector apps oursMakro Middleware.owned integration platform
Built for Everything to everything, so purpose-built for nothing Whatever the template happens to support Enterprise ERP to Shopify Plus B2B. Only that.
Shopify B2B model Flattened into a generic schema on the way through Products and orders; B2B is an afterthought Native: companies, locations, catalogs, price lists, contacts
Tenancy Shared platform, row-level filtering Shared app in their cloud Single-tenant. Isolated deployment per client
When it breaks A ticket in their support queue A status page and a refresh button 7 failure classes, dead-letter queue, circuit breakers, the engineers who built it
Pricing model $30,000 to $100,000+ a year, plus per-record tiers, forever Monthly fee that grows with your volume Scoped build + support. No platform seat, no per-record meter
Year five still renting still renting still yours

What is actually in it

The machine, itemized.

Ten engineered subsystems, each one a thing a connector subscription either charges extra for or does not have. This is the parts list.

makro-middleware · parts plate11 data models · TypeScript · single-tenant01 / 10
MW-01 ×1

Sync orchestrator

schedules, sequences and checkpoints every job

MW-02 ×1

Entity key map

three identities per record: ERP id · canonical UUID · Shopify GID

MW-03 ×1

Field-mapping engine

10 transform types · per-tenant config · no code changes

MW-04 ×1

Error classifier

7 failure classes, each with its own retry strategy

MW-05 ×1

Dead-letter queue

failed records held, inspected, replayed · never lost

MW-06 ×n

Circuit breakers

per-endpoint · trips on downstream failure, heals itself

MW-07 ×1

Sync checkpoints

long jobs resume where they stopped, never restart

MW-08 ×1

Audit log

append-only · every operation, source-tagged

MW-09 daily

Reconciliation

compares both systems daily · catches what live sync missed

MW-10 ×erp

Adapter framework

one contract per ERP · new systems plug in, core untouched

The trace

The life of one order. 1.18 seconds, on the record.

A buyer places a B2B order on Shopify. This is the actual path it takes through the middleware, span by span, the way your team would see it when they ask what happened. Sample run shown.

trace #SO-10293 · order · Shopify → ERP total0.00s
shopify · webhook received
4ms
orders/create · POST
verify · HMAC signature
9ms
signature valid
verify · duplicate check
11ms
event id unseen · proceed
identify · entity key lookup
38ms
decision: CREATE
transform · field mapping
52ms
23 fields · 0 defaults used
write · ERP sales order
612ms
SO-88412 accepted
return · status to Shopify
228ms
order tagged · confirmed
audit · append to log
31ms
immutable · source-tagged
every span above is queryable in the audit trail idempotent: replay this webhook and the order writes once

change detection · checksums, not brute force

A 50,000-SKU catalog with 12 changes syncs 12 records. Cost scales with what changed, not what you sell.

SHA-256 checksum per record · watermarked delta reads · version vectors for conflicts

Reliability · one record's journey

Watch one record cross the system. Verified, retried on failure, paged, held, replayed clean. Nothing dropped in silence.

tested · deploy gate green 1,756 tests · 139 suites · 85% gate · 39 e2e · Chromium · Firefox · WebKit
Uptime · 90d
99.97%
err 0.03%
Latency
1.2s
event → Shopify
Throughput · 24h
48,210
9 entities
Drift · 04:00
0
reconciled row-by-row
live3 breakers
closed · self-heal
SOSO-44817 salesorder · NetSuite → Shopify
queued
Written
Verified
Retried
Paged
Held · DLQ
Replayed
Verified and written to Shopify. One record, full context, watched the whole way.
Record log 0 events
04:12Waiting for next record.
Live state
RecordSO-44817
Error classnone
Attempt0 / 5
Statusqueued
Exponential backoff cap 8s
1s
2s
4s
8s
7 error classes rate_limit · timeout · network · validation · permission · conflict · not_found
running · nothing dropped in silence

ERP coverage

One contract behind every ERP. Yours is on it.

Every ERP sits behind the same adapter contract: the sync engine, mapping layer, error handling and Shopify integration never change. What changes per system is only how we speak to it. Each card opens the live integration page for that system.

not listed? if it has an API, it fits the contract

Security posture

Built to pass your IT review. The datasheet version.

makro-middleware · security datasheetreviewed per deployment01 / 06
isolated per clientTenancySingle-tenant, fully isolated. Your deployment shares nothing with any other client. Not a shared database with row filtering: a separate environment.
AES-256-GCM · HKDFCredentialsERP and Shopify secrets encrypted with AES-256-GCM, keys derived per context via HKDF, rotatable without downtime. Never stored in plaintext.
HMAC · replay-safeInbound trafficEvery webhook is HMAC-verified before it is trusted, then deduplicated by event id, so a replayed webhook cannot create a second order.
OAuth 2.0 · scopedAccessLeast-privilege OAuth on scoped app registrations. The integration can touch exactly what it needs and nothing else.
append-onlyHistoryAn append-only audit trail records every sync, transformation and error. You can prove what happened during month-end close.
RTO 15m · RPO 5mRecoveryDefined recovery targets per tier, up to 15-minute RTO and 5-minute RPO on enterprise deployments.

The math

The subscription you never stop paying. Watch it run too.

A connector platform is not a purchase. It is a meter. The one below is set to a typical $40,000-a-year enterprise contract, accruing in real time while you read this page. This is what a connector bills, not Makro.

a connector's meter · not Makro What an iPaaS connector bills · since you opened this pageaccruing
$0.0000

That is the meter at $40,000 a year. It does not pause for the months nothing changes, and it resets to full price every renewal.

per day$109.59
per month$3,333
per year · every year$40,000
the same connector · five years Five-year horizon · cumulative
YR 1
$40,000
YR 2
$80,000
YR 3
$120,000
YR 4
$160,000
YR 5
$200,000
OURS
build + support
Paid out over five years, for a pipe you still do not own$200,000

Illustrative at list pricing. Enterprise iPaaS contracts commonly run $30,000 to $100,000+ a year; ERP-side commerce licensing can add $48,000 to $120,000 a year on top. Your actual quote is the number to bring to the session.

makro. The alternative

Makro Middleware is scoped and priced as an engineering engagement: a build with a support agreement. No per-record tiers, no per-connector fees, no platform seat.

The meter never starts.

Questions, answered

Asked by buyers. And by the AI they ask first.

The questions that come up in working sessions, answered the way we answer them there. Bring the rest to the session.

01How do you handle real-time inventory and pricing synchronization between our ERP and Shopify Plus?+
Inventory levels push on a near-real-time schedule and orders travel by HMAC-verified webhook, with watermarked delta reads every 15 minutes for products, companies and price lists. Change detection runs on per-record checksums, so a 50,000-SKU catalog with 12 changes syncs 12 records. The platform throttles itself before Shopify's rate limits do, and a daily reconciliation pass catches anything the live path missed.
02Do you use pre-built middleware or custom-coded APIs for each integration?+
Pre-built middleware. Makro Middleware is our own integration platform: sync orchestrator, entity key map, field-mapping engine, dead-letter queue, circuit breakers and audit log are already built and tested with 1,756 automated tests. Your ERP plugs in as an adapter behind a fixed contract. You are not paying us to code a one-off private app from zero, and you are not renting a seat on a shared iPaaS.
03Which ERPs does Makro Middleware connect to Shopify Plus?+
NetSuite, Sage, Microsoft Dynamics 365 Finance and Operations, Microsoft Dynamics 365 Business Central, Infor, and Epicor. NetSuite runs on the production adapter today; Dynamics 365 F&O has a fully mapped OData-first path. Any ERP with a usable API fits the same adapter contract.
04What does it cost compared to Celigo, Boomi, or Patchworks?+
Enterprise iPaaS connectors commonly list at $30,000 to $100,000+ a year, billed every year, with per-record and per-connector tiers. Makro Middleware is priced as an engineering engagement: a scoped build plus a support agreement. There is no platform seat, no per-record tier, and no renewal that resets to full price every twelve months.
05What data syncs between the ERP and Shopify Plus?+
Companies, company locations and contacts, products and variants, inventory levels, catalogs and price lists flow from the ERP to Shopify. Orders flow from Shopify into the ERP, and order status returns. Master data moves one way; the storefront never writes to your ledger.
06Does it support Shopify Plus B2B: company accounts, price lists, payment terms?+
Yes, natively. The platform speaks Shopify's B2B model directly: companies, company locations, contacts, catalogs and per-company price lists are first-class sync entities, not flattened afterthoughts. B2B is the use case the middleware was purpose-built for.
07What is middleware in an ERP-to-Shopify integration, and do we need it?+
Middleware is the layer that sits between your ERP and your storefront: it maps identities across both systems, transforms data shapes, retries failures, and keeps an audit trail. If you sync more than a trivial catalog, you need that layer; the only question is whether you rent it as a shared SaaS connector or run it as purpose-built infrastructure. We build the second kind.
08Single-tenant or multi-tenant: where does our data live?+
Every client deployment is single-tenant and fully isolated. Your data, configuration, sync jobs and audit history share nothing with any other client. This is not a shared database with row-level filtering. Credentials are encrypted with AES-256-GCM and never stored in plaintext.
09What happens when a sync fails?+
Every failure is classified into one of seven classes before anything is retried. Transient and network errors retry with exponential backoff; rate limits are paced proactively; validation, permission and not-found errors route straight to a dead-letter queue where they are held with full context, fixed once, and replayed with one action. Circuit breakers stop a degraded ERP or Shopify from cascading, and nothing is dropped in silence.
10Who owns the integration, and what happens if we part ways?+
Your deployment is yours: single-tenant infrastructure, your configuration, your mappings, your complete append-only audit history. Handover terms are written into the engagement, not negotiated on the way out. The thing we sell is the opposite of lock-in: that is the difference between this and a connector subscription.
11Can one middleware deployment serve multiple Shopify stores against one ERP?+
Yes. Each store carries its own configuration and field mappings inside one deployment, against one ERP connection. Multi-store and multi-entity setups, including international expansion stores, route through the same entity key map so a record keeps one identity everywhere.
12Does it work with headless Shopify builds?+
Yes. The middleware integrates at the API level, against Shopify's Admin API and webhooks, so it is storefront-agnostic: Liquid themes, Hydrogen, or any custom front end see the same synced data.

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

A real conversation about your ERP, your data shapes, and what the integration should cost when nobody is renting you a pipe.