-
-
FanFit matches teams and brands on what fans actually love. Try all three sides with one click, no sign-up.
-
Every step the sponsor-finder agent took, from Qloo fan profiles to sponsor conflict checks.
-
Who to call: brands Seattle Sounders FC fans love, ranked by fit and timing, with a plain explanation of how the ranking works.
-
Gatorade re-ranks all 79 teams for women 25–29 into fitness. Gotham FC and Seattle Reign jump into the top four.
-
Ask FanFit: give the agent a goal in plain words. It picks its own tools and can only name what they returned.
-
One-page pitch report a club can send a brand: fit, shared fans, what both audiences love, and why now.
-
A brand's note lands in the club's inbox with a FanFit report and a category-conflict warning.
-
Fans pick their teams and tastes, and see every partner and deal on one map.
-
Claims and redemptions flow back to the club next to the age group FanFit predicted (demo data, labelled).
-
Guided tours and an explanation next to every score, so anyone can pick it up.
Inspiration
Sponsorship deals are still sold on reach: a club pitches whoever has a budget, and a brand buys the biggest audience it can afford. Nobody checks the one thing that makes a partnership work: do these fans actually like this brand? Big leagues pay agencies for audience research. Mid-size clubs and local businesses, who would gain most from a well-matched partner, have nothing.
Qloo knows what people who like a team also like, across brands, music, film, places and more. We wanted to turn that into decisions both sides of a sponsorship can act on, and then measure whether they were right.
What it does
FanFit has three sides, all live in the demo: For teams (demo: Seattle Sounders FC)
- An agent profiles the club's fans, asks Qloo which brands and local businesses each age group loves around the club's city, searches the news for a reason to call each one now, and sets aside anyone already signed or in a category a current sponsor holds. You see who to call, the best brand in each sponsorship category, the fan mix, and every step the agent took.
- Prepare pitch turns a recommendation into a one-page report for the brand: fit, shared fans, what both audiences love, sourced news, a category check and a matchday idea. It opens by link without sign-in.
- Ask FanFit: give the agent a goal in plain words ("Which banks fit our fans, and do any clash with our sponsors?").
- Fan offers: publish a deal from a recommended local business to the club's fan map, then watch claims and redemptions next to the age group FanFit predicted.
For sponsors (demo: Gatorade)
- All 79 NBA, MLS, WNBA and NWSL teams ranked by how much more their fans like the brand than a typical big brand.
- Target audience: re-rank every team for an age group, gender and interest. For "women 25–29 into fitness", Gotham FC and Seattle Reign (NWSL) jump into Gatorade's top 4.
- A page per team explaining the fit, and a note to the club with a FanFit report attached.
For fans
- Heart your teams and see their partners and deals on one map; claim a code to show at the counter.
- Your taste: pick brands, music, movies and shows (Qloo suggests what fans of your teams like), and deals are ordered for you, with the reason: "because you like Patagonia".
The loop: Qloo data → recommendation → pitch → deal on the fan map → fans claim and redeem → predicted vs actual.
How we built it
- Qloo Insights API is the source of every team, brand, artist and place:
- Fan profiles come from
urn:demographics. - "Who to call" runs one query per age group (
signal.demographics.age) with the team and city as signals. - Category leaders use industry tags.
- The sponsor ranking scores 40 teams per call with
filter.results.entities. - Target audiences add age, gender and interest-tag signals.
- Shared tastes use the team and the brand together as signals.
- Fan "For you" ranks each fan's places once per taste.
- Fan profiles come from
- Scoring: Qloo affinities cluster tightly and differ in level by team and age group, so FanFit compares ranks and
z-scores, not raw values:
- Each team is compared with its own 40-brand baseline.
- Brands seen only without the city signal are pulled toward the middle, based on how well the two signals agree.
- Agents (OpenAI Responses API):
- A streamed multi-step sponsor finder.
- Ask FanFit, a goal-driven tool-use loop with 10 tools.
- A report writer.
- Grounding is enforced in code: Ask FanFit's final answer is rejected if it names anything a tool didn't return, or presents a signed or clashing brand as open. The model only searches the news, classifies and writes; it never supplies names or numbers.
- App: Next.js 16, React 19, Tailwind 4, Supabase (Postgres, Auth, row level security), Leaflet + OpenStreetMap, driver.js guided tours, deployed on Vercel.
- Security:
- 135 automated row-level-security checks.
- Team accounts need approval.
- Scores in reports are written server-side.
- Shared demo accounts can't damage what the next judge sees.
- Fans' tastes are private.
Challenges we ran into
- Making Qloo scores comparable. Raw affinities made some teams win for every brand. A per-team 40-brand baseline (z-scores) fixed the sponsor ranking; per-age percentiles weighted by the fan mix fixed the team side.
- The city signal drops brands. Adding the team's city made results local but removed some national brands, so we score those on the team signal alone and shrink them toward the middle.
- Keeping the model honest. Early runs of Ask FanFit recommended a brand that was already a sponsor, and called a sold category "open". We moved those rules into code: answers that hide a clash are sent back.
- Clubs with many sponsors. Seattle lists 23 partners; after removing clashes, the first shortlist had one brand left. The shortlist now refills in fit order until there are ten callable brands.
- Rate limits. Production hit Qloo's 5 requests/second limit, so requests are paced and retried. Responses are cached in Postgres, full analyses are saved and replayed, and each costly action has a daily limit.
- What the API doesn't do. Qloo audience groups were accepted by the hackathon API but changed no result, so we tested every target-audience option before offering it and dropped those.
Accomplishments that we're proud of
- A two-sided product: teams and brands find each other from the same Qloo evidence, and can send each other a report that explains the fit in one page.
- A closed loop that can test the recommendations: deals published from FanFit's picks, fans claiming them, and "Predicted vs actual" by age group.
- Agents whose answers can be trusted: every name traces back to a tool call, shown step by step.
- Judge-ready: one-click demo accounts, guided tours on every page, and an ⓘ next to every score explaining how it is calculated.
What we learned
- Taste data is most useful when it's compared, not read raw: "your fans like this brand more than their usual brand" is a decision; "affinity 0.91" is not.
- The most important guardrails for an agent belong in code, not in the prompt.
- Public data can't tell you whether fans liked a partner. We looked at MLS and NBA sponsor renewals and local search interest, but those outcomes also depend on price, contract length and budgets. That's why FanFit measures fans directly: each deal on the fan map records who claims and redeems it, so fit can be checked against real behaviour. Until that data comes in, FanFit presents fit as shared taste, not a sales forecast.
What's next for FanFit
- Real redemptions from pilot clubs, to measure whether FanFit's predicted audiences are the ones who come.
- Deal history and pricing, so brands can compare fit against cost.
- More leagues and college teams, where local partners matter most.
- Email delivery and reminders for pitches, and a shared deal room once both sides say they're interested.
Built With
- leaflet.js
- nextjs
- openai
- postgresql
- qloo
- react
- supabase
- tailwindcss
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.