AisleAsk → DoorDash: shopper-assist as a service (not the IP)
Status: GTM pathway plan (2026-07-23). AisleAsk is the hands-free glasses store-walk assistant (
/api/aisleask/*— store catalog, in-store route, next-item, section scan). This is the plan to sell it to DoorDash as an operated service for their grocery shoppers — retaining the IP. Public demand-side surface:./for-shoppers
The bet, in one line
DoorDash's grocery shoppers waste time hunting for items in stores they don't know. AisleAsk turns any phone (and, as an upgrade, glasses) into a hands-free picking copilot — optimal route, item location, scan-to-confirm, substitution help — so a shopper picks faster and more accurately. We sell DoorDash the outcome (throughput + accuracy + faster shopper ramp) as a subscription + managed service. We keep the engine and the store-map data; they rent the capability.
Why service, not IP (the deliberate posture)
Same principle as Workout Window / SecondSet: rev-share / SaaS + managed ops, not a code hand-off or acquisition. A one-time IP sale caps the upside and hands over the moat. A service keeps the recurring revenue AND the two assets that compound — the store-map data and the shopper-performance data. If DoorDash pushes to acquire, that's an upside conversation, never the plan; structure every agreement to retain the IP + data.
The only metric that matters
Everything is measured against what DoorDash's grocery P&L actually feels:
- Pick time per order (minutes in store) — the headline.
- Substitution / accuracy rate — fewer wrong/again-out-of-stock picks.
- Shopper ramp time — how fast a new shopper is productive in an unfamiliar store.
If a paid pilot can't move #1 and #3 with real numbers, nothing else matters. Build the proof around these three from day one.
Device strategy — phone-first, glasses as the upgrade
Lead with the phone. The IP (routing, item-find, planogram matching) is device-agnostic; a shopper already carries a phone and works one-handed. An audio-first phone copilot needs no hardware rollout, no retailer camera fight, and no adoption friction — so it's what you sell DoorDash first. Glasses are the premium, hands-free tier (both hands on the cart) and the flagship demo, not the dependency. Selling a hardware program to a gig-labor force is a much harder first sale; don't gate the deal on it.
The pathway
Phase 0 — Sharpen the wedge + build undeniable proof
- Lock the pitch on the three metrics. Instrument AisleAsk to log pick-time per
order in a real grocery store.
- ✅ Pick-time instrumentation BUILT (2026-07-23) — the timed pick-session
layer that produces the proof number.
migration 564(aisleask_pick_sessions+aisleask_pick_events, RLS service-role-only, human-provisioned); pure golden-tested metrics core(duration / items-picked / accuracy % / substitution rate / items-per-hour, divide-by-zero guarded); serviceaisleask-metrics.ts→computePickMetrics(start → record event → complete → list → stats). Endpoints underaisleask-sessions.ts/api/aisleask:POST /:storeId/pick-sessions,POST /pick-sessions/:id/events,POST /pick-sessions/:id/complete,GET /pick-sessions,GET /pick-sessions/stats. The pilot's headline delta comes from/pick-sessions/stats(avg pick time / items-per-hour / accuracy, filterable bysource=self|doordash|pilot). See INDEX.md → AisleAsk. Still needed for a full Phase 0 proof: the single-store demo capture + on-screen time delta.
- ✅ Pick-time instrumentation BUILT (2026-07-23) — the timed pick-session
layer that produces the proof number.
- Build a credible single-store demo: a real order picked with AisleAsk vs. a cold baseline, audio-first on a phone, with the time delta on screen.
- Stand up
— the demand-side surface (below). Shoppers wanting this is the pressure that makes DoorDash take the meeting./for-shoppers
Phase 1 — The store-data moat (this is the real work)
The hard part of grocery picking is per-store aisle/planogram data. Whoever has current, accurate, per-store item locations wins. Strategy: the shoppers build the maps as they work.
- Build the neutral glasses/phone capture rail (photo of a shelf/aisle sign +
optional spoken note + location + wearer) → a durable capture record →
planogram enrichment. Recon (2026-07-23) confirmed no capture-persistence
rail exists today — AisleAsk's scan is transient (base64 → OpenAI → discarded).
Compose the rail from existing pieces:
createAttachment's upload + thumbnail + signed-URL pattern (journal-entry-attachments.ts), the 3-mode glasses bearer auth, and the AisleAskvalidCoord/haversineKmhelpers. This is the SAME rail the SecondSet steer wants — one primitive, many GTMs (see [feedback: generalize backend APIs]).- Status (2026-07-23): the HJ half of the rail is BUILT —
POST/GET/ack /api/captures, thecapturestable (migration 561, human-provision the private bucket), consent enforcement, owner-scoped read.aisleask_planogramis one of the fourpurposetags. Wiring AisleAsk's scan to EMIT anaisleask_planogramcapture is the remaining follow-up. See docs/ai/INDEX.md → Captures rail +crosstalk/contracts/glasses-capture.md.
- Status (2026-07-23): the HJ half of the rail is BUILT —
- Self-improving map = the moat + the reason it's a service (ongoing data ops, not shrink-wrapped software). Start with a few high-volume banners in one metro.
Phase 2 — Prove value WITHOUT DoorDash (de-risk the sell)
- Run AisleAsk with independent/gig shoppers, your own test shoppers, or a single grocery chain's e-commerce fulfillment team, and measure the pick-time delta for real. You walk into DoorDash with numbers, not a hypothesis.
- A grocery chain is a viable first customer in its own right (faster in-store picking for their own delivery/BOPIS) — and a reference that de-risks DoorDash.
Phase 3 — The DoorDash approach
- Enter through the outcome + a paid pilot, never an IP pitch: "We cut pick time X% and shopper ramp Y% in these stores. Run a paid pilot on N shoppers in one market — we operate it, you measure." Target the grocery / new-verticals + shopper-experience/logistics teams.
- Service terms: per-active-shopper/mo or per-order fee; DoorDash pays for throughput. Phone-first (no hardware line item to approve). Data + store maps stay ours (the moat); spell out IP retention explicitly.
- Land-and-expand: one metro → more banners → national.
Phase 4 — Moat + lock-in
Store-map data + shopper-performance data + integration into the shopper app = switching cost. Recurring, growing service revenue; the data asset appreciates.
Hard gates (name them, don't wish them away)
- Retailer permission / camera-in-store. Grocers dislike being recorded. Mitigation: audio-first, on-demand single photos, no continuous recording; ideally a retailer partnership. The phone-first path sidesteps most of this.
- Privacy + gig-labor UX. Capturing in stores + a wearer's spoken notes departs from the glasses' current "never log what the wearer said" contract — consent + retention must be first-class. And the tool must make the shopper more money (more orders/hour), or churn-heavy gig workers won't adopt it. Pitch value to BOTH sides: DoorDash (throughput), shopper (earnings/hour).
- Build-vs-buy / competition. Instacart has in-house shopper tech; DoorDash may build. The service wins on time-to-value + the store-map moat + operated ops they'd otherwise staff themselves.
- IP structure. Services/SaaS agreement with explicit IP + data retention; be ready to say no to an acqui-pitch, or price it as the upside it is.
Reuse map (what already exists)
- AisleAsk engine —
/api/aisleask/*(store catalog, route, next-item, section scan) +services/aisleask.ts(validCoord/haversineKm, store lat/lng in migrations 506/510). The core IP. - Glasses layer — the Mentra
@mentra/sdkapp (apps/glasses/):session.camera.requestPhoto,onTranscription,session.location,playAudio/speak, the 3-mode bearer auth +glasses_device_linkswearer-resolve. - The capture rail (to build) — the neutral primitive shared with SecondSet.
- QuickSites as the ops/portal back-end candidate (shopper management, store data dashboards) — the mesh "shared backend, branded front-ends" pattern.
- Geographic routing — QS
route-optimize(PorchHearth's engine) — LIVE mesh contract (crosstalk/contracts/route-optimize.md):POST <qs-host>/api/tools/route-optimizetakes a day's stops (addresses or lat/lng) → nearest-first order + a Google Maps turn-by-turn link (nearest-neighbor + Haversine, free OSM geocoding). Built on PorchHearth/DeliveredMenu's batch-delivery routing; the contract explicitly names "AisleAsk store-walk taskers first" + "AisleAsk catalogs that carry lat/lng (migration 506)." Consume this — do not reinvent driver routing.
The two routing layers (build one, reuse the other)
Two distinct problems — don't conflate them:
- In-store route — which aisle/section order to walk inside ONE store. That's
AisleAsk's own
orderItemsByRoute(section walk order). Already solved. - Geographic multi-stop route — get to N stores (multi-store batch) and the
delivery leg to N customers (a batch = several customers). That's QS
route-optimize/ PH's engine. Reuse it, don't build it.
The delivery-leg fit with multi-customer batch (migration 565): a batch already
groups several customers' orders. After picking, the driver's drop route = a
route-optimize call — pass each order's customer lat/lng → nearest-first + a
maps link for the driver. Prereqs: (a) customer location on aisleask_orders
(address/lat/lng — a small additive column; orders only carry customer_label +
external_ref today), (b) a HJ consumer of QS's endpoint (a service call, or the
zero-server deep-link <qs-host>/tools/route-planner?start=…&stops=…), and
(c) confirm QS has deployed route-optimize to prod (contract says "prod pending
QS deploy"). Then surface the driver route in the batch flow's bagging/done step.
BD path (who + how)
- Warm proof first (
/for-shoppersdemand + a pilot number), then the grocery / new-verticals + logistics org at DoorDash. No warm channel today (Crosstie is insurtech); the credibility line is the demo + the pilot delta + the "creator of HabitForge, 250k+ users" heritage. - Sequence: chain pilot (Phase 2) → DoorDash paid pilot (Phase 3) → expand.
Decisions
- ✅ Standalone AisleAsk Shopper app (2026-07-23) — its own app, not a mode in
the HiveJournal mobile app. Clean brand separation for a work-tool aimed at gig
shoppers (nothing to do with journaling), and it can ship/iterate on its own
cadence. Backend stays shared (the mesh "shared backend, branded front-ends"
pattern): the AisleAsk engine + the neutral capture rail live in HJ's backend;
the Shopper app is a thin consumer.
- Shipped v0 (2026-07-23): the shopper picking surface exists as a focused,
phone-first web route —
(/shop). Drives a timed pick session end-to-end (store-select → confirm list → walk the route deciding each item Got it / Sub / Out against a live timer → summary card with pick time / items-per-hour / accuracy / subs). PWA-style, standalone-feeling; can spin into the standalone Shopper app later. It's the demand-side twin of the marketing pageShopClient.tsx/for-shoppers— the tool the shopper actually picks with.
- Shipped v0 (2026-07-23): the shopper picking surface exists as a focused,
phone-first web route —
Open questions
- First metro + first grocery banners to map?
- Do we pursue a grocery chain as customer #1 in parallel (revenue + reference), or stay laser-focused on the DoorDash path?