This update covers integration and service changes across five operating areas: AfterShip and native Shopify returns, PO-backed pre-order data, Shopify order and product synchronization, carrier labels and email communication, and app migration services. These changes target specific failure modes: stale PO ATP after quantity edits, new Shopify orders waiting behind update jobs, duplicate MDM writes when an order has not changed, carrier label errors hidden in carrier-specific code paths, and audit screens missing actor or log context.

Returns integration overhaul and supported flows

The release includes a new AfterShip returns integration. AfterShip and native Shopify return records can now enter OMS before final settlement and remain identified as in-progress or completed returns. The bridge stores Shopify return IDs, refund IDs, return history, processed dates, return status, return channel, customer identity, reason data, restock behavior, destination facility, and linked agreements with the return record, so service teams can see where the return originated and which step it has reached.

Return import now distinguishes the paths that used to look similar after settlement. A return can start as an open native Shopify or AfterShip return, become an OMS return request, close later with a refund, become an appeasement when no inventory is restocked, or create an exchange order with new payment activity. When Shopify only provides a ReturnAgreement, the bridge uses it to keep the originating app and return channel instead of defaulting the record to the generic admin channel. When an admin refund has no restocked items, OMS classifies it as an appeasement instead of a customer return.

Return and refund reconciliation also received targeted updates. Refund import now processes every entry in Shopify's order_adjustments array instead of dropping entries after the first processed adjustment. Cancellation refunds carry the presentment currency, Shopify-sourced exchange rates convert presentment money back to shop currency by division instead of multiplication, payment terms are created during Shopify order import and update, and payment preferences receive created dates during order, transaction, and refund processing. Those changes reduce partial refund records, incorrect multi-currency payment amounts, and missing payment timing in refund, credit memo, exchange credit, replacement order, and invoice review.

NetSuite return sync now writes history for RMA, item receipt, credit memo, customer refund, invoice, return grand total, and response details. OMS shows NetSuite return sync status on the return screen, Poorti stores return references on shipment receipts, and warranty inventory can move into floor-damage tracking with retryable inventory transfer history.

Sources: hotwax-shopify-oms-bridge#106, hotwax-shopify-oms-bridge#179, hotwax-shopify-oms-bridge#205, hotwax-shopify-oms-bridge#218, hotwax-shopify-oms-bridge#125, hotwax-shopify-oms-bridge#151, hotwax-shopify-oms-bridge#177, hotwax-shopify-oms-bridge#208, hotwax-shopify-oms-bridge#168, hotwax-shopify-oms-bridge#181, hotwax-shopify-oms-bridge#130, hotwax-shopify-oms-bridge#155, hotwax-oms#496, hotwax-oms#542, hotwax-oms#508, hotwax-oms#521, hotwax-oms#456, hotwax-poorti#231, mantle-netsuite-connector#213, mantle-netsuite-connector#238, mantle-netsuite-connector#239, mantle-netsuite-connector#242, mantle-netsuite-connector#234, mantle-netsuite-connector#237, mantle-netsuite-connector#231

Pre-order

Fixes in the current flow

Fixed a gap where editing a purchase order item quantity did not update that item's available-to-promise value. After the change, PO ATP recalculates from the edited quantity, so Preorder does not evaluate pre-sell eligibility against the old purchase order quantity.

Imported pre-order sales orders also received an indexing fix. Approved orders that passed through the pre-order import flow now create their order index after pre-order item splitting and promise-date assignment, so they appear in indexed order views without manual reindexing.

The release also added purchase order resources for Preorder management:

  • GET /purchaseOrders: added purchase order list access with filters for status, item status, facility, product store, keyword, and pagination.
  • GET /purchaseOrders/{orderId}: added single purchase order access for detail views.
  • estimatedDeliveryDate: added to purchase order item ship-group data, so Preorder can show inbound timing with the purchase order.
  • GET /purchaseOrders/{orderId}/receipts: added receipt lookup from the new PurchaseOrderItemShipmentReceipt view, tying receipts back to purchase order items.

