OVERHEARD
The questions brands don't answer, found, classified, and counted. A social-response-gap engine built on Google Cloud.
BRIEFING
Every day, customers ask brands questions in public, under the brand's own YouTube videos and Instagram posts. Brands miss a huge share of them. Each ignored question is a lost sale, or a public complaint that everyone with the same question sees go unanswered. Social teams know it hurts, but they can't see the whole surface, and they can't put a number on it.
Overheard measures it. For a set of competing brands, it collects the public conversation on their own posts, uses Gemini to tell a real question or complaint from noise, checks whether the brand ever replied, and ranks the field by who answers and who goes silent, the benchmark a social team would actually act on.
ROLE / METHOD / OUTCOME
HOW IT WORKS
STAGE 1: INGEST & WAREHOUSE
Scheduled jobs pull each brand's public comments into BigQuery, normalized to one schema. An official-account registry flags which comments are the brand replying, so "answered" vs "ignored" is ground truth, not a guess. Idempotent loads mean a rerun never double-counts.
STAGE 2: CLASSIFY & RANK
Gemini reads every comment and tags it, question, complaint, purchase intent, or noise, with strict JSON output. A classical-ML layer then clusters the missed comments into themes and scores each one 0–100 for answer-first priority, and SQL marts rank each brand by what it leaves unanswered.
The result is three views: an Instagram league table of who gets addressed and who stays silent, a priority-ranked feed of the actual missed conversations, each one a real customer the brand left on read, and a YouTube context layer behind it.
THE FINDING WORTH TELLING
The first data pull looked fantastic: one brand had thousands of comments and answered none of them. It was wrong. Resolving channels by name search had grabbed Ninja the gaming streamer instead of Ninja the appliance brand, thousands of comments of gaming chat, a beautiful and meaningless number. A manual spot-check against the live comment URLs caught it. The fix was to pin every brand's official channel by verified handle. That's the whole case for a manual verification gate: the numbers that look cleanest are the ones most worth checking.
THE ENGINEERING ARC
- Schema first: a partitioned, clustered BigQuery model with raw, staging, and mart layers before a single row was loaded.
- Ground truth over guessing: response gaps are measured only on owned surfaces, where a brand's own reply is verifiable, not inferred.
- Caught the channel bug: switched from name search to handle-verified channel IDs after the verification gate flagged the wrong "Ninja."
- Vertex over the consumer API: routed Gemini through Vertex AI so it bills against the cloud project, after the consumer API hit a separate billing wall.
- Measured, not asserted: every prompt change is scored against a hand-labeled golden set before its output is trusted.
- Tested the fancier model, kept the winner: a social-media sentiment transformer was benchmarked against the LLM on the golden set and lost, so the LLM kept tone and classical ML went where it wins: theme clustering and answer-first priority ranking.
- Calibrated the headline metric: the scrape tier can't see in-thread replies, so 34 flagged comments were hand-checked against the live threads. About 28% had a brand reply the scrape missed; every published number now carries that correction instead of the flattering raw figure. Brands turned out to answer the sales questions and skip the service complaints.
- Shipped the tool: a self-contained console reads the marts and renders the league table plus a priority-ranked feed of missed conversations.
RESULTS
STACK: BigQuery · Vertex AI (Gemini) · Cloud Run · Cloud Scheduler · Python
Figures are live from the tool and reflect the latest data pull.