See all services Shopify Plus Partner

Integration / Makro Middleware

Salesforce CRM to Shopify Plus, built to fit.

Salesforce CRM stays the system of record for the customer. Shopify Plus becomes where the order gets placed. We build custom Salesforce CRM ⇄ Shopify Plus middleware: two-way sync, dedup and identity resolution, B2B Commerce, real-time.

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

Which integration this is

Salesforce CRM, not Commerce Cloud.

"Salesforce" means two different products in commerce. This page is about integrating Salesforce CRM behind your Shopify Plus storefront. It is not about Salesforce Commerce Cloud, which is a rival storefront, not a CRM. Almost no vendor page says which one it means. We do, up front.

What this page integrates

Salesforce CRM

Sales Cloud, Service Cloud, and B2B Commerce on Core: the system that owns the customer, the account, the contract, and the pipeline. You keep Shopify Plus as the storefront and integrate Salesforce CRM behind it.

Sales / Service · B2B Commerce on Core · the CRM behind the store

What this page is not

Salesforce Commerce Cloud

SFCC, formerly Demandware, is a separate storefront platform that competes with Shopify. It is not a CRM. If a buyer is searching "Salesforce Shopify integration," they almost always mean CRM behind the storefront, not a replatform.

SFCC / Demandware · a storefront, not a CRM

The real problem

The CRM runs the customer. The store runs the order.

The work is the space between: accounts, contacts, contracts and pipeline on one side, B2B buyer self-serve on the other. Duplicate contacts, orders written twice, pricing that drifts, conflicting truth at month-end.

01 / system of record

Salesforce owns the customer

Accounts, contacts, contracts, pipeline. The authoritative record of who the customer is and what they are owed.

02 / front door

Shopify is self-serve

Where B2B buyers place repeat orders without a phone call, a rep, or an email to their account manager.

03 / the gap

The middle is where it breaks

Duplicate contacts. Customers fragmented across emails and guest checkouts. Orders that say "fulfilled" here and "in progress" there.

Our position

We built a product around that exact gap. Salesforce plugs into it as a first-class, path-mapped adapter. NetSuite is the one already running in production.

Architecture · what syncs and which way

One direction for master data. Both directions for orders.

Accounts, contacts, products and prices are read out of Salesforce and pushed to Shopify. The storefront never writes to your CRM of record. Orders are the only thing that travels both ways: placed in Shopify, recorded in Salesforce, status returned.

System of record

Salesforce CRM

read · never overwritten

The platform

Makro Middleware.

map · reconcile · audit

The storefront

Shopify Plus B2B

where buyers self-serve

Master data: Salesforce → Makro Middleware → Shopify, one way
Orders: Shopify → Salesforce, status returns
Pub/Sub API + CDCSalesforce announces a change instead of being polled. Change Data Capture streams over gRPC and Avro, events are retained 72 hours, and each carries a Replay ID for durable, resumable delivery.SF → MK
Bulk API 2.0Async CSV jobs for bulk and initial loads. Heavy catalog, account and contact backfills run as batches, not the per-record calls that would burn the daily allocation.SF → MK
Composite + RESTUp to 25 dependent subrequests with reference chaining, billed as one API call. Steady-state transactions run on REST and Composite; sObject Collections write 200 records per call.SF ⇄ MK
External ID upsertEvery write is idempotent: a custom External ID field plus PATCH /sobjects/{Object}/{extIdField}/{value}. Salesforce creates if absent, updates if present, so a re-delivered webhook is a no-op.handshake
OAuth 2.0 · External Client AppServer-to-server auth on JWT Bearer or Client Credentials, least-privilege scopes. No stored password, no browser step, no username-password flow that Salesforce is retiring.handshake
Order + OrderItemOrders captured in Shopify are written into Salesforce, status flows back. A webhook is HMAC-verified, deduplicated, transformed, and pushed once, with each OrderItem resolved to a PricebookEntry first.Shopify ↕ SF

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 / ridgeline-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 · 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 · #1042 → OrderPERMANENT · validation3 / 3heldInspect
07:55:22contact · 003Ab00910TRANSIENT · timeout2 / 509:50Retry now
06:40:11product · 01tAb44120REQUEST_LIMIT1 / 5pacedInspect
Sync volume7-day · records
Circuit breakersper endpoint
Salesforce · Pub/Sublast trip · never
closed
Shopify · Admin APIlast trip · 3d ago
closed
Salesforce · REST / Bulklast trip · never
closed
Uptime · 90 dayserror rate 0.03%
account · Ridgeline Westentity_key_map
salesforce id001Ab00004182
canonical8f2a-c1d9-4e07-44b0
shopify gidgid://shopify/Company/61…
external idShopify_Company_Id__c set
versionv17
→ decision: SKIP · already in sync

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