Sources: hotwax-oms#505, hotwax-oms#511, oms#503

Shopify

Order create/update queue separation

Shopify order creation now runs separately from order updates, so new orders do not wait behind a backlog of update jobs. The bridge added a createOrders flag for update-only queues, while the Shopify connector split MDM order configurations by create versus update. Before writing an order to MDM, the bridge now checks whether the order actually changed, including hash-backed comparisons for fields like customer, payment terms, outstanding amount, fulfillment, refunds, and risk. That reduces unnecessary mega-query and MDM work while keeping updates available when a real diff exists.

The order sync path also picked up targeted fixes:

  • Resolve shop context once and pass it downstream.
  • Carry product store ID through the order sync flow.
  • Skip duplicate shipping contact-mech creation during updates.
  • Stop marking cancelled, unfulfilled Shopify orders as completed.
  • Preserve pre-selected facilities on mixed POS and Shipsi carts instead of replacing them with defaults.

Product sync history and bulk operations

Product sync work focused on making existing Shopify catalog updates visible and operational in OMS. Product update history is now exposed through REST for sync dashboards, and Shopify product indexing runs after the sync transaction commits so search reflects committed product changes.

The product sync path also picked up targeted fixes:

  • Fixed an issue where sometimes the wrong shop Id was saved in the product update history.
  • Fixed a product sync failure where category and attribute writes could run before the Product record had a productId.
  • Fixed a product sync regression where variant products were not queued for search indexing.
  • Record a cancelled Shopify bulk operation with a status that lets product update sync continue.

Sources: hotwax-shopify-oms-bridge#186, hotwax-shopify-oms-bridge#199, hotwax-shopify-oms-bridge#153, hotwax-shopify-oms-bridge#149, hotwax-shopify-oms-bridge#181, hotwax-shopify-oms-bridge#130, hotwax-shopify-oms-bridge#155, mantle-shopify-connector#326, mantle-shopify-connector#328, mantle-shopify-connector#329, hotwax-shopify-oms-bridge#203, hotwax-shopify-oms-bridge#211, hotwax-shopify-oms-bridge#161, oms#533, oms#489, oms#494, oms#479, oms#563, mantle-shopify-connector#312, mantle-shopify-connector#303, mantle-shopify-connector#300, mantle-shopify-connector#324

Carrier integrations

Carrier setup now has a single setup service for store and facility carrier accounts. One setup call validates the product store, carrier, facility, and gateway auth ID; creates the Unigate credential record when that auth ID is new; and creates the OMS carrier configuration and billing configuration records. The same gateway auth ID can be reused across facilities, so teams do not create another credential record when multiple locations use the same carrier account. The setup also blocks duplicate carrier accounts for the same product store, carrier, and facility.

Once a carrier account is configured, the same account selection now follows every shipping action that uses it. Rate shopping, label generation, label voiding, and address validation all read from the same carrier account record across OMS, Poorti, and Unigate, instead of each flow reconstructing which carrier credentials to use.

Rate shopping now supports a multi-option response from shipping gateways. When a carrier returns multiple services, HotWax can keep each option's service, cost, delivery estimate, and carrier rate ID together, then carry the selected rate into the label request. That lets fulfillment teams compare carrier options before buying the label and keeps the final label tied to the rate that was selected.

Carrier setup, labels, and rates also picked up targeted improvements:

  • Route label, rate, void-label, and address-validation calls through the configured shipping gateway service.
  • Return carrier errors in the same shape across C807, Canada Post, FedEx, Purolator, Shiphawk, and DrivIn for faster troubleshooting.
  • Include the company address on label requests so carrier labels receive shipper address and contact data from the same payload.
  • Add C807 label/artifact support and DrivIn post-order and delete-order services.
  • Pass shipment method type into carrier label requests so ship-to-store orders can suppress COD where required.

