Ticket volume undercounts everything a support bot answers, and the gap widens as the bot improves — folding chat conversations in as a third signal class is what closes it, with self_serve_failure_rate marking where the bot answers but does not resolve. Theme matching is keyword-based rather than model-based on purpose: customer text never leaves the server for an embedding API, and the same input always produces the same ranking, at a cost in recall the project measures and publishes.
A server that pulls three streams of customer signal — HelpScout tickets, ProductLift feature requests and Chatbase AI-agent conversations — matches them into themes, and scores each theme so the ranking has countable evidence under it.
- Themes ranked by priority score, each with its reactive, proactive and deflected counts, a convergence flag, an evidence summary and representative customer quotes
- A convergence rule that doubles the score of any theme showing up in both support tickets and feature requests
- The deflection signal: how many chat conversations hit a theme, plus self_serve_failure_rate — the share where the bot's answer confidence fell below 0.5
- A prioritised product plan as structured JSON or as a markdown brief, with max_priorities and detail_level controlling how much comes back
- kpi_context, which takes churn or traffic figures from another server so the plan can be weighed against real business metrics
- Raw ProductLift feature requests with their comments, a status filter and each request's public URL
- The connected sources listed — HelpScout mailboxes, ProductLift portals, Chatbase agents — so filters get the names they expect
- PII scrubbed before analysis: SSNs, Luhn-validated card numbers, emails and phone numbers redacted, agent replies and internal notes excluded outright
- preview_only, which shows exactly what data would be sent without fetching any of it
Node 20 or newer, built from the repository with npm install and npm run build, then launched as a node process against dist/index.js. HelpScout is the one source you must configure, through HELPSCOUT_APP_ID and HELPSCOUT_APP_SECRET from a custom OAuth app. ProductLift and Chatbase are optional and the analysis adapts to whichever you configure — PRODUCTLIFT_PORTALS or the single-portal variables, and CHATBASE_API_KEY together with CHATBASE_AGENTS or CHATBASE_AGENT_ID, because a key on its own configures nothing. Chatbase API access starts at their Standard plan; below it the call returns 403 and the deflection fields arrive as a warning instead of failing the run. Themes live in themes.config.json and load at runtime, so editing them needs no rebuild.