Stamp the stable Shopify id into a custom External ID field and upsert, and a re-delivered webhook updates instead of duplicating. This, plus Salesforce matching rules, is what stops the explosion of duplicate contacts before it reaches your CRM.

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
price books
Nightly batch
01:00
Bulk 2.0 · 48,210 records
Workflowstenant · ridgeline
Product delta syncCDC · Replay IDevent-driven 09:38 · 142 recordsstreamingRun now
Buyer price resolutionConnect REST pricingevery 15 min 09:41 · 18 companiesnext 09:56Run now
Price booksPricebook2 / Entryhourly 09:00 · 1,204 entriesnext 10:00Run now
Accounts & contactsCDC · deltaevent-driven 09:40 · 6 recordsstreamingRun now
Order status returnSalesforce → Shopifyevery 5 min 09:42 · 11 ordersnext 09:47Run now
Full catalog batchBulk API 2.0nightly · 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…
companyRidgeline West
line 1SKU-99320 × 12
line 2SKU-44120 × 4
total$8,420.00
Salesforce order801Ab77231
Order801Ab77231
Account001Ab04182
OrderItem 1PBE · qty 12
OrderItem 2PBE · qty 4
statusactivated
Order journey#1042 → 801Ab77231 · 5s end to end
09:42:04webhook received 09:42:04HMAC ✓ · dedup ✓ 09:42:05PricebookEntry resolved 09:42:06pushed to Salesforce 09:42:09Order activated 09:42:09status → Shopify
drag, scroll, or use the tabs

Inside the platform

Feature by feature.

Ten engineered subsystems, one shared platform. This is what the Salesforce adapter plugs into, the same machine that runs NetSuite in production today.

01 / 10

Real-time vs batch, and how we keep it reliable

Integrations are judged by how they fail. Follow one failed Salesforce write.

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 Salesforce or Shopify. Instead of disappearing into a log, it enters the pipeline.

captured
02

It gets classified

Every failure is sorted before anything is retried. A REQUEST_LIMIT_EXCEEDED 403 is paced, a validation error is held.

transientrate-limitpermanent
classified
03

Transient is paced

The 403 backs off and the layer paces against both limiters at once, the Salesforce daily allocation and the Shopify leaky bucket, until it clears.

retrying
04

Permanent is held

A validation failure, a Person-Account Name write or a missing PricebookEntry, routes straight to the dead-letter queue for review. Never retried blindly, never 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 Salesforce ⇄ Shopify connectors break.

Salesforce CRM ⇄ Shopify integrations break at the same predictable points. Point connectors and most iPaaS templates handle the happy path and skip these. A custom middleware layer is built to handle all of them, explicitly.

core failure

Duplicate Contacts & Accounts

Push Shopify customers in naively and you get an explosion of duplicate contacts: guest checkouts, the same person under multiple emails and regions, Shopify's transactional model against Salesforce's Account / Contact / Lead model. Safe sync is external-ID upsert plus DuplicateRule and matching rules and a canonical-ID map, designed up front, not last-writer-wins.

→ external-ID upsert + matching rules + canonical-ID map
8/10 severity

Conflicting data models · who owns the record

Shopify and Salesforce can hold conflicting truth at once: "fulfilled" in Shopify, "in progress" or "partially paid" in Salesforce. Last-writer-wins yields drift and conflicting reports. A reliable layer encodes a field-level system-of-record matrix instead: contract and price are Salesforce, fulfillment and capture are Shopify and the ERP.

→ field-level ownership matrix, not last-writer-wins
7/10 severity

Order-lifecycle mismatch

Salesforce Orders enforce a Draft to Activated lifecycle, and every OrderItem must resolve to a PricebookEntry in the right Pricebook2 before the line can be written. Split shipments, partial payments and offline edits do not map to a flat field copy. They need branching mapping logic a fixed connector does not carry.

