sherifbutt.dev · cardiff, uk
$ cat writing/voice-of-customer.md #ai #founder #technical

I built a tool to find customer pain. Its best output was telling me I was wrong.

A sieve: 173 posts entering, 58 leaving, the largest blocks caught and discarded

Reddit blocks the crawlers that AI assistants use. So I built a plugin to get in and pull the exact words people use about a problem. Then I pointed it at my own market, and it spent three days telling me — politely, with citations — that almost everything I believed was unsupported.

79 seconds, narrated. The threads are real; the pages are a local mirror, because Reddit blocks headless browsers — which is the same wall the whole post is about. Usernames redacted.

Marketing written from imagination sounds like marketing. Marketing written from the words people actually typed sounds like recognition. That gap is the whole reason the tool exists: if you're writing an ad for plumbers, the headline is already sitting in a Reddit thread somewhere, phrased better than you'd phrase it, by someone who was angry at the time.

There's a practical obstacle. Built-in web crawlers — the ones an AI assistant reaches for — are blocked on reddit.com. Not rate-limited: blocked. You get nothing. Reddit's read-only API is the only way in, which means an OAuth application, which means a small piece of software. So I wrote one: voice-of-customer, an MCP plugin, MIT, about 1,500 lines of TypeScript.

This is not a post about the software. It's a post about what happened when I aimed it at myself.

01 · one parameterThe change that made it work

Before any of the interesting failures, the boring fix. Reddit's search takes a sort parameter. The obvious choice is top — best posts first, surely. top returns the funniest thread, the drama, the thing that got cross-posted. It's an entertainment ranking.

Switching to relevance was the single highest-leverage line in the project. Not a model, not a filter — one query parameter. I mention it because I spent a while assuming the problem was sophistication, and it was a default.

Every time I thought I needed an AI filter, what I actually needed was to stop asking the question badly.

02 · first failureSix of seven queries returned garbage

I pointed it at my own market — people who might want customer-language research. Marketing, copywriting, agencies, founders. Six queries across eight subreddits. Here is a representative sample of what came back:

QueryTop resultUseful?
how do i know what my customers actually want"3 months ago I posted the exact process on how I sold $150,000 selling T-shirts on Amazon"no
market research too expensive for small business"From $0 to $323,010.43 in 14 months with a simple startup"no
making up customer personas"SEO is Not Hard. A step-by-step SEO Tutorial"no
struggling to write copy that converts"The ladders of wealth creation: a step-by-step roadmap"no

Every one of those is a real post with thousands of upvotes. None of them contains a person with a problem. Business subreddits are dominated by people broadcasting expertise, and those posts are engagement-optimised by construction — they're written to be upvoted. The people actually asking questions are underneath them, scoring eleven.

The best hit in the entire run, when I finally found it, was this, at 11 upvotes:

"How do you research audience problems when writing for a niche you don't personally use? … I don't actually know the audience's real problems deeply. I don't want to just Google and rewrite generic tips."

A real practitioner, describing a real problem, in their own words. Sorted by engagement it is invisible. Sorted by anything popularity-shaped it is invisible.

03 · asking vs tellingThe axis that isn't popularity

The distinction isn't quality or score. It's posture. Is this person asking, or telling?

That turns out to be measurable. Interrogative titles ("How do you…" counts; "How I…" does not). Uncertainty markers in the body — I don't know, not sure, struggling, any advice — capped, so one long rant can't dominate. And the signal I didn't expect to be the strongest: comments per upvote. Questions provoke replies; broadcasts collect applause. The good hit ran a ratio of 1.09. The guru posts ran 0.15.

Diagram: 173 posts entering a filter, guru posts discarded, 58 questions passing through
The same six queries, with and without the posture filter.
BeforeAfter
Hits returned17358
Guru posts in resultsmost of themzero
Top-ranked item6,623-upvote guide1-upvote question
Still returns off-topic resultsyesyes

That last row matters. The filter fixes posture, not topic. Afterwards I was still getting genuine, well-formed questions about barcode scanners and healthcare pricing — real questions about entirely the wrong subject. No amount of filtering rescues a vague query.

04 · second failureThe post is worthless. The replies are free.

Then I aimed it at a business idea: software for tradespeople who miss calls while they're on a job. Plumbers, electricians, one-van operations. It's a sensible-sounding wedge.

