All Posts
Engineering March 23, 2026

Integrating ERPs with Shopify Plus: Why Shopify's API is Winning the Mid Market

Mid market brands running ERPs alongside Shopify Plus face a surprisingly complex integration landscape. Shopify's API surface has matured to the point where clean, real time ERP sync is finally achievable without six figure middleware platforms if you know the right patterns.

Mid market brands running ERPs alongside Shopify Plus face a surprisingly complex integration landscape. Most teams assume the hard part is the ERP side. It isn't. Shopify's API surface has matured dramatically, and the brands that understand its architecture can build clean, real time sync without six figure middleware platforms.

The ones that don't understand it end up with oversold iPaaS contracts, brittle webhook chains, and inventory that's perpetually two hours out of date.

Why ERP Integration Breaks Down at Mid Market Scale

The mid market sits in an awkward position. You're past the point where manual data entry is survivable, but you're not yet at the scale that justifies a full Oracle Commerce + Mulesoft stack. Most ERP integrations at this tier get built in one of three ways: a one size fits all connector from the ERP vendor, a generic iPaaS platform like Celigo or Boomi, or a bespoke internal build that ships late and gets abandoned after the lead developer leaves.

Each of these approaches fails for the same underlying reason: they treat Shopify as a passive data sink. Push orders in, pull inventory out. That worked when Shopify's API was simpler. It doesn't work now that a single Shopify Plus store can have B2B price lists, multi location inventory, metafield driven product data, and draft orders living alongside standard checkout flows.

The integration layer has to understand Shopify's data model, not just its endpoints.

The Technical Foundation: How Shopify's API Surface Has Changed

Shopify's REST Admin API has been progressively replaced by the GraphQL Admin API, and for integration work this matters enormously. [INTERNAL LINK: Why Shopify GraphQL matters for enterprise → Shopify GraphQL vs REST for large catalogs]

The GraphQL API exposes bulk operations that let you query or mutate thousands of records in a single async job, essential for initial ERP sync and large catalog updates. REST rate limits were per endpoint and unpredictable; GraphQL uses a cost based throttling model that's deterministic and easier to build around.

Three specific API features define modern Shopify Plus ERP architecture:

Inventory API with multi location support. Shopify's inventoryAdjustQuantities mutation lets you set absolute quantities per location atomically. This is the correct pattern for ERP sync. Your ERP is the system of record, and you're not incrementing/decrementing, you're asserting the current state. Connector tools that still use inventoryLevelSet on the REST API will lose inventory during concurrent updates.

Draft Orders and B2B catalog. Shopify Plus B2B, released in 2022, moves company level pricing and catalogs into first class API objects. If your ERP manages customer specific pricing (standard for NetSuite), you need to push those price lists into Shopify's B2B catalog, not replicate them in a separate app or Liquid theme workaround.

Webhooks v2 with delivery verification. Shopify's webhook system now includes HMAC verification and delivery retries with exponential backoff. Your integration should validate the X-Shopify-Hmac-Sha256 header on every webhook before processing. Skipping this is a critical security gap that commodity connectors often ignore.

Implementation Deep Dive: NetSuite and QuickBooks Patterns

NetSuite + Shopify Plus

NetSuite is the most common ERP at mid market Shopify Plus brands. The canonical integration pattern is event driven in both directions: Shopify webhooks trigger NetSuite record creation, and NetSuite saved searches or SuiteScript schedulers push fulfillment and inventory updates back to Shopify.

The architecture that actually works at scale looks like this:

  1. Order flow (Shopify to NetSuite): Shopify fires orders/paid webhook to your middleware. Middleware transforms the payload into a NetSuite Sales Order, resolving Shopify customer IDs to NetSuite customer records and Shopify variant SKUs to NetSuite inventory items. Idempotency key = Shopify order ID stored on the NetSuite SO as a custom field.

  2. Fulfillment flow (NetSuite to Shopify): NetSuite SuiteScript scheduler polls for fulfilled SOs every 15 minutes, calls Shopify's fulfillmentOrders GraphQL mutation to create fulfillments with tracking. Avoid using Shopify's legacy fulfillments REST endpoint. It doesn't support fulfillment holds or third party logistics scenarios cleanly.

  3. Inventory sync (NetSuite to Shopify): Nightly bulk sync using Shopify's GraphQL bulk operations. NetSuite exports inventory quantities per location to a CSV; a lightweight Lambda or Cloud Run job reads this and fires inventoryAdjustQuantities mutations in batches of 250 items per mutation, respecting Shopify's GraphQL cost limits.

The most common failure mode in NetSuite integrations is treating the order webhook as guaranteed delivery. It isn't. Shopify retries failed webhook deliveries for 48 hours, but if your middleware is down during that window, you lose the event. [INTERNAL LINK: Reliable webhook processing → building idempotent webhook consumers] The correct pattern is a webhook receiver that immediately acknowledges with 200, persists the raw payload to a queue (SQS, Pub/Sub, or even a Supabase table), and processes asynchronously.

QuickBooks Online + Shopify Plus

QuickBooks integrations are typically simpler in scope. QBO is an accounting system, not an operational ERP, so you're syncing orders and payments for financial reporting rather than driving fulfillment workflows.