→ Draft → Activated, PricebookEntry resolved per line
surfaces at peak

Dual API limiters

Two independent limiters drain at once. Salesforce governs by a daily request allocation and 25 concurrent long-running requests; over-limit returns a 403 REQUEST_LIMIT_EXCEEDED. Shopify governs by a leaky bucket, 1,000 points per second GraphQL on Plus. Flash sales and large backfills are where naive syncs break. The layer must read Shopify's cost and throttle status and pace itself.

→ pace on both, route bulk through Bulk API 2.0
core to Plus

B2B price-book blending

Salesforce blends multiple buyer-group price books by a configurable "lowest price" or "highest-priority book" strategy. Shopify B2B assigns a Company Location to exactly one catalog and does not blend N books at runtime. Standard connectors often skip this entirely. The middleware pre-resolves the effective buyer price and writes one value per company.

→ pre-resolve via Connect REST, one price per company
build-defining

The three contract-pricing engines

There are three different contract-pricing engines: native B2B Commerce price books, CPQ ContractedPrice (account-scoped, snapshot-at-quote, parent to child), and RLM ContractItemPrice. None of them automatically flow to the storefront, and which one the client runs dictates the entire build. You must find out which engine is in play before quoting.

→ identify the engine before anything is scoped

Claims you will hear, against the docs

Claim vs. reality.

Every reality below traces to a primary Salesforce or Shopify doc, or a named vendor source. Rows one through eight bust the common myths. The rest own the ground no vendor page admits.

