Brand Match App — System & Ops
Last updated: 2026-04-06
1. Purpose and Users
Brand Match is the internal web app agents use to:
- find the best creators for a brand,
- see recent brand activity and past integrations,
- manage agent ownership for brands,
- spot cross-sell and category gap opportunities.
Primary users: Annie, Charlie, Henry and other brand-facing sellers.
2. URLs and Access
- Production:
https://brand-match-app.vercel.app - Mini (internal only):
http://100.104.197.44:3000 - Repo:
partnerships-collabs/brand-match-app
Auth is handled by Vercel. The app is internal only and should not be shared as a public link with brands.
3. High-Level Architecture
Frontend
- Next.js App Router, TypeScript, Tailwind.
- Deployed on Vercel under the
creators-agency1team.
Backend data source
- All core data now comes from ca-data at
https://ca-data.vercel.app. - Brand Match never reads local JSON files for matches or brand intel any longer.
ca-data is a Node/Express API backed by Neon Postgres. It aggregates:
- Airtable creator roster (headshots, niches, demo data),
- Close CRM deals for spend and deal count,
- Monday deliverables for integrations and CPM math,
- Fathom call summaries,
- Email summaries from Close and Gmail,
- Brand match tables (v3 scoring output and enrichment files).
Brand Match talks to ca-data through a small set of API routes in the Next.js app. These use Vercel env vars:
CA_DATA_URLfor the base URL,CA_DATA_TOKENfor bearer auth.
Key point: ca-data is a single point of failure for Brand Match. If Brand Match pages stop loading data, check ca-data first.
4. Data Model and Flow
4.1 Matches and scoring
- All creator–brand match rows live in a Neon table inside ca-data.
- The v3 scoring pipeline is a Python batch job that writes scores and components back to Neon.
- Brand Match reads matches by brand or creator, not by scanning one giant JSON blob.
Signals in v3 scoring (summarized):
- Brand behavioral fit,
- Niche precision,
- Competitive context (currently flat),
- Price versus market,
- Audience demographics,
- Inventory and momentum.
Matches are exposed by ca-data endpoints such as:
GET /matches?brand=BrandName,GET /matches?creator=CreatorSlug.
The app never edits matches directly. Any change to scoring or assignments happens through ca-data scripts.
4.2 Brand intel
Brand intel for cards and detail views is assembled in ca-data and exposed through:
GET /brand-intelfor available brands and filters,GET /brand-intel/:slugfor full detail.
Inputs that roll into brand intel:
- Close CRM won and active deals (total deals, average rate),
- Monday deliverables (integration counts and CPM),
- Brand activity dates (last integration date),
- Contact history (last contacted date and agent),
- Email summaries for the most recent outbound threads,
- Website and contact info.
Brand Match uses this to power:
- Available brands table and filters (last activity, last contact, actively spending),
- Brand overview cards (average rate, average CPM, number of past deals),
- "Last Email" and contact context sections.
4.3 Creator and roster data
Creator profiles in Brand Match are lightweight mirrors of the master creator roster that lives in Airtable and is synced into ca-data.
- ca-data exposes
GET /creatorsand creator detail endpoints. - Brand Match uses these to render creator profile pages and to enrich match cards with:
- headshot,
- channel links,
- niche and topics,
- audience demo summary.
4.4 Conflicts and past comms
Brand Match also surfaces risk and context signals:
- Conflict database for creators with active sponsors that might conflict with a new brand.
- Fathom call summaries for past meetings with the brand (via ca-data Fathom sync).
- Brand email summaries from Close and Gmail.
These are all written into Neon by ca-data sync scripts and read through the /brand-intel and /conflicts style endpoints.
5. Key Pages and What They Depend On
5.1 /brands/available
Purpose: show unclaimed or under-worked brands ranked by opportunity.
Data pulled from ca-data:
- Brand intel table for:
- last activity date,
- last contacted date,
- last contact agent and subject,
- last contact summary,
- website.
- Filters use these dates to drive views such as "Actively spending" and "Never contacted".
If this page shows blank or errors, likely causes:
- ca-data unavailable or returning 500,
CA_DATA_URLorCA_DATA_TOKENmisconfigured in Vercel.
5.2 /brands/available/[slug] and /brand/[slug]
Purpose: deep dive on a single brand.
Dependencies:
- Brand intel row for that brand,
- Matches table for top matched creators,
- Deal history from Close and Monday,
- Brand email summaries from ca-data
brand_emailstable, - Optional Fathom calls for that brand.
The page shows:
- headline stats (average rate, CPM, deals),
- creators they have worked with and how often,
- top matched creators with v3 scores and narratives,
- latest email thread summary and contact info.
5.3 /creator/[slug]
Purpose: show all brands that are a good fit for a creator and how those brands behave.
Dependencies:
- Creator detail from ca-data,
- Matches table filtered by creator,
- Brand intel for each matched brand.
This is the reverse view of Brand Match. It is useful for planning outbound around a specific creator or pod.
5.4 Other analytic views
Other routes (cross-sell, reverse-match, contract-lifecycle, category-gaps, agent-blind-spots) are all thin frontends over ca-data summary tables. The logic lives mostly in ca-data sync scripts and SQL, not in Brand Match itself.
6. Deployment and Environments
- Source of truth:
partnerships-collabs/brand-match-appon GitHub. - Deploy pattern: push to GitHub and let Vercel auto-deploy.
- Never run
vercel --prodlocally.
Environment configuration that matters:
CA_DATA_URLandCA_DATA_TOKENmust match the active ca-data deployment.- Any new ca-data endpoint used by Brand Match must be added to Vercel env before deploy.
Mini runs a local copy of the app at http://100.104.197.44:3000 for debugging and work-in-progress changes before pushing.
7. Common Ops and Dev Tasks
7.1 Refresh scoring or match data
When match quality changes or new brands need to be scored:
- Update scoring logic or inputs in the ca-data repo.
- Run the v3 scoring batch script to recompute scores and write them to Neon.
- Verify spot checks through ca-data endpoints (
/matches,/brand-intel). - Confirm Brand Match reflects changes on:
/brands/available,- brand detail pages,
- creator pages.
Brand Match itself does not need a redeploy for pure data updates; it reads live from ca-data.
7.2 Adding new intel fields
If you add new columns to brand intel or new derived tables in ca-data:
- Add the field to ca-data sync scripts and API responses.
- Extend the Brand Match API proxy and page components to read and display the new field.
- Keep this doc and
memory/project-brand-match.mdin sync with any new dependencies.
7.3 Handling outages
If Brand Match is failing in production:
- Load a simple page such as
/brands/available. - If the page shell renders but data is empty, check ca-data:
- Hit
https://ca-data.vercel.app/healthor a simple endpoint. - Confirm Neon is reachable from ca-data.
- Hit
- If pages do not render at all, check Vercel build logs for brand-match-app.
- Only after confirming status, decide whether to roll back to a previous commit or pause new deploys.
7.4 Safe changes for agents and TAs
Changes that are safe for agents and TAs to request without a full architecture review:
- Copy tweaks in headings or labels,
- New filters or sort orders that use existing data fields,
- Visual updates on cards and tables.
Changes that require coordination with Apple and Jude:
- Any change to scoring logic or the source tables in ca-data,
- New data sources for brand intel (new CRM fields, new external APIs),
- Changes that can move large sets of brands or creators between agents.
8. How other agents and skills should use Brand Match
Human agents (Annie, Charlie, Henry, Apple, TAs)
- Treat
/brands/availableas the starting point for new outbound. Use the filters (activity, last contact, agent ownership) instead of building your own brand lists from spreadsheets. - When preparing a sprint around a specific creator, start from
/creator/[slug]to see which brands already fit and how those brands behave. - Use the brand detail view as the single place to check: past deals, average rate/CPM, last email, and past Fathom calls before you write a proposal or email.
Automation and internal agents
- Sales Enablement Agent and similar skills should treat Brand Match and ca-data as read-only context:
- Use ca-data endpoints (
/matches,/brand-intel,/creators) or thebrand-creator-matcherpipeline rather than scraping the Brand Match UI. - Never write directly to the matches tables or re-score creators; all scoring changes should flow through the v3 Python scorer described in
memory/project-brand-match.md.
- Use ca-data endpoints (
- When producing sales materials (brand reports, proposal inputs), reference:
- Brand-level stats from ca-data brand intel (deals, average rate/CPM, last contact),
- Top matched creators and their narratives from the v3 scoring tables.
- If an internal agent sees blank data where Brand Match normally shows intel, it should:
- check ca-data health, 2) log an internal handoff, and 3) avoid making assumptions or fabricating numbers.
9. Related Docs
memory/project-brand-match.mdfor detailed dev history and script names.docs/creators-agency/brands.mdfor high-upside brand strategy.docs/creators-agency/agents/sales-enablement-agent-playbook.mdfor how agent skills should use Brand Match output.