Skip to main content

What’s new at Endless

Changelog

The latest features, improvements, and fixes across Endless Commerce.

fix

Shopify: Failed Single-Order Imports Now Surface Instead Of Silently Doing Nothing

Manually importing an older Shopify order used to look like nothing happened — no order, no error, no note anywhere. The failure was always there: Shopify blocks import of orders older than 60 days without an extra permission grant, and that failure was getting silently dropped instead of shown.

Failed imports now log a clear line against the Shopify integration explaining what happened — whether the order couldn’t be found, the connection needs to be reconnected, or it’s a temporary issue that will retry on its own. Actually pulling in orders older than 60 days still needs a permission change on our end — that’s a separate follow-up.

feature

Suppliers: Optional Handle

Suppliers now carry an optional handle — a URL-friendly identifier, unique per company where set. You can set it when creating a supplier (the create dialog suggests a kebab-cased handle from the name and lets you override it) and edit it later from the supplier detail page’s Actions menu. Two suppliers in different companies can still share the same handle, and the field is validated to lowercase letters, numbers, and hyphens up to 50 characters. The suppliers list has a Handle column (hidden by default, toggleable from column settings), and the supplier detail page shows the handle inline in the header. Uniqueness is enforced by a partial unique index (company_id, handle where handle is present).

improvement

Edit A Fulfillment Without Claiming The Order

Fulfillment-owned details — the shipping address, carrier and service, notes, B2B info, external ID, and decompose / recompose — can now be edited without first claiming authority over the sales order. These edits were always allowed; the app was gating them behind the same authority as order-structure changes. Order structure itself still needs authority; only the fulfillment-scoped fields opened up.

improvement

Fulfillments: Gift Message Inherits From The Order

A fulfillment’s gift message now falls back to the order’s gift message whenever the fulfillment doesn’t have one of its own. Setting a gift message on the fulfillment still overrides the order, same as before. Outbound payloads to ShipStation, ShipHero, Packiyo, MasonHub, and Infoplus use whatever the fulfillment resolves to — so a gift message set once on the order shows up on the shipping label without having to be re-entered on every fulfillment split from it.

improvement

Carriers: Kingsgate Logistics Added

Kingsgate Logistics LTL Freight is now selectable as a carrier alongside the rest of the built-in carrier list. Pick it from the carrier picker anywhere a carrier is set — no SCAC or tracking URL is prefilled, so those stay editable per shipment.

improvement

Sales Channel And Warehouse Mapping: Many Internals To One External

Multiple internal sales channels can now map to a single external store on the same integration — for example, Faire USA and Faire Canada both pointing at one “Faire” store in ShipStation. Warehouse mappings work the same way (two internal buildings, one ShipStation ship-from address). Before, the mapping refused to save with an “already mapped” error, because a defensive uniqueness rule assumed one internal per external per integration.

The mapping modals have been inverted to match. The internal value is now the row, and the external ShipStation option is the dropdown — the reverse of the old layout. That’s the shape you need to have many internals pointing at one external, since whichever side owns the rows is the side you can repeat. Each internal channel or building can still only claim one external key, so mistakes like the same building mapping twice are still caught.

feature

Automations: Order Approved Trigger

Automations can now run the moment an order gets approved — the transition from draft or pending into ordered. Pick Order Approved as the trigger, and conditions and actions that only make sense after approval — checking the sales channel, applying a routing strategy — are available from the same picker. Approvals coming in through less common paths still route to the right company automatically.

fix

Orders: “Order Created” Now Shows In The Timeline

Orders now log an “Order created” entry on their activity timeline, with the name of the person who created it, the moment they’re created — whether they come in as draft, pending, or ordered. Before, the timeline was blank until the first later action, so there was no record of who created an order or when. Existing orders without a create entry stay as they are; new ones from here on carry the line.

feature

Product External Identifiers: A Registry For How Partners Know Your Products

Each product now has a place to record how outside systems identify it — Amazon’s ASIN, Whole Foods’ UPC, Target’s TCIN, and so on — kept in one registry per product rather than scattered across integration configs. On the Relationships tab of a product, a new grid lets you add, edit, and remove these identifiers, with a Linked / Unlinked badge so you can see at a glance whether an identifier is already attached to a specific connected integration or is sitting in the registry waiting to be linked. Adding one pulls the partner name straight from the connected integration you pick, previewing exactly how it will be stored once linked, and duplicate entries surface a clear message instead of a silent failure.

From the integration side, a new Link External IDs action on the integration’s Actions menu opens a bulk-link modal that attaches all of an integration’s unlinked identifiers at once by partner name. Linking runs as a background job, so a big backfill returns to you immediately and completes on its own. Linked rows are click-throughs — opening the connected integration in a stacked side view without leaving the product page.

Underneath, this is a first-class registry with its own permissions and audit trail; every add, edit, remove, or link event is captured. Inbound order ingest already reads this registry to resolve products from partner-supplied identifiers — see the separate EDI 850 entry — so what you curate here directly drives how partner orders find their way to the right product.

fix

Bundles Sharing Components Allocate On A Single Fulfillment

Two lines on the same fulfillment that resolve to the same product in the same warehouse — two bundles that share a component, or a bundle plus a standalone line of that same component — now allocate together instead of stopping with a “split these items into separate fulfillments” message. The two lines are added up, allocated against the summed quantity, and split back across the lines with each keeping its own identity, and the commit that follows decrements the location once by the combined amount rather than by whichever line wrote last.

The same aggregation now runs during the availability check when you edit items on a fulfillment, so two lines of the same product whose combined increase would exceed stock are rejected together instead of each passing a check that only saw its own share.