01
The claim"Salesforce and Shopify are the same kind of thing, just connect the storefronts."
The realityTwo different "Salesforce" products get conflated. Salesforce CRM (Sales / Service Cloud + B2B Commerce on Core) is the customer, account and contract system you integrate with Shopify. Salesforce Commerce Cloud (SFCC / Demandware) is a rival storefront, not a CRM. A buyer searching "Salesforce Shopify integration" almost always means CRM behind the storefront. Almost no competitor says so.
02
The claim"Install the connector and you're integrated, it just syncs."
The realityPoint connectors (eShopSync, Sync Made Easy, CRM Perks) sync a fixed set of entities on a fixed mapping, often Contact-first not Account-first, with a fixed conflict policy and no model of the B2B contract layer. eShopSync's own docs note variant-to-product conversion "cannot be reversed without deleting all products," and multi-currency plus Salesforce to Shopify export are paid upgrades. In a three-system topology they become one more writer fighting for ownership of the same records.
03
The claim"Just push Shopify customers into Salesforce."
The realityPushed naively this produces an explosion of duplicate contacts. Shopify treats a customer as transactional, with anonymous guest checkouts and one person under multiple emails. Salesforce organizes the same human as an Account / Contact / Lead. Safe sync requires external-ID upsert plus DuplicateRule and matching rules and a canonical-ID map, designed up front, not last-writer-wins.
04
The claim"Authenticate it with a Salesforce username and password."
The realityThe OAuth username-password flow is deprecated and an External Client App excludes it outright. As of Spring '26, new Connected Apps can no longer be created: you build the integration as an External Client App, which is closed by default. Build on JWT Bearer (certificate-signed, no stored password) or Client Credentials (key, secret and a Run-As user), and design to Salesforce's May 2026 OAuth security controls (PKCE, refresh-token rotation, idle timeout, IP allowlist) from day one.
05
The claim"Salesforce has a simple requests-per-minute rate limit."
The realitySalesforce governs by a daily API request allocation (Enterprise about 100,000 plus 1,000 per Salesforce license; Unlimited and Performance plus 5,000) and a 25 concurrent long-running request cap in production. The ceiling scales with licenses, not order volume, so a busy storefront exhausts it through chatty per-record calls. Over-limit returns 403 REQUEST_LIMIT_EXCEEDED, a backpressure signal, not an error to retry blindly.
06
The claim"Poll Salesforce on a schedule to catch changes."
The realityPolling burns the daily call budget. The modern path is Change Data Capture over the Pub/Sub API (gRPC, HTTP-2, Apache Avro). Events are retained only 72 hours, each carries a Replay ID, and a subscriber that does not persist its replay position silently loses changes during a long outage and permanently loses anything older than 72 hours. Durable replay checkpointing is a hard requirement.
07
The claim"The connector dedupes orders, so you'll never get duplicates."
The realityIdempotency must be engineered, not assumed. Shopify webhooks can be re-delivered or arrive out of order. The only safe sink is external-ID upsert: stamp the stable Shopify id into a custom External ID field and PATCH /sobjects/{Object}/{extIdField}/{value}. Salesforce creates if absent and updates if present, so a duplicate delivery is a no-op. A connector that does INSERT on every webhook duplicates records.
08
The claim"Map a Shopify customer straight to a Salesforce Contact."
The realityTwo object-model traps break a first-cut sync. Person Accounts collapse Account and Contact into one row: standard fields surface as Person*, custom ones as __pc, and Name is read-only (write FirstName / LastName or hit a DML exception). Orders enforce a Draft to Activated lifecycle where every OrderItem must resolve to a PricebookEntry in the right Pricebook2 first. Both require branching the mapping.
09
The claim"The connector handles B2B contract pricing out of the box."
The realitySalesforce resolves a buyer's price by blending multiple buyer-group price books with a configurable "lowest price" or "highest-priority book" strategy. Shopify B2B assigns a Company Location to exactly one catalog and does not blend N books at runtime. The middleware must pre-resolve the effective price (read it via Connect REST GET /commerce/webstores/{id}/pricing/products) and write a single value per company. Standard connectors often skip this entirely.
10
The claim"Negotiated and contract prices will just flow to the storefront."
The realityThere are three different contract-pricing engines: native B2B Commerce price books, CPQ ContractedPrice (account-scoped, snapshot-at-quote, parent to child), and RLM ContractItemPrice. None of them automatically flow to the storefront, and which one the client runs dictates the entire build. CPQ takes a price snapshot at quote time, so later changes do not reach an existing quote line. Find out which engine is in play before quoting.
11
The claim"Per-account catalogs scale however you like."
The realityB2B Commerce entitlement has hard ceilings: 200 buyer groups per entitlement policy, 2,000 buyer groups per product per store, and search indexing includes only the first 2,000 buyer groups for a product. A naive "one buyer group per account" design hits these walls fast at enterprise scale. Salesforce's own docs warn that extending the 200 ceiling "can lead to data scaling issues." Account-to-buyer-group batching is a design decision.
12
The claim"A custom field in Salesforce means another fragile, hand-coded endpoint."
The realityThe opposite, if built right. Custom objects and fields are first-class in the REST and Bulk surface, keyed by an API name with a structural suffix (__c data, __r traversal, __e event, __x external, __mdt metadata). A robust middleware discovers the model at runtime via describeGlobal and sObjectDescribe (gating on createable, updateable and FLS) and re-reads the Avro schema on CDC schema-ID change. Bind to API names, never labels.
13
The claim"Two systems, two object models, last write wins."
The realityShopify and Salesforce can hold conflicting truth simultaneously: "fulfilled" in Shopify against "in progress" or "partially paid" in Salesforce, which yields duplicate records, data drift, and conflicting updates that compromise reporting. A reliable layer encodes a field-level system-of-record matrix (contract and price are Salesforce, fulfillment and capture are Shopify and the ERP) rather than last-writer-wins. No fixed connector exposes that logic.
14
The claim"One generic iPaaS recipe is all you need."
The realityGeneric iPaaS (Celigo, Workato, MuleSoft, Boomi) can wire the two together at the API level and even give dashboards and retries, but it lacks "logic for what that data means in a B2B context." Account-specific catalogs, negotiated pricing, approval workflows, the canonical-ID strategy across three systems, and the field-level ownership matrix still have to be designed and built. MuleSoft is cited at $5,000 to $15,000 a month with 2 to 3× TCO once implementation is counted. The connector is the commodity; the reliability logic on top is the product.

The decision guide

The ways to connect Salesforce and Shopify, and when each is right.

There are four ways to connect Shopify to Salesforce: an app-store or AppExchange connector, an iPaaS or middleware platform, manual import and export, or a custom API integration. The right method depends on data complexity, real-time needs, and how much control you require.

Option 01

App / AppExchange connector

eShopSync, Sync Made Easy, CRM Perks. Fast, no-code, fixed scope. Competent on a simple object mapping, often Contact-first.

  • mappingsfixed, no B2B layer
  • conflictfixed policy, one writer
  • b2bprice-book blending skipped
  • extrasmulti-currency a paid upgrade

