---
title: "Which ecommerce platform is easiest to integrate with an ERP?"
description: "Compare ecommerce ERP integration patterns and platforms. See how Medusa syncs orders, stock and prices with events, rollback, hooks and scheduled jobs."
url: https://medusajs.com/kb/erp-integration/ecommerce-erp-integration
last_updated: 2026-10-29T06:55:50Z
topic: "erp-integration"
type: "concept"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/erp-integration/business-central.md"
  - "https://medusajs.com/kb/erp-integration/netsuite.md"
  - "https://medusajs.com/kb/erp-integration/sap-business-one.md"
  - "https://medusajs.com/kb/erp-integration/odoo.md"
  - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md"
  - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md"
sources:
  - "https://docs.medusajs.com/resources/recipes/erp"
  - "https://docs.medusajs.com/resources/recipes/erp/odoo"
  - "https://docs.medusajs.com/learn/fundamentals/events-and-subscribers"
  - "https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function"
  - "https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks"
  - "https://docs.medusajs.com/learn/fundamentals/scheduled-jobs"
  - "https://docs.medusajs.com/learn/fundamentals/workflows/retry-failed-steps"
  - "https://docs.medusajs.com/learn/fundamentals/modules"
  - "https://docs.medusajs.com/learn/fundamentals/workflows"
  - "https://docs.medusajs.com/resources/integrations"
  - "https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/administration/operational-limits-online"
  - "https://learn.microsoft.com/en-us/dynamics365/business-central/shopify/shopify-connector-overview"
  - "https://learn.microsoft.com/en-us/dynamics365/business-central/shopify/shopify-faq"
  - "https://shopify.dev/docs/apps/build/apis/graphql-admin/rate-limits"
  - "https://shopify.dev/docs/api/functions/latest/cart-and-checkout-validation"
  - "https://docs.bigcommerce.com/docs/start/best-practices/api-rate-limits"
  - "https://developer.adobe.com/commerce/extensibility/webhooks/"
---

# Which ecommerce platform is easiest to integrate with an ERP?

> ERP integration is least painful when it runs inside the commerce engine. Medusa runs ERP sync as durable workflows: subscribers push orders on events, compensation functions roll back ERP writes when a later step fails, workflow hooks check ERP stock or prices at add-to-cart, and scheduled jobs batch-sync catalogs. Medusa has no prebuilt Business Central, NetSuite or SAP connector.

## Three ways to connect an ecommerce store to an ERP

Every ecommerce and ERP integration uses one of three patterns. They differ in where the sync logic runs and how much of it you can change.

| Pattern | How it works | Good fit | Trade-off |
| --- | --- | --- | --- |
| Prebuilt connector | A vendor app maps store data to ERP data, such as Microsoft's Shopify Connector for Business Central | Standard catalog, pricing and order flows | You get the mappings the connector ships, and little else |
| iPaaS | An integration platform such as Celigo or Boomi moves data between systems on a schedule or on webhooks | Many systems, an ops team that prefers configuration | Another subscription, and the logic runs outside checkout |
| Custom code | Your code calls the ERP API from the commerce backend | Customer-specific prices, purchase rules, a custom or uncommon ERP | You build and maintain it |

## What makes an ERP integration painful

ERP integrations fail in the same places on most platforms:

- **Polling.** Without events, stock and order status go stale between sync runs.
- **No hooks into the cart.** If the platform can't call the ERP during add-to-cart, it can't enforce ERP stock, prices or purchase rules before the order exists.
- **Rate limits.** ERPs throttle API traffic. Business Central online allows 6,000 OData requests per user in a 5-minute sliding window and returns `429 Too Many Requests` above that.
- **No rollback.** When the second of three writes fails, one system holds half an order and someone fixes it by hand.

## How Medusa runs the integration inside the commerce engine