The critical constraint here is QuickBooks Online's API rate limit: 500 requests per minute per company. For Shopify stores doing more than a few hundred orders per day, naive per order sync will hit this ceiling fast. The correct pattern is batch reconciliation: aggregate Shopify orders into a daily summary journal entry rather than creating individual QBO invoices per order. This mirrors how physical POS systems handle end of day settlement and keeps your QBO data clean for accounting purposes.

If you need individual order level records in QBO for invoicing or AR purposes, use a queue based approach that rate limits QBO API calls explicitly, rather than relying on iPaaS platform throttling (which is often misconfigured out of the box).

The Decision Framework: How to Choose Your Integration Architecture

Approach Best For Avoid If
Native ERP connector (e.g., NetSuite Shopify connector) Small teams, standard data model, low customization You have custom metafields, B2B pricing, or multi location inventory
iPaaS platform (Celigo, Boomi, MuleSoft) Teams that want UI driven mapping and pre built connectors Your order volume makes per transaction pricing unsustainable
Custom middleware (Node.js / Python on Cloud Run or Lambda) Full control, complex business logic, high volume You lack engineering resources to maintain it long term
Hybrid: custom core + iPaaS for edge cases Mid market brands with complex logic but finite eng bandwidth N/A this is usually the right answer

The most underrated factor in this decision is total cost of ownership at volume. iPaaS platforms charge per transaction at the lower tiers. At 5,000 orders/month, the per transaction cost on Celigo Starter can exceed what a dedicated Cloud Run service would cost to run for a year. Do the math before signing a contract.

Key Decision Criteria

Your integration architecture should match your operational cadence. If your ERP team runs nightly batch jobs, real time webhook processing creates unnecessary complexity. Build a scheduled sync instead. If your ops team needs order status in NetSuite within minutes of Shopify checkout, event driven is non negotiable.

The second criterion is error visibility. Whatever you build, you need an alerting layer that fires when sync fails. A silent failure in order sync can mean fulfilled orders never reach your warehouse. Instrument your integration with structured logging and set up failure alerts from day one, not as a post launch cleanup task.

What This Means for Your Business

Getting ERP integration right is not a technical nice to have. It's the difference between your ops team running on accurate data and running on stale exports and manual reconciliation. At mid market scale, the cost of bad inventory data, stockouts, oversells, manual correction cycles, compounds fast. An integration that's slightly harder to build but operationally reliable pays for itself in months.

The brands that invest in understanding Shopify's API model before choosing their integration stack end up with systems that survive catalog expansions, warehouse additions, and ERP upgrades. The ones that buy a connector and hope for the best end up rebuilding every 18 months.

How Contra Collective Bridges the Gap

Contra Collective has built production ERP integrations for mid market Shopify Plus brands across NetSuite, QuickBooks, and custom ERP environments. We know where the edge cases live, B2B catalog sync, multi location inventory atomicity, idempotent webhook consumers, and we build integrations designed to survive the operational realities of growing brands, not just pass a demo.

Ready to make the right call for your stack? Book a free technical audit no sales pitch, just clarity.

Final Thoughts

Shopify's API has grown up. The mid market brands winning on operational efficiency are the ones treating their Shopify Plus integration as a first class engineering concern, not a connector and forget checkbox. The patterns exist. The tooling is mature. The gap is in knowing which patterns to apply to your specific ERP and data model, and having the discipline to build for failure from the start.

[ 02 ] — Keep Reading

More from the lab.

Oct 4, 2026 Engineering

NetSuite's Native AI Agents vs Custom MCP Tools: What Actually Moves the Needle in 2026

NetSuite 2026.2 brings Ask Oracle, a conversational assistant for natural language questions over your ERP data, and AI Canvas, a workspace for organizing the scorecards and charts that come out of that conversation. Both ship native, inside the NetSuite Next experience, available now in the United States and Canada. That is real progress on the question teams have been building custom NetSuite integrations to answer for years. It is also not the same question as whether to build a custom Model Context Protocol tool against your own schema, which remains the highest leverage move for anything Ask Oracle was never designed to touch.

Sep 28, 2026 Engineering

Adobe Commerce's September 2026 Storefront Release: What B2B and Headless Teams Need to Verify

Adobe shipped its September 2026 Commerce Storefront release with six changes worth a headless or B2B team's attention: Free Gift Selection, an expanded Payment Services drop in with Google Pay and PayPal Buttons, Multiple Named Wishlists, a shared B2B Company Address Book with role based permissions, accessibility improvements across cart and account, and a reCAPTCHA fix for B2B company registration. Five of these are low risk component updates. The sixth ships with an action item, passing an explicit configuration flag, that will break company registration on B2B enabled backends if a team skips it. This post walks through what shipped, the versions behind it, and a verification checklist to run before this release reaches production.

Sep 28, 2026 Engineering

Claude Code's Permanent 17 Percent Usage Cut: What Changed and How to Budget For It

If your team's Claude Code usage suddenly feels tighter this month, the numbers explain why. A temporary 50 percent weekly limit boost expired on August 31, 2026, and the permanent replacement that took effect September 14 is a 25 percent increase, not a 50 percent one. Anthropic said so directly in its own announcement: compared to the boosted summer level, this works out to a 17 percent reduction in weekly limits on Claude Code. That is an unusually plain admission from a vendor, and it is worth taking at face value rather than decoding it as marketing language. This post lays out the full timeline from May through September, why the separate 5 hour session change does not offset the weekly cut, and three concrete steps for budgeting a team's Claude Code usage against the new permanent ceiling.

Ready when you are

Want to discuss this topic?

Start a Conversation