Release notes
Execute, for one store
Highlight
Execute, for one store. Execute shows the routes that are on the road right now, which makes it the page a store manager most wants and has been least able to get. Access to it was organization-wide: to watch the routes leaving your own store, you needed a role that could see every route in the business, and most organizations reasonably decline to hand that out. So the person closest to the problem asked someone further away to look.
Store-scoped access is now a role you can grant.
- The page is the same page. A user scoped to a store location opens the Execute they'd see anywhere else, the queue, the filters, the date control, the route detail panel, narrowed to the routes that touch their store. The scope is applied on the server, including the counts in the header, so a link to a route outside it returns an error rather than a partly-filled screen.
- Two permissions, granted from a role.
execute.viewopens the page and reads a route;execute.actchanges one. An admin grants either from the Add role and Edit role drawers, and the rows appear once your organization has Execute turned on. What a scoped user can do is still their role's decision, not a consequence of the scope. - Reassign the courier without escalating. A store operator with
execute.actcan move a route to a different courier from Execute. Vehicle assignment stays with unscoped users. - Record what actually happened. The route events an operator on the ground is the first to know about, a breakdown, an ad-hoc break, an overweight or oversize load, a refuel, a late departure, a customer not home, a catchment or break-compliance violation, can be logged by the person who saw them instead of relayed to an org admin.
See Who can open Execute.
New & improved
Platform API
POST /v1/inventorycommits the rows it can. A row naming a product or store location Nash doesn't have is skipped and returned in the same array witherrorCodeanderrorMessageset, while the rest of the batch writes, so a per-store feed carrying one stale SKU updates the store instead of being rejected whole. Discriminate onerrorCodebeing non-null, and match rows back by theexternalProductId/externalStoreLocationIdpair. See Store catalog.- A quoted or ID search in the Deliveries workspace reaches four more identifiers, the job, task, and delivery IDs, and the job's short reference code, so pasting a reference someone sent you finds the delivery more often than it used to.
- Event payload examples render again in the webhook event-type reference.
delivery.*,task.*, and several other families had been showing an empty example box, which made a live schema look like a missing one.
Orchestration
- A workflow action can link to the order's packing slip.
{{order.packing_slip_pdf_url}}interpolates the rendered PDF, the one a warehouse or partner kitchen can open and print, and{{order.packing_slip_zpl_url}}the raw label payload for a ZPL printer. Both resolve to nothing on an order with no slip.
Integrations
- Uber dropoff notes can carry a standing marker.
DROPOFF_INSTRUCTION_PREFIXsits ahead of the customer's own instructions so it survives truncation when they run long, andNOTES_SEPARATORcontrols what joins the segments, set it to an empty string when the note carries a token something downstream parses rather than prose a driver reads. *(Opt-in, per provider configuration.)* - Roadie can price a multi-component order as one parcel. A contract option collapses the components into a single manifest item with the package's own dimensions, weight, and value, so an assembled gift is quoted on the box that ships rather than on each piece inside it. *(Opt-in, per contract.)*
- Samsara route dispatch binds the vehicle as well as the driver, scoped to the shift window, so the truck arrives already assigned, and nothing outranks a pin an operator set in the Samsara dashboard outside that window.
- Shipday deliveries pick up the assigned courier's name, phone, and ID from routine refreshes, not only from webhooks. A courier Shipday assigned quietly now shows on the job.
- CBD manifest stops carry your package's external identifier as the source reference, so the stop is filed under the order number you'd quote when you call about it.
Portal
- Driver notes on a route stop show in Execute. A note a driver added on a stop appears beside that stop in the route detail timeline, the same way the batch view already showed it.
- Correct a dropoff address before dispatch. Edit Delivery gained Package, Pickup, and Dropoff tabs, and the dropoff address can be edited component by component when geocoding split a rural, PO Box, or otherwise ambiguous address the wrong way, which previously took an API call. Components lock once a task has a winning quote.
- Driver and vehicle pickers on Execute open only for routes you're running with your own fleet. A route with an external provider shows the assignment read-only, because it's the provider's to set, and a route with no provider chosen yet reads Assign provider.
- Searching Deliveries costs one query instead of several. The box waits a full second before it searches, names what you can search by, and stops the 30-second background refresh while a search is on screen.
- Cancelling a whole batch looks like what it is: a warning treatment, a button that reads Cancel batch, and a line stating how many remaining deliveries it covers. Single-delivery cancels are unchanged.
Nash Agent
- In a Slack channel, Nash answers when you mention it, and only then. Follow-ups inside a thread Nash is already in need
@Nashtoo. A thread that turns into a side conversation, or a message tagging a colleague, no longer wakes the agent. Direct messages are unchanged. See Talk to Nash in Slack. - Slack replies render as Slack's own blocks. Tables stay tables, an entity Nash looked up comes back as a card, and a chart renders where the data supports one, each with a plain-text version behind it.
- Preview a CSV without leaving the panel, and share where you are. The artifact panel renders a bounded table of a generated CSV, and the open artifact now lives in the URL, so a link you paste to a colleague reopens on the same file.
- Attach a gzipped dataset.
.gzfiles upload as data and mount in the code sandbox, instead of having to be pasted into the prompt.
Fleet
- Hold Start Route until the pickup window is close. A new organization preference sets how many minutes before the earliest pickup a driver can start; until then the button shows a countdown and says when it opens. Drivers who get a route hours early no longer arrive before the store is ready for them. Leave it unset and nothing changes. *(Opt-in.)*
- The barcode scanner reads inside the brackets. The scan camera draws a guide on the preview and accepts a barcode only when it sits inside, so a driver scanning one package on a full shelf doesn't pick up its neighbor. Move a rejected barcode into the brackets and it registers immediately. Applies to every scan flow in the app.
Fixes
Dispatch
- Every order on a route with a mid-route pickup is dispatched. When a route picked up twice, dropoffs belonging to the first pickup but sequenced after the second matched neither leg and were dropped, silently, with the dispatch reported as a success. Dropoffs are now assigned by which pickup's manifest they belong to, and an order that can't be placed fails the dispatch instead of disappearing from it.
- A dispatched route reports the distance and duration it actually has. Routes created from a partner's batch could show 0 mi / 0 min because the batch's driving metrics were computed before the route existed to receive them.
- An autodispatch that failed is reported as failed. The Orders page treated the returned job identifier as success, announced the order as dispatched, and linked to a delivery that was never created. It now reads the job's activity, and shows the unsupported package requirements when that's the reason.
- Dispatch activity results say what went wrong. A failed dispatch lists the orders, routes, and deliveries involved with the reason for each, linked to the records, rather than reporting only that something failed.
- Cancelling a batch dispatched through NashLink resolves the items on it and clears its return stop. The cancellation itself went through, so the mutation looked fine, while the items stayed pending.
Platform
- A delivery keeps its ETAs through a pick milestone.
PICKING_COMPLETEandPICK_COMPLETEweren't counted among the running statuses, so the next status change cleared both the pickup and dropoff ETAs on an order whose items had just been picked. On a route, the two pre-departure milestones now read the pickup stop as arrived, consistently, whether the stop carries one order or several, andPICK_COMPLETEcompletes it. See The three pick milestones. - An order created from a job carries the package's tags. Tags your integration set on the package, the ones naming the storefront an order came from, stopped at the package and never reached the order.
- A shift-template upload keeps the hours in the file. A CSV row naming a service window uploaded cleanly and then produced a template on the default 6am–2pm window instead.
- An item a merchant removes from a Shopify pickup fulfillment isn't reported as prepared. Setting an item's fulfillment quantity to
0still marked the whole fulfillment order ready. - A refund request is filed against the delivery attempt that reached a provider. On a job that was reassigned, the request could land on a superseded attempt that never had one and fail, including when the identifier you passed names exactly one package on a multi-package job.
- Creating an API key explains what's wrong with the request. A key submitted with organizations selected but no feature groups returned only "an unknown error occurred"; the same applied to clearing every group on an existing key.
- Opening an order or job that lives in another region shows the record. A detail read fans out across regions, and the expected "not mine" answer from a region that doesn't own the record could overwrite the answer from the one that does.
- Canadian organizations can set up a pre-authorized debit mandate for invoices again.
Integrations
- Uber receives merchant-approved substitutes as a substitution. A preference value Uber's payload spells differently than Nash does fell through to a default that asked the courier to phone the customer, on items where the merchant had already supplied the replacements.
- Purolator shipments are dated from the pickup, not the dropoff. Purolator reads that field as the date the shipment is handed over and validates it against a ten-day window, so an order that waited overnight before dispatch was rejected with a date already in the past.
- One oversized instruction or underweight carton no longer takes down a TGE manifest. TGE validates a manifest as a single document, so a single bad field rejected every shipment in it; per-item weights are floored and instructions are capped before they're sent.
- Australia Post manifest timestamps record when Australia Post created the manifest, rather than when Nash's request landed.
Portal
- A route you renamed shows the name you gave it. The route drawer and the move-stop dialog prefixed every label with "Route", so
WMT Delivery - Dock Door 5displayed asRoute WMT Delivery - Dock Door 5. Unnamed routes still fall back to the prefixed identifier. - Contract version history lists newer versions. Opening version 2 of a contract that has a version 3 showed only the versions before it, so a contract's later revisions were unreachable from any but the newest one.
- A delivery in a terminal status is locked wherever its status dropdown appears. The organization preference that locks terminal statuses was enforced on the Deliveries table but not on the route drawer's stop timeline.
- Shopify settings toggles announce the state they just applied, instead of reporting every change, on or off, as "disabled".
Nash Agent
- A session view survives a card status the browser doesn't recognize. One unmapped status on a pending action took down the whole session view rather than the card.
- A download chip comes back after a dropped connection. The chip was sent once and only once, so a viewer whose stream reconnected at the wrong moment lost the download permanently, with the file itself intact the whole time. It's now replayed from the stored artifact.
- A table whose values are all null reads as no data, rather than as a blank preview that looks broken. A real
0is still shown as a0. - You can send a message into your own session while it's parked on your confirmation. Doing so returned a conflict, and the banner explaining it blamed a teammate, then disabled the Confirm and Cancel buttons that would have cleared it.
- An intake started in Slack can be answered. Nash asked its questions, then closed the turn as done, leaving nothing to answer and no way to resume; the questions now appear in the thread with a link into the session, and answering them continues the run.
- A Slack confirmation runs even when the card can't be updated first. A failure updating the message to "Processing" stopped the confirmation itself from executing.
- Slack turns that aren't about a report don't come with report tooling attached. Asking about a delivery could return an answer mentioning report template files, because the branded report kit was mounted on every turn that could run code.