New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

External brand-user performance report

Top Partnerships (Brand-side)

by ThoughtLeaders-io · MIT license · ★ 25 on GitHub · updated Sep 23

Top Partnerships (Brand-side) cover

External brand-user performance report. Ranks a brand's sponsorships by effective CPM once the sponsored videos went live, and compares live eCPM against the sold-date projection.

---
name: tl-top-partnerships
description: External brand-user performance report. Ranks a brand's sponsorships by effective CPM once the sponsored videos went live, and compares live eCPM against the sold-date projection. Use whenever a brand user asks "which of my sponsorships performed best", "top partnerships this year", "best ROI deals", "effective CPM on my deals", "which sponsorships overperformed", "/top-partnerships", or any variation of "show me my best-performing sponsorships". This is the brand-side equivalent of internal performance reporting — fire it eagerly any time a brand wants to look back at their booked deals through a performance lens, even if they don't say the words "CPM" or "eCPM".
---

# Top Partnerships (Brand-side)

Helps a brand look back at their sold sponsorships and see which ones delivered the lowest effective CPM (eCPM) once the videos went live, vs the projection at sale.

## Triggers

- `/top-partnerships` — defaults to calendar YTD
- `/top-partnerships <range>` — e.g. `/top-partnerships 2025`, `/top-partnerships "last 12 months"`, `/top-partnerships "Q1 2026"`
- Natural language: "top partnerships this year", "best sponsorships", "which deals performed best", "effective CPM on my deals", "show me my best ROI sponsorships"

## What this skill computes

For every sold sponsorship the brand has where the video has actually gone live (has a `publish_date` and a non-null live `views` count):

Overview

Helps a brand look back at their sold sponsorships and see which ones delivered the lowest effective CPM (eCPM) once the videos went live, vs the projection at sale.

What you get

  • By Dealone row per sponsorship, ranked by live eCPM (best first). Columns: rank, channel, title, video_url, scheduled_date, publish_date, price, promised_views, live_views, view_ratio, sold_date_ecpm, live_ecpm, delta_ecpm, measurable, next_booking.
  • By Channelone row per channel, aggregated across all that channel's deals in range. Combined live eCPM is sum(price) / sum(live_views) * 1000 (volume-weighted, not an average of CPMs). Sorted by combined live eCPM. Columns: channel, deals, measurable_deals, total_price_usd, total_promised_views, total_live_views, view_ratio, sold_date_ecpm, live_ecpm, delta_ecpm, next_booking.
Manual install (npx, ZIP)
Claude Codenpx skills add ThoughtLeaders-io/thoughtleaders-cli --skill tl-top-partnerships -g -a claude-code
Claude Code (manual)mkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/ThoughtLeaders-io/thoughtleaders-cli/tar.gz/c7a01646c1b3 \ | tar -xz -C ~/.claude/skills --strip-components=2 thoughtleaders-cli-c7a01646c1b3/skills/tl-top-partnerships
Windows (PowerShell)New-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/450e0d97345604c47dc4/tl-top-partnerships.zip" -OutFile "$env:TEMP\tl-top-partnerships.zip"; Expand-Archive "$env:TEMP\tl-top-partnerships.zip" -DestinationPath "$HOME\.claude\skills" -Force
Claude.ai / desktopDownload the ZIP and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md6.5 KB
  • scripts/1 file · 13.4 KB
Read the files here
ThoughtLeaders-io/c7a01642 files
SKILL.md
Show the full text102 lines

Top Partnerships (Brand-side)

Helps a brand look back at their sold sponsorships and see which ones delivered the lowest effective CPM (eCPM) once the videos went live, vs the projection at sale.

Triggers

  • /top-partnerships — defaults to calendar YTD
  • /top-partnerships <range> — e.g. /top-partnerships 2025, /top-partnerships "last 12 months", /top-partnerships "Q1 2026"
  • Natural language: "top partnerships this year", "best sponsorships", "which deals performed best", "effective CPM on my deals", "show me my best ROI sponsorships"

What this skill computes

