Inspiration

Most consumer products fail for boring reasons, they launch to the wrong audience, at the wrong price, with an objection nobody saw coming. Big brands catch this with focus groups, but a real one costs thousands of dollars and takes weeks. A first time founder has neither. So founders ask ChatGPT, "Would people like this?" The answer is flattering, generic and culturally average. It's the culturally blind agent problem : the model has never met your customer, so it imagines one. We asked: what if the panelists' opinions came from measured taste data instead of an LLM's imagination?

What it does

Proxy Panel is a focus group in about 90 seconds. You describe a product, its price and your target audiences you're considering. It answers one question:

Which audience do I launch to first, at what price, and what will stop them buying?

  1. Brief. Describe the product, category, price, an optional second variant, and 1–3 target segments.
  2. Comparable brands. It proposes 3–6 real brands from Qloo (for a functional soda: Olipop, Poppi, Ghia). You confirm, remove, add or reweight them.
  3. Live panel. Six personas, each built from a real Qloo taste fingerprint, debate your product in two streamed rounds. A moderator probes the biggest disagreement in round 2. Every claim carries a receipt chip showing the Qloo entity and data behind it.
  4. Report. A verdict first , then segment ranking, top objections with the taste data behind them, price bands per panelist, a variant comparison, what the winning segment loves (for ads and partnerships), what would flip the verdict, and a recruiting brief with 5 interview questions to check it all with real people.

How we built it

The core rule: code computes, the LLM explains. The LLM never decides how a persona feels about your product. Python does, from Qloo data, before any model speaks.

Lift instead of raw affinity. Raw Qloo affinities bunch up near the top of the scale, so they separate poorly. We use lift, a persona's affinity to an entity minus that entity's affinity under a neutral baseline:

$$\text{lift}(p, e) = \text{affinity}(p, e) - \text{affinity}(\text{baseline}, e)$$

Stance is computed. For persona $p$ and the confirmed comparable brands $c$ with user weights $w_c$:

$$\text{stance}_p = \frac{\sum_c w_c \cdot \text{lift}(p, c)}{\sum_c w_c}$$

Scores are scaled across the panel and split into thirds: enthusiast, on the fence, skeptic. If every persona's raw lift is negative, all of them are skeptics, so a bad concept can't produce fake fans.

Price is computed. Each brand a persona over-indexes on gets a price tier $t \in {1,2,3,4}$ (budget → luxury). The persona's band is the lift-weighted mean tier plus or minus one standard deviation:

$$\text{band}_p = \mu_p \pm \sigma_p, \qquad \mu_p = \frac{\sum_e \text{lift}(p,e)\, t_e}{\sum_e \text{lift}(p,e)}$$

Your product "fits" a persona when its tier falls inside that band.

Challenges we ran into

  • Making personas genuinely different. Six personas from the same audience tend to sound alike. We give each one a different subset of the segment's seed entities and a different age bucket, so their fingerprints differ for a real, data-backed reason.
  • Keeping the LLM honest. Models love to cite brands they weren't given or drift into enthusiasm. The validator plus one targeted retry fixed most of it.
  • The LLM API moved under us. New LLM keys returned 404 on the classic endpoint, so we moved to the newer Interactions API mid-build. The free tier's daily request limit also ended many test runs early. That's why a failed run can now resume from the stage it stopped at instead of starting over.
  • Deploying a streaming app for free. The panel runs for about 2 minutes in the background and streams live, which doesn't fit serverless hosting. So the backend runs as one long-lived service, the frontend is on Vercel, and Neon's connection strings needed adapting for the async Postgres driver.
  • Small things that weren't small. Getting the report to export to PDF without blank half-pages, and making the run steps clickable so you can go back, edit the brief or brands and re-run, took more care than expected.

Accomplishments that we're proud of

  • The numbers never come from the LLM. Stance, price bands and segment ranking are computed from Qloo data, and the model only explains them.
  • Every claim is traceable. Each statement links to the Qloo entity behind it,
  • The report answers a real decision: which segment, which variant, which price tier. It's honest about its limits and ends with who to interview next.

What we learned

  • Grounding is a design choice, not a prompt. Telling an LLM to "be accurate" does little. Taking the decisions away from it, and checking every sentence against data, does a lot.
  • Lift beats raw scores. Measuring how much more a group likes something than people in general is what makes taste data useful for decisions.
  • Free tiers shape architecture. Caching, mock modes, resumable runs and a spend cap all came from quotas, and they made the product sturdier.

What's next for Proxy Panel

  • "Without Qloo" side by side. Run the same brief with taste data switched off and show the difference in grounding, specificity and persona variety.
  • Ask the panel: follow-up questions to one persona.
  • More markets: local brands and prices beyond the US.
  • An MCP server, so other agents can call the panel as a tool.

Built With

Share this project:

Updates

Submission history