9-to-5ProjectsYapping
← Back to projects

Work  ·  2026

Turning scattered sales feedback into a system teams can act on

Turning scattered sales feedback into a system teams can act on

Overview

I built a pipeline that pulls every call transcript, classifies it, and has a remote agent extract, categorize, and score each piece of product and sales feedback against account value. Every day it now surfaces insights that previously got lost and weighs them by exactly how much business opportunity rides on them.

1–2 dozen/day

New-business insights captured and scored

Account-weighted

Every insight scored by logo value and urgency

The challenge

A prospect says something worth building, and it evaporates the moment the call ends.

A prospect would mention a feature they'd need before they'd sign, a competitor they're also evaluating, or some other objection. Some of this feedback is noted, others get lost. But there was no system for aggregating the insights, no way to tell a one-off ask from a pattern, and no way to separate whether it came from a small or large logo. Product feedback lived in whoever happened to be on the call and however well they remembered to mention it in Slack.

The cost wasn't abstract. Without a count and a weight attached to each request, the product team had no defensible way to prioritize, and sales had no way to show the product team what was actually costing deals. Big-logo signal and small-account noise looked identical from the outside.

The approach

Instead of asking people to log feedback better, I built a system that reads every call for them.

Instead of another reminder to write things down, I decided the fix had to remove the manual step entirely. A few things had to be true for that to work:

  1. Every new-business call needed to get pulled in automatically, with no one having to remember to forward a recording.
  2. The system had to tell new-business calls apart from existing-customer and internal calls, since each needs different handling.
  3. Extraction couldn't just tag a call "feature request." It needed a category, a normalized topic, the verbatim quote, and the account behind it.
  4. Every insight needed to inherit that account's value, so a request from a major logo would visibly outweigh the same request from a small trial.
  5. Nothing could double-process a transcript, and nothing could silently drop one either.

What I did

The pipeline runs as five chained jobs, each one doing exactly one job well.

Tech stack

Trigger.dev orchestrates the pipeline: durable execution so a crash partway through a batch picks back up where it left off, no execution time limits for the longer Claude analysis calls, and modular tasks I can update and rerun independently. Claude Agent SDK does the classification and extraction reasoning. Grain is the transcript source. Notion stores each transcript with its status. Google Sheets is the output layer, with formulas handling the scoring and aggregation.

Ingestion

A task runs every weekday morning on cron and pulls every recording from the previous day off Grain's API. Each one becomes a Notion page: title, meeting date, meeting link, participants, and the full transcript with speaker labels. It dedupes by meeting link, so a rerun never creates a duplicate.

Classification

The next task reads each transcript's participant list and applies domain rules: every participant on a company email means internal, a participant email matching our maintained customer list means existing customer, a salesperson plus an outside participant not already flagged as a customer means new business. Claude handles the ambiguous case, agency and partner calls, by reading the transcript for partnership signals versus prospect signals. Anything the rules can't confidently place gets left blank for a human to sort.

Extraction

For every new-business transcript, Claude works through a category rubric (product gap, coverage gap, integration gap, competitive mention, pricing objection, and a few more) and pulls out each distinct piece of feedback: category, subcategory, a normalized version of the ask, and the verbatim quote. It fuzzy-matches the account name to a canonical spelling and checks the insight against a running topic vocabulary so the same request from five different calls becomes one tracked topic instead of five.

Scoring

Every insight writes to a Google Sheets tracker that looks up the account's score, a formula built from logo grade, opportunity size, and deal urgency that the sales team maintains weekly. That score rolls up into a topic view showing how many accounts have raised each request and how much it's worth in aggregate. Every write uses non-contiguous batch updates, so the pipeline only ever touches its own columns and never overwrites a formula or a human-entered field.

The safety net

Each transcript in Notion carries a status: blank means unprocessed, done means extracted, and reanalyze is a flag anyone can set to force a redo. Nothing gets missed, and nothing gets stuck on a bad first pass.

The results

Feedback we used to lose entirely now shows up scored and ranked every single day.

The pipeline is now capturing and analyzing 1–2 dozen new-business insights each day in a way that simply did not exist before. Before this ran, none of it was visible. It was said out loud on calls and then it was gone.

What changed isn't just that we're capturing more, it's that everything captured now carries a weight. A request from a hot, high-value logo and the same request from a small trial account no longer look the same in the tracker, they're scored differently, and that score is what the product team and the sales team both work from now. Account scoring and insight scoring together mean the roadmap conversation starts from an actual count of what's costing us deals, and the sales enablement materials we build now point at the objections that are genuinely showing up on calls, not the ones that are loudest in memory.