For every sold sponsorship the brand has where the video has actually gone live (has a publish_date and a non-null live views count):

  • Sold-date eCPM = price / projected_views_at_purchase_date * 1000
    • The projection captured on the adlink at the moment the deal was sold. This is the eCPM the brand "agreed to."
  • Live eCPM = price / views * 1000
    • The actual eCPM now that the video has accumulated views.
  • View ratio = views / projected_views_at_purchase_date
    • 1 means the video out-delivered its projection.

  • Delta = live_eCPM - sold_date_eCPM
    • Negative delta = the deal got cheaper per view than promised (good for the brand). Positive delta = the deal underdelivered.

It also pulls future bookings — any sponsorship that is sold, or open with the brand having reviewed it (brand_approval pending or approved), with a scheduled date strictly after today — and tags each deal and each channel with the earliest future scheduled date, or "Re-book - no future spot" if none exists. This turns the report into an actionable list, not just a backward look.

Output

A Google Sheet with two tabs, owned by the caller's Google account:

  • By Deal — one row per sponsorship, ranked by live eCPM (best first). Columns: rank, channel, title, video_url, scheduled_date, publish_date, price, promised_views, live_views, view_ratio, sold_date_ecpm, live_ecpm, delta_ecpm, measurable, next_booking.
  • By Channel — one row per channel, aggregated across all that channel's deals in range. Combined live eCPM is sum(price) / sum(live_views) * 1000 (volume-weighted, not an average of CPMs). Sorted by combined live eCPM. Columns: channel, deals, measurable_deals, total_price_usd, total_promised_views, total_live_views, view_ratio, sold_date_ecpm, live_ecpm, delta_ecpm, next_booking.

In chat: a short summary + top-10 channels table + the sheet URL.

Workflow

Step 1 — Resolve the brand

Run tl whoami --json and read the brands array.

  • One brand → use it silently.
  • Zero brands → tell the user this skill is for brand-user profiles and stop.
  • Multiple brands → ask which one. Don't guess.
Step 2 — Resolve the time range

Default = calendar YTD (Jan 1 of the current year through today).

Accept these forms in the user's input:

  • 2025 or "2024" → that full calendar year
  • "last 12 months" → trailing 12 months ending today
  • "Q1 2026", "Q4 2025" → that quarter
  • "YTD" → explicit current YTD
  • Anything else → ask the user to clarify, don't silently pick

Convert to a scheduled-date-start / scheduled-date-end pair (YYYY-MM-DD strings). Use scheduled_date as the time anchor because that is when the sponsorship actually ran for the brand — purchase_date can be months earlier.

Step 3 — Run the script
python3 <SKILL_DIR>/scripts/top_partnerships.py \
  --brand "<BRAND_NAME>" \
  --scheduled-date-start <YYYY-MM-DD> \
  --scheduled-date-end <YYYY-MM-DD>

<SKILL_DIR> resolves to this skill's directory at invocation time (same convention as tl-views-guarantee, tl-keyword-research).

The script does everything: pulls sold deals in range (paginated), pulls all future bookings, computes per-deal and per-channel metrics, creates a Google Sheet with two tabs, shares it back to the caller, and prints a markdown summary plus the sheet URL.

It uses tl for data and gws for sheet creation. Both must be on PATH and authed.

Step 4 — Present the result

Take the script's stdout as-is. It already contains:

  1. Summary line — total sold deals, measurable count, median live eCPM, count overperforming.
  2. Top 10 channels by combined live eCPM — markdown table with the Next booking column bolded when it says "Re-book."
  3. Sheet URL — point the user at the two tabs.

If more than half the top-10 channels show "Re-book", call that out in one sentence as the headline action item. If most of the top channels already have follow-ups booked, congratulate briefly and stop.

Keep the writeup tight. No em dashes, no "just wanted to", no hedging. The data does the talking.

Brand-user mode notes

  • This skill assumes a brand-user tl auth. It uses only public CLI commands (tl whoami, tl sponsorships list) — no tl db pg and no Elasticsearch.
  • The tl sponsorships list endpoint already filters to deals the calling profile is allowed to see, so passing brand:"<name>" is a belt-and-braces filter rather than a privacy boundary.
  • View counts come from TL's own tracking on the views field returned by the CLI. They're the same numbers the brand sees in the TL dashboard, so the eCPMs are reconcilable with what they see in-app.
  • Don't include creators' contact emails, internal notes, or owner_* fields in the brand-facing output. The script already drops them from the CSV.

