luckiest-co 1.0.47 → 1.0.49

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.
Files changed (274) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/package.json +1 -1
  4. package/skills/ab-testing/CHANGELOG.md +5 -0
  5. package/skills/ab-testing/SKILL.md +12 -9
  6. package/skills/ab-testing/evals/evals.json +18 -7
  7. package/skills/ab-testing/references/sample-size-guide.md +2 -2
  8. package/skills/ads/CHANGELOG.md +5 -0
  9. package/skills/ads/SKILL.md +4 -4
  10. package/skills/ai-seo/CHANGELOG.md +7 -0
  11. package/skills/ai-seo/SKILL.md +27 -20
  12. package/skills/analytics/CHANGELOG.md +6 -0
  13. package/skills/analytics/SKILL.md +4 -3
  14. package/skills/analytics/evals/evals.json +27 -0
  15. package/skills/analytics/references/ga4-implementation.md +7 -3
  16. package/skills/analytics/references/gtm-implementation.md +8 -2
  17. package/skills/aso/CHANGELOG.md +5 -0
  18. package/skills/aso/SKILL.md +4 -4
  19. package/skills/aso/evals/evals.json +15 -2
  20. package/skills/aso/references/benchmarks.md +4 -2
  21. package/skills/aso/references/google-play-specs.md +5 -1
  22. package/skills/brainstorm/SKILL.md +59 -16
  23. package/skills/brainstorm/builder-check-prompt.md +23 -0
  24. package/skills/churn-prevention/CHANGELOG.md +5 -0
  25. package/skills/churn-prevention/SKILL.md +3 -3
  26. package/skills/churn-prevention/evals/evals.json +14 -0
  27. package/skills/churn-prevention/references/dunning-playbook.md +6 -1
  28. package/skills/coder-brainstorming/CHANGELOG.md +10 -0
  29. package/skills/coder-brainstorming/SKILL.md +62 -20
  30. package/skills/coder-brainstorming/builder-check-prompt.md +23 -0
  31. package/skills/coder-brainstorming/scripts/server.cjs +1 -1
  32. package/skills/coder-debugging/CHANGELOG.md +4 -0
  33. package/skills/coder-debugging/SKILL.md +5 -5
  34. package/skills/coder-requesting-code-review/CHANGELOG.md +4 -0
  35. package/skills/coder-requesting-code-review/SKILL.md +4 -4
  36. package/skills/coder-subagent-driven-development/CHANGELOG.md +4 -0
  37. package/skills/coder-subagent-driven-development/SKILL.md +3 -3
  38. package/skills/coder-subagent-driven-development/scripts/sdd-workspace +3 -1
  39. package/skills/cold-email/CHANGELOG.md +7 -0
  40. package/skills/cold-email/SKILL.md +27 -7
  41. package/skills/cold-email/evals/evals.json +30 -0
  42. package/skills/cold-email/references/benchmarks.md +15 -11
  43. package/skills/cold-email/references/deliverability.md +110 -0
  44. package/skills/cold-email/references/linkedin-outreach.md +91 -0
  45. package/skills/cold-email/references/multichannel-cadence.md +79 -0
  46. package/skills/cold-email/references/outbound-plays.md +88 -0
  47. package/skills/cold-email/references/personalization.md +11 -0
  48. package/skills/cold-email/references/reply-handling.md +65 -0
  49. package/skills/competitor-profiling/CHANGELOG.md +5 -0
  50. package/skills/competitor-profiling/SKILL.md +4 -4
  51. package/skills/content-strategy/CHANGELOG.md +5 -0
  52. package/skills/content-strategy/SKILL.md +5 -3
  53. package/skills/copy-editing/CHANGELOG.md +5 -0
  54. package/skills/copy-editing/SKILL.md +5 -5
  55. package/skills/copy-editing/references/content-refresh.md +33 -0
  56. package/skills/cro/CHANGELOG.md +5 -0
  57. package/skills/cro/SKILL.md +14 -3
  58. package/skills/cro/references/form.md +1 -1
  59. package/skills/directory-submissions/CHANGELOG.md +5 -0
  60. package/skills/directory-submissions/SKILL.md +13 -4
  61. package/skills/directory-submissions/evals/evals.json +15 -1
  62. package/skills/directory-submissions/references/directory-list.md +2 -4
  63. package/skills/emails/CHANGELOG.md +5 -0
  64. package/skills/emails/SKILL.md +14 -4
  65. package/skills/launch/CHANGELOG.md +7 -0
  66. package/skills/launch/SKILL.md +8 -4
  67. package/skills/launch/evals/evals.json +29 -0
  68. package/skills/launch/references/shipped-changes.md +84 -0
  69. package/skills/launch/references/site-launch-qa.md +55 -0
  70. package/skills/lead-magnets/CHANGELOG.md +5 -0
  71. package/skills/lead-magnets/SKILL.md +6 -4
  72. package/skills/lead-magnets/evals/evals.json +18 -0
  73. package/skills/lead-magnets/references/content-to-skill-corpus-design.md +89 -0
  74. package/skills/lead-magnets/references/content-to-skill-release.md +71 -0
  75. package/skills/lead-magnets/references/content-to-skill.md +108 -0
  76. package/skills/marketing-plan/CHANGELOG.md +5 -0
  77. package/skills/marketing-plan/SKILL.md +3 -3
  78. package/skills/marketing-plan/evals/evals.json +13 -0
  79. package/skills/marketing-plan/references/budget-planning.md +26 -17
  80. package/skills/model-router/CHANGELOG.md +6 -0
  81. package/skills/model-router/SKILL.md +3 -3
  82. package/skills/model-router/scripts/route.py +1 -1
  83. package/skills/model-router/scripts/test_route.py +5 -0
  84. package/skills/pricing/CHANGELOG.md +5 -0
  85. package/skills/pricing/SKILL.md +4 -4
  86. package/skills/pricing/evals/evals.json +12 -0
  87. package/skills/pricing/references/research-methods.md +8 -4
  88. package/skills/programmatic-seo/CHANGELOG.md +5 -0
  89. package/skills/programmatic-seo/SKILL.md +8 -4
  90. package/skills/programmatic-seo/evals/evals.json +13 -0
  91. package/skills/programmatic-seo/references/implementation-platforms.md +37 -0
  92. package/skills/prospecting/CHANGELOG.md +7 -0
  93. package/skills/prospecting/SKILL.md +27 -13
  94. package/skills/prospecting/evals/evals.json +41 -0
  95. package/skills/prospecting/references/account-research.md +59 -0
  96. package/skills/prospecting/references/b2b-prospecting.md +1 -1
  97. package/skills/prospecting/references/compliance.md +44 -6
  98. package/skills/prospecting/references/data-sources.md +13 -15
  99. package/skills/prospecting/references/enrichment-playbook.md +61 -0
  100. package/skills/prospecting/references/saas-prospecting.md +1 -1
  101. package/skills/prospecting/references/signal-plays.md +99 -0
  102. package/skills/prospecting/references/sourcing-and-enrichment.md +89 -0
  103. package/skills/referrals/CHANGELOG.md +5 -0
  104. package/skills/referrals/SKILL.md +10 -4
  105. package/skills/referrals/evals/evals.json +99 -0
  106. package/skills/referrals/references/affiliate-operations.md +64 -0
  107. package/skills/referrals/references/affiliate-programs.md +2 -2
  108. package/skills/referrals/references/program-examples.md +14 -6
  109. package/skills/referrals/references/review-platform-rules.md +36 -0
  110. package/skills/referrals/references/review-program-operations.md +62 -0
  111. package/skills/referrals/references/review-programs.md +96 -0
  112. package/skills/revops/CHANGELOG.md +5 -0
  113. package/skills/revops/SKILL.md +10 -6
  114. package/skills/revops/evals/evals.json +13 -0
  115. package/skills/revops/references/automation-playbooks.md +1 -1
  116. package/skills/revops/references/inbound-routing.md +43 -0
  117. package/skills/revops/references/lifecycle-definitions.md +31 -0
  118. package/skills/sales-enablement/CHANGELOG.md +5 -0
  119. package/skills/sales-enablement/SKILL.md +6 -4
  120. package/skills/sales-enablement/evals/evals.json +14 -0
  121. package/skills/sales-enablement/references/cold-call-scripts.md +68 -0
  122. package/skills/schema/CHANGELOG.md +5 -0
  123. package/skills/schema/SKILL.md +20 -8
  124. package/skills/schema/evals/evals.json +40 -0
  125. package/skills/schema/references/schema-examples.md +9 -15
  126. package/skills/seo-audit/CHANGELOG.md +5 -0
  127. package/skills/seo-audit/SKILL.md +10 -16
  128. package/skills/seo-audit/evals/evals.json +68 -0
  129. package/skills/seo-audit/references/international-seo.md +9 -11
  130. package/skills/seo-audit/references/local-seo-pages-and-measurement.md +39 -0
  131. package/skills/seo-audit/references/local-seo-profile-and-citations.md +41 -0
  132. package/skills/seo-audit/references/local-seo.md +86 -0
  133. package/skills/seo-audit/references/rankings-push.md +62 -0
  134. package/skills/seo-audit/references/title-tags.md +89 -0
  135. package/skills/signup/CHANGELOG.md +5 -0
  136. package/skills/signup/SKILL.md +7 -3
  137. package/skills/site-architecture/CHANGELOG.md +5 -0
  138. package/skills/site-architecture/SKILL.md +5 -4
  139. package/skills/site-architecture/evals/evals.json +25 -0
  140. package/skills/site-architecture/references/platforms-and-migration.md +84 -0
  141. package/skills/social/CHANGELOG.md +5 -0
  142. package/skills/social/SKILL.md +4 -4
  143. package/skills/trends/.skillignore +3 -0
  144. package/skills/trends/CHANGELOG.md +20 -0
  145. package/skills/trends/SKILL.md +12 -8
  146. package/skills/trends/references/agent-mode.md +36 -0
  147. package/skills/trends/references/category-peers.md +38 -0
  148. package/skills/trends/references/comparison.md +227 -0
  149. package/skills/trends/references/competitors.md +29 -0
  150. package/skills/trends/references/discovery.md +90 -0
  151. package/skills/trends/references/engine-contract.md +111 -1889
  152. package/skills/trends/references/followups.md +112 -0
  153. package/skills/trends/references/grok-bot-x.md +55 -0
  154. package/skills/trends/references/hiring-signals.md +19 -0
  155. package/skills/trends/references/library-queue.md +33 -0
  156. package/skills/trends/references/recommendations.md +86 -0
  157. package/skills/trends/references/research-runbook.md +781 -0
  158. package/skills/trends/references/runtime.md +165 -0
  159. package/skills/trends/references/save-html-brief.md +39 -20
  160. package/skills/trends/references/setup-wizard.md +253 -0
  161. package/skills/trends/references/synthesis.md +289 -0
  162. package/skills/trends/scripts/box_chrome_login.py +209 -0
  163. package/skills/trends/scripts/briefing.py +9 -17
  164. package/skills/trends/scripts/last30days.py +3247 -280
  165. package/skills/trends/scripts/lib/agentcookie.py +196 -0
  166. package/skills/trends/scripts/lib/amazon.py +877 -0
  167. package/skills/trends/scripts/lib/arxiv.py +42 -8
  168. package/skills/trends/scripts/lib/backends.py +769 -0
  169. package/skills/trends/scripts/lib/bird_x.py +340 -57
  170. package/skills/trends/scripts/lib/bluesky.py +84 -10
  171. package/skills/trends/scripts/lib/bounded_get.py +156 -0
  172. package/skills/trends/scripts/lib/brightdata.py +291 -0
  173. package/skills/trends/scripts/lib/categories.py +7 -1
  174. package/skills/trends/scripts/lib/chrome_cdp.py +455 -0
  175. package/skills/trends/scripts/lib/chrome_cookies.py +132 -39
  176. package/skills/trends/scripts/lib/cluster.py +31 -54
  177. package/skills/trends/scripts/lib/competitors.py +10 -1
  178. package/skills/trends/scripts/lib/cookie_extract.py +221 -44
  179. package/skills/trends/scripts/lib/cookie_paths.py +27 -0
  180. package/skills/trends/scripts/lib/corpus.py +439 -0
  181. package/skills/trends/scripts/lib/devto.py +313 -0
  182. package/skills/trends/scripts/lib/discovery_handoff.py +988 -0
  183. package/skills/trends/scripts/lib/doctor.py +2166 -0
  184. package/skills/trends/scripts/lib/dripstack.py +203 -0
  185. package/skills/trends/scripts/lib/entity_extract.py +37 -0
  186. package/skills/trends/scripts/lib/env.py +1092 -138
  187. package/skills/trends/scripts/lib/fanout.py +11 -1
  188. package/skills/trends/scripts/lib/feed.py +61 -0
  189. package/skills/trends/scripts/lib/fetch_memo.py +135 -0
  190. package/skills/trends/scripts/lib/freshness.py +566 -0
  191. package/skills/trends/scripts/lib/fusion.py +314 -28
  192. package/skills/trends/scripts/lib/github.py +438 -24
  193. package/skills/trends/scripts/lib/grok_x.py +1237 -0
  194. package/skills/trends/scripts/lib/grounding.py +129 -11
  195. package/skills/trends/scripts/lib/hackernews.py +61 -4
  196. package/skills/trends/scripts/lib/health.py +373 -0
  197. package/skills/trends/scripts/lib/hosted.py +333 -0
  198. package/skills/trends/scripts/lib/html_publish.py +34 -0
  199. package/skills/trends/scripts/lib/html_render.py +169 -3
  200. package/skills/trends/scripts/lib/http.py +1215 -70
  201. package/skills/trends/scripts/lib/instagram.py +132 -9
  202. package/skills/trends/scripts/lib/jobs.py +4 -2
  203. package/skills/trends/scripts/lib/library.py +308 -0
  204. package/skills/trends/scripts/lib/library_index.py +477 -0
  205. package/skills/trends/scripts/lib/linkedin.py +271 -24
  206. package/skills/trends/scripts/lib/log.py +5 -2
  207. package/skills/trends/scripts/lib/meta_ads.py +982 -0
  208. package/skills/trends/scripts/lib/normalize.py +382 -28
  209. package/skills/trends/scripts/lib/parallel_mcp.py +234 -0
  210. package/skills/trends/scripts/lib/permission_preflight.py +42 -3
  211. package/skills/trends/scripts/lib/perplexity.py +1080 -468
  212. package/skills/trends/scripts/lib/pipeline.py +5079 -211
  213. package/skills/trends/scripts/lib/planner.py +396 -53
  214. package/skills/trends/scripts/lib/polymarket.py +285 -23
  215. package/skills/trends/scripts/lib/prescriptions.py +432 -0
  216. package/skills/trends/scripts/lib/private_files.py +21 -0
  217. package/skills/trends/scripts/lib/providers.py +231 -10
  218. package/skills/trends/scripts/lib/quality_nudge.py +122 -37
  219. package/skills/trends/scripts/lib/reddit.py +177 -12
  220. package/skills/trends/scripts/lib/reddit_arctic.py +146 -5
  221. package/skills/trends/scripts/lib/reddit_keyless.py +121 -60
  222. package/skills/trends/scripts/lib/reddit_listing.py +215 -14
  223. package/skills/trends/scripts/lib/reddit_public.py +12 -13
  224. package/skills/trends/scripts/lib/reddit_search.py +304 -0
  225. package/skills/trends/scripts/lib/reddit_shreddit.py +51 -7
  226. package/skills/trends/scripts/lib/registers.py +134 -0
  227. package/skills/trends/scripts/lib/relevance.py +17 -0
  228. package/skills/trends/scripts/lib/render.py +2161 -271
  229. package/skills/trends/scripts/lib/rerank.py +623 -55
  230. package/skills/trends/scripts/lib/resolve.py +50 -1
  231. package/skills/trends/scripts/lib/safari_cookies.py +42 -15
  232. package/skills/trends/scripts/lib/schema.py +782 -1
  233. package/skills/trends/scripts/lib/setup_wizard.py +779 -120
  234. package/skills/trends/scripts/lib/signals.py +206 -7
  235. package/skills/trends/scripts/lib/stocktwits.py +374 -0
  236. package/skills/trends/scripts/lib/subproc.py +307 -53
  237. package/skills/trends/scripts/lib/techmeme.py +89 -64
  238. package/skills/trends/scripts/lib/telegram.py +317 -0
  239. package/skills/trends/scripts/lib/tiktok.py +13 -9
  240. package/skills/trends/scripts/lib/topic_shape.py +340 -0
  241. package/skills/trends/scripts/lib/transcribe.py +12 -3
  242. package/skills/trends/scripts/lib/trustpilot.py +256 -5
  243. package/skills/trends/scripts/lib/truthsocial.py +9 -1
  244. package/skills/trends/scripts/lib/ui.py +6 -0
  245. package/skills/trends/scripts/lib/usage.py +132 -0
  246. package/skills/trends/scripts/lib/web_search_keyless.py +63 -4
  247. package/skills/trends/scripts/lib/windows_job.py +138 -0
  248. package/skills/trends/scripts/lib/x_api.py +824 -0
  249. package/skills/trends/scripts/lib/x_envelope.py +733 -0
  250. package/skills/trends/scripts/lib/x_judge.py +292 -0
  251. package/skills/trends/scripts/lib/xai_x.py +26 -3
  252. package/skills/trends/scripts/lib/xquik.py +89 -15
  253. package/skills/trends/scripts/lib/xurl_x.py +284 -91
  254. package/skills/trends/scripts/lib/youtube_yt.py +570 -119
  255. package/skills/trends/scripts/setup-keychain.sh +12 -4
  256. package/skills/trends/scripts/setup-pass.sh +3 -0
  257. package/skills/trends/scripts/store.py +444 -50
  258. package/skills/trends/scripts/watchlist.py +38 -11
  259. package/skills/trends/scripts/x_lane_parity.py +107 -0
  260. package/skills/video-studio/CHANGELOG.md +4 -0
  261. package/skills/video-studio/SKILL.md +4 -4
  262. package/skills/video-studio/references/styles/product-flight.md +45 -0
  263. package/skills/video-studio/references/styles.md +3 -1
  264. package/skills/video-studio-motion/ATTRIBUTION.md +1 -1
  265. package/skills/video-studio-motion/CHANGELOG.md +4 -0
  266. package/skills/video-studio-motion/SKILL.md +8 -5
  267. package/skills/youtube-planner/ATTRIBUTION.md +25 -0
  268. package/skills/youtube-planner/CHANGELOG.md +12 -0
  269. package/skills/youtube-planner/SKILL.md +191 -0
  270. package/skills/youtube-planner/references/plan-template.md +57 -0
  271. package/skills/youtube-planner/references/stages.md +119 -0
  272. package/skills/youtube-planner/scripts/floor_ceiling.py +132 -0
  273. package/skills/coder-brainstorming/spec-document-reviewer-prompt.md +0 -49
  274. package/skills/trends/scripts/lib/reddit_rss.py +0 -224
