The problem

When a consumer company buys a brand, licenses one or co-brands with one, the deal model covers revenue, margins and synergies. Whether the two customer bases actually like each other, care about the same things, live in the same places and are heading the same way is left to gut feel. That is what Qloo's taste graph measures, across music, film, TV, podcasts, places and brands.

What it does

Simpatico is an agentic deal desk for M&A bolt-ons, licensing and co-branding, and VC theses.

  1. Mandate. Name a buyer (a brand plus a few flagship brands it owns), a deal type and a universe of candidate brands, or let Qloo discover brands the buyer's audience already over-indexes on.
  2. Resolve. Every name becomes a Qloo brand entity. Qloo's search has no relevance score, so anything ambiguous ("PepsiCo" → Pepsi?) becomes a confirm chip for a human instead of a silent first hit.
  3. Screen. One Qloo call scores the whole universe for the buyer's audience, and the top 8 (plus pinned brands) go to full analysis. For acquisitions and venture theses, Qloo's corporate data also skips brands that already belong to another group.
  4. Analyse. About nine Qloo calls per target compute six audience-fit metrics in code: two-way affinity, taste-profile overlap, cross-domain agreement, demographics, geographic footprint and momentum.
  5. Debate. A bull agent and a bear agent (Claude Haiku 5.5) argue each target from the same evidence pack. A code judge checks every number they cite against the evidence ledger and rejects claims that don't match, misread the data or invent red flags. Rejected claims stay on screen with the reason: across the three showcase screens the judge rejected 38 of 247 claims.
  6. Act. Simpatico writes an IC memo whose numbers are all checked against the ledger, updates a pipeline board, drafts outreach that only goes out after a human approves it, and re-scores watched deals every week.

Without Qloo it refuses to score: every scoring path stops, and the UI says "Simpatico doesn't guess. Connect Qloo."

Why it's an agent, not a report. Given a mandate, it runs the whole screen without further prompting: it resolves names (asking a human only when a name is ambiguous), makes about 120 Qloo tool calls, scores, runs two Claude agents under a code judge, writes memos, updates the pipeline, drafts outreach that waits for a human's approval, and re-scores watched deals every week.

How Qloo is used

Every call goes through one rate-limited, retrying gateway that logs it as an evidence row; the deal room's provenance drawer shows the Qloo call behind each metric.

  • /search → entity resolution and confirm chips
  • /v2/tags → category tags for discovery
  • /v2/insights, buyer as signal, filter.results.entities=<universe> → forward affinity a for every candidate in one call, plus Qloo's corporate profile (parent, positioning, competitors)
  • /v2/insights, target as signal, the buyer's brands as results → reverse affinity b (m1)
  • /v2/insights, filter.type=urn:tag → top-50 cultural taste profiles (m2)
  • /v2/insights for artists, TV shows, films and podcasts → the buyer audience's top 25 titles per domain, then the target audience's affinity for them (m3)
  • /v2/insights, filter.type=urn:demographics → age × gender over-index (m4)
  • /v2/insights, filter.type=urn:heatmap → metro footprint and white space (m5)
  • /v2/trending → momentum relative to the screened cohort (m6)
  • /v2/analysis/compare → shared catalogue categories for the debate

A fresh screen of about 30 brands makes 120–140 Qloo calls. Responses are cached privately on the server; no Qloo data is stored in the public repository.

Request to result, one target

