Skip to content
The Escalation Desk

case 2 of 3 · dispatch coverage

The order that never moved: 26 stuck dispatches on Mother’s Day Friday

sev1Petalfrontopened May 8, 8:47 AM ETdetected via: Morning dispatch-board review — the A12 stuck-order alert did not exist yet; it ships as this case’s prevention

01Symptom

It is Fri, May 8, 2026 — two days before Mother’s Day, the weekend a florist marketplace exists for. At 7:31 AM ET, Petalfront’s primary provider, DashNow, ran out of courier capacity in two Tampa ZIPs: 33611 and 33647. In the other four zones that would have been a non-event — the quote declines, the fallback chain picks it up, nobody notices. In these two, the decline was the end of the line.

Orders kept arriving; dispatch kept asking DashNow; DashNow kept saying no; nothing was configured behind it. By the time the desk flagged the pile-up at 8:47 AM, 26 orders of cut flowers had sat — or would sit — past their pickup windows. Manual re-dispatch ran 11:20 AM1:15 PM and recovered 23; 3 could not be saved. The incident is still open because the weekend hasn’t happened yet.

  1. 7:31 AMcapacity drop
  2. 8:47 AMdesk flagged
  3. 8:55 AMtriage start
  4. 11:20 AMre-dispatch start
  5. 1:15 PMre-dispatch done

The 76-minute gap between capacity drop and detection is the old process’s blind spot — closed by the alert in step 04.

Orders stuck

26

Recovered

23

Refunded

3

Basket at risk

$1,667.54

02Evidence trail

Start where dispatch decisions are logged. The sample below is the morning in miniature: DashNow declines, and hours later the same orders dispatch through CourierCo the moment a human routes them there. Read the reason codes — they do the diagnostic work:

Dispatch attempt log sample around the capacity drop and re-dispatch
ts (ET)orderzipprovideractionreason_code
May 08 08:51:00PTF-20260508-238033647DashNowquote_requested
May 08 08:52:00PTF-20260508-238033647DashNowquote_declinedcapacity_limit_reached
May 08 09:42:00PTF-20260508-106733647DashNowquote_requested
May 08 09:43:00PTF-20260508-106733647DashNowquote_declinedcapacity_limit_reached
May 08 11:27:00PTF-20260508-333433611DashNowquote_requested
May 08 11:28:00PTF-20260508-333433611DashNowquote_declinedcapacity_limit_reached
May 08 11:29:00PTF-20260508-238033647CourierCoquote_requested
May 08 11:30:00PTF-20260508-238033647CourierCodispatched
May 08 11:54:00PTF-20260508-106733647CourierCoquote_requested
May 08 11:55:00PTF-20260508-106733647CourierCodispatched
May 08 13:01:00PTF-20260508-333433611CourierCoquote_requested
May 08 13:02:00PTF-20260508-333433611CourierCodispatched

Provider decline reason codes are illustrative courier-API vocabulary (ASSUMPTIONS.md A3); the docs document dispatch errors, not per-provider decline reasons.

Now the configuration those declines fell into. Six zones, one difference — the two onboarded later never got a fallback chain (per-zone chains are an illustrative mechanism, ASSUMPTIONS.md A11):

Zone coverage: fallback chain and DashNow quote responses today
zipareafallback chainaccepteddeclinedcoverage
33602Downtown TampaDashNow → CourierCo → FleetX730covered
33606Hyde ParkDashNow → CourierCo → FleetX490covered
33609WestshoreDashNow → CourierCo → FleetX870covered
33611South TampaDashNow211chain ends here
33629Palma CeiaDashNow → CourierCo → FleetX680covered
33647New TampaDashNow315chain ends here

Accepted / declined are DashNow quote responses today, per zone.

Where and when orders went stuck. Both affected ZIPs, nowhere else, starting the hour capacity dropped:

Stuck orders by zone and hour of day
zip07:0008:0009:0010:0011:0012:0013:00
33611··32·51
33647·133233

Hour labels are ET; cell shading scales with the count in that cell (darkest = worst hour).

The orders themselves, with what each one was worth and how it ended:

Stuck orders: pickup window, time stuck, basket value, resolution
orderzippickup window end (ET)min stuckbasketresolution
PTF-20260508-238033647May 08 09:35:0094$26.84redispatched_courierco
PTF-20260508-333433611May 08 12:11:0030$101.78redispatched_courierco
PTF-20260508-106733647May 08 10:26:0068$72.21redispatched_courierco
PTF-20260508-154833611May 08 10:20:00200$49.47refunded
PTF-20260508-796933611May 08 12:00:0042$49.90redispatched_courierco
PTF-20260508-369333611May 08 11:58:0037$89.61redispatched_courierco
PTF-20260508-582933647May 08 12:16:0039$71.07redispatched_courierco
PTF-20260508-305533647May 08 09:40:0082$53.68redispatched_courierco
PTF-20260508-155333611May 08 13:30:000$55.47redispatched_courierco
PTF-20260508-508033611May 08 10:20:0085$20.63redispatched_courierco