Sources: hotwax-unigate#72, hotwax-unigate#76, hotwax-unigate#50, hotwax-unigate#54, hotwax-unigate#55, hotwax-unigate#38, hotwax-unigate#46, hotwax-unigate#71, hotwax-unigate#35, hotwax-unigate#48, hotwax-poorti#243, hotwax-poorti#253, oms#491, oms#555, oms#559, hotwax-oms#452, hotwax-oms#556, hotwax-oms#531, hotwax-oms#565

Email integrations

OMS now creates email events through Unigate, prepares the gateway payload, creates communication records after the Unigate response, and sends order-event email work through explicit field mapping instead of passing the full order object around. Pickup, rejection, and BOPIS completion emails now send after the main order action is saved, so creating the communication record does not hold locks while fulfillment work is still being completed.

Sources: hotwax-unigate#67, hotwax-unigate#61, hotwax-unigate#62, hotwax-unigate#64, hotwax-unigate#69, hotwax-unigate#77, hotwax-unigate#58, hotwax-unigate#68, hotwax-unigate#57, oms#509, oms#480, hotwax-poorti#246, oms#555, hotwax-oms#522, hotwax-oms#523, hotwax-oms#564

New services and permissions

Store operations

Transfer order lists can now ask for only the fields they render, sort transfer orders, and filter by multiple statuses reducing the payload size significantly. This is expected to improve the performance of the list view in the Transfers app.

Inventory Count moved off deprecated inventory-count APIs inline with planned timelines. The session detail pages also gained device-persisted sorting by uploaded order, alphabetical order, or last updated time, so count teams can work a session in the order that matches their floor process.

Sources: transfers#225, transfers#226, transfers#227, transfers#229, transfers#233, transfers#235, transfers#201, transfers#217, oms#554, oms#476, oms#474, receiving#674, fulfillment#1607, transfers#234, transfers#232, bopis#775, inventory-count#1398, inventory-count#1399, hotwax-poorti#247

API release log

Admin and migration work was mostly API and permission coverage. The highlights for teams that need the implementation detail:

Environment and app migration:

  • System information and component-list APIs now return deployed instance details, release, commit, component versions, branches, and tags.
  • Job Manager can show a new-app redirect only after checking the instance version.

Permissions:

  • Logged-in user permission lookup now supports pagination.
  • Supplier-agent role data, cycle-count permissions, and transfer-order cancellation permissions were added.

Setup and integration configuration:

  • Product Store setup can fetch default currency options during creation.
  • Shared system-property lookup is available for integration services.
  • NiFi integration services can call NiFi REST APIs from Maarg.
  • Data Document, Data Feed, and entity-definition management APIs are available for setup tools.

Operational logs and jobs:

  • Data Manager logs now link to queued integration messages and service job runs.
  • Audit log APIs and changed-by user lookup are available for service job edit history.
  • Data Manager log search can sort by last updated time.
  • Service job list and update APIs include service and job parameters.

Search and maintenance:

  • Search APIs can return facets and response headers for admin search views.
  • Inventory utility responses now return default values for empty inventory fields.
  • Product-store email setup no longer fails when saving Unigate-backed email settings.
  • The order status field length was aligned across OMS services so longer status flow IDs can be saved.
  • Apache Tika dependencies were updated for security maintenance.
  • An Order Routing SQL template separator was fixed.

Sources: hotwax-maarg-util#97, hotwax-maarg-util#83, hotwax-maarg-util#60, hotwax-maarg-util#73, hotwax-maarg-util#74, hotwax-maarg-util#79, hotwax-maarg-util#84, hotwax-maarg-util#58, hotwax-maarg-util#65, hotwax-maarg-util#66, hotwax-maarg-util#87, hotwax-maarg-util#85, hotwax-maarg-util#82, job-manager#883, job-manager#888, job-manager#897, hotwax-oms#563, hotwax-oms#567, hotwax-oms#522, hotwax-oms#524, hotwax-oms#530, hotwax-ofbiz-oms-usl#22, hotwax-ofbiz-oms-usl#24, OrderRouting#115