The tool found six independent founders, within about a hundred days, all validating the same idea:

"As I am building the voice agent for the contractors as I genuinely want to know is it really needed in the market"

"I'm not a plumber. I'm an automation specialist and I'm exploring building something specifically for solo plumbers"

"Not a plumber. Build software for tradesmen. Honest question about missed calls."

Six people asking tradespeople to confirm a pain that the six people had asserted. Meanwhile the tradespeople weren't posting about it unprompted. That asymmetry is itself a finding, and my tool couldn't see it — it classified those founders as prospects, because they look exactly like prospects: asking a question, commercial context, recent.

But the real discovery was structural. Search returns posts. Every one of those founder posts had replies, and I had never once looked at them. So I added a tool that reads a thread. On the post asking whether missed calls actually cost plumbers money, one reply, from an actual plumber:

"Texts and voicemail solve the problem."

Seven words. On the neighbouring thread about answering services, the operators were just as blunt: "we had to fire them after about a week", "not worth it", and — from someone with service contracts — "the call must be answered by a human within the country: no AI bots".

Six founders were building toward a market that had already tried the thing, hated it, and written down why. The founders did the outreach; the answers were sitting there in public. None of it was visible from the posts, because none of it was in the posts.

05 · sorting by what you'd doBuilders are not customers

So the tool grew a classifier — not by sentiment, but by what you would actually do with a thread.

Decision flow sorting threads into prospect, builder, insight and venting
Checked in this order. Builder first, because a founder validating an idea looks identical to a customer shopping for one.
ClassWhat it isWhat to do
prospectAsking, commercial context, recent enough to answerReply — genuinely, or not at all
builderValidating or building a solutionRead the replies, ignore the post
insightReal pain language, not actionable — too old, or nobody askingQuote it
ventingFeeling, with nothing to sell toLeave them alone

Two rules came from being wrong in production. Frustration followed by an actual question is still a prospect — plenty of good questions open with a paragraph of complaint. And the ask has to be in the title: one stray phrase in paragraph six is an aside inside a broadcast, which is how a write-up titled "I got into the ChatGPT Ads beta, sharing my setup" briefly scored as a hot lead.

Result on my own market, after all that: zero prospects. The good quotes were between 227 and 503 days old. The pain was real and the buyers weren't shopping.

06 · the punchlineThen I asked it about itself

Obvious next thought: this should be a product. A hosted version — paste in a business idea, get customer language back. I asked the tool to check.

Two calls. The first found that GummySearch — the category-defining Reddit-research product, "your customers are talking on Reddit", aimed squarely at founders — shut down on 30 November 2025. The second found why that might be: Reddit's commercial API runs at $0.24 per 1,000 calls with a ~$12,000/year minimum commitment and a two-to-four week approval process. The free tier is explicitly non-commercial.

So the hosted version starts at roughly £9,000 of committed cost, before a single customer, in a category whose leader just died. The tool talked me out of commercialising the tool. That is either very funny or the most useful thing it did, and I've decided it's both.

It stays free and open-source, running locally on your own API key. That model costs nothing to operate and doesn't need Reddit's permission.

07 · the boring, important partWhat this is not evidence for

Everything above is quotes from public forums, and it would be easy to launder that into authority it doesn't have. So, plainly:

This is good evidence for the words people use and whether a complaint recurs. It is not evidence for whether anything is true. Not market size, not pricing norms, not statistics. Reddit is self-selected, skewed, English-speaking, and thin in exactly the trades I was researching. Absence of complaint is not absence of pain — often it just means that audience isn't there.

Which is why the honest end of this story isn't more mining. It's five phone calls. The tool's job was to tell me what to ask about; it did that, and then it ran out of road.

08 · what I'd keepThe useful shape of being wrong

Four beliefs went in and none survived intact: that my market was actively shopping, that the missed-calls wedge was open, that the labour saving was the obvious pain, and that the tool should be a business. Each correction arrived with a link to a stranger who'd said so first, months ago, for free.

That's the part worth generalising. A research tool that only ever confirms you is a very expensive mirror. The value showed up precisely at the moments it refused — and the cost of learning it this way was a weekend, rather than a year and a Reddit contract.

The plugin is on GitHub. Bring your own Reddit key; it never sees mine.