Edge cases worth mentioning to the user (only if they apply)

  • A deal that ran very recently (last 14-28 days) may show a misleadingly high Live eCPM because views are still accumulating. Mention this only if more than half the top-10 deals have a scheduled date inside the last 28 days.
  • If the brand has zero measurable deals in the range, say so plainly and suggest broadening the range (e.g., last 12 months).
1---
2name: tl-top-partnerships
3description: External brand-user performance report. Ranks a brand's sponsorships by effective CPM once the sponsored videos went live, and compares live eCPM against the sold-date projection. Use whenever a brand user asks "which of my sponsorships performed best", "top partnerships this year", "best ROI deals", "effective CPM on my deals", "which sponsorships overperformed", "/top-partnerships", or any variation of "show me my best-performing sponsorships". This is the brand-side equivalent of internal performance reporting — fire it eagerly any time a brand wants to look back at their booked deals through a performance lens, even if they don't say the words "CPM" or "eCPM".
4---
5 
6# Top Partnerships (Brand-side)
7 
8Helps a brand look back at their sold sponsorships and see which ones delivered the lowest effective CPM (eCPM) once the videos went live, vs the projection at sale.
9 
10## Triggers
11 
12- `/top-partnerships` — defaults to calendar YTD
13- `/top-partnerships <range>` — e.g. `/top-partnerships 2025`, `/top-partnerships "last 12 months"`, `/top-partnerships "Q1 2026"`
14- Natural language: "top partnerships this year", "best sponsorships", "which deals performed best", "effective CPM on my deals", "show me my best ROI sponsorships"
15 
16## What this skill computes
17 
18For every sold sponsorship the brand has where the video has actually gone live (has a `publish_date` and a non-null live `views` count):
19 
20- **Sold-date eCPM** = `price / projected_views_at_purchase_date * 1000`
21 - The projection captured on the adlink at the moment the deal was sold. This is the eCPM the brand "agreed to."
22- **Live eCPM** = `price / views * 1000`
23 - The actual eCPM now that the video has accumulated views.
24- **View ratio** = `views / projected_views_at_purchase_date`
25 - >1 means the video out-delivered its projection.
26- **Delta** = `live_eCPM - sold_date_eCPM`
27 - Negative delta = the deal got *cheaper* per view than promised (good for the brand). Positive delta = the deal underdelivered.
28 
29It also pulls **future bookings** — any sponsorship that is sold, or open with the brand having reviewed it (`brand_approval` pending or approved), with a scheduled date strictly after today — and tags each deal and each channel with the earliest future scheduled date, or "Re-book - no future spot" if none exists. This turns the report into an actionable list, not just a backward look.
30 
31## Output
32 
33A Google Sheet with two tabs, owned by the caller's Google account:
34 
35- **By Deal** — one row per sponsorship, ranked by live eCPM (best first). Columns: rank, channel, title, video_url, scheduled_date, publish_date, price, promised_views, live_views, view_ratio, sold_date_ecpm, live_ecpm, delta_ecpm, measurable, next_booking.
36- **By Channel** — one row per channel, aggregated across all that channel's deals in range. Combined live eCPM is `sum(price) / sum(live_views) * 1000` (volume-weighted, not an average of CPMs). Sorted by combined live eCPM. Columns: channel, deals, measurable_deals, total_price_usd, total_promised_views, total_live_views, view_ratio, sold_date_ecpm, live_ecpm, delta_ecpm, next_booking.
37 
38In chat: a short summary + top-10 channels table + the sheet URL.
39 
40## Workflow
41 
42### Step 1 — Resolve the brand
43 
44Run `tl whoami --json` and read the `brands` array.
45 
46- One brand → use it silently.
47- Zero brands → tell the user this skill is for brand-user profiles and stop.
48- Multiple brands → ask which one. Don't guess.
49 
50### Step 2 — Resolve the time range
51 
52Default = calendar YTD (Jan 1 of the current year through today).
53 
54Accept these forms in the user's input:
55 
56- `2025` or `"2024"` → that full calendar year
57- `"last 12 months"` → trailing 12 months ending today
58- `"Q1 2026"`, `"Q4 2025"` → that quarter
59- `"YTD"` → explicit current YTD
60- Anything else → ask the user to clarify, don't silently pick
61 
62Convert to a `scheduled-date-start` / `scheduled-date-end` pair (YYYY-MM-DD strings). Use `scheduled_date` as the time anchor because that is when the sponsorship actually ran for the brand — purchase_date can be months earlier.
63 
64### Step 3 — Run the script
65 
66```bash
67python3 <SKILL_DIR>/scripts/top_partnerships.py \
68 --brand "<BRAND_NAME>" \
69 --scheduled-date-start <YYYY-MM-DD> \
70 --scheduled-date-end <YYYY-MM-DD>
71```
72 
73`<SKILL_DIR>` resolves to this skill's directory at invocation time (same convention as `tl-views-guarantee`, `tl-keyword-research`).
74 
75The script does everything: pulls sold deals in range (paginated), pulls all future bookings, computes per-deal and per-channel metrics, creates a Google Sheet with two tabs, shares it back to the caller, and prints a markdown summary plus the sheet URL.
76 
77It uses `tl` for data and `gws` for sheet creation. Both must be on PATH and authed.
78 
79### Step 4 — Present the result
80 
81Take the script's stdout as-is. It already contains:
82 
831. **Summary line** — total sold deals, measurable count, median live eCPM, count overperforming.
842. **Top 10 channels by combined live eCPM** — markdown table with the Next booking column bolded when it says "Re-book."
853. **Sheet URL** — point the user at the two tabs.
86 
87If more than half the top-10 channels show "Re-book", call that out in one sentence as the headline action item. If most of the top channels already have follow-ups booked, congratulate briefly and stop.
88 
89Keep the writeup tight. No em dashes, no "just wanted to", no hedging. The data does the talking.
90 
91## Brand-user mode notes
92 
93- This skill assumes a brand-user `tl` auth. It uses only public CLI commands (`tl whoami`, `tl sponsorships list`) — no `tl db pg` and no Elasticsearch.
94- The `tl sponsorships list` endpoint already filters to deals the calling profile is allowed to see, so passing `brand:"<name>"` is a belt-and-braces filter rather than a privacy boundary.
95- View counts come from TL's own tracking on the `views` field returned by the CLI. They're the same numbers the brand sees in the TL dashboard, so the eCPMs are reconcilable with what they see in-app.
96- Don't include creators' contact emails, internal notes, or owner_* fields in the brand-facing output. The script already drops them from the CSV.
97 
98## Edge cases worth mentioning to the user (only if they apply)
99 
100- A deal that ran very recently (last 14-28 days) may show a misleadingly high Live eCPM because views are still accumulating. Mention this only if more than half the top-10 deals have a scheduled date inside the last 28 days.
101- If the brand has zero measurable deals in the range, say so plainly and suggest broadening the range (e.g., last 12 months).
102 
View all files on GitHub →

