Skip to main content

What’s new at Endless

Changelog

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

fix

Roles: Permission Changes Take Effect Without A Sign-Out

Adding or removing a role for someone who was already signed in used to need them to sign out and back in before the app noticed. Controls the server would now let them use stayed hidden, and controls they had lost stayed visible — until they re-signed in. The app now checks each person’s current roles when their tab regains focus, so a change made in Team & Roles takes effect on the next look at the tab, with no reload and no re-sign-in.

Roles are also scoped to the company you are viewing. Someone who is an admin of one company and an operator of another sees admin controls only in the company where they hold that role, instead of seeing them in both and then getting a Not authorized message from the server.

fix

Sales Orders: Search Runs Fast On The Largest Catalogs

The orders list search is faster and steadier. Filtering by an order number, a customer name or email, a SKU, a shipping name, a tracking number, a tag, or a sales channel returns in about a second on any catalog size, and the list stays responsive around it — a slow search no longer drags the rest of the app.

Before, on the largest catalogs, a keyword search worked through the whole order set and could take up to a minute and a half. Every order update refetched the list, so searches were stacking up in the background as orders arrived, and the slowdown reached beyond the list to the rest of the API — on 2026-08-20 that came out as a period of site-wide timeouts. The search now works through each part of what you type — order number, customer, item, tracking, channel — on its own path, and three of those paths (customer name on the shipment, product name, sales channel name) which used to have no fast lookup now have one.

fix

Exports: Progress Now Shows On Every Export Type

A running export now shows live progress on its Inbox card for every export type — products, suppliers, inventory (all three granularities), purchase orders, demand, historical inventory, historical shipments, and composition lines. Before, only order-family exports were reporting progress, so every other export sat at “Starting export” from the moment it began until the file was ready. A long-running export in one of those types could also be marked as failed while it was still running, because the timeout that catches a stalled export was reading the silence as a stall.

Two exports that had no upper row limit — historical shipments and composition lines — now honor the same row cap as the rest, so a very large export completes with a bounded file instead of running the row count up to whatever is on hand.

feature

AI Assistants: Progress Toward A Public Launch

Work is underway to let Endless connect with AI assistants like Claude and ChatGPT. The connecting, sign-in, and permissioning pieces are in place, and answers to a range of everyday order and account questions are being wired up. It is not open for general use yet — the pieces are still coming together internally, and access will open when we are ready to say more.

fix

A Tab Left Open Overnight Signs You Out

A tab left open past the point where your session expires now takes you to the log-in screen when you return to it, instead of sitting there with every request failing behind the scenes. Come back to a sleeping tab, sign in again, and carry on.

Nothing changes while you are working. Sessions last exactly as long as they did before.

improvement

Media And Images: One Upload Dialog, Broken Images Fixed

Uploading images from the Media library and from a product page now uses the same dialog. The two were built separately and looked and worked differently — different drop areas, different copy, and one started uploading on drop while the other staged files behind an Upload button. They now share the same shape and per-file progress with the filename, and stay a consistent size whether the page already has images or not. The Media library dialog starts uploading as soon as files are dropped, and you can add a second batch before continuing on to link them to products. Freshly uploaded images no longer render as a broken placeholder — 271 images in production across seven companies had been stuck that way — because uploads now match up through the upload request that started them, so the client-side row and the server-side confirmation always land on the same image record. And under the Associated Products heading, the search box now names what you can search on and what happens when you pick a result, so it reads as the way to add an association instead of a filter over the ones already there.

Behind the scenes, image-upload webhooks now record activity through the same path as other actions, so duplicate deliveries no longer create duplicate rows, and image archive and bulk-upload actions show up in the activity feed. Archived timestamps record when the archive happened, so the value stays stable if the record is rebuilt. A few smaller cleanups landed alongside: unused arguments dropped off four of the five media actions that never read them, and a redundant ownership check that the caller already guaranteed came out.

improvement

Small Interface Polish

Six small fixes across the app.

