Core concepts
Signals & themes
Every piece of customer feedback VocxAI ingests - a ticket, a Slack thread, a call note, a feature-request post - becomes a signal. Related signals cluster automatically into a theme: the actual unit you review, rank, and build from.
What a signal is
A signal is one piece of raw feedback, normalized to the same shape no matter which connector it came from:
- Source - which connector it came from (Slack, Zoho Desk, Nolt, Granola), and an excerpt in the customer's own words.
- Who - the customer and company name, when the source provides it.
- Type -
bug,feature_request,question, orother(see below). - Timing - when the source system says it was created, separate from when VocxAI actually ingested it.
- Theme - which theme it's currently grouped under, once clustering has run.
How a signal gets classified
As each signal comes in, two things happen automatically before it's stored:
- It's embedded. The excerpt is turned into a vector embedding - the representation clustering compares signals by.
- It's typed. A lightweight classification pass sorts it into one of four fixed categories: bug (something's broken), feature request (asking for something new or changed), question (asking how something works), or other (praise, spam, anything that doesn't clearly fit). That set is deliberately small and fixed rather than an open taxonomy an LLM can invent new labels for - it keeps clustering from mixing a bug report into a feature-request theme just because the wording overlaps.
Multi-topic conversations
A Slack thread or a call transcript rarely raises just one thing. Rather than treating the whole conversation as a single signal (and losing everything after the first topic), VocxAI segments it into one signal per distinct issue - a bug report and an unrelated feature request in the same thread become two separate signals, each attributed back to that conversation. If nothing actionable was said at all, no signal is created.
How themes form
Clustering runs in two ways, working together:
- Incrementally, as signals arrive. A new signal is compared against the existing themes of the same type and, when it's close enough to one, joins it immediately - the theme's summary and signal count update right away.
- Periodically, for what's left over. Signals that didn't match anything existing are swept up on a schedule (and can be triggered manually), grouped with other unmatched signals that are mutually close together, and named as brand-new themes once there's enough of them to be a real pattern rather than a one-off.
A theme only forms once a handful of signals genuinely cluster together - a single isolated piece of feedback stays a signal, not a theme, until more of the same start showing up.
What's attached to a theme
Once formed, a theme carries everything you need to decide whether to act on it:
The implementation-status check runs automatically on a newly-discovered theme when GitHub is connected, and can be re-run manually from the theme's detail view - it's a cheap code search and classification pass, not the full codebase research an agent does once a theme is promoted to a feature. See Agents & jobs for what happens after that.