KOLens
All posts
·KOLens teamCreator dossierAIBrand fitPricing

The brand-fit dossier — Creator Overview, Deep Analysis, and Background Research

The dossier you wanted but didn't want to write yourself: 1-credit scored overview, 5-credit deep analysis, web-grounded background research — three layers, one cache, every prose field renders as Markdown.

The shape

Open any KOL detail page on /kols/[username] → three stacked cards: Creator Overview (free cache or 1 credit refresh) → Background Research (web-grounded, 1 credit) → Deep Analysis (opt-in button, 5 credits). All three respect your active workspace's brand profile + your UI locale.

Why three tiers, not one big report

Brand managers don't read 5 paragraphs of LLM prose to decide whether a KOL is worth a second look. They read a one-line headline, glance at four star ratings, and either commit 30 seconds to the deeper read or move on. So the three tiers map onto the actual triage funnel:

  1. Overview (1 credit, cached 30 days) — answers "what does this person do, and would I pursue them?" with a scored verdict. Reads 50 recent videos + author demographics + audience data when present.
  2. Background Research (1 credit, cached 30 days) — answers "who is this person off-platform?". A search-LLM (openai/gpt-4o-mini-search-preview) browses public sources and returns Markdown with [1] citation chips. Useful for legitimacy / identity checks before a real outreach budget.
  3. Deep Analysis (5 credits, cached 7 days) — for KOLs you've already shortlisted. Reads up to 200 videos + full audience snapshot + cross-platform contacts and produces five extra sections you can paste into a brief: content quality, partnership history, outreach strategy, negotiation notes, competitive context.

Scored ratings — only when we have ground truth

The four scores (Recommendation / Content fit / Audience fit / Risk) only render when the workspace brand profile has at least one structured field filled in. Without that anchor we couldn't score "fit" against anything — the LLM would be inventing a comparison.

Fill in any of product_category, target_audience_text, target_geographies, or exclusions_text on /workspaces/{slug}/settings and the scoring block lights up on every dossier. The LLM is told what to score against, asked to clamp to 1-5, and required to explain its reasoning in a 300-character score_rationale.

Every prose result lands in Postgres

Each of the three tiers has its own cache table — keyed by (workspace_id, username, platform), with the locale stashed inside the JSON payload so a re-render in a different language is a clean miss, not a stale read.

Operationally: a busy workspace opening the same KOL dossier 20 times in a week makes one LLM call to each tier. The 19 subsequent opens are free. The "Refresh" button on each card is the only path that burns a fresh call — a deliberate operator action, never an accidental fetch.

Markdown renderer, not whiteSpace: pre-line

Operator feedback was direct: "如果是 markdown,就用 markdown 格式 来优化展示". Every prose field is now rendered via a tiny inline Markdown component — headings, bold, italic, ordered + unordered lists, and the [1] / [2] citation chips for Background Research.

We didn't ship a full Markdown library; the renderer is single-file (~110 lines) and only handles the subset the LLMs actually emit. Smaller surface, no MDX plugin churn.

Locale, end to end

  • NEXT_LOCALE cookie set by the locale switcher
  • BFF reads the cookie and forwards ?locale=
  • Railway service injects the locale into the LLM system prompt ("Respond entirely in Simplified Chinese (zh-CN)…")
  • Cache key includes locale so en-cached bodies never serve zh callers

Three locales currently shipped: en / zh-CN / ja. Adding a fourth is a 3-line addition to _LOCALE_NAME in api/services/kol_overview.py plus the messages file.

Try the dossier

Open any KOL on /kols/[username]. If your workspace brand profile is set, you'll see star ratings on first load. Click Deep Analysis to see the five extra sections — billed against your workspace credit pool with explicit confirmation copy on the button.

READY?

Try it now — 50 free credits on signup.

Open a KOL dossier

Frequently asked

What's the difference between Creator Overview and Deep Analysis?
Overview reads 50 videos + author demographics and bills 1 credit. Deep Analysis reads 200 videos + audience snapshot + cross-platform contacts + brand profile and bills 5 credits via the workspace credit pool. The schema is a strict superset — deep adds content_quality, partnership_history, negotiation_notes, competitive_context, and a tailored outreach_strategy.
Why do the star ratings only show up when I've filled in my brand profile?
Without a brand profile we have no anchor for 'fit' — we'd be inventing a comparison. The scoring path is gated on at least one structured field (product_category / target_audience_text / target_geographies / exclusions_text). When the workspace brand profile is empty, the card shows a CTA linking to /workspaces/{slug}/settings instead of fake stars.
What model does each tier use?
Overview: gpt-4o-mini (settings.ai_insight_classifier_model). Deep Analysis: gpt-4o (settings.ai_deep_analysis_model). Background Research: gpt-4o-mini-search-preview (settings.ai_background_research_model). All env-overridable so swapping to a different gateway is a deploy, not a code change.
How long does each cache row last?
Overview: 30 days. Deep Analysis: 7 days (the negotiation/partnership-history insights drift faster). Background Research: 30 days. All three accept ?refresh=true to force a fresh call (and a fresh credit charge).
Are the prose fields really Markdown?
Yes. The LLM prompts explicitly request Markdown for overall_summary, content_quality, partnership_history, negotiation_notes, competitive_context, and audience_signal. The dossier UI renders via a tiny inline MdRender that supports headings, **bold**, *italic*, ordered + unordered lists, and citation chips [1] [2].
Does my locale change the output?
Yes. NEXT_LOCALE cookie → BFF query param → LLM system prompt + cache key. The cached row is gated on locale, so a zh-CN caller never sees an en-cached body and vice versa. en / zh-CN / ja currently shipped.

Read next

The brand-fit dossier — Creator Overview, Deep Analysis, and Background Research · KOLens | KOLens