Details

Updated
Sep 23, 2026
License
MIT
Stars on the repo
★ 25
Checked
Source
ThoughtLeaders-io/thoughtleaders-cli ↗
Creator
ThoughtLeaders-io · 4 listings
View creator

Similar skills

See all →
SkillDiagnose why a specific ad creative is winning or losingCreative performance analysisgmmh1/claude-paid-media-skills · by gmmh1Diagnose why a specific ad creative is winning or losing using the generalized hook-hold-click-convert funnel, applicable across any platform. Triggers on 'why is this ad underperforming', 'diagnose my creative', or 'where in the funnel is this ad failing'. Platform-agnostic diagnostic framework — platform-specific versions (meta-ads-creative-analytics) apply this with platform-native metrics.New listingPromptAct as a professional full-stack developer taskedProfessional Full-Stack Developer for Network Mapping & Monitoring Applicationf/prompts.chat · by Yohanes Farly RakinaungAct as a professional full-stack developer tasked with building a web application for mapping and monitoring networks using Mikrotik Netwatch API. Implement multi-user role-based management to handle devices, monitor their status, and manage user subscriptions.New listingSkillEstablishes a project's quality bar as a written contractConstraint driven developmentaddyosmani/agent-skills · by addyosmaniEstablishes a project's quality bar as a written contract and stops agents quietly lowering it. Interviews the user on which dimensions matter, supplies sane default thresholds when they have no number in mind, records everything in CONSTRAINTS.md, and watches the diff for a weakened bar — new @ts-ignore or eslint-disable suppressions, skipped or deleted tests, assertions stripped out, unimplemented stubs, thresholds edited down. Use when no quality bar is written down, when the user says "set up constraints" or "define our standards", when the user wants dimensions they care about — accessibility, web performance, coverage — set up as enforced constraints, when an agent keeps silencing checks or skipping tests to get to green, when you need a coverage or performance threshold and don't know what number to pick, or when an agent writes more code than anyone will read.★ 98.7k GitHub starsSkillInstruments code so production behavior is visibleObservability and instrumentationaddyosmani/agent-skills · by addyosmaniInstruments code so production behavior is visible and diagnosable. Use when adding logging, metrics, tracing, or alerting. Use when shipping any feature that runs in production and you need evidence it works. Use when production issues are reported but you can't tell what happened from the available data.★ 98.7k GitHub starsSkillOptimizes application performance across frontend, backendPerformance optimizationaddyosmani/agent-skills · by addyosmaniOptimizes application performance across frontend, backend, queries, and databases. Use when performance requirements exist, when you suspect performance regressions, when Core Web Vitals or load times need improvement, when N+1 query patterns need fixing, or when profiling reveals bottlenecks.★ 98.7k GitHub starsSkillDiscovers and invokes agent skillsUsing agent skillsaddyosmani/agent-skills · by addyosmaniDiscovers and invokes agent skills. Use when starting a session, or when you need to decide which skill or workflow applies to the piece of work at hand. This is the meta-skill that governs how all other skills are discovered and invoked.★ 98.7k GitHub stars

