Inspiration

Every concert, festival, comedy tour and college fest needs sponsors, and almost every host picks brands the same way: copy whoever sponsored a similar event, or ask around. Meanwhile, brands increasingly want proof that an event's audience fits them.

We kept coming back to one sentence. Incumbents ask "who sponsored events like yours?" We wanted to ask "what does your crowd actually love?" That second question is exactly what Qloo's cross-domain taste graph can answer, and almost nothing else can. If Marquee worked the same without Qloo, it wouldn't exist.

Sponsorship is serious money: Live Nation — the world's leading live entertainment company and the owner of Ticketmaster — reported about $1.3 billion in sponsorship and advertising revenue for 2025. It has an entire division to sell it. Our users are the hosts who don't: indie festivals, college fests, comedy nights, community runs, club nights and meetups.

Our demo crowds are built from real performers, teams and brands people know: a comedy night with Cedric the Entertainer, Steve Harvey, D.L. Hughley and Kevin Hart as taste signals; a Los Angeles Dodgers supporters' watch party (the Dodgers, Shohei Ohtani, Clayton Kershaw); an indie festival in Austin (Khruangbin, Japanese Breakfast, Mac DeMarco, Alvvays, Beach House); and a Latin-pop arena tour (Bad Bunny, Karol G, Peso Pluma, Rauw Alejandro, Shakira) — the promoter-scale case. The events are fictional and unaffiliated; every brand and number comes from Qloo.

And for the biggest players, the hardest objection is "Brands come to us anyway — and every brand fits a big show." Marquee answers it three ways:

  • Fit is not equal. Marquee shows how unequal it really is.
  • Pick the right inbound brand. Three beverage brands want exclusivity? Rank them head-to-head for this crowd.
  • Find the next sale. Hidden gems and under-sold categories are revenue that inbound demand never surfaces.

What it does

A host drops in whatever they already have — a sponsor deck PDF, a poster, a website or a lineup. Marquee's agent then:

  1. Understands the event. A Groq vision model reads PDF pages and posters, and every prefilled field shows its source ("from deck p.2"). Sponsor logos on the materials become Existing sponsors, so we never pitch them as new.
  2. Matches the lineup in Qloo with qloo_describe. Ambiguous names (Alvvays the band vs the album) show candidates instead of a guess.
  3. Reads the crowd's taste with qloo_recommend across music, TV, film, podcasts, books, games, places and brands, plus qloo_audience_demographics.
  4. Discovers brands with a bounded Groq tool-calling agent that seeds Qloo brand recommendations from the crowd's other tastes — that's where the hidden gems come from.
  5. Quantifies every brand with four Qloo numbers:
    • Taste match: rank among all candidates (qloo_rank)
    • Audience overlap: how many of the crowd's top 20 tastes the brand's fans share (qloo_recommend → qloo_compare_audiences)
    • Local strength: the brand's standing in the event city (qloo_where_popular)
    • Momentum (qloo_trends)
  6. Checks the web for cited 2025–26 sponsorship activity.
  7. Delivers a ranked, explained, exportable shortlist on three shelves — Natural fits, Hidden gems, Local heroes — under a split-flap "Now showing" board.

Then the host can work it like a seller:

  • Sponsor slots: one winner per category, ranked head-to-head by qloo_rank among discovered and inbound brands, with "Why #1 over #2" in numbers and an honest "Too close to call" under 5 points.
  • Check a brand: a Strong / Good / Weak verdict for any inbound brand, with offers lined up side by side.
  • Ranking lenses (Most loved, Strong in our city, Rising, Proven sponsors) re-weight stored Qloo components instantly, with no new API calls.
  • Portfolio: properties × brands heat grid, the best property for each brand, and under-sold categories.
  • Compare vs LLM-only: the same brief to a plain LLM, shown next to Marquee's evidence.
  • Export: CSV and a print-ready PDF shortlist.

Every number traces to a Qloo response or a cited web source. Qloo data and Marquee's interpretation are kept visibly separate with source chips on every claim.

How we built it

  • Qloo, the core: a FastAPI backend holds one long-lived qloo mcp stdio session (official @qloo/qloo-harness), started in the app lifespan with the key passed only through the environment. Every call goes through a gateway with bounded concurrency, retries only when error.retryable, automatic session restart and a qloo exec fallback. Every envelope is cached by sha256(tool + args) in Postgres. We use 8 of the 9 workflows (describe, recommend, rank, compare_audiences, where_popular, trends, audience_demographics, find_tags) plus qloo api entity for batch tags.
  • Agent pipeline: eight explicit stages streamed over Server-Sent Events, each event persisted so finished runs replay exactly. Stage 4 is a bounded Groq tool-calling loop (gpt-oss-120b) that may only submit brands that actually appeared in Qloo results.
  • Deterministic scoring: $$\text{Fit} = 100 \cdot \frac{\sum_i w_i c_i}{\sum_{i \in \text{available}} w_i}$$ with weights taste 40, overlap 30, local 15, momentum 10, sponsor 5. Missing components are re-weighted and shown as "n/a". The LLM never produces a score. The same formula runs in Python and TypeScript, checked against shared test vectors.
  • Writing with guardrails: the writer (qwen3.8-27b) gets only the metrics JSON. Every "why" bullet must contain a real number and a valid evidence id, validated in code, regenerated once, then replaced with a deterministic number-backed template if needed.
  • Front end: Next.js (App Router, TypeScript), Tailwind v4, Radix primitives, Motion, Recharts and d3-hierarchy, plus custom SVG for the Overlap disc and a split-flap board. The design language is "backstage pass meets departure board".
  • Data: Supabase Postgres via SQLModel. Hosted on Vercel and Render's native Python runtime — no Docker.

Challenges we ran into

  • Reality vs the API we imagined. compare_audiences returns tag profiles, and a crowd of artists shares no tags with a brand. Our fix: compare the crowd with the brand fans' favourite artists, which gives a clean, explainable metric — "Urban Outfitters' fans share 8 of your crowd's top 20 tastes; Pepsi's share 4."
  • Geohashes, not cities. where_popular returns heatmap cells, so we turned them into "Top X% of areas in Austin" and labelled national hotspots by nearest city.
  • Honest momentum. The hackathon trend series were flat, so we show "Flat" and leave momentum out of the score rather than pretend.
  • Rate limits. Groq's free tier allows about 8K tokens per minute per model. We built a per-model rolling token budget, model fallbacks, a prompt cache, per-brand web-research caching and deterministic fallbacks, so the product never shows invented text even when throttled.
  • Ambiguity. Qloo returns needs_input for many names. We surface candidates to the user instead of guessing.

Accomplishments that we're proud of

  • A real agent, not a wrapper: every badge in the live "Soundcheck" view is an actual Qloo tool call.
  • Explanations a non-technical promoter can paste straight into a sponsor email ("Copy talking points").
  • An honest product: n/a instead of guesses, "Too close to call" instead of fake winners, citations instead of claims.
  • The LLM-only comparison makes Qloo's value obvious in five seconds.

What we learned

  • Taste data is most powerful across domains: the brands a crowd loves are best found through the TV shows, podcasts and places it loves.
  • Deterministic scores plus LLM narration is the right split: users trust numbers they can trace.
  • Designing for limits (memory, rate limits, cold starts) early made the product sturdier.

What's next

  • Direct integration with ticketing data (aggregate only) for live audience signals.
  • Brand-side view: "which events should my brand sponsor?" (the mirror question).
  • Pricing guidance per slot from fit and local strength.
  • Team workspaces and shared shortlists for partnerships teams.

Built With

Share this project:

Updates

Submission history