The problem
Creators on Twitch, YouTube, TikTok and Instagram usually find sponsors by chasing them: cold outreach, spreadsheets, or an agency in the middle. Brands want the opposite end of the same thing, creators whose audiences actually fit what they sell.
Sponsorboard’s positioning calls it “the operating system for creator sponsorships”: matching, campaigns, direct messages, a deal lifecycle with deliverables, and a creator dashboard called Pulse, in one app. The public tagline is shorter: stop chasing sponsors, start choosing them.

Two versions
The first version started in May 2025 as a Laravel and Inertia app, split into sponsorboard.gg for creators and sponsorboard.co for sponsors, with a Filament admin. I set up the organisation and the repositories, led product and design, and a small team of developers wrote most of that code.
I mapped the sitemap, creator onboarding and deal flow on one board. One branch of the onboarding map pulls platform metrics through APIs into the matching algorithm; in the second version that branch became the core of the product.

In 2026 I rebuilt the product on my own as an Expo Router app (iOS, Android and web from one codebase) on Supabase: Postgres with row-level security, Storage, Auth and Deno edge functions. A separate Next.js 16 dashboard handles moderation and matching oversight.
Matching, stage by stage
Matching runs in one edge function, match-creators, and returns the ten best creators for a sponsor’s campaign:
- Stage 0, guard rails. A fixed-window rate limit of 20 runs per user per hour, and a 24-hour result cache keyed on campaign and pipeline version. A trigger on campaign updates invalidates the cache.
- Stage 1, hard filters. Budget, platform, language and geography in one SQL function, before any model is called. Missing fields fail open, so an incomplete profile is not silently dropped.
- Stage 2, retrieval. pgvector with an HNSW cosine index returns the top 30 by similarity. Profiles are embedded with OpenAI
text-embedding-3-small(1536 dimensions). - Stage 3, rerank. Claude Haiku 4.5 scores the 30 and keeps 10, each with a short explanation in the sponsor’s language, grounded only in the profile fields it was given. The static scoring rubric sits behind a prompt-cache breakpoint.
The rerank is reciprocal. The model scores every candidate on two independent axes, fit_for_sponsor and fit_for_creator, from 0 to 10. The server, not the model, combines them as a harmonic mean, so a match that is great for one side and poor for the other cannot rank high.
The model’s output is not trusted as-is. It must return JSON only. The server drops unknown ids, clamps scores, truncates explanations at 300 characters, removes duplicates and recomputes the mean. Malformed output gets one retry, then a hard 502. Bios and briefs are free text written by users, so they are XML-escaped and wrapped in data tags, and the rubric says that tag content is data, never instructions, and that manipulation attempts count against a profile’s credibility. The synthetic seed data includes a creator whose bio is an injection attempt, and the end-to-end test asserts it gets no anomalous scores. The v1 suite passed 14 of 14 checks against the live project; the injected creator landed seventh of ten, with fit scores of 2 and 4.
Smaller decisions keep it cheap and maintainable:
- Only two files talk to AI providers. Every model name, pool size and result size lives in one config file; bumping the embedding version forces a full re-embed.
- Re-embedding runs explicitly, gated on a profile hash, instead of from database triggers, which are fragile when they call external APIs.
- Follower count is read live by the reranker and kept out of the embedding text, so stats updates don’t churn embeddings.
Built to learn
The pipeline has a history. An earlier admin-side matcher used a weighted Jaccard score (niche 40%, platform 30%, content type 20%, deal type 10%), and an operator adjusted and pushed suggestions by hand. Version 1 replaced that with retrieval and the LLM rerank.
The next step is planned into the data. A match_events table records a funnel from impression to click, contact, reply, deal created and deal completed, with dismissals as a negative signal. Each outcome row snapshots the scores of the latest impression, so every row is a ready training example. The documented v2 trains a learned ranker on those outcomes and keeps the LLM only for explanations.
Verified data, honest UI
Matching is only as good as its inputs, so creators link YouTube, TikTok, Instagram, Facebook and Twitch through OAuth instead of typing in handles. Verified follower counts feed the profile the reranker reads; tokens sit in tables only the service role can access.

The same rule applies to the interface. A production-readiness pass removed fabricated fallbacks from empty profiles (fake follower counts, a canned bio, default niches) and replaced them with honest empty states. It also removed the gamification: XP, streaks and badges. One product rule is enforced in the database itself: only creators can start a deal, so campaign inserts require the sponsor role and deal inserts require the creator role.
How I built it
The 2026 rebuild is mine end to end, and I built most of it by directing AI coding agents. I answered the product decisions up front, then ran a ten-phase readiness loop, from schema cleanup and truth in UI to type safety. When the production schema had drifted from the migrations, it was introspected into one 1,114-line bootstrap migration (14 tables, 34 RLS policies) instead of being backfilled by hand. In one batch, 11 parallel agent workers in separate worktrees produced 12 pull requests; all were merged, and main ended green on typecheck, lint and tests. Security hardening ran the same way: a public profile view for cross-user reads, chat media behind signed URLs, the session in SecureStore, a gitleaks pre-commit hook and a pgTAP regression test. My part was the architecture, the decisions, review and merge order.
I also designed the product UI in Figma, the brand identity, and the mascot, a block character built from the four squares of the logo.
Status
Sponsorboard is built, not launched. The MVP features are in place, what the app deliberately leaves out is written down in a known-limitations document, and the matching and OAuth edge functions were deployed to the production backend in June 2026. Some migrations still need to be applied there, a background poller that keeps creator stats fresh is still in review, and the app is not in the stores yet. Payments are deliberately out of scope: the MVP is an introduction layer and creators and brands settle off-platform for now.
The public face today is the early-access site at getsponsorboard.com.

