thoughtleaders-cli 0.9.2__py3-none-any.whl → 0.9.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thoughtleaders_cli-0.9.2.dist-info → thoughtleaders_cli-0.9.4.dist-info}/METADATA +16 -1
- {thoughtleaders_cli-0.9.2.dist-info → thoughtleaders_cli-0.9.4.dist-info}/RECORD +21 -13
- tl_cli/__init__.py +1 -1
- tl_cli/_plugin/.claude-plugin/plugin.json +1 -1
- tl_cli/_plugin/skills/tl/SKILL.md +17 -9
- tl_cli/_plugin/skills/tl-create-workflow/SKILL.md +245 -0
- tl_cli/_plugin/skills/tl-create-workflow/references/creating-in-app.md +95 -0
- tl_cli/_plugin/skills/tl-create-workflow/references/methodology.md +70 -0
- tl_cli/_plugin/skills/tl-create-workflow/references/pitfalls.md +68 -0
- tl_cli/_plugin/skills/tl-create-workflow/references/workflow-model.md +89 -0
- tl_cli/client/http.py +12 -8
- tl_cli/commands/balance.py +6 -0
- tl_cli/commands/db.py +5 -3
- tl_cli/commands/setup.py +30 -1
- tl_cli/commands/skills.py +437 -0
- tl_cli/commands/workflows.py +159 -0
- tl_cli/main.py +11 -0
- tl_cli/skill_registry.py +312 -0
- {thoughtleaders_cli-0.9.2.dist-info → thoughtleaders_cli-0.9.4.dist-info}/WHEEL +0 -0
- {thoughtleaders_cli-0.9.2.dist-info → thoughtleaders_cli-0.9.4.dist-info}/entry_points.txt +0 -0
- {thoughtleaders_cli-0.9.2.dist-info → thoughtleaders_cli-0.9.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thoughtleaders-cli
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.4
|
|
4
4
|
Summary: ThoughtLeaders CLI — query sponsorship data, channels, brands, and intelligence
|
|
5
5
|
Project-URL: Homepage, https://thoughtleaders.io
|
|
6
6
|
Project-URL: Repository, https://github.com/ThoughtLeaders-io/thoughtleaders-cli
|
|
@@ -284,6 +284,21 @@ The plugin ships several focused skills (installed by all the `tl setup *` comma
|
|
|
284
284
|
- **`tl-views-guarantee`** — sizes a multi-video sponsorship buy for a channel, returning the video bundle size, views guarantee, and likelihood to hit.
|
|
285
285
|
- **`tl-top-partnerships`** — brand-user performance report. Ranks a brand's sold sponsorships by live eCPM vs the sold-date projection, aggregates per channel, and delivers a two-tab Google Sheet ("By Deal" / "By Channel") via `gws`. Uses only public CLI commands (`tl whoami`, `tl sponsorships list`).
|
|
286
286
|
|
|
287
|
+
## Distributed skills
|
|
288
|
+
|
|
289
|
+
Beyond the bundled set above, an organization can be granted additional skills that aren't part of a CLI release — `tl skill` fetches and installs them on demand into the same directories `tl setup` uses (Claude Code's standalone skills directory, OpenCode's skills directory, and the directory shared by Gemini and Codex), so every supported agent picks them up automatically.
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
tl skill list # skills available to your organization, with installed/latest versions
|
|
293
|
+
tl skill list --all # full catalog (full-access accounts only)
|
|
294
|
+
tl skill download my-skill # fetch and install into every AI-agent skill directory
|
|
295
|
+
tl skill download my-skill --force # overwrite a directory tl doesn't already manage
|
|
296
|
+
tl skill update # refresh every downloaded skill to its latest version
|
|
297
|
+
tl skill remove my-skill # uninstall a downloaded skill
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
A directory `tl skill download` doesn't already manage (no prior `tl`-managed install there) is left alone unless `--force` is passed — it never overwrites a skill you installed some other way. `tl` warns once a day, on any command, when a downloaded skill has a newer version available. `tl setup` and self-update re-syncs also respect these directories: a downloaded skill is never rmtree'd or overwritten, even if its name collides with a bundled skill.
|
|
301
|
+
|
|
287
302
|
## Output Formats
|
|
288
303
|
|
|
289
304
|
By default, output is a styled table in the terminal and JSON when piped.
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
tl_cli/__init__.py,sha256=
|
|
1
|
+
tl_cli/__init__.py,sha256=vSA_gOKoNEuGKTTDXEGFTK9NgDyrC9oLOwpvRELGmLg,112
|
|
2
2
|
tl_cli/_completions.py,sha256=kOyEUqC26vbYvyXWi513WX8fF73qQLR5WWuRSe_wqyk,164
|
|
3
3
|
tl_cli/_typer_utils.py,sha256=ZiZsCVmEznPvBw-dYbr3tu3zWZ0iN6kjoQmK3gMqD28,860
|
|
4
4
|
tl_cli/config.py,sha256=UV_OYTXuQnAIqbi_oVCXx0hhIdZWR678RRapVv51UwQ,1859
|
|
5
5
|
tl_cli/filters.py,sha256=Yjj04lONGGmtCAIYN5i6KD12mAnUKEZ7i9heeWtdj7o,2952
|
|
6
6
|
tl_cli/hints.py,sha256=cT8kuDtkAZqwXkc2RV0Yg_abofK-g9UiXwTTBunX78U,1557
|
|
7
|
-
tl_cli/main.py,sha256=
|
|
7
|
+
tl_cli/main.py,sha256=ZCzbgemmKlcIVlk_6TVznXooSsTBAjQ01k1olwQLhJQ,6435
|
|
8
8
|
tl_cli/query_history.py,sha256=vA5avDU1DBZDWSb-w2ZxEZxV2MD21cqwzfYjXawOWZI,5540
|
|
9
9
|
tl_cli/self_update.py,sha256=zLPCSzPQTHRAcTZTBBopRxAs5Bg-B7Ag_7PxfN94QOI,18800
|
|
10
|
+
tl_cli/skill_registry.py,sha256=slB3K0tI_-mrPT7Eswzq2Sjlo8Wcwk5nDy0w9yQh6mM,11957
|
|
10
11
|
tl_cli/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
12
|
tl_cli/auth/commands.py,sha256=CkCaKFb-xUwhCeIL92EC4-odiaSpLI1bmgg5tDCrclM,7387
|
|
12
13
|
tl_cli/auth/login.py,sha256=AxdQ8LOZd1uZhFXPyaiGB_Hk0RiVuX7t37gkjgoEOCM,11568
|
|
@@ -14,16 +15,16 @@ tl_cli/auth/pkce.py,sha256=4Q6Ip-TeZFNG9c3swXNi4gH7mdMkltKa62gZZNybt8U,658
|
|
|
14
15
|
tl_cli/auth/token_store.py,sha256=TcZnUol4-8r0jMEJhOPmABCX12_5RkAln2xfWPNdmHk,3275
|
|
15
16
|
tl_cli/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
17
|
tl_cli/client/errors.py,sha256=HEAEeFIgw_n_ZE9bkRRw6OPyqmwGhixzNN2bAxYj7wg,3246
|
|
17
|
-
tl_cli/client/http.py,sha256=
|
|
18
|
+
tl_cli/client/http.py,sha256=vcrNMJ5Z91-DXYq-vBH55Miii3QRnq2X1kIllMQ8yw8,4565
|
|
18
19
|
tl_cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
20
|
tl_cli/commands/_comments_common.py,sha256=x91WPSpDdV8AwE8Mwx4VtZQKWXBufsnBnC1lFD0Tzys,4522
|
|
20
|
-
tl_cli/commands/balance.py,sha256=
|
|
21
|
+
tl_cli/commands/balance.py,sha256=OubiqknmLKREUzk2V0FZFtqgb4_dqQMR4V5-ifz-wfk,3150
|
|
21
22
|
tl_cli/commands/brands.py,sha256=uogOfAdEbpjqiGlv4L2T1UC-Iz10G6fkRhVsDBOjRIY,15340
|
|
22
23
|
tl_cli/commands/bulk_import.py,sha256=d4y1k_lD52LPJcCqXxEmyHIqcIwomZgbjqs1_QxPjeQ,4536
|
|
23
24
|
tl_cli/commands/changelog.py,sha256=D1PtDdHpawTlWqUHjKzVmv9yXLSU915UVmI3dZzEwyA,4241
|
|
24
25
|
tl_cli/commands/channels.py,sha256=gs6jHaxi6WjB3D8jnJETFVvkTXpqzlWR-W4JkBeG3oY,20406
|
|
25
26
|
tl_cli/commands/credits.py,sha256=2xCht2e420LmaFBKNdKoMz8GlTh31qSWSlJAnVzoZic,7308
|
|
26
|
-
tl_cli/commands/db.py,sha256=
|
|
27
|
+
tl_cli/commands/db.py,sha256=RcuGYzmTs5KMk6RgYao3oV-j883dG7IonTQclZg7UZs,9148
|
|
27
28
|
tl_cli/commands/deals.py,sha256=ZK9yneInsC6DXoCPS65oyLoVR0eRW1xdRlEN7oRp1pc,2174
|
|
28
29
|
tl_cli/commands/describe.py,sha256=3lURv4NllM5qPeMEBbejrIxiMzsyTwpJIz211-wuGCU,12362
|
|
29
30
|
tl_cli/commands/doctor.py,sha256=KUKglwhMc7B26XXy_3M0LkHu7wqfFO5T0YPHO1SH1VY,9024
|
|
@@ -33,15 +34,17 @@ tl_cli/commands/proposals.py,sha256=IXx9DsR7lPWRM4QvKB65t7xKNAK3H6ax9LIlIj8ydEs,
|
|
|
33
34
|
tl_cli/commands/recommender.py,sha256=BZfviKAPhpZah0zaSyH5RDa23fG8QAkUnG5FDhOdi4I,21324
|
|
34
35
|
tl_cli/commands/reports.py,sha256=7CL2atr0Y4XSE8U8kbuZ5-M-m3E9PKNZ0N_0Fbd_OkQ,26388
|
|
35
36
|
tl_cli/commands/schema.py,sha256=rmfg5pvKHa5kQi59YBIHCMzBNawmYPi2tBMcZP7Vrxw,6432
|
|
36
|
-
tl_cli/commands/setup.py,sha256=
|
|
37
|
+
tl_cli/commands/setup.py,sha256=p71pfwbIlMJoq2TaOfy35_absD9VMSX792FlapmQv2Y,29933
|
|
38
|
+
tl_cli/commands/skills.py,sha256=4Vg5ph6T7T3WcIqIZc83EJPhtB79FE7fMej9uVhElqc,15884
|
|
37
39
|
tl_cli/commands/snapshots.py,sha256=exlxFwMcM1BCiDTcE9dZfaSdRO-sxaTxtWzJmEoUVWI,3434
|
|
38
40
|
tl_cli/commands/sponsorships.py,sha256=PdWCm9E4mrs_qlHtckMp99JmuRP94hthlqoWMi0k4tc,10471
|
|
39
41
|
tl_cli/commands/uploads.py,sha256=Tf9tqAEm9FGe3A7sr_EDX9OzdNInCmrWNr10wWGuMUo,1526
|
|
40
42
|
tl_cli/commands/whoami.py,sha256=aUXwBRwh1vAGrvz8CKGfHYtEOKJCIDfwrGesKAwYZMk,7866
|
|
43
|
+
tl_cli/commands/workflows.py,sha256=ctduYa--Md6zbs8kQwO6mSyR9o1KB1UpNOaANuupDfU,6862
|
|
41
44
|
tl_cli/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
45
|
tl_cli/output/formatter.py,sha256=2FOsZb9aGcjKAGvumtEyS63cjIk47JcQGNM0K7Gpdp8,23413
|
|
43
46
|
tl_cli/_plugin/.claude-plugin/marketplace.json,sha256=l56PMmyjfGXNGlV30wRyOAe74B6gJNCVNCxgsBbSNxc,446
|
|
44
|
-
tl_cli/_plugin/.claude-plugin/plugin.json,sha256=
|
|
47
|
+
tl_cli/_plugin/.claude-plugin/plugin.json,sha256=lu-QQlhwxsIG1s6N8GFNEBGMfYek73Al0_1uTolvsC4,466
|
|
45
48
|
tl_cli/_plugin/agents/keyword-context-classifier.md,sha256=8Pk6WqJKuF-ERkBh54Aa-9t60CvjdOIH0RurFlG-T7I,4325
|
|
46
49
|
tl_cli/_plugin/agents/keyword-entity-resolver.md,sha256=fOAeTZa2-h7te8dEXLFcmiL2tj6IXwnQ0ChUrym3yFc,5619
|
|
47
50
|
tl_cli/_plugin/agents/keyword-relevance-validator.md,sha256=uPUqobAVT7xq-brRHtNaFSTns-lYyCu3MwTuU5tn538,3127
|
|
@@ -51,7 +54,7 @@ tl_cli/_plugin/hooks/hooks.json,sha256=FSWibw1xAjA-suFV3fR8btIb2kQ82LQ08otTr-Npm
|
|
|
51
54
|
tl_cli/_plugin/hooks/scripts/load-tl-skill.mjs,sha256=EBsyZ-caei-CBJsRtqzJXJs_20O3H22MuVmDpu96umo,805
|
|
52
55
|
tl_cli/_plugin/hooks/scripts/post-usage.sh,sha256=WVvZLkZik6lbeZ20Kh-wgm4JkRFHFN0Uwl4C8S3Y0sY,759
|
|
53
56
|
tl_cli/_plugin/hooks/scripts/pre-check.sh,sha256=inHopPXQ9h-KRcHuebEIQ-1EZmsTaHhAAMCFQ0MyiEQ,820
|
|
54
|
-
tl_cli/_plugin/skills/tl/SKILL.md,sha256=
|
|
57
|
+
tl_cli/_plugin/skills/tl/SKILL.md,sha256=mFgTCMcYkEvXCO0f3uqFaQcHOJ2rJh6iZ46AdkziuVc,67959
|
|
55
58
|
tl_cli/_plugin/skills/tl/references/business-glossary.md,sha256=YZ_UWygtAZB8Mfh9NPG2ld0OnmgknSBzBOpVZwN-wzs,19287
|
|
56
59
|
tl_cli/_plugin/skills/tl/references/elasticsearch-schema.md,sha256=x7ZUYGbR6FJG02BSA9BjveoiC4X-7VsYxhLPBK4IH_c,23195
|
|
57
60
|
tl_cli/_plugin/skills/tl/references/firebolt-schema.md,sha256=tysPKBxqQFRzfKi2vmEhHXn8PGaznep7yaKwSWZY3Jo,11110
|
|
@@ -75,6 +78,11 @@ tl_cli/_plugin/skills/tl-channel-authenticity/scripts/score.py,sha256=LwhTMf9eyO
|
|
|
75
78
|
tl_cli/_plugin/skills/tl-channel-authenticity/scripts/tl_cli.py,sha256=Mu__ZzcELuQBPJ8Ia6GiLbW1ZtqI1aQklBeRPAw9JNk,9045
|
|
76
79
|
tl_cli/_plugin/skills/tl-channel-authenticity/scripts/video_integrity.py,sha256=Pj9cZkFHX-fwfmkSjicy_B04fQ3TW3gLrGliHwCwX5g,11120
|
|
77
80
|
tl_cli/_plugin/skills/tl-channel-authenticity/scripts/view_curves.py,sha256=wx4cgi_HSOBDEy9bI_8RGnAFpY8q8xHOlF7DYojmi0c,4447
|
|
81
|
+
tl_cli/_plugin/skills/tl-create-workflow/SKILL.md,sha256=TSUY6vxBqTeLdeAJ1uUK8-EKPHiwRILe80Jv6dlDGAw,13347
|
|
82
|
+
tl_cli/_plugin/skills/tl-create-workflow/references/creating-in-app.md,sha256=mJkmMgndNyJoTxIb9eiTLPw-jecKvIACLuvDHqvP558,5071
|
|
83
|
+
tl_cli/_plugin/skills/tl-create-workflow/references/methodology.md,sha256=oXth-akS6QD7GmSDQRMaenAViTC5tlRgXIq_5uXVQQg,3847
|
|
84
|
+
tl_cli/_plugin/skills/tl-create-workflow/references/pitfalls.md,sha256=6XBbe7T3o9PQcEs5FGNZ3n6xqVz0ZoNoFttJ9nNDjBU,3289
|
|
85
|
+
tl_cli/_plugin/skills/tl-create-workflow/references/workflow-model.md,sha256=39cNg6AaSjb5K54neBkkn_RVJa7g9UnfZ_pVSzUsjDI,4591
|
|
78
86
|
tl_cli/_plugin/skills/tl-keyword-research/SKILL.md,sha256=wvLvlumbR5fDxL-PZAqRDu7azYl4MXe1A5vOBn8YghE,38264
|
|
79
87
|
tl_cli/_plugin/skills/tl-keyword-research/references/elasticsearch-content-search.md,sha256=fsXbpI3DPtkOnPEquB11Efur665o963RDN4-WIJCRJs,24263
|
|
80
88
|
tl_cli/_plugin/skills/tl-keyword-research/references/help.md,sha256=yTmoU-Z6rPDjprbDa09nePoON0jnRSh_FVc7lqu1XGs,6802
|
|
@@ -101,8 +109,8 @@ tl_cli/_plugin/skills/tl-top-partnerships/SKILL.md,sha256=jOMMr40XRnAZv-oRLeyKJT
|
|
|
101
109
|
tl_cli/_plugin/skills/tl-top-partnerships/scripts/top_partnerships.py,sha256=OqhoyvFe1zrtrStChcam7oPYgFnSbGHC3WAgLhLIC3w,13738
|
|
102
110
|
tl_cli/_plugin/skills/tl-views-guarantee/SKILL.md,sha256=IH7q1WJDWri9TWJMiga1FMGJO_GKSbWwaDS6CVNZ9c0,9270
|
|
103
111
|
tl_cli/_plugin/skills/tl-views-guarantee/scripts/vg.py,sha256=Qp5poinHEqh9374anq0bLtlxj2YL6ipBicaT960-Cws,15825
|
|
104
|
-
thoughtleaders_cli-0.9.
|
|
105
|
-
thoughtleaders_cli-0.9.
|
|
106
|
-
thoughtleaders_cli-0.9.
|
|
107
|
-
thoughtleaders_cli-0.9.
|
|
108
|
-
thoughtleaders_cli-0.9.
|
|
112
|
+
thoughtleaders_cli-0.9.4.dist-info/METADATA,sha256=-BYaTIApwQ4wVdRWEc99Dr-7BhfIpCHK7d858ufwoFg,20457
|
|
113
|
+
thoughtleaders_cli-0.9.4.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
|
|
114
|
+
thoughtleaders_cli-0.9.4.dist-info/entry_points.txt,sha256=umZp-1BkGkHDG0bNZXpTXrjwW0HGf9IDFN40eAWuuvg,39
|
|
115
|
+
thoughtleaders_cli-0.9.4.dist-info/licenses/LICENSE,sha256=RUfdfLsn6jygiyrnnVUHt6r4IPwr2rbDm9Kixgtu8fo,1071
|
|
116
|
+
thoughtleaders_cli-0.9.4.dist-info/RECORD,,
|
tl_cli/__init__.py
CHANGED
|
@@ -242,7 +242,6 @@ tl channels update 12345 '{"demographic_male_share": 62}'
|
|
|
242
242
|
tl channels update 12345 '{"demographic_geo": {"US": 60, "UK": 12, "CA": 8}}'
|
|
243
243
|
tl channels update 12345 '{"demographic_male_share": 55, "demographic_usa_share": 70}'
|
|
244
244
|
tl channels update 12345 '{"outreach_email": "press@creator.com"}'
|
|
245
|
-
tl channels update 12345 '{"media_selling_network_join_date": "2026-01-15"}'
|
|
246
245
|
```
|
|
247
246
|
|
|
248
247
|
**Channel contact emails.** Besides demographics, `tl channels update` accepts one
|
|
@@ -252,14 +251,8 @@ contact field:
|
|
|
252
251
|
|
|
253
252
|
The channel's full email archive (`all_emails` — a JSON object keyed by email address,
|
|
254
253
|
each value recording when and where the address was found) is **not editable here**;
|
|
255
|
-
sending it returns a 400. It is append-only
|
|
256
|
-
|
|
257
|
-
modifies or removes existing entries.
|
|
258
|
-
|
|
259
|
-
**MSN membership.** `tl channels update` also accepts **`media_selling_network_join_date`** —
|
|
260
|
-
the date the channel joined the Media Selling Network, as a `YYYY-MM-DD` string. This date is
|
|
261
|
-
itself the membership flag: set it to add the channel to MSN (it then reads as `is_msn` and
|
|
262
|
-
appears in MSN-filtered queries), or send `null` to remove the channel from the network.
|
|
254
|
+
sending it returns a 400. It is append-only and managed through an internal-only
|
|
255
|
+
process that never modifies or removes existing entries — not available via this CLI.
|
|
263
256
|
|
|
264
257
|
**Profile notes.** `tl profiles update` (superuser only) edits a brand/publisher profile's
|
|
265
258
|
**`superuser_notes`** — the internal free-text notes field on the customer record
|
|
@@ -509,6 +502,21 @@ tl changelog since v0.4.10 # Notes from v0.4.10 to latest
|
|
|
509
502
|
tl changelog --md > CHANGELOG.md # Capture for a doc
|
|
510
503
|
```
|
|
511
504
|
|
|
505
|
+
#### Distributed skills — beyond the bundled set
|
|
506
|
+
|
|
507
|
+
An organization can be granted additional skills that aren't part of a CLI release. `tl skill` fetches and installs them on demand into the same directories `tl setup` uses (Claude Code's standalone skills directory, OpenCode's skills directory, and the directory shared by Gemini and Codex), so every supported agent picks them up automatically — no restart or reconfiguration needed beyond re-reading the skill listing.
|
|
508
|
+
|
|
509
|
+
```bash
|
|
510
|
+
tl skill list # Skills available to your org, with installed/latest versions (free)
|
|
511
|
+
tl skill list --all # Full catalog (full-access accounts only)
|
|
512
|
+
tl skill download <name> # Fetch and install into every AI-agent skill directory on this machine
|
|
513
|
+
tl skill download <name> --force # Overwrite a directory tl doesn't already manage
|
|
514
|
+
tl skill update # Refresh every downloaded skill to its latest version
|
|
515
|
+
tl skill remove <name> # Uninstall a downloaded skill
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
If a user asks to find, add, or refresh a skill by capability ("is there a skill for X", "get me the latest Y skill"), check `tl skill list` before saying no — the bundled set isn't the whole catalog. `tl skill download` never overwrites a directory it doesn't already manage unless `--force` is passed, so it's safe to run without clobbering a manually-installed skill of the same name. `tl` warns once a day, on any command, when a downloaded skill has a newer version available — surface that nag to the user rather than silently ignoring it, and offer to run `tl skill update`.
|
|
519
|
+
|
|
512
520
|
#### Channel & video discovery — pick the path for the question shape
|
|
513
521
|
|
|
514
522
|
Four first-class paths, each with a different signal. **Pick by the SHAPE of the user's question, not by habit.** "Recommender first" is the right default only for path 2 — for paths 1, 3, and 4 the recommender is the wrong tool.
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tl-create-workflow
|
|
3
|
+
tl-blurb: design & stand up a sponsorship pipeline (workflow) from a goal
|
|
4
|
+
description: >
|
|
5
|
+
Turn a sponsorship / sourcing goal into a structured, data-populated
|
|
6
|
+
**Workflow** — an ordered funnel of report-stages that channels (or brands)
|
|
7
|
+
move through, e.g. Sourced → Qualified → Get face on screen → Reach out →
|
|
8
|
+
Contacted → Sold. Invoke when the user wants to build or set up a workflow or
|
|
9
|
+
pipeline, design an outreach / acquisition funnel for a brand or campaign,
|
|
10
|
+
turn an existing report into a workflow, or organise channel sourcing into
|
|
11
|
+
stages. Triggers: "create a workflow", "build a pipeline / funnel", "set up
|
|
12
|
+
outreach for <brand>", "turn this report into a workflow", "organise my
|
|
13
|
+
sourcing into stages", "workflow for finding channels to sponsor <brand>",
|
|
14
|
+
"build an acquisition funnel". It designs the funnel from the goal + the TL
|
|
15
|
+
methodology, sources the entry stage with real data (delegating to
|
|
16
|
+
tl-keyword-research / tl channels / tl recommender / guide-brand research),
|
|
17
|
+
defines each stage as a query-or-list report, and creates it with
|
|
18
|
+
"tl workflow create" (or, until the backend endpoint is deployed, hands back the
|
|
19
|
+
create-ready blueprint + in-app assembly steps). Also answers
|
|
20
|
+
HELP asks about how workflows work ("how do workflows work", "what's a
|
|
21
|
+
query vs a list stage", "explain workflow stages") for free.
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# tl-create-workflow — a sponsorship goal → a populated pipeline
|
|
25
|
+
|
|
26
|
+
Turn a fuzzy goal ("I need channels to sponsor **Magic Spoon**", "set up our
|
|
27
|
+
outreach funnel", "organise my sourcing") into a **Workflow**: an ordered chain
|
|
28
|
+
of report-**stages** that entities move through, with the **entry stage already
|
|
29
|
+
populated with the right channels** and every stage typed correctly. The value
|
|
30
|
+
is not drawing boxes — it's (a) designing the funnel from the **ThoughtLeaders
|
|
31
|
+
methodology** rather than a generic CRM template, (b) **sourcing the entry
|
|
32
|
+
stage with real data** so the pipeline starts full, not empty, and (c) getting
|
|
33
|
+
the **query-vs-list mechanics right** so the workflow doesn't break the way
|
|
34
|
+
hand-built ones do.
|
|
35
|
+
|
|
36
|
+
A workflow is **not a new kind of object** — every stage IS a saved Report
|
|
37
|
+
(campaign), chained in order. Understanding that is the whole game; read
|
|
38
|
+
`references/workflow-model.md` before you design anything.
|
|
39
|
+
|
|
40
|
+
> `<SKILL_DIR>` below is this skill's directory (the one holding `SKILL.md`).
|
|
41
|
+
|
|
42
|
+
## Hard rules
|
|
43
|
+
|
|
44
|
+
- **A stage is a Report.** A workflow = ordered Reports linked by
|
|
45
|
+
`workflow_step_number`. There is no separate "stage" object. Design in terms
|
|
46
|
+
of reports.
|
|
47
|
+
- **The entry stage is a QUERY; every later stage is a LIST.** This is the
|
|
48
|
+
single most important rule and the #1 cause of broken hand-built workflows —
|
|
49
|
+
see `references/workflow-model.md` (query vs list) and
|
|
50
|
+
`references/pitfalls.md`. Never make stage 2+ a query.
|
|
51
|
+
- **Creating the workflow.** `tl workflow create --file <blueprint.json>` builds
|
|
52
|
+
it in one call — it POSTs `{name, report_type, steps}` to the Bearer endpoint
|
|
53
|
+
`/api/cli/v1/workflows/build` (the twin of the web builder). The command ships
|
|
54
|
+
in this repo; the endpoint ships with backend **PR #4192** — **until that is
|
|
55
|
+
deployed the command errors**, and the user stands the workflow up in the web
|
|
56
|
+
app from the blueprint (Convert → Add stage). Both paths are in
|
|
57
|
+
`references/creating-in-app.md`. **Never claim a workflow was created unless a
|
|
58
|
+
`tl workflow create` call actually returned one** — otherwise you prepared a
|
|
59
|
+
blueprint.
|
|
60
|
+
- **Source with real data, never placeholder channels.** The entry stage must
|
|
61
|
+
be filled from the index (delegate to `tl-keyword-research` /
|
|
62
|
+
`tl channels find` / `tl recommender` / guide-brand research), never a made-up
|
|
63
|
+
list. An empty pipeline is a failed deliverable.
|
|
64
|
+
- Do all data processing with the `utf-8` encoding explicitly in any script you
|
|
65
|
+
write.
|
|
66
|
+
|
|
67
|
+
## Setup check
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
tl whoami # confirms the CLI is authed and shows plan/limits
|
|
71
|
+
```
|
|
72
|
+
If this errors, tell the user to run `tl auth login` (or set `TL_API_KEY`).
|
|
73
|
+
Sourcing stages needs intelligence access on the org's plan; if `tl whoami`
|
|
74
|
+
shows no intelligence flag, say so — you can still design the funnel, but you
|
|
75
|
+
can't populate it from the index.
|
|
76
|
+
|
|
77
|
+
## When to invoke / skip
|
|
78
|
+
|
|
79
|
+
**Invoke** when the user wants to **stand up a pipeline**: build/set up a
|
|
80
|
+
workflow, design an outreach or acquisition funnel for a brand/campaign, turn a
|
|
81
|
+
report into a workflow, or organise sourcing into stages.
|
|
82
|
+
|
|
83
|
+
**Skip when:**
|
|
84
|
+
- They just want to *find* channels/brands/videos → `tl channels find`,
|
|
85
|
+
`tl-keyword-research`, `tl recommender`. (You'll *use* these, but a lookup
|
|
86
|
+
alone isn't a workflow.)
|
|
87
|
+
- They want to persist one flat list/report they already have →
|
|
88
|
+
`tl-save-report`.
|
|
89
|
+
- They're asking about an **existing** workflow's data (counts, who's in which
|
|
90
|
+
stage) → query it with `tl` directly.
|
|
91
|
+
|
|
92
|
+
## Help mode — explain workflows on request, for free
|
|
93
|
+
|
|
94
|
+
When the user asks what a workflow is, how stages work, query vs list, or "how
|
|
95
|
+
do I build one" as a *question* (not a request to build): **run nothing**. Read
|
|
96
|
+
`references/workflow-model.md` (+ `references/pitfalls.md` for the gotchas) and
|
|
97
|
+
explain, sized to the ask. Close by offering to design one. Mid-run questions
|
|
98
|
+
get the same treatment — answer, then resume.
|
|
99
|
+
|
|
100
|
+
## The build (you orchestrate; the tl CLI + sibling skills do the data work)
|
|
101
|
+
|
|
102
|
+
| Stage | What happens | Tooling |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| 0 Frame | goal, entity type, funnel shape, stage list — interview, don't assume | you + `references/methodology.md` |
|
|
105
|
+
| 1 Source the entry stage | fill stage 1 with the right channels/brands (a QUERY) | `tl-keyword-research` · `tl channels find` · `tl recommender` · guide-brand research |
|
|
106
|
+
| 2 Define the stages | each stage as a report config (query for stage 1, lists after) | you + `references/workflow-model.md` |
|
|
107
|
+
| 3 Blueprint | emit the create-ready plan: stage names, types, the entry filter, links | you |
|
|
108
|
+
| 4 Assemble | the exact in-app steps to build it (Convert → Add stage → link) | `references/creating-in-app.md` |
|
|
109
|
+
| 5 Deliver | blueprint + entry-stage report link + how to work the funnel | `tl-save-report` (for the entry report) |
|
|
110
|
+
|
|
111
|
+
**Narrate the run** — one line per stage transition, and surface every
|
|
112
|
+
assumption so the user can correct it. Sourcing spends credits (it's real ES
|
|
113
|
+
work); say roughly how much as you go, exactly like `tl-keyword-research`.
|
|
114
|
+
|
|
115
|
+
### Stage 0 — Frame the funnel (interview; never assume)
|
|
116
|
+
|
|
117
|
+
Two things decide everything, and both are the user's:
|
|
118
|
+
|
|
119
|
+
1. **The goal & entity.** What is this pipeline *for*, and does it move
|
|
120
|
+
**channels** (usual), **brands**, or **sponsorships**? "Find channels to
|
|
121
|
+
sponsor Magic Spoon" → a channel-acquisition funnel. "Work our brand
|
|
122
|
+
prospects" → a brand funnel. The entity type fixes the workflow's
|
|
123
|
+
`report_type` and can't be mixed later.
|
|
124
|
+
2. **The funnel shape.** How many stages and what they mean. Don't invent a
|
|
125
|
+
generic "Lead → MQL → SQL" — derive it from the **ThoughtLeaders
|
|
126
|
+
methodology** (`references/methodology.md`): the real sourcing funnel is
|
|
127
|
+
*find the pool → qualify on value-vs-price → enrich (face-on-screen,
|
|
128
|
+
contacts) → outreach → pipeline (proposed/pending/sold)*. Offer the canonical
|
|
129
|
+
funnel below and let them cut/rename stages — the huddle's real stages are
|
|
130
|
+
good defaults:
|
|
131
|
+
|
|
132
|
+
> **Sourced** (query) → **Qualify** (list) → **Get face on screen** (list) →
|
|
133
|
+
> **Reach out** (list) → **Contacted** (list) → **Proposed** (list)
|
|
134
|
+
|
|
135
|
+
Stage names are just report titles — pick names the team will recognise
|
|
136
|
+
(they persist on the campaign). Fewer, meaningful stages beat many empty
|
|
137
|
+
ones.
|
|
138
|
+
|
|
139
|
+
State the goal, entity, and stage list back to the user before sourcing
|
|
140
|
+
anything.
|
|
141
|
+
|
|
142
|
+
### Stage 1 — Source the entry stage (the QUERY)
|
|
143
|
+
|
|
144
|
+
Stage 1 is the **pool**: the channels the funnel starts from, selected by a
|
|
145
|
+
*filter* (a query), not an explicit list. Pick the sourcing path from the goal —
|
|
146
|
+
this is where the methodology becomes data:
|
|
147
|
+
|
|
148
|
+
- **Sponsor a specific brand / product** → find the brand's category and its
|
|
149
|
+
**guide brands** (proven sponsors / competitors), then their **winner
|
|
150
|
+
channels** (TRUE renewals — the real signal), then **look-alikes**. Use
|
|
151
|
+
`tl brands` research + `tl channels similar` / `tl recommender`.
|
|
152
|
+
- **A topic / niche** ("cooking channels for a kitchenware brand") →
|
|
153
|
+
**`tl-keyword-research`** to turn the topic into a validated content filter +
|
|
154
|
+
the channels it selects. Take its `report_link` / filter set as stage 1.
|
|
155
|
+
- **A known shortlist** → then stage 1 is really a *list*, and a workflow may be
|
|
156
|
+
overkill — say so; `tl-save-report` might be all they need.
|
|
157
|
+
|
|
158
|
+
Deliver stage 1 as a **query report** (a filter set), and — because it's the
|
|
159
|
+
entry — it's fine and correct for it to be a query. Populate it, eyeball the
|
|
160
|
+
count and a sample, and confirm the breadth with the user (too broad → narrow
|
|
161
|
+
the filter; too thin → widen), exactly like keyword-research's breadth check.
|
|
162
|
+
|
|
163
|
+
### Stage 2 — Define the stages (query first, lists after)
|
|
164
|
+
|
|
165
|
+
For each downstream stage, the report is a **list**: it starts empty and fills
|
|
166
|
+
as the user bulk-selects entities in the previous stage and **Moves** them
|
|
167
|
+
forward. You don't pre-populate lists — you just create the (empty) list
|
|
168
|
+
reports with the right names and types.
|
|
169
|
+
|
|
170
|
+
- **Types must alternate correctly:** stage 1 = query; stages 2..N = lists.
|
|
171
|
+
Re-check `references/workflow-model.md` if unsure how the platform infers
|
|
172
|
+
query-vs-list from the FilterSet.
|
|
173
|
+
- **Columns per stage:** if a stage needs a specific column the team acts on
|
|
174
|
+
(e.g. *Face On Screen* on the "Get face on screen" stage, *Outreach email* on
|
|
175
|
+
"Reach out"), note it — columns are set per report.
|
|
176
|
+
- **Linked reports (include/exclude), sparingly:** a stage can pull in another
|
|
177
|
+
report's entities (e.g. exclude "no email / captcha"). Keep this to **≤1–2
|
|
178
|
+
layers of nesting** — deep chains are the documented performance + confusion
|
|
179
|
+
trap (`references/pitfalls.md`). Prefer a flat stage over a clever nest.
|
|
180
|
+
|
|
181
|
+
### Stage 3 — Emit the blueprint
|
|
182
|
+
|
|
183
|
+
Hand the user a compact, create-ready plan:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
Workflow: "Magic Spoon — channel sourcing" (report_type: channels)
|
|
187
|
+
1. Sourced [QUERY] ← <entry filter summary> · ~<N> channels · <report_link>
|
|
188
|
+
2. Qualify [list] empty; move channels that pass value-vs-price
|
|
189
|
+
3. Get face on screen [list] empty; column: Face On Screen
|
|
190
|
+
4. Reach out [list] empty; column: Outreach email; exclude → "No email / captcha"
|
|
191
|
+
5. Contacted [list] empty
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Include the **entry report link** (from keyword-research / `tl reports create`)
|
|
195
|
+
so stage 1 exists as a real, openable report before assembly.
|
|
196
|
+
|
|
197
|
+
### Stage 4 — Assemble in the web app
|
|
198
|
+
|
|
199
|
+
Workflows are built in-app (no CLI endpoint). Walk the user through
|
|
200
|
+
`references/creating-in-app.md`:
|
|
201
|
+
|
|
202
|
+
1. Open the **entry (Sourced) report** → **Convert to workflow** → name it. That
|
|
203
|
+
report becomes **stage 1**.
|
|
204
|
+
2. **Add stage** for each downstream stage, in order, with the names from the
|
|
205
|
+
blueprint (they save on the campaign — renames persist).
|
|
206
|
+
3. For any stage with a **linked report** (e.g. exclude "no email"), add it on
|
|
207
|
+
that stage — keep nesting shallow.
|
|
208
|
+
4. Set per-stage **columns** where noted.
|
|
209
|
+
5. Work the funnel: on a stage, **filter** (e.g. by *Face On Screen*),
|
|
210
|
+
**bulk-select**, **Move** to the next stage. Moving is non-destructive.
|
|
211
|
+
|
|
212
|
+
### Stage 5 — Deliver
|
|
213
|
+
|
|
214
|
+
Show: the funnel (stages, types, per-stage columns/links), the **entry-stage
|
|
215
|
+
report link** (populated), and the one-paragraph "how to work this funnel"
|
|
216
|
+
(filter → select → move). Offer to **save the entry report** via
|
|
217
|
+
`tl-save-report` if it isn't already saved. Never save or create anything the
|
|
218
|
+
user didn't ask for.
|
|
219
|
+
|
|
220
|
+
## Cost
|
|
221
|
+
|
|
222
|
+
Framing and blueprinting are free (no queries). **Sourcing stage 1 spends
|
|
223
|
+
credits** — that's real ES work delegated to `tl-keyword-research` /
|
|
224
|
+
`tl channels` / `tl recommender`; their own costs apply (keyword-research: ~10–20
|
|
225
|
+
credits quick, ~60–120 deep). Run `tl describe show db` for live rates. The
|
|
226
|
+
in-app assembly costs nothing (it's the user clicking in the platform).
|
|
227
|
+
|
|
228
|
+
## Self-check before you finish
|
|
229
|
+
|
|
230
|
+
1. You established the **goal**, the **entity type** (channels / brands /
|
|
231
|
+
sponsorships → the workflow's `report_type`), and the **stage list** with the
|
|
232
|
+
user — derived from the methodology, not a generic CRM funnel — and stated
|
|
233
|
+
them back before sourcing.
|
|
234
|
+
2. **Stage 1 is a QUERY and it's populated** from real index data (not a
|
|
235
|
+
placeholder list), with its breadth confirmed against the goal (narrowed /
|
|
236
|
+
widened as needed). **Every stage after 1 is a LIST.** No stage 2+ is a query.
|
|
237
|
+
3. Any **linked reports** are ≤1–2 nesting layers; you preferred a flat stage
|
|
238
|
+
over a deep nest, and flagged per-stage **columns** the team acts on.
|
|
239
|
+
4. The blueprint is **create-ready**: named stages, correct types, the entry
|
|
240
|
+
filter summary + a working **report link**, and the in-app assembly steps.
|
|
241
|
+
5. You were explicit that the **Workflow is assembled in the web app** (the CLI
|
|
242
|
+
can't create it) — you prepared it, you didn't claim to have created it.
|
|
243
|
+
6. You narrated the run and its credit spend, and saved / created **nothing**
|
|
244
|
+
without the user's say-so.
|
|
245
|
+
7. If the user requests a diagram of the funnel, create it as an SVG graphic.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Creating the workflow
|
|
2
|
+
|
|
3
|
+
**`tl workflow create` builds the workflow from a blueprint in one call** — it
|
|
4
|
+
POSTs `{name, report_type, steps}` to the Bearer endpoint
|
|
5
|
+
`/api/cli/v1/workflows/build` (the twin of the web "New Workflow" builder). The
|
|
6
|
+
result is the same `Workflow` / stage-`Campaign` / `FilterSet` objects the rest of
|
|
7
|
+
the platform uses, so it shows up in the web app's workflow list/detail
|
|
8
|
+
immediately, where the team moves / edits / duplicates it.
|
|
9
|
+
|
|
10
|
+
> **Availability.** The `tl workflow` command ships in this repo; the endpoint it
|
|
11
|
+
> calls ships with backend **thoughtleaders PR #4192** (`create_full_workflow`).
|
|
12
|
+
> Until that backend change is deployed, `tl workflow create` returns an error —
|
|
13
|
+
> use the **manual in-app assembly** at the bottom of this file. The blueprint is
|
|
14
|
+
> the exact same input either way, so nothing is wasted.
|
|
15
|
+
|
|
16
|
+
## Create it directly (preferred)
|
|
17
|
+
|
|
18
|
+
1. **Build + save the entry (Sourced) report first**, so it exists with an **id**.
|
|
19
|
+
It's a *query* report populated by this skill (`tl-keyword-research`,
|
|
20
|
+
`tl channels`, `tl recommender`, or `tl reports create`) and saved
|
|
21
|
+
(`tl-save-report` / `tl reports create`). This is the only stage that starts
|
|
22
|
+
with data, and it must be a saved **query** so the stage stays live.
|
|
23
|
+
2. **Write the blueprint to a file** and run `tl workflow create`:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
tl workflow create --file blueprint.json # add --yes to skip the confirm
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`blueprint.json`:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"name": "Q3 Creator Outreach",
|
|
34
|
+
"report_type": 3,
|
|
35
|
+
"steps": [
|
|
36
|
+
{ "title": "Sourced", "include_report_ids": [<entryReportId>], "exclude_report_ids": [] },
|
|
37
|
+
{ "title": "Qualify", "include_report_ids": [], "exclude_report_ids": [] },
|
|
38
|
+
{ "title": "Get face on screen", "include_report_ids": [], "exclude_report_ids": [] },
|
|
39
|
+
{ "title": "Reach out", "include_report_ids": [], "exclude_report_ids": [] }
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- `report_type`: **1** content · **2** brands · **3** channels · **8** sponsorships.
|
|
45
|
+
- Stages are created **in order**; the first is the entry stage (link the saved
|
|
46
|
+
query report via `include_report_ids`), the rest are empty **lists** channels
|
|
47
|
+
move into. Keep any linked-report nesting shallow (≤1–2).
|
|
48
|
+
- Only reports you may edit are linked (others are dropped); the workflow is
|
|
49
|
+
owned by you. One atomic call creates the workflow + stage campaigns +
|
|
50
|
+
include/exclude report links + the exclude-earlier-stages chaining.
|
|
51
|
+
- Use `--config '<json>'` for inline JSON, or `--name` / `--report-type` to
|
|
52
|
+
supply/override those fields. `--json` / `--toon` for machine output.
|
|
53
|
+
3. The command prints the new workflow **id** and an **"Open in app"** link
|
|
54
|
+
(`/#/workflows/<report_type>/<id>`). Hand that to the user to work the funnel:
|
|
55
|
+
on a stage, filter → bulk-select → **Move** to the next stage (Move / Remove
|
|
56
|
+
are non-destructive; moved channels leave the source stage).
|
|
57
|
+
|
|
58
|
+
## The endpoints (reference)
|
|
59
|
+
|
|
60
|
+
| Action | Request | Auth |
|
|
61
|
+
|--------|---------|------|
|
|
62
|
+
| **Build a full workflow** (`tl workflow create`) | `POST /api/cli/v1/workflows/build` · `{ name, report_type, steps[] }` | **Bearer (CLI)** |
|
|
63
|
+
| Convert one report → 1-stage workflow | `POST /api/workflows` · `{ campaignId, workflowName }` | session |
|
|
64
|
+
| Add a stage | `POST /api/workflows/add-step` · `{ campaignTitle, workflowId }` | session |
|
|
65
|
+
| Delete a stage (any same-org collaborator) | `DELETE /api/workflows/delete-step?stepId=` | session |
|
|
66
|
+
| Rename / delete the workflow (delete is owner-only) | `PATCH` / `DELETE /api/workflows/:id` | session |
|
|
67
|
+
| Fetch a workflow + stages | `GET /api/workflows/:id` | session |
|
|
68
|
+
| Link a report / move entities on a stage | `PATCH` the stage filterset's `add_relation` action | session |
|
|
69
|
+
|
|
70
|
+
Only the **build** endpoint is on the CLI's Bearer surface; the rest are the web
|
|
71
|
+
app's session-authenticated management routes (used from the web UI).
|
|
72
|
+
|
|
73
|
+
## Assemble it in the web app (fallback until the endpoint is live)
|
|
74
|
+
|
|
75
|
+
If the build endpoint isn't deployed yet, the user stands the workflow up from
|
|
76
|
+
the blueprint by hand — same design, more clicks:
|
|
77
|
+
|
|
78
|
+
1. Open the saved entry report → **Convert to workflow** → name it. It becomes
|
|
79
|
+
**stage 1**.
|
|
80
|
+
2. **Add stage** for each downstream stage, in blueprint order (each is an empty
|
|
81
|
+
**list**; names persist across reloads).
|
|
82
|
+
3. **Link** supporting include/exclude reports where the blueprint calls for it
|
|
83
|
+
(nesting ≤1–2 layers).
|
|
84
|
+
4. Set per-stage **columns** the team acts on (Face On Screen, Outreach email).
|
|
85
|
+
5. **Work the funnel:** on a stage, filter → select → **Move** to the next stage.
|
|
86
|
+
|
|
87
|
+
## What to hand the user
|
|
88
|
+
|
|
89
|
+
- The **entry report link** (populated, openable).
|
|
90
|
+
- Either the **"Open in app" workflow link** (from `tl workflow create`) or the
|
|
91
|
+
**blueprint + in-app assembly steps** (fallback).
|
|
92
|
+
- The one-line "how to work the funnel": *filter a stage → select → Move to next.*
|
|
93
|
+
|
|
94
|
+
Never claim a workflow was created unless a `tl workflow create` call actually
|
|
95
|
+
returned one — otherwise you prepared a blueprint.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Funnel design — the ThoughtLeaders methodology, not a generic CRM
|
|
2
|
+
|
|
3
|
+
Don't design a workflow like a generic sales CRM ("Lead → MQL → SQL → Won").
|
|
4
|
+
Design it from how ThoughtLeaders actually sources and closes sponsorships. The
|
|
5
|
+
funnel stages fall out of the methodology.
|
|
6
|
+
|
|
7
|
+
## The sourcing methodology (how the pool is found)
|
|
8
|
+
|
|
9
|
+
The core play for finding the right channels for a brand:
|
|
10
|
+
|
|
11
|
+
1. **Identify the brands** — through competitor research and **Guide Brands**
|
|
12
|
+
(brands that are *proven* sponsors in the category). A guide brand is a
|
|
13
|
+
working example of "who already pays to sponsor this kind of content".
|
|
14
|
+
2. **Find the winner channels** — the channels those guide brands *renewed*
|
|
15
|
+
with. A **TRUE renewal** (the brand came back and paid again) is the real
|
|
16
|
+
signal that the channel converts, not a vanity metric.
|
|
17
|
+
3. **Find look-alike channels** — channels similar to the winners (same
|
|
18
|
+
audience/niche/shape) that haven't been booked yet. This is the addressable
|
|
19
|
+
pool.
|
|
20
|
+
4. **Analyse value vs price** — for each candidate, is the projected value
|
|
21
|
+
(views, audience fit) worth the price? This is the qualification gate.
|
|
22
|
+
|
|
23
|
+
The entry stage of a workflow is the output of steps 1–3 (the look-alike pool),
|
|
24
|
+
expressed as a **query**. Qualification (step 4) is the first downstream list
|
|
25
|
+
stage.
|
|
26
|
+
|
|
27
|
+
## Terminology to keep straight (TL uses its own words)
|
|
28
|
+
|
|
29
|
+
- **Brands** = the sponsors (usually companies, sometimes a single product).
|
|
30
|
+
- **Channels** = the creators being sponsored (YouTube channels, sometimes
|
|
31
|
+
podcasts).
|
|
32
|
+
- **Sponsorship** is the umbrella; it narrows through a funnel of its own:
|
|
33
|
+
*Sponsorships ⊃ Matches ⊃ Proposals ⊃ Deals (sold)*.
|
|
34
|
+
- Pricing words: **PV** = Projected Views (a pricing estimate); **VG** = View
|
|
35
|
+
Guarantee (the contractual floor). Don't invent CPM/"margin" language — TL
|
|
36
|
+
says **Net revenue** / **TL profit**, and avoid "flight" / "hero channel".
|
|
37
|
+
- **Send date** = the expected publication date of a sponsored video.
|
|
38
|
+
- Two channel networks exist: **MSN** (the large ~11K opted-in Media Selling
|
|
39
|
+
Network) and **TPP** (the small ~169 directly-managed VIP channels). Sourcing
|
|
40
|
+
usually works over MSN; enrichment tasks ("get face on screen") are often
|
|
41
|
+
assigned to MSN managers.
|
|
42
|
+
|
|
43
|
+
## The canonical acquisition funnel
|
|
44
|
+
|
|
45
|
+
A good default channel-acquisition workflow, with each stage's type and the
|
|
46
|
+
column the team acts on. Offer this, then let the user cut / rename / reorder.
|
|
47
|
+
|
|
48
|
+
| # | Stage | Type | What it means | Acted-on column |
|
|
49
|
+
|---|-------|------|---------------|-----------------|
|
|
50
|
+
| 1 | **Sourced** | query | The pool: look-alike channels for the brand's guide-brand winners (or a topic filter). | — |
|
|
51
|
+
| 2 | **Qualify** | list | Passed value-vs-price (and, if relevant, an authenticity check). | Projected views / price |
|
|
52
|
+
| 3 | **Get face on screen** | list | Assigned to MSN managers to fill in face-on-screen + enrich. | Face On Screen |
|
|
53
|
+
| 4 | **Reach out** | list | Has an outreach email; ready to contact. | Outreach email |
|
|
54
|
+
| 5 | **Contacted** | list | Outreach sent. | — |
|
|
55
|
+
| 6 | **Proposed** | list | A proposal is out. | — |
|
|
56
|
+
|
|
57
|
+
Notes:
|
|
58
|
+
- Stages 5–6 mirror the sponsorship sub-funnel (Match → Proposal → Deal); stop
|
|
59
|
+
wherever the team's process stops. Don't add stages the team won't work.
|
|
60
|
+
- For a **brand-prospecting** workflow (report_type = brands) the shape rebases:
|
|
61
|
+
*Prospects (query: brands in a category / competitors of a guide brand) →
|
|
62
|
+
Qualified → Pitching → Won*.
|
|
63
|
+
|
|
64
|
+
## Sizing the pool (breadth)
|
|
65
|
+
|
|
66
|
+
There is no universal right number. A niche brand with a few dozen good
|
|
67
|
+
look-alikes is a complete answer; a broad consumer brand returning a few dozen
|
|
68
|
+
is probably too narrow. State your breadth judgement and offer to narrow/widen —
|
|
69
|
+
exactly the calibration `tl-keyword-research` does. The pool is the query stage;
|
|
70
|
+
everything downstream is a subset of it.
|