Craft Commerce 5 · 12 ERPs, free connectors
One sync engine. A free connector for every ERP.
Most Commerce–ERP integrations are a bespoke build that one person understands, with the retry logic, the duplicate guard and the field mapping written again from scratch for every ERP. Erpy does the hard part once and keeps it in one place, so the part that differs per vendor is a small free plugin — and the part that has to be right is the part everyone shares.
What Erpy owns, so a connector doesn't have to
A connector turns one page of one vendor's payloads into canonical documents. Everything that has to be true of all of them is here, written once.
It cannot send the same order twice
The identity map has a unique database index on every pairing. That index — not a remembered check that could be raced — is what stops a retried queue job becoming a second sales order in your warehouse.
- A double-clicked button, a retried job and a duplicate webhook all hit the same constraint
- Shipment rows carry a quantity, so partial fulfilment is answerable across several deliveries
Delta syncs that cannot lose a record
The watermark advances to the start of a run, never to the end, plus a two-minute overlap. A record edited while a run is in flight would otherwise fall into the gap and never be seen again.
- Re-reading a few records costs one content-hash comparison; missing one costs a wrong price
- A failed run does not move the watermark at all
A mapping that can correct the connector
A rule whose target is a canonical field overwrites what the connector read, before the document reaches Commerce. A wrong field name on your tenant is an afternoon's fix, not a bug report and a release cycle.
- Read anything in the document, including the untouched ERP payload under raw.
- A small, non-Turing-complete transform vocabulary — a mapping screen that can run code can take a site down at 3am
Nothing is lost when the ERP says no
A refused document is kept whole — the request, the response and the reason. Fix the cause and press Retry: the original goes, rebuilt from Commerce if the order still exists and from the stored copy if it does not.
- A refusal marked permanent is not retried; a retryable one stops after a set number of attempts rather than queueing forever
Contract pricing at cart time
A mid-market ERP holds tens of thousands of negotiated price lines. One Commerce pricing rule per line would make catalog price generation the slowest thing on the site, so Erpy resolves the customer's price when the cart asks for it.
- Quantity breaks, campaign dates and per-customer price lists
- A bad lookup falls back to Commerce's own price — everything that runs during checkout fails open
A log that cannot leak your key
Secrets are stripped out of non-2xx bodies at the transport, before a connector — or a merchant's health screen — ever sees them. An ERP will echo your credential back inside its own error message, and several of them do.
- Every request and response, filterable by connection and outcome
- A log write is never allowed to be the reason a sync fails
A free add-on for every ERP
Install Erpy once, then the add-on for the ERP you run. Each one only translates its vendor’s API into Erpy’s documents — the engine, the mapping and the log are Erpy’s, which is why the add-ons cost nothing.
Erpy for Acumatica
Acumatica
Acumatica Cloud ERP through the contract-based REST endpoint, with one shared session per run so the licence is not spent on logins.
- ← Products
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-acumatica
Docs →
Erpy for AFAS
AFAS Profit
AFAS Profit through your own GetConnectors and UpdateConnectors — every connector and field name is a setting, because your partner chose them.
- ← Products
- ← Prices
- ← Stock
- ← Customers
- ← Order status
- ← Credit
- Orders →
craft-erpy-afas
Docs →
Erpy for Business Central
Dynamics 365 Business Central
Dynamics 365 Business Central through API v2.0 and an Entra ID app, with optional published pages for the prices and shipments Microsoft never exposed.
- ← Products
- ← Prices
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-businesscentral
Docs →
Erpy for Exact Online
Exact Online
Exact Online through its REST API, with the rotating refresh token, the daily rate limit and division scoping handled for you.
- ← Products
- ← Prices
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-exactonline
Docs →
Erpy for MYOB
MYOB Acumatica (Advanced), MYOB Exo
Two connectors: MYOB Acumatica (formerly Advanced) through its REST API, and MYOB Exo through the Exo API gateway.
- ← Products
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-myob
Docs →
Erpy for NetSuite
NetSuite
Oracle NetSuite through SuiteTalk REST and Token-Based Authentication, with every bulk read done in SuiteQL.
- ← Products
- ← Prices
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-netsuite
Docs →
Erpy for Odoo
Odoo
Odoo Community or Enterprise through JSON-RPC and an API key, with errors read from the body because Odoo answers everything with HTTP 200.
- ← Products
- ← Prices
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-odoo
Docs →
Erpy for Priority
Priority
Priority ERP through OData, addressing the same forms your consultant works in — every form name configurable.
- ← Products
- ← Stock
- ← Customers
- ← Order status
- ← Invoices
- ← Credit
- Orders →
craft-erpy-priority
Docs →
Erpy for Sage
Sage Intacct, Sage 200, Sage X3, Sage Business Cloud Accounting
Four connectors for four unrelated products: Sage Intacct, Sage 200, Sage X3 and Sage Business Cloud Accounting.
- ← Products
- ← Stock
- ← Customers
- ← Order status
- ← Invoices
- ← Credit
- Orders →
craft-erpy-sage
Docs →
Erpy for SAP Business One
SAP Business One
SAP Business One through the Service Layer, with one shared session and the tYES/tNO booleans read properly.
- ← Products
- ← Prices
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-sapb1
Docs →
Erpy for Unit4
Unit4 ERP
Unit4 ERPx and Business World, with every resource path configurable and both authentication schemes offered.
- ← Products
- ← Stock
- ← Customers
- ← Order status
- ← Credit
- Orders →
craft-erpy-unit4
Docs →
Erpy for Visma
Visma.net ERP
Visma.net ERP (Financials) through the integration API and Visma Connect, with delta syncing that actually filters.
- ← Products
- ← Stock
- ← Customers
- ← Order status
- ← Shipments
- ← Invoices
- ← Credit
- Orders →
craft-erpy-visma
Docs →
Twelve add-ons, sixteen connectors. What each one syncs is read from the connector’s own declaration. Not on the list? A connector is one class, and the interface is documented.
Erpy in the control panel
Real screens from a Craft 5 install running Commerce — what a connection syncs, the mapping rules, the run history and the documents an ERP refused.
Screenshots from a live install running the built-in Mock ERP, not mockups.
The storefront half
Contract prices are applied to the cart automatically. These helpers are for showing a price, a quantity-break table and a customer's standing — all of them failing open, because none of it is worth taking a storefront down for.
{# The customer's negotiated price, or null when the ERP has no opinion #}
{% set price = craft.erpy.price(variant, 1) %}
{# The "buy 10 and save" table, for this customer only #}
{% for tier in craft.erpy.priceBreaks(variant) %}
{{ tier.minQuantity }}+ — {{ tier.unitPrice|commerceCurrency('USD') }}
{% endfor %}
{# B2B account standing: price list, terms, credit limit, balance #}
{% set account = craft.erpy.account() %}
{% if account and not craft.erpy.canSpend(cart.totalPrice) %}
<p>This order would take you over your credit limit. Please pay by card.</p>
{% endif %}
{# Has this order reached the ERP yet? #}
{% set status = craft.erpy.orderStatus(order.number) %}
Frequently Asked Questions
The questions worth answering before you install it.
No. Erpy is $149 with a $129 annual renewal. Every connector add-on is free, for every ERP on the list, forever.
Because there is not much in it. A connector turns one page of one vendor's payloads into canonical documents; it does not queue, retry, page, dedupe, map, log or schedule, because Erpy does that once for all of them. Charging separately would also mean a merchant on an unusual ERP paying more for less.
A connector is one class, and the interface is documented. If you would rather not write it, email me — the list grows in the order people ask.
Yes. A Mock ERP connector ships with Erpy, makes no network calls and invents deterministic data, so you can walk connections, mapping, dry runs, the run log, dead letters and replay before anyone buys an ERP licence. It is also the fastest way to prove a problem is in the connector rather than in Erpy.
Only what you tell it to. Direction is set per entity, you can narrow what a connector offers but never widen it, and Preview reads a real page and reports exactly what it would create, update or skip while changing nothing.
No. The identity map has a unique database index on the pairing between a Commerce order and its ERP document. A retried queue job, a double-clicked button and a webhook arriving twice all hit the same constraint — it is not a remembered check that could be raced.
Nothing the customer sees. Order push is always queued, never inline — the sale completes and the document goes when the ERP answers again. If the ERP refuses it permanently it lands on the Problems screen whole, ready to replay once the cause is fixed.
Because project config deploys. A staging site's ERP credentials arriving in production on the next deploy — or a sandbox connection quietly becoming a live one — is the worst thing this plugin could do, and that risk is not worth the convenience.
Yes. A connection targets one store, so a site with two stores and two ERP companies is two connections.
The storefront work is a price lookup and, optionally, a credit check — both cached, both failing open. The heavy work is syncing, which runs in the queue or from cron, never in a web request.
One price, every ERP
Erpy is $149 with a $129 annual renewal, single edition. The connector for your ERP is free, and so is the Mock ERP you can try the whole thing on first.