ShipStream Knowledge Base

Version 2026.6.2

2026.6.2TBD

Amazon Shipping (v2) and 3PL Buy Shipping

Sellers and Amazon-enrolled 3PLs can now buy Amazon labels through Amazon Shipping (v2). ShipStream looks at the rates Amazon offers for the whole Shipment and chooses among them using your own prices, so label costs follow your Rate Tables rather than whatever Amazon lists first. A 3PL can buy shipping for the Orders of the sellers it fulfills for, using the carrier accounts linked to its Amazon connection.

On-time delivery (OTDR) protection is bought only when it fits the premium you allow for each package, as a fixed amount or a percentage of the package's baseline price, so protection never quietly inflates a label. Every Shipment's comments explain the prices considered and why a rate was chosen. Each label keeps the account that bought it, so voiding and tracking keep working after you change settings, and a purchased label whose document could not be retrieved or saved can be recovered without buying it again.

Configure it at System -> Configuration -> Shipping Methods -> Amazon Selling Partner. See Amazon Selling Partner for setup, pricing rules, and 3PL requirements.

Update Impact: None. Existing sites stay on Merchant Fulfillment (v0) until you choose Amazon Shipping (v2). Before switching a Merchant, disable Require Rates from Preferred Carrier and use Order Item Ref Check to find open Orders whose items have no Order Item Ref, which Amazon Shipping (v2) requires. Amazon Shipping (v2) buys labels for normal goods only.

Mark-For Stores

Retail consolidation programs ship cartons to a distribution center but need each carton labeled for the final store. An Order can now carry a Mark For store alongside its ship-to Location, chosen from the same Retailer Locations catalog, so the store stays attached to the Order through picking, packing, labeling, and EDI instead of being retyped or lost along the way.

Choose a Mark-For Location in the Retailer popup when creating an Order, or supply it in an Order import or through the API. It appears as Mark For on Order and Shipment pages in the Admin UI and Client UI and on the Scanner packing screen, so packers can confirm carton labels at a glance. The optional Display Mark-For Store packing slip setting prints the store's name, number, and address below the shipping address.

For Orders received from SPS Commerce, the 850's Mark-For party is saved with the Order, GS1-128 SSCC labels fill their Mark-For zone from it, and the outbound 856 ASN includes the Mark-For party that retailers require on consolidation Orders.

Update Impact: None. Display Mark-For Store is off by default, so existing packing slips are unchanged until you enable it under System -> Configuration -> Packing Slip Design. Retailer Locations are no longer made a Retailer's default Ship-To automatically; check Default Ship-To on a Location to preselect it on new Orders.

Bug Fixes

  • Fixed photo uploads that reported "Photos uploaded successfully." when nothing was saved. The Admin UI, Client UI, and Scanner now show why a photo was rejected, and a rejected photo is removed from the upload list instead of looking uploaded. JPEG photos saved with a .jfif, .jpe, .jif, or .pjp extension, which some browsers and devices produce, are now accepted.
  • Fixed signing out of ShipStream leaving the Microsoft session in the browser for users who have End Social Login Session on Sign Out set on some of their User Roles but not all of them. The Microsoft session is now ended when any role assigned to the user has the option set, and later Microsoft sign-ins on that browser ask for credentials instead of listing remembered accounts. Leave the option No on every role held by users who sign in from a personal computer. See Social Login.
  • Fixed the Utilization column on the Locations grid and the Capacity indicator on the Location page staying out of date after a Product's weight changed, for Locations that have a Max Total Weight. Editing a Product, using the Update Attributes mass action, or importing Products now refreshes the affected Locations within about a minute.

Global API Updates

  • Added an opt-in mark_for_location field on Orders and Shipments (/v1/shipping/orders, /v1/shipping/shipments) referencing the Retailer location the cartons are marked for, with the same nested field expansion as retailer_ship_to_location.
  • Fixed paging on endpoints that scope their results before paging, such as GET /v1/inventory/warehouses/{id}/replenishment-report, when a plain record id cursor is combined with a non-id sort. The page boundary is now resolved only from records within the request's scope, so rows are no longer skipped or repeated at a page boundary. A plain id cursor that refers to a record outside the requested scope, such as a Product not stocked in the requested Warehouse, now returns a 400 "record referenced by the cursor no longer exists" response.
  • Fixed Product weights and dimensions reporting values in a different unit from the unit named in the response, so each value now matches its unit label.

Merchant API Updates

  • Added a packages array to each entry in the rate.quote rates response, so an integration can compare rates using the expected size and weight of each package. Every physical package has its own entry, including packages with identical measurements, and the count matches package_count. Each entry contains warehouse_id, length, width, height, dimension_unit, weight, and weight_unit, where weight is the estimated packed weight including packaging. Unknown measurements are returned as null and never as zero. Existing response fields and rate calculations are unchanged.
  • Added a mark_for_location option on order.create that matches an existing Retailer location by qualifier and code. For Wholesale Retailers, a code that matches no location is rejected unless location auto-creation is enabled, in which case the store is created from the address fields supplied. order.info and shipment.info return a mark_for_location block including the store's address, and order.search and shipment.search return it when requested through fields.