Right for simple stores with no contract pricing, no account hierarchy, and a single source of customer truth.

Option 02

iPaaS / middleware

Celigo, MuleSoft, Boomi, Workato. Flexible, configurable, recurring cost. Wires at the API level with dashboards and retries.

  • mappingsconfigurable, template-bound
  • tenancyshared platform
  • b2b logicnot what the data means
  • costMuleSoft ~$5K to $15K / mo

Right for standard multi-system sync where the B2B meaning fits a fixed recipe and you can own the reliability layer yourself.

Option 03

Manual import / export

CSV in, CSV out. No automation, no real-time, no idempotency. A starting point, not an operating model.

  • automationnone, by hand
  • timingperiodic, never live
  • dedupmanual, error-prone
  • scalebreaks past low volume

Right for a one-time migration or a proof of concept, never a production B2B storefront.

Option 04 our build

Custom middleware

Built on Shopify webhooks and Salesforce REST and Bulk APIs, full control, owned by you, operated with a support agreement. Where Plus and B2B merchants end up.

  • mappingsyour fields, per-company
  • tenancysingle-tenant, isolated
  • recovery7 classes, DLQ, replay
  • scopepricing, hierarchy, multi-store

Right for B2B contract pricing, account hierarchies, multi-store or international, or high volume, where a connector overspills and you want it owned, not rented by the year.

How long it takes, and what it costs

Timeline by scope, not a contact-us wall.

A Salesforce CRM ⇄ Shopify Plus build lands in one of three bands depending on B2B complexity, which contract-pricing engine is in play, and how many of the break points above you carry. Bands below are market context; your figure is scoped to your build.

Band 01 · foundation

46

single org · standard catalog · weeks

  • Accounts, contacts and products one way, Salesforce to Shopify
  • Orders both ways with idempotent external-ID upsert
  • Identity resolution: matching rules plus a canonical-ID map
  • Dead-letter queue, daily reconciliation, the console

Band 02 · B2B

810

B2B Commerce · price books · weeks

  • Everything in foundation, plus the pre-resolved buyer price
  • Per-company Shopify catalogs from blended buyer groups
  • The right contract-pricing engine, identified and mapped
  • Person Accounts and the Draft to Activated order lifecycle

Band 03 · multi-cloud

1216

multi-store · ERP in the loop · weeks

  • Everything in B2B, plus multi-store and international routing
  • Field-level system-of-record matrix across Salesforce, Shopify and the ERP
  • CPQ or RLM contract pricing and entitlement batching at scale
  • Durable CDC replay and runtime model discovery for custom objects
Cost · scoped per build

We price a Salesforce 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, app-store connectors run roughly $0 to $300 a month and generic iPaaS commonly runs into 2 to 3× TCO once implementation is counted. Your exact figure is scoped to the band and the break points in play, and we put it in writing before anything starts.

Security posture

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

Four cards your IT and Salesforce admin will both want answered before a single record moves.

OAuth 2.0 · External Client App

Least-privilege access to Salesforce

Auth runs on OAuth 2.0 JWT Bearer or Client Credentials on an External Client App, scoped to api plus chatter_api, Permitted Users set to Admin-approved, secrets held in Named and External Credentials. No username-password flow.

HMAC · replay-safe

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.

AES-256-GCM · per-tenant

Credentials never in plain config

Salesforce and Shopify secrets are held as encrypted fields, isolated per tenant and rotatable without downtime. The JWT private key never sits in plaintext, anywhere.

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 a quarter close or a peak event.

Frequently asked questions