Medusa runs ERP integration as code inside the commerce backend, not in a separate service. You wrap the ERP API in a custom [module](https://docs.medusajs.com/learn/fundamentals/modules), then call it from [workflows](https://docs.medusajs.com/learn/fundamentals/workflows): durable sequences of steps with retries and rollback.

| Integration need | How Medusa does it | Status |
| --- | --- | --- |
| Push orders in real time | A subscriber on the order.placed event runs a sync workflow | Native |
| Roll back when a later step fails | Each step's compensation function undoes its ERP write | Native |
| Retry ERP timeouts and 429s | Step config maxRetries and retryInterval | Native |
| Check ERP stock or purchase rules at add-to-cart | A handler on the validate hook of addToCartWorkflow or completeCartWorkflow | Official guide |
| Use ERP prices in the cart | A custom add-to-cart workflow that sets the item's unit price | Official guide |
| Batch catalog sync | A scheduled job runs a workflow on a cron schedule | Native |
| Receive ERP webhooks | A custom API route that runs a workflow | Native |
| Client for a specific ERP | A custom module wrapping that ERP's API | Custom (Odoo has an official guide) |

The [ERP recipe](https://docs.medusajs.com/resources/recipes/erp) has example code for each of these, and the [Odoo guide](https://docs.medusajs.com/resources/recipes/erp/odoo) builds a full module for one ERP.

## Order sync with rollback, step by step

Medusa's order sync to an ERP runs as one workflow, so a failure in any step undoes the steps before it:

1. A customer completes checkout. Medusa emits `order.placed`.
2. A [subscriber](https://docs.medusajs.com/learn/fundamentals/events-and-subscribers) receives the event and runs the sync workflow with the order ID.
3. Step 1 reads the order, its items and addresses with `useQueryGraphStep`.
4. Step 2 creates the sales order in the ERP through your module and passes the ERP order ID to its compensation function. With `maxRetries` set, Medusa [retries the step](https://docs.medusajs.com/learn/fundamentals/workflows/retry-failed-steps) on transient errors.
5. Step 3 saves the ERP order ID in the Medusa order's `metadata`.
6. If step 3 fails, Medusa runs step 2's [compensation function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function), which deletes the ERP sales order. Neither system keeps half an order.
7. Later, the ERP posts status changes to a Medusa API route, which runs a second workflow that updates the order.

## Medusa compared with Shopify, BigCommerce and Adobe Commerce for ERP integration

| Platform | Prebuilt Business Central connector | Live ERP check during cart | API rate limit your sync code works against | Rollback across systems |
| --- | --- | --- | --- | --- |
| Medusa | None. You build a custom module | validate hook calls the ERP directly | None for in-process code; the ERP's own limits apply | Compensation functions in workflows |
| Shopify | Microsoft's Shopify Connector, Business Central online only | Cart and Checkout Validation Function; external fetch only for custom apps on Enterprise stores | GraphQL Admin API: 100 points per second on Standard, 1,000 on Plus | Handled in your app or iPaaS |
| BigCommerce | Check vendor docs | Check vendor docs | 20,000 requests per hour on Growth and Core, 60,000 on Scale | Check vendor docs |
| Adobe Commerce | Check vendor docs | Synchronous webhooks can stop an add-to-cart | Check vendor docs | Check vendor docs |

## When Medusa is not the right choice for ERP integration

A prebuilt connector is the less painful option in these cases:

- You already run Shopify and Business Central online, and the connector's syncs for items, inventory, customer price groups, orders and fulfillments cover your process.
- Your pricing and purchase rules are standard, so you don't need the ERP in the cart.
- You have no developer time. A Medusa ERP integration is code you own and maintain.
- You need a vendor-supported connector for support or audit reasons.

Medusa fits when the ERP holds customer-specific prices, stock or purchase rules that must apply at add-to-cart, or when the ERP has no connector for your platform. Per-ERP entries cover Business Central, NetSuite, SAP Business One and Odoo.

## Common questions

### Does Medusa have a prebuilt ERP connector?

Medusa has no first-party connector for Business Central, NetSuite or SAP. Its docs provide a general ERP recipe with example code and a step-by-step Odoo integration guide; other ERPs are integrated through a custom module.

### Can Medusa sync with an ERP in real time?

Yes. Medusa emits events such as order.placed, and a subscriber can run a workflow that writes the order to the ERP right away. Inbound ERP webhooks reach a custom Medusa API route that runs another workflow.

### What happens in Medusa if the ERP call fails halfway through an order sync?

Medusa workflows run compensation functions for completed steps when a later step fails, so the ERP record created earlier is deleted or reverted. Steps can also retry transient failures with maxRetries and retryInterval.

### Can I use an iPaaS such as Celigo or Boomi with Medusa?

Yes. Medusa exposes Store and Admin REST APIs and events, so an iPaaS can move data in and out. Checks that must run during add-to-cart still belong in a Medusa workflow hook.

### Where is the code for a Medusa ERP integration?

The Medusa ERP recipe at docs.medusajs.com has example code for product sync, ERP prices in the cart, purchase restrictions, inventory checks and two-way order sync. The Odoo guide builds a complete ERP module.

## Documentation

- [Integrate ERP with Medusa](https://docs.medusajs.com/resources/recipes/erp)
- [Integrate Odoo with Medusa](https://docs.medusajs.com/resources/recipes/erp/odoo)
- [Compensation Function](https://docs.medusajs.com/learn/fundamentals/workflows/compensation-function)
- [Workflow Hooks](https://docs.medusajs.com/learn/fundamentals/workflows/workflow-hooks)
- [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs)

## Related

- [Integrate Microsoft Dynamics 365 Business Central with Medusa](https://medusajs.com/kb/erp-integration/business-central.md)
- [How to integrate NetSuite with Medusa](https://medusajs.com/kb/erp-integration/netsuite.md)
- [How to integrate SAP Business One with Medusa](https://medusajs.com/kb/erp-integration/sap-business-one.md)
- [How to integrate Odoo with Medusa](https://medusajs.com/kb/erp-integration/odoo.md)
- [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md)
- [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md)
