Table of Contents

Version 2023.2

Colin Updated by Colin

November 20, 2023
Most of the bug fixes and many of the features and optimizations have already been backported and deployed to previous versions, but are documented here for the record.

Driver's Documents

The documents that some carriers provide and require when sealing a manifest (for example, USPS SCAN forms) are now referred to generally as Driver's Documents. The process of downloading them from the shipping API integrations in some cases can be very slow or unreliable. We've made this an asynchronous process so the user can do other things while waiting and can easily check back on the progress if no documents are received or see when and where they were printed as well as a button to reprint them from the Scanner UI.

Update Impact: None.

More Manifest Couriers for DHL eCommerce and UPS

If your DHL pickup driver is requiring separate manifests for specific DHL eCommerce services, or your UPS driver is requiring a separate manifest for UPS Mail Innovations packages, we've got you covered! Enabling these in the configuration will cause packages to be routed to new manifest couriers.

System > Configurations:

  • Shipping Methods > DHL eCommerce > Use Separate Manifest Code for SmartMail Services
  • Shipping Methods > UPS > Use Separate Manifest Code for Mail Innovations
Update Impact: None. These configuration options are not enabled by default so you need to enable them if you want the new behavior.

Filter BFOs by Target Ship Dates

You can now filter Bulk Fulfill Orders by Target Ship Date with more flexibility!

Update Impact: None. However, the default option is now "Up to and including {today}" whereas the previous default was "Include Future Target Ship Dates: No" which would be equivalent to "Any day" with the new options.

Inventory Lock Contention

Database systems use row-level locking to ensure that simultaneous updates to the same row can be serialized to avoid one update having unexpected effects on another update. For "hot" rows (such as a product associated with a large number of orders) this can cause performance degradation as different processes are forced to wait on one another. To partially alleviate this lock contention between multiple processes we have rearranged our inventory tables into six separate groups of columns so that different types of operations (such as picking and order submission) that affect the same products do not have to block one another since they don't update the same columns.

TL:DR; User operations such as picking, packing, and inventory adjustments will be much less affected by heavy activity on the same SKUs resulting in a more consistent and better user experience and increased overall throughput of work.

Update Impact: None.

Performance Optimizations

We've dug deep and found many more ways to optimize the performance of the system in specific areas as well as overall.

  • Improved overall response time for many requests on systems with a large number of merchants.
  • Measurably faster response times to inventory.list and inventory.detailed API calls.
  • Order of magnitude faster response times for API calls in some edge cases.
  • Submitting orders is 2-15 times faster and the portion of time spent locking inventory is in some cases reduced by half.
  • Faster order reallocations, particularly for committing new inventory with a large number of backorders (depending on several factors).
Update Impact: None.

Device Hub

  • Add Upgrade Center tool for mass upgrades
  • Add Network Diagnostic tool
  • Many improvements were made to the client software. See release notes for Device App 1.8.14 and Device Service 2.3.18
  • Add negate option to filters
  • Manual Serial Scale setup now lists only present COM ports with description of COM port device if available
  • Fix search and filter issues for devices and event logs
  • Fix Add/Remove device on mobile
  • Fix connected clients count and add total or filtered device count and total or filtered log count
  • Fix Machine Filter for Logs
Update Impact: None. A user must opt-in to the client software upgrades locally via the Device App or remotely via the Device Hub.

Other Improvements


  • Sanitize date input values for lot tracking info to prevent recording obviously incorrect values (e.g. 0024 is assumed to mean 2024) - auto-corrected existing data entry errors
  • Fixed slow add/remove package from large Manifests
  • Fixed batches created using wrong locations violating burn order in some edge cases
  • Fixed a condition that could cause a SKU to have a negative "Picked" quantity
  • Fixed a unexpected error that could occur when adjusting inventory via the Admin UI
  • Fixed auto-assigned locations when generating a Bulk Fulfill Order to choose unreserved locations rather than reserved locations in some cases
  • Fix setting Special Supplies attribute via product import
  • Added Warehouse and Tracking Numbers fields to delivery email templates

Scanner UI

  • Fixed number of labels printed upon clicking Finished Receiving to match the number submitted by the user rather than the number of original containers
  • Fixed delivery items unable to be put-away when the Lot Type was changed during receiving to one that had no user input fields
  • Improve client-side and server-side validation of Collected Data to prevent extra scans from causing multiple data collections in edge cases


  • Improve handling of unusual tracking details and errors
  • Added times to all status icons
  • Added informative icons and tooltips to map markers
  • Color coded bullet points of tracking details


  • Capture the Commercial Invoice and CN22 documents from the create shipment response


  • Shopify order notes are now captured as Internal Notes and Shopify Fulfillment Request message is now captured as an order comment instead of Internal Notes
  • Shipments with multiple packages are now recorded as a single Fulfillment rather than one Fulfillment per package to avoid race conditions as Shopify splits partially fulfilled Fulfillment Orders
  • Automatically re-link new Fulfillment Requests to existing orders after uninstalling and re-installing the app

SPS Commerce

  • The Vendor ID field is no longer required or used for matching incoming documents to Merchant Integrations - only the Trading Partner ID is required. The Vendor ID was moved to the Inventory Advice configuration as it is still needed when generating Inventory Advice documents.
  • Support incoming order items to match products by Barcode and Vendor SKU attributes
  • Return the originally requested Buyer Part Number and Consumer Package Code with Order Ack and Shipment documents
  • Added the origin warehouse address with type code SF to generated Shipment documents
  • Improve out-of-the-box mapping of shipping methods to standard Carrier Routing values for generated Shipment documents
  • Added a Shipment Transformation Script to provide more flexibility when formatting the 856/Shipment document

Merchant API Changes

  • Updated the order.create method to accept barcode and vendor_sku keys for order items to support product matching by these fields in addition to sku.
  • Added a fifth parameter to order.create called $flags which provides the ability to add a unique_order_ref key which may be true or a string indicating a time since which the order_ref must be unique.
  • Added a package:packed webhook topic for when the package advances to packed status, whether from packing or from tracking_required .
  • Added package_id to anywhere a package is returned in the webhook payloads (e.g. shipment:packed )
  • Fixed inventory:adjusted event was not firing after location import.
  • Added shipment_id and updated_at to the shipment:* events.
  • Added packaging features to the packages[] data for the shipment:* webhook topics and method using the key packaging .
  • Added some missing fields to shipment:* webhook topics to bring them to parity with the return value for
  • Added status to the packages[] data for the shipment:* webhook topics and method.
  • Added delivery_type to all delivery:* webhook payloads to distinguish ASNs from RMAs.
  • Return a files field when using delivery_label.create with a return_service_type of print_or_download so that the generated return label may be downloaded via the API.
  • Allow the files field to be returned on request for and methods.

Grid Changes

  • Add 'Tracking Status' column to Packages grid

How did we do?

Version 2024.0

Version 2023.1