01 / backbone
Prophet 21 is the ledger
Multi-warehouse inventory, customer-specific contract pricing, order-to-cash. The authoritative record the distribution business is run on.
Integration / Makro Middleware
Your ERP stays the system of record. Shopify Plus becomes where the order gets placed. We build custom Epicor Prophet 21 (P21) to Shopify Plus middleware for multi-warehouse inventory, customer-specific contract pricing, and bi-directional orders.
The real problem
The work is the space between: multi-warehouse inventory, contract pricing, and order-to-cash on one side, B2B buyer self-serve on the other.
01 / backbone
Multi-warehouse inventory, customer-specific contract pricing, order-to-cash. The authoritative record the distribution business is run on.
02 / front door
Where dealers and wholesale accounts place repeat orders without a phone call, a rep, or a fax.
03 / the gap
Duplicate customers. Orders written twice. Prices that drift off the contract. Silent 200-on-failure writes at month-end close.
We built a product around that exact gap. Prophet 21 is the one ERP marked "path mapped" on our adapter wall: precisely understood and fully mapped against the P21 Middleware.
Prophet 21 is Epicor's wholesale-distribution ERP, built around multi-warehouse inventory, customer-specific contract pricing, and order-to-cash. It is not the manufacturing-oriented Epicor Kinetic (jobs, BOMs, configure-to-order, BAQ). The integration surface differs, so the ERP and version must be confirmed before scoping.
How we build it
Items, per-location stock, customers and contract pricing are read out of Prophet 21 and pushed to Shopify. The storefront never writes to the ledger. Orders are the only thing that travels both ways, and Prophet 21 stays the source of truth.
System of record
read · never overwritten
The platform
map · reconcile · audit
The storefront
where buyers self-serve
The console
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.
| Time | Entity | Error class | Attempts | Next | Action |
|---|---|---|---|---|---|
| 08:13:04 | order · oe_hdr SO-10288 | PERMANENT · Summary.Failed | 3 / 3 | held | Inspect |
| 07:55:22 | customer · {1}_004182 | TRANSIENT · session pool | 2 / 5 | 09:50 | Retry now |
| 06:40:11 | price · ITEM-44120 | PACED · one-call pricing | 1 / 5 | paced | Inspect |
Every record carries three identities at once: the P21 composite key {CompanyId}_{Id}, a canonical id, and its Shopify gid. The middleware reads this row before every write and decides create, update, or skip.
P21 has no idempotency keys and uses Status:"New" for both create and update, so we dedupe on the crosswalk before re-posting. 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.
entity key map · every id matched before write
Inside the platform
Ten engineered subsystems sit between Prophet 21 and Shopify Plus. None of them is a setting you toggle. Each is something we built, and something your team can watch run.
01 / 10
When a record fails
P21's Transaction API returns HTTP 200 even on a failed write and runs on a pool of reusable sessions that can contaminate. Colour carries the verdict: amber is sorted, teal retries, red is held, green replays.
A record fails to write to Shopify or Prophet 21. Instead of disappearing into a log, it enters the pipeline and gets a verdict. We inspect Summary.Failed, never the 200 status code.
Every failure is sorted before anything is retried, so a bad record never loops forever. A session-pool UnexpectedResponseWindow is paced, a validation error is held.
Transient and session-pool failures retry with jittered backoff, automatically, until they clear. The one-call-at-a-time pricing path is paced so it never times out at ~40-50 items in one shot.
retryingA permanent failure routes straight to the dead-letter queue for review. It is never retried blindly or lost, because P21 would have returned 200 and swallowed it otherwise.
held for reviewFix the cause, replay from the queue against the Shopify-GID ↔ P21-key crosswalk. A daily reconciliation pass catches anything the live path missed.
replayed · reconciledThe failure modes no vendor page admits
Prophet 21 to Shopify integrations break at predictable points. Pre-built connectors and iPaaS templates handle the happy path and flatten the distribution nuances that matter.
P21 publishes no change events, so poll-based connectors lag. A 2-5 minute inventory poll oversells stock another branch already committed before the storefront catches up.
→ delta polling on date_last_modified + real-time add-to-cart checkThe Transaction API returns HTTP 200 even when the write failed. Trust the status code and the order is silently lost at the worst possible time, during close.
→ parse Summary.Failed / Messages, never the status codeThe Transaction API runs on a pool of reusable sessions; a dirty session causes intermittent UnexpectedResponseWindow failures with no cadence. The Interactive pool defaults to 5 instances.
→ jittered retries + dedicated API user + async endpointsThe per-item price path times out at roughly 40-50 items in one shot, and P21 publishes no hard rate limit; the throttle is architectural, governed by middleware sizing.
→ resolve live, cache, and parallelize in your own tierConnectors publish a single on-hand number. P21 stock is per inv_loc; raw on-hand oversells, and a drop-ship line should not decrement warehouse available the way a stock line does.
→ Quantity Available per location, dispositions respectedFlatten the price matrix into static Shopify lists and the contract drifts. P21's library→book→page hierarchy (types 210 / 211) resolves per logged-in customer, and a second price book in Shopify rots.
→ resolve customer-specific price live + cache, P21 single sourceClaims you can check
Every reality below is verified against a primary Epicor source, a named vendor doc, or a community P21 reference. This is the difference between a team that read the marketing and a team that shipped against the documentation.
The decision guide
There are four paths: a P21 connector vendor, an iPaaS, a custom build on the P21 Middleware, or Epicor's own ECC. Each trades control against speed, and only the custom / owned path keeps multi-warehouse inventory, customer-specific pricing, and order-to-cash intact instead of flattening them.
Option 01
A purpose-built P21 connector such as Modern Retail or B2Sell. Faster to stand up, configured and paid for on a recurring basis.
Right for a distributor who wants speed over control and can live with flattened multi-warehouse and contract-pricing logic.
Option 02
Subscription middleware on a shared platform. Strong for standard multi-system sync across templated connectors.
Right for standard multi-system sync where the distribution logic fits a fixed-mapping template.
Option 03 · our build
Built around your exact pricing and inventory rules on the P21 Middleware + Shopify Admin API, owned by you, operated with a support agreement.
Right for distributors who need multi-warehouse availability, customer-specific contract pricing, and order-to-cash encoded faithfully, not flattened.
Epicor Commerce Connect (ECC) is designed to run natively with Magento / Adobe Commerce, so for Shopify it is not plug-and-play. A pre-built connector or iPaaS is faster to stand up but is a rented, multi-tenant product you pay for on a recurring basis; a custom integration on the P21 Middleware costs more upfront but you own the asset and can encode Prophet 21's real pricing and inventory rules.
What drives timeline and cost
A Prophet 21 to Shopify Plus build is driven by item-master readiness, data volume, custom workflows, real-time vs scheduled, and pricing-rule plus multi-warehouse complexity. The bands below are industry-reported context, not a Makro quote.
Driver 01 · readiness
item-master + data volume
Driver 02 · rules
pricing + multi-warehouse
Driver 03 · cadence
real-time vs scheduled
Industry specialists report most P21 to Shopify integrations finish in roughly 6-12 weeks with a pre-built connector and about 3-6 months for a custom build, driven mainly by pricing-rule and multi-warehouse complexity. We price a P21 integration as an engineering engagement: a build with a support agreement, not a per-record meter or a platform seat that renews forever.
Security posture
A Bearer token over the P21 Middleware on a consumer key (service account, Service type, table-scoped /odata:…) plus a named svc_shopify user for audit; TLS-verified, VPN / IP-allowlisted ingress.
Every Shopify webhook is HMAC-verified before it is trusted, then deduplicated by event id so a replay cannot create a second order.
An append-only audit trail logs every order, inventory and pricing operation, source-tagged, so you can prove what happened during month-end close.
Prophet 21 and Shopify secrets are held as encrypted fields, isolated per tenant and rotatable without downtime. No credential sits in plaintext, ever.
Frequently asked questions
The details that separate a team that read the docs from a team that shipped against them. Open any one.
GET /api/inventory/parts/{ItemId}/v2/price?customerId=…, which gives UnitPrice (after price-page evaluation), PricePageUid for provenance, and QuantityAvailable in one call. We resolve live and cache rather than re-implement P21's library, book and page hierarchy (price-page types 210 Customer / 211 Customer-Item), and we carry the full pricing key end to end: customerId, companyId, ship-to, and UOM with conversion.inv_loc and raw on-hand oversells. We also respect dispositions and drop-ship: a supplier drop-ship or direct-ship line should not decrement warehouse available the way a stock line does.apiref.aspx, and your P21 administrator in the entity-mapping workshops. Master-data syncs are read-only against P21, so we are not writing to your ledger while we scope.The framework underneath
Every ERP sits behind the same contract: authenticate, fetch master data, push orders, validate, report. The platform runs in production today against a live enterprise ERP. Epicor Prophet 21 is a registered target on that same framework, its path mapped to the P21 Middleware, OData, Transaction and Interactive APIs, and contract pricing.
We say this plainly: the credibility is a real platform and a precisely understood P21 path, not a decade of P21 traffic. That distinction is exactly what your architect can verify, which is why we lead with it.
The engineering standard
Clarius · NetSuite + Salesforce + Shopify PlusWe built a unified account page integrating Clarius' NetSuite ERP, Salesforce CRM and Shopify Plus into a single view of customer information, orders and invoices across three enterprise systems. Combined with Shopify Flow automation feeding order data into NetSuite, it eliminated manual order entry and reduced operational costs by over $100,000 a year. This is the NetSuite engagement, shown as platform credibility, not a Prophet 21 result.
Automated tests across 139 suites, run on every change.
Coverage gate enforced before any deploy.
End-to-end browser tests across Chromium, Firefox and WebKit.
Failure classes, each with its own pre-decided policy.
Credentials stored in plaintext, anywhere, ever.
A real conversation about your P21 environment, your contract pricing and multi-warehouse setup, and the sharp questions you already have.