Unresponded — the waiting-on-a-reply module · engineering spec (PRESCRIPTIVE — Sales Analytics arc, design-ahead)
What it is: the module that surfaces customers who reached out and are still waiting — an inbound with no reply since. It appears in three places with ONE definition: a StatsCard on Analytics, a read-only drilldown, and a Contacts smart view. All instances of locked grammars (StatsCard · drilldown · views nav · customer card).
1 · Definition
Unresponded = a customer who sent an inbound text, email or MISSED call with no reply since. INTENDED (not yet built): a reply must be a human reply, with automation and queued sends never counting (AI replies count only when AI is Included), derived from the timeline rather than a single stamp. AS SHIPPED: the filter tests a single respondedAt stamp, so any reply clears it including an AI reply, and no stat in the sales dashboard takes an AI parameter. Opt-outs and Closed/Bad customers are excluded. As shipped the window is no reply for over 30 minutes, scoped to the selected date range, longest-wait-first. One definition, every surface.
2 · The StatsCard instance — alert semantics
Locked StatsCard grammar: solid info icon always present. Value renders red-01 when >0, em-dash gray-04 at zero (same alert semantics as Untouched). Delta uses invertColors — down = good = green. Third specimen: the "humans only" scope sub-line shown when Exclude AI is on. Tap → the drilldown below.
3 · The queue — read-only drilldown · Contacts smart view (PARKED — see caption)
Drilldown — read-only customer list
Unresponded
Tamika JeffersonUnresponded6 days ago
Created 05/31/17Customer
Robert CookUnresponded9 days ago
Created 06/12/26Customer
The R0 drilldown grammar: app bar = back + title only; whole row = one tap target; no per-row actions. Each customer row carries a red "Unresponded" RoundedText capsule beside its status chip. Drilldown entity = Customer.
PARKED FUTURE IDEA — a dedicated Contacts smart view (not the shipping destination)
Priya NairUnresponded4 days ago
Created 07/02/26Customer
2024 Kia Telluride
Marcus LeeUnresponded12 days ago
Created 05/18/26Customer
2021 Honda Civic
PARKED, 2026-08-18 — a dedicated saved view is a separate feature (view management, counts, persistence) and is not being designed now. This half shows what it could look like: the views rail (locked views-nav grammar) with "Unresponded" carrying a red count pill, and a list of locked customer-card instances wearing the same red capsule. The shipping destination today is All Customers with the unresponded filter applied, not a saved view.
4 · Rules + data contract
// Definition — timeline anti-join, ONE definition every surface isUnresponded(customer) = latestInbound(customer) EXISTS // sms / email / MISSED call AND NO dealerOutbound AFTER latestInbound WHERE (aiIncluded OR actor == human) // AI counts only when Included AND customer.optedOut == false AND customer.status NOT IN ("closed", "bad") AND age(latestInbound) BETWEEN 1h AND 48h // longest-wait-first // CANNOT be computed on customernotifications.respondedAt: patch-responded-at.ts // CLEARS that column on automation, scheduled, AI and manual-log sends, retroactively // across the whole backlog with no time bound. Must be the anti-join above. // Count metric id: Unresponded · Drilldown entity = Customer { "metric": "Unresponded", "value": 6, "drilldown": "customers" }
One definition everywhere — stat, drilldown, and smart view never diverge.
Automation and queued sends never count as a reply — only a human reply clears it (AI replies count only when AI is Included).
Window: no reply for over 30 minutes, scoped to the selected date range, longest-wait-first. Opt-outs and Closed/Bad excluded.
UNVERIFIED: whether opt-outs and Closed/Bad customers are actually excluded by the shipped filter.
Value red-01 when >0 · em-dash gray-04 at zero · invertColors (down = good).
Timeline-derived, never respondedAt — patch-responded-at.ts clears that column on automation, scheduled, AI and manual-log sends, so it must be a latest-inbound-vs-later-outbound anti-join with actorId + automation flag available for filtering.
Drilldown rows are READ-ONLY (R0 grammar) — the fix happens on the customer, not in the list.