More from ThoughtLeaders-io

SkillDetect non-organic views / fake engagement / bot commentsChannel AuthenticityThoughtLeaders-io/thoughtleaders-cli · by ThoughtLeaders-ioDetect non-organic views / fake engagement / bot comments on a YouTube channel before booking (or after delivering) a sponsorship. Use when asked to vet a channel, check if views/comments are real, investigate suspicious engagement, audit a sponsorship delivery, or whenever someone shares a YouTube channel/handle/URL and asks "is this real / safe to buy an ad on". Triggers: "fake views", "bot comments", "non-organic", "is this channel legit", "vet this channel", "engagement looks off", "audit this sponsorship".★ 25 GitHub starsSkillSave the results of an in-chat data-exploration sessionPath A — List-styleThoughtLeaders-io/thoughtleaders-cli · by ThoughtLeaders-ioSave the results of an in-chat data-exploration session as a TL report. Triggers when the user wants to persist a channels / brands / videos (uploads) / sponsorships list or filtered set they've been working with — phrases like "save this as a report", "save the list", "turn this into a campaign", "persist this", "make a report from what you found", "save the result", "I want to come back to this".★ 25 GitHub starsSkillTurn a topic into a validated content filtertl-keyword-research — topic → validated filter set + the results you chooseThoughtLeaders-io/thoughtleaders-cli · by ThoughtLeaders-ioTurn a topic into a *validated* content filter and the channels it selects. Invoke whenever the user wants to find videos or channels by what they are about — topics, concepts, niches, not IDs or names: "a group/set of keywords for <topic>", "keywords that represent <topic> content", "find content/channels about <topic>", "find investing channels" — or when you'd otherwise hand-compose a `tl db es` content search. It expands the topic into candidate keywords (with a gated web lookup for post-cutoff entities), probes Elasticsearch for each (counts + samples), validates matches against the user's stated intent, refines a boolean filter over ≥3 rounds, and delivers a keyword-group filter set + a clickable report link + the results the user chose: trend data at the video level (matching uploads + prevalence), or channel targets classified by topic intensity (core / recurring / one-off) and context-validated with cheap agents, or both. It ASKS which deliverable and which run mode (quick single pass vs deep ≥3-round refinement) the user wants whenever the request doesn't say — never a silent default; `autonomous` / `--auto` means deep + both deliverables with every pause skipped. Keyword-distribution output (counts per keyword) is OPT-IN — only when the user explicitly asks for "keyword counts / distribution / how common is X". Also invoke for HELP asks about this skill — "help", "how does keyword research work", "what are my options", "describe this skill" — answered free from the built-in guide, no queries run.★ 25 GitHub stars