Dodgers licensing screen, target Mitchell & Ness:

  1. Signal = Los Angeles Dodgers, results = 25 labels → forward affinity a = 0.80 (4th of 25). The same call returns Qloo's profile: founded 1904, parent Fanatics, competes with New Era, Starter, Champion and Nike.
  2. Signal = Mitchell & Ness, result = Dodgers → b = 0.80, so m1 = 2ab/(a+b) = 0.80.
  3. m2 = 0.35 (26 shared taste tags of 74); m3 = 0.89 (music 0.94: Curren$y, Cam'ron; TV 0.90: Ballers, Brockmire; film 0.86: Coach Carter, Glory Road; podcasts 0.84); m4 = 0.91; m5 = 0.33, with white space in Philadelphia, New York, Chicago, Memphis, Atlanta, Detroit, Cleveland and Baltimore; m6 = 0.58 (trending z = +0.51 against the cohort over the 24 weeks to 1 Oct 2025).
  4. Code: F = 68.0 with all of the weighted evidence measured and no red flags → ADVANCE, first of 8. The judge accepts 8 of 10 claims and shows why it rejected two bear points that cited above-average values. The memo passes the number check, and an outreach draft waits for approval.

How it scores (code, never the model)

  • m1 two-way affinity = 2ab/(a+b), so one-sided love scores low
  • m2 position-weighted Jaccard over both top-50 tag profiles (Qloo's tag affinities cluster at 0.98–1.00, so rank carries the signal)
  • m3 cross-domain agreement across music, TV, film and podcasts
  • m4 cosine of the age × gender over-index vectors
  • m5 metro-level affinity correlation across 55 US metros, relative to the cohort; white space = target top quartile, buyer bottom half
  • m6 cohort-relative trending z-score; a flat window is "not measured", never neutral

F = 100 · Σ w·c·x / Σ w·c with coverage c ∈ {1, 0.5, 0} and weights per deal type; below 60% coverage there is no score. Red flags: one-sided audience, taste clash, demographic mismatch, fading, no geographic overlap. ADVANCE at F ≥ 67 with no flag; WATCH at F ≥ 62 with no flag (or one fading / no-overlap flag offset by a validated bull claim); otherwise PASS. The bands were calibrated once from the pooled scores of the three showcase screens.

Why it beats an LLM on its own

An LLM alone can't measure two-way affinity, demographics, metro footprint or momentum, and can't check its own claims. The /ablation page also tests the ranking directly: it runs a finished screen four ways, including Claude Opus 5.5 ranking the same universe from general knowledge alone:

  • Better-for-you bolt-on (PepsiCo audience, 29 brands): Kendall τ between the LLM-only ranking and Qloo's audience ranking = 0.04, top-5 overlap 0 of 5. Without cross-domain agreement, 2 verdicts change.
  • Dodgers licensing (25 labels): τ = 0.46, top-5 overlap 4 of 5. General knowledge gets close where the fit is famous (MLB's existing licensees). Without cross-domain agreement, 6 verdicts change, including the only ADVANCE.
  • Run-club VC thesis (HOKA, On, Tracksmith and Athletic Brewing; 23 brands): τ = 0.54, top-5 overlap 3 of 5. Without cross-domain agreement, 5 verdicts change, including both ADVANCE.

Dropping two-way affinity changed nothing on these screens: between two single brands Qloo's affinity is symmetric, and on the multi-brand screens no target was one-sided.

After the verdict

  • Pipeline board with every screened target and its next step, plus CSV export.
  • IC memo per ADVANCE and WATCH target, blocked from export if any number is missing from the ledger; a language guard rejects causal or individual-level wording.
  • Approval-gated outreach. Drafts for ADVANCE targets; the approval is bound to the recipient, subject and SHA-256 of the text, and any edit voids it. In production every approved email is sent through Resend to the builder's sandbox inbox and names the intended recipient, who is never contacted. A screen that downgrades a deal withdraws its waiting draft.
  • Weekly monitor. A signed GitHub Actions cron re-scores watched deals and alerts on rank moves, momentum shifts and verdict changes; a replay over 2024 Qloo trending history shows real alerts.

How we built it

A TypeScript monorepo: a Next.js 16 app on Vercel, Postgres on Neon, and packages for the Qloo gateway, the pure scoring core, the run engine, the Claude agents and the actions. The agents use the Anthropic TypeScript SDK with structured outputs, adaptive thinking and server-side refusal fallbacks, at low effort: debate, memos and outreach on Claude Haiku 5.5 (about 2 cents a screen), and the no-Qloo ablation ranker on Claude Opus 5.5, so Qloo is compared against the strongest model. Serverless functions stop at 300 seconds, so a screen runs in budgeted, leased slices that hand off through a signed internal call. Claude's answers are stored by a hash of model, prompts and evidence, so a re-run replays the same debate at no cost while the judge re-checks every claim. 134 tests run in CI alongside a production build, a container build and a secret scan.

Challenges we ran into

  • Qloo's search returns no relevance score, so name resolution needed its own rules and a human confirm step.
  • Tag affinities cluster at 0.98–1.00, so taste overlap had to weight tags by rank.
  • /v2/analysis/compare compares catalogue tags rather than audiences, so cross-domain agreement is built from cross-rank calls.
  • The trending series has been flat since mid-October 2025, so momentum is cohort-relative, measured in the latest window that moves (24 weeks to 1 Oct 2025), and reported as "not measured" for later windows instead of guessed.
  • Moving the debate from Opus to Haiku cut its cost about 30-fold but dropped the judge's acceptance to 24–42%: Haiku tagged red flags the code hadn't raised and argued values just under the shortlist average as strengths. Instead of paying for a bigger model, each side now gets only the flags the code raised and the code's own strength/weakness reading of every value; acceptance came back to 83–86%.
  • Checking the debate end to end exposed our own bugs: the memo checker rejected averages the writer had been shown, claims came back in random order, and one LLM-only ranking came back as "placeholder". Each is fixed and covered by a test.

Accomplishments that we're proud of

  • Every number a model writes is checked in code against the Qloo evidence it came from, and the rejections are visible.
  • A published ablation that shows where Qloo changes the answer and where it doesn't.
  • It acts: pipeline, memo, approval-gated outreach and a weekly monitor, not just a report.

What we learned

Qloo changed the answer most where general knowledge had least to go on: for better-for-you brands against the PepsiCo audience, the LLM-only ranking was unrelated to the audience data. And a language model is most useful in this workflow when it argues over evidence it cannot change: with a strict code judge, a small model does the job, and the judge's rejections show exactly where it slipped.

What's next

Watching deals across more buyers, richer universe discovery from Qloo tags, and real email delivery once outreach leaves the sandbox.

Safe use and limitations

  • Only brand and cultural-entity names and ids go to Qloo; no personal data, and outreach recipients never do.
  • Results are aggregate audience affinities, never claims about individuals or causation. Not investment advice.
  • Showcase scenarios are illustrative public-data examples. The M&A showcase pins two brands PepsiCo has since agreed to buy (Siete, Oct 2024; poppi, Mar 2025) as a sanity check; that is look-ahead biased, not a prediction. It is one hit and one miss: poppi ranks first of 9 (WATCH) and Siete last (PASS), a snack deal that audience fit doesn't explain.
  • Small brands can have thin coverage; Simpatico reports INSUFFICIENT_COVERAGE instead of guessing.

Try it

Built from scratch for the Qloo Agentic Hackathon during the submission period (first commit 23 Oct 2026).

Built With

Share this project:

Updates

Submission history