Version 2026.5
Merchant-Scoped Allowed Countries
The Allow Countries setting can now be set per Merchant, so a 3PL serving clients with different international footprints no longer has to settle on one global list. Set a Merchant-specific list at System -> Configuration -> General -> Countries Options by switching the configuration scope to that Merchant; Merchants without an override continue to inherit the global list.
The Merchant's own list is honored everywhere destination countries matter: the country selectors on Admin and Client UI order creation, order validation through the APIs, and the destination check at shipment time — so an order accepted for one Merchant is never blocked later by another Merchant's settings.
Harmonized System Code Terminology and Export Disclaimers
The product Export tab now uses standard customs terminology so the fields match what you'll find in classification databases and carrier paperwork. The field previously labeled HTS Base Code is now Harmonized System Code — the 6-digit internationally standardized HS code in the format ####.## (e.g. 8471.30) — and HTS Country Code is now HS Code Extensions, the country-specific extensions to the 6-digit code (for imports into the United States, the last 4 digits of the 10-digit HTS code). Updated notes under each field explain the expected format, and product imports accept the new column names hs_base_code and hs_country_extension while the legacy column names continue to work.
The rename goes all the way down: the product attribute codes themselves are now hs_base_code and hs_country_extension, matching the field names already used by the Global API. The legacy hts_* names remain accepted at every external boundary — Merchant API input, product import columns, and plugin rate/shipment payloads — so existing integrations, saved import templates, and scripts keep working.
The Export tab (in both the Admin and Client UI), the export and customs configuration sections, and the Regulations screens now also display disclaimers clarifying that you are responsible for the accuracy of export classification data and for compliance with shipping regulations.
attributes selector should switch from hts_base_code/hts_country_code to hs_base_code/hs_country_extension; the standard product.info response includes both key sets.Replenishment Policies and Location Profiles
Keeping pick faces stocked has always depended on someone noticing they're running low. ShipStream can now watch for you: define Replenishment Policies with a Trigger DOI and Target DOI (days of inventory), and ShipStream flags every SKU whose coverage in a chosen set of locations has fallen below the trigger — including SKUs that are selling but were never slotted there in the first place.
- Location Profiles (Operations -> Warehouse -> Location Profiles) are named, reusable sets of Locations defined by match criteria such as Zone, Rack, or Location Tags. Slotting Rules and Replenishment Policies share them, so one "Forward Pick" definition can serve both, and the grid shows exactly which rules and policies use each profile.
- Replenishment Policies select SKUs by Merchant, Product Profile, or Handling Class and pair them with one Location Profile and a days-of-inventory band: when a SKU's coverage — its on-hand in the profile divided by its recent daily pick rate — drops below Trigger DOI, it is flagged with the quantity needed to restore Target DOI. Policies are evaluated in your chosen order, and the first matching policy governs each SKU.
- The Replenishment report shows each flagged SKU with a Replenish status (stocked in the profile but below trigger) or Slot status (selling, but not yet assigned a location in the profile), along with its current days of inventory, the suggested move quantity, and how much stock is available elsewhere in the warehouse to cover it.
SKUs that Slotting Rules forbid everywhere in the profile are excluded automatically, so every flag is one your team can act on. Together with Slot Capacities, this lays the groundwork for directed put-away guidance.
Smarter Packing Weight Checks
The packing weight check now uses a tolerance band instead of a single flat percentage, so it can be sensitive enough to catch a missing item in a small package without flagging normal variance on a heavy one. The allowed difference is a percentage of the expected weight, kept between a new Weight Check Difference Minimum and Maximum, and widened to your scale's precision so a coarse scale's rounding never causes a failure on its own. When a check does fail, the packer now sees the measured weight and the exact accepted range instead of a percentage, making it much easier to spot what went wrong.
Configure the band per merchant at System -> Configuration -> Warehouse -> Scanner -> Packing (defaults: 4%, 0.1 lb Minimum, 2 lb Maximum) and set each warehouse's Scale Precision under Scanner -> General to match its scales. The Minimum, Percentage, and Maximum can also be tuned for individual Shipments from a Packing Start Script. See Packing Weight Check for the full details.
DHL Express via EasyPost
DHL Express is now available as an EasyPost-backed carrier, bringing international express shipping — DHL Express Worldwide - Documents and DHL Express Worldwide - Non Documents — into the same setup flow you already use for other EasyPost carriers: enable the carrier, choose EasyPost as the Integration Provider, attach a DHL Express carrier account from your EasyPost dashboard to a Shipping Account, and select the allowed methods. Labels, customs documents, tracking, and refunds all flow through EasyPost, and both services are available as methods on merchant rate plans.
Customs paperwork is handled automatically per service: Non Documents shipments send your full commercial customs data, while Documents shipments are declared as documents built from the actual package contents — no product customs data required. Sender Tax IDs (VAT, IOSS, VOEC) are passed along as well.
Shipments are validated against DHL's current published limits before a label is attempted, so an oversize package or an over-weight Documents shipment (the Documents service is limited to 4 lb / 2 kg billable weight) is rejected up front with a clear message instead of a cryptic carrier error. Section II lithium-battery shipments (PI966/PI967) are declared automatically based on the products' hazmat settings.
Automated Order Cancellations via EDI (SPS Commerce)
When a trading partner cancels a purchase order over EDI, the cancellation no longer sits in an error queue waiting for someone to notice — with the risk that the canceled order ships in the meantime. The SPS Commerce integration now processes inbound Orders documents with TsetPurposeCode 01 (Cancellation) automatically, matching them to the Order created from the original EDI document and acting according to a new per-subscription Order Cancellation Policy:
- Immediate Only - The Order is canceled outright; if it cannot be (for example, fulfillment is already underway), the document is flagged for manual handling.
- Immediate with Cancellation Request fallback - Orders already being fulfilled receive a Cancellation Request instead, so warehouse staff decide whether to stop the shipment or let it go.
A cancellation that arrives for an already-canceled Order is treated as success, and one that arrives before the original order document has finished processing is retried automatically.
With the companion Send Cancellation Ack option enabled, an 855/OrderAck reports the outcome back to the trading partner — sent only once the outcome is final: the Order is canceled, or the cancellation request is rejected because the Order shipped anyway.
Slot Capacities
Answering "how full is my warehouse, really?" requires knowing not just what is on each shelf, but how much could be. This release lays that foundation: ShipStream now computes how many units of each product fit in each kind of slot, automatically, from the dimensions you already maintain.
- Stock Location Types are now Slot Types. The clearer name reflects what they describe — the physical slot on the rack. The rename carries through the admin menus, grids, the Stock Locations import, and the Global API, and your existing role permissions are updated automatically.
- Slot Types can declare their physical capacity. Enable Fixed Capacity on a Slot Type to record its interior Width, Height, and Depth, plus an optional Weight Capacity.
- Capacities are computed for you. For every product and fixed-capacity Slot Type, ShipStream determines how many units fit using the product's dimensions, weight, and Can Tip setting — a volumetric estimate governed by a configurable Volumetric Efficiency (default 90%), sharpened by the ShipStream Packer bin-packing pass, and optionally refined further by Paccurate. Products and slots that share the same physical profile share one result, and capacities recompute automatically when dimensions change.
Computation methods are configured at System -> Configuration -> Warehouse -> Stock -> Slot Capacity. These per-product capacities set the stage for slot utilization insights and smarter put-away guidance built on top of them.
Other Improvements
- Added an
hs_base_codefield to the External Shipping Method API rate and shipment request payloads alongside the legacyhts_base_codefield, which remains supported as a deprecated alias.
Bug Fixes
- Fixed Delivery processing on the Scanner counting against the wrong line when a Delivery listed both the case SKU and the singles SKU of the same Quantity-type product. Scanning a singles barcode opened the case line and counted a fraction of a case, leaving an overage on one line and a shortage on the other. Each barcode now counts against its own line, and the counter still accepts either barcode when only one of the two SKUs is on the Delivery.
- Fixed the Scanner Allow Partial Batches toggle not flagging a Preset + Asset Type selection as unfillable when the cart is limited by weight or volume (for example a Steel Picking Cart). With Allow Partial Batches off, those selections now grey out Quick Batch / Next Up and show "Not enough shipments to create a full batch" as soon as the entire matching queue cannot reach the cart's weight or volume cap — not only when the shipment count is short of the cart capacity.
Global API Updates
- Updated the Location resource: the
location_typereference is renamedslot_type, and its resource typeLocationTypeis renamedSlotType. This applies to responses, create/update requests, andinclude/fields/sort/filter parameters on the warehouse locations endpoints. Requests using the old names are rejected, so update integrations alongside this release.
Merchant API Updates
- Added
hs_base_codeandhs_country_extensionfields to product info responses alongside the legacyhts_base_codeandhts_country_codefields. Product create and update accept either naming (when both are supplied, thehs_*value wins), and the legacyhts_*field names remain supported.
- Added a
containersproperty to thedelivery:committedanddelivery:completewebhook payloads so integrations can capture container-level contents and lot quantities at commit/complete time without a follow-updelivery.searchcall. Each container matches the existingdelivery.searchcontainer shape (contentswith per-lotqty_countedandqty_shortage); lot-tracked content also includes the commit quantitiesqty_processed,qty_putaway, andqty_committed, which are webhook-only and are not added todelivery.search. The array is always present and may be empty.
- Added an optional
detailsarray on each SKU row instock_adjustmentsfor theinventory:adjusted,delivery:committed, anddelivery:completewebhook payloads (and any other topics that includestock_adjustments). Each detail breaks the adjustment down bylot_idand eitheradjustment_reason_codeorhold_reason_code; hold/release details also includeqty_held. SKU-levelqty_adjustis unchanged and equals the sum of its details.detailsis omitted when there is no lot or reason breakdown.