Where Salesforce 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 Salesforce with Shopify?+
Four approaches: an app-store/AppExchange connector (fast, no-code, fixed scope), an iPaaS/middleware platform (flexible, configurable), manual import/export (no automation), or a custom API integration using Shopify webhooks and Salesforce REST/Bulk APIs (full control, best for complex B2B logic). The right method depends on data complexity, real-time needs, and how much control you require. For enterprise B2B with contract pricing or approval workflows, a custom or middleware-backed integration is typically required because off-the-shelf connectors lack that business logic.
02What data syncs between Shopify and Salesforce?+
Customers, orders, products, and inventory. A Shopify customer maps to a Salesforce Account and Contact (or Lead); a Shopify order maps to a Salesforce Order or Opportunity; product catalog stays consistent across both systems. A bidirectional sync also lets Salesforce-driven changes flow back into Shopify.
03Is the Shopify-Salesforce sync real-time or batch?+
Both are options. Real-time sync is event-driven (Shopify webhooks plus Salesforce Change Data Capture over the Pub/Sub API) and is used when order, inventory, or customer changes must appear instantly. Batch sync runs on a schedule via Bulk API 2.0 and is gentler on API limits. Many enterprise setups mix the two: real-time for orders, batch for large backfills.
04What are the most common Salesforce-Shopify integration problems?+
Duplicate contacts and fragmented accounts (from guest checkouts and multiple emails), API rate and concurrency limits during peak traffic or bulk loads, order-lifecycle mismatches (partial shipments, returns, post-purchase edits), and conflicting ownership of the customer record. Most are avoidable with up-front identity resolution, external-ID upsert, a clear system-of-record, and proper testing before launch.
05Which system should be the source of truth?+
Salesforce CRM owns the customer, account, and contract; Shopify owns the transaction and fulfillment record. Define ownership per object and per field rather than last-writer-wins. In a three-system setup with an ERP, finance and inventory live in the ERP, and Salesforce and Shopify both sync to it.
06Is Salesforce CRM the same as Salesforce Commerce Cloud?+
No. Salesforce CRM (Sales Cloud / Service Cloud / B2B Commerce on Core) is what you integrate with a Shopify store to manage customers, orders, and pipeline. Salesforce Commerce Cloud is a separate storefront platform that competes with Shopify. Most brands keep Shopify Plus as the storefront and integrate Salesforce CRM behind it.
07How do you stop duplicate Contacts and Accounts in Salesforce?+
By stamping each Shopify record's stable id into a custom External ID field on the Salesforce object and writing via upsert (PATCH), so a record is created if absent and updated if present: a re-delivered webhook is a no-op. Salesforce duplicate and matching rules plus a canonical-ID map collapse guest checkouts and multi-email customers to one Account and Contact.
08Who builds custom Salesforce ⇄ Shopify Plus middleware?+
Makro Agency, a Shopify Plus partner that builds custom middleware between Shopify Plus and enterprise systems including Salesforce CRM, for brands whose B2B catalog, account hierarchy, multi-store setup, or order volume has outgrown an off-the-shelf connector or iPaaS.

How we build it

A proven platform. Salesforce is the next first-class adapter.

Every system sits behind the same contract: authenticate, fetch master data, push orders, validate, report. The platform runs in production today against a live enterprise system. Salesforce is a registered target on that same framework, its path fully mapped to REST, Pub/Sub and OAuth.

We say this plainly. NetSuite runs in production today. The Salesforce path is fully mapped. The credibility is a real platform and a precisely understood Salesforce path, not a claim of live Salesforce traffic. That distinction is exactly what your architect can verify, which is why we lead with it.

adapter contractbase.ts
01authenticate()OAuth 2.0 / JWT
02fetchMasterData()REST / Bulk / CDC
03pushOrder()Order + OrderItem
04validate()schema check
05report()audit + status
NS
NetSuite
SuiteQL · token auth · saved search
middleware in production
SF
Salesforce
REST · Pub/Sub · OAuth
path mapped
+
D365 F&O · Business Central · Sage · Infor · Epicor
REST / OData adapters
by engagement

Proof · the Clarius unified account page

Claims you can check.

One named Salesforce proof, then the platform numbers your architect can verify in the repository.

$100K+ / yr

Clarius · Salesforce CRM + NetSuite + Shopify PlusMakro built a unified account page for Clarius that pulls customer information, orders and invoices from Salesforce CRM, NetSuite ERP and Shopify Plus into a single customer-360 view, with a custom Membership app alongside. Combined with Shopify Flow feeding order data into the ERP, it eliminated manual data entry and cut operational costs by over $100,000 a year in third-party app fees. The Salesforce leg is the CRM spine: Account as the system of record for the customer, surfaced in one place.

Salesforce CRMNetSuite ERPShopify Pluscustomer 360
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 Salesforce admin and your connector's renewal quote. We will walk the platform, not a deck.

A real conversation about your Salesforce org, your B2B pricing, and the three sharp questions you already have.

salesforce / final