luckiest-co 1.0.47 → 1.0.48
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/ab-testing/CHANGELOG.md +5 -0
- package/skills/ab-testing/SKILL.md +12 -9
- package/skills/ab-testing/evals/evals.json +18 -7
- package/skills/ab-testing/references/sample-size-guide.md +2 -2
- package/skills/ads/CHANGELOG.md +5 -0
- package/skills/ads/SKILL.md +4 -4
- package/skills/ai-seo/CHANGELOG.md +7 -0
- package/skills/ai-seo/SKILL.md +27 -20
- package/skills/analytics/CHANGELOG.md +6 -0
- package/skills/analytics/SKILL.md +4 -3
- package/skills/analytics/evals/evals.json +27 -0
- package/skills/analytics/references/ga4-implementation.md +7 -3
- package/skills/analytics/references/gtm-implementation.md +8 -2
- package/skills/aso/CHANGELOG.md +5 -0
- package/skills/aso/SKILL.md +4 -4
- package/skills/aso/evals/evals.json +15 -2
- package/skills/aso/references/benchmarks.md +4 -2
- package/skills/aso/references/google-play-specs.md +5 -1
- package/skills/brainstorm/SKILL.md +59 -16
- package/skills/brainstorm/builder-check-prompt.md +23 -0
- package/skills/churn-prevention/CHANGELOG.md +5 -0
- package/skills/churn-prevention/SKILL.md +3 -3
- package/skills/churn-prevention/evals/evals.json +14 -0
- package/skills/churn-prevention/references/dunning-playbook.md +6 -1
- package/skills/coder-brainstorming/CHANGELOG.md +10 -0
- package/skills/coder-brainstorming/SKILL.md +62 -20
- package/skills/coder-brainstorming/builder-check-prompt.md +23 -0
- package/skills/coder-brainstorming/scripts/server.cjs +1 -1
- package/skills/coder-debugging/CHANGELOG.md +4 -0
- package/skills/coder-debugging/SKILL.md +5 -5
- package/skills/coder-requesting-code-review/CHANGELOG.md +4 -0
- package/skills/coder-requesting-code-review/SKILL.md +4 -4
- package/skills/coder-subagent-driven-development/CHANGELOG.md +4 -0
- package/skills/coder-subagent-driven-development/SKILL.md +3 -3
- package/skills/coder-subagent-driven-development/scripts/sdd-workspace +3 -1
- package/skills/cold-email/CHANGELOG.md +7 -0
- package/skills/cold-email/SKILL.md +27 -7
- package/skills/cold-email/evals/evals.json +30 -0
- package/skills/cold-email/references/benchmarks.md +15 -11
- package/skills/cold-email/references/deliverability.md +110 -0
- package/skills/cold-email/references/linkedin-outreach.md +91 -0
- package/skills/cold-email/references/multichannel-cadence.md +79 -0
- package/skills/cold-email/references/outbound-plays.md +88 -0
- package/skills/cold-email/references/personalization.md +11 -0
- package/skills/cold-email/references/reply-handling.md +65 -0
- package/skills/competitor-profiling/CHANGELOG.md +5 -0
- package/skills/competitor-profiling/SKILL.md +4 -4
- package/skills/content-strategy/CHANGELOG.md +5 -0
- package/skills/content-strategy/SKILL.md +5 -3
- package/skills/copy-editing/CHANGELOG.md +5 -0
- package/skills/copy-editing/SKILL.md +5 -5
- package/skills/copy-editing/references/content-refresh.md +33 -0
- package/skills/cro/CHANGELOG.md +5 -0
- package/skills/cro/SKILL.md +14 -3
- package/skills/cro/references/form.md +1 -1
- package/skills/directory-submissions/CHANGELOG.md +5 -0
- package/skills/directory-submissions/SKILL.md +13 -4
- package/skills/directory-submissions/evals/evals.json +15 -1
- package/skills/directory-submissions/references/directory-list.md +2 -4
- package/skills/emails/CHANGELOG.md +5 -0
- package/skills/emails/SKILL.md +14 -4
- package/skills/launch/CHANGELOG.md +7 -0
- package/skills/launch/SKILL.md +8 -4
- package/skills/launch/evals/evals.json +29 -0
- package/skills/launch/references/shipped-changes.md +84 -0
- package/skills/launch/references/site-launch-qa.md +55 -0
- package/skills/lead-magnets/CHANGELOG.md +5 -0
- package/skills/lead-magnets/SKILL.md +6 -4
- package/skills/lead-magnets/evals/evals.json +18 -0
- package/skills/lead-magnets/references/content-to-skill-corpus-design.md +89 -0
- package/skills/lead-magnets/references/content-to-skill-release.md +71 -0
- package/skills/lead-magnets/references/content-to-skill.md +108 -0
- package/skills/marketing-plan/CHANGELOG.md +5 -0
- package/skills/marketing-plan/SKILL.md +3 -3
- package/skills/marketing-plan/evals/evals.json +13 -0
- package/skills/marketing-plan/references/budget-planning.md +26 -17
- package/skills/pricing/CHANGELOG.md +5 -0
- package/skills/pricing/SKILL.md +4 -4
- package/skills/pricing/evals/evals.json +12 -0
- package/skills/pricing/references/research-methods.md +8 -4
- package/skills/programmatic-seo/CHANGELOG.md +5 -0
- package/skills/programmatic-seo/SKILL.md +8 -4
- package/skills/programmatic-seo/evals/evals.json +13 -0
- package/skills/programmatic-seo/references/implementation-platforms.md +37 -0
- package/skills/prospecting/CHANGELOG.md +7 -0
- package/skills/prospecting/SKILL.md +27 -13
- package/skills/prospecting/evals/evals.json +41 -0
- package/skills/prospecting/references/account-research.md +59 -0
- package/skills/prospecting/references/b2b-prospecting.md +1 -1
- package/skills/prospecting/references/compliance.md +44 -6
- package/skills/prospecting/references/data-sources.md +13 -15
- package/skills/prospecting/references/enrichment-playbook.md +61 -0
- package/skills/prospecting/references/saas-prospecting.md +1 -1
- package/skills/prospecting/references/signal-plays.md +99 -0
- package/skills/prospecting/references/sourcing-and-enrichment.md +89 -0
- package/skills/referrals/CHANGELOG.md +5 -0
- package/skills/referrals/SKILL.md +10 -4
- package/skills/referrals/evals/evals.json +99 -0
- package/skills/referrals/references/affiliate-operations.md +64 -0
- package/skills/referrals/references/affiliate-programs.md +2 -2
- package/skills/referrals/references/program-examples.md +14 -6
- package/skills/referrals/references/review-platform-rules.md +36 -0
- package/skills/referrals/references/review-program-operations.md +62 -0
- package/skills/referrals/references/review-programs.md +96 -0
- package/skills/revops/CHANGELOG.md +5 -0
- package/skills/revops/SKILL.md +10 -6
- package/skills/revops/evals/evals.json +13 -0
- package/skills/revops/references/automation-playbooks.md +1 -1
- package/skills/revops/references/inbound-routing.md +43 -0
- package/skills/revops/references/lifecycle-definitions.md +31 -0
- package/skills/sales-enablement/CHANGELOG.md +5 -0
- package/skills/sales-enablement/SKILL.md +6 -4
- package/skills/sales-enablement/evals/evals.json +14 -0
- package/skills/sales-enablement/references/cold-call-scripts.md +68 -0
- package/skills/schema/CHANGELOG.md +5 -0
- package/skills/schema/SKILL.md +20 -8
- package/skills/schema/evals/evals.json +40 -0
- package/skills/schema/references/schema-examples.md +9 -15
- package/skills/seo-audit/CHANGELOG.md +5 -0
- package/skills/seo-audit/SKILL.md +10 -16
- package/skills/seo-audit/evals/evals.json +68 -0
- package/skills/seo-audit/references/international-seo.md +9 -11
- package/skills/seo-audit/references/local-seo-pages-and-measurement.md +39 -0
- package/skills/seo-audit/references/local-seo-profile-and-citations.md +41 -0
- package/skills/seo-audit/references/local-seo.md +86 -0
- package/skills/seo-audit/references/rankings-push.md +62 -0
- package/skills/seo-audit/references/title-tags.md +89 -0
- package/skills/signup/CHANGELOG.md +5 -0
- package/skills/signup/SKILL.md +7 -3
- package/skills/site-architecture/CHANGELOG.md +5 -0
- package/skills/site-architecture/SKILL.md +5 -4
- package/skills/site-architecture/evals/evals.json +25 -0
- package/skills/site-architecture/references/platforms-and-migration.md +84 -0
- package/skills/social/CHANGELOG.md +5 -0
- package/skills/social/SKILL.md +4 -4
- package/skills/trends/.skillignore +3 -0
- package/skills/trends/CHANGELOG.md +20 -0
- package/skills/trends/SKILL.md +12 -8
- package/skills/trends/references/agent-mode.md +36 -0
- package/skills/trends/references/category-peers.md +38 -0
- package/skills/trends/references/comparison.md +227 -0
- package/skills/trends/references/competitors.md +29 -0
- package/skills/trends/references/discovery.md +90 -0
- package/skills/trends/references/engine-contract.md +111 -1889
- package/skills/trends/references/followups.md +112 -0
- package/skills/trends/references/grok-bot-x.md +55 -0
- package/skills/trends/references/hiring-signals.md +19 -0
- package/skills/trends/references/library-queue.md +33 -0
- package/skills/trends/references/recommendations.md +86 -0
- package/skills/trends/references/research-runbook.md +781 -0
- package/skills/trends/references/runtime.md +165 -0
- package/skills/trends/references/save-html-brief.md +39 -20
- package/skills/trends/references/setup-wizard.md +253 -0
- package/skills/trends/references/synthesis.md +289 -0
- package/skills/trends/scripts/box_chrome_login.py +209 -0
- package/skills/trends/scripts/briefing.py +9 -17
- package/skills/trends/scripts/last30days.py +3247 -280
- package/skills/trends/scripts/lib/agentcookie.py +196 -0
- package/skills/trends/scripts/lib/amazon.py +877 -0
- package/skills/trends/scripts/lib/arxiv.py +42 -8
- package/skills/trends/scripts/lib/backends.py +769 -0
- package/skills/trends/scripts/lib/bird_x.py +340 -57
- package/skills/trends/scripts/lib/bluesky.py +84 -10
- package/skills/trends/scripts/lib/bounded_get.py +156 -0
- package/skills/trends/scripts/lib/brightdata.py +291 -0
- package/skills/trends/scripts/lib/categories.py +7 -1
- package/skills/trends/scripts/lib/chrome_cdp.py +455 -0
- package/skills/trends/scripts/lib/chrome_cookies.py +132 -39
- package/skills/trends/scripts/lib/cluster.py +31 -54
- package/skills/trends/scripts/lib/competitors.py +10 -1
- package/skills/trends/scripts/lib/cookie_extract.py +221 -44
- package/skills/trends/scripts/lib/cookie_paths.py +27 -0
- package/skills/trends/scripts/lib/corpus.py +439 -0
- package/skills/trends/scripts/lib/devto.py +313 -0
- package/skills/trends/scripts/lib/discovery_handoff.py +988 -0
- package/skills/trends/scripts/lib/doctor.py +2166 -0
- package/skills/trends/scripts/lib/dripstack.py +203 -0
- package/skills/trends/scripts/lib/entity_extract.py +37 -0
- package/skills/trends/scripts/lib/env.py +1092 -138
- package/skills/trends/scripts/lib/fanout.py +11 -1
- package/skills/trends/scripts/lib/feed.py +61 -0
- package/skills/trends/scripts/lib/fetch_memo.py +135 -0
- package/skills/trends/scripts/lib/freshness.py +566 -0
- package/skills/trends/scripts/lib/fusion.py +314 -28
- package/skills/trends/scripts/lib/github.py +438 -24
- package/skills/trends/scripts/lib/grok_x.py +1237 -0
- package/skills/trends/scripts/lib/grounding.py +129 -11
- package/skills/trends/scripts/lib/hackernews.py +61 -4
- package/skills/trends/scripts/lib/health.py +373 -0
- package/skills/trends/scripts/lib/hosted.py +333 -0
- package/skills/trends/scripts/lib/html_publish.py +34 -0
- package/skills/trends/scripts/lib/html_render.py +169 -3
- package/skills/trends/scripts/lib/http.py +1215 -70
- package/skills/trends/scripts/lib/instagram.py +132 -9
- package/skills/trends/scripts/lib/jobs.py +4 -2
- package/skills/trends/scripts/lib/library.py +308 -0
- package/skills/trends/scripts/lib/library_index.py +477 -0
- package/skills/trends/scripts/lib/linkedin.py +271 -24
- package/skills/trends/scripts/lib/log.py +5 -2
- package/skills/trends/scripts/lib/meta_ads.py +982 -0
- package/skills/trends/scripts/lib/normalize.py +382 -28
- package/skills/trends/scripts/lib/parallel_mcp.py +234 -0
- package/skills/trends/scripts/lib/permission_preflight.py +42 -3
- package/skills/trends/scripts/lib/perplexity.py +1080 -468
- package/skills/trends/scripts/lib/pipeline.py +5079 -211
- package/skills/trends/scripts/lib/planner.py +396 -53
- package/skills/trends/scripts/lib/polymarket.py +285 -23
- package/skills/trends/scripts/lib/prescriptions.py +432 -0
- package/skills/trends/scripts/lib/private_files.py +21 -0
- package/skills/trends/scripts/lib/providers.py +231 -10
- package/skills/trends/scripts/lib/quality_nudge.py +122 -37
- package/skills/trends/scripts/lib/reddit.py +177 -12
- package/skills/trends/scripts/lib/reddit_arctic.py +146 -5
- package/skills/trends/scripts/lib/reddit_keyless.py +121 -60
- package/skills/trends/scripts/lib/reddit_listing.py +215 -14
- package/skills/trends/scripts/lib/reddit_public.py +12 -13
- package/skills/trends/scripts/lib/reddit_search.py +304 -0
- package/skills/trends/scripts/lib/reddit_shreddit.py +51 -7
- package/skills/trends/scripts/lib/registers.py +134 -0
- package/skills/trends/scripts/lib/relevance.py +17 -0
- package/skills/trends/scripts/lib/render.py +2161 -271
- package/skills/trends/scripts/lib/rerank.py +623 -55
- package/skills/trends/scripts/lib/resolve.py +50 -1
- package/skills/trends/scripts/lib/safari_cookies.py +42 -15
- package/skills/trends/scripts/lib/schema.py +782 -1
- package/skills/trends/scripts/lib/setup_wizard.py +779 -120
- package/skills/trends/scripts/lib/signals.py +206 -7
- package/skills/trends/scripts/lib/stocktwits.py +374 -0
- package/skills/trends/scripts/lib/subproc.py +307 -53
- package/skills/trends/scripts/lib/techmeme.py +89 -64
- package/skills/trends/scripts/lib/telegram.py +317 -0
- package/skills/trends/scripts/lib/tiktok.py +13 -9
- package/skills/trends/scripts/lib/topic_shape.py +340 -0
- package/skills/trends/scripts/lib/transcribe.py +12 -3
- package/skills/trends/scripts/lib/trustpilot.py +256 -5
- package/skills/trends/scripts/lib/truthsocial.py +9 -1
- package/skills/trends/scripts/lib/ui.py +6 -0
- package/skills/trends/scripts/lib/usage.py +132 -0
- package/skills/trends/scripts/lib/web_search_keyless.py +63 -4
- package/skills/trends/scripts/lib/windows_job.py +138 -0
- package/skills/trends/scripts/lib/x_api.py +824 -0
- package/skills/trends/scripts/lib/x_envelope.py +733 -0
- package/skills/trends/scripts/lib/x_judge.py +292 -0
- package/skills/trends/scripts/lib/xai_x.py +26 -3
- package/skills/trends/scripts/lib/xquik.py +89 -15
- package/skills/trends/scripts/lib/xurl_x.py +284 -91
- package/skills/trends/scripts/lib/youtube_yt.py +570 -119
- package/skills/trends/scripts/setup-keychain.sh +12 -4
- package/skills/trends/scripts/setup-pass.sh +3 -0
- package/skills/trends/scripts/store.py +444 -50
- package/skills/trends/scripts/watchlist.py +38 -11
- package/skills/trends/scripts/x_lane_parity.py +107 -0
- package/skills/video-studio/CHANGELOG.md +4 -0
- package/skills/video-studio/SKILL.md +4 -4
- package/skills/video-studio/references/styles/product-flight.md +45 -0
- package/skills/video-studio/references/styles.md +3 -1
- package/skills/video-studio-motion/ATTRIBUTION.md +1 -1
- package/skills/video-studio-motion/CHANGELOG.md +4 -0
- package/skills/video-studio-motion/SKILL.md +8 -5
- package/skills/coder-brainstorming/spec-document-reviewer-prompt.md +0 -49
- package/skills/trends/scripts/lib/reddit_rss.py +0 -224
|
@@ -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,"
|
|
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.
|
|
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.
|
|
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.
|
|
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 "
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
33
|
-
| **B2B** | Non-SaaS B2B (services, manufacturers, enterprises, mid-market) | Industry + size + geographic fit + buying signals (trigger events, vendor changes) | Apollo, ZoomInfo, Clay,
|
|
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;
|
|
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
|
|
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
|
-
| **
|
|
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 |
|
|
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
|
-
| **
|
|
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 |
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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 /
|
|
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
|
|
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
|
|
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,
|
|
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:
|
|
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
|
-
##
|
|
81
|
+
## Waterfall aggregators (FullEnrich, LeadMagic)
|
|
82
82
|
|
|
83
|
-
**Use for**: Email
|
|
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
|
-
-
|
|
93
|
-
-
|
|
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
|
|
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:
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Waterfall Enrichment and Cache Reuse
|
|
2
|
+
|
|
3
|
+
Load this when a prospect list needs multiple data providers, repeated lookups, or a credit budget. Keep the luckiest-prospecting skill's ICP, source lineage, contact verification, and compliance rules. This is a workflow design, not a new API or a promise of coverage.
|
|
4
|
+
|
|
5
|
+
## Define the Success Condition Before Calling Providers
|
|
6
|
+
|
|
7
|
+
For each missing field, specify the required input, acceptable output, freshness, and maximum cost. A nonempty response is insufficient: a guessed address, a wrong-company match, or an old job title may fail the acceptance rule.
|
|
8
|
+
|
|
9
|
+
Example: find a published business contact for an ICP-fit account, then verify deliverability separately. A provider returning a name alone has not completed that task. Do not expand to personal emails simply because work-email providers found nothing.
|
|
10
|
+
|
|
11
|
+
Order providers by fit for this field, observed coverage, cost, and latency. There is no universal Hunter/Apollo/FullEnrich order. Use the user's existing connected tools; a manual public-source lookup is also a valid step.
|
|
12
|
+
|
|
13
|
+
## Run a Waterfall, Not Every Provider
|
|
14
|
+
|
|
15
|
+
1. Normalize the inputs and check existing verified CRM fields.
|
|
16
|
+
2. Read the exact cache entry for the first provider lookup.
|
|
17
|
+
3. If no reusable entry exists, perform that lookup within the authorized budget.
|
|
18
|
+
4. Validate the returned identity and field; record source and retrieval time.
|
|
19
|
+
5. Stop when the acceptance rule is satisfied. Otherwise advance to the next suitable provider.
|
|
20
|
+
6. If all steps return no acceptable result, retain the row as unresolved with a reason. Do not fill blanks with invented values.
|
|
21
|
+
|
|
22
|
+
| Lookup outcome | Next action |
|
|
23
|
+
|---|---|
|
|
24
|
+
| Fresh, accepted result | Reuse it; stop this field's waterfall |
|
|
25
|
+
| Genuine no-match | Advance; optionally cache the no-match briefly |
|
|
26
|
+
| Wrong entity or invalid output | Record rejection; advance if another source can resolve it |
|
|
27
|
+
| Authentication/permission error | Repair the connection; do not label the contact nonexistent |
|
|
28
|
+
| Rate limit, timeout, provider outage | Respect provider retry guidance and budget; defer or use an authorized independent source |
|
|
29
|
+
| Missing required input | Resolve identity first; another identical empty-input call will not help |
|
|
30
|
+
|
|
31
|
+
Apply conditions per row. An already verified contact should not spend credits discovering the same field again. Dependent steps wait for the preceding result; independent missing fields may run concurrently within provider limits.
|
|
32
|
+
|
|
33
|
+
For Clay, configure the provider sequence, inputs, and run conditions using its [waterfall documentation](https://university.clay.com/docs/building-a-data-waterfall). Its [workflow guidance](https://university.clay.com/docs/enrichment-in-workflows) distinguishes publishing a setup from running it and spending credits. Other tools need their own documented execution semantics.
|
|
34
|
+
|
|
35
|
+
## Exact Cache Keys
|
|
36
|
+
|
|
37
|
+
Use a structured key with these dimensions:
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
workspace/account + provider + endpoint/version + normalized inputs + requested fields/options
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Keep account scope separate even when two customers query the same domain. Normalize domains consistently (case, URL host, trailing dot); remove URL paths only for domain-based lookups. Preserve distinctions a provider treats as meaningful: person versus company, subdomain, country, filters, and email local-part rules. A company-name fuzzy match is not an exact cache hit.
|
|
44
|
+
|
|
45
|
+
Store status, accepted fields, entity identifiers, source, fetched time, expiry, and validation outcome. Never store API keys in keys or result logs. Restrict access to contact data and honor deletion/retention requirements.
|
|
46
|
+
|
|
47
|
+
- **Fresh accepted hit:** reuse without another charged call.
|
|
48
|
+
- **Expired hit:** refresh fields that require current evidence; label any provisional stale data explicitly.
|
|
49
|
+
- **Miss:** fetch the provider; a cache endpoint's documented 404 may mean only that the cache has no entry, not that the provider found no company.
|
|
50
|
+
- **Negative hit:** apply a separate, usually shorter expiry; changing inputs invalidates the match.
|
|
51
|
+
- **Error:** keep operational failures distinct from no-match records.
|
|
52
|
+
|
|
53
|
+
Merge accepted fields with provenance instead of overwriting verified CRM data with nulls or weaker matches. For concurrent duplicate lookups, reuse one in-flight request where supported; guard the final write so a late weaker result cannot replace a newer verified one.
|
|
54
|
+
|
|
55
|
+
## Deliverable and Pilot
|
|
56
|
+
|
|
57
|
+
Return a table with row identity, missing field, provider order, acceptance rule, cache decision, source/date, result, verification status, cost, and unresolved reason. Track cost per accepted field and verified contact, cache reuse, no-match rate, invalid-match rate, and sampled accuracy. Report actual measured savings; a cache does not guarantee a particular reduction.
|
|
58
|
+
|
|
59
|
+
Pilot on representative rows before a broad run: fresh hit, expired hit, true no-match, ambiguous company, provider failure, and duplicate input. Compare with a single-provider control under the same acceptance rule and budget. Pass qualified rows to cold-email only after contact verification; use the revops inbound-routing playbook for live form submissions.
|
|
60
|
+
|
|
61
|
+
Patterns adapted from eliasstravik's MIT-licensed GTM engineering toolkit. This playbook works with existing providers or manual research.
|
|
@@ -55,7 +55,7 @@ Combine 2+ sources for cross-verification.
|
|
|
55
55
|
### Tier 3 — buying signals
|
|
56
56
|
|
|
57
57
|
- **Job boards** (LinkedIn Jobs, Indeed, AngelList): role openings as signals
|
|
58
|
-
- **RB2B
|
|
58
|
+
- **RB2B, Warmly, or Vector**: visitor identification (warm anonymous traffic)
|
|
59
59
|
- **GitHub stars/forks of competitor or adjacent repos**: developer-level intent signal (see `tools/integrations/github.md` and the `github-prospects.js` CLI). Especially strong for dev-tool SaaS — a developer who starred `vercel/next.js` last week is in-market for adjacent Next.js infrastructure.
|
|
60
60
|
- **Recent blog posts / changelog**: product direction signals
|
|
61
61
|
- **G2 reviews mentioning competitor switches**: explicit dissatisfaction signal
|