Product sheet: smoother tab switching and scrolling. Switching between the Key Info, Images, and Relationships preset tabs on the product sheet, and scrolling down a catalog with large product photos, used to stutter — every cell was being rebuilt on each tab change and every image in the row was being decoded whether it was on screen or not. Tab switches, quickview open and close, and vertical scrolling now stay smooth: cells reconcile in place instead of remounting, images decode only when they come into view, and the Images column caps at four thumbnails with a +N overflow label so a row with dozens of photos no longer pulls all of them at full resolution.

Order detail tables sort. Two tables on the order detail view sort now. Order items sort by item, price, discount, quantity, or total; fulfillment items sort by product or quantity. Blank values move to the bottom, equal values keep their original order, and sorting is disabled while you are in bulk edit or single item edit, since those modes need to hold the original row order.

Sidebar collapse preference sticks. The sidebar’s collapsed or expanded state sticks across page loads. Toggling by click or with the ⌘\ shortcut saves the choice right away, and returning from a narrow viewport — where the sidebar auto-collapses — restores the last preference you set rather than an older one. The ⌘\ shortcut is disabled inside Settings, where the sidebar always stays expanded.

Date picker: sized right and stays on screen. The date picker’s day-number grid is the same size as the weekday row and the month/year caption above it. Day numbers had been sitting a step larger than everything around them since the shared calendar was inheriting the browser’s default text size, so the fix touches every date field in the app — Purchase Order Issue Date, Shipment Received Date, and every other picker built on the shared calendar. The popover also no longer sits flush against the edge of the browser window. Opening a date field close to the right edge — the Received Date on the Shipment quickview was the reported case — had been clipping the popover off screen; it now keeps eight pixels of padding from the edge on both sides, so even the wide three-month range picker stays fully visible down to iPad mini widths.

Sales channel picker searches and no longer stops at twenty. The sales channel dropdown used across the app only ever loaded the first twenty channels and had no search, so companies with more than that could not pick their older channels from anywhere — and integration data mappings pointing at those channels rendered a raw ID instead of the channel name. The picker is now a searchable list. It shows the twenty most recent channels by default, searches by name against the server, and always resolves the currently selected channel by ID so the name shows up even when the channel sits outside the loaded page or has been archived. Integration Data Mapping tabs read the channel name straight off the mapping, so archived channels and channels past the old cap render with their real names in place of the ID they used to show.

Product confirmation modals: body copy is the right size. The body copy in the Clone Product, Archive Product, and Unarchive Product modals was rendering larger than the modal title above it. All three share one modal underneath, so the fix lands on all three at once. The description now uses the smaller size that matches the rest of the modal.

improvement

System Updates: Renamed From Activity

The company-wide feed of human-written notes on entities is now called Updates. In the system sidebar it reads Updates rather than Activity, and its page has moved from /system/activity to /system/updates. Bookmarks pointed at the old URL will not resolve.

Activity is now reserved for system-generated logs — the ones on entity detail pages and the Recent activity card on the dashboard — so the two feeds are named for what they are. Same notes, same replies, same feed.

feature

Fulfillment Order Numbers: Pick The Format

New fulfillment order numbers can now follow one of three formats. The default keeps today’s shape: the order number followed by -FO- and six random hex characters, like SO12345-FO-4414A3 (a small change from the five hex characters used before). The two other options are SO12345-FO1, an order number plus a per-order sequence, and FO-4222A3, a plain code with no order prefix.

Pick a format under Settings → Creating Fulfillments → Fulfillment Order Numbers, and it saves the moment you select it. The choice applies to fulfillments created from then on; existing fulfillment numbers are never rewritten. Downstream systems that treat the fulfillment number as an opaque identifier keep working across the change.

feature

Recent Activity On The Dashboard

A Recent activity section at the bottom of the dashboard lists what’s happened across the company — order changes, product edits, inventory movements, integration events — with each entry linking to the record it came from. The list scrolls back through older history instead of stopping at a fixed count.

The Activity card on individual orders and products keeps the same behavior, and now scrolls into older entries the same way.