Release notes
A quieter Execute page
Highlight
A quieter Execute page. Execute is where a dispatcher spends the day, the list of routes that are out on the road right now, and the place you go when one of them stops behaving. It has picked up a lot of surface over the last year, and the feedback was consistent: for a team running twelve routes, the page shows the machinery of a team running twelve hundred. This week it got narrower rather than larger.
- The day starts on today. Execute used to open on the whole month, which meant every visit began by narrowing to the day you actually care about. It now opens on today, matching Deliveries. The date control leads with Today, Yesterday, Tomorrow, and This week, each applying the moment you pick it, and Custom opens a calendar that doesn't move the queue until you apply it. A link that carries its own dates, and a saved view, both still win.
- Filters grouped the way a dispatcher decides. The filter panel used to have one catch-all Route bucket. It's now split into route operations, assignment, and orders and locations, with package filters kept to genuinely package-level things. The question you're asking, who's carrying this, where is it going, what's in it, now maps to a section.
- Filter by driver group or courier. Two filters that were missing, on the panel, the queue, the downloads, and the URL. An operation that splits its day across driver groups can give each dispatcher a link that opens on their own routes.
- The filter lists match the routes in front of you. Tags, city, state, business name, shift, and optimization strategy were drawn from a list built for the Plan page, which deliberately excludes orders on dispatched routes, the exact routes Execute lists. So the options and the table disagreed, which read as the filters being broken. They come from the routes on the page now.
- See whether the driver is actually moving. Each assigned driver carries a location freshness reading under their name, in the table and in the route panel: live through 15 minutes, then shown as not live with its age, the same rule the delivery map already used. Select it and a small map opens at their last known position, so "where are they" doesn't cost you a page change.
- Turn off the parts you don't use. The map view, the timeline view, and the KPI cards can each be switched off for the whole organization under Organization settings → Products → Execute. All three stay on unless you turn them off, and a link to a view you've disabled falls back to the table rather than failing.
See Watching routes on the Execute page.
New & improved
Orchestration
- Ask a workflow whether a field is there at all. Is set and Is missing take no comparison value, so a condition can branch on presence, a metadata key your integration only sometimes sends, a tip nobody entered. Only
nulland genuinely absent values count as missing:0, an empty string, and an empty list are all *set*, so a deliberate zero isn't mistaken for a blank. Checking optional context the order doesn't have yet resolves to missing rather than failing the step. See Branching on whether a field is there. - Five more fields to branch on, for the decisions that turn on a number rather than a status. Drive Time and Minutes Until Pickup on the order and its packages, Package Count and Total Package Value on the job (delivery), and Task Attempt Number for the case where a second failure should escalate rather than reassign again. The workflow editor reads the field catalog live, so they were there the moment the platform published them. See Fields worth branching on.
- Hold an order's price or tip inside a bound instead of overwriting it. Modify order price or tip gains At least and At most: a floor raises anything below it and leaves higher amounts alone, a cap does the reverse. Both are idempotent, so a workflow that runs twice doesn't compound, which is what made the old pattern of pairing a filter with a set action awkward to get right.
Nash Agent
- Choose which entity an alert-triggered agent actually works on. The event that starts a run and the entity the run follows are now set separately: a delivery, task, or job alert can run against the parent job, while a route alert runs against the route. An agent that rebooks a failed drop-off can therefore start from the delivery event and still see, and act on, the whole job on every later pass. If the chosen scope can't be resolved from the payload, Nash refuses the run instead of starting the agent against the wrong thing. See What the run works on.
- See which agents are watching, and what they last concluded. An agent that watches an order, route, or job now shows its latest assessment on that record's detail view, with a link back to the run that produced it, and Routes on Execute can carry it as a column. Agent activity is kept out of the ordinary event timeline so it doesn't crowd the operational history.
Portal
- One page for how the Portal reads. Organization defaults, branding, and the Orders and Routes column labels you've overridden now sit together under Settings → Preferences, instead of being split across an organization preferences tab and a separate customization screen. Column labels gained a searchable editor, per-row reset, and a count of what you've changed. See Display preferences.
- Customer and provider analytics live at one address.
/analyticsresolves the view from your organization type, with an explicit switch for organizations that are both. The old provider path redirects. - Stop timing reads in three rows at most. The dropoff window, then a single ETA slot, the planned ETA until the route is running, the live one while it is, back to planned once the driver has arrived, and the arrival time once there is one. Shared by the Execute route panel, the Deliveries drawer, and the Plan route panel.
- Organizations billed in Great Britain can reach the Stripe customer portal from an empty billing state, which is where Direct Debit setup lives.
Dispatch
- Split a batch when a provider cancels it, available to every organization now, not only on request. When a provider hands back a whole batch, Nash can break it into single deliveries and send those to a dispatch strategy you nominate, rather than hunting for one provider willing to take the batch again. Find it under advanced options on the dispatch strategy. See Failover and reassignment.
Fixes
Orchestration
- A workflow no longer starts from an event that has gone stale. Workflow-backed notification triggers are now checked against the same ten-minute staleness guard the other notification paths use, so a geolocation event that arrives late can't kick off a run, or send a message about a delivery that finished half an hour ago. The scheduler also claims the executions it picks up, rather than repeatedly selecting the same pending batch.
- A notification trigger whose type Nash has no payload mapping for is skipped rather than raising, so it can no longer take down the whole batch of notifications queued behind it.
- Stuck-status triggers fire when their timing parameters are explicitly null, instead of quietly doing nothing.
- Delivery status filters using is one of and is not one of apply instead of erroring, so switching an existing condition to a multi-value operator no longer drops you on an error page.
- Custom events reach the event timeline whatever the casing your system sends them in.
Order Ready At Storeandorder_ready_at_storeare now read as the same event, which also means an agent reading that timeline to decide whether a store has signalled ready gets the right answer.
Dispatch
- An order whose autodispatch runs out of options is reported as a dispatch failure, including when every quote came in over the strategy's maximum delivery fee. Previously the first delivery on a job could stay sitting in
createdwith nothing to indicate it had stopped. - A route that dispatched successfully isn't reported as failed afterwards. A second, fallback dispatch path could run after the route had already gone out and report its own inability to find a contract as the route's outcome.
- Dispatching a large wave of routes reports each route's real outcome. The lock covering the wave was scoped to the whole batch rather than to a route, so a long batch could exhaust its own lease and report routes as failed that had in fact dispatched, with the customer notifications that follow never sent.
Fleet
- A batch ETA no longer routes the courier back through stops they've already served. A dropoff that failed at the door and moved to return anchored the remaining-stop chain, pulling completed stops back into it, and every later dropoff ETA inherited that detour.
- A pickup scan advances the stop it belongs to, and not every other delivery on the job. On a consolidated pickup that could be a hundred-odd deliveries, including orders belonging to other stops on the same route.
- Courier check-in, check-out, and pickup-summary forms are chosen by the driver group the route was dispatched to, rather than by every group the assigned driver happens to belong to. Drivers who belong to several groups were seeing another group's form.
- A masked phone call connects without asking the caller for a code. The driver app already sends the extension as tones; the prompt asked for something nobody had to do.
- Return-parking check-in timestamps are readable,
returnParkingLocationUpdatedAtwas written under a misspelled key and so was always null. - Revoking or expiring a delivery window works on routes containing a break stop, which previously returned an error.
- Optimization keeps a vehicle type open-ended when it declares no end depot, even if another type in the same run does declare one. Before, one type's end depot pulled every route in the run back to it.
- Driver pay totals tolerate a stop with no delivery, an order canceled seconds into a dispatched route left the rest of the route's stops unable to load in the driver app.
- On the driver app: long item names wrap and row actions stay aligned on the routes package list; an order canceled mid-pick reads as failed rather than picked; and the stop sheet shows the action button where the driver can act, a pending dropoff whose pickup is done is workable, and a pending dropoff whose pickup isn't says so.
Portal
- The order details edit form shows delivery windows in your own timezone rather than UTC.
- The public tracking page shows the dropoff ETA it has, instead of falling back to "Arriving soon", the timestamp was arriving without a timezone marker and being read as local.
- Duplicating a job keeps the saved pickup and dropoff store locations, instead of submitting them as free-form addresses and producing a package with no store attached.
- The Add to Route drawer closes and confirms once the order is actually on the route, and says so plainly when the route has already been dispatched.
- The timezone switch offers your browser's timezone again, alongside the resolved organization or personal one.
- The Portal home and welcome pages load rather than erroring on a render loop.
- Flags with no payload no longer render an empty box on the Execute page.
- The API key form won't let you submit with organizations selected but no permissions, and explains why, a key with no permissions can't be issued, and the attempt used to fail with an empty error message.
- Organizations billed in Great Britain can add a payment method again; the setup request named a payment type the account can't use directly, and Stripe rejected the whole request, leaving the dialog blank.
Integrations
- Toast order updates no longer overwrite a tip that came from somewhere Toast can't see. A gratuity booked as a service charge or typed into the Portal used to be replaced with $0 on the next update.
- Uber quotes read package weight as the weight of the package, not of each item in it, an order declaring a 50 kg package and eight items was being quoted as 400 kg.
- Purolator quotes work for orders whose items carry no dimensions, rather than failing and blocking dispatch.
- AlShrouq deliveries track: status updates from polling and from the webhook now apply, and cancellations reach the provider.
- Leajlak cancellations are recognized on both the webhook and the polling path, so a canceled delivery stops looking active and doesn't fall through to reassignment.
- A DoorDash contract scoped to a business reports a missing store mapping by name at request time, rather than passing the request on and returning the provider's opaque rejection.
Nash Agent
- Stop stops the work. Stopping a session in the Portal is now a server-side transition rather than the browser hanging up: pending actions and scheduled ticks are revoked, and late tool results, artifacts, and status writes are refused. A first turn can be canceled too.
- A session that failed stays failed, on reload and in the sidebar, rather than reappearing as completed, and progress messages match the outcome they describe, instead of a step that failed keeping its success copy.
- Mentioning Nash in an existing Slack thread starts a conversation. Slack delivers a mention twice, and the delivery that arrived first was claiming the message and then discarding it.
- Nash replies to external Slack Connect users in shared channels, instead of failing the run before the agent started.
- An assessment an agent produces is retried when the write is lost to a transient failure, so the assessment, and any workflow waiting on it, isn't silently dropped.