
Microsoft Dynamics 365 Finance and Operations (often called D365 F&O or just D365 Finance) has become one of the more common ERP backends for mid-market and enterprise B2B operations running on Adobe Commerce. The combination is technically sound — D365 is a capable ERP, Adobe Commerce is a capable B2B platform — but the integration between them has more failure modes than most teams expect going in. The patterns that produce reliable integrations look different from the patterns that produce demo-quality integrations, and the difference matters enormously once the integration is carrying real business traffic.
This piece walks through integration patterns for Adobe Commerce and D365 Finance that hold up under production scale. It is written for engineering leaders, integration architects, and ERP teams working on B2B Adobe Commerce implementations with D365 as the source of truth for finance, inventory, and order management. The patterns below come from Bemeir’s D365 integration work across multiple B2B engagements.
The Data Flows That Matter
Before discussing patterns, it helps to identify the data flows that an Adobe Commerce + D365 integration has to support:
- Catalog data: products, attributes, categories flowing from D365 (or a PIM that masters this data) to Adobe Commerce
- Pricing data: customer-specific pricing, tier pricing, and contract pricing flowing from D365 to Adobe Commerce
- Inventory data: stock levels per warehouse flowing from D365 to Adobe Commerce
- Customer data: customer master records, including credit terms and billing addresses, flowing from D365 to Adobe Commerce
- Order data: completed orders flowing from Adobe Commerce to D365 for fulfillment and finance posting
- Invoice and shipment data: fulfillment status flowing from D365 to Adobe Commerce for customer visibility
- Returns and credit memo data: customer-initiated returns flowing from Adobe Commerce to D365 for finance processing
Each flow has different frequency requirements, different volume profiles, and different failure tolerance. The integration architecture has to be designed for the union of all of them.
The Middleware Question
The first major architectural decision is whether to integrate directly between Adobe Commerce and D365 or to route everything through middleware. Both patterns work; the trade-offs differ.
Direct integration pros:
- Simpler architecture, fewer moving parts
- Lower latency for time-sensitive data
- No additional infrastructure cost
Direct integration cons:
- Tight coupling between Adobe Commerce and D365 versions
- Custom error handling and retry logic must be built into both sides
- Limited observability into integration health
- Difficult to add additional consumers later
Middleware integration pros:
- Decoupled architecture — Adobe Commerce and D365 evolve independently
- Centralized error handling, retry, and observability
- Easy to add additional consumers (BI, marketing automation, etc.)
- Schema translation in one place
Middleware integration cons:
- Additional infrastructure to maintain
- Additional latency for time-sensitive data
- Additional cost for middleware platform and engineering
For most production B2B implementations beyond a small scale, middleware is the right choice. The decoupling pays back over time as both platforms evolve and as additional integrations get added.
Common middleware choices include MuleSoft, Boomi, Azure Logic Apps, and Workato. For teams already in the Microsoft ecosystem, Azure Logic Apps or Azure Service Bus often makes the most sense — the tooling integrates naturally with D365 and the operational model is familiar.
Authentication and Security
D365 uses Azure Active Directory for authentication, which is well-documented and well-tooled. The Adobe Commerce side needs to obtain and refresh OAuth tokens for D365 API calls, typically via the client credentials flow with a service principal.
The pattern that holds:
- A dedicated D365 service principal for the integration, not a user account
- Permissions scoped to the minimum required (read for catalog/inventory/customer flows, write for order flows)
- Tokens cached in middleware (Azure Key Vault or equivalent) with automatic refresh
- All integration traffic over HTTPS with mutual TLS where supported
- IP allow-listing on the D365 side to restrict where the integration can originate from
Microsoft’s D365 authentication documentation covers the platform side, and Adobe Commerce’s webhook and API authentication documentation covers the storefront side.
| Data flow | Direction | Frequency | Middleware role |
|---|---|---|---|
| Catalog | D365 → Adobe Commerce | Daily, with on-demand for new product launches | Schema translation, image handling |
| Pricing | D365 → Adobe Commerce | Hourly or on-change | Bulk vs incremental decision |
| Inventory | D365 → Adobe Commerce | Every 5-15 minutes | Incremental updates only |
| Customer master | D365 → Adobe Commerce | On-demand + nightly reconciliation | Customer matching logic |
| Order | Adobe Commerce → D365 | Real-time at checkout completion | Validation, enrichment |
| Invoice/shipment | D365 → Adobe Commerce | Real-time when D365 processes | Customer notification trigger |
| Returns | Adobe Commerce → D365 | On customer request | Approval workflow |
Catalog Integration Patterns
For most B2B operations, D365 (or a PIM connected to D365) is the source of truth for catalog data. Adobe Commerce receives products and attributes from D365.
The patterns that work:
- Push catalog updates from D365 nightly, with on-demand updates for new product launches
- Treat Adobe Commerce as a read-only consumer of catalog data — never edit products in Adobe Commerce admin
- Use Adobe Commerce attribute sets to model D365’s product categorization
- Use Adobe Commerce categories for storefront-facing taxonomy, which may differ from D365’s category structure
- Handle images via D365 attachment or a dedicated DAM (most commonly the latter, with the DAM URL stored in D365)
For very large catalogs, the nightly push can become operationally heavy. The fallback is incremental sync — D365 publishes change events, and the middleware applies only the changes to Adobe Commerce. This is more complex but scales better.
Order Integration Patterns
The order flow from Adobe Commerce to D365 is the most business-critical part of the integration. Orders that fail to reach D365 don’t get fulfilled, which is a customer-facing failure.
The pattern that holds:
- When an order is placed in Adobe Commerce, it lands in Adobe Commerce’s order table immediately and gets a normal Magento order ID.
- An event triggers the order to be pushed to D365 via middleware.
- Middleware enriches the order with any D365-specific fields (customer account number, pricing list, terms) before posting.
- The order arrives in D365 and gets a D365 sales order ID.
- The D365 sales order ID is written back to Adobe Commerce as a custom order attribute.
- The status of the D365 sales order flows back to Adobe Commerce as it changes (acknowledged, picked, shipped, invoiced).
The critical design decision is whether the order is considered “placed” only after D365 acknowledges it, or whether Adobe Commerce can confirm the order to the customer immediately and reconcile with D365 asynchronously. The synchronous pattern is safer but slower. The asynchronous pattern is faster but requires explicit handling of D365 rejection (rare but possible).
For most B2B operations, asynchronous with reconciliation is the right choice — the customer confirms checkout immediately, and the rare D365 rejection is handled as a follow-up.
Customer Master Integration
B2B customer accounts in D365 typically have more structure than Adobe Commerce’s default customer model. D365 customer accounts include credit limits, payment terms, tax exemptions, shipping account numbers, and account hierarchy. Each of these needs to map into Adobe Commerce.
Adobe Commerce B2B’s Company Accounts feature is the right target for D365 customer accounts. The mapping:
- D365 customer account → Adobe Commerce Company
- D365 customer contact → Adobe Commerce Company buyer
- D365 credit limit → Adobe Commerce credit limit attribute on the Company
- D365 payment terms → Adobe Commerce payment terms configuration per Company
- D365 ship-to addresses → Adobe Commerce customer addresses
The customer creation flow needs explicit handling. Customers typically should be created in D365 first (where the master data lives), then synced to Adobe Commerce. Self-service customer registration in Adobe Commerce should be limited or designed to create draft customers that an operations team finalizes in D365.
Bemeir’s Adobe Commerce B2B practice handles this customer flow as part of every D365 integration engagement.
Error Handling and Retry
The integration will fail. Network blips, authentication token expirations, schema mismatches, business-rule violations. The architecture has to handle failures gracefully.
The pattern that holds:
- Every integration message is queued and processed asynchronously
- Failed messages are retried with exponential backoff
- After a maximum retry count, failed messages land in a dead-letter queue for manual inspection
- Dead-letter queue inspection is part of operational discipline — someone reviews failed messages daily
- Critical failures (order push, payment reconciliation) trigger alerts to the on-call engineer
- Idempotency is enforced — replaying a message produces the same result, not a duplicate
Azure Service Bus documentation covers the dead-letter and retry patterns natively, and equivalent patterns exist in other middleware platforms.
Performance Considerations
Inventory updates are the highest-volume flow. A B2B operation with 100,000 SKUs and frequent inventory turnover can produce thousands of updates per hour. The middleware needs to handle this volume without overwhelming Adobe Commerce.
The patterns:
- Batch inventory updates (Adobe Commerce supports bulk stock update APIs)
- Send only changes, not full inventory snapshots
- Tune the batch size based on Adobe Commerce admin response times — typical batch sizes are 500-2,000 SKUs
- Schedule large batches during off-peak hours
- Monitor Adobe Commerce indexer health during high-volume update periods
Bemeir’s Adobe Commerce performance practice typically pairs D365 integration with explicit inventory update sizing as part of the engagement.
Testing the Integration
Integration testing is harder than testing either platform individually. The patterns that produce confidence:
- A dedicated D365 sandbox environment that mirrors production data structure
- A dedicated Adobe Commerce staging environment that’s wired to the D365 sandbox
- Automated end-to-end tests covering the critical flows (order placement, inventory update, customer creation)
- Smoke tests that run after every deployment on either side
- Synthetic order monitoring in production that places a test order daily and validates the round-trip
The investment in testing pays back the first time D365 rolls out a change that would have broken production undetected.
For broader context on ERP integration patterns, Microsoft’s documentation on D365 integration patterns and the MACH Alliance’s composable commerce documentation cover the broader architectural landscape. The Adobe Commerce + D365 integration is one of the more demanding B2B integrations, and the patterns that work are the patterns that respect both platforms’ constraints rather than forcing one to behave like the other.