+16 more with the same shape.

the query that surfaced them — now the step-04 alertops warehouse · illustrative schema (A8)
-- Stuck orders: unassigned past their pickup window (A12: 20-minute grace).
SELECT
  order_ref,
  zip,
  pickup_window_end,
  ROUND(EXTRACT(EPOCH FROM (now() - (pickup_window_end + INTERVAL '20 minutes'))) / 60) AS minutes_stuck,
  basket_cents
FROM deliveries
WHERE account_id = 'acct_petalfront'
  AND status IN ('request', 'delivery_created', 'driver_not_assigned')
  AND pickup_window_end < now() - INTERVAL '20 minutes'
ORDER BY pickup_window_end;

03Diagnosis

A pile of stuck orders has three plausible causes, and the reason codes separate them cleanly. A provider outage declines or times out everywhere — but DashNow accepted 277 quotes across the other four zones today with 0 declines. A coverage misconfig returns zone_not_served — nothing did. What the log actually shows is capacity_limit_reached (reason codes illustrative, A3) in exactly two ZIPs: 11 of 13 quotes declined in 33611, 15 of 18 quotes declined in 33647. That is a localized capacity drop — real, external, and ordinarily survivable.

Ordinarily. What made it an incident is on our side of the ledger. South Tampa and New Tampa were onboarded after the original four zones, and the fallback chain was never configured for them (A11). Everywhere else, a DashNow decline converts into a CourierCo dispatch automatically; in these two, the decline was terminal. The capacity drop was the weather. The missing chain was the hole in the roof.

what the operator did not do

  • Treat it as a DashNow problem alone — the acceptance numbers in the other four zones prove the provider was healthy everywhere the config was. Filing a provider ticket would have fixed nothing.
  • Keep re-dispatching one order at a time past the threshold — at 10+ stuck in a zone you stop clicking and call the customer (A12), because at that point their substitution decisions — which shops, which arrangements — beat your routing decisions.
  • Wait for DashNow capacity to recover on its own — with cut flowers on the counter, every hour of waiting converts recoverable orders into refunds.

04Resolution & prevention

Resolution was manual and unglamorous: re-dispatch every stuck order through the chain that should have been there. 23 of 26 orders went out through CourierCo and FleetX between 11:20 AM and 1:15 PM ET. 3 could not be saved — shops closed or stems past holding — and were refunded in full: $251.15.

Prevention shipped the same day. 33611 and 33647 now carry the same fallback chain as the other four zones (A11), FleetX is holding standby capacity in both ZIPs through Sunday, and the alert below pages on the pattern this morning showed us — before a human would have noticed it.

Fallback chain configuration before and after today’s change
zipareachain beforechain after
33611South TampaDashNowDashNow → CourierCo → FleetX
33647New TampaDashNowDashNow → CourierCo → FleetX
the alert that now pages usops warehouse · illustrative schema (A8)
-- Prevention: page when >= 5 orders go stuck in one zone within 60 min (A12).
SELECT
  account_id,
  zip,
  COUNT(*)               AS stuck_orders,
  MIN(pickup_window_end) AS oldest_window
FROM deliveries
WHERE status IN ('request', 'delivery_created', 'driver_not_assigned')
  AND pickup_window_end < now() - INTERVAL '20 minutes'
  AND pickup_window_end + INTERVAL '20 minutes' > now() - INTERVAL '60 minutes'
GROUP BY account_id, zip
HAVING COUNT(*) >= 5;

the thresholds, and why (A12)

  • 20 min past pickup window = stuck. Long enough to absorb ordinary courier jitter, short enough to leave a rescue window for perishables.
  • 5 stuck in one zone within an hour = page. One stuck order is an accident; five in the same zone is a pattern with a common cause.
  • 10 stuck in a zone = stop re-dispatching and call the customer. Past that point their substitution decisions beat our routing decisions.

the outreach — same facts, two altitudes

To: Jordan Pike (Platform Eng, Petalfront)

Subject: RCA: this morning’s stuck dispatches in 33611/33647 + the config change that prevents a repeat

Hi Jordan, Root cause in one line: DashNow lost courier capacity in 33611 and 33647 at 7:31 AM this morning and those two zones had no fallback chain configured, so declined quotes had nowhere to go. The reason codes separate the failure modes cleanly. DashNow returned capacity_limit_reached in exactly two ZIPs while accepting normally in your other four — so this was a localized capacity drop, not a provider outage (that would decline everywhere) and not a coverage misconfig (that returns zone_not_served). 26 orders exceeded their pickup windows before we intervened. What changed today: 33611 and 33647 now carry the same fallback chain as your other zones (DashNow → CourierCo → FleetX), and we set a stuck-order alert — 5+ orders unassigned 20 min past pickup window in any zone pages us. Both were live by 1:15 PM. For the weekend: we’ve asked FleetX to hold standby capacity in both ZIPs through Sunday. Full dispatch log attached.