@@ -3,7 +3,7 @@ name: pricing
3
3
  description: "When the user wants help with pricing decisions, packaging, or monetization strategy. Also use when the user mentions 'pricing,' 'pricing tiers,' 'freemium,' 'free trial,' 'packaging,' 'price increase,' 'value metric,' 'Van Westendorp,' 'willingness to pay,' 'monetization,' 'how much should I charge,' 'my pricing is wrong,' 'pricing page,' 'annual vs monthly,' 'per seat pricing,' or 'should I offer a free plan.' Use this whenever someone is figuring out what to charge or how to structure their plans. For in-app upgrade screens, see luckiest-paywalls. For offer construction (bonuses, guarantees, value framing, naming) on services/courses/coaching/high-ticket B2B, see luckiest-offers."
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.1.0"
6
+ version: "1.1.1"
7
7
  listing_id: luckiest-pricing
8
8
  author: luckiest
9
9
  ---
@@ -14,9 +14,9 @@ This skill helps design SaaS pricing and monetization that captures value, drive
14
14
 
15
15
  ## Staying current
16
16
 
17
- On activation, call the Luckiest MCP check_updates tool with { listingId: "78c5f684-9c91-409d-ac7b-9e00118097ef", installedSemver: "1.1.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
17
+ On activation, call the Luckiest MCP check_updates tool with { listingId: "78c5f684-9c91-409d-ac7b-9e00118097ef", installedSemver: "1.1.1" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-pricing", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-pricing", skill_version: "1.1.1", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Before Starting
22
22
 
@@ -136,7 +136,7 @@ Four questions that identify acceptable price range:
136
136
  3. Expensive but might consider
137
137
  4. A bargain
138
138
 
139
- Analyze intersections to find optimal pricing zone.
139
+ Use intersections to identify perceived price acceptability and candidate prices to test. The named "Optimal Price Point" is a survey intersection, not proof of revenue or profit maximization. The four questions alone do not estimate conversion, churn or demand at a new price.
140
140
 
141
141
  ### MaxDiff Analysis
142
142
 
@@ -85,6 +85,18 @@
85
85
  "Does not attempt full page CRO audit"
86
86
  ],
87
87
  "files": []
88
+ },
89
+ {
90
+ "id": 9,
91
+ "prompt": "Our four-question Van Westendorp survey found PMC $29, OPP $49, IDP $59 and PME $79 per month. We charge $39. Can I tell the board that raising to $49-$59 will not significantly reduce demand, and that $49 maximizes revenue? No purchase-intent, actual sales or retention data were collected.",
92
+ "expected_output": "Should reject both claims as unsupported by four price-perception questions. Describe OPP as a named intersection, not revenue optimum. Use $49 and $59 as candidate test prices (+25.6% and +51.3% vs $39), keep demand/churn/revenue forecasts unknown, and propose purchase-intent/choice research or a controlled actual price test with conversion, margin and retention guardrails. Do not infer probabilities from price acceptability.",
93
+ "assertions": [
94
+ "Separates price perception from purchase behavior",
95
+ "Does not promise unchanged demand or claim a revenue-maximizing OPP",
96
+ "Computes price increases using the current $39 denominator",
97
+ "Recommends collecting purchase behavior and unit economics before rollout"
98
+ ],
99
+ "files": []
88
100
  }
89
101
  ]
90
102
  }
@@ -28,7 +28,9 @@ Ask each respondent:
28
28
  - **Indifference Price Point (IDP):** "Expensive" crosses "Cheap"
29
29
 
30
30
  **The acceptable price range:** PMC to PME
31
- **Optimal pricing zone:** Between OPP and IDP
31
+ **Candidate prices to test:** OPP and IDP can inform a shortlist; they do not establish an economically optimal zone.
32
+
33
+ The four questions measure price perceptions, not purchase probabilities. Before forecasting demand, use additional purchase-intent research (such as the Newton-Miller-Smith extension, with its assumptions stated), a choice study or actual price tests. Compare revenue, margin and retention; a higher acceptable price does not guarantee unchanged demand. See [Sawtooth's explanation of the method and its limits](https://sawtoothsoftware.com/resources/blog/posts/van-westendorp-pricing-sensitivity-meter).
32
34
 
33
35
  ### Survey Tips
34
36
  - Need 100-300 respondents for reliable data
@@ -46,9 +48,11 @@ Optimal Price Point: $49/mo
46
48
  Indifference Price Point: $59/mo
47
49
  Point of Marginal Expensiveness: $79/mo
48
50
 
49
- Recommended range: $49-59/mo
50
- Current price: $39/mo (below optimal)
51
- Opportunity: 25-50% price increase without significant demand impact
51
+ Candidate test prices: $49 and $59/mo
52
+ Current price: $39/mo
53
+ Price changes: +25.6% and +51.3%
54
+ Demand, conversion and churn impact: not measured by these four questions
55
+ Next step: validate purchase behavior and unit economics before rollout
52
56
  ```
53
57
 
54
58
  ---
@@ -1,5 +1,10 @@
1
1
  # Changelog — luckiest-programmatic-seo
2
2
 
3
+ ## 1.2.0 — 2026-10-16
4
+ From coreyhaines31/marketingskills at 1efedbc (issue #174, MIT).
5
+
6
+ - New implementation-platforms reference (which CMS or builder fits programmatic pages). Partner plug removed.
7
+
3
8
  ## 1.1.0 — 2026-07-06
4
9
  Skill updater pass: analytics integration.
5
10
 
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: programmatic-seo
3
- description: When the user wants to create SEO-driven pages at scale using templates and data. Also use when the user mentions "programmatic SEO," "template pages," "pages at scale," "directory pages," "location pages," "[keyword] + [city] pages," "comparison pages," "integration pages," "building many pages for SEO," "pSEO," "generate 100 pages," "data-driven pages," or "templated landing pages." Use this whenever someone wants to create many similar pages targeting different keywords or locations. For auditing existing SEO issues, see luckiest-seo-audit. For content strategy planning, see luckiest-content-strategy.
3
+ description: When the user wants to create SEO-driven pages at scale using templates and data. Also use when the user mentions "programmatic SEO," "template pages," "pages at scale," "directory pages," "location pages," "[keyword] + [city] pages," "comparison pages," "integration pages," "building many pages for SEO," "pSEO," "generate 100 pages," "data-driven pages," "templated landing pages," or "which CMS for pSEO." Use this whenever someone wants to create many similar pages targeting different keywords or locations. For auditing existing SEO issues, see luckiest-seo-audit. For content strategy planning, see luckiest-content-strategy.
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.1.0"
6
+ version: "1.2.0"
7
7
  listing_id: luckiest-programmatic-seo
8
8
  author: luckiest
9
9
  ---
@@ -14,9 +14,9 @@ This skill guides building SEO-optimized pages at scale using templates and data
14
14
 
15
15
  ## Staying current
16
16
 
17
- On activation, call the Luckiest MCP check_updates tool with { listingId: "c2fe7b3b-a99e-467e-bf0e-145acbb76578", installedSemver: "1.1.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
17
+ On activation, call the Luckiest MCP check_updates tool with { listingId: "c2fe7b3b-a99e-467e-bf0e-145acbb76578", installedSemver: "1.2.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-programmatic-seo", skill_version: "1.1.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-programmatic-seo", skill_version: "1.2.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Initial Assessment
22
22
 
@@ -168,6 +168,10 @@ You can layer multiple playbooks (e.g., "Best coworking spaces in San Diego").
168
168
  - Manage crawl budget thoughtfully
169
169
  - Separate sitemaps by page type
170
170
 
171
+ ### 6. Choose the Build Platform
172
+
173
+ Check that the platform can hold the page count, refresh the data, render server-side HTML, branch on data for conditional sections, and control indexation per page. Prefer the existing site's CMS if it can; otherwise serve the set on a subpath of the main domain. Options and tradeoffs: [references/implementation-platforms.md](references/implementation-platforms.md).
174
+
171
175
  ---
172
176
 
173
177
  ## Answer-Engine Extractability
@@ -90,6 +90,19 @@
90
90
  "Does not attempt full technical SEO audit"
91
91
  ],
92
92
  "files": []
93
+ },
94
+ {
95
+ "id": 7,
96
+ "prompt": "We want to launch 5,000 'integration + use case' pages. We're on Framer now. Where should we build them?",
97
+ "expected_output": "Should check the platform requirements from the implementation-platforms reference: item limits at 5,000+ pages, data refresh, server-rendered HTML, conditional sections, per-page noindex and split sitemaps, and publish times. Should first check whether the current platform (Framer, whose higher plans reach tens of thousands of CMS items) can hold the set, and if not, weigh a reverse-proxied subpath against a subdomain (Google has no ranking preference; it's an effort and structure tradeoff) on a platform that can (e.g., WordPress, a hand-coded static/hybrid build, Webflow within its limits, a headless CMS, or an AI-native platform). Any Verified Partner tool named carries the disclosure plus an alternative. Should recommend proving it on a small batch of the strongest pages before scaling.",
98
+ "assertions": [
99
+ "Checks item limits and the other platform requirements",
100
+ "Considers the current platform first",
101
+ "Treats subpath vs subdomain as a tradeoff, not an SEO rule",
102
+ "Gives several options with tradeoffs and discloses any partner tool",
103
+ "Recommends a small first batch before scaling"
104
+ ],
105
+ "files": []
93
106
  }
94
107
  ]
95
108
  }
@@ -0,0 +1,37 @@
1
+ # Implementation Platforms for Pages at Scale
2
+
3
+ Where programmatic pages get built and how the data reaches them. Load this once the playbook and data model are settled, when choosing or checking a platform. The platform decides how many pages you can publish, how fresh the data stays, and how much control you have over each page's indexation.
4
+
5
+ ## What the platform has to do
6
+
7
+ Check these before picking anything. Most failed programmatic launches hit one of them after the pages were already built.
8
+
9
+ | Requirement | Why it matters | What to check |
10
+ |---|---|---|
11
+ | **Enough items** | Every page is usually one CMS item or database row | The plan's item or row limit at the volume you'll reach in a year, not today's |
12
+ | **Data refresh** | Stale data makes pages wrong and thin | How rows get updated (CSV re-import, API, sync tool, webhook) and whether pages update without a full rebuild |
13
+ | **Server-rendered HTML** | Crawlers and AI engines need the content in the initial HTML | Pages render on the server or at build time, not only in client-side JavaScript |
14
+ | **Conditional sections** | Unique value per page depends on showing or hiding sections by data | The template can branch on field values, not just print them |
15
+ | **Per-page indexation control** | You'll noindex thin variations and split sitemaps | Per-item `noindex`, canonical overrides, and sitemaps that split by page type (50,000 URLs or 50 MB uncompressed per sitemap file) |
16
+ | **Internal linking** | Hubs, spokes, and related-page links drive discovery | Templates can query related items (same category, nearby location) |
17
+ | **Build and publish time** | Thousands of pages can make every publish slow | Whether publishing regenerates everything or only changed pages |
18
+
19
+ ## The options
20
+
21
+ As of 2026-10; item limits and pricing change, so confirm on the vendor's current plan page.
22
+
23
+ | Option | How pages get built | Good fit | Watch out for |
24
+ |---|---|---|---|
25
+ | **Webflow CMS** | One collection template; each item becomes a page. Data via CSV import, the CMS API, or a sync tool (Whalesync, for example, from Airtable or Sheets) | Designer-owned sites up to the plan's item limit; a few hundred to a few thousand pages | Item limits by plan; complex conditional logic is limited; bulk updates need the API or a sync tool |
26
+ | **WordPress** | Custom post types plus custom fields (ACF or similar), bulk-loaded with an import plugin or the REST API | Large page counts on hosting you control; teams already on WordPress | Plugin and hosting performance at scale; database size; theme quality |
27
+ | **Framer CMS** | CMS collection template; data via CSV, the CMS API, or a sync plugin | Programmatic sets on design-led sites, up to the plan's item limit (higher tiers reach tens of thousands) | Compare item limits and sync options on actual plans; conditional logic is limited |
28
+ | **Hand-coded static or hybrid generation** (Next.js, Astro, and similar) | Templates read from JSON, a database, or an API at build time, or on demand with incremental regeneration | Tens of thousands of pages, complex logic, full control | Engineers own everything; very large sites need incremental builds to keep publishes fast |
29
+ | **Headless CMS + framework** (Sanity, Contentful, Storyblok) | Structured content in the CMS, templates in code | Editorial teams that also need programmatic sets | Two systems; schema changes need engineering |
30
+ | **AI-native site platforms** (database-backed AI site builders) | A database table backs a dynamic template; rows become pages | Teams already building on the platform who want data-driven pages without managing a separate CMS | Young products; hosting tied to the vendor; check export limits |
31
+
32
+ ## Choosing
33
+
34
+ 1. **Start with the site you already have.** If its CMS can hold the page count and supports the template logic, build there. The pages inherit the domain's authority and internal links.
35
+ 2. **If it can't, decide subpath or subdomain on effort.** Google doesn't rank one above the other. A reverse-proxied subpath keeps the set inside the main site's structure and links but adds proxy setup; a subdomain is simpler but needs its own internal links and sitemap. The `luckiest-site-architecture` skill's platforms reference has the proxy checklist.
36
+ 3. **Size for the next year.** Pick the option whose item limits and publish times work at the page count you'll reach, with headroom for the variations you'll add.
37
+ 4. **Prove it on a small batch.** Launch the 20–50 strongest pages first, check they index and rank, then scale (see Quality Checks in SKILL.md).
@@ -1,5 +1,12 @@
1
1
  # Changelog — luckiest-prospecting
2
2
 
3
+ ## 1.3.0 — 2026-10-16
4
+ From coreyhaines31/marketingskills at 1efedbc (issue #174, MIT).
5
+
6
+ - New references: account research, enrichment playbook, signal plays, sourcing and enrichment.
7
+ - Tool table: Clearbit replaced by FullEnrich, LeadMagic, TheirStack and Apify; MCP support marked. Compliance checklist adds country gating, DNC scrubbing and data-origin notice.
8
+ - Description: verify emails before any sequence, never scrape LinkedIn. Partner plug removed.
9
+
3
10
  ## 1.2.0 — 2026-10-08
4
11
  Upstream sync with coreyhaines31/marketingskills dda3841 (issue #112).
5
12
 
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: prospecting
3
- description: Finds, qualifies, and builds a scored list of prospects to reach out to — across B2B SaaS, general B2B, or local small businesses. Use when the user mentions "prospecting," "build a prospect list," "find prospects," "find leads," "lead gen list," "find SaaS companies that," "find B2B companies," "find local businesses," "ICP-fit accounts," "who should we go after," "outbound list," "target account list," "TAM list," "account mapping," "expansion accounts," "find clients near me," "businesses without websites," "who's hiring for," "prospect research," or "qualified leads." This covers the list-building and qualification phase. For writing outbound copy after the list is built, see luckiest-cold-email. For deep competitive research on specific accounts, see luckiest-competitor-profiling.
3
+ description: Finds, qualifies, and builds a scored list of prospects to reach out to — across B2B SaaS, general B2B, or local small businesses. Use when the user mentions "prospecting," "build a prospect list," "find prospects," "find leads," "lead gen list," "find SaaS companies that," "find B2B companies," "find local businesses," "ICP-fit accounts," "who should we go after," "outbound list," "target account list," "TAM list," "account mapping," "expansion accounts," "find clients near me," "businesses without websites," "who's hiring for," "prospect research," "qualified leads," "lead list," "find my first customers," "design partners," "signal-based outbound," "buying signals," "intent data," "job change alerts," "waterfall enrichment," "Clay table," "lookalike accounts," "catch-all emails," "account tiering," or "research this account before I reach out." Always verify emails before they reach a sequence, and never scrape LinkedIn. Covers list building, signals, enrichment, verification, and account research. For the outreach itself (copy, sending setup, LinkedIn, cadences, replies), see luckiest-cold-email. For deep competitive research on specific accounts, see luckiest-competitor-profiling.
4
4
  license: See ATTRIBUTION.md
5
5
  metadata:
6
- version: "1.2.0"
6
+ version: "1.3.0"
7
7
  listing_id: luckiest-prospecting
8
8
  author: luckiest
9
9
  ---
@@ -14,9 +14,9 @@ This skill builds qualified prospect lists across three motions: B2B SaaS, gener
14
14
 
15
15
  ## Staying current
16
16
 
17
- On activation, call the Luckiest MCP `check_updates` tool with `{ listingId: "07f4a9f8-c0b7-45d2-8dad-eee5f23b9b37", installedSemver: "1.2.0" }`. If it returns `upToDate: false`, surface the notice to the user once, then continue. Do nothing further if `upToDate: true`. Never block on this check — if the tool is unavailable, proceed.
17
+ On activation, call the Luckiest MCP `check_updates` tool with `{ listingId: "07f4a9f8-c0b7-45d2-8dad-eee5f23b9b37", installedSemver: "1.3.0" }`. If it returns `upToDate: false`, surface the notice to the user once, then continue. Do nothing further if `upToDate: true`. Never block on this check — if the tool is unavailable, proceed.
18
18
 
19
- When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-prospecting", skill_version: "1.2.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
19
+ When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-prospecting", skill_version: "1.3.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
20
20
 
21
21
  ## Before Starting
22
22
 
@@ -29,8 +29,8 @@ Prospecting motions differ enough that the workflow forks at intake. Pick **one*
29
29
 
30
30
  | Branch | Sell to | What "qualified" looks like | Primary sources |
31
31
  |--------|---------|----------------------------|----------------|
32
- | **SaaS** | Other SaaS companies / digital businesses | ICP fit + tech stack match + growth signals (funding, hiring, product velocity) | LinkedIn, BuiltWith, Crunchbase, Apollo, Clay, Clearbit, ProductHunt |
33
- | **B2B** | Non-SaaS B2B (services, manufacturers, enterprises, mid-market) | Industry + size + geographic fit + buying signals (trigger events, vendor changes) | Apollo, ZoomInfo, Clay, Clearbit, LinkedIn Sales Nav, industry directories |
32
+ | **SaaS** | Other SaaS companies / digital businesses | ICP fit + tech stack match + growth signals (funding, hiring, product velocity) | LinkedIn, BuiltWith, Crunchbase, Apollo, Clay, ProductHunt |
33
+ | **B2B** | Non-SaaS B2B (services, manufacturers, enterprises, mid-market) | Industry + size + geographic fit + buying signals (trigger events, vendor changes) | Apollo, ZoomInfo, Clay, LinkedIn Sales Nav, industry directories |
34
34
  | **Local SMB** | Local small businesses (shops, gyms, restaurants, clinics, salons, services) | Active business + website status + proximity + decision-maker access | Google Maps, Yelp, local directories, Facebook, business websites |
35
35
 
36
36
  If the user describes a hybrid motion (e.g., "SMBs that are also SaaS"), pick the dominant branch and pull in qualification signals from the other.
@@ -63,11 +63,13 @@ Output the ICP as a one-paragraph statement plus a checklist of pass/fail criter
63
63
 
64
64
  Source 2–3× more candidates than the user wants in the final list — qualification will cull aggressively.
65
65
 
66
- - **SaaS / B2B**: combine 2–3 sources for cross-verification. Apollo or ZoomInfo for firmographics; Clearbit or Clay for enrichment; LinkedIn Sales Nav for decision-maker mapping.
66
+ - **SaaS / B2B**: combine 2–3 sources for cross-verification. Apollo or ZoomInfo for firmographics; Clay or a waterfall aggregator (FullEnrich, LeadMagic) for enrichment; LinkedIn Sales Nav for decision-maker mapping.
67
67
  - **Local SMB**: browser-assisted research starting with Google Maps for the target category in the target area; cross-check with Yelp, the business website, social pages, and public directories.
68
68
 
69
69
  If the user's list quality bar is high, smaller is better. 25 verified leads beats 250 mostly-junk ones.
70
70
 
71
+ For LinkedIn audiences, define the filters in Sales Navigator and pull the contacts from a licensed database. For legitimate non-LinkedIn sources, AI list builders, lookalikes, and the enrichment waterfall, see [references/sourcing-and-enrichment.md](references/sourcing-and-enrichment.md). To find accounts by what just happened to them (hiring, job changes, product usage, funding), see [references/signal-plays.md](references/signal-plays.md).
72
+
71
73
  ### Phase 3 — Qualify each candidate
72
74
 
73
75
  Score every candidate against the ICP checklist. Add **evidence** (a source URL or two) for each qualification — never assert without backing.
@@ -77,7 +79,7 @@ Score every candidate against the ICP checklist. Add **evidence** (a source URL
77
79
  - **Medium**: one credible source plus consistent search evidence
78
80
  - **Low**: incomplete or ambiguous evidence — flag what remains uncertain
79
81
 
80
- For email contacts (B2B / SaaS branches), **always verify deliverability before adding to the final list** — see Truelist integration in [references/data-sources.md](references/data-sources.md). Don't ship leads with invalid or risky emails.
82
+ For email contacts (B2B / SaaS branches), **always verify deliverability before adding to the final list**, and again within 7 days of sending if the list sat. Catch-all domains need a set policy. See [references/sourcing-and-enrichment.md](references/sourcing-and-enrichment.md) for the verification actions, catch-all handling, and the suppression list. Don't ship leads with invalid or risky emails.
81
83
 
82
84
  ### Phase 4 — Score and prioritize
83
85
 
@@ -92,6 +94,8 @@ Apply this rubric across all branches:
92
94
 
93
95
  Branch-specific signals refine the scoring — see each reference file. Default ratio target: ~20% Hot, ~30% Warm, rest Cold/Skip.
94
96
 
97
+ Then assign an **account tier**, which sets how much research and how many channels each account gets: Tier 1 (1:1, the top 25–50), Tier 2 (1:few, segments of 20–200 sharing one pain), Tier 3 (1:many). Tier 1 accounts get a sourced research brief before any outreach. See [references/signal-plays.md](references/signal-plays.md) for tiers and [references/account-research.md](references/account-research.md) for the brief and the rules for agent research.
98
+
95
99
  ### Phase 5 — Output the lead sheet
96
100
 
97
101
  Default to a markdown table in chat. Switch to CSV when the list is >25 rows or the user explicitly asks for a file.
@@ -134,6 +138,12 @@ If missing, ask once, then infer reasonable defaults and continue:
134
138
 
135
139
  ---
136
140
 
141
+ ## Enrichment Workflows
142
+
143
+ For multi-provider lookups, cache reuse, and per-credit budgets, load [the enrichment playbook](references/enrichment-playbook.md). Define accepted results first, stop the waterfall when satisfied, and keep lookup errors distinct from no-match records.
144
+
145
+ ---
146
+
137
147
  ## Tool Selection Quick Picks
138
148
 
139
149
  Full breakdown in [references/data-sources.md](references/data-sources.md). Quick picks:
@@ -142,7 +152,8 @@ Full breakdown in [references/data-sources.md](references/data-sources.md). Quic
142
152
  |------------------------------|------------|
143
153
  | **Apollo** | B2B / SaaS firmographic + contact discovery |
144
154
  | **Clay** | Multi-source enrichment, waterfall lookups, custom scoring |
145
- | **Clearbit** | Email-to-company and company enrichment |
155
+ | **FullEnrich or LeadMagic** | Waterfall email and phone enrichment through one API |
156
+ | **TheirStack** | Hiring signals and tech stacks from job posts |
146
157
  | **ZoomInfo** | Enterprise B2B contact + intent data |
147
158
  | **Hunter or Snov** | Email pattern guessing and verification |
148
159
  | **Truelist** | Email deliverability validation (before adding to outreach list) |
@@ -243,13 +254,16 @@ If a tools registry ships alongside this skill (`../../tools/REGISTRY.md` in the
243
254
 
244
255
  | Tool | Best For | MCP | Guide |
245
256
  |------|----------|:---:|-------|
246
- | **Apollo** | B2B / SaaS firmographic + contact discovery | - | [apollo.md](../../tools/integrations/apollo.md) |
257
+ | **Apollo** | B2B / SaaS firmographic + contact discovery | ✓ | [apollo.md](../../tools/integrations/apollo.md) |
247
258
  | **Clay** | Multi-source enrichment + waterfall | ✓ | [clay.md](../../tools/integrations/clay.md) |
248
- | **Clearbit** | Email-to-company enrichment | - | [clearbit.md](../../tools/integrations/clearbit.md) |
259
+ | **FullEnrich** | Waterfall email + phone enrichment | ✓ | - |
260
+ | **LeadMagic** | Email, phone, and job-change enrichment | ✓ | - |
261
+ | **TheirStack** | Hiring signals and tech stacks from job posts | ✓ | - |
262
+ | **Apify** | Structured data from public directories (never LinkedIn) | ✓ | - |
249
263
  | **ZoomInfo** | Enterprise B2B contact + intent | ✓ | [zoominfo.md](../../tools/integrations/zoominfo.md) |
250
- | **Hunter** | Email pattern + verification | - | [hunter.md](../../tools/integrations/hunter.md) |
264
+ | **Hunter** | Email pattern + verification | ✓ | [hunter.md](../../tools/integrations/hunter.md) |
251
265
  | **Snov** | Email finder + verifier | - | [snov.md](../../tools/integrations/snov.md) |
252
- | **Truelist** | Email deliverability validation | - | [truelist.md](../../tools/integrations/truelist.md) |
266
+ | **Truelist** | Email verification, including catch-all resolution | ✓ | [truelist.md](../../tools/integrations/truelist.md) |
253
267
  | **Outreach** | Sales engagement (post-list) | ✓ | [outreach.md](../../tools/integrations/outreach.md) |
254
268
  | **RB2B** | Visitor identification (warm intent) | - | [rb2b.md](../../tools/integrations/rb2b.md) |
255
269
  | **GitHub** | Stargazers/forks/watchers as developer-intent signal | - | [github.md](../../tools/integrations/github.md) |
@@ -102,6 +102,47 @@
102
102
  "References truelist.md or data-sources.md"
103
103
  ],
104
104
  "files": []
105
+ },
106
+ {
107
+ "id": 8,
108
+ "prompt": "I sell CRO services to B2B SaaS companies. How do I find companies that are likely to need us right now instead of just pulling a big list from Apollo?",
109
+ "expected_output": "Should load the signal plays reference. Should rank signals by closeness and pick ones that fit a CRO agency: recent funding (30-60 day window), a new VP Marketing or growth leader (first 90 days), open growth or performance marketing roles, a redesigned site or new pricing page, launched paid campaigns. Should stack signals with ICP fit rather than act on one weak signal, record signal dates, map signals to plays (value-first teardown), and assign account tiers (Tier 1 1:1 top 25-50 with account briefs, Tier 2 segments, Tier 3). Should name ways to detect each signal (job data, funding news, visitor ID) and warn against opening with the signal itself or mentioning tracked visits.",
110
+ "assertions": [
111
+ "Uses buying signals as a timing filter on top of ICP fit",
112
+ "Names signals relevant to a CRO agency",
113
+ "Gives freshness windows for signals",
114
+ "Maps signals to a play, including a value-first teardown",
115
+ "Assigns account tiers that set research depth",
116
+ "Says not to open with 'congrats on the raise' or mention tracked visits"
117
+ ],
118
+ "files": []
119
+ },
120
+ {
121
+ "id": 9,
122
+ "prompt": "About a fifth of the emails in my list come back as catch-all from our verifier. Should I send to them or drop them?",
123
+ "expected_output": "Should load the sourcing and enrichment reference and explain that catch-all domains accept any address, so basic SMTP verification can't confirm the person. Should recommend a policy: resolve catch-alls with a verifier that goes beyond SMTP checks; send resolved-valid ones from separate lower-volume mailboxes; send unresolved ones only to Tier 1 accounts while watching bounces; keep campaign bounces under 2% with automatic pause; re-verify within 7 days of sending. Should not recommend sending all of them blind or dropping all of them without considering account value.",
124
+ "assertions": [
125
+ "Explains why catch-all addresses can't be confirmed by basic verification",
126
+ "Recommends resolving catch-alls with a specialist verifier",
127
+ "Recommends separate lower-volume mailboxes for resolved catch-alls",
128
+ "Limits unresolved catch-alls to Tier 1",
129
+ "Keeps bounce rate under 2% with a pause rule",
130
+ "Neither sends all blindly nor drops all by default"
131
+ ],
132
+ "files": []
133
+ },
134
+ {
135
+ "id": 10,
136
+ "prompt": "We have 200 B2B prospects and several connected enrichment providers. Some records are fresh in our cache, some caches are expired, one API says429 and another finds a same-name company in the wrong country. Design a cost-bounded waterfall without overwriting verified CRM contacts.",
137
+ "expected_output": "Defines identity and accepted-field criteria, exact account/provider/input cache matching, differentiated expiry/no-match/error handling, and conditional ordered lookups. Preserves stronger CRM evidence, contact verification, and unresolved reasons.",
138
+ "assertions": [
139
+ "Reuses only applicable fresh cache entries",
140
+ "Does not treat429 or timeout as no-match",
141
+ "Rejects a wrong-entity result instead of counting any nonempty response as success",
142
+ "Stops when an accepted field is found instead of running every provider",
143
+ "Preserves stronger verified CRM fields and separate contact verification"
144
+ ],
145
+ "files": []
105
146
  }
106
147
  ]
107
148
  }
@@ -0,0 +1,59 @@
1
+ # Account Research for Outreach
2
+
3
+ Research before outreach has one job: find a true, specific reason this account should care right now, and the person who owns that problem. Dossiers on companies you compete with belong to the competitor-profiling skill.
4
+
5
+ ## How much research each tier gets
6
+
7
+ | Tier | Time per account | Output |
8
+ |------|------------------|--------|
9
+ | Tier 1 | 10–20 minutes, or an agent run reviewed by a human | Full brief (below) |
10
+ | Tier 2 | 2–3 minutes per account, plus shared segment research | One sourced hook per contact + the segment brief |
11
+ | Tier 3 | None per account | The segment brief only |
12
+
13
+ Tiers are defined in [signal-plays.md](signal-plays.md).
14
+
15
+ ## Where the useful facts are
16
+
17
+ In rough order of usefulness:
18
+ 1. **Their job posts.** They describe the problem in their own words, list the tools they use, and reveal priorities ("own our experimentation roadmap").
19
+ 2. **Their own pages.** Pricing, landing pages, changelog, careers, case studies. For a services pitch, the page you'd improve is the research.
20
+ 3. **What leaders say publicly.** LinkedIn posts, podcast appearances, conference talks, interviews.
21
+ 4. **Company news.** Funding, launches, acquisitions, leadership changes, new markets.
22
+ 5. **Filings and reports.** For public companies, the 10-K risk factors and earnings calls name priorities explicitly.
23
+ 6. **Reviews of their product.** What their customers complain about can show what they're under pressure to fix.
24
+
25
+ ## The brief (Tier 1)
26
+
27
+ ```markdown
28
+ ## [Company] — account brief
29
+ **Fit:** [ICP criteria met, with any gaps]
30
+ **Signal:** [what happened, date, source URL]
31
+ **Likely priority:** [the problem the signal implies, in their words where possible]
32
+ **Evidence:** [2–4 facts, each with a source URL]
33
+ **Who owns it:** [name, title, why them; a second contact if multi-threading]
34
+ **Angle:** [one sentence connecting their situation to what you offer]
35
+ **Proof to use:** [the closest case study or result]
36
+ **Don't mention:** [anything sensitive, stale, or creepy, e.g. tracked website visits]
37
+ **Hook found:** yes / no
38
+ ```
39
+
40
+ ## Rules for agent research
41
+
42
+ AI makes research cheap, and it also makes invented hooks cheap. These rules keep the research honest:
43
+
44
+ 1. **Facts first, angle second.** Run research as two steps. Step one collects facts, each with a source URL and date. Step two writes the angle using only those facts. Never let one step do both.
45
+ 2. **"No hook found" is a valid result.** If the sources don't support a specific angle, say so and drop the account to the segment-level message. A generic hook dressed up as personal research is worse than an honest segment message.
46
+ 3. **Bound the angles.** Give the agent your 3–5 value propositions and require the angle to map to one of them. Unbounded creativity produces promises you can't keep.
47
+ 4. **Date everything.** A fact without a date can't be judged for staleness. Discard anything older than its freshness window.
48
+ 5. **Quote, don't paraphrase, when it matters.** If the hook rests on something a leader said, keep the exact quote and link.
49
+ 6. **Never use sensitive traits** (health, finances, politics, religion, family) even when public. See [compliance.md](compliance.md).
50
+
51
+ ## Segment briefs (Tier 2 and 3)
52
+
53
+ For a segment, research the shared situation instead of each account:
54
+ - What the accounts have in common (the segment definition)
55
+ - The pain that commonality creates, with 2–3 public examples
56
+ - The proof that speaks to it
57
+ - The one-line opener each contact will get, plus the slot for a per-contact detail (Tier 2)
58
+
59
+ A tight segment does the personalization work. "Series A SaaS companies that just posted their first growth marketer role" needs little per-account research, because the segment already explains why you're writing.
@@ -38,7 +38,7 @@ For when the user sells to non-SaaS B2B — services, agencies, manufacturers, m
38
38
  - **Apollo**: best general B2B firmographic + contact discovery
39
39
  - **ZoomInfo**: enterprise B2B + intent signals (mid-market+)
40
40
  - **LinkedIn Sales Navigator**: industry + role + signal search; the gold standard for decision-maker mapping (manual)
41
- - **Clay**: when you need custom waterfall lookups (e.g., enrich Apollo records with Hunter + Clearbit)
41
+ - **Clay**: when you need custom waterfall lookups (e.g., enrich Apollo records with Hunter, then a waterfall aggregator)
42
42
 
43
43
  ### Tier 2 — industry-specific directories
44
44
 
@@ -13,6 +13,7 @@ CAN-SPAM regulates the cold email **send**, not the list build. But the list bui
13
13
  - You must be able to identify the source of every email address you contact (required if challenged)
14
14
  - The "from" line and email content rules apply at send time — but you can't lie about how you got the contact
15
15
  - Opt-out requests must be honored within 10 business days and tracked
16
+ - Every commercial email needs a working opt-out and the sender's valid physical postal address, so plan both before the first send
16
17
 
17
18
  **For prospecting specifically**: capture and retain the source URL + date for every contact you add to a list. CAN-SPAM doesn't require it explicitly, but defending your sender practices does.
18
19
 
@@ -46,6 +47,13 @@ You have three credible options:
46
47
  - Include a privacy notice / opt-out in the first outreach
47
48
  - Don't store personal data longer than necessary for the legitimate interest
48
49
 
50
+ ### EU specifics
51
+
52
+ - **Commercial interest counts.** The CJEU's KNLTB ruling (October 2024) confirmed that a purely commercial interest can be a legitimate interest. You still need the balancing test in writing (a legitimate interests assessment).
53
+ - **Tell people where you got their data.** When the data didn't come from the person directly (Article 14), say so within a month, and at the latest in the first message. One line works: "I found your email on [source]; reply 'remove' and I'll delete it."
54
+ - **Germany is different.** Germany's unfair competition law (UWG §7) requires prior consent for advertising email, B2B included, and competitors enforce it through lawsuits. Exclude German contacts from cold email; use LinkedIn or phone (B2B calls need presumed consent, meaning a concrete reason to believe they'd welcome the call).
55
+ - **National rules sit on top of GDPR.** Several countries apply stricter ePrivacy rules to email. When a campaign targets one EU country heavily, check that country's rules.
56
+
49
57
  ### What disqualifies a list
50
58
 
51
59
  - Bulk-scraped LinkedIn data — explicit ToS violation + GDPR risk
@@ -54,6 +62,22 @@ You have three credible options:
54
62
 
55
63
  ---
56
64
 
65
+ ## UK — PECR
66
+
67
+ PECR sets the email rules on top of UK GDPR:
68
+
69
+ - **Corporate subscribers** (limited companies, LLPs, public bodies) can be cold-emailed at their work address without consent, as long as you identify yourself and offer an opt-out.
70
+ - **Sole traders and partnerships** are treated like individuals and need consent. Many small agencies and consultancies fall in this group, so check the entity type before sending.
71
+ - **Fines rose sharply.** The Data (Use and Access) Act 2025 raised the PECR maximum from £500,000 to £17.5 million or 4% of global turnover, and wrote direct marketing into UK GDPR as a recognised legitimate interest.
72
+
73
+ ---
74
+
75
+ ## Australia — Spam Act
76
+
77
+ Australia is consent-based. Inferred consent can come from a conspicuously published business address with no "no unsolicited messages" notice, where the message relates to the person's role. Address-harvesting software is prohibited outright. Every message needs sender identification and a working unsubscribe.
78
+
79
+ ---
80
+
57
81
  ## Canada — CASL
58
82
 
59
83
  Stricter than CAN-SPAM. Cold B2B outreach requires:
@@ -69,19 +93,22 @@ Stricter than CAN-SPAM. Cold B2B outreach requires:
69
93
 
70
94
  ### LinkedIn
71
95
 
72
- - **Sales Navigator** as a research tool: fine
96
+ - **Sales Navigator** as a research tool: fine. Use it to define account and persona filters, then pull contacts from a licensed database. Sales Navigator has no native export, caps searches at 2,500 results, and syncs to a CRM only on Advanced plans.
73
97
  - **Scraping LinkedIn at any scale**: explicit ToS violation. Banned accounts are permanent. Don't.
98
+ - **LinkedIn enforces against vendors as well as users.** It sued Proxycurl (which shut down in July 2025 under a permanent injunction) and ProAPIs (October 2025) over fake-account scraping, and removed company pages for Apollo, Seamless, and HeyReach. Any data or automation vendor that depends on LinkedIn can disappear overnight; keep an alternative.
99
+ - **Logged-out vs logged-in.** Courts have treated scraping public, logged-out pages differently from scraping behind a login or with fake accounts, which breaches the User Agreement. Under GDPR, "publicly visible" still doesn't mean free to use: France's regulator fined Kaspr €240,000 (December 2024) for collecting contact details from LinkedIn that users had chosen to hide.
74
100
  - **Apollo, Clay, and ZoomInfo** claim LinkedIn-overlap data through various legitimate channels — verify their data sources before assuming compliance
75
- - **InMail and Connection Requests**: governed by LinkedIn's own messaging rules, not by CAN-SPAM/GDPR (because LinkedIn-internal)
101
+ - **Messages, InMail, and connection requests** are still processing of personal data, so GDPR, PECR, and similar laws apply exactly as they do to email: lawful basis, an opt-out on request, and source records. LinkedIn's own rules apply on top, and third-party automation tools violate its User Agreement.
76
102
 
77
103
  ### Google Maps
78
104
 
79
105
  - ToS prohibits bulk extraction or productizing Maps data
80
106
  - Browser-assisted research as a discovery aid: acceptable
81
- - Storing Place IDs or large structured Maps data in your CRM: explicit ToS prohibition
107
+ - Place IDs are exempt from Google's caching limits, so storing them to re-look up a business is fine. Other Maps content (reviews, ratings, photos, and bulk-copied listing details) can't be cached beyond the terms or rebuilt into your own database
108
+ - The Places API is the compliant way to pull business data programmatically, within its terms
82
109
  - Use Maps to **find** local businesses, then cross-source from the business's own site for the data you retain
83
110
 
84
- ### Apollo / ZoomInfo / Clearbit
111
+ ### Apollo / ZoomInfo / other licensed data providers
85
112
 
86
113
  - All have their own ToS limiting reselling, downstream sharing, and use cases
87
114
  - Read your contract — typically you can use the data for your own outreach but not productize it
@@ -95,6 +122,15 @@ Stricter than CAN-SPAM. Cold B2B outreach requires:
95
122
 
96
123
  ---
97
124
 
125
+ ## Phone and SMS (US)
126
+
127
+ - **Do Not Call.** Scrub numbers against the National DNC Registry and your internal DNC list before calling. B2B calls to business lines are lower risk, but mobile numbers enriched from data providers are often personal cell phones, which the rules protect.
128
+ - **AI voice counts as an artificial voice.** The FCC's February 2024 ruling puts AI-generated voices under the TCPA's artificial or prerecorded voice rules. AI-voiced calls to cell phones need prior express consent, and written consent for marketing. Damages run $500–$1,500 per call. Use AI voice only for inbound calls and requested callbacks.
129
+ - **Opt-outs by any reasonable means.** Since April 2025, a consumer can revoke consent by any reasonable means (a reply of "stop," a spoken request), and you have 10 business days to honor it.
130
+ - **Cold SMS** to US mobiles needs consent plus 10DLC registration. Treat SMS as a channel for people who've already engaged.
131
+
132
+ ---
133
+
98
134
  ## Anti-Patterns (Don't Do These)
99
135
 
100
136
  1. **Bulk-scraping LinkedIn / Google Maps / Yelp**. Browser-assisted research is OK; automated scrapers pointed at these platforms are not. **Firecrawl and Browserbase are fine for an individual prospect's own website** (the URL you found through manual discovery) — not for the platforms hosting prospects.
@@ -114,10 +150,12 @@ Before shipping a list to the user (or downstream to luckiest-cold-email):
114
150
 
115
151
  - [ ] Every contact has a source URL + collection date
116
152
  - [ ] No contacts sourced from scraped LinkedIn data
117
- - [ ] No Google Maps Place IDs or large Maps-structured data retained
153
+ - [ ] No bulk Maps content (reviews, ratings, listing copies) retained beyond Google's terms
154
+ - [ ] Country gating applied: Germany excluded from cold email, UK sole traders and partnerships excluded without consent, CASL and Spam Act requirements met for Canada and Australia
155
+ - [ ] Phone numbers scrubbed against DNC; no AI-voice calls to mobiles without consent
118
156
  - [ ] Lawful basis documented (legitimate interest test for B2B, or relevant alternative)
119
157
  - [ ] Email addresses validated (deliverability check before outreach)
120
158
  - [ ] Personal addresses (Gmail, etc.) flagged or excluded
121
159
  - [ ] Source provider contracts permit the intended use case
122
160
  - [ ] Retention plan documented (when to delete)
123
- - [ ] First outreach will include unsubscribe + privacy notice (downstream concern for luckiest-cold-email skill, but mention it now)
161
+ - [ ] First outreach will include an opt-out, a postal address, and (for EU/UK) where the data came from (downstream concern for luckiest-cold-email skill, but mention it now)
@@ -14,7 +14,7 @@ Tool selection guide for prospecting across all three branches.
14
14
  | **Funding signals (SaaS)** | Crunchbase, Pitchbook | Crunchbase free tier sufficient for early signals; Pitchbook for deeper investor data |
15
15
  | **Email pattern discovery** | Hunter, Snov, Apollo | Pattern guessing — followed by verification |
16
16
  | **Email deliverability verification** | Truelist, Hunter, NeverBounce, ZeroBounce | Always verify before adding to outreach lists |
17
- | **Visitor identification (warm intent)** | RB2B, Clearbit Reveal | Anonymous traffic → company identification |
17
+ | **Visitor identification (warm intent)** | RB2B, Warmly, Vector | Anonymous traffic → company or person identification |
18
18
  | **Intent data** | ZoomInfo Intent, 6sense, Bombora | Pre-warmed signals; mid-market+ pricing |
19
19
  | **Trigger event monitoring** | Google Alerts, Feedly, LinkedIn Sales Nav alerts | Free options are sufficient for most |
20
20
  | **Local business discovery** | Google Maps (manual), Yelp, Facebook Pages | Browser-assisted, not bulk-extracted |
@@ -45,7 +45,7 @@ Tool selection guide for prospecting across all three branches.
45
45
  **Use for**: Multi-source enrichment, waterfall lookups, custom scoring logic. When list quality matters more than list size.
46
46
 
47
47
  **Strengths**:
48
- - Waterfall logic: try Apollo first → fallback to ZoomInfo → fallback to Clearbit
48
+ - Waterfall logic: query providers in order and stop at the first verified result (see [sourcing-and-enrichment.md](sourcing-and-enrichment.md) for ordering and the bake-off)
49
49
  - 100+ data provider integrations
50
50
  - AI-powered enrichment (LLM-driven extraction from URLs)
51
51
  - Custom columns + scoring formulas
@@ -78,19 +78,19 @@ Tool selection guide for prospecting across all three branches.
78
78
 
79
79
  ---
80
80
 
81
- ## Clearbit
81
+ ## Waterfall aggregators (FullEnrich, LeadMagic)
82
82
 
83
- **Use for**: Email → company enrichment, anonymous visitor identification (Clearbit Reveal).
84
-
85
- **Strengths**:
86
- - Strong company enrichment (industry, size, funding, tech stack)
87
- - Email lookup by domain
88
- - Reveal: identify anonymous site visitors at company level
89
- - API-first
83
+ **Use for**: Email and phone enrichment through one API call that queries several providers in sequence. The simpler alternative to building a waterfall in Clay.
90
84
 
91
85
  **Watch out for**:
92
- - HubSpot acquisition (2023) — bundled into HubSpot Breeze Intelligence now
93
- - Standalone API still available but pricing/access depends on tier
86
+ - Coverage and false-positive rates vary by ICP; run the bake-off in [sourcing-and-enrichment.md](sourcing-and-enrichment.md) before committing
87
+ - Verify results anyway; finding an address isn't the same as confirming it
88
+
89
+ ---
90
+
91
+ ## Clearbit (legacy)
92
+
93
+ Clearbit was absorbed into HubSpot (Breeze Intelligence). Its free tools ended in 2025, and new standalone API access is no longer generally available. Use HubSpot's enrichment if you're on HubSpot; otherwise use the providers above.
94
94
 
95
95
  **Integration**: see [clearbit.md](../../../tools/integrations/clearbit.md)
96
96
 
@@ -238,7 +238,7 @@ Discovery happens on platforms (manual browser-assisted research). Extraction ha
238
238
 
239
239
  ---
240
240
 
241
- ## RB2B / Clearbit Reveal
241
+ ## Visitor identification (RB2B, Warmly, Vector)
242
242
 
243
243
  **Use for**: Identifying anonymous site visitors as warm intent signals.
244
244
 
@@ -253,8 +253,6 @@ Discovery happens on platforms (manual browser-assisted research). Extraction ha
253
253
 
254
254
  **Integration**: see [rb2b.md](../../../tools/integrations/rb2b.md)
255
255
 
256
- ---
257
-
258
256
  ## Free / browser-only fallbacks
259
257
 
260
258
  When the user has no paid tools, lean on: