Conversation Lenses

How Insights assembles SPICED, BANT, MEDDIC, MAP, and team-specific perspectives so product, engineering, and GTM stay aligned on every interview.

What lives inside a lens?

Each lens is a structured snapshot of the interview. Think of it as a page in the deal playbook — a concise key takeaway, the supporting notes, and the evidence you can drill into when someone asks “where did that come from?”

Sales frameworks

  • SPICEDSituation, Pain, Impact, Critical Event, Decision
  • BANT / GPCTBudget, Authority, Need, Timeline / Goals, Plans, Challenges
  • MEDDICMetrics, Economic Buyer, Decision Criteria & Process, Identify Pain, Champion
  • MAPMutual action plan milestones, owners, and due dates

Team lenses

  • Engineering Impactintegration work, API gaps, tech debt
  • Customer Servicesupport expectations and service risks
  • Pessimisticopen objections, blockers, worst-case scenarios

These lenses pull from empathy maps, open questions, and interview notes so non-sellers can see what matters without digging through the transcript.

Where the data comes from

When an interview finishes processing, Trigger.dev runs buildInitialSalesLensExtraction (app/utils/salesLens.server.ts). That task reads evidence, attendees, and observations, then persists the structured snapshot into the sales_lens_* tables:

  • sales_lens_summaries – one row per framework with top-level metadata, attendee list, and hygiene flags.
  • sales_lens_slots – the individual fields (Budget status, Champion, Timeline, etc.) with text, confidence, owners, and linked evidence.
  • sales_lens_stakeholders – the people and influence labels resolved from the call.
  • sales_lens_hygiene_events – gaps and alerts (missing owner, stale evidence) that show up as hygiene badges in the UI.

The new team-focused lenses load their defaults from interview context (high impact themes, empathy map signals, open questions) and store edits inside interviews.conversation_analysis → custom_lenses (same JSON blob that powers AI takeaways).

Editing & overrides
  1. Hover a lens header and click the inline text to edit the key takeaway. The editor updates thecustom_lenses.[lensId].summary field and saves through POST /api/update-lens.
  2. The notes panel underneath each lens writes to custom_lenses.[lensId].notes. These notes always win over auto-generated defaults.
  3. The rest of the table (slots, stakeholders, hygiene) still comes from Supabase. When the AI reruns, new slot values appear but your manual lens notes remain intact.

Tip

If you want to version-control overrides, export the conversation_analysis.custom_lenses JSON — it is a lightweight, human-readable map of your manual tweaks.

How updates flow
  • 1. Processing finishes. Trigger.dev writes new rows into the sales_lens_* tables.
  • 2. Loader combines data. loadInterviewSalesLens reads Supabase, merges hygiene, stakeholders, and slots, then the Remix loader augments it with conversation_analysis.custom_lenses.
  • 3. UI renders accordions. SalesLensesSection displays each lens with inline editing, highlight pills, and the slot table.
  • 4. Manual edits. Inline edits call /api/update-lens, which updates the JSON column only — the AI can safely refresh without wiping human input.