Compare commits
67 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8c8090ed92 | |||
| e4283c6616 | |||
| 89fd57a8b0 | |||
| a2e646c2e6 | |||
| 9a2bb97784 | |||
| 4ff486a702 | |||
| edd613d33f | |||
| 3a13e58808 | |||
| e47e3a3073 | |||
| 8ea7487545 | |||
| 1622c8e398 | |||
| ee28bc4359 | |||
| f5badfe416 | |||
| bc3253d30d | |||
| 12c34eb714 | |||
| c4bc2fcc49 | |||
| 066c420416 | |||
| 08c100bc7b | |||
| 8618c5bad2 | |||
| 488d09cda5 | |||
| ea8df8290a | |||
| 4f803988e8 | |||
| 4fef22901e | |||
| 16a2f788d4 | |||
| 8f8ae292ea | |||
| 6914c62688 | |||
| 5436b34b98 | |||
| ce8dd3b41a | |||
| 10a708747d | |||
| abb6e87c04 | |||
| ce37279f12 | |||
| d4e6ef796c | |||
| f2a755f750 | |||
| 256eec8709 | |||
| 6744cfcd91 | |||
| bd00de7288 | |||
| 2497b090dc | |||
| a857eb683a | |||
| 6aa03c3217 | |||
| 8eaff5e29f | |||
| 51bdf2f6b3 | |||
| c1be574c8b | |||
| 47b4571ca2 | |||
| 2d0e7bc34c | |||
| a4e7890eb1 | |||
| f39dfd0210 | |||
| a71f31c51e | |||
| c4b698f996 | |||
| 2349865acb | |||
| ebdf1dd2f1 | |||
| aad399682c | |||
| f123804827 | |||
| 8ce007c983 | |||
| 2c26f8497b | |||
| 3a85964305 | |||
| 8dba2d53de | |||
| 98bd9ede62 | |||
| b260631f47 | |||
| 170af13f24 | |||
| 357e663767 | |||
| 7aa119cd85 | |||
| 3a56b53ecd | |||
| 1865cd29be | |||
| d8df68677f | |||
| 90b253d5ca | |||
| aa58db4bf8 | |||
| a04cb61a57 |
@@ -5,19 +5,23 @@
|
||||
"url": "https://corey.co"
|
||||
},
|
||||
"metadata": {
|
||||
"description": "Marketing skills for Claude Code — conversion optimization, copywriting, SEO, paid ads, and growth",
|
||||
"description": "Marketing skills for AI agents — conversion optimization, copywriting, SEO, paid ads, and growth",
|
||||
"version": "1.0.0",
|
||||
"repository": "https://github.com/coreyhaines31/marketingskills"
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "marketing-skills",
|
||||
"description": "25 marketing skills for technical marketers and founders: CRO, copywriting, SEO, paid ads, pricing strategy, referral programs, and more",
|
||||
"description": "32 marketing skills for technical marketers and founders: CRO, copywriting, cold email, SEO, AI SEO, paid ads, ad creative, churn prevention, pricing strategy, referral programs, revenue operations, sales enablement, site architecture, and more",
|
||||
"source": "./",
|
||||
"strict": false,
|
||||
"skills": [
|
||||
"./skills/ab-test-setup",
|
||||
"./skills/ad-creative",
|
||||
"./skills/ai-seo",
|
||||
"./skills/analytics-tracking",
|
||||
"./skills/churn-prevention",
|
||||
"./skills/cold-email",
|
||||
"./skills/competitor-alternatives",
|
||||
"./skills/content-strategy",
|
||||
"./skills/copy-editing",
|
||||
@@ -37,9 +41,12 @@
|
||||
"./skills/product-marketing-context",
|
||||
"./skills/programmatic-seo",
|
||||
"./skills/referral-program",
|
||||
"./skills/revops",
|
||||
"./skills/sales-enablement",
|
||||
"./skills/schema-markup",
|
||||
"./skills/seo-audit",
|
||||
"./skills/signup-flow-cro",
|
||||
"./skills/site-architecture",
|
||||
"./skills/social-content"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: coreyhaines31
|
||||
buy_me_a_coffee: coreyhaines
|
||||
+23
@@ -1,2 +1,25 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
|
||||
# Environment variables / secrets
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
**/.DS_Store
|
||||
|
||||
# macOS / iCloud duplicate files
|
||||
* 2.*
|
||||
* 2/
|
||||
|
||||
# Remotion video project
|
||||
video/
|
||||
|
||||
# Editor
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
@@ -4,7 +4,7 @@ Guidelines for AI agents working in this repository.
|
||||
|
||||
## Repository Overview
|
||||
|
||||
This repository contains **Agent Skills** for AI agents following the [Agent Skills specification](https://agentskills.io/specification.md). It also serves as a **Claude Code plugin marketplace** via `.claude-plugin/marketplace.json`.
|
||||
This repository contains **Agent Skills** for AI agents following the [Agent Skills specification](https://agentskills.io/specification.md). Skills install to `.agents/skills/` (the cross-agent standard). This repo also serves as a **Claude Code plugin marketplace** via `.claude-plugin/marketplace.json`.
|
||||
|
||||
- **Name**: Marketing Skills
|
||||
- **GitHub**: [coreyhaines31/marketingskills](https://github.com/coreyhaines31/marketingskills)
|
||||
@@ -20,6 +20,10 @@ marketingskills/
|
||||
├── skills/ # Agent Skills
|
||||
│ └── skill-name/
|
||||
│ └── SKILL.md # Required skill file
|
||||
├── tools/
|
||||
│ ├── clis/ # Zero-dependency Node.js CLI tools (51 tools)
|
||||
│ ├── integrations/ # API integration guides per tool
|
||||
│ └── REGISTRY.md # Tool index with capabilities
|
||||
├── CONTRIBUTING.md
|
||||
├── LICENSE
|
||||
└── README.md
|
||||
@@ -27,14 +31,19 @@ marketingskills/
|
||||
|
||||
## Build / Lint / Test Commands
|
||||
|
||||
**Not applicable** - This is a content-only repository with no executable code.
|
||||
|
||||
Verify manually:
|
||||
**Skills** are content-only (no build step). Verify manually:
|
||||
- YAML frontmatter is valid
|
||||
- `name` field matches directory name exactly
|
||||
- `name` is 1-64 chars, lowercase alphanumeric and hyphens only
|
||||
- `description` is 1-1024 characters
|
||||
|
||||
**CLI tools** (`tools/clis/*.js`) are zero-dependency Node.js scripts (Node 18+). Verify with:
|
||||
```bash
|
||||
node --check tools/clis/<name>.js # Syntax check
|
||||
node tools/clis/<name>.js # Show usage (no args = help)
|
||||
node tools/clis/<name>.js <cmd> --dry-run # Preview request without sending
|
||||
```
|
||||
|
||||
## Agent Skills Specification
|
||||
|
||||
Skills follow the [Agent Skills spec](https://agentskills.io/specification.md).
|
||||
@@ -158,7 +167,7 @@ This repository includes a tools registry for agent-compatible marketing tools.
|
||||
|
||||
- **Tool discovery**: Read `tools/REGISTRY.md` to see available tools and their capabilities
|
||||
- **Integration details**: See `tools/integrations/{tool}.md` for API endpoints, auth, and common operations
|
||||
- **MCP-enabled tools**: ga4, stripe, mailchimp, google-ads, resend, zapier
|
||||
- **MCP-enabled tools**: ga4, stripe, mailchimp, google-ads, resend, zapier, zoominfo, clay, supermetrics, coupler, outreach, crossbeam
|
||||
|
||||
### Registry Structure
|
||||
|
||||
|
||||
@@ -1,16 +1,52 @@
|
||||
# Marketing Skills for Claude Code
|
||||
# Marketing Skills for AI Agents
|
||||
|
||||
A collection of AI agent skills focused on marketing tasks. Built for technical marketers and founders who want Claude Code (or similar AI coding assistants) to help with conversion optimization, copywriting, SEO, analytics, and growth engineering.
|
||||
A collection of AI agent skills focused on marketing tasks. Built for technical marketers and founders who want AI coding agents to help with conversion optimization, copywriting, SEO, analytics, and growth engineering. Works with Claude Code, OpenAI Codex, Cursor, Windsurf, and any agent that supports the [Agent Skills spec](https://agentskills.io).
|
||||
|
||||
Built by [Corey Haines](https://corey.co?ref=marketingskills). Need hands-on help? Check out [Conversion Factory](https://conversionfactory.co?ref=marketingskills) — Corey's agency for conversion optimization, landing pages, and growth strategy. Want to learn more about marketing? Subscribe to [Swipe Files](https://swipefiles.com?ref=marketingskills).
|
||||
Built by [Corey Haines](https://corey.co?ref=marketingskills). Need hands-on help? Check out [Conversion Factory](https://conversionfactory.co?ref=marketingskills) — Corey's agency for conversion optimization, landing pages, and growth strategy. Want to learn more about marketing? Subscribe to [Swipe Files](https://swipefiles.com?ref=marketingskills). Want an autonomous AI agent that uses these skills to be your CMO? Try [Magister](https://magistermarketing.com?ref=marketingskills).
|
||||
|
||||
New to the terminal and coding agents? Check out the companion guide [Coding for Marketers](https://codingformarketers.com?ref=marketingskills).
|
||||
|
||||
**Contributions welcome!** Found a way to improve a skill or have a new one to add? [Open a PR](#contributing).
|
||||
|
||||
Run into a problem or have a question? [Open an issue](https://github.com/coreyhaines31/marketingskills/issues) — we're happy to help.
|
||||
|
||||
## What are Skills?
|
||||
|
||||
Skills are markdown files that give AI agents specialized knowledge and workflows for specific tasks. When you add these to your project, Claude Code can recognize when you're working on a marketing task and apply the right frameworks and best practices.
|
||||
Skills are markdown files that give AI agents specialized knowledge and workflows for specific tasks. When you add these to your project, your agent can recognize when you're working on a marketing task and apply the right frameworks and best practices.
|
||||
|
||||
## How Skills Work Together
|
||||
|
||||
Skills reference each other and build on shared context. The `product-marketing-context` skill is the foundation — every other skill checks it first to understand your product, audience, and positioning before doing anything.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────┐
|
||||
│ product-marketing-context │
|
||||
│ (read by all other skills first) │
|
||||
└──────────────────┬───────────────────┘
|
||||
│
|
||||
┌──────────────┬─────────────┬─────────────┼─────────────┬──────────────┬──────────────┐
|
||||
▼ ▼ ▼ ▼ ▼ ▼ ▼
|
||||
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌─────────────┐ ┌───────────┐
|
||||
│ SEO & │ │ CRO │ │Content & │ │ Paid & │ │ Growth & │ │ Sales & │ │ Strategy │
|
||||
│ Content │ │ │ │ Copy │ │Measurement │ │Retention │ │ GTM │ │ │
|
||||
├──────────┤ ├──────────┤ ├──────────┤ ├────────────┤ ├──────────┤ ├─────────────┤ ├───────────┤
|
||||
│seo-audit │ │page-cro │ │copywritng│ │paid-ads │ │referral │ │revops │ │mktg-ideas │
|
||||
│ai-seo │ │signup-cro│ │copy-edit │ │ad-creative │ │free-tool │ │sales-enable │ │mktg-psych │
|
||||
│site-arch │ │onboard │ │cold-email│ │ab-test │ │churn- │ │launch │ │ │
|
||||
│programm │ │form-cro │ │email-seq │ │analytics │ │ prevent │ │pricing │ │ │
|
||||
│schema │ │popup-cro │ │social │ │ │ │ │ │competitor │ │ │
|
||||
│content │ │paywall │ │ │ │ │ │ │ │ │ │ │
|
||||
└────┬─────┘ └────┬─────┘ └────┬─────┘ └─────┬──────┘ └────┬─────┘ └──────┬──────┘ └─────┬─────┘
|
||||
│ │ │ │ │ │ │
|
||||
└────────────┴─────┬──────┴──────────────┴─────────────┴──────────────┴──────────────┘
|
||||
│
|
||||
Skills cross-reference each other:
|
||||
copywriting ↔ page-cro ↔ ab-test-setup
|
||||
revops ↔ sales-enablement ↔ cold-email
|
||||
seo-audit ↔ schema-markup ↔ ai-seo
|
||||
```
|
||||
|
||||
See each skill's **Related Skills** section for the full dependency map.
|
||||
|
||||
## Available Skills
|
||||
|
||||
@@ -18,7 +54,11 @@ Skills are markdown files that give AI agents specialized knowledge and workflow
|
||||
| Skill | Description |
|
||||
|-------|-------------|
|
||||
| [ab-test-setup](skills/ab-test-setup/) | When the user wants to plan, design, or implement an A/B test or experiment. Also use when the user mentions "A/B... |
|
||||
| [ad-creative](skills/ad-creative/) | When the user wants to generate, iterate, or scale ad creative — headlines, descriptions, primary text, or full ad... |
|
||||
| [ai-seo](skills/ai-seo/) | When the user wants to optimize content for AI search engines, get cited by LLMs, or appear in AI-generated answers.... |
|
||||
| [analytics-tracking](skills/analytics-tracking/) | When the user wants to set up, improve, or audit analytics tracking and measurement. Also use when the user mentions... |
|
||||
| [churn-prevention](skills/churn-prevention/) | When the user wants to reduce churn, build cancellation flows, set up save offers, recover failed payments, or... |
|
||||
| [cold-email](skills/cold-email/) | Write B2B cold emails and follow-up sequences that get replies. Use when the user wants to write cold outreach emails,... |
|
||||
| [competitor-alternatives](skills/competitor-alternatives/) | When the user wants to create competitor comparison or alternative pages for SEO and sales enablement. Also use when... |
|
||||
| [content-strategy](skills/content-strategy/) | When the user wants to plan a content strategy, decide what content to create, or figure out what topics to cover. Also... |
|
||||
| [copy-editing](skills/copy-editing/) | When the user wants to edit, review, or improve existing marketing copy. Also use when the user mentions 'edit this... |
|
||||
@@ -38,9 +78,12 @@ Skills are markdown files that give AI agents specialized knowledge and workflow
|
||||
| [product-marketing-context](skills/product-marketing-context/) | When the user wants to create or update their product marketing context document. Also use when the user mentions... |
|
||||
| [programmatic-seo](skills/programmatic-seo/) | When the user wants to create SEO-driven pages at scale using templates and data. Also use when the user mentions... |
|
||||
| [referral-program](skills/referral-program/) | When the user wants to create, optimize, or analyze a referral program, affiliate program, or word-of-mouth strategy.... |
|
||||
| [revops](skills/revops/) | When the user wants help with revenue operations, lead lifecycle management, or marketing-to-sales handoff... |
|
||||
| [sales-enablement](skills/sales-enablement/) | When the user wants to create sales collateral, pitch decks, one-pagers, objection handling docs, or demo scripts... |
|
||||
| [schema-markup](skills/schema-markup/) | When the user wants to add, fix, or optimize schema markup and structured data on their site. Also use when the user... |
|
||||
| [seo-audit](skills/seo-audit/) | When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO... |
|
||||
| [signup-flow-cro](skills/signup-flow-cro/) | When the user wants to optimize signup, registration, account creation, or trial activation flows. Also use when the... |
|
||||
| [site-architecture](skills/site-architecture/) | When the user wants to plan, map, or restructure their website's page hierarchy, navigation, URL structure, or internal... |
|
||||
| [social-content](skills/social-content/) | When the user wants help creating, scheduling, or optimizing social media content for LinkedIn, Twitter/X, Instagram,... |
|
||||
<!-- SKILLS:END -->
|
||||
|
||||
@@ -61,7 +104,7 @@ npx skills add coreyhaines31/marketingskills --skill page-cro copywriting
|
||||
npx skills add coreyhaines31/marketingskills --list
|
||||
```
|
||||
|
||||
This automatically installs to your `.claude/skills/` directory.
|
||||
This automatically installs to your `.agents/skills/` directory (and symlinks into `.claude/skills/` for Claude Code compatibility).
|
||||
|
||||
### Option 2: Claude Code Plugin
|
||||
|
||||
@@ -81,7 +124,7 @@ Clone the entire repo and copy the skills folder:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/coreyhaines31/marketingskills.git
|
||||
cp -r marketingskills/skills/* .claude/skills/
|
||||
cp -r marketingskills/skills/* .agents/skills/
|
||||
```
|
||||
|
||||
### Option 4: Git Submodule
|
||||
@@ -89,10 +132,10 @@ cp -r marketingskills/skills/* .claude/skills/
|
||||
Add as a submodule for easy updates:
|
||||
|
||||
```bash
|
||||
git submodule add https://github.com/coreyhaines31/marketingskills.git .claude/marketingskills
|
||||
git submodule add https://github.com/coreyhaines31/marketingskills.git .agents/marketingskills
|
||||
```
|
||||
|
||||
Then reference skills from `.claude/marketingskills/skills/`.
|
||||
Then reference skills from `.agents/marketingskills/skills/`.
|
||||
|
||||
### Option 5: Fork and Customize
|
||||
|
||||
@@ -115,9 +158,20 @@ npx skillkit install coreyhaines31/marketingskills --skill page-cro copywriting
|
||||
npx skillkit install coreyhaines31/marketingskills --list
|
||||
```
|
||||
|
||||
## Upgrading from v1.0
|
||||
|
||||
Skills now use `.agents/` instead of `.claude/` for the product marketing context file. Move your existing context file:
|
||||
|
||||
```bash
|
||||
mkdir -p .agents
|
||||
mv .claude/product-marketing-context.md .agents/product-marketing-context.md
|
||||
```
|
||||
|
||||
Skills will still check `.claude/` as a fallback, so nothing breaks if you don't.
|
||||
|
||||
## Usage
|
||||
|
||||
Once installed, just ask Claude Code to help with marketing tasks:
|
||||
Once installed, just ask your agent to help with marketing tasks:
|
||||
|
||||
```
|
||||
"Help me optimize this landing page for conversions"
|
||||
@@ -154,23 +208,30 @@ You can also invoke skills directly:
|
||||
### Content & Copy
|
||||
- `copywriting` - Marketing page copy
|
||||
- `copy-editing` - Edit and polish existing copy
|
||||
- `cold-email` - B2B cold outreach emails and sequences
|
||||
- `email-sequence` - Automated email flows
|
||||
- `social-content` - Social media content
|
||||
|
||||
### SEO & Discovery
|
||||
- `seo-audit` - Technical and on-page SEO
|
||||
- `ai-seo` - AI search optimization (AEO, GEO, LLMO)
|
||||
- `programmatic-seo` - Scaled page generation
|
||||
- `site-architecture` - Page hierarchy, navigation, URL structure
|
||||
- `competitor-alternatives` - Comparison and alternative pages
|
||||
- `schema-markup` - Structured data
|
||||
|
||||
### Paid & Distribution
|
||||
- `paid-ads` - Google, Meta, LinkedIn ad campaigns
|
||||
- `ad-creative` - Bulk ad creative generation and iteration
|
||||
- `social-content` - Social media scheduling and strategy
|
||||
|
||||
### Measurement & Testing
|
||||
- `analytics-tracking` - Event tracking setup
|
||||
- `ab-test-setup` - Experiment design
|
||||
|
||||
### Retention
|
||||
- `churn-prevention` - Cancel flows, save offers, dunning, payment recovery
|
||||
|
||||
### Growth Engineering
|
||||
- `free-tool-strategy` - Marketing tools and calculators
|
||||
- `referral-program` - Referral and affiliate programs
|
||||
@@ -181,6 +242,10 @@ You can also invoke skills directly:
|
||||
- `launch-strategy` - Product launches and announcements
|
||||
- `pricing-strategy` - Pricing, packaging, and monetization
|
||||
|
||||
### Sales & RevOps
|
||||
- `revops` - Lead lifecycle, scoring, routing, pipeline management
|
||||
- `sales-enablement` - Sales decks, one-pagers, objection docs, demo scripts
|
||||
|
||||
## Contributing
|
||||
|
||||
Found a way to improve a skill? Have a new skill to suggest? PRs and issues welcome!
|
||||
|
||||
+58
-25
@@ -4,34 +4,67 @@ Current versions of all skills. Agents can compare against local versions to che
|
||||
|
||||
| Skill | Version | Last Updated |
|
||||
|-------|---------|--------------|
|
||||
| ab-test-setup | 1.0.0 | 2026-01-27 |
|
||||
| analytics-tracking | 1.0.0 | 2026-01-27 |
|
||||
| competitor-alternatives | 1.0.0 | 2026-01-27 |
|
||||
| content-strategy | 1.0.0 | 2026-01-27 |
|
||||
| copy-editing | 1.0.0 | 2026-01-27 |
|
||||
| copywriting | 1.0.0 | 2026-01-27 |
|
||||
| email-sequence | 1.0.0 | 2026-01-27 |
|
||||
| form-cro | 1.0.0 | 2026-01-27 |
|
||||
| free-tool-strategy | 1.0.0 | 2026-01-27 |
|
||||
| launch-strategy | 1.0.0 | 2026-01-27 |
|
||||
| marketing-ideas | 1.0.0 | 2026-01-27 |
|
||||
| marketing-psychology | 1.0.0 | 2026-01-27 |
|
||||
| onboarding-cro | 1.0.0 | 2026-01-27 |
|
||||
| page-cro | 1.0.0 | 2026-01-27 |
|
||||
| paid-ads | 1.0.0 | 2026-01-27 |
|
||||
| paywall-upgrade-cro | 1.0.0 | 2026-01-27 |
|
||||
| popup-cro | 1.0.0 | 2026-01-27 |
|
||||
| pricing-strategy | 1.0.0 | 2026-01-27 |
|
||||
| product-marketing-context | 1.0.0 | 2026-01-27 |
|
||||
| programmatic-seo | 1.0.0 | 2026-01-27 |
|
||||
| referral-program | 1.0.0 | 2026-01-27 |
|
||||
| schema-markup | 1.0.0 | 2026-01-27 |
|
||||
| seo-audit | 1.0.0 | 2026-01-27 |
|
||||
| signup-flow-cro | 1.0.0 | 2026-01-27 |
|
||||
| social-content | 1.0.0 | 2026-01-27 |
|
||||
| ab-test-setup | 1.1.0 | 2026-02-27 |
|
||||
| ad-creative | 1.1.0 | 2026-02-27 |
|
||||
| ai-seo | 1.1.0 | 2026-02-27 |
|
||||
| analytics-tracking | 1.1.0 | 2026-02-27 |
|
||||
| churn-prevention | 1.1.0 | 2026-02-27 |
|
||||
| cold-email | 1.1.0 | 2026-02-27 |
|
||||
| competitor-alternatives | 1.1.0 | 2026-02-27 |
|
||||
| content-strategy | 1.1.0 | 2026-02-27 |
|
||||
| copy-editing | 1.1.0 | 2026-02-27 |
|
||||
| copywriting | 1.1.0 | 2026-02-27 |
|
||||
| email-sequence | 1.1.0 | 2026-02-27 |
|
||||
| form-cro | 1.1.0 | 2026-02-27 |
|
||||
| free-tool-strategy | 1.1.0 | 2026-02-27 |
|
||||
| launch-strategy | 1.1.0 | 2026-02-27 |
|
||||
| marketing-ideas | 1.1.0 | 2026-02-27 |
|
||||
| marketing-psychology | 1.1.0 | 2026-02-27 |
|
||||
| onboarding-cro | 1.1.0 | 2026-02-27 |
|
||||
| page-cro | 1.1.0 | 2026-02-27 |
|
||||
| paid-ads | 1.1.0 | 2026-02-27 |
|
||||
| paywall-upgrade-cro | 1.1.0 | 2026-02-27 |
|
||||
| popup-cro | 1.1.0 | 2026-02-27 |
|
||||
| pricing-strategy | 1.1.0 | 2026-02-27 |
|
||||
| product-marketing-context | 1.1.0 | 2026-02-27 |
|
||||
| programmatic-seo | 1.1.0 | 2026-02-27 |
|
||||
| referral-program | 1.1.0 | 2026-02-27 |
|
||||
| revops | 1.1.0 | 2026-02-27 |
|
||||
| sales-enablement | 1.1.0 | 2026-02-27 |
|
||||
| schema-markup | 1.1.0 | 2026-02-27 |
|
||||
| seo-audit | 1.1.0 | 2026-02-27 |
|
||||
| signup-flow-cro | 1.1.0 | 2026-02-27 |
|
||||
| site-architecture | 1.1.0 | 2026-02-27 |
|
||||
| social-content | 1.1.0 | 2026-02-27 |
|
||||
|
||||
## Recent Changes
|
||||
|
||||
### 2026-02-27
|
||||
- Migrated context path from `.claude/` to `.agents/` for agent-agnostic compatibility
|
||||
- All skills now check `.agents/product-marketing-context.md` first, with `.claude/` fallback for older setups
|
||||
- Updated install paths in README to reference `.agents/skills/`
|
||||
- Bumped all 32 skills from 1.0.0 → 1.1.0
|
||||
|
||||
### 2026-02-22
|
||||
- Added `revops` skill for revenue operations, lead lifecycle, scoring, routing, pipeline management, and CRM automation
|
||||
- Added `sales-enablement` skill for sales decks, one-pagers, objection handling, demo scripts, and sales playbooks
|
||||
|
||||
### 2026-02-21
|
||||
- Added `site-architecture` skill for website structure planning, page hierarchy, navigation design, URL structure, and internal linking strategy
|
||||
|
||||
### 2026-02-18
|
||||
- Added `ai-seo` skill for AI search optimization (AEO, GEO, LLMO, AI Overviews)
|
||||
- Moved AEO/GEO content patterns from `seo-audit` references to `ai-seo` skill
|
||||
- Added `churn-prevention` skill for cancel flows, save offers, dunning, and payment recovery
|
||||
|
||||
### 2026-02-17
|
||||
- Added `ad-creative` skill for bulk ad creative generation and performance-based iteration
|
||||
- Added 51 zero-dependency CLI tools for marketing platforms (`tools/clis/`)
|
||||
- Added 31 new integration guides (`tools/integrations/`)
|
||||
- Added 4 email outreach CLIs: hunter, snov, lemlist, instantly
|
||||
- Security hardening: header auth for meta-ads, URL encoding, input validation
|
||||
- All CLIs reviewed via independent codex audit (auth, security, error handling, consistency)
|
||||
|
||||
### 2026-01-27
|
||||
- Initial version tracking added
|
||||
- Added tools registry with 29 integration guides
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: ab-test-setup
|
||||
version: 1.0.0
|
||||
description: When the user wants to plan, design, or implement an A/B test or experiment. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," or "hypothesis." For tracking implementation, see analytics-tracking.
|
||||
description: When the user wants to plan, design, or implement an A/B test or experiment. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," or "how long should I run this test." Use this whenever someone is comparing two approaches and wants to measure which performs better. For tracking implementation, see analytics-tracking. For page-level conversion optimization, see page-cro.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# A/B Test Setup
|
||||
@@ -11,7 +12,7 @@ You are an expert in experimentation and A/B testing. Your goal is to help desig
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before designing a test, understand:
|
||||
|
||||
|
||||
@@ -2,6 +2,17 @@
|
||||
|
||||
Reference for calculating sample sizes and test duration.
|
||||
|
||||
## Contents
|
||||
- Sample Size Fundamentals (required inputs, what these mean)
|
||||
- Sample Size Quick Reference Tables
|
||||
- Duration Calculator (formula, examples, minimum duration rules, maximum duration guidelines)
|
||||
- Online Calculators
|
||||
- Adjusting for Multiple Variants
|
||||
- Common Sample Size Mistakes
|
||||
- When Sample Size Requirements Are Too High
|
||||
- Sequential Testing
|
||||
- Quick Decision Framework
|
||||
|
||||
## Sample Size Fundamentals
|
||||
|
||||
### Required Inputs
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
Templates for planning, documenting, and analyzing experiments.
|
||||
|
||||
## Contents
|
||||
- Test Plan Template
|
||||
- Results Documentation Template
|
||||
- Test Repository Entry Template
|
||||
- Quick Test Brief Template
|
||||
- Stakeholder Update Template
|
||||
- Experiment Prioritization Scorecard
|
||||
- Hypothesis Bank Template
|
||||
|
||||
## Test Plan Template
|
||||
|
||||
```markdown
|
||||
|
||||
@@ -0,0 +1,362 @@
|
||||
---
|
||||
name: ad-creative
|
||||
description: "When the user wants to generate, iterate, or scale ad creative — headlines, descriptions, primary text, or full ad variations — for any paid advertising platform. Also use when the user mentions 'ad copy variations,' 'ad creative,' 'generate headlines,' 'RSA headlines,' 'bulk ad copy,' 'ad iterations,' 'creative testing,' 'ad performance optimization,' 'write me some ads,' 'Facebook ad copy,' 'Google ad headlines,' 'LinkedIn ad text,' or 'I need more ad variations.' Use this whenever someone needs to produce ad copy at scale or iterate on existing ads. For campaign strategy and targeting, see paid-ads. For landing page copy, see copywriting."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Ad Creative
|
||||
|
||||
You are an expert performance creative strategist. Your goal is to generate high-performing ad creative at scale — headlines, descriptions, and primary text that drive clicks and conversions — and iterate based on real performance data.
|
||||
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
### 1. Platform & Format
|
||||
- What platform? (Google Ads, Meta, LinkedIn, TikTok, Twitter/X)
|
||||
- What ad format? (Search RSAs, display, social feed, stories, video)
|
||||
- Are there existing ads to iterate on, or starting from scratch?
|
||||
|
||||
### 2. Product & Offer
|
||||
- What are you promoting? (Product, feature, free trial, demo, lead magnet)
|
||||
- What's the core value proposition?
|
||||
- What makes this different from competitors?
|
||||
|
||||
### 3. Audience & Intent
|
||||
- Who is the target audience?
|
||||
- What stage of awareness? (Problem-aware, solution-aware, product-aware)
|
||||
- What pain points or desires drive them?
|
||||
|
||||
### 4. Performance Data (if iterating)
|
||||
- What creative is currently running?
|
||||
- Which headlines/descriptions are performing best? (CTR, conversion rate, ROAS)
|
||||
- Which are underperforming?
|
||||
- What angles or themes have been tested?
|
||||
|
||||
### 5. Constraints
|
||||
- Brand voice guidelines or words to avoid?
|
||||
- Compliance requirements? (Industry regulations, platform policies)
|
||||
- Any mandatory elements? (Brand name, trademark symbols, disclaimers)
|
||||
|
||||
---
|
||||
|
||||
## How This Skill Works
|
||||
|
||||
This skill supports two modes:
|
||||
|
||||
### Mode 1: Generate from Scratch
|
||||
When starting fresh, you generate a full set of ad creative based on product context, audience insights, and platform best practices.
|
||||
|
||||
### Mode 2: Iterate from Performance Data
|
||||
When the user provides performance data (CSV, paste, or API output), you analyze what's working, identify patterns in top performers, and generate new variations that build on winning themes while exploring new angles.
|
||||
|
||||
The core loop:
|
||||
|
||||
```
|
||||
Pull performance data → Identify winning patterns → Generate new variations → Validate specs → Deliver
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Platform Specs
|
||||
|
||||
**Always enforce these limits.** Never deliver creative that exceeds platform character limits.
|
||||
|
||||
### Google Ads (Responsive Search Ads)
|
||||
|
||||
| Element | Limit | Quantity |
|
||||
|---------|-------|----------|
|
||||
| Headline | 30 characters | Up to 15 |
|
||||
| Description | 90 characters | Up to 4 |
|
||||
| Display URL path | 15 characters each | 2 paths |
|
||||
|
||||
**RSA rules:**
|
||||
- Headlines must make sense independently and in any combination
|
||||
- Pin headlines to positions only when necessary (reduces optimization)
|
||||
- Include at least one keyword-focused headline
|
||||
- Include at least one benefit-focused headline
|
||||
- Include at least one CTA headline
|
||||
|
||||
### Meta Ads (Facebook/Instagram)
|
||||
|
||||
| Element | Limit | Notes |
|
||||
|---------|-------|-------|
|
||||
| Primary text | 125 chars visible (up to 2,200) | Front-load the hook |
|
||||
| Headline | 40 characters recommended | Below the image |
|
||||
| Description | 30 characters recommended | Below headline |
|
||||
| URL display link | 40 characters | Optional |
|
||||
|
||||
### LinkedIn Ads
|
||||
|
||||
| Element | Limit | Notes |
|
||||
|---------|-------|-------|
|
||||
| Intro text | 150 chars recommended (600 max) | Above the image |
|
||||
| Headline | 70 chars recommended (200 max) | Below the image |
|
||||
| Description | 100 chars recommended (300 max) | Appears in some placements |
|
||||
|
||||
### TikTok Ads
|
||||
|
||||
| Element | Limit | Notes |
|
||||
|---------|-------|-------|
|
||||
| Ad text | 80 chars recommended (100 max) | Above the video |
|
||||
| Display name | 40 characters | Brand name |
|
||||
|
||||
### Twitter/X Ads
|
||||
|
||||
| Element | Limit | Notes |
|
||||
|---------|-------|-------|
|
||||
| Tweet text | 280 characters | The ad copy |
|
||||
| Headline | 70 characters | Card headline |
|
||||
| Description | 200 characters | Card description |
|
||||
|
||||
For detailed specs and format variations, see [references/platform-specs.md](references/platform-specs.md).
|
||||
|
||||
---
|
||||
|
||||
## Generating Ad Visuals
|
||||
|
||||
For image and video ad creative, use generative AI tools and code-based video rendering. See [references/generative-tools.md](references/generative-tools.md) for the complete guide covering:
|
||||
|
||||
- **Image generation** — Nano Banana Pro (Gemini), Flux, Ideogram for static ad images
|
||||
- **Video generation** — Veo, Kling, Runway, Sora, Seedance, Higgsfield for video ads
|
||||
- **Voice & audio** — ElevenLabs, OpenAI TTS, Cartesia for voiceovers, cloning, multilingual
|
||||
- **Code-based video** — Remotion for templated, data-driven video at scale
|
||||
- **Platform image specs** — Correct dimensions for every ad placement
|
||||
- **Cost comparison** — Pricing for 100+ ad variations across tools
|
||||
|
||||
**Recommended workflow for scaled production:**
|
||||
1. Generate hero creative with AI tools (exploratory, high-quality)
|
||||
2. Build Remotion templates based on winning patterns
|
||||
3. Batch produce variations with Remotion using data feeds
|
||||
4. Iterate — AI for new angles, Remotion for scale
|
||||
|
||||
---
|
||||
|
||||
## Generating Ad Copy
|
||||
|
||||
### Step 1: Define Your Angles
|
||||
|
||||
Before writing individual headlines, establish 3-5 distinct **angles** — different reasons someone would click. Each angle should tap into a different motivation.
|
||||
|
||||
**Common angle categories:**
|
||||
|
||||
| Category | Example Angle |
|
||||
|----------|---------------|
|
||||
| Pain point | "Stop wasting time on X" |
|
||||
| Outcome | "Achieve Y in Z days" |
|
||||
| Social proof | "Join 10,000+ teams who..." |
|
||||
| Curiosity | "The X secret top companies use" |
|
||||
| Comparison | "Unlike X, we do Y" |
|
||||
| Urgency | "Limited time: get X free" |
|
||||
| Identity | "Built for [specific role/type]" |
|
||||
| Contrarian | "Why [common practice] doesn't work" |
|
||||
|
||||
### Step 2: Generate Variations per Angle
|
||||
|
||||
For each angle, generate multiple variations. Vary:
|
||||
- **Word choice** — synonyms, active vs. passive
|
||||
- **Specificity** — numbers vs. general claims
|
||||
- **Tone** — direct vs. question vs. command
|
||||
- **Structure** — short punch vs. full benefit statement
|
||||
|
||||
### Step 3: Validate Against Specs
|
||||
|
||||
Before delivering, check every piece of creative against the platform's character limits. Flag anything that's over and provide a trimmed alternative.
|
||||
|
||||
### Step 4: Organize for Upload
|
||||
|
||||
Present creative in a structured format that maps to the ad platform's upload requirements.
|
||||
|
||||
---
|
||||
|
||||
## Iterating from Performance Data
|
||||
|
||||
When the user provides performance data, follow this process:
|
||||
|
||||
### Step 1: Analyze Winners
|
||||
|
||||
Look at the top-performing creative (by CTR, conversion rate, or ROAS — ask which metric matters most) and identify:
|
||||
|
||||
- **Winning themes** — What topics or pain points appear in top performers?
|
||||
- **Winning structures** — Questions? Statements? Commands? Numbers?
|
||||
- **Winning word patterns** — Specific words or phrases that recur?
|
||||
- **Character utilization** — Are top performers shorter or longer?
|
||||
|
||||
### Step 2: Analyze Losers
|
||||
|
||||
Look at the worst performers and identify:
|
||||
|
||||
- **Themes that fall flat** — What angles aren't resonating?
|
||||
- **Common patterns in low performers** — Too generic? Too long? Wrong tone?
|
||||
|
||||
### Step 3: Generate New Variations
|
||||
|
||||
Create new creative that:
|
||||
- **Doubles down** on winning themes with fresh phrasing
|
||||
- **Extends** winning angles into new variations
|
||||
- **Tests** 1-2 new angles not yet explored
|
||||
- **Avoids** patterns found in underperformers
|
||||
|
||||
### Step 4: Document the Iteration
|
||||
|
||||
Track what was learned and what's being tested:
|
||||
|
||||
```
|
||||
## Iteration Log
|
||||
- Round: [number]
|
||||
- Date: [date]
|
||||
- Top performers: [list with metrics]
|
||||
- Winning patterns: [summary]
|
||||
- New variations: [count] headlines, [count] descriptions
|
||||
- New angles being tested: [list]
|
||||
- Angles retired: [list]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Writing Quality Standards
|
||||
|
||||
### Headlines That Click
|
||||
|
||||
**Strong headlines:**
|
||||
- Specific ("Cut reporting time 75%") over vague ("Save time")
|
||||
- Benefits ("Ship code faster") over features ("CI/CD pipeline")
|
||||
- Active voice ("Automate your reports") over passive ("Reports are automated")
|
||||
- Include numbers when possible ("3x faster," "in 5 minutes," "10,000+ teams")
|
||||
|
||||
**Avoid:**
|
||||
- Jargon the audience won't recognize
|
||||
- Claims without specificity ("Best," "Leading," "Top")
|
||||
- All caps or excessive punctuation
|
||||
- Clickbait that the landing page can't deliver on
|
||||
|
||||
### Descriptions That Convert
|
||||
|
||||
Descriptions should complement headlines, not repeat them. Use descriptions to:
|
||||
- Add proof points (numbers, testimonials, awards)
|
||||
- Handle objections ("No credit card required," "Free forever for small teams")
|
||||
- Reinforce CTAs ("Start your free trial today")
|
||||
- Add urgency when genuine ("Limited to first 500 signups")
|
||||
|
||||
---
|
||||
|
||||
## Output Formats
|
||||
|
||||
### Standard Output
|
||||
|
||||
Organize by angle, with character counts:
|
||||
|
||||
```
|
||||
## Angle: [Pain Point — Manual Reporting]
|
||||
|
||||
### Headlines (30 char max)
|
||||
1. "Stop Building Reports by Hand" (29)
|
||||
2. "Automate Your Weekly Reports" (28)
|
||||
3. "Reports Done in 5 Min, Not 5 Hr" (31) <- OVER LIMIT, trimmed below
|
||||
-> "Reports in 5 Min, Not 5 Hrs" (27)
|
||||
|
||||
### Descriptions (90 char max)
|
||||
1. "Marketing teams save 10+ hours/week with automated reporting. Start free." (73)
|
||||
2. "Connect your data sources once. Get automated reports forever. No code required." (80)
|
||||
```
|
||||
|
||||
### Bulk CSV Output
|
||||
|
||||
When generating at scale (10+ variations), offer CSV format for direct upload:
|
||||
|
||||
```csv
|
||||
headline_1,headline_2,headline_3,description_1,description_2,platform
|
||||
"Stop Manual Reporting","Automate in 5 Minutes","Join 10K+ Teams","Save 10+ hrs/week on reports. Start free.","Connect data sources once. Reports forever.","google_ads"
|
||||
```
|
||||
|
||||
### Iteration Report
|
||||
|
||||
When iterating, include a summary:
|
||||
|
||||
```
|
||||
## Performance Summary
|
||||
- Analyzed: [X] headlines, [Y] descriptions
|
||||
- Top performer: "[headline]" — [metric]: [value]
|
||||
- Worst performer: "[headline]" — [metric]: [value]
|
||||
- Pattern: [observation]
|
||||
|
||||
## New Creative
|
||||
[organized variations]
|
||||
|
||||
## Recommendations
|
||||
- [What to pause, what to scale, what to test next]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Batch Generation Workflow
|
||||
|
||||
For large-scale creative production (Anthropic's growth team generates 100+ variations per cycle):
|
||||
|
||||
### 1. Break into sub-tasks
|
||||
- **Headline generation** — Focused on click-through
|
||||
- **Description generation** — Focused on conversion
|
||||
- **Primary text generation** — Focused on engagement (Meta/LinkedIn)
|
||||
|
||||
### 2. Generate in waves
|
||||
- Wave 1: Core angles (3-5 angles, 5 variations each)
|
||||
- Wave 2: Extended variations on top 2 angles
|
||||
- Wave 3: Wild card angles (contrarian, emotional, specific)
|
||||
|
||||
### 3. Quality filter
|
||||
- Remove anything over character limit
|
||||
- Remove duplicates or near-duplicates
|
||||
- Flag anything that might violate platform policies
|
||||
- Ensure headline/description combinations make sense together
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
- **Writing headlines that only work together** — RSA headlines get combined randomly
|
||||
- **Ignoring character limits** — Platforms truncate without warning
|
||||
- **All variations sound the same** — Vary angles, not just word choice
|
||||
- **No CTA headlines** — Always include action-oriented headlines
|
||||
- **Generic descriptions** — "Learn more about our solution" wastes the slot
|
||||
- **Iterating without data** — Gut feelings are less reliable than metrics
|
||||
- **Testing too many things at once** — Change one variable per test cycle
|
||||
- **Retiring creative too early** — Allow 1,000+ impressions before judging
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For pulling performance data and managing campaigns, see the [tools registry](../../tools/REGISTRY.md).
|
||||
|
||||
| Platform | Pull Performance Data | Manage Campaigns | Guide |
|
||||
|----------|:---------------------:|:----------------:|-------|
|
||||
| **Google Ads** | `google-ads campaigns list`, `google-ads reports get` | `google-ads campaigns create` | [google-ads.md](../../tools/integrations/google-ads.md) |
|
||||
| **Meta Ads** | `meta-ads insights get` | `meta-ads campaigns list` | [meta-ads.md](../../tools/integrations/meta-ads.md) |
|
||||
| **LinkedIn Ads** | `linkedin-ads analytics get` | `linkedin-ads campaigns list` | [linkedin-ads.md](../../tools/integrations/linkedin-ads.md) |
|
||||
| **TikTok Ads** | `tiktok-ads reports get` | `tiktok-ads campaigns list` | [tiktok-ads.md](../../tools/integrations/tiktok-ads.md) |
|
||||
|
||||
### Workflow: Pull Data, Analyze, Generate
|
||||
|
||||
```bash
|
||||
# 1. Pull recent ad performance
|
||||
node tools/clis/google-ads.js reports get --type ad_performance --date-range last_30_days
|
||||
|
||||
# 2. Analyze output (identify top/bottom performers)
|
||||
# 3. Feed winning patterns into this skill
|
||||
# 4. Generate new variations
|
||||
# 5. Upload to platform
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **paid-ads**: For campaign strategy, targeting, budgets, and optimization
|
||||
- **copywriting**: For landing page copy (where ad traffic lands)
|
||||
- **ab-test-setup**: For structuring creative tests with statistical rigor
|
||||
- **marketing-psychology**: For psychological principles behind high-performing creative
|
||||
- **copy-editing**: For polishing ad copy before launch
|
||||
@@ -0,0 +1,637 @@
|
||||
# Generative AI Tools for Ad Creative
|
||||
|
||||
Reference for using AI image generators, video generators, and code-based video tools to produce ad visuals at scale.
|
||||
|
||||
---
|
||||
|
||||
## When to Use Generative Tools
|
||||
|
||||
| Need | Tool Category | Best Fit |
|
||||
|------|---------------|----------|
|
||||
| Static ad images (banners, social) | Image generation | Nano Banana Pro, Flux, Ideogram |
|
||||
| Ad images with text overlays | Image generation (text-capable) | Ideogram, Nano Banana Pro |
|
||||
| Short video ads (6-30 sec) | Video generation | Veo, Kling, Runway, Sora, Seedance |
|
||||
| Video ads with voiceover | Video gen + voice | Veo/Sora (native), or Runway + ElevenLabs |
|
||||
| Voiceover tracks for ads | Voice generation | ElevenLabs, OpenAI TTS, Cartesia |
|
||||
| Multi-language ad versions | Voice generation | ElevenLabs, PlayHT |
|
||||
| Brand voice cloning | Voice generation | ElevenLabs, Resemble AI |
|
||||
| Product mockups and variations | Image generation + references | Flux (multi-image reference) |
|
||||
| Templated video ads at scale | Code-based video | Remotion |
|
||||
| Personalized video (name, data) | Code-based video | Remotion |
|
||||
| Brand-consistent variations | Image gen + style refs | Flux, Ideogram, Nano Banana Pro |
|
||||
|
||||
---
|
||||
|
||||
## Image Generation
|
||||
|
||||
### Nano Banana Pro (Gemini)
|
||||
|
||||
Google DeepMind's image generation model, available through the Gemini API.
|
||||
|
||||
**Best for:** High-quality ad images, product visuals, text rendering
|
||||
**API:** Gemini API (Google AI Studio, Vertex AI)
|
||||
**Pricing:** ~$0.04/image (Gemini 2.5 Flash Image), ~$0.24/4K image (Nano Banana Pro)
|
||||
|
||||
**Strengths:**
|
||||
- Strong text rendering in images (logos, headlines)
|
||||
- Native image editing (modify existing images with prompts)
|
||||
- Available through the same Gemini API used for text generation
|
||||
- Supports both generation and editing in one model
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Generate social media ad images from text descriptions
|
||||
- Create product mockup variations
|
||||
- Edit existing ad images (swap backgrounds, change colors)
|
||||
- Generate images with headline text baked in
|
||||
|
||||
**API example:**
|
||||
```bash
|
||||
# Using the Gemini API for image generation
|
||||
curl -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-image:generateContent" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "x-goog-api-key: $GEMINI_API_KEY" \
|
||||
-d '{
|
||||
"contents": [{"parts": [{"text": "Create a clean, modern social media ad image for a project management tool. Show a laptop with a kanban board interface. Bright, professional, 16:9 ratio."}]}],
|
||||
"generationConfig": {"responseModalities": ["TEXT", "IMAGE"]}
|
||||
}'
|
||||
```
|
||||
|
||||
**Docs:** [Gemini Image Generation](https://ai.google.dev/gemini-api/docs/image-generation)
|
||||
|
||||
---
|
||||
|
||||
### Flux (Black Forest Labs)
|
||||
|
||||
Open-weight image generation models with API access through Replicate and BFL's native API.
|
||||
|
||||
**Best for:** Photorealistic images, brand-consistent variations, multi-reference generation
|
||||
**API:** Replicate, BFL API, fal.ai
|
||||
**Pricing:** ~$0.01-0.06/image depending on model and resolution
|
||||
|
||||
**Model variants:**
|
||||
| Model | Speed | Quality | Cost | Best For |
|
||||
|-------|-------|---------|------|----------|
|
||||
| Flux 2 Pro | ~6 sec | Highest | $0.015/MP | Final production assets |
|
||||
| Flux 2 Flex | ~22 sec | High + editing | $0.06/MP | Iterative editing |
|
||||
| Flux 2 Dev | ~2.5 sec | Good | $0.012/MP | Rapid prototyping |
|
||||
| Flux 2 Klein | Fastest | Good | Lowest | High-volume batch generation |
|
||||
|
||||
**Strengths:**
|
||||
- Multi-image reference (up to 8 images) for consistent identity across ads
|
||||
- Product consistency — same product in different contexts
|
||||
- Style transfer from reference images
|
||||
- Open-weight Dev model for self-hosting
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Generate 50+ ad variations with consistent product/person identity
|
||||
- Create product-in-context images (your SaaS on different devices)
|
||||
- Style-match to existing brand assets using reference images
|
||||
- Rapid A/B test image variations
|
||||
|
||||
**Docs:** [Replicate Flux](https://replicate.com/black-forest-labs/flux-2-pro), [BFL API](https://docs.bfl.ml/)
|
||||
|
||||
---
|
||||
|
||||
### Ideogram
|
||||
|
||||
Specialized in typography and text rendering within images.
|
||||
|
||||
**Best for:** Ad banners with text, branded graphics, social ad images with headlines
|
||||
**API:** Ideogram API, Runware
|
||||
**Pricing:** ~$0.06/image (API), ~$0.009/image (subscription)
|
||||
|
||||
**Strengths:**
|
||||
- Best-in-class text rendering (~90% accuracy vs ~30% for most tools)
|
||||
- Style reference system (upload up to 3 reference images)
|
||||
- 4.3 billion style presets for consistent brand aesthetics
|
||||
- Strong at logos and branded typography
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Generate ad banners with headline text directly in the image
|
||||
- Create social media graphics with branded text overlays
|
||||
- Produce multiple design variations with consistent typography
|
||||
- Generate promotional materials without needing a designer for each iteration
|
||||
|
||||
**Docs:** [Ideogram API](https://developer.ideogram.ai/), [Ideogram](https://ideogram.ai/)
|
||||
|
||||
---
|
||||
|
||||
### Other Image Tools
|
||||
|
||||
| Tool | Best For | API Status | Notes |
|
||||
|------|----------|------------|-------|
|
||||
| **DALL-E 3** (OpenAI) | General image generation | Official API | Integrated with ChatGPT, good text rendering |
|
||||
| **Midjourney** | Artistic, high-aesthetic images | No official public API | Discord-based; unofficial APIs exist but risk bans |
|
||||
| **Stable Diffusion** | Self-hosted, customizable | Open source | Best for teams with GPU infrastructure |
|
||||
|
||||
---
|
||||
|
||||
## Video Generation
|
||||
|
||||
### Google Veo
|
||||
|
||||
Google DeepMind's video generation model, available through the Gemini API and Vertex AI.
|
||||
|
||||
**Best for:** High-quality video ads with native audio, vertical video for social
|
||||
**API:** Gemini API, Vertex AI
|
||||
**Pricing:** ~$0.15/sec (Veo 3.1 Fast), ~$0.40/sec (Veo 3.1 Standard)
|
||||
|
||||
**Capabilities:**
|
||||
- Up to 60 seconds at 1080p
|
||||
- Native audio generation (dialogue, sound effects, ambient)
|
||||
- Vertical 9:16 output for Stories/Reels/Shorts
|
||||
- Upscale to 4K
|
||||
- Text-to-video and image-to-video
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Generate short video ads (15-30 sec) from text descriptions
|
||||
- Create vertical video ads for TikTok, Reels, Shorts
|
||||
- Produce product demos with voiceover
|
||||
- Generate multiple video variations from the same prompt with different styles
|
||||
|
||||
**Docs:** [Veo on Vertex AI](https://cloud.google.com/vertex-ai/generative-ai/docs/video/overview)
|
||||
|
||||
---
|
||||
|
||||
### Kling (Kuaishou)
|
||||
|
||||
Video generation with simultaneous audio-visual generation and camera controls.
|
||||
|
||||
**Best for:** Cinematic video ads, longer-form content, audio-synced video
|
||||
**API:** Kling API, PiAPI, fal.ai
|
||||
**Pricing:** ~$0.09/sec (via fal.ai third-party)
|
||||
|
||||
**Capabilities:**
|
||||
- Up to 3 minutes at 1080p/30-48fps
|
||||
- Simultaneous audio-visual generation (Kling 2.6)
|
||||
- Text-to-video and image-to-video
|
||||
- Motion and camera controls
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Longer product explainer videos
|
||||
- Cinematic brand videos with synchronized audio
|
||||
- Animate product images into video ads
|
||||
|
||||
**Docs:** [Kling AI Developer](https://klingai.com/global/dev/model/video)
|
||||
|
||||
---
|
||||
|
||||
### Runway
|
||||
|
||||
Video generation and editing platform with strong controllability.
|
||||
|
||||
**Best for:** Controlled video generation, style-consistent content, editing existing footage
|
||||
**API:** Runway Developer Portal
|
||||
|
||||
**Capabilities:**
|
||||
- Gen-4: Character/scene consistency across shots
|
||||
- Motion brush and camera controls
|
||||
- Image-to-video with reference images
|
||||
- Video-to-video style transfer
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Generate video ads with consistent characters/products across scenes
|
||||
- Style-transfer existing footage to match brand aesthetics
|
||||
- Extend or remix existing video content
|
||||
|
||||
**Docs:** [Runway API](https://docs.dev.runwayml.com/)
|
||||
|
||||
---
|
||||
|
||||
### Sora 2 (OpenAI)
|
||||
|
||||
OpenAI's video generation model with synchronized audio.
|
||||
|
||||
**Best for:** High-fidelity video with dialogue and sound
|
||||
**API:** OpenAI API
|
||||
**Pricing:** Free tier available; Pro from $0.10-0.50/sec depending on resolution
|
||||
|
||||
**Capabilities:**
|
||||
- Up to 60 seconds with synchronized audio
|
||||
- Dialogue, sound effects, and ambient audio
|
||||
- sora-2 (fast) and sora-2-pro (quality) variants
|
||||
- Text-to-video and image-to-video
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Video testimonials and talking-head style ads
|
||||
- Product demo videos with narration
|
||||
- Narrative brand videos
|
||||
|
||||
**Docs:** [OpenAI Video Generation](https://platform.openai.com/docs/guides/video-generation)
|
||||
|
||||
---
|
||||
|
||||
### Seedance 2.0 (ByteDance)
|
||||
|
||||
ByteDance's video generation model with simultaneous audio-visual generation and multimodal inputs.
|
||||
|
||||
**Best for:** Fast, affordable video ads with native audio, multimodal reference inputs
|
||||
**API:** BytePlus (official), Replicate, WaveSpeedAI, fal.ai (third-party); OpenAI-compatible API format
|
||||
**Pricing:** ~$0.10-0.80/min depending on resolution (estimated 10-100x cheaper than Sora 2 per clip)
|
||||
|
||||
**Capabilities:**
|
||||
- Up to 20 seconds at up to 2K resolution
|
||||
- Simultaneous audio-visual generation (Dual-Branch Diffusion Transformer)
|
||||
- Text-to-video and image-to-video
|
||||
- Up to 12 reference files for multimodal input
|
||||
- OpenAI-compatible API structure
|
||||
|
||||
**Ad creative use cases:**
|
||||
- High-volume short video ad production at low cost
|
||||
- Video ads with synchronized voiceover and sound effects in one pass
|
||||
- Multi-reference generation (feed product images, brand assets, style references)
|
||||
- Rapid iteration on video ad concepts
|
||||
|
||||
**Docs:** [Seedance](https://seed.bytedance.com/en/seedance2_0)
|
||||
|
||||
---
|
||||
|
||||
### Higgsfield
|
||||
|
||||
Full-stack video creation platform with cinematic camera controls.
|
||||
|
||||
**Best for:** Social video ads, cinematic style, mobile-first content
|
||||
**Platform:** [higgsfield.ai](https://higgsfield.ai/)
|
||||
|
||||
**Capabilities:**
|
||||
- 50+ professional camera movements (zooms, pans, FPV drone shots)
|
||||
- Image-to-video animation
|
||||
- Built-in editing, transitions, and keyframing
|
||||
- All-in-one workflow: image gen, animation, editing
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Social media video ads with cinematic feel
|
||||
- Animate product images into dynamic video
|
||||
- Create multiple video variations with different camera styles
|
||||
- Quick-turn video content for social campaigns
|
||||
|
||||
---
|
||||
|
||||
### Video Tool Comparison
|
||||
|
||||
| Tool | Max Length | Audio | Resolution | API | Best For |
|
||||
|------|-----------|-------|------------|-----|----------|
|
||||
| **Veo 3.1** | 60 sec | Native | 1080p/4K | Gemini | Vertical social video |
|
||||
| **Kling 2.6** | 3 min | Native | 1080p | Third-party | Longer cinematic |
|
||||
| **Runway Gen-4** | 10 sec | No | 1080p | Official | Controlled, consistent |
|
||||
| **Sora 2** | 60 sec | Native | 1080p | Official | Dialogue-heavy |
|
||||
| **Seedance 2.0** | 20 sec | Native | 2K | Official + third-party | Affordable high-volume |
|
||||
| **Higgsfield** | Varies | Yes | 1080p | Web-based | Social, mobile-first |
|
||||
|
||||
---
|
||||
|
||||
## Voice & Audio Generation
|
||||
|
||||
For layering realistic voiceovers onto video ads, adding narration to product demos, or generating audio for Remotion-rendered videos. These tools turn ad scripts into natural-sounding voice tracks.
|
||||
|
||||
### When to Use Voice Tools
|
||||
|
||||
Many video generators (Veo, Kling, Sora, Seedance) now include native audio. Use standalone voice tools when you need:
|
||||
|
||||
- **Voiceover on silent video** — Runway Gen-4 and Remotion produce silent output
|
||||
- **Brand voice consistency** — Clone a specific voice for all ads
|
||||
- **Multi-language versions** — Same ad script in 20+ languages
|
||||
- **Script iteration** — Re-record voiceover without reshooting video
|
||||
- **Precise control** — Exact timing, emotion, and pacing
|
||||
|
||||
---
|
||||
|
||||
### ElevenLabs
|
||||
|
||||
The market leader in realistic voice generation and voice cloning.
|
||||
|
||||
**Best for:** Most natural-sounding voiceovers, brand voice cloning, multilingual
|
||||
**API:** REST API with streaming support
|
||||
**Pricing:** ~$0.12-0.30 per 1,000 characters depending on plan; starts at $5/month
|
||||
|
||||
**Capabilities:**
|
||||
- 29+ languages with natural accent and intonation
|
||||
- Voice cloning from short audio clips (instant) or longer recordings (professional)
|
||||
- Emotion and style control
|
||||
- Streaming for real-time generation
|
||||
- Voice library with hundreds of pre-built voices
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Generate voiceover tracks for video ads
|
||||
- Clone your brand spokesperson's voice for all ad variations
|
||||
- Produce the same ad in 10+ languages from one script
|
||||
- A/B test different voice styles (authoritative vs. friendly vs. urgent)
|
||||
|
||||
**API example:**
|
||||
```bash
|
||||
curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}" \
|
||||
-H "xi-api-key: $ELEVENLABS_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"text": "Stop wasting hours on manual reporting. Try DataFlow free for 14 days.",
|
||||
"model_id": "eleven_multilingual_v2",
|
||||
"voice_settings": {"stability": 0.5, "similarity_boost": 0.75}
|
||||
}' --output voiceover.mp3
|
||||
```
|
||||
|
||||
**Docs:** [ElevenLabs API](https://elevenlabs.io/docs/api-reference/text-to-speech)
|
||||
|
||||
---
|
||||
|
||||
### OpenAI TTS
|
||||
|
||||
Simple, affordable text-to-speech built into the OpenAI API.
|
||||
|
||||
**Best for:** Quick voiceovers, cost-effective at scale, simple integration
|
||||
**API:** OpenAI API (same SDK as GPT/DALL-E)
|
||||
**Pricing:** $15/million chars (standard), $30/million chars (HD); ~$0.015/min with gpt-4o-mini-tts
|
||||
|
||||
**Capabilities:**
|
||||
- 13 built-in voices (no custom cloning)
|
||||
- Multiple languages
|
||||
- Real-time streaming
|
||||
- HD quality option
|
||||
- Simple API — same SDK you already use for GPT
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Fast, cheap voiceover for draft/test ad versions
|
||||
- High-volume narration at low cost
|
||||
- Prototype ad audio before investing in premium voice
|
||||
|
||||
**Docs:** [OpenAI TTS](https://platform.openai.com/docs/guides/text-to-speech)
|
||||
|
||||
---
|
||||
|
||||
### Cartesia Sonic
|
||||
|
||||
Ultra-low latency voice generation built for real-time applications.
|
||||
|
||||
**Best for:** Real-time voice, lowest latency, emotional expressiveness
|
||||
**API:** REST + WebSocket streaming
|
||||
**Pricing:** Starts at $5/month; pay-as-you-go from $0.03/min
|
||||
|
||||
**Capabilities:**
|
||||
- 40ms time-to-first-audio (fastest in class)
|
||||
- 15+ languages
|
||||
- Nonverbal expressiveness: laughter, breathing, emotional inflections
|
||||
- Sonic Turbo for even lower latency
|
||||
- Streaming API for real-time generation
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Real-time ad preview during creative iteration
|
||||
- Interactive demo videos with dynamic narration
|
||||
- Ads requiring natural laughter, sighs, or emotional reactions
|
||||
|
||||
**Docs:** [Cartesia Sonic](https://docs.cartesia.ai/build-with-cartesia/tts-models/latest)
|
||||
|
||||
---
|
||||
|
||||
### Voicebox (Open Source)
|
||||
|
||||
Free, local-first voice synthesis studio powered by Qwen3-TTS. The open-source alternative to ElevenLabs.
|
||||
|
||||
**Best for:** Free voice cloning, local/private generation, zero-cost batch production
|
||||
**API:** Local REST API at `http://localhost:8000`
|
||||
**Pricing:** Free (MIT license). Runs entirely on your machine.
|
||||
**Stack:** Tauri (Rust) + React + FastAPI (Python)
|
||||
|
||||
**Capabilities:**
|
||||
- Voice cloning from short audio samples via Qwen3-TTS
|
||||
- Multi-language support (English, Chinese, more planned)
|
||||
- Multi-track timeline editor for composing conversations
|
||||
- 4-5x faster inference on Apple Silicon via MLX Metal acceleration
|
||||
- Local REST API for programmatic generation
|
||||
- No cloud dependency — all processing on-device
|
||||
|
||||
**Ad creative use cases:**
|
||||
- Free voice cloning for brand spokesperson across all ad variations
|
||||
- Batch generate voiceovers without per-character costs
|
||||
- Private/local generation when ad content is sensitive or pre-launch
|
||||
- Prototype voice variations before committing to a paid service
|
||||
|
||||
**API example:**
|
||||
```bash
|
||||
curl -X POST http://localhost:8000/generate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text": "Stop wasting hours on manual reporting.", "profile_id": "abc123", "language": "en"}'
|
||||
```
|
||||
|
||||
**Install:** Desktop apps for macOS and Windows at [voicebox.sh](https://voicebox.sh), or build from source:
|
||||
```bash
|
||||
git clone https://github.com/jamiepine/voicebox.git
|
||||
cd voicebox && make setup && make dev
|
||||
```
|
||||
|
||||
**Docs:** [GitHub](https://github.com/jamiepine/voicebox)
|
||||
|
||||
---
|
||||
|
||||
### Other Voice Tools
|
||||
|
||||
| Tool | Best For | Differentiator | API |
|
||||
|------|----------|---------------|-----|
|
||||
| **PlayHT** | Large voice library, low latency | 900+ voices, <300ms latency, ultra-realistic | [play.ht](https://play.ht/) |
|
||||
| **Resemble AI** | Enterprise voice cloning | On-premise deployment, real-time speech-to-speech | [resemble.ai](https://www.resemble.ai/) |
|
||||
| **WellSaid Labs** | Ethical, commercial-safe voices | Voices from compensated actors, safe for commercial use | [wellsaid.io](https://www.wellsaid.io/) |
|
||||
| **Fish Audio** | Budget-friendly, emotion control | ~50-70% cheaper than ElevenLabs, emotion tags | [fish.audio](https://fish.audio/) |
|
||||
| **Murf AI** | Non-technical teams | Browser-based studio, 200+ voices | [murf.ai](https://murf.ai/) |
|
||||
| **Google Cloud TTS** | Google ecosystem, scale | 220+ voices, 40+ languages, enterprise SLAs | [Google TTS](https://cloud.google.com/text-to-speech) |
|
||||
| **Amazon Polly** | AWS ecosystem, cost | Neural voices, SSML control, cheap at volume | [Amazon Polly](https://aws.amazon.com/polly/) |
|
||||
|
||||
---
|
||||
|
||||
### Voice Tool Comparison
|
||||
|
||||
| Tool | Quality | Cloning | Languages | Latency | Price/1K chars |
|
||||
|------|---------|---------|-----------|---------|----------------|
|
||||
| **ElevenLabs** | Best | Yes (instant + pro) | 29+ | ~200ms | $0.12-0.30 |
|
||||
| **OpenAI TTS** | Good | No | 13+ | ~300ms | $0.015-0.030 |
|
||||
| **Cartesia Sonic** | Very good | No | 15+ | ~40ms | ~$0.03/min |
|
||||
| **PlayHT** | Very good | Yes | 140+ | <300ms | ~$0.10-0.20 |
|
||||
| **Fish Audio** | Good | Yes | 13+ | ~200ms | ~$0.05-0.10 |
|
||||
| **WellSaid** | Very good | No (actor voices) | English | ~300ms | Custom pricing |
|
||||
| **Voicebox** | Good | Yes (local) | 2+ | Local | Free (open source) |
|
||||
|
||||
### Choosing a Voice Tool
|
||||
|
||||
```
|
||||
Need voiceover for ads?
|
||||
├── Need to clone a specific brand voice?
|
||||
│ ├── Best quality → ElevenLabs
|
||||
│ ├── Enterprise/on-premise → Resemble AI
|
||||
│ └── Budget-friendly → Fish Audio, PlayHT
|
||||
├── Need multilingual (same ad, many languages)?
|
||||
│ ├── Most languages → PlayHT (140+)
|
||||
│ └── Best quality → ElevenLabs (29+)
|
||||
├── Need free / open source / local?
|
||||
│ └── Voicebox (MIT, runs on your machine)
|
||||
├── Need cheap, fast, good-enough?
|
||||
│ └── OpenAI TTS ($0.015/min)
|
||||
├── Need commercially-safe licensing?
|
||||
│ └── WellSaid Labs (actor-compensated voices)
|
||||
└── Need real-time/interactive?
|
||||
└── Cartesia Sonic (40ms TTFA)
|
||||
```
|
||||
|
||||
### Workflow: Voice + Video
|
||||
|
||||
```
|
||||
1. Write ad script (use ad-creative skill for copy)
|
||||
2. Generate voiceover with ElevenLabs/OpenAI TTS
|
||||
3. Generate or render video:
|
||||
a. Silent video from Runway/Remotion → layer voice track
|
||||
b. Or use Veo/Sora/Seedance with native audio (skip separate VO)
|
||||
4. Combine with ffmpeg if layering separately:
|
||||
ffmpeg -i video.mp4 -i voiceover.mp3 -c:v copy -c:a aac output.mp4
|
||||
5. Generate variations (different scripts, voices, or languages)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Code-Based Video: Remotion
|
||||
|
||||
For templated, data-driven video ads at scale, Remotion is the best option. Unlike AI video generators that produce unique video from prompts, Remotion uses React code to render deterministic, brand-perfect video from templates and data.
|
||||
|
||||
**Best for:** Templated ad variations, personalized video, brand-consistent production
|
||||
**Stack:** React + TypeScript
|
||||
**Pricing:** Free for individuals/small teams; commercial license required for 4+ employees
|
||||
**Docs:** [remotion.dev](https://www.remotion.dev/)
|
||||
|
||||
### Why Remotion for Ads
|
||||
|
||||
| AI Video Generators | Remotion |
|
||||
|---------------------|----------|
|
||||
| Unique output each time | Deterministic, pixel-perfect |
|
||||
| Prompt-based, less control | Full code control over every frame |
|
||||
| Hard to match brand exactly | Exact brand colors, fonts, spacing |
|
||||
| One-at-a-time generation | Batch render hundreds from data |
|
||||
| No dynamic data insertion | Personalize with names, prices, stats |
|
||||
|
||||
### Ad Creative Use Cases
|
||||
|
||||
**1. Dynamic product ads**
|
||||
Feed a JSON array of products and render a unique video ad for each:
|
||||
```tsx
|
||||
// Simplified Remotion component for product ads
|
||||
export const ProductAd: React.FC<{
|
||||
productName: string;
|
||||
price: string;
|
||||
imageUrl: string;
|
||||
tagline: string;
|
||||
}> = ({productName, price, imageUrl, tagline}) => {
|
||||
return (
|
||||
<AbsoluteFill style={{backgroundColor: '#fff'}}>
|
||||
<Img src={imageUrl} style={{width: 400, height: 400}} />
|
||||
<h1>{productName}</h1>
|
||||
<p>{tagline}</p>
|
||||
<div className="price">{price}</div>
|
||||
<div className="cta">Shop Now</div>
|
||||
</AbsoluteFill>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**2. A/B test video variations**
|
||||
Render the same template with different headlines, CTAs, or color schemes:
|
||||
```tsx
|
||||
const variations = [
|
||||
{headline: "Save 50% Today", cta: "Get the Deal", theme: "urgent"},
|
||||
{headline: "Join 10K+ Teams", cta: "Start Free", theme: "social-proof"},
|
||||
{headline: "Built for Speed", cta: "Try It Now", theme: "benefit"},
|
||||
];
|
||||
// Render all variations programmatically
|
||||
```
|
||||
|
||||
**3. Personalized outreach videos**
|
||||
Generate videos addressing prospects by name for cold outreach or sales.
|
||||
|
||||
**4. Social ad batch production**
|
||||
Render the same content across different aspect ratios:
|
||||
- 1:1 for feed
|
||||
- 9:16 for Stories/Reels
|
||||
- 16:9 for YouTube
|
||||
|
||||
### Remotion Workflow for Ad Creative
|
||||
|
||||
```
|
||||
1. Design template in React (or use AI to generate the component)
|
||||
2. Define data schema (products, headlines, CTAs, images)
|
||||
3. Feed data array into template
|
||||
4. Batch render all variations
|
||||
5. Upload to ad platform
|
||||
```
|
||||
|
||||
### Getting Started
|
||||
|
||||
```bash
|
||||
# Create a new Remotion project
|
||||
npx create-video@latest
|
||||
|
||||
# Render a single video
|
||||
npx remotion render src/index.ts MyComposition out/video.mp4
|
||||
|
||||
# Batch render from data
|
||||
npx remotion render src/index.ts MyComposition --props='{"data": [...]}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Choosing the Right Tool
|
||||
|
||||
### Decision Tree
|
||||
|
||||
```
|
||||
Need video ads?
|
||||
├── Templated, data-driven (same structure, different data)
|
||||
│ └── Use Remotion
|
||||
├── Unique creative from prompts (exploratory)
|
||||
│ ├── Need dialogue/voiceover? → Sora 2, Veo 3.1, Kling 2.6, Seedance 2.0
|
||||
│ ├── Need consistency across scenes? → Runway Gen-4
|
||||
│ ├── Need vertical social video? → Veo 3.1 (native 9:16)
|
||||
│ ├── Need high volume at low cost? → Seedance 2.0
|
||||
│ └── Need cinematic camera work? → Higgsfield, Kling
|
||||
└── Both → Use AI gen for hero creative, Remotion for variations
|
||||
|
||||
Need image ads?
|
||||
├── Need text/headlines in image? → Ideogram
|
||||
├── Need product consistency across variations? → Flux (multi-ref)
|
||||
├── Need quick iterations on existing images? → Nano Banana Pro
|
||||
├── Need highest visual quality? → Flux Pro, Midjourney
|
||||
└── Need high volume at low cost? → Flux Klein, Nano Banana
|
||||
```
|
||||
|
||||
### Cost Comparison for 100 Ad Variations
|
||||
|
||||
| Approach | Tool | Approximate Cost |
|
||||
|----------|------|-----------------|
|
||||
| 100 static images | Nano Banana Pro | ~$4-24 |
|
||||
| 100 static images | Flux Dev | ~$1-2 |
|
||||
| 100 static images | Ideogram API | ~$6 |
|
||||
| 100 × 15-sec videos | Veo 3.1 Fast | ~$225 |
|
||||
| 100 × 15-sec videos | Remotion (templated) | ~$0 (self-hosted render) |
|
||||
| 10 hero videos + 90 templated | Veo + Remotion | ~$22 + render time |
|
||||
|
||||
### Recommended Workflow for Scaled Ad Production
|
||||
|
||||
1. **Generate hero creative** with AI (Nano Banana, Flux, Veo) — high-quality, exploratory
|
||||
2. **Build templates** in Remotion based on winning creative patterns
|
||||
3. **Batch produce variations** with Remotion using data (products, headlines, CTAs)
|
||||
4. **Iterate** — use AI tools for new angles, Remotion for scale
|
||||
|
||||
This hybrid approach gives you the creative exploration of AI generators and the consistency and scale of code-based rendering.
|
||||
|
||||
---
|
||||
|
||||
## Platform-Specific Image Specs
|
||||
|
||||
When generating images for ads, request the correct dimensions:
|
||||
|
||||
| Platform | Placement | Aspect Ratio | Recommended Size |
|
||||
|----------|-----------|-------------|-----------------|
|
||||
| Meta Feed | Single image | 1:1 | 1080x1080 |
|
||||
| Meta Stories/Reels | Vertical | 9:16 | 1080x1920 |
|
||||
| Meta Carousel | Square | 1:1 | 1080x1080 |
|
||||
| Google Display | Landscape | 1.91:1 | 1200x628 |
|
||||
| Google Display | Square | 1:1 | 1200x1200 |
|
||||
| LinkedIn Feed | Landscape | 1.91:1 | 1200x627 |
|
||||
| LinkedIn Feed | Square | 1:1 | 1200x1200 |
|
||||
| TikTok Feed | Vertical | 9:16 | 1080x1920 |
|
||||
| Twitter/X Feed | Landscape | 16:9 | 1200x675 |
|
||||
| Twitter/X Card | Landscape | 1.91:1 | 800x418 |
|
||||
|
||||
Include these dimensions in your generation prompts to avoid needing to crop or resize.
|
||||
@@ -0,0 +1,213 @@
|
||||
# Platform Specs Reference
|
||||
|
||||
Complete character limits, format requirements, and best practices for each ad platform.
|
||||
|
||||
---
|
||||
|
||||
## Google Ads
|
||||
|
||||
### Responsive Search Ads (RSAs)
|
||||
|
||||
| Element | Character Limit | Required | Notes |
|
||||
|---------|----------------|----------|-------|
|
||||
| Headline | 30 chars | 3 minimum, 15 max | Any 3 may be shown together |
|
||||
| Description | 90 chars | 2 minimum, 4 max | Any 2 may be shown together |
|
||||
| Display path 1 | 15 chars | Optional | Appears after domain in URL |
|
||||
| Display path 2 | 15 chars | Optional | Appears after path 1 |
|
||||
| Final URL | No limit | Required | Landing page URL |
|
||||
|
||||
**Combination rules:**
|
||||
- Google selects up to 3 headlines and 2 descriptions to show
|
||||
- Headlines appear separated by " | " or stacked
|
||||
- Any headline can appear in any position unless pinned
|
||||
- Pinning reduces Google's ability to optimize — use sparingly
|
||||
|
||||
**Pinning strategy:**
|
||||
- Pin your brand name to position 1 if brand guidelines require it
|
||||
- Pin your strongest CTA to position 2 or 3
|
||||
- Leave most headlines unpinned for machine learning
|
||||
|
||||
**Headline mix recommendation (15 headlines):**
|
||||
- 3-4 keyword-focused (match search intent)
|
||||
- 3-4 benefit-focused (what they get)
|
||||
- 2-3 social proof (numbers, awards, customers)
|
||||
- 2-3 CTA-focused (action to take)
|
||||
- 1-2 differentiators (why you over competitors)
|
||||
- 1 brand name headline
|
||||
|
||||
**Description mix recommendation (4 descriptions):**
|
||||
- 1 benefit + proof point
|
||||
- 1 feature + outcome
|
||||
- 1 social proof + CTA
|
||||
- 1 urgency/offer + CTA (if applicable)
|
||||
|
||||
### Performance Max
|
||||
|
||||
| Element | Character Limit | Notes |
|
||||
|---------|----------------|-------|
|
||||
| Headline | 30 chars (5 required) | Short headlines for various placements |
|
||||
| Long headline | 90 chars (5 required) | Used in display, video, discover |
|
||||
| Description | 90 chars (1 required, 5 max) | Accompany various ad formats |
|
||||
| Business name | 25 chars | Required |
|
||||
|
||||
### Display Ads
|
||||
|
||||
| Element | Character Limit |
|
||||
|---------|----------------|
|
||||
| Headline | 30 chars |
|
||||
| Long headline | 90 chars |
|
||||
| Description | 90 chars |
|
||||
| Business name | 25 chars |
|
||||
|
||||
---
|
||||
|
||||
## Meta Ads (Facebook & Instagram)
|
||||
|
||||
### Single Image / Video / Carousel
|
||||
|
||||
| Element | Recommended | Maximum | Notes |
|
||||
|---------|-------------|---------|-------|
|
||||
| Primary text | 125 chars | 2,200 chars | Text above image; truncated after ~125 |
|
||||
| Headline | 40 chars | 255 chars | Below image; truncated after ~40 |
|
||||
| Description | 30 chars | 255 chars | Below headline; may not show |
|
||||
| URL display link | 40 chars | N/A | Optional custom display URL |
|
||||
|
||||
**Placement-specific notes:**
|
||||
- **Feed**: All elements show; primary text most visible
|
||||
- **Stories/Reels**: Primary text overlaid; keep under 72 chars
|
||||
- **Right column**: Only headline visible; skip description
|
||||
- **Audience Network**: Varies by publisher
|
||||
|
||||
**Best practices:**
|
||||
- Front-load the hook in primary text (first 125 chars)
|
||||
- Use line breaks for readability in longer primary text
|
||||
- Emojis: test, but don't overuse — 1-2 per ad max
|
||||
- Questions in primary text increase engagement
|
||||
- Headline should be a clear CTA or value statement
|
||||
|
||||
### Lead Ads (Instant Form)
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Greeting headline | 60 chars |
|
||||
| Greeting description | 360 chars |
|
||||
| Privacy policy text | 200 chars |
|
||||
|
||||
---
|
||||
|
||||
## LinkedIn Ads
|
||||
|
||||
### Single Image Ad
|
||||
|
||||
| Element | Recommended | Maximum | Notes |
|
||||
|---------|-------------|---------|-------|
|
||||
| Intro text | 150 chars | 600 chars | Above the image; truncated after ~150 |
|
||||
| Headline | 70 chars | 200 chars | Below the image |
|
||||
| Description | 100 chars | 300 chars | Only shows on Audience Network |
|
||||
|
||||
### Carousel Ad
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Intro text | 255 chars |
|
||||
| Card headline | 45 chars |
|
||||
| Card count | 2-10 cards |
|
||||
|
||||
### Message Ad (InMail)
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Subject line | 60 chars |
|
||||
| Message body | 1,500 chars |
|
||||
| CTA button | 20 chars |
|
||||
|
||||
### Text Ad
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Headline | 25 chars |
|
||||
| Description | 75 chars |
|
||||
|
||||
**LinkedIn-specific guidelines:**
|
||||
- Professional tone, but not boring
|
||||
- Use job-specific language the audience recognizes
|
||||
- Statistics and data points perform well
|
||||
- Avoid consumer-style hype ("Amazing!" "Incredible!")
|
||||
- First-person testimonials from peers resonate
|
||||
|
||||
---
|
||||
|
||||
## TikTok Ads
|
||||
|
||||
### In-Feed Ads
|
||||
|
||||
| Element | Recommended | Maximum | Notes |
|
||||
|---------|-------------|---------|-------|
|
||||
| Ad text | 80 chars | 100 chars | Above the video |
|
||||
| Display name | N/A | 40 chars | Brand name |
|
||||
| CTA button | Platform options | Predefined | Select from TikTok's options |
|
||||
|
||||
### Spark Ads (Boosted Organic)
|
||||
|
||||
| Element | Notes |
|
||||
|---------|-------|
|
||||
| Caption | Uses original post caption |
|
||||
| CTA button | Added by advertiser |
|
||||
| Display name | Original creator's handle |
|
||||
|
||||
**TikTok-specific guidelines:**
|
||||
- Native content outperforms polished ads
|
||||
- First 2 seconds determine if they watch
|
||||
- Use trending sounds and formats
|
||||
- Text overlay is essential (most watch with sound off)
|
||||
- Vertical video only (9:16)
|
||||
|
||||
---
|
||||
|
||||
## Twitter/X Ads
|
||||
|
||||
### Promoted Tweets
|
||||
|
||||
| Element | Limit | Notes |
|
||||
|---------|-------|-------|
|
||||
| Tweet text | 280 chars | Full tweet with image/video |
|
||||
| Card headline | 70 chars | Website card |
|
||||
| Card description | 200 chars | Website card |
|
||||
|
||||
### Website Cards
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Headline | 70 chars |
|
||||
| Description | 200 chars |
|
||||
|
||||
**Twitter/X-specific guidelines:**
|
||||
- Conversational, casual tone
|
||||
- Short sentences work best
|
||||
- One clear message per tweet
|
||||
- Hashtags: 1-2 max (0 is often better for ads)
|
||||
- Threads can work for consideration-stage content
|
||||
|
||||
---
|
||||
|
||||
## Character Counting Tips
|
||||
|
||||
- **Spaces count** as characters on all platforms
|
||||
- **Emojis** count as 1-2 characters depending on platform
|
||||
- **Special characters** (|, &, etc.) count as 1 character
|
||||
- **URLs** in body text count against limits
|
||||
- **Dynamic keyword insertion** (`{KeyWord:default}`) can exceed limits — set safe defaults
|
||||
- Always verify in the platform's ad preview before launching
|
||||
|
||||
---
|
||||
|
||||
## Multi-Platform Creative Adaptation
|
||||
|
||||
When creating for multiple platforms simultaneously, start with the most restrictive format:
|
||||
|
||||
1. **Google Search headlines** (30 chars) — forces the tightest messaging
|
||||
2. **Expand to Meta headlines** (40 chars) — add a word or two
|
||||
3. **Expand to LinkedIn intro text** (150 chars) — add context and proof
|
||||
4. **Expand to Meta primary text** (125+ chars) — full hook and value prop
|
||||
|
||||
This cascading approach ensures your core message works everywhere, then gets enriched for platforms that allow more space.
|
||||
@@ -0,0 +1,398 @@
|
||||
---
|
||||
name: ai-seo
|
||||
description: "When the user wants to optimize content for AI search engines, get cited by LLMs, or appear in AI-generated answers. Also use when the user mentions 'AI SEO,' 'AEO,' 'GEO,' 'LLMO,' 'answer engine optimization,' 'generative engine optimization,' 'LLM optimization,' 'AI Overviews,' 'optimize for ChatGPT,' 'optimize for Perplexity,' 'AI citations,' 'AI visibility,' 'zero-click search,' 'how do I show up in AI answers,' 'LLM mentions,' or 'optimize for Claude/Gemini.' Use this whenever someone wants their content to be cited or surfaced by AI assistants and AI search engines. For traditional technical and on-page SEO audits, see seo-audit. For structured data implementation, see schema-markup."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# AI SEO
|
||||
|
||||
You are an expert in AI search optimization — the practice of making content discoverable, extractable, and citable by AI systems including Google AI Overviews, ChatGPT, Perplexity, Claude, Gemini, and Copilot. Your goal is to help users get their content cited as a source in AI-generated answers.
|
||||
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
### 1. Current AI Visibility
|
||||
- Do you know if your brand appears in AI-generated answers today?
|
||||
- Have you checked ChatGPT, Perplexity, or Google AI Overviews for your key queries?
|
||||
- What queries matter most to your business?
|
||||
|
||||
### 2. Content & Domain
|
||||
- What type of content do you produce? (Blog, docs, comparisons, product pages)
|
||||
- What's your domain authority / traditional SEO strength?
|
||||
- Do you have existing structured data (schema markup)?
|
||||
|
||||
### 3. Goals
|
||||
- Get cited as a source in AI answers?
|
||||
- Appear in Google AI Overviews for specific queries?
|
||||
- Compete with specific brands already getting cited?
|
||||
- Optimize existing content or create new AI-optimized content?
|
||||
|
||||
### 4. Competitive Landscape
|
||||
- Who are your top competitors in AI search results?
|
||||
- Are they being cited where you're not?
|
||||
|
||||
---
|
||||
|
||||
## How AI Search Works
|
||||
|
||||
### The AI Search Landscape
|
||||
|
||||
| Platform | How It Works | Source Selection |
|
||||
|----------|-------------|----------------|
|
||||
| **Google AI Overviews** | Summarizes top-ranking pages | Strong correlation with traditional rankings |
|
||||
| **ChatGPT (with search)** | Searches web, cites sources | Draws from wider range, not just top-ranked |
|
||||
| **Perplexity** | Always cites sources with links | Favors authoritative, recent, well-structured content |
|
||||
| **Gemini** | Google's AI assistant | Pulls from Google index + Knowledge Graph |
|
||||
| **Copilot** | Bing-powered AI search | Bing index + authoritative sources |
|
||||
| **Claude** | Brave Search (when enabled) | Training data + Brave search results |
|
||||
|
||||
For a deep dive on how each platform selects sources and what to optimize per platform, see [references/platform-ranking-factors.md](references/platform-ranking-factors.md).
|
||||
|
||||
### Key Difference from Traditional SEO
|
||||
|
||||
Traditional SEO gets you ranked. AI SEO gets you **cited**.
|
||||
|
||||
In traditional search, you need to rank on page 1. In AI search, a well-structured page can get cited even if it ranks on page 2 or 3 — AI systems select sources based on content quality, structure, and relevance, not just rank position.
|
||||
|
||||
**Critical stats:**
|
||||
- AI Overviews appear in ~45% of Google searches
|
||||
- AI Overviews reduce clicks to websites by up to 58%
|
||||
- Brands are 6.5x more likely to be cited via third-party sources than their own domains
|
||||
- Optimized content gets cited 3x more often than non-optimized
|
||||
- Statistics and citations boost visibility by 40%+ across queries
|
||||
|
||||
---
|
||||
|
||||
## AI Visibility Audit
|
||||
|
||||
Before optimizing, assess your current AI search presence.
|
||||
|
||||
### Step 1: Check AI Answers for Your Key Queries
|
||||
|
||||
Test 10-20 of your most important queries across platforms:
|
||||
|
||||
| Query | Google AI Overview | ChatGPT | Perplexity | You Cited? | Competitors Cited? |
|
||||
|-------|:-----------------:|:-------:|:----------:|:----------:|:-----------------:|
|
||||
| [query 1] | Yes/No | Yes/No | Yes/No | Yes/No | [who] |
|
||||
| [query 2] | Yes/No | Yes/No | Yes/No | Yes/No | [who] |
|
||||
|
||||
**Query types to test:**
|
||||
- "What is [your product category]?"
|
||||
- "Best [product category] for [use case]"
|
||||
- "[Your brand] vs [competitor]"
|
||||
- "How to [problem your product solves]"
|
||||
- "[Your product category] pricing"
|
||||
|
||||
### Step 2: Analyze Citation Patterns
|
||||
|
||||
When your competitors get cited and you don't, examine:
|
||||
- **Content structure** — Is their content more extractable?
|
||||
- **Authority signals** — Do they have more citations, stats, expert quotes?
|
||||
- **Freshness** — Is their content more recently updated?
|
||||
- **Schema markup** — Do they have structured data you're missing?
|
||||
- **Third-party presence** — Are they cited via Wikipedia, Reddit, review sites?
|
||||
|
||||
### Step 3: Content Extractability Check
|
||||
|
||||
For each priority page, verify:
|
||||
|
||||
| Check | Pass/Fail |
|
||||
|-------|-----------|
|
||||
| Clear definition in first paragraph? | |
|
||||
| Self-contained answer blocks (work without surrounding context)? | |
|
||||
| Statistics with sources cited? | |
|
||||
| Comparison tables for "[X] vs [Y]" queries? | |
|
||||
| FAQ section with natural-language questions? | |
|
||||
| Schema markup (FAQ, HowTo, Article, Product)? | |
|
||||
| Expert attribution (author name, credentials)? | |
|
||||
| Recently updated (within 6 months)? | |
|
||||
| Heading structure matches query patterns? | |
|
||||
| AI bots allowed in robots.txt? | |
|
||||
|
||||
### Step 4: AI Bot Access Check
|
||||
|
||||
Verify your robots.txt allows AI crawlers. Each AI platform has its own bot, and blocking it means that platform can't cite you:
|
||||
|
||||
- **GPTBot** and **ChatGPT-User** — OpenAI (ChatGPT)
|
||||
- **PerplexityBot** — Perplexity
|
||||
- **ClaudeBot** and **anthropic-ai** — Anthropic (Claude)
|
||||
- **Google-Extended** — Google Gemini and AI Overviews
|
||||
- **Bingbot** — Microsoft Copilot (via Bing)
|
||||
|
||||
Check your robots.txt for `Disallow` rules targeting any of these. If you find them blocked, you have a business decision to make: blocking prevents AI training on your content but also prevents citation. One middle ground is blocking training-only crawlers (like **CCBot** from Common Crawl) while allowing the search bots listed above.
|
||||
|
||||
See [references/platform-ranking-factors.md](references/platform-ranking-factors.md) for the full robots.txt configuration.
|
||||
|
||||
---
|
||||
|
||||
## Optimization Strategy
|
||||
|
||||
### The Three Pillars
|
||||
|
||||
```
|
||||
1. Structure (make it extractable)
|
||||
2. Authority (make it citable)
|
||||
3. Presence (be where AI looks)
|
||||
```
|
||||
|
||||
### Pillar 1: Structure — Make Content Extractable
|
||||
|
||||
AI systems extract passages, not pages. Every key claim should work as a standalone statement.
|
||||
|
||||
**Content block patterns:**
|
||||
- **Definition blocks** for "What is X?" queries
|
||||
- **Step-by-step blocks** for "How to X" queries
|
||||
- **Comparison tables** for "X vs Y" queries
|
||||
- **Pros/cons blocks** for evaluation queries
|
||||
- **FAQ blocks** for common questions
|
||||
- **Statistic blocks** with cited sources
|
||||
|
||||
For detailed templates for each block type, see [references/content-patterns.md](references/content-patterns.md).
|
||||
|
||||
**Structural rules:**
|
||||
- Lead every section with a direct answer (don't bury it)
|
||||
- Keep key answer passages to 40-60 words (optimal for snippet extraction)
|
||||
- Use H2/H3 headings that match how people phrase queries
|
||||
- Tables beat prose for comparison content
|
||||
- Numbered lists beat paragraphs for process content
|
||||
- Each paragraph should convey one clear idea
|
||||
|
||||
### Pillar 2: Authority — Make Content Citable
|
||||
|
||||
AI systems prefer sources they can trust. Build citation-worthiness.
|
||||
|
||||
**The Princeton GEO research** (KDD 2024, studied across Perplexity.ai) ranked 9 optimization methods:
|
||||
|
||||
| Method | Visibility Boost | How to Apply |
|
||||
|--------|:---------------:|--------------|
|
||||
| **Cite sources** | +40% | Add authoritative references with links |
|
||||
| **Add statistics** | +37% | Include specific numbers with sources |
|
||||
| **Add quotations** | +30% | Expert quotes with name and title |
|
||||
| **Authoritative tone** | +25% | Write with demonstrated expertise |
|
||||
| **Improve clarity** | +20% | Simplify complex concepts |
|
||||
| **Technical terms** | +18% | Use domain-specific terminology |
|
||||
| **Unique vocabulary** | +15% | Increase word diversity |
|
||||
| **Fluency optimization** | +15-30% | Improve readability and flow |
|
||||
| ~~Keyword stuffing~~ | **-10%** | **Actively hurts AI visibility** |
|
||||
|
||||
**Best combination:** Fluency + Statistics = maximum boost. Low-ranking sites benefit even more — up to 115% visibility increase with citations.
|
||||
|
||||
**Statistics and data** (+37-40% citation boost)
|
||||
- Include specific numbers with sources
|
||||
- Cite original research, not summaries of research
|
||||
- Add dates to all statistics
|
||||
- Original data beats aggregated data
|
||||
|
||||
**Expert attribution** (+25-30% citation boost)
|
||||
- Named authors with credentials
|
||||
- Expert quotes with titles and organizations
|
||||
- "According to [Source]" framing for claims
|
||||
- Author bios with relevant expertise
|
||||
|
||||
**Freshness signals**
|
||||
- "Last updated: [date]" prominently displayed
|
||||
- Regular content refreshes (quarterly minimum for competitive topics)
|
||||
- Current year references and recent statistics
|
||||
- Remove or update outdated information
|
||||
|
||||
**E-E-A-T alignment**
|
||||
- First-hand experience demonstrated
|
||||
- Specific, detailed information (not generic)
|
||||
- Transparent sourcing and methodology
|
||||
- Clear author expertise for the topic
|
||||
|
||||
### Pillar 3: Presence — Be Where AI Looks
|
||||
|
||||
AI systems don't just cite your website — they cite where you appear.
|
||||
|
||||
**Third-party sources matter more than your own site:**
|
||||
- Wikipedia mentions (7.8% of all ChatGPT citations)
|
||||
- Reddit discussions (1.8% of ChatGPT citations)
|
||||
- Industry publications and guest posts
|
||||
- Review sites (G2, Capterra, TrustRadius for B2B SaaS)
|
||||
- YouTube (frequently cited by Google AI Overviews)
|
||||
- Quora answers
|
||||
|
||||
**Actions:**
|
||||
- Ensure your Wikipedia page is accurate and current
|
||||
- Participate authentically in Reddit communities
|
||||
- Get featured in industry roundups and comparison articles
|
||||
- Maintain updated profiles on relevant review platforms
|
||||
- Create YouTube content for key how-to queries
|
||||
- Answer relevant Quora questions with depth
|
||||
|
||||
### Schema Markup for AI
|
||||
|
||||
Structured data helps AI systems understand your content. Key schemas:
|
||||
|
||||
| Content Type | Schema | Why It Helps |
|
||||
|-------------|--------|-------------|
|
||||
| Articles/Blog posts | `Article`, `BlogPosting` | Author, date, topic identification |
|
||||
| How-to content | `HowTo` | Step extraction for process queries |
|
||||
| FAQs | `FAQPage` | Direct Q&A extraction |
|
||||
| Products | `Product` | Pricing, features, reviews |
|
||||
| Comparisons | `ItemList` | Structured comparison data |
|
||||
| Reviews | `Review`, `AggregateRating` | Trust signals |
|
||||
| Organization | `Organization` | Entity recognition |
|
||||
|
||||
Content with proper schema shows 30-40% higher AI visibility. For implementation, use the **schema-markup** skill.
|
||||
|
||||
---
|
||||
|
||||
## Content Types That Get Cited Most
|
||||
|
||||
Not all content is equally citable. Prioritize these formats:
|
||||
|
||||
| Content Type | Citation Share | Why AI Cites It |
|
||||
|-------------|:------------:|----------------|
|
||||
| **Comparison articles** | ~33% | Structured, balanced, high-intent |
|
||||
| **Definitive guides** | ~15% | Comprehensive, authoritative |
|
||||
| **Original research/data** | ~12% | Unique, citable statistics |
|
||||
| **Best-of/listicles** | ~10% | Clear structure, entity-rich |
|
||||
| **Product pages** | ~10% | Specific details AI can extract |
|
||||
| **How-to guides** | ~8% | Step-by-step structure |
|
||||
| **Opinion/analysis** | ~10% | Expert perspective, quotable |
|
||||
|
||||
**Underperformers for AI citation:**
|
||||
- Generic blog posts without structure
|
||||
- Thin product pages with marketing fluff
|
||||
- Gated content (AI can't access it)
|
||||
- Content without dates or author attribution
|
||||
- PDF-only content (harder for AI to parse)
|
||||
|
||||
---
|
||||
|
||||
## Monitoring AI Visibility
|
||||
|
||||
### What to Track
|
||||
|
||||
| Metric | What It Measures | How to Check |
|
||||
|--------|-----------------|-------------|
|
||||
| AI Overview presence | Do AI Overviews appear for your queries? | Manual check or Semrush/Ahrefs |
|
||||
| Brand citation rate | How often you're cited in AI answers | AI visibility tools (see below) |
|
||||
| Share of AI voice | Your citations vs. competitors | Peec AI, Otterly, ZipTie |
|
||||
| Citation sentiment | How AI describes your brand | Manual review + monitoring tools |
|
||||
| Source attribution | Which of your pages get cited | Track referral traffic from AI sources |
|
||||
|
||||
### AI Visibility Monitoring Tools
|
||||
|
||||
| Tool | Coverage | Best For |
|
||||
|------|----------|----------|
|
||||
| **Otterly AI** | ChatGPT, Perplexity, Google AI Overviews | Share of AI voice tracking |
|
||||
| **Peec AI** | ChatGPT, Gemini, Perplexity, Claude, Copilot+ | Multi-platform monitoring at scale |
|
||||
| **ZipTie** | Google AI Overviews, ChatGPT, Perplexity | Brand mention + sentiment tracking |
|
||||
| **LLMrefs** | ChatGPT, Perplexity, AI Overviews, Gemini | SEO keyword → AI visibility mapping |
|
||||
|
||||
### DIY Monitoring (No Tools)
|
||||
|
||||
Monthly manual check:
|
||||
1. Pick your top 20 queries
|
||||
2. Run each through ChatGPT, Perplexity, and Google
|
||||
3. Record: Are you cited? Who is? What page?
|
||||
4. Log in a spreadsheet, track month-over-month
|
||||
|
||||
---
|
||||
|
||||
## AI SEO for Different Content Types
|
||||
|
||||
### SaaS Product Pages
|
||||
|
||||
**Goal:** Get cited in "What is [category]?" and "Best [category]" queries.
|
||||
|
||||
**Optimize:**
|
||||
- Clear product description in first paragraph (what it does, who it's for)
|
||||
- Feature comparison tables (you vs. category, not just competitors)
|
||||
- Specific metrics ("processes 10,000 transactions/sec" not "blazing fast")
|
||||
- Customer count or social proof with numbers
|
||||
- Pricing transparency (AI cites pages with visible pricing)
|
||||
- FAQ section addressing common buyer questions
|
||||
|
||||
### Blog Content
|
||||
|
||||
**Goal:** Get cited as an authoritative source on topics in your space.
|
||||
|
||||
**Optimize:**
|
||||
- One clear target query per post (match heading to query)
|
||||
- Definition in first paragraph for "What is" queries
|
||||
- Original data, research, or expert quotes
|
||||
- "Last updated" date visible
|
||||
- Author bio with relevant credentials
|
||||
- Internal links to related product/feature pages
|
||||
|
||||
### Comparison/Alternative Pages
|
||||
|
||||
**Goal:** Get cited in "[X] vs [Y]" and "Best [X] alternatives" queries.
|
||||
|
||||
**Optimize:**
|
||||
- Structured comparison tables (not just prose)
|
||||
- Fair and balanced (AI penalizes obviously biased comparisons)
|
||||
- Specific criteria with ratings or scores
|
||||
- Updated pricing and feature data
|
||||
- Cite the competitor-alternatives skill for building these pages
|
||||
|
||||
### Documentation / Help Content
|
||||
|
||||
**Goal:** Get cited in "How to [X] with [your product]" queries.
|
||||
|
||||
**Optimize:**
|
||||
- Step-by-step format with numbered lists
|
||||
- Code examples where relevant
|
||||
- HowTo schema markup
|
||||
- Screenshots with descriptive alt text
|
||||
- Clear prerequisites and expected outcomes
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
- **Ignoring AI search entirely** — ~45% of Google searches now show AI Overviews, and ChatGPT/Perplexity are growing fast
|
||||
- **Treating AI SEO as separate from SEO** — Good traditional SEO is the foundation; AI SEO adds structure and authority on top
|
||||
- **Writing for AI, not humans** — If content reads like it was written to game an algorithm, it won't get cited or convert
|
||||
- **No freshness signals** — Undated content loses to dated content. Always show when content was last updated
|
||||
- **Gating all content** — AI can't access gated content. Keep your most authoritative content open
|
||||
- **Ignoring third-party presence** — You may get more AI citations from a Wikipedia mention than from your own blog
|
||||
- **No structured data** — Schema markup gives AI systems structured context about your content
|
||||
- **Keyword stuffing** — Unlike traditional SEO where it's just ineffective, keyword stuffing actively reduces AI visibility by 10% (Princeton GEO study)
|
||||
- **Blocking AI bots** — If GPTBot, PerplexityBot, or ClaudeBot are blocked in robots.txt, those platforms can't cite you
|
||||
- **Generic content without data** — "We're the best" won't get cited. "Our customers see 3x improvement in [metric]" will
|
||||
- **Forgetting to monitor** — You can't improve what you don't measure. Check AI visibility monthly at minimum
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For implementation, see the [tools registry](../../tools/REGISTRY.md).
|
||||
|
||||
| Tool | Use For |
|
||||
|------|---------|
|
||||
| `semrush` | AI Overview tracking, keyword research, content gap analysis |
|
||||
| `ahrefs` | Backlink analysis, content explorer, AI Overview data |
|
||||
| `gsc` | Search Console performance data, query tracking |
|
||||
| `ga4` | Referral traffic from AI sources |
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What are your top 10-20 most important queries?
|
||||
2. Have you checked if AI answers exist for those queries today?
|
||||
3. Do you have structured data (schema markup) on your site?
|
||||
4. What content types do you publish? (Blog, docs, comparisons, etc.)
|
||||
5. Are competitors being cited by AI where you're not?
|
||||
6. Do you have a Wikipedia page or presence on review sites?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **seo-audit**: For traditional technical and on-page SEO audits
|
||||
- **schema-markup**: For implementing structured data that helps AI understand your content
|
||||
- **content-strategy**: For planning what content to create
|
||||
- **competitor-alternatives**: For building comparison pages that get cited
|
||||
- **programmatic-seo**: For building SEO pages at scale
|
||||
- **copywriting**: For writing content that's both human-readable and AI-extractable
|
||||
+6
@@ -4,6 +4,12 @@ Reusable content block patterns optimized for answer engines and AI citation.
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- Answer Engine Optimization (AEO) Patterns (Definition Block, Step-by-Step Block, Comparison Table Block, Pros and Cons Block, FAQ Block, Listicle Block)
|
||||
- Generative Engine Optimization (GEO) Patterns (Statistic Citation Block, Expert Quote Block, Authoritative Claim Block, Self-Contained Answer Block, Evidence Sandwich Block)
|
||||
- Domain-Specific GEO Tactics (Technology Content, Health/Medical Content, Financial Content, Legal Content, Business/Marketing Content)
|
||||
- Voice Search Optimization (Question Formats for Voice, Voice-Optimized Answer Structure)
|
||||
|
||||
## Answer Engine Optimization (AEO) Patterns
|
||||
|
||||
These patterns help content appear in featured snippets, AI Overviews, voice search results, and answer boxes.
|
||||
@@ -0,0 +1,152 @@
|
||||
# How Each AI Platform Picks Sources
|
||||
|
||||
Each AI search platform has its own search index, ranking logic, and content preferences. This guide covers what matters for getting cited on each one.
|
||||
|
||||
Sources cited throughout: Princeton GEO study (KDD 2024), SE Ranking domain authority study, ZipTie content-answer fit analysis.
|
||||
|
||||
---
|
||||
|
||||
## The Fundamentals
|
||||
|
||||
Every AI platform shares three baseline requirements:
|
||||
|
||||
1. **Your content must be in their index** — Each platform uses a different search backend (Google, Bing, Brave, or their own). If you're not indexed, you can't be cited.
|
||||
2. **Your content must be crawlable** — AI bots need access via robots.txt. Block the bot, lose the citation.
|
||||
3. **Your content must be extractable** — AI systems pull passages, not pages. Clear structure and self-contained paragraphs win.
|
||||
|
||||
Beyond these basics, each platform weights different signals. Here's what matters and where.
|
||||
|
||||
---
|
||||
|
||||
## Google AI Overviews
|
||||
|
||||
Google AI Overviews pull from Google's own index and lean heavily on E-E-A-T signals (Experience, Expertise, Authoritativeness, Trustworthiness). They appear in roughly 45% of Google searches.
|
||||
|
||||
**What makes Google AI Overviews different:** They already have your traditional SEO signals — backlinks, page authority, topical relevance. The additional AI layer adds a preference for content with cited sources and structured data. Research shows that including authoritative citations in your content correlates with a 132% visibility boost, and writing with an authoritative (not salesy) tone adds another 89%.
|
||||
|
||||
**Importantly, AI Overviews don't just recycle the traditional Top 10.** Only about 15% of AI Overview sources overlap with conventional organic results. Pages that wouldn't crack page 1 in traditional search can still get cited if they have strong structured data and clear, extractable answers.
|
||||
|
||||
**What to focus on:**
|
||||
- Schema markup is the single biggest lever — Article, FAQPage, HowTo, and Product schemas give AI Overviews structured context to work with (30-40% visibility boost)
|
||||
- Build topical authority through content clusters with strong internal linking
|
||||
- Include named, sourced citations in your content (not just claims)
|
||||
- Author bios with real credentials matter — E-E-A-T is weighted heavily
|
||||
- Get into Google's Knowledge Graph where possible (an accurate Wikipedia entry helps)
|
||||
- Target "how to" and "what is" query patterns — these trigger AI Overviews most often
|
||||
|
||||
---
|
||||
|
||||
## ChatGPT
|
||||
|
||||
ChatGPT's web search draws from a Bing-based index. It combines this with its training knowledge to generate answers, then cites the web sources it relied on.
|
||||
|
||||
**What makes ChatGPT different:** Domain authority matters more here than on other AI platforms. An SE Ranking analysis of 129,000 domains found that authority and credibility signals account for roughly 40% of what determines citation, with content quality at about 35% and platform trust at 25%. Sites with very high referring domain counts (350K+) average 8.4 citations per response, while sites with slightly lower trust scores (91-96 vs 97-100) drop from 8.4 to 6 citations.
|
||||
|
||||
**Freshness is a major differentiator.** Content updated within the last 30 days gets cited about 3.2x more often than older content. ChatGPT clearly favors recent information.
|
||||
|
||||
**The most important signal is content-answer fit** — a ZipTie analysis of 400,000 pages found that how well your content's style and structure matches ChatGPT's own response format accounts for about 55% of citation likelihood. This is far more important than domain authority (12%) or on-page structure (14%) alone. Write the way ChatGPT would answer the question, and you're more likely to be the source it cites.
|
||||
|
||||
**Where ChatGPT looks beyond your site:** Wikipedia accounts for 7.8% of all ChatGPT citations, Reddit for 1.8%, and Forbes for 1.1%. Brand official sites are cited frequently but third-party mentions carry significant weight.
|
||||
|
||||
**What to focus on:**
|
||||
- Invest in backlinks and domain authority — it's the strongest baseline signal
|
||||
- Update competitive content at least monthly
|
||||
- Structure your content the way ChatGPT structures its answers (conversational, direct, well-organized)
|
||||
- Include verifiable statistics with named sources
|
||||
- Clean heading hierarchy (H1 > H2 > H3) with descriptive headings
|
||||
|
||||
---
|
||||
|
||||
## Perplexity
|
||||
|
||||
Perplexity always cites its sources with clickable links, making it the most transparent AI search platform. It combines its own index with Google's and runs results through multiple reranking passes — initial relevance retrieval, then traditional ranking factor scoring, then ML-based quality evaluation that can discard entire result sets if they don't meet quality thresholds.
|
||||
|
||||
**What makes Perplexity different:** It's the most "research-oriented" AI search engine, and its citation behavior reflects that. Perplexity maintains curated lists of authoritative domains (Amazon, GitHub, major academic sites) that get inherent ranking boosts. It uses a time-decay algorithm that evaluates new content quickly, giving fresh publishers a real shot at citation.
|
||||
|
||||
**Perplexity has unique content preferences:**
|
||||
- **FAQ Schema (JSON-LD)** — Pages with FAQ structured data get cited noticeably more often
|
||||
- **PDF documents** — Publicly accessible PDFs (whitepapers, research reports) are prioritized. If you have authoritative PDF content gated behind a form, consider making a version public.
|
||||
- **Publishing velocity** — How frequently you publish matters more than keyword targeting
|
||||
- **Self-contained paragraphs** — Perplexity prefers atomic, semantically complete paragraphs it can extract cleanly
|
||||
|
||||
**What to focus on:**
|
||||
- Allow PerplexityBot in robots.txt
|
||||
- Implement FAQPage schema on any page with Q&A content
|
||||
- Host PDF resources publicly (whitepapers, guides, reports)
|
||||
- Add Article schema with publication and modification timestamps
|
||||
- Write in clear, self-contained paragraphs that work as standalone answers
|
||||
- Build deep topical authority in your specific niche
|
||||
|
||||
---
|
||||
|
||||
## Microsoft Copilot
|
||||
|
||||
Copilot is embedded across Microsoft's ecosystem — Edge, Windows, Microsoft 365, and Bing Search. It relies entirely on Bing's index, so if Bing hasn't indexed your content, Copilot can't cite it.
|
||||
|
||||
**What makes Copilot different:** The Microsoft ecosystem connection creates unique optimization opportunities. Mentions and content on LinkedIn and GitHub provide ranking boosts that other platforms don't offer. Copilot also puts more weight on page speed — sub-2-second load times are a clear threshold.
|
||||
|
||||
**What to focus on:**
|
||||
- Submit your site to Bing Webmaster Tools (many sites only submit to Google Search Console)
|
||||
- Use IndexNow protocol for faster indexing of new and updated content
|
||||
- Optimize page speed to under 2 seconds
|
||||
- Write clear entity definitions — when your content defines a term or concept, make the definition explicit and extractable
|
||||
- Build presence on LinkedIn (publish articles, maintain company page) and GitHub if relevant
|
||||
- Ensure Bingbot has full crawl access
|
||||
|
||||
---
|
||||
|
||||
## Claude
|
||||
|
||||
Claude uses Brave Search as its search backend when web search is enabled — not Google, not Bing. This is a completely different index, which means your Brave Search visibility directly determines whether Claude can find and cite you.
|
||||
|
||||
**What makes Claude different:** Claude is extremely selective about what it cites. While it processes enormous amounts of content, its citation rate is very low — it's looking for the most factually accurate, well-sourced content on a given topic. Data-rich content with specific numbers and clear attribution performs significantly better than general-purpose content.
|
||||
|
||||
**What to focus on:**
|
||||
- Verify your content appears in Brave Search results (search for your brand and key terms at search.brave.com)
|
||||
- Allow ClaudeBot and anthropic-ai user agents in robots.txt
|
||||
- Maximize factual density — specific numbers, named sources, dated statistics
|
||||
- Use clear, extractable structure with descriptive headings
|
||||
- Cite authoritative sources within your content
|
||||
- Aim to be the most factually accurate source on your topic — Claude rewards precision
|
||||
|
||||
---
|
||||
|
||||
## Allowing AI Bots in robots.txt
|
||||
|
||||
If your robots.txt blocks an AI bot, that platform can't cite your content. Here are the user agents to allow:
|
||||
|
||||
```
|
||||
User-agent: GPTBot # OpenAI — powers ChatGPT search
|
||||
User-agent: ChatGPT-User # ChatGPT browsing mode
|
||||
User-agent: PerplexityBot # Perplexity AI search
|
||||
User-agent: ClaudeBot # Anthropic Claude
|
||||
User-agent: anthropic-ai # Anthropic Claude (alternate)
|
||||
User-agent: Google-Extended # Google Gemini and AI Overviews
|
||||
User-agent: Bingbot # Microsoft Copilot (via Bing)
|
||||
Allow: /
|
||||
```
|
||||
|
||||
**Training vs. search:** Some AI bots are used for both model training and search citation. If you want to be cited but don't want your content used for training, your options are limited — GPTBot handles both for OpenAI. However, you can safely block **CCBot** (Common Crawl) without affecting any AI search citations, since it's only used for training dataset collection.
|
||||
|
||||
---
|
||||
|
||||
## Where to Start
|
||||
|
||||
If you're optimizing for AI search for the first time, focus your effort where your audience actually is:
|
||||
|
||||
**Start with Google AI Overviews** — They reach the most users (45%+ of Google searches) and you likely already have Google SEO foundations in place. Add schema markup, include cited sources in your content, and strengthen E-E-A-T signals.
|
||||
|
||||
**Then address ChatGPT** — It's the most-used standalone AI search tool for tech and business audiences. Focus on freshness (update content monthly), domain authority, and matching your content structure to how ChatGPT formats its responses.
|
||||
|
||||
**Then expand to Perplexity** — Especially valuable if your audience includes researchers, early adopters, or tech professionals. Add FAQ schema, publish PDF resources, and write in clear, self-contained paragraphs.
|
||||
|
||||
**Copilot and Claude are lower priority** unless your audience skews enterprise/Microsoft (Copilot) or developer/analyst (Claude). But the fundamentals — structured content, cited sources, schema markup — help across all platforms.
|
||||
|
||||
**Actions that help everywhere:**
|
||||
1. Allow all AI bots in robots.txt
|
||||
2. Implement schema markup (FAQPage, Article, Organization at minimum)
|
||||
3. Include statistics with named sources in your content
|
||||
4. Update content regularly — monthly for competitive topics
|
||||
5. Use clear heading structure (H1 > H2 > H3)
|
||||
6. Keep page load time under 2 seconds
|
||||
7. Add author bios with credentials
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: analytics-tracking
|
||||
version: 1.0.0
|
||||
description: When the user wants to set up, improve, or audit analytics tracking and measurement. Also use when the user mentions "set up tracking," "GA4," "Google Analytics," "conversion tracking," "event tracking," "UTM parameters," "tag manager," "GTM," "analytics implementation," or "tracking plan." For A/B test measurement, see ab-test-setup.
|
||||
description: When the user wants to set up, improve, or audit analytics tracking and measurement. Also use when the user mentions "set up tracking," "GA4," "Google Analytics," "conversion tracking," "event tracking," "UTM parameters," "tag manager," "GTM," "analytics implementation," "tracking plan," "how do I measure this," "track conversions," "attribution," "Mixpanel," "Segment," "are my events firing," or "analytics isn't working." Use this whenever someone asks how to know if something is working or wants to measure marketing results. For A/B test measurement, see ab-test-setup.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Analytics Tracking
|
||||
@@ -11,7 +12,7 @@ You are an expert in analytics implementation and measurement. Your goal is to h
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before implementing tracking, understand:
|
||||
|
||||
@@ -305,3 +306,4 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key analy
|
||||
- **ab-test-setup**: For experiment tracking
|
||||
- **seo-audit**: For organic traffic analysis
|
||||
- **page-cro**: For conversion optimization (uses this data)
|
||||
- **revops**: For pipeline metrics, CRM tracking, and revenue attribution
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
Comprehensive list of events to track by business type and context.
|
||||
|
||||
## Contents
|
||||
- Marketing Site Events (navigation & engagement, CTA & form interactions, conversion events)
|
||||
- Product/App Events (onboarding, core usage, errors & support)
|
||||
- Monetization Events (pricing & checkout, subscription management)
|
||||
- E-commerce Events (browsing, cart, checkout, post-purchase)
|
||||
- B2B / SaaS Specific Events (team & collaboration, integration events, account events)
|
||||
- Event Properties (Parameters)
|
||||
- Funnel Event Sequences
|
||||
|
||||
## Marketing Site Events
|
||||
|
||||
### Navigation & Engagement
|
||||
|
||||
@@ -2,6 +2,16 @@
|
||||
|
||||
Detailed implementation guide for Google Analytics 4.
|
||||
|
||||
## Contents
|
||||
- Configuration (data streams, enhanced measurement events, recommended events)
|
||||
- Custom Events (gtag.js implementation, Google Tag Manager)
|
||||
- Conversions Setup (creating conversions, conversion values)
|
||||
- Custom Dimensions and Metrics (when to use, setup steps, examples)
|
||||
- Audiences (creating audiences, audience examples)
|
||||
- Debugging (DebugView, real-time reports, common issues)
|
||||
- Data Quality (filters, cross-domain tracking, session settings)
|
||||
- Integration with Google Ads (linking, audience export)
|
||||
|
||||
## Configuration
|
||||
|
||||
### Data Streams
|
||||
|
||||
@@ -2,6 +2,16 @@
|
||||
|
||||
Detailed guide for implementing tracking via Google Tag Manager.
|
||||
|
||||
## Contents
|
||||
- Container Structure (tags, triggers, variables)
|
||||
- Naming Conventions
|
||||
- Data Layer Patterns
|
||||
- Common Tag Configurations (GA4 configuration tag, GA4 event tag, Facebook pixel)
|
||||
- Preview and Debug
|
||||
- Workspaces and Versioning
|
||||
- Consent Management
|
||||
- Advanced Patterns (tag sequencing, exception handling, custom JavaScript variables)
|
||||
|
||||
## Container Structure
|
||||
|
||||
### Tags
|
||||
|
||||
@@ -0,0 +1,424 @@
|
||||
---
|
||||
name: churn-prevention
|
||||
description: "When the user wants to reduce churn, build cancellation flows, set up save offers, recover failed payments, or implement retention strategies. Also use when the user mentions 'churn,' 'cancel flow,' 'offboarding,' 'save offer,' 'dunning,' 'failed payment recovery,' 'win-back,' 'retention,' 'exit survey,' 'pause subscription,' 'involuntary churn,' 'people keep canceling,' 'churn rate is too high,' 'how do I keep users,' or 'customers are leaving.' Use this whenever someone is losing subscribers or wants to build systems to prevent it. For post-cancel win-back email sequences, see email-sequence. For in-app upgrade paywalls, see paywall-upgrade-cro."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Churn Prevention
|
||||
|
||||
You are an expert in SaaS retention and churn prevention. Your goal is to help reduce both voluntary churn (customers choosing to cancel) and involuntary churn (failed payments) through well-designed cancel flows, dynamic save offers, proactive retention, and dunning strategies.
|
||||
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
### 1. Current Churn Situation
|
||||
- What's your monthly churn rate? (Voluntary vs. involuntary if known)
|
||||
- How many active subscribers?
|
||||
- What's the average MRR per customer?
|
||||
- Do you have a cancel flow today, or does cancel happen instantly?
|
||||
|
||||
### 2. Billing & Platform
|
||||
- What billing provider? (Stripe, Chargebee, Paddle, Recurly, Braintree)
|
||||
- Monthly, annual, or both billing intervals?
|
||||
- Do you support plan pausing or downgrades?
|
||||
- Any existing retention tooling? (Churnkey, ProsperStack, Raaft)
|
||||
|
||||
### 3. Product & Usage Data
|
||||
- Do you track feature usage per user?
|
||||
- Can you identify engagement drop-offs?
|
||||
- Do you have cancellation reason data from past churns?
|
||||
- What's your activation metric? (What do retained users do that churned users don't?)
|
||||
|
||||
### 4. Constraints
|
||||
- B2B or B2C? (Affects flow design)
|
||||
- Self-serve cancellation required? (Some regulations mandate easy cancel)
|
||||
- Brand tone for offboarding? (Empathetic, direct, playful)
|
||||
|
||||
---
|
||||
|
||||
## How This Skill Works
|
||||
|
||||
Churn has two types requiring different strategies:
|
||||
|
||||
| Type | Cause | Solution |
|
||||
|------|-------|----------|
|
||||
| **Voluntary** | Customer chooses to cancel | Cancel flows, save offers, exit surveys |
|
||||
| **Involuntary** | Payment fails | Dunning emails, smart retries, card updaters |
|
||||
|
||||
Voluntary churn is typically 50-70% of total churn. Involuntary churn is 30-50% but is often easier to fix.
|
||||
|
||||
This skill supports three modes:
|
||||
|
||||
1. **Build a cancel flow** — Design from scratch with survey, save offers, and confirmation
|
||||
2. **Optimize an existing flow** — Analyze cancel data and improve save rates
|
||||
3. **Set up dunning** — Failed payment recovery with retries and email sequences
|
||||
|
||||
---
|
||||
|
||||
## Cancel Flow Design
|
||||
|
||||
### The Cancel Flow Structure
|
||||
|
||||
Every cancel flow follows this sequence:
|
||||
|
||||
```
|
||||
Trigger → Survey → Dynamic Offer → Confirmation → Post-Cancel
|
||||
```
|
||||
|
||||
**Step 1: Trigger**
|
||||
Customer clicks "Cancel subscription" in account settings.
|
||||
|
||||
**Step 2: Exit Survey**
|
||||
Ask why they're cancelling. This determines which save offer to show.
|
||||
|
||||
**Step 3: Dynamic Save Offer**
|
||||
Present a targeted offer based on their reason (discount, pause, downgrade, etc.)
|
||||
|
||||
**Step 4: Confirmation**
|
||||
If they still want to cancel, confirm clearly with end-of-billing-period messaging.
|
||||
|
||||
**Step 5: Post-Cancel**
|
||||
Set expectations, offer easy reactivation path, trigger win-back sequence.
|
||||
|
||||
### Exit Survey Design
|
||||
|
||||
The exit survey is the foundation. Good reason categories:
|
||||
|
||||
| Reason | What It Tells You |
|
||||
|--------|-------------------|
|
||||
| Too expensive | Price sensitivity, may respond to discount or downgrade |
|
||||
| Not using it enough | Low engagement, may respond to pause or onboarding help |
|
||||
| Missing a feature | Product gap, show roadmap or workaround |
|
||||
| Switching to competitor | Competitive pressure, understand what they offer |
|
||||
| Technical issues / bugs | Product quality, escalate to support |
|
||||
| Temporary / seasonal need | Usage pattern, offer pause |
|
||||
| Business closed / changed | Unavoidable, learn and let go gracefully |
|
||||
| Other | Catch-all, include free text field |
|
||||
|
||||
**Survey best practices:**
|
||||
- 1 question, single-select with optional free text
|
||||
- 5-8 reason options max (avoid decision fatigue)
|
||||
- Put most common reasons first (review data quarterly)
|
||||
- Don't make it feel like a guilt trip
|
||||
- "Help us improve" framing works better than "Why are you leaving?"
|
||||
|
||||
### Dynamic Save Offers
|
||||
|
||||
The key insight: **match the offer to the reason.** A discount won't save someone who isn't using the product. A feature roadmap won't save someone who can't afford it.
|
||||
|
||||
**Offer-to-reason mapping:**
|
||||
|
||||
| Cancel Reason | Primary Offer | Fallback Offer |
|
||||
|---------------|---------------|----------------|
|
||||
| Too expensive | Discount (20-30% for 2-3 months) | Downgrade to lower plan |
|
||||
| Not using it enough | Pause (1-3 months) | Free onboarding session |
|
||||
| Missing feature | Roadmap preview + timeline | Workaround guide |
|
||||
| Switching to competitor | Competitive comparison + discount | Feedback session |
|
||||
| Technical issues | Escalate to support immediately | Credit + priority fix |
|
||||
| Temporary / seasonal | Pause subscription | Downgrade temporarily |
|
||||
| Business closed | Skip offer (respect the situation) | — |
|
||||
|
||||
### Save Offer Types
|
||||
|
||||
**Discount**
|
||||
- 20-30% off for 2-3 months is the sweet spot
|
||||
- Avoid 50%+ discounts (trains customers to cancel for deals)
|
||||
- Time-limit the offer ("This offer expires when you leave this page")
|
||||
- Show the dollar amount saved, not just the percentage
|
||||
|
||||
**Pause subscription**
|
||||
- 1-3 month pause maximum (longer pauses rarely reactivate)
|
||||
- 60-80% of pausers eventually return to active
|
||||
- Auto-reactivation with advance notice email
|
||||
- Keep their data and settings intact
|
||||
|
||||
**Plan downgrade**
|
||||
- Offer a lower tier instead of full cancellation
|
||||
- Show what they keep vs. what they lose
|
||||
- Position as "right-size your plan" not "downgrade"
|
||||
- Easy path back up when ready
|
||||
|
||||
**Feature unlock / extension**
|
||||
- Unlock a premium feature they haven't tried
|
||||
- Extend trial of a higher tier
|
||||
- Works best for "not getting enough value" reasons
|
||||
|
||||
**Personal outreach**
|
||||
- For high-value accounts (top 10-20% by MRR)
|
||||
- Route to customer success for a call
|
||||
- Personal email from founder for smaller companies
|
||||
|
||||
### Cancel Flow UI Patterns
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ We're sorry to see you go │
|
||||
│ │
|
||||
│ What's the main reason you're │
|
||||
│ cancelling? │
|
||||
│ │
|
||||
│ ○ Too expensive │
|
||||
│ ○ Not using it enough │
|
||||
│ ○ Missing a feature I need │
|
||||
│ ○ Switching to another tool │
|
||||
│ ○ Technical issues │
|
||||
│ ○ Temporary / don't need right now │
|
||||
│ ○ Other: [____________] │
|
||||
│ │
|
||||
│ [Continue] │
|
||||
│ [Never mind, keep my subscription] │
|
||||
└─────────────────────────────────────┘
|
||||
↓ (selects "Too expensive")
|
||||
┌─────────────────────────────────────┐
|
||||
│ What if we could help? │
|
||||
│ │
|
||||
│ We'd love to keep you. Here's a │
|
||||
│ special offer: │
|
||||
│ │
|
||||
│ ┌───────────────────────────────┐ │
|
||||
│ │ 25% off for the next 3 months│ │
|
||||
│ │ Save $XX/month │ │
|
||||
│ │ │ │
|
||||
│ │ [Accept Offer] │ │
|
||||
│ └───────────────────────────────┘ │
|
||||
│ │
|
||||
│ Or switch to [Basic Plan] at │
|
||||
│ $X/month → │
|
||||
│ │
|
||||
│ [No thanks, continue cancelling] │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**UI principles:**
|
||||
- Keep the "continue cancelling" option visible (no dark patterns)
|
||||
- One primary offer + one fallback, not a wall of options
|
||||
- Show specific dollar savings, not abstract percentages
|
||||
- Use the customer's name and account data when possible
|
||||
- Mobile-friendly (many cancellations happen on mobile)
|
||||
|
||||
For detailed cancel flow patterns by industry and billing provider, see [references/cancel-flow-patterns.md](references/cancel-flow-patterns.md).
|
||||
|
||||
---
|
||||
|
||||
## Churn Prediction & Proactive Retention
|
||||
|
||||
The best save happens before the customer ever clicks "Cancel."
|
||||
|
||||
### Risk Signals
|
||||
|
||||
Track these leading indicators of churn:
|
||||
|
||||
| Signal | Risk Level | Timeframe |
|
||||
|--------|-----------|-----------|
|
||||
| Login frequency drops 50%+ | High | 2-4 weeks before cancel |
|
||||
| Key feature usage stops | High | 1-3 weeks before cancel |
|
||||
| Support tickets spike then stop | High | 1-2 weeks before cancel |
|
||||
| Email open rates decline | Medium | 2-6 weeks before cancel |
|
||||
| Billing page visits increase | High | Days before cancel |
|
||||
| Team seats removed | High | 1-2 weeks before cancel |
|
||||
| Data export initiated | Critical | Days before cancel |
|
||||
| NPS score drops below 6 | Medium | 1-3 months before cancel |
|
||||
|
||||
### Health Score Model
|
||||
|
||||
Build a simple health score (0-100) from weighted signals:
|
||||
|
||||
```
|
||||
Health Score = (
|
||||
Login frequency score × 0.30 +
|
||||
Feature usage score × 0.25 +
|
||||
Support sentiment × 0.15 +
|
||||
Billing health × 0.15 +
|
||||
Engagement score × 0.15
|
||||
)
|
||||
```
|
||||
|
||||
| Score | Status | Action |
|
||||
|-------|--------|--------|
|
||||
| 80-100 | Healthy | Upsell opportunities |
|
||||
| 60-79 | Needs attention | Proactive check-in |
|
||||
| 40-59 | At risk | Intervention campaign |
|
||||
| 0-39 | Critical | Personal outreach |
|
||||
|
||||
### Proactive Interventions
|
||||
|
||||
**Before they think about cancelling:**
|
||||
|
||||
| Trigger | Intervention |
|
||||
|---------|-------------|
|
||||
| Usage drop >50% for 2 weeks | "We noticed you haven't used [feature]. Need help?" email |
|
||||
| Approaching plan limit | Upgrade nudge (not a wall — paywall-upgrade-cro handles this) |
|
||||
| No login for 14 days | Re-engagement email with recent product updates |
|
||||
| NPS detractor (0-6) | Personal follow-up within 24 hours |
|
||||
| Support ticket unresolved >48h | Escalation + proactive status update |
|
||||
| Annual renewal in 30 days | Value recap email + renewal confirmation |
|
||||
|
||||
---
|
||||
|
||||
## Involuntary Churn: Payment Recovery
|
||||
|
||||
Failed payments cause 30-50% of all churn but are the most recoverable.
|
||||
|
||||
### The Dunning Stack
|
||||
|
||||
```
|
||||
Pre-dunning → Smart retry → Dunning emails → Grace period → Hard cancel
|
||||
```
|
||||
|
||||
### Pre-Dunning (Prevent Failures)
|
||||
|
||||
- **Card expiry alerts**: Email 30, 15, and 7 days before card expires
|
||||
- **Backup payment method**: Prompt for a second payment method at signup
|
||||
- **Card updater services**: Visa/Mastercard auto-update programs (reduces hard declines 30-50%)
|
||||
- **Pre-billing notification**: Email 3-5 days before charge for annual plans
|
||||
|
||||
### Smart Retry Logic
|
||||
|
||||
Not all failures are the same. Retry strategy by decline type:
|
||||
|
||||
| Decline Type | Examples | Retry Strategy |
|
||||
|-------------|----------|----------------|
|
||||
| Soft decline (temporary) | Insufficient funds, processor timeout | Retry 3-5 times over 7-10 days |
|
||||
| Hard decline (permanent) | Card stolen, account closed | Don't retry — ask for new card |
|
||||
| Authentication required | 3D Secure, SCA | Send customer to update payment |
|
||||
|
||||
**Retry timing best practices:**
|
||||
- Retry 1: 24 hours after failure
|
||||
- Retry 2: 3 days after failure
|
||||
- Retry 3: 5 days after failure
|
||||
- Retry 4: 7 days after failure (with dunning email escalation)
|
||||
- After 4 retries: Hard cancel with reactivation path
|
||||
|
||||
**Smart retry tip:** Retry on the day of the month the payment originally succeeded (if Day 1 worked before, retry on Day 1). Stripe Smart Retries handles this automatically.
|
||||
|
||||
### Dunning Email Sequence
|
||||
|
||||
| Email | Timing | Tone | Content |
|
||||
|-------|--------|------|---------|
|
||||
| 1 | Day 0 (failure) | Friendly alert | "Your payment didn't go through. Update your card." |
|
||||
| 2 | Day 3 | Helpful reminder | "Quick reminder — update your payment to keep access." |
|
||||
| 3 | Day 7 | Urgency | "Your account will be paused in 3 days. Update now." |
|
||||
| 4 | Day 10 | Final warning | "Last chance to keep your account active." |
|
||||
|
||||
**Dunning email best practices:**
|
||||
- Direct link to payment update page (no login required if possible)
|
||||
- Show what they'll lose (their data, their team's access)
|
||||
- Don't blame ("your payment failed" not "you failed to pay")
|
||||
- Include support contact for help
|
||||
- Plain text performs better than designed emails for dunning
|
||||
|
||||
### Recovery Benchmarks
|
||||
|
||||
| Metric | Poor | Average | Good |
|
||||
|--------|------|---------|------|
|
||||
| Soft decline recovery | <40% | 50-60% | 70%+ |
|
||||
| Hard decline recovery | <10% | 20-30% | 40%+ |
|
||||
| Overall payment recovery | <30% | 40-50% | 60%+ |
|
||||
| Pre-dunning prevention | None | 10-15% | 20-30% |
|
||||
|
||||
For the complete dunning playbook with provider-specific setup, see [references/dunning-playbook.md](references/dunning-playbook.md).
|
||||
|
||||
---
|
||||
|
||||
## Metrics & Measurement
|
||||
|
||||
### Key Churn Metrics
|
||||
|
||||
| Metric | Formula | Target |
|
||||
|--------|---------|--------|
|
||||
| Monthly churn rate | Churned customers / Start-of-month customers | <5% B2C, <2% B2B |
|
||||
| Revenue churn (net) | (Lost MRR - Expansion MRR) / Start MRR | Negative (net expansion) |
|
||||
| Cancel flow save rate | Saved / Total cancel sessions | 25-35% |
|
||||
| Offer acceptance rate | Accepted offers / Shown offers | 15-25% |
|
||||
| Pause reactivation rate | Reactivated / Total paused | 60-80% |
|
||||
| Dunning recovery rate | Recovered / Total failed payments | 50-60% |
|
||||
| Time to cancel | Days from first churn signal to cancel | Track trend |
|
||||
|
||||
### Cohort Analysis
|
||||
|
||||
Segment churn by:
|
||||
- **Acquisition channel** — Which channels bring stickier customers?
|
||||
- **Plan type** — Which plans churn most?
|
||||
- **Tenure** — When do most cancellations happen? (30, 60, 90 days?)
|
||||
- **Cancel reason** — Which reasons are growing?
|
||||
- **Save offer type** — Which offers work best for which segments?
|
||||
|
||||
### Cancel Flow A/B Tests
|
||||
|
||||
Test one variable at a time:
|
||||
|
||||
| Test | Hypothesis | Metric |
|
||||
|------|-----------|--------|
|
||||
| Discount % (20% vs 30%) | Higher discount saves more | Save rate, LTV impact |
|
||||
| Pause duration (1 vs 3 months) | Longer pause increases return rate | Reactivation rate |
|
||||
| Survey placement (before vs after offer) | Survey-first personalizes offers | Save rate |
|
||||
| Offer presentation (modal vs full page) | Full page gets more attention | Save rate |
|
||||
| Copy tone (empathetic vs direct) | Empathetic reduces friction | Save rate |
|
||||
|
||||
**How to run cancel flow experiments:** Use the **ab-test-setup** skill to design statistically rigorous tests. PostHog is a good fit for cancel flow experiments — its feature flags can split users into different flows server-side, and its funnel analytics track each step of the cancel flow (survey → offer → accept/decline → confirm). See the [PostHog integration guide](../../tools/integrations/posthog.md) for setup.
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
- **No cancel flow at all** — Instant cancel leaves money on the table. Even a simple survey + one offer saves 10-15%
|
||||
- **Making cancellation hard to find** — Hidden cancel buttons breed resentment and bad reviews. Many jurisdictions require easy cancellation (FTC Click-to-Cancel rule)
|
||||
- **Same offer for every reason** — A blanket discount doesn't address "missing feature" or "not using it"
|
||||
- **Discounts too deep** — 50%+ discounts train customers to cancel-and-return for deals
|
||||
- **Ignoring involuntary churn** — Often 30-50% of total churn and the easiest to fix
|
||||
- **No dunning emails** — Letting payment failures silently cancel accounts
|
||||
- **Guilt-trip copy** — "Are you sure you want to abandon us?" damages brand trust
|
||||
- **Not tracking save offer LTV** — A "saved" customer who churns 30 days later wasn't really saved
|
||||
- **Pausing too long** — Pauses beyond 3 months rarely reactivate. Set limits.
|
||||
- **No post-cancel path** — Always make reactivation easy and trigger win-back emails
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For implementation, see the [tools registry](../../tools/REGISTRY.md).
|
||||
|
||||
### Retention Platforms
|
||||
|
||||
| Tool | Best For | Key Feature |
|
||||
|------|----------|-------------|
|
||||
| **Churnkey** | Full cancel flow + dunning | AI-powered adaptive offers, 34% avg save rate |
|
||||
| **ProsperStack** | Cancel flows with analytics | Advanced rules engine, Stripe/Chargebee integration |
|
||||
| **Raaft** | Simple cancel flow builder | Easy setup, good for early-stage |
|
||||
| **Chargebee Retention** | Chargebee customers | Native integration, was Brightback |
|
||||
|
||||
### Billing Providers (Dunning)
|
||||
|
||||
| Provider | Smart Retries | Dunning Emails | Card Updater |
|
||||
|----------|:------------:|:--------------:|:------------:|
|
||||
| **Stripe** | Built-in (Smart Retries) | Built-in | Automatic |
|
||||
| **Chargebee** | Built-in | Built-in | Via gateway |
|
||||
| **Paddle** | Built-in | Built-in | Managed |
|
||||
| **Recurly** | Built-in | Built-in | Built-in |
|
||||
| **Braintree** | Manual config | Manual | Via gateway |
|
||||
|
||||
### Related CLI Tools
|
||||
|
||||
| Tool | Use For |
|
||||
|------|---------|
|
||||
| `stripe` | Subscription management, dunning config, payment retries |
|
||||
| `customer-io` | Dunning email sequences, retention campaigns |
|
||||
| `posthog` | Cancel flow A/B tests via feature flags, funnel analytics |
|
||||
| `mixpanel` / `ga4` | Usage tracking, churn signal analysis |
|
||||
| `segment` | Event routing for health scoring |
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **email-sequence**: For win-back email sequences after cancellation
|
||||
- **paywall-upgrade-cro**: For in-app upgrade moments and trial expiration
|
||||
- **pricing-strategy**: For plan structure and annual discount strategy
|
||||
- **onboarding-cro**: For activation to prevent early churn
|
||||
- **analytics-tracking**: For setting up churn signal events
|
||||
- **ab-test-setup**: For testing cancel flow variations with statistical rigor
|
||||
@@ -0,0 +1,316 @@
|
||||
# Cancel Flow Patterns
|
||||
|
||||
Detailed cancel flow patterns by business type, billing provider, and industry.
|
||||
|
||||
---
|
||||
|
||||
## Cancel Flow by Business Type
|
||||
|
||||
### B2C / Self-Serve SaaS
|
||||
|
||||
High volume, low touch. The flow must work without human intervention.
|
||||
|
||||
**Flow structure:**
|
||||
```
|
||||
Cancel button → Exit survey (1 question) → Dynamic offer → Confirm → Post-cancel
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- Fully automated, no human in the loop
|
||||
- Quick — 2-3 screens maximum
|
||||
- One offer + one fallback, not a menu of options
|
||||
- Mobile-optimized (significant cancellations on mobile)
|
||||
- Clear "continue cancelling" at every step
|
||||
|
||||
**Typical save rate:** 20-30%
|
||||
|
||||
**Example flow for a $29/mo productivity app:**
|
||||
1. "What's the main reason?" → 6 options
|
||||
2. Selected "Too expensive" → "Get 25% off for 3 months (save $21.75)"
|
||||
3. Declined → "Or switch to our Starter plan at $12/mo"
|
||||
4. Declined → "We're sorry to see you go. Your access continues until [date]."
|
||||
|
||||
---
|
||||
|
||||
### B2B / Team Plans
|
||||
|
||||
Lower volume, higher stakes. Personal outreach is worth the cost.
|
||||
|
||||
**Flow structure:**
|
||||
```
|
||||
Cancel button → Exit survey → Offer (or route to CS) → Confirm → Post-cancel
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- Route accounts above MRR threshold to customer success
|
||||
- Show team impact ("Your 8 team members will lose access")
|
||||
- Offer admin-to-admin call for enterprise accounts
|
||||
- Longer consideration — allow "schedule a call" as a save option
|
||||
- Require admin/owner role to cancel (not any team member)
|
||||
|
||||
**Typical save rate:** 30-45% (higher because of personal touch)
|
||||
|
||||
**MRR-based routing:**
|
||||
|
||||
| Account MRR | Cancel Flow |
|
||||
|-------------|-------------|
|
||||
| <$100/mo | Automated flow with offers |
|
||||
| $100-$500/mo | Automated + flag for CS follow-up |
|
||||
| $500-$2,000/mo | Route to CS before cancel completes |
|
||||
| $2,000+/mo | Block self-serve cancel, require CS call |
|
||||
|
||||
---
|
||||
|
||||
### Freemium / Free-to-Paid
|
||||
|
||||
Users cancelling paid to return to free tier. Different psychology — they're not leaving, they're downgrading.
|
||||
|
||||
**Flow structure:**
|
||||
```
|
||||
Cancel button → "Switch to Free?" prompt → Exit survey (if still cancelling) → Offer → Confirm
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- Lead with the free tier as the first option (not a save offer)
|
||||
- Show what they keep on free vs. what they lose
|
||||
- The "save" is keeping them on free, not losing them entirely
|
||||
- Track free-tier users for future re-upgrade campaigns
|
||||
|
||||
---
|
||||
|
||||
## Cancel Flow by Billing Interval
|
||||
|
||||
### Monthly Subscribers
|
||||
|
||||
- More price-sensitive, shorter commitment
|
||||
- Discount offers work well (20-30% for 2-3 months)
|
||||
- Pause is effective (1-2 months)
|
||||
- Suggest annual plan at a discount as an alternative
|
||||
|
||||
**Offer priority:**
|
||||
1. Discount (if reason = price)
|
||||
2. Pause (if reason = not using / temporary)
|
||||
3. Annual plan switch (if engaged but price-sensitive)
|
||||
|
||||
### Annual Subscribers
|
||||
|
||||
- Higher commitment, often cancelling for stronger reasons
|
||||
- Prorate refund expectations matter
|
||||
- Longer save window (they've already paid)
|
||||
- Personal outreach more justified (higher LTV at stake)
|
||||
|
||||
**Offer priority:**
|
||||
1. Pause remainder of term (if temporary)
|
||||
2. Plan adjustment + credit for next renewal
|
||||
3. Personal outreach from CS
|
||||
4. Partial refund + downgrade (better than full refund + cancel)
|
||||
|
||||
**Refund handling:**
|
||||
- Offer prorated refund if significant time remaining
|
||||
- "Pause until renewal" if less than 3 months left
|
||||
- Be generous — bad refund experiences create vocal detractors
|
||||
|
||||
---
|
||||
|
||||
## Save Offer Patterns
|
||||
|
||||
### The Discount Ladder
|
||||
|
||||
Don't lead with your biggest discount. Escalate:
|
||||
|
||||
```
|
||||
Cancel click → 15% off → Still cancelling → 25% off → Still cancelling → Let them go
|
||||
```
|
||||
|
||||
**Rules:**
|
||||
- Maximum 2 discount offers per cancel session
|
||||
- Never exceed 30% (higher trains cancel-for-discount behavior)
|
||||
- Time-limit discounts (2-3 months, then full price resumes)
|
||||
- Track discount accepters — if they cancel again at full price, don't re-offer
|
||||
|
||||
### The Pause Playbook
|
||||
|
||||
Pause is often better than a discount because it doesn't devalue your product.
|
||||
|
||||
**Implementation:**
|
||||
|
||||
| Setting | Recommendation |
|
||||
|---------|---------------|
|
||||
| Pause duration options | 1 month, 2 months, 3 months |
|
||||
| Default selection | 1 month (shortest) |
|
||||
| Maximum pause | 3 months (longer pauses rarely return) |
|
||||
| During pause | Keep data, remove access |
|
||||
| Reactivation | Auto-reactivate with 7-day advance email |
|
||||
| Repeat pauses | Allow 1 pause per 12-month period |
|
||||
|
||||
**Pause reactivation sequence:**
|
||||
- Day -7: "Your pause ends in 7 days. We've been busy — here's what's new."
|
||||
- Day -1: "Welcome back tomorrow! Here's what's waiting for you."
|
||||
- Day 0: "You're back! Here's a quick tour of what's new."
|
||||
|
||||
### The Downgrade Path
|
||||
|
||||
For multi-plan products, downgrade is the strongest save:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Before you go, what about right-sizing │
|
||||
│ your plan? │
|
||||
│ │
|
||||
│ Current: Pro ($49/mo) │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────┐ │
|
||||
│ │ Switch to Starter ($19/mo) │ │
|
||||
│ │ │ │
|
||||
│ │ ✓ Keep: Projects, integrations │ │
|
||||
│ │ ✗ Lose: Advanced analytics, │ │
|
||||
│ │ team features │ │
|
||||
│ │ │ │
|
||||
│ │ [Switch to Starter] │ │
|
||||
│ └─────────────────────────────────┘ │
|
||||
│ │
|
||||
│ [No thanks, continue cancelling] │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Downgrade best practices:**
|
||||
- Show exactly what they keep and what they lose
|
||||
- Use checkmarks and X marks for scanability
|
||||
- Preserve their data even on the lower plan
|
||||
- If they downgrade, don't show upgrade prompts for at least 30 days
|
||||
|
||||
### The Competitor Switch Handler
|
||||
|
||||
When the cancel reason is "switching to competitor":
|
||||
|
||||
1. **Ask which competitor** (optional, don't force it)
|
||||
2. **Show a comparison** if you have one (see competitor-alternatives skill)
|
||||
3. **Offer a migration credit** ("We'll match their price for 3 months")
|
||||
4. **Request a feedback call** ("15 minutes to understand what we're missing")
|
||||
|
||||
This data is gold for product and marketing teams.
|
||||
|
||||
---
|
||||
|
||||
## Post-Cancel Experience
|
||||
|
||||
What happens after cancel matters for:
|
||||
- Win-back potential
|
||||
- Word of mouth
|
||||
- Review sentiment
|
||||
|
||||
### Confirmation Page
|
||||
|
||||
```
|
||||
Your subscription has been cancelled.
|
||||
|
||||
What happens next:
|
||||
• Your access continues until [billing period end date]
|
||||
• Your data will be preserved for 90 days
|
||||
• You can reactivate anytime from your account settings
|
||||
|
||||
[Reactivate My Account]
|
||||
|
||||
We'd love to have you back. We'll keep improving based on feedback
|
||||
from customers like you.
|
||||
```
|
||||
|
||||
### Post-Cancel Sequence
|
||||
|
||||
| Timing | Action |
|
||||
|--------|--------|
|
||||
| Immediately | Confirmation email with access end date |
|
||||
| Day 1 | (Nothing — don't be desperate) |
|
||||
| Day 7 | NPS/satisfaction survey about overall experience |
|
||||
| Day 30 | "What's new" email with recent improvements |
|
||||
| Day 60 | Address their specific cancel reason if resolved |
|
||||
| Day 90 | Final win-back with special offer |
|
||||
|
||||
**For detailed win-back email sequences**: See the email-sequence skill.
|
||||
|
||||
---
|
||||
|
||||
## Segmentation Rules
|
||||
|
||||
The most effective cancel flows use segmentation to show different offers to different customers.
|
||||
|
||||
### Segmentation Dimensions
|
||||
|
||||
| Dimension | Why It Matters |
|
||||
|-----------|---------------|
|
||||
| Plan / MRR | Higher-value customers get personal outreach |
|
||||
| Tenure | Long-term customers get more generous offers |
|
||||
| Usage level | High-usage customers get different messaging than dormant ones |
|
||||
| Billing interval | Monthly vs. annual need different approaches |
|
||||
| Previous saves | Don't re-offer the same discount to a repeat canceller |
|
||||
| Cancel reason | Drives which offer to show (core mapping) |
|
||||
|
||||
### Segment-Specific Flows
|
||||
|
||||
**New customer (< 30 days):**
|
||||
- They haven't activated. The save is onboarding, not discounts.
|
||||
- Offer: Free onboarding call, setup help, extended trial
|
||||
- Ask: "What were you hoping to accomplish?" (learn what's missing)
|
||||
|
||||
**Engaged customer cancelling on price:**
|
||||
- They love the product but can't justify the cost.
|
||||
- Offer: Discount, annual plan switch, downgrade
|
||||
- High save potential
|
||||
|
||||
**Dormant customer (no login 30+ days):**
|
||||
- They forgot about you. A discount won't bring them back.
|
||||
- Offer: Pause subscription, "what changed?" conversation
|
||||
- Low save potential — focus on learning why
|
||||
|
||||
**Power user switching to competitor:**
|
||||
- They're actively choosing something else.
|
||||
- Offer: Competitive match, feedback call, roadmap preview
|
||||
- Medium save potential — depends on reason
|
||||
|
||||
---
|
||||
|
||||
## Implementation Checklist
|
||||
|
||||
### Phase 1: Foundation (Week 1)
|
||||
- [ ] Add cancel flow (survey + 1 offer + confirmation)
|
||||
- [ ] Set up exit survey with 5-7 reason categories
|
||||
- [ ] Map one offer per reason (simple 1:1 mapping)
|
||||
- [ ] Track cancel reasons and save rate in analytics
|
||||
- [ ] Enable pre-dunning card expiry emails
|
||||
|
||||
### Phase 2: Optimization (Weeks 2-4)
|
||||
- [ ] Add fallback offers (primary + secondary per reason)
|
||||
- [ ] Implement pause subscription option
|
||||
- [ ] Set up dunning email sequence (4 emails over 10 days)
|
||||
- [ ] Enable smart retries (Stripe Smart Retries or equivalent)
|
||||
- [ ] Add MRR-based routing for high-value accounts
|
||||
|
||||
### Phase 3: Advanced (Month 2+)
|
||||
- [ ] Build health score from usage signals
|
||||
- [ ] Set up proactive intervention triggers
|
||||
- [ ] A/B test discount amounts and offer types
|
||||
- [ ] Segment flows by plan, tenure, and usage
|
||||
- [ ] Post-cancel win-back sequence (coordinate with email-sequence skill)
|
||||
- [ ] Cohort analysis: churn by channel, plan, tenure
|
||||
|
||||
---
|
||||
|
||||
## Compliance Notes
|
||||
|
||||
### FTC Click-to-Cancel Rule (US)
|
||||
- Cancellation must be as easy as signup
|
||||
- Cannot require a phone call to cancel if signup was online
|
||||
- Cannot add excessive steps to discourage cancellation
|
||||
- Save offers are allowed but "continue cancelling" must be clear
|
||||
|
||||
### GDPR / Data Retention (EU)
|
||||
- Inform users about data retention period post-cancel
|
||||
- Offer data export before account deletion
|
||||
- Honor deletion requests within 30 days
|
||||
- Don't use post-cancel data for marketing without consent
|
||||
|
||||
### General Best Practices
|
||||
- Always show a clear path to complete cancellation
|
||||
- Never hide the cancel button (dark pattern)
|
||||
- Process cancellation even if save flow has errors
|
||||
- Confirm cancellation with email receipt
|
||||
@@ -0,0 +1,408 @@
|
||||
# Dunning Playbook
|
||||
|
||||
Complete guide to recovering failed payments and reducing involuntary churn.
|
||||
|
||||
---
|
||||
|
||||
## Why Dunning Matters
|
||||
|
||||
- Failed payments cause 30-50% of all subscription churn
|
||||
- Most failed payments are recoverable with the right strategy
|
||||
- Subscription businesses lose an estimated $129 billion annually to involuntary churn
|
||||
- Effective dunning recovers 50-60% of failed payments
|
||||
|
||||
---
|
||||
|
||||
## The Dunning Timeline
|
||||
|
||||
```
|
||||
Day -30 to -7: Pre-dunning (prevent failures)
|
||||
Day 0: Payment fails → Smart retry #1 + Email #1
|
||||
Day 1-3: Smart retry #2 + Email #2
|
||||
Day 3-5: Smart retry #3
|
||||
Day 5-7: Smart retry #4 + Email #3
|
||||
Day 7-10: Final retry + Email #4 (final warning)
|
||||
Day 10-14: Grace period ends → Account paused/cancelled
|
||||
Day 14+: Win-back sequence begins
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Pre-Dunning: Prevent Failures Before They Happen
|
||||
|
||||
### Card Expiry Management
|
||||
|
||||
| Timing | Action |
|
||||
|--------|--------|
|
||||
| 30 days before expiry | Email: "Your card ending in 4242 expires next month" |
|
||||
| 15 days before expiry | Email: "Update your payment method to avoid interruption" |
|
||||
| 7 days before expiry | Email: "Your card expires in 7 days — update now" |
|
||||
| 3 days before expiry | In-app banner: "Payment method expiring soon" |
|
||||
|
||||
**Email template — Card expiring:**
|
||||
```
|
||||
Subject: Your card ending in 4242 expires soon
|
||||
|
||||
Hi [Name],
|
||||
|
||||
The card on file for your [Product] subscription expires on [date].
|
||||
|
||||
Update your payment method now to avoid any interruption:
|
||||
|
||||
[Update Payment Method →]
|
||||
|
||||
This takes less than 30 seconds.
|
||||
|
||||
— [Product] Team
|
||||
```
|
||||
|
||||
### Card Updater Services
|
||||
|
||||
Major card networks offer automatic card update programs:
|
||||
|
||||
| Service | Network | What It Does |
|
||||
|---------|---------|--------------|
|
||||
| Visa Account Updater (VAU) | Visa | Auto-updates stored card numbers and expiry dates |
|
||||
| Mastercard Automatic Billing Updater (ABU) | Mastercard | Same for Mastercard |
|
||||
| Amex Cardrefresher | American Express | Same for Amex |
|
||||
|
||||
**Impact:** Reduces hard declines from expired/replaced cards by 30-50%.
|
||||
|
||||
**How to enable:**
|
||||
- **Stripe**: Automatic — enabled by default
|
||||
- **Chargebee**: Enabled through gateway settings
|
||||
- **Recurly**: Built-in, enabled by default
|
||||
- **Braintree**: Contact processor to enable
|
||||
|
||||
### Backup Payment Methods
|
||||
|
||||
Prompt for a second payment method:
|
||||
- During signup: "Add a backup payment method" (low conversion)
|
||||
- After first successful payment: "Protect your account with a backup card" (better timing)
|
||||
- After a failed payment is recovered: "Add a backup to prevent future interruptions" (best timing — they felt the pain)
|
||||
|
||||
### Pre-Billing Notifications
|
||||
|
||||
For annual plans or high-value subscriptions:
|
||||
- Email 7 days before renewal with amount and date
|
||||
- Include link to update payment method
|
||||
- Show what's included in the renewal
|
||||
- Required by some regulations for auto-renewals
|
||||
|
||||
---
|
||||
|
||||
## Smart Retry Strategy
|
||||
|
||||
### Decline Type Classification
|
||||
|
||||
| Code | Type | Meaning | Retry? |
|
||||
|------|------|---------|--------|
|
||||
| `insufficient_funds` | Soft | Temporarily low balance | Yes — retry in 2-3 days |
|
||||
| `card_declined` (generic) | Soft | Various temporary reasons | Yes — retry 3-4 times |
|
||||
| `processing_error` | Soft | Gateway/network issue | Yes — retry within 24h |
|
||||
| `expired_card` | Hard | Card is expired | No — request new card |
|
||||
| `stolen_card` | Hard | Card reported stolen | No — request new card |
|
||||
| `do_not_honor` | Soft/Hard | Bank refused (ambiguous) | Try once more, then ask for new card |
|
||||
| `authentication_required` | Auth | SCA/3DS needed | Send customer to authenticate |
|
||||
|
||||
### Retry Schedule by Provider
|
||||
|
||||
**Stripe (Smart Retries — recommended):**
|
||||
- Enable "Smart Retries" in Stripe Dashboard → Billing → Settings
|
||||
- Stripe's ML model picks optimal retry timing based on billions of transactions
|
||||
- Typically 4-8 retry attempts over 3-4 weeks
|
||||
- Recovers ~15% more than fixed-schedule retries
|
||||
|
||||
**Manual retry schedule (if no smart retries):**
|
||||
|
||||
| Retry | Timing | Best Day/Time |
|
||||
|-------|--------|--------------|
|
||||
| 1 | Day 1 (24h after failure) | Morning, same day of week as original |
|
||||
| 2 | Day 3 | Try a different time of day |
|
||||
| 3 | Day 5 | After typical payday (1st, 15th) |
|
||||
| 4 | Day 7 | Morning of the next business day |
|
||||
| 5 (final) | Day 10 | Last attempt before grace period ends |
|
||||
|
||||
**Retry timing insights:**
|
||||
- Retry on the same day of month the original payment succeeded
|
||||
- Retry after common paydays (1st and 15th of the month)
|
||||
- Avoid retrying on weekends (lower approval rates)
|
||||
- Morning retries (8-10am local time) perform slightly better
|
||||
|
||||
---
|
||||
|
||||
## Dunning Email Sequence
|
||||
|
||||
### Email 1: Payment Failed (Day 0)
|
||||
|
||||
**Tone:** Friendly, matter-of-fact. No alarm.
|
||||
|
||||
```
|
||||
Subject: Action needed — your payment didn't go through
|
||||
|
||||
Hi [Name],
|
||||
|
||||
We tried to charge your [card type] ending in [last 4] for your
|
||||
[Product] subscription ($[amount]), but it didn't go through.
|
||||
|
||||
This happens sometimes — usually a quick card update fixes it.
|
||||
|
||||
[Update Payment Method →]
|
||||
|
||||
Your access isn't affected yet. We'll retry automatically, but
|
||||
updating your card is the fastest fix.
|
||||
|
||||
Need help? Just reply to this email.
|
||||
|
||||
— [Product] Team
|
||||
```
|
||||
|
||||
### Email 2: Reminder (Day 3)
|
||||
|
||||
**Tone:** Helpful, slightly more urgent.
|
||||
|
||||
```
|
||||
Subject: Quick reminder — update your payment for [Product]
|
||||
|
||||
Hi [Name],
|
||||
|
||||
Just a heads-up — we still haven't been able to process your
|
||||
$[amount] payment for [Product].
|
||||
|
||||
[Update Payment Method →]
|
||||
|
||||
Takes less than 30 seconds. Your [data/projects/team access]
|
||||
is safe, but we'll need a valid payment method to keep your
|
||||
account active.
|
||||
|
||||
Questions? Reply here and we'll help.
|
||||
|
||||
— [Product] Team
|
||||
```
|
||||
|
||||
### Email 3: Urgency (Day 7)
|
||||
|
||||
**Tone:** Direct, clear consequences.
|
||||
|
||||
```
|
||||
Subject: Your [Product] account will be paused in 3 days
|
||||
|
||||
Hi [Name],
|
||||
|
||||
We've tried to process your payment several times, but your
|
||||
[card type] ending in [last 4] keeps getting declined.
|
||||
|
||||
If we don't receive payment by [date], your account will be
|
||||
paused and you'll lose access to:
|
||||
|
||||
• [Key feature/data they use]
|
||||
• [Their projects/workspace]
|
||||
• [Team access for X members]
|
||||
|
||||
[Update Payment Method Now →]
|
||||
|
||||
Your data won't be deleted — you can reactivate anytime by
|
||||
updating your payment method.
|
||||
|
||||
— [Product] Team
|
||||
```
|
||||
|
||||
### Email 4: Final Warning (Day 10)
|
||||
|
||||
**Tone:** Final, clear, no guilt.
|
||||
|
||||
```
|
||||
Subject: Last chance to keep your [Product] account active
|
||||
|
||||
Hi [Name],
|
||||
|
||||
This is our last reminder. Your payment of $[amount] is past
|
||||
due, and your account will be paused tomorrow ([date]).
|
||||
|
||||
[Update Payment Method →]
|
||||
|
||||
After pausing:
|
||||
• Your data is saved for [90 days]
|
||||
• You can reactivate anytime
|
||||
• Just update your card to restore access
|
||||
|
||||
If you intended to cancel, no action needed — your account
|
||||
will be paused automatically.
|
||||
|
||||
— [Product] Team
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Grace Period Management
|
||||
|
||||
### What Happens During Grace Period
|
||||
|
||||
| Setting | Recommendation |
|
||||
|---------|---------------|
|
||||
| Duration | 7-14 days after final retry |
|
||||
| Access | Degraded (read-only) or full access |
|
||||
| Visibility | In-app banner: "Payment past due — update to continue" |
|
||||
| Retry | Continue background retries during grace |
|
||||
| Communication | Dunning emails continue |
|
||||
|
||||
### Access Degradation Options
|
||||
|
||||
**Option A: Full access during grace (recommended for B2B)**
|
||||
- Lower friction, customer feels respected
|
||||
- Higher recovery rate (they still see value)
|
||||
- Risk: some customers exploit the grace period
|
||||
|
||||
**Option B: Read-only access (recommended for B2C)**
|
||||
- Can view but not create/edit
|
||||
- Creates urgency without data loss fear
|
||||
- Clear message: "Update payment to resume full access"
|
||||
|
||||
**Option C: Immediate lockout (not recommended)**
|
||||
- Aggressive, damages relationship
|
||||
- Lower recovery rate
|
||||
- Only appropriate for very low-cost plans
|
||||
|
||||
### Post-Grace Period
|
||||
|
||||
| Timing | Action |
|
||||
|--------|--------|
|
||||
| Grace period ends | Pause account (not delete) |
|
||||
| Day 1 post-pause | "Your account has been paused" email |
|
||||
| Day 7 post-pause | "Your data is still here" reminder |
|
||||
| Day 30 post-pause | Win-back attempt with new offer |
|
||||
| Day 60 post-pause | Final win-back |
|
||||
| Day 90 post-pause | Data deletion warning (if applicable) |
|
||||
|
||||
---
|
||||
|
||||
## Provider-Specific Setup
|
||||
|
||||
### Stripe
|
||||
|
||||
**Enable Smart Retries:**
|
||||
1. Dashboard → Settings → Billing → Subscriptions and emails
|
||||
2. Enable "Smart Retries" under retry rules
|
||||
3. Set failed payment emails in Dashboard → Settings → Emails
|
||||
|
||||
**Custom retry rules (if not using Smart Retries):**
|
||||
```
|
||||
Retry 1: 3 days after failure
|
||||
Retry 2: 5 days after failure
|
||||
Retry 3: 7 days after failure
|
||||
Final: Mark subscription as unpaid after last retry
|
||||
```
|
||||
|
||||
**Webhook events to handle:**
|
||||
- `invoice.payment_failed` — trigger dunning
|
||||
- `invoice.paid` — cancel dunning, restore access
|
||||
- `customer.subscription.updated` — status changes
|
||||
- `customer.subscription.deleted` — final cancellation
|
||||
|
||||
### Chargebee
|
||||
|
||||
**Built-in dunning:**
|
||||
1. Settings → Configure Chargebee → Retry Settings
|
||||
2. Configure retry attempts and intervals
|
||||
3. Settings → Configure Chargebee → Email Notifications → Dunning
|
||||
|
||||
**Dunning options:**
|
||||
- Automatic retries with configurable schedule
|
||||
- Built-in dunning emails (customizable templates)
|
||||
- Grace period configuration per plan
|
||||
|
||||
### Paddle
|
||||
|
||||
**Managed dunning:**
|
||||
- Paddle handles retries and dunning automatically
|
||||
- Limited customization (Paddle manages the relationship)
|
||||
- Webhook: `subscription.payment_failed`, `subscription.cancelled`
|
||||
- Best for hands-off approach
|
||||
|
||||
### Recurly
|
||||
|
||||
**Revenue Recovery:**
|
||||
1. Configuration → Dunning Management
|
||||
2. Set retry schedule per plan
|
||||
3. Configure grace period and final action (pause vs cancel)
|
||||
|
||||
**Advanced features:**
|
||||
- Machine-learning retry optimization
|
||||
- Per-plan dunning schedules
|
||||
- Built-in Account Updater
|
||||
|
||||
---
|
||||
|
||||
## In-App Dunning
|
||||
|
||||
Don't rely on email alone. Show payment failures in the app:
|
||||
|
||||
### Banner Pattern
|
||||
```
|
||||
┌──────────────────────────────────────────────────────┐
|
||||
│ ⚠ Your payment of $29 failed. Update your card to │
|
||||
│ avoid losing access. [Update Payment →] [Dismiss] │
|
||||
└──────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Rules:**
|
||||
- Show on every page load during dunning period
|
||||
- Allow dismiss (but show again next session)
|
||||
- Direct link to payment update (fewest clicks possible)
|
||||
- Don't block the product — let them continue using it
|
||||
|
||||
### Modal Pattern (for final warning)
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ │
|
||||
│ Your account will be paused │
|
||||
│ on [date] │
|
||||
│ │
|
||||
│ Update your payment method to │
|
||||
│ keep access to your [X] projects │
|
||||
│ and [Y] team members. │
|
||||
│ │
|
||||
│ [Update Payment Method] │
|
||||
│ [Remind Me Later] │
|
||||
│ │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Measuring Dunning Performance
|
||||
|
||||
### Key Metrics
|
||||
|
||||
| Metric | How to Calculate | Target |
|
||||
|--------|-----------------|--------|
|
||||
| Recovery rate | Recovered payments / Total failed | 50-60% |
|
||||
| Recovery rate by decline type | Recovered / Failed per type | Soft: 70%+, Hard: 40%+ |
|
||||
| Time to recovery | Days from failure to successful payment | <5 days |
|
||||
| Pre-dunning prevention rate | Prevented failures / Expected failures | 20-30% |
|
||||
| Dunning email open rate | Opens / Sent per email | 60%+ |
|
||||
| Dunning email click rate | Clicks / Opens per email | 30%+ |
|
||||
| Revenue recovered (monthly) | Sum of recovered payment amounts | Track trend |
|
||||
| Revenue lost to involuntary churn | Sum of failed + unrecovered amounts | Track trend |
|
||||
|
||||
### Benchmarking
|
||||
|
||||
**By company stage:**
|
||||
|
||||
| Stage | Typical Involuntary Churn | Target After Optimization |
|
||||
|-------|--------------------------|--------------------------|
|
||||
| Early (< $1M ARR) | 3-5% of MRR/month | 1-2% |
|
||||
| Growth ($1-10M ARR) | 2-4% of MRR/month | 0.5-1.5% |
|
||||
| Scale ($10M+ ARR) | 1-3% of MRR/month | 0.3-0.8% |
|
||||
|
||||
### ROI Calculation
|
||||
|
||||
```
|
||||
Monthly failed payment MRR: $10,000
|
||||
Current recovery rate: 30% ($3,000 recovered)
|
||||
Target recovery rate: 60% ($6,000 recovered)
|
||||
Monthly improvement: $3,000/month
|
||||
Annual improvement: $36,000/year
|
||||
Cost of dunning optimization: ~$200-500/month (tooling)
|
||||
ROI: 6-15x
|
||||
```
|
||||
@@ -0,0 +1,158 @@
|
||||
---
|
||||
name: cold-email
|
||||
description: Write B2B cold emails and follow-up sequences that get replies. Use when the user wants to write cold outreach emails, prospecting emails, cold email campaigns, sales development emails, or SDR emails. Also use when the user mentions "cold outreach," "prospecting email," "outbound email," "email to leads," "reach out to prospects," "sales email," "follow-up email sequence," "nobody's replying to my emails," or "how do I write a cold email." Covers subject lines, opening lines, body copy, CTAs, personalization, and multi-touch follow-up sequences. For warm/lifecycle email sequences, see email-sequence. For sales collateral beyond emails, see sales-enablement.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Cold Email Writing
|
||||
|
||||
You are an expert cold email writer. Your goal is to write emails that sound like they came from a sharp, thoughtful human — not a sales machine following a template.
|
||||
|
||||
## Before Writing
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Understand the situation (ask if not provided):
|
||||
|
||||
1. **Who are you writing to?** — Role, company, why them specifically
|
||||
2. **What do you want?** — The outcome (meeting, reply, intro, demo)
|
||||
3. **What's the value?** — The specific problem you solve for people like them
|
||||
4. **What's your proof?** — A result, case study, or credibility signal
|
||||
5. **Any research signals?** — Funding, hiring, LinkedIn posts, company news, tech stack changes
|
||||
|
||||
Work with whatever the user gives you. If they have a strong signal and a clear value prop, that's enough to write. Don't block on missing inputs — use what you have and note what would make it stronger.
|
||||
|
||||
---
|
||||
|
||||
## Writing Principles
|
||||
|
||||
### Write like a peer, not a vendor
|
||||
|
||||
The email should read like it came from someone who understands their world — not someone trying to sell them something. Use contractions. Read it aloud. If it sounds like marketing copy, rewrite it.
|
||||
|
||||
### Every sentence must earn its place
|
||||
|
||||
Cold email is ruthlessly short. If a sentence doesn't move the reader toward replying, cut it. The best cold emails feel like they could have been shorter, not longer.
|
||||
|
||||
### Personalization must connect to the problem
|
||||
|
||||
If you remove the personalized opening and the email still makes sense, the personalization isn't working. The observation should naturally lead into why you're reaching out.
|
||||
|
||||
See [personalization.md](references/personalization.md) for the 4-level system and research signals.
|
||||
|
||||
### Lead with their world, not yours
|
||||
|
||||
The reader should see their own situation reflected back. "You/your" should dominate over "I/we." Don't open with who you are or what your company does.
|
||||
|
||||
### One ask, low friction
|
||||
|
||||
Interest-based CTAs ("Worth exploring?" / "Would this be useful?") beat meeting requests. One CTA per email. Make it easy to say yes with a one-line reply.
|
||||
|
||||
---
|
||||
|
||||
## Voice & Tone
|
||||
|
||||
**The target voice:** A smart colleague who noticed something relevant and is sharing it. Conversational but not sloppy. Confident but not pushy.
|
||||
|
||||
**Calibrate to the audience:**
|
||||
|
||||
- C-suite: ultra-brief, peer-level, understated
|
||||
- Mid-level: more specific value, slightly more detail
|
||||
- Technical: precise, no fluff, respect their intelligence
|
||||
|
||||
**What it should NOT sound like:**
|
||||
|
||||
- A template with fields swapped in
|
||||
- A pitch deck compressed into paragraph form
|
||||
- A LinkedIn DM from someone you've never met
|
||||
- An AI-generated email (avoid the telltale patterns: "I hope this email finds you well," "I came across your profile," "leverage," "synergy," "best-in-class")
|
||||
|
||||
---
|
||||
|
||||
## Structure
|
||||
|
||||
There's no single right structure. Choose a framework that fits the situation, or write freeform if the email flows naturally without one.
|
||||
|
||||
**Common shapes that work:**
|
||||
|
||||
- **Observation → Problem → Proof → Ask** — You noticed X, which usually means Y challenge. We helped Z with that. Interested?
|
||||
- **Question → Value → Ask** — Struggling with X? We do Y. Company Z saw [result]. Worth a look?
|
||||
- **Trigger → Insight → Ask** — Congrats on X. That usually creates Y challenge. We've helped similar companies with that. Curious?
|
||||
- **Story → Bridge → Ask** — [Similar company] had [problem]. They [solved it this way]. Relevant to you?
|
||||
|
||||
For the full catalog of frameworks with examples, see [frameworks.md](references/frameworks.md).
|
||||
|
||||
---
|
||||
|
||||
## Subject Lines
|
||||
|
||||
Short, boring, internal-looking. The subject line's only job is to get the email opened — not to sell.
|
||||
|
||||
- 2-4 words, lowercase, no punctuation tricks
|
||||
- Should look like it came from a colleague ("reply rates," "hiring ops," "Q2 forecast")
|
||||
- No product pitches, no urgency, no emojis, no prospect's first name
|
||||
|
||||
See [subject-lines.md](references/subject-lines.md) for the full data.
|
||||
|
||||
---
|
||||
|
||||
## Follow-Up Sequences
|
||||
|
||||
Each follow-up must add something new — a different angle, fresh proof, a useful resource. Never "just checking in."
|
||||
|
||||
- 3-5 total emails, increasing gaps between them
|
||||
- Each email should stand alone (they may not have read the previous ones)
|
||||
- The breakup email is your last touch — honor it
|
||||
|
||||
See [follow-up-sequences.md](references/follow-up-sequences.md) for cadence, angle rotation, and breakup email templates.
|
||||
|
||||
---
|
||||
|
||||
## Quality Check
|
||||
|
||||
Before presenting, gut-check:
|
||||
|
||||
- Does it sound like a human wrote it? (Read it aloud)
|
||||
- Would YOU reply to this if you received it?
|
||||
- Does every sentence serve the reader, not the sender?
|
||||
- Is the personalization connected to the problem?
|
||||
- Is there one clear, low-friction ask?
|
||||
|
||||
---
|
||||
|
||||
## What to Avoid
|
||||
|
||||
- Opening with "I hope this email finds you well" or "My name is X and I work at Y"
|
||||
- Jargon: "synergy," "leverage," "circle back," "best-in-class," "leading provider"
|
||||
- Feature dumps — one proof point beats ten features
|
||||
- HTML, images, or multiple links
|
||||
- Fake "Re:" or "Fwd:" subject lines
|
||||
- Identical templates with only {{FirstName}} swapped
|
||||
- Asking for 30-minute calls in first touch
|
||||
- "Just checking in" follow-ups
|
||||
|
||||
---
|
||||
|
||||
## Data & Benchmarks
|
||||
|
||||
The references contain performance data if you need to make informed choices:
|
||||
|
||||
- [benchmarks.md](references/benchmarks.md) — Reply rates, conversion funnels, expert methods, common mistakes
|
||||
- [personalization.md](references/personalization.md) — 4-level personalization system, research signals
|
||||
- [subject-lines.md](references/subject-lines.md) — Subject line data and optimization
|
||||
- [follow-up-sequences.md](references/follow-up-sequences.md) — Cadence, angles, breakup emails
|
||||
- [frameworks.md](references/frameworks.md) — All copywriting frameworks with examples
|
||||
|
||||
Use this data to inform your writing — not as a checklist to satisfy.
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **copywriting**: For landing pages and web copy
|
||||
- **email-sequence**: For lifecycle/nurture email sequences (not cold outreach)
|
||||
- **social-content**: For LinkedIn and social posts
|
||||
- **product-marketing-context**: For establishing foundational positioning
|
||||
- **revops**: For lead scoring, routing, and pipeline management
|
||||
@@ -0,0 +1,83 @@
|
||||
# Benchmarks, Data & Expert Methods
|
||||
|
||||
## Core Performance Metrics (2024–2025)
|
||||
|
||||
| Metric | Average | Good | Excellent | Source |
|
||||
| -------------------------- | ------- | ------ | --------- | ------------------------ |
|
||||
| Open rate | 27.7% | 40–45% | 50%+ | Belkins, Snov.io |
|
||||
| Reply rate | 4–5.8% | 5–10% | 10–15% | Belkins, Reachoutly |
|
||||
| Reply rate (best-in-class) | — | — | 15–25%+ | Digital Bloom, Instantly |
|
||||
| Positive reply % | ~48% | 55–60% | 62–65% | Digital Bloom |
|
||||
| Meeting booking rate | 0.5–1% | 1–2% | 2.3%+ | Reachoutly |
|
||||
| Bounce rate | 7.5% | <4% | <2% | Belkins |
|
||||
|
||||
## Realistic Funnel Model
|
||||
|
||||
500 emails → 100 opens (20%) → 25 replies (5%) → 8 positive replies (30%) → 4 meetings (50%) → 1 client (25% close). ~**0.2% end-to-end conversion** for average performers.
|
||||
|
||||
## Performance Levers (ranked by impact)
|
||||
|
||||
1. **Hook type** — Timeline hooks outperform problem hooks by 3.4x in meetings
|
||||
2. **Personalization depth** — Up to 250% more replies
|
||||
3. **Brevity** — 25–75 words optimal, 83% more replies under 75 words
|
||||
4. **Targeting precision** — ≤50 contacts per campaign = 2.76x higher reply rates
|
||||
5. **Follow-up strategy** — First follow-up adds 49% more replies
|
||||
6. **Reading level** — 3rd–5th grade = 67% more replies
|
||||
7. **Send timing** — Thursday peaks at 6.87% reply rate
|
||||
|
||||
## Declining Effectiveness Trend
|
||||
|
||||
Reply rates dropped from 7–8% (2020–2022) to 4–5.8% (2024–2025), ~15% YoY decline. Drivers: inbox saturation (10+ cold emails/week, 20% say none relevant), stricter anti-spam (Google's threshold: 0.1% complaints), AI email flood (more volume, less quality signal). Writing craft matters more, not less — gap between average and excellent is widening.
|
||||
|
||||
## Response Rates by Seniority
|
||||
|
||||
- **Entry-level:** Highest engagement at 8% reply, 50% open
|
||||
- **C-level:** 23% more likely to respond than non-C-suite when they engage (6.4% vs 5.2%)
|
||||
- **CTOs/VP Tech:** 7.68% reply
|
||||
- **CEOs/Founders:** 7.63% reply
|
||||
- **Heads of Sales:** 6.60% (most targeted role, highest saturation)
|
||||
|
||||
## Industry Variation
|
||||
|
||||
**Highest responding:** Nonprofits (16.5%+), legal (10%), EdTech (7.8%), chemical (7.3%), manufacturing (6.1%).
|
||||
**Lowest responding:** SaaS (3.5%), financial services (3.4%), IT services (3.5%).
|
||||
|
||||
## Top 15 Mistakes (ranked by impact)
|
||||
|
||||
1. **Too long** — 70% of emails above 10th-grade level. Under 75 words = 83% more replies
|
||||
2. **Too self-focused** — "We are a leading..." signals sales pitch. Count I/We sentences
|
||||
3. **No clear value prop** — 71% of decision-makers ignore irrelevant emails
|
||||
4. **Generic templates** — {{FirstName}} isn't personalization. Recipients detect instantly
|
||||
5. **Feature dumping** — "Great reps lead with problems" (Lavender). One proof point beats ten features
|
||||
6. **False personalization** — "Loved your post!" without specifics is transparent
|
||||
7. **Asking too much too soon** — 30-min call in first email = "proposing on first date"
|
||||
8. **Pushy language** — "Act Now" stacking increases spam flagging by 67%
|
||||
9. **No CTA** — Without a clear next step, momentum dies
|
||||
10. **"Just checking in" follow-ups** — "I never heard back" = 12% drop in bookings
|
||||
11. **Wrong tone for audience** — Founder ≠ RevOps lead ≠ sales leader
|
||||
12. **Jargon/buzzwords** — "Leverage synergistic platform" → "We help you book more meetings"
|
||||
13. **Unsubstantiated claims** — "300% more leads" without proof triggers skepticism
|
||||
14. **Too many contacts per company** — 1–2 people = 7.8% reply; 10+ = 3.8%
|
||||
15. **Fake urgency** — Fake "Re:" / "Fwd:" / countdown timers destroy trust
|
||||
|
||||
## Cultural Calibration
|
||||
|
||||
| Factor | US | UK | Germany/DACH | Scandinavia |
|
||||
| ------------ | --------------- | ------------------------ | -------------------- | ----------------------- |
|
||||
| Tone | Direct, casual | Polite, professional | Precise, data-driven | Fact-based, egalitarian |
|
||||
| Length | Shorter, blunt | Longer, insight-led | Detail-oriented | Concise but substantive |
|
||||
| Social proof | Outcome numbers | Research-led credibility | Technical precision | Shared values |
|
||||
|
||||
North America: 4.1% response. Europe: 3.1%. Asia-Pacific: 2.8%. Shorter, more direct sequences work better in US. UK needs more insight/personality. GDPR affects European tone.
|
||||
|
||||
## Expert Quick Reference
|
||||
|
||||
| Expert | Core Method | Best For |
|
||||
| -------------- | --------------------------------------------------------------- | ----------------------------------------------- |
|
||||
| Alex Berman | 3C's: Compliment → Case Study → CTA | High-ticket B2B services, agencies |
|
||||
| Josh Braun | "Poke the Bear" — neutral questions exposing invisible problems | Empathy-driven consultative selling |
|
||||
| Kyle Coleman | Systematic research + AI personalization at scale | Bridging mass outreach and deep personalization |
|
||||
| Becc Holland | Psychographic personalization, Premise Buckets | Combining personalization with relevance |
|
||||
| Will Allred | Data-driven coaching, Mouse Trap, Vanilla Ice Cream | Any context; universal frameworks |
|
||||
| Justin Michael | 1–3 sentence hyper-brevity, quote their own words | High-velocity SDR teams at scale |
|
||||
| Sam Nelson | Agoge Sequence — Triple on Day 1 (email + LinkedIn + call) | Multi-channel, tiered personalization |
|
||||
@@ -0,0 +1,81 @@
|
||||
# Follow-Up Sequences
|
||||
|
||||
55% of replies come from follow-ups, not the initial email. Yet 48% of salespeople never follow up even once.
|
||||
|
||||
## How Many: 3–5 Total Emails
|
||||
|
||||
- Highest single-email reply rate: **8.4%** (Belkins).
|
||||
- 4–7 email campaigns achieve **27% reply rates** vs 9% for 1–3 emails (Woodpecker, 20M emails).
|
||||
- By 4th follow-up, response rates drop **55%** and spam complaints **triple**.
|
||||
- Resolution: longer sequences catch different timing windows. Cap at 4 follow-ups (5 total emails). Each must add genuinely new value.
|
||||
|
||||
## Optimal Cadence
|
||||
|
||||
Increase the gap between each touch:
|
||||
|
||||
| Touch | Day | Notes |
|
||||
| ------------- | ----- | ---------------------------------------------- |
|
||||
| Initial email | 0 | Maximum personalization investment |
|
||||
| Follow-up 1 | 3 | Waiting 3 days increases response by up to 31% |
|
||||
| Follow-up 2 | 7–8 | Different angle |
|
||||
| Follow-up 3 | 14 | New value piece |
|
||||
| Follow-up 4 | 21–28 | Breakup email |
|
||||
|
||||
**Best days:** Tuesday–Thursday (Thursday peaks at 6.87% reply rate).
|
||||
**Best times:** 9–11 AM or 1–3 PM in prospect's local time.
|
||||
**Avoid:** Monday mornings (inbox overload), Friday afternoons (checked out).
|
||||
|
||||
## Angle Rotation
|
||||
|
||||
Each follow-up must stand alone while building toward the goal. Never just "bump this up."
|
||||
|
||||
| Email | Angle | Purpose |
|
||||
| ----------- | ---------------------------------------------------------- | -------------------------- |
|
||||
| Initial | Personalized hook + core value prop + soft CTA | Introduce problem/solution |
|
||||
| Follow-up 1 | Different angle, new value piece (stat, insight, resource) | Show additional benefit |
|
||||
| Follow-up 2 | Social proof / case study from similar company | Build credibility |
|
||||
| Follow-up 3 | New insight, industry trend, or relevant resource | Demonstrate expertise |
|
||||
| Follow-up 4 | Breakup — acknowledge silence, leave door open | Trigger loss aversion |
|
||||
|
||||
Add only **one new value proposition per email** (SalesBread). This naturally forces different angles.
|
||||
|
||||
## The Breakup Email
|
||||
|
||||
Leverages loss aversion — removing pressure while creating scarcity through withdrawal. Close.com reports **10–15% response rates** from breakup emails with cold prospects.
|
||||
|
||||
**Structure:**
|
||||
|
||||
1. Acknowledge you've reached out multiple times
|
||||
2. Validate their potential lack of interest
|
||||
3. State this is your final email for now
|
||||
4. Leave the door open
|
||||
|
||||
**Example:**
|
||||
|
||||
> I haven't heard back, so I'll assume now isn't the right time. Before I close the loop: [1-sentence insight or resource]. If that changes things, feel free to reply. Otherwise, no hard feelings — good luck with [their goal].
|
||||
|
||||
**1-2-3 Format** (reduces friction to near zero):
|
||||
|
||||
> Since I haven't heard back, I'll keep it simple. Reply with a number:
|
||||
>
|
||||
> 1 — Interested, let's talk
|
||||
> 2 — Not now, check back in 3 months
|
||||
> 3 — Not interested, please stop
|
||||
|
||||
**Critical rule:** If you send a breakup email, honor it. Do not contact the prospect again.
|
||||
|
||||
## Phrases That Kill Response Rates
|
||||
|
||||
- "I never heard back" → **12% drop** in meeting booking rate (Gong)
|
||||
- "Just checking in" → Zero value, signals laziness
|
||||
- "Bumping this to the top of your inbox" → Presumptuous
|
||||
- "Did you see my last email?" → Guilt-tripping
|
||||
- "Following up on my previous message" → Generic, adds nothing
|
||||
|
||||
## CTA Adjustment by Seniority
|
||||
|
||||
**Executives/founders:** Ultra-low-effort, curiosity-driven. "Curious?" or "Worth 2 min?"
|
||||
|
||||
**Mid-level managers:** More specific value. "Want me to walk through how [Company] saved 15 hours/week?"
|
||||
|
||||
Higher in the org chart = less friction you can ask for.
|
||||
@@ -0,0 +1,90 @@
|
||||
# Cold Email Copywriting Frameworks
|
||||
|
||||
Frameworks beat templates — they teach thinking patterns, not copy-paste shortcuts.
|
||||
|
||||
## PAS — Problem, Agitate, Solution (default)
|
||||
|
||||
**Structure:** Identify pain → Amplify consequences → Present solution + soft CTA.
|
||||
**Best for:** Problem-aware but not solution-aware prospects. The workhorse framework.
|
||||
|
||||
> Most VP Sales at companies your size spend 5+ hours/week on manual CRM reporting. That's 250+ hours/year not spent coaching reps — and often means inaccurate forecasts reaching leadership. We built a tool that auto-generates CRM reports in real time. Teams like Datadog reduced reporting time by 80%. Would it make sense to see how?
|
||||
|
||||
## BAB — Before, After, Bridge
|
||||
|
||||
**Structure:** Current painful situation → Ideal future → Your product as the bridge.
|
||||
**Best for:** Transformation-driven offers with clear before/after. Emotional decision-makers.
|
||||
|
||||
> Right now, your team is likely spending hours manually sourcing leads — feast or famine each quarter. Imagine qualified leads arriving daily on autopilot, reps spending 100% of their time selling. That's what our platform does. Companies like HubSpot saw a 40% pipeline increase within 90 days. Can I show you how?
|
||||
|
||||
## QVC — Question, Value, CTA
|
||||
|
||||
**Structure:** Targeted pain question → Brief value → Direct next step.
|
||||
**Best for:** C-suite prospects who prefer brevity. Qualify interest immediately.
|
||||
|
||||
> Are your SDRs spending more time researching than selling? We help sales teams automate prospect research so reps focus on conversations. Clients see 3x more meetings per rep per week. Worth a 10-minute demo?
|
||||
|
||||
## AIDA — Attention, Interest, Desire, Action
|
||||
|
||||
**Structure:** Hook/stat → Address specific challenge → Social proof/outcome → Clear CTA.
|
||||
**Best for:** Data-driven prospects, high-ticket pitches with strong stats.
|
||||
|
||||
> Companies in pharma lose 30% of leads due to manual outreach. Given {{Company}}'s growth this quarter, pipeline velocity is likely top of mind. Customers like Pfizer use our platform to automate lead qualification — cutting time-to-contact by 60%. Worth a 15-minute call?
|
||||
|
||||
## PPP — Praise, Picture, Push
|
||||
|
||||
**Structure:** Genuine compliment → How things could be better → Gentle push to action.
|
||||
**Best for:** Senior prospects who respond to relationship-building. Requires genuine trigger.
|
||||
|
||||
> Your keynote on scaling SDR teams was spot-on — especially on ramp time as the hidden cost. What if you could cut that in half? Our in-inbox coach helps new reps write effective emails from day one with real-time scoring. Open to a quick chat about how this could support your growth?
|
||||
|
||||
## Star-Story-Solution
|
||||
|
||||
**Structure:** Introduce character (customer) → Tell challenge narrative → Reveal results.
|
||||
**Best for:** Strong customer success stories. Humanizes the pitch.
|
||||
|
||||
> Last year, Sarah — VP Sales at a Series B startup — had 5 SDRs competing against a rival with 20. Her team was getting crushed on volume. They adopted our AI prospecting tool and sent hyper-personalized emails at 3x pace without losing quality. Within 90 days, they booked more meetings than their competitor's entire team. Happy to share how this could work for {{Company}}.
|
||||
|
||||
## SCQ — Situation, Complication, Question
|
||||
|
||||
**Structure:** Current reality → Complicating challenge → Question that speaks to need → Optional answer.
|
||||
**Best for:** Consultative selling. Mirrors how professionals present to leadership.
|
||||
|
||||
> Your team doubled this year. That usually means onboarding is eating into selling time. How are you handling ramp for new hires?
|
||||
|
||||
## ACCA — Awareness, Comprehension, Conviction, Action
|
||||
|
||||
**Structure:** Contrarian hook → Explain benefit simply → Provide proof → Strong CTA.
|
||||
**Best for:** Analytical buyers who need evidence (engineers, CFOs, ops leaders).
|
||||
|
||||
> Most sales teams measure rep activity. The top 5% measure rep efficiency instead. When Acme switched, they booked 40% more meetings with fewer emails. Worth seeing how?
|
||||
|
||||
## 3C's (Alex Berman)
|
||||
|
||||
**Structure:** Compliment → Case Study → CTA.
|
||||
**Best for:** Agency/services cold outreach. Case study does the heavy lifting.
|
||||
|
||||
> Big fan of [Company]. We just built an app for [Competitor] that does XYZ. I have a few more ideas. Interested?
|
||||
|
||||
## Mouse Trap (Lavender/Will Allred)
|
||||
|
||||
**Structure:** Observation + Binary value-prop question. 1–2 sentences total.
|
||||
**Best for:** Maximum brevity. Impulsive reply based on curiosity.
|
||||
|
||||
> Looks like you're hiring reps. Would it be helpful to get a more granular look at how they're ramping on email?
|
||||
|
||||
## Justin Michael Method
|
||||
|
||||
**Structure:** Trigger/Pain → Solution hint → Binary CTA. 1–3 sentences, no intro.
|
||||
**Best for:** High-velocity SDR teams. Mobile-optimized. Deliberately polarizing.
|
||||
|
||||
Spend max 1 minute on personalization. Use industry/persona-level signals. For top-tier prospects, quote their own words from interviews — they almost always respond.
|
||||
|
||||
## Vanilla Ice Cream (Lavender)
|
||||
|
||||
**Structure:** Observation → Problem/Insight → Credibility → Solution → Call-to-Conversation.
|
||||
**Best for:** Universal "base" framework that works everywhere. Five parts.
|
||||
|
||||
## PASTOR (Ray Edwards)
|
||||
|
||||
**Structure:** Problem → Amplify → Story → Testimony → Offer → Response.
|
||||
**Best for:** Longer-form or multi-email sequences. Consulting, education, complex B2B services. Each element can be developed across separate touches.
|
||||
@@ -0,0 +1,79 @@
|
||||
# Personalization at Scale
|
||||
|
||||
Personalization drives **50–250% more replies** (Lavender). The key insight: **if your personalization has nothing to do with the problem you solve, it's just an attention hack** (Clay).
|
||||
|
||||
## Four Levels of Personalization
|
||||
|
||||
### Level 1 — Basic (merge tags)
|
||||
|
||||
First name, company name, job title. Table stakes, no longer differentiating. ~5% lift.
|
||||
|
||||
### Level 2 — Industry/segment
|
||||
|
||||
Industry-specific pain points, trends, regulatory challenges. Scalable via micro-segmentation.
|
||||
|
||||
> Most {{industry}} teams struggle with {{lead gen problem}}, which often leads to wasted effort.
|
||||
|
||||
### Level 3 — Role-level
|
||||
|
||||
Challenges specific to their role and seniority.
|
||||
|
||||
> As Head of Sales, keeping pipeline steady is probably your biggest headache. Your RevOps team is small, so you're likely wearing multiple hats during scaling.
|
||||
|
||||
### Level 4 — Individual (gold standard)
|
||||
|
||||
Specific, timely observations about that person connected to the problem you solve.
|
||||
|
||||
> Noticed you're hiring 3 SDRs — sounds like you're scaling outbound fast. Most teams hit follow-up fatigue during onboarding.
|
||||
|
||||
## Research Signal Stack
|
||||
|
||||
| Signal | Where to find it | How to use it |
|
||||
| ----------------- | ---------------------------------- | ---------------------------------------------------------------------------- |
|
||||
| Recent funding | Crunchbase, LinkedIn, press | "Congrats on Series B — scaling teams fast usually creates X challenge" |
|
||||
| Job postings | LinkedIn Jobs, careers page | "Noticed you're hiring 3 SDRs — sounds like you're scaling outbound" |
|
||||
| Tech stack | BuiltWith, Wappalyzer, HG Insights | "I see you're using HubSpot — most teams at your stage hit a ceiling with X" |
|
||||
| LinkedIn activity | Posts, comments, job changes | "Really enjoyed your post about X" |
|
||||
| Company news | Google News, press releases | "Congrats on acquiring X — integrating teams usually creates Y challenge" |
|
||||
| Podcast/talks | Google, YouTube, podcasts | "Caught your talk at SaaStr on X — really insightful" |
|
||||
| Website changes | Manual review | "Your new pricing page caught my eye — curious how it's converting" |
|
||||
|
||||
## The 3-Minute Personalization System
|
||||
|
||||
From "30 Minutes to President's Club":
|
||||
|
||||
**Step 1:** Build a research stack of top 10 buying signals — 5 company triggers, 5 person triggers. Stack-rank by relevance.
|
||||
|
||||
**Step 2:** Build a 3x3 template: (1) personalization attached to a problem, (2) problem you solve, (3) one-sentence solution + low-friction CTA.
|
||||
|
||||
**Step 3:** Create 5 "trigger templates" — pre-written personalization paragraphs for each trigger, with a smooth segue into the problem.
|
||||
|
||||
The personalization must logically connect to the problem. This creates 5 reusable triggers with the rest of the email constant. A top SDR writes a personalized email in **under 3 minutes**.
|
||||
|
||||
## The Four -Graphic Principles (Becc Holland)
|
||||
|
||||
- **Demographic** — Age, profession, background
|
||||
- **Technographic** — Tech stack, tools used
|
||||
- **Firmographic** — Company size, funding, industry, growth stage
|
||||
- **Psychographic** — Values, passions, beliefs (highest-impact dimension)
|
||||
|
||||
Tapping into what prospects are passionate about drives significantly higher response rates.
|
||||
|
||||
## Observation-Based Openers (highest performing)
|
||||
|
||||
**Trigger-event:** "Congrats on the recent funding round — scaling the team from here is exciting, and I imagine [challenge] is top of mind."
|
||||
|
||||
**Observation:** "Your recent post about [topic] resonated — especially the part about [detail]. Got me thinking about how that applies to [challenge]."
|
||||
|
||||
**Industry insight:** "Most [role titles] I talk to spend [X hours/week] on [problem] — curious if that matches your experience at [Company]."
|
||||
|
||||
## What Feels Fake (avoid)
|
||||
|
||||
- AI-generated emails with similar phrasing ("I hope this email finds you well")
|
||||
- Generic attention hacks disconnected from problem ("Cool that you went to UCLA!" → pitch)
|
||||
- Over-personalizing to creepiness
|
||||
- "I saw your LinkedIn profile and wanted to reach out" — signals mass automation
|
||||
|
||||
## The "So What?" Test
|
||||
|
||||
After writing any opening line, read from prospect's perspective: "So what? Why would I care?" If the answer is nothing, rewrite.
|
||||
@@ -0,0 +1,53 @@
|
||||
# Subject Line Optimization
|
||||
|
||||
The subject line determines whether the email gets read. The data is counterintuitive: **short, boring, internal-looking subject lines win decisively.**
|
||||
|
||||
## Length: 2–4 words
|
||||
|
||||
- 2-word subject lines get **60% more opens** than 5-word (Lavender).
|
||||
- Going from 2 to 4 words reduces replies by **17.5%**.
|
||||
- 2–4 words yield **46% open rates** vs 34% for 10 words (Belkins, 5.5M emails).
|
||||
- Mobile truncates at 30–35 characters — brevity is practical necessity.
|
||||
|
||||
## Internal Camouflage Principle
|
||||
|
||||
Subject lines that look like they came from a colleague, not a vendor, double open rates (Gong). Buyers mentally categorize before opening — if it looks like sales, it's filtered.
|
||||
|
||||
**High-performing examples:** "reply rates" · "trial delays" · "hiring ops" · "employee turnover" · "Q2 forecast" · "new patients" · "personalization issue" · "second page"
|
||||
|
||||
## Capitalization: lowercase wins
|
||||
|
||||
All-lowercase has highest open rates (Gong, 85M+ emails). Lowercase looks more personal/internal. For cold outreach specifically, lowercase beats title case.
|
||||
|
||||
## Personalization: context over name
|
||||
|
||||
Personalized subject lines boost opens **26–50%**, but type matters:
|
||||
|
||||
- **First name in subject line → 12% fewer replies.** Signals automation.
|
||||
- **Contextual personalization works:** pain points, competitors, trigger events, industry challenges.
|
||||
- Use {{painPoint}}, {{competitor}}, {{commonGround}} — not {{firstName}}.
|
||||
|
||||
## Questions: only when highly specific
|
||||
|
||||
Data conflicts: Belkins says questions perform well (46% open rate). Lavender says questions lower opens by **56%**. Resolution: **specific pain questions work** ("Need help with {{challenge}}?"), **generic questions fail** ("Quick question?" / "Have 15 minutes?"). Default to statements.
|
||||
|
||||
## What to Avoid
|
||||
|
||||
| Anti-pattern | Impact |
|
||||
| ---------------------------------------------- | --------------------------- |
|
||||
| Salesy language ("increase," "boost," "ROI") | -17.9% opens |
|
||||
| Urgency words ("ASAP," "urgent") | Below 36% opens |
|
||||
| Excessive punctuation ("!!!" or "??") | -36% opens |
|
||||
| Numbers and percentages | -46% opens |
|
||||
| Emojis | Hurt B2B professionalism |
|
||||
| Pitching product in subject | -57% replies |
|
||||
| Empty/no subject line | +30% opens but -12% replies |
|
||||
| Spam triggers ("free," "guarantee," "act now") | Deliverability risk |
|
||||
|
||||
## C-Suite Subject Lines
|
||||
|
||||
Executives receive 300–400 emails daily, decide in seconds. They respond **23% more often** than non-C-suite when emails pass their filter (6.4% reply rate).
|
||||
|
||||
What works: ultra-concise, human, understated. "{{companyInitiative}}" · "thank you" · "an update" · "a question" · reference to a specific project or trigger event.
|
||||
|
||||
Anything "salesy" is immediately rejected.
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: competitor-alternatives
|
||||
version: 1.0.0
|
||||
description: "When the user wants to create competitor comparison or alternative pages for SEO and sales enablement. Also use when the user mentions 'alternative page,' 'vs page,' 'competitor comparison,' 'comparison page,' '[Product] vs [Product],' '[Product] alternative,' or 'competitive landing pages.' Covers four formats: singular alternative, plural alternatives, you vs competitor, and competitor vs competitor. Emphasizes deep research, modular content architecture, and varied section types beyond feature tables."
|
||||
description: "When the user wants to create competitor comparison or alternative pages for SEO and sales enablement. Also use when the user mentions 'alternative page,' 'vs page,' 'competitor comparison,' 'comparison page,' '[Product] vs [Product],' '[Product] alternative,' 'competitive landing pages,' 'how do we compare to X,' 'battle card,' or 'competitor teardown.' Use this for any content that positions your product against competitors. Covers four formats: singular alternative, plural alternatives, you vs competitor, and competitor vs competitor. For sales-specific competitor docs, see sales-enablement."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Competitor & Alternative Pages
|
||||
@@ -11,7 +12,7 @@ You are an expert in creating competitor comparison and alternative pages. Your
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before creating competitor pages, understand:
|
||||
|
||||
@@ -252,3 +253,4 @@ Recommended pages to create with priority order based on search volume.
|
||||
- **copywriting**: For writing compelling comparison copy
|
||||
- **seo-audit**: For optimizing competitor pages
|
||||
- **schema-markup**: For FAQ and comparison schema
|
||||
- **sales-enablement**: For internal sales collateral, decks, and objection docs
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
|
||||
How to structure and maintain competitor data for scalable comparison pages.
|
||||
|
||||
## Contents
|
||||
- Centralized Competitor Data
|
||||
- Competitor Data Template
|
||||
- Your Product Data
|
||||
- Page Generation
|
||||
- Index Page Structure (alternatives index, vs comparisons index, index page best practices)
|
||||
- Footer Navigation
|
||||
|
||||
## Centralized Competitor Data
|
||||
|
||||
Create a single source of truth for each competitor:
|
||||
|
||||
@@ -2,6 +2,17 @@
|
||||
|
||||
Ready-to-use templates for each section of competitor comparison pages.
|
||||
|
||||
## Contents
|
||||
- TL;DR Summary
|
||||
- Paragraph Comparison (Not Just Tables)
|
||||
- Feature Comparison Section
|
||||
- Pricing Comparison Section
|
||||
- Service & Support Comparison
|
||||
- Who It's For Section
|
||||
- Migration Section
|
||||
- Social Proof Section
|
||||
- Comparison Table Best Practices (beyond checkmarks, organize by category, include ratings where useful)
|
||||
|
||||
## TL;DR Summary
|
||||
|
||||
Start every page with a quick summary for scanners:
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: content-strategy
|
||||
version: 1.0.0
|
||||
description: When the user wants to plan a content strategy, decide what content to create, or figure out what topics to cover. Also use when the user mentions "content strategy," "what should I write about," "content ideas," "blog strategy," "topic clusters," or "content planning." For writing individual pieces, see copywriting. For SEO-specific audits, see seo-audit.
|
||||
description: When the user wants to plan a content strategy, decide what content to create, or figure out what topics to cover. Also use when the user mentions "content strategy," "what should I write about," "content ideas," "blog strategy," "topic clusters," "content planning," "editorial calendar," "content marketing," "content roadmap," "what content should I create," "blog topics," "content pillars," or "I don't know what to write." Use this whenever someone needs help deciding what content to produce, not just writing it. For writing individual pieces, see copywriting. For SEO-specific audits, see seo-audit. For social media content specifically, see social-content.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Content Strategy
|
||||
@@ -11,7 +12,7 @@ You are a content strategist. Your goal is to help plan content that drives traf
|
||||
## Before Planning
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
@@ -351,6 +352,8 @@ Visual or structured representation of how content interconnects.
|
||||
|
||||
- **copywriting**: For writing individual content pieces
|
||||
- **seo-audit**: For technical SEO and on-page optimization
|
||||
- **ai-seo**: For optimizing content for AI search engines and getting cited by LLMs
|
||||
- **programmatic-seo**: For scaled content generation
|
||||
- **site-architecture**: For page hierarchy, navigation design, and URL structure
|
||||
- **email-sequence**: For email-based content
|
||||
- **social-content**: For social media content
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: copy-editing
|
||||
version: 1.0.0
|
||||
description: "When the user wants to edit, review, or improve existing marketing copy. Also use when the user mentions 'edit this copy,' 'review my copy,' 'copy feedback,' 'proofread,' 'polish this,' 'make this better,' or 'copy sweep.' This skill provides a systematic approach to editing marketing copy through multiple focused passes."
|
||||
description: "When the user wants to edit, review, or improve existing marketing copy. Also use when the user mentions 'edit this copy,' 'review my copy,' 'copy feedback,' 'proofread,' 'polish this,' 'make this better,' 'copy sweep,' 'tighten this up,' 'this reads awkwardly,' 'clean up this text,' 'too wordy,' or 'sharpen the messaging.' Use this when the user already has copy and wants it improved rather than rewritten from scratch. For writing new copy, see copywriting."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Copy Editing
|
||||
@@ -11,7 +12,7 @@ You are an expert copy editor specializing in marketing and conversion copy. You
|
||||
## Core Philosophy
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before editing. Use brand voice and customer language from that context to guide your edits.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before editing. Use brand voice and customer language from that context to guide your edits.
|
||||
|
||||
Good copy editing isn't about rewriting—it's about enhancing. Each pass focuses on one dimension, catching issues that get missed when you try to fix everything at once.
|
||||
|
||||
|
||||
@@ -6,6 +6,24 @@ Source: Plain English Campaign A-Z of Alternative Words (2001), Australian Gover
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- A
|
||||
- B
|
||||
- C
|
||||
- D
|
||||
- E
|
||||
- F
|
||||
- G-H
|
||||
- I
|
||||
- L-M
|
||||
- N-O
|
||||
- P
|
||||
- R
|
||||
- S
|
||||
- T-U
|
||||
- V-Z
|
||||
- Phrases to Remove Entirely
|
||||
|
||||
## A
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: copywriting
|
||||
version: 1.0.0
|
||||
description: When the user wants to write, rewrite, or improve marketing copy for any page — including homepage, landing pages, pricing pages, feature pages, about pages, or product pages. Also use when the user says "write copy for," "improve this copy," "rewrite this page," "marketing copy," "headline help," or "CTA copy." For email copy, see email-sequence. For popup copy, see popup-cro.
|
||||
description: When the user wants to write, rewrite, or improve marketing copy for any page — including homepage, landing pages, pricing pages, feature pages, about pages, or product pages. Also use when the user says "write copy for," "improve this copy," "rewrite this page," "marketing copy," "headline help," "CTA copy," "value proposition," "tagline," "subheadline," "hero section copy," "above the fold," "this copy is weak," "make this more compelling," or "help me describe my product." Use this whenever someone is working on website text that needs to persuade or convert. For email copy, see email-sequence. For popup copy, see popup-cro. For editing existing copy, see copy-editing.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Copywriting
|
||||
@@ -11,7 +12,7 @@ You are an expert conversion copywriter. Your goal is to write marketing copy th
|
||||
## Before Writing
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
Headline formulas, page section types, and structural templates.
|
||||
|
||||
## Contents
|
||||
- Headline Formulas (outcome-focused, problem-focused, audience-focused, differentiation-focused, proof-focused, additional formulas)
|
||||
- Landing Page Section Types (core sections, supporting sections)
|
||||
- Page Structure Templates (feature-heavy page, varied engaging page, compact landing page, enterprise/B2B landing page, product launch page)
|
||||
- Section Writing Tips (problem section, benefits section, how it works section, testimonial selection)
|
||||
|
||||
## Headline Formulas
|
||||
|
||||
### Outcome-Focused
|
||||
|
||||
@@ -6,6 +6,26 @@ Adapted from: University of Manchester Academic Phrasebank (2023), Plain English
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- Previewing Content Structure
|
||||
- Introducing a New Topic
|
||||
- Referring Back
|
||||
- Moving Between Sections
|
||||
- Indicating Addition
|
||||
- Indicating Contrast
|
||||
- Indicating Similarity
|
||||
- Indicating Cause and Effect
|
||||
- Giving Examples
|
||||
- Emphasising Key Points
|
||||
- Providing Evidence (neutral attribution, expert quotes, supporting claims)
|
||||
- Summarising Sections
|
||||
- Concluding Content
|
||||
- Question-Based Transitions
|
||||
- List Introductions
|
||||
- Hedging Language
|
||||
- Best Practice Guidelines
|
||||
- Transitions to Avoid (AI Tells)
|
||||
|
||||
## Previewing Content Structure
|
||||
|
||||
Use to orient readers and set expectations:
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: email-sequence
|
||||
version: 1.0.0
|
||||
description: When the user wants to create or optimize an email sequence, drip campaign, automated email flow, or lifecycle email program. Also use when the user mentions "email sequence," "drip campaign," "nurture sequence," "onboarding emails," "welcome sequence," "re-engagement emails," "email automation," or "lifecycle emails." For in-app onboarding, see onboarding-cro.
|
||||
description: When the user wants to create or optimize an email sequence, drip campaign, automated email flow, or lifecycle email program. Also use when the user mentions "email sequence," "drip campaign," "nurture sequence," "onboarding emails," "welcome sequence," "re-engagement emails," "email automation," "lifecycle emails," "trigger-based emails," "email funnel," "email workflow," "what emails should I send," "welcome series," or "email cadence." Use this for any multi-email automated flow. For cold outreach emails, see cold-email. For in-app onboarding, see onboarding-cro.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Email Sequence Design
|
||||
@@ -11,7 +12,7 @@ You are an expert in email marketing and automation. Your goal is to create emai
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before creating a sequence, understand:
|
||||
|
||||
@@ -300,7 +301,9 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key email
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **churn-prevention**: For cancel flows, save offers, and dunning strategy (email supports this)
|
||||
- **onboarding-cro**: For in-app onboarding (email supports this)
|
||||
- **copywriting**: For landing pages emails link to
|
||||
- **ab-test-setup**: For testing email elements
|
||||
- **popup-cro**: For email capture popups
|
||||
- **revops**: For lifecycle stages that trigger email sequences
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# Email Copy Guidelines
|
||||
|
||||
## Contents
|
||||
- Structure
|
||||
- Formatting
|
||||
- Tone
|
||||
- Length
|
||||
- CTA Buttons vs. Links
|
||||
- Personalization (merge fields, dynamic content, triggered emails)
|
||||
- Segmentation Strategies (by behavior, by stage, by profile)
|
||||
- Testing and Optimization (what to test, how to test, metrics to track)
|
||||
|
||||
## Structure
|
||||
|
||||
1. **Hook**: First line grabs attention
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
A comprehensive guide to lifecycle and campaign emails. Use this as an audit checklist and implementation reference.
|
||||
|
||||
## Contents
|
||||
- Onboarding Emails (new users series, new customers series, key onboarding step reminder, new user invite)
|
||||
- Retention Emails (upgrade to paid, upgrade to higher plan, ask for review, offer support proactively, product usage report, NPS survey, referral program)
|
||||
- Billing Emails (switch to annual, failed payment recovery, cancellation survey, upcoming renewal reminder)
|
||||
- Usage Emails (daily/weekly/monthly summary, key event or milestone notifications)
|
||||
- Win-Back Emails (expired trials, cancelled customers)
|
||||
- Campaign Emails (monthly roundup/newsletter, seasonal promotions, product updates, industry news roundup, pricing update)
|
||||
- Email Audit Checklist (onboarding, retention, billing, usage, win-back, campaigns)
|
||||
|
||||
## Onboarding Emails
|
||||
|
||||
### New Users Series
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
Detailed templates for common email sequences.
|
||||
|
||||
## Contents
|
||||
- Welcome Sequence (Post-Signup)
|
||||
- Lead Nurture Sequence (Pre-Sale)
|
||||
- Re-Engagement Sequence
|
||||
- Onboarding Sequence (Product Users)
|
||||
|
||||
## Welcome Sequence (Post-Signup)
|
||||
|
||||
**Email 1: Welcome (Immediate)**
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: form-cro
|
||||
version: 1.0.0
|
||||
description: When the user wants to optimize any form that is NOT signup/registration — including lead capture forms, contact forms, demo request forms, application forms, survey forms, or checkout forms. Also use when the user mentions "form optimization," "lead form conversions," "form friction," "form fields," "form completion rate," or "contact form." For signup/registration forms, see signup-flow-cro. For popups containing forms, see popup-cro.
|
||||
description: When the user wants to optimize any form that is NOT signup/registration — including lead capture forms, contact forms, demo request forms, application forms, survey forms, or checkout forms. Also use when the user mentions "form optimization," "lead form conversions," "form friction," "form fields," "form completion rate," "contact form," "nobody fills out our form," "form abandonment," "too many fields," "demo request form," or "lead form isn't converting." Use this for any non-signup form that captures information. For signup/registration forms, see signup-flow-cro. For popups containing forms, see popup-cro.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Form CRO
|
||||
@@ -11,7 +12,7 @@ You are an expert in form optimization. Your goal is to maximize form completion
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before providing recommendations, identify:
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: free-tool-strategy
|
||||
version: 1.0.0
|
||||
description: When the user wants to plan, evaluate, or build a free tool for marketing purposes — lead generation, SEO value, or brand awareness. Also use when the user mentions "engineering as marketing," "free tool," "marketing tool," "calculator," "generator," "interactive tool," "lead gen tool," "build a tool for leads," or "free resource." This skill bridges engineering and marketing — useful for founders and technical marketers.
|
||||
description: When the user wants to plan, evaluate, or build a free tool for marketing purposes — lead generation, SEO value, or brand awareness. Also use when the user mentions "engineering as marketing," "free tool," "marketing tool," "calculator," "generator," "interactive tool," "lead gen tool," "build a tool for leads," "free resource," "ROI calculator," "grader tool," "audit tool," "should I build a free tool," or "tools for lead gen." Use this whenever someone wants to build something useful and give it away to attract leads or earn links. For content-based lead generation, see content-strategy.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Free Tool Strategy (Engineering as Marketing)
|
||||
@@ -11,7 +12,7 @@ You are an expert in engineering-as-marketing strategy. Your goal is to help pla
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before designing a tool strategy, understand:
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
Detailed guide to each type of marketing tool you can build.
|
||||
|
||||
## Contents
|
||||
- Calculators
|
||||
- Generators
|
||||
- Analyzers/Auditors
|
||||
- Testers/Validators
|
||||
- Libraries/Resources
|
||||
- Interactive Educational
|
||||
- Tool Concept Examples by Industry (SaaS product, agency/services, e-commerce, developer tools, finance)
|
||||
|
||||
## Calculators
|
||||
|
||||
**Best for**: Decisions involving numbers, comparisons, estimates
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: launch-strategy
|
||||
version: 1.0.0
|
||||
description: "When the user wants to plan a product launch, feature announcement, or release strategy. Also use when the user mentions 'launch,' 'Product Hunt,' 'feature release,' 'announcement,' 'go-to-market,' 'beta launch,' 'early access,' 'waitlist,' or 'product update.' This skill covers phased launches, channel strategy, and ongoing launch momentum."
|
||||
description: "When the user wants to plan a product launch, feature announcement, or release strategy. Also use when the user mentions 'launch,' 'Product Hunt,' 'feature release,' 'announcement,' 'go-to-market,' 'beta launch,' 'early access,' 'waitlist,' 'product update,' 'how do I launch this,' 'launch checklist,' 'GTM plan,' or 'we're about to ship.' Use this whenever someone is preparing to release something publicly. For ongoing marketing after launch, see marketing-ideas."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Launch Strategy
|
||||
@@ -11,7 +12,7 @@ You are an expert in SaaS product launches and feature announcements. Your goal
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
---
|
||||
|
||||
@@ -349,3 +350,4 @@ Even small changelog updates remind customers your product is evolving. This bui
|
||||
- **page-cro**: For optimizing launch landing pages
|
||||
- **marketing-psychology**: For psychology behind waitlists and exclusivity
|
||||
- **programmatic-seo**: For comparison pages mentioned in post-launch
|
||||
- **sales-enablement**: For launch sales collateral and enablement materials
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: marketing-ideas
|
||||
version: 1.0.0
|
||||
description: "When the user needs marketing ideas, inspiration, or strategies for their SaaS or software product. Also use when the user asks for 'marketing ideas,' 'growth ideas,' 'how to market,' 'marketing strategies,' 'marketing tactics,' 'ways to promote,' or 'ideas to grow.' This skill provides 139 proven marketing approaches organized by category."
|
||||
description: "When the user needs marketing ideas, inspiration, or strategies for their SaaS or software product. Also use when the user asks for 'marketing ideas,' 'growth ideas,' 'how to market,' 'marketing strategies,' 'marketing tactics,' 'ways to promote,' 'ideas to grow,' 'what else can I try,' 'I don't know how to market this,' 'brainstorm marketing,' or 'what marketing should I do.' Use this as a starting point whenever someone is stuck or looking for inspiration on how to grow. For specific channel execution, see the relevant skill (paid-ads, social-content, email-sequence, etc.)."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Marketing Ideas for SaaS
|
||||
@@ -11,7 +12,7 @@ You are a marketing strategist with a library of 139 proven marketing ideas. You
|
||||
## How to Use This Skill
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
When asked for marketing ideas:
|
||||
1. Ask about their product, audience, and current stage if not clear
|
||||
|
||||
@@ -2,6 +2,25 @@
|
||||
|
||||
Complete list of proven marketing approaches organized by category.
|
||||
|
||||
## Contents
|
||||
- Content & SEO (1-10)
|
||||
- Competitor & Comparison (11-13)
|
||||
- Free Tools & Engineering (14-22)
|
||||
- Paid Advertising (23-34)
|
||||
- Social Media & Community (35-44)
|
||||
- Email Marketing (45-53)
|
||||
- Partnerships & Programs (54-64)
|
||||
- Events & Speaking (65-72)
|
||||
- PR & Media (73-76)
|
||||
- Launches & Promotions (77-86)
|
||||
- Product-Led Growth (87-96)
|
||||
- Content Formats (97-109)
|
||||
- Unconventional & Creative (110-122)
|
||||
- Platforms & Marketplaces (123-130)
|
||||
- International & Localization (131-132)
|
||||
- Developer & Technical (133-136)
|
||||
- Audience-Specific (137-139)
|
||||
|
||||
## Content & SEO (1-10)
|
||||
|
||||
1. **Easy Keyword Ranking** - Target low-competition keywords where you can rank quickly. Find terms competitors overlook—niche variations, long-tail queries, emerging topics.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: marketing-psychology
|
||||
version: 1.0.0
|
||||
description: "When the user wants to apply psychological principles, mental models, or behavioral science to marketing. Also use when the user mentions 'psychology,' 'mental models,' 'cognitive bias,' 'persuasion,' 'behavioral science,' 'why people buy,' 'decision-making,' or 'consumer behavior.' This skill provides 70+ mental models organized for marketing application."
|
||||
description: "When the user wants to apply psychological principles, mental models, or behavioral science to marketing. Also use when the user mentions 'psychology,' 'mental models,' 'cognitive bias,' 'persuasion,' 'behavioral science,' 'why people buy,' 'decision-making,' 'consumer behavior,' 'anchoring,' 'social proof,' 'scarcity,' 'loss aversion,' 'framing,' or 'nudge.' Use this whenever someone wants to understand or leverage how people think and make decisions in a marketing context."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Marketing Psychology & Mental Models
|
||||
@@ -11,7 +12,7 @@ You are an expert in applying psychological principles and mental models to mark
|
||||
## How to Use This Skill
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before applying mental models. Use that context to tailor recommendations to the specific product and audience.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before applying mental models. Use that context to tailor recommendations to the specific product and audience.
|
||||
|
||||
Mental models are thinking tools that help you make better decisions, understand customer behavior, and create more effective marketing. When helping users:
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: onboarding-cro
|
||||
version: 1.0.0
|
||||
description: When the user wants to optimize post-signup onboarding, user activation, first-run experience, or time-to-value. Also use when the user mentions "onboarding flow," "activation rate," "user activation," "first-run experience," "empty states," "onboarding checklist," "aha moment," or "new user experience." For signup/registration optimization, see signup-flow-cro. For ongoing email sequences, see email-sequence.
|
||||
description: When the user wants to optimize post-signup onboarding, user activation, first-run experience, or time-to-value. Also use when the user mentions "onboarding flow," "activation rate," "user activation," "first-run experience," "empty states," "onboarding checklist," "aha moment," "new user experience," "users aren't activating," "nobody completes setup," "low activation rate," "users sign up but don't use the product," "time to value," or "first session experience." Use this whenever users are signing up but not sticking around. For signup/registration optimization, see signup-flow-cro. For ongoing email sequences, see email-sequence.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Onboarding CRO
|
||||
@@ -11,7 +12,7 @@ You are an expert in user onboarding and activation. Your goal is to help users
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before providing recommendations, understand:
|
||||
|
||||
|
||||
@@ -2,6 +2,16 @@
|
||||
|
||||
Comprehensive list of A/B tests and experiments for user onboarding and activation.
|
||||
|
||||
## Contents
|
||||
- Flow Simplification Experiments (reduce friction, step sequencing, progress & motivation)
|
||||
- Guided Experience Experiments (product tours, CTA optimization, UI guidance)
|
||||
- Personalization Experiments (user segmentation, dynamic content)
|
||||
- Quick Wins & Engagement Experiments (time-to-value, motivation mechanics, support & help)
|
||||
- Email & Multi-Channel Experiments (onboarding emails, email content, feedback loops)
|
||||
- Re-engagement Experiments (stalled user recovery, return experience)
|
||||
- Technical & UX Experiments (performance, mobile onboarding, accessibility)
|
||||
- Metrics to Track
|
||||
|
||||
## Flow Simplification Experiments
|
||||
|
||||
### Reduce Friction
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: page-cro
|
||||
version: 1.0.0
|
||||
description: When the user wants to optimize, improve, or increase conversions on any marketing page — including homepage, landing pages, pricing pages, feature pages, or blog posts. Also use when the user says "CRO," "conversion rate optimization," "this page isn't converting," "improve conversions," or "why isn't this page working." For signup/registration flows, see signup-flow-cro. For post-signup activation, see onboarding-cro. For forms outside of signup, see form-cro. For popups/modals, see popup-cro.
|
||||
description: When the user wants to optimize, improve, or increase conversions on any marketing page — including homepage, landing pages, pricing pages, feature pages, or blog posts. Also use when the user says "CRO," "conversion rate optimization," "this page isn't converting," "improve conversions," "why isn't this page working," "my landing page sucks," "nobody's converting," "low conversion rate," "bounce rate is too high," "people leave without signing up," or "this page needs work." Use this even if the user just shares a URL and asks for feedback — they probably want conversion help. For signup/registration flows, see signup-flow-cro. For post-signup activation, see onboarding-cro. For forms outside of signup, see form-cro. For popups/modals, see popup-cro.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Page Conversion Rate Optimization (CRO)
|
||||
@@ -11,7 +12,7 @@ You are a conversion rate optimization expert. Your goal is to analyze marketing
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before providing recommendations, identify:
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
Comprehensive list of A/B tests and experiments organized by page type.
|
||||
|
||||
## Contents
|
||||
- Homepage Experiments (Hero Section, Trust & Social Proof, Features & Content, Navigation & UX)
|
||||
- Pricing Page Experiments (Price Presentation, Pricing UX, Objection Handling, Trust Signals)
|
||||
- Demo Request Page Experiments (Form Optimization, Page Content, CTA & Routing)
|
||||
- Resource/Blog Page Experiments (Content CTAs, Resource Section)
|
||||
- Landing Page Experiments (Message Match, Conversion Focus, Page Length)
|
||||
- Feature Page Experiments (Feature Presentation, Conversion Path)
|
||||
- Cross-Page Experiments (Site-Wide Tests, Navigation Tests)
|
||||
|
||||
## Homepage Experiments
|
||||
|
||||
### Hero Section
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: paid-ads
|
||||
version: 1.0.0
|
||||
description: "When the user wants help with paid advertising campaigns on Google Ads, Meta (Facebook/Instagram), LinkedIn, Twitter/X, or other ad platforms. Also use when the user mentions 'PPC,' 'paid media,' 'ad copy,' 'ad creative,' 'ROAS,' 'CPA,' 'ad campaign,' 'retargeting,' or 'audience targeting.' This skill covers campaign strategy, ad creation, audience targeting, and optimization."
|
||||
description: "When the user wants help with paid advertising campaigns on Google Ads, Meta (Facebook/Instagram), LinkedIn, Twitter/X, or other ad platforms. Also use when the user mentions 'PPC,' 'paid media,' 'ROAS,' 'CPA,' 'ad campaign,' 'retargeting,' 'audience targeting,' 'Google Ads,' 'Facebook ads,' 'LinkedIn ads,' 'ad budget,' 'cost per click,' 'ad spend,' or 'should I run ads.' Use this for campaign strategy, audience targeting, bidding, and optimization. For bulk ad creative generation and iteration, see ad-creative. For landing page optimization, see page-cro."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Paid Ads
|
||||
@@ -11,7 +12,7 @@ You are an expert performance marketer with direct access to ad platform account
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
@@ -307,6 +308,7 @@ For tracking, see also: [ga4.md](../../tools/integrations/ga4.md), [segment.md](
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **ad-creative**: For generating and iterating ad headlines, descriptions, and creative at scale
|
||||
- **copywriting**: For landing page copy that converts ad traffic
|
||||
- **analytics-tracking**: For proper conversion tracking setup
|
||||
- **ab-test-setup**: For landing page testing to improve ROAS
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
|
||||
Detailed formulas and templates for writing high-converting ad copy.
|
||||
|
||||
## Contents
|
||||
- Primary Text Formulas (Problem-Agitate-Solve, Before-After-Bridge, Social Proof Lead, Feature-Benefit Bridge, Direct Response)
|
||||
- Headline Formulas (For Search Ads, For Social Ads)
|
||||
- CTA Variations (Soft CTAs, Hard CTAs, Urgency CTAs, Action-Oriented CTAs)
|
||||
- Platform-Specific Copy Guidelines (Google Search Ads, Meta Ads, LinkedIn Ads)
|
||||
- Copy Testing Priority
|
||||
|
||||
## Primary Text Formulas
|
||||
|
||||
### Problem-Agitate-Solve (PAS)
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
Detailed targeting strategies for each major ad platform.
|
||||
|
||||
## Contents
|
||||
- Google Ads Audiences (Search Campaign Targeting, Display/YouTube Targeting)
|
||||
- Meta Audiences (Core Audiences, Custom Audiences, Lookalike Audiences)
|
||||
- LinkedIn Audiences (Job-Based Targeting, Company-Based Targeting, High-Performing Combinations)
|
||||
- Twitter/X Audiences
|
||||
- TikTok Audiences
|
||||
- Audience Size Guidelines
|
||||
- Exclusion Strategy
|
||||
|
||||
## Google Ads Audiences
|
||||
|
||||
### Search Campaign Targeting
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
|
||||
Complete setup checklists for major ad platforms.
|
||||
|
||||
## Contents
|
||||
- Google Ads Setup (Account Foundation, Conversion Tracking, Analytics Integration, Audience Setup, Campaign Readiness, Ad Extensions, Brand Protection)
|
||||
- Meta Ads Setup (Business Manager Foundation, Pixel & Tracking, Domain & Aggregated Events, Audience Setup, Catalog, Creative Assets, Compliance)
|
||||
- LinkedIn Ads Setup (Campaign Manager Foundation, Insight Tag & Tracking, Audience Setup, Lead Gen Forms, Document Ads, Creative Assets, Budget Considerations)
|
||||
- Twitter/X Ads Setup (Account Foundation, Tracking, Audience Setup, Creative)
|
||||
- TikTok Ads Setup (Account Foundation, Pixel & Tracking, Audience Setup, Creative)
|
||||
- Universal Pre-Launch Checklist
|
||||
|
||||
## Google Ads Setup
|
||||
|
||||
### Account Foundation
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: paywall-upgrade-cro
|
||||
version: 1.0.0
|
||||
description: When the user wants to create or optimize in-app paywalls, upgrade screens, upsell modals, or feature gates. Also use when the user mentions "paywall," "upgrade screen," "upgrade modal," "upsell," "feature gate," "convert free to paid," "freemium conversion," "trial expiration screen," "limit reached screen," "plan upgrade prompt," or "in-app pricing." Distinct from public pricing pages (see page-cro) — this skill focuses on in-product upgrade moments where the user has already experienced value.
|
||||
description: When the user wants to create or optimize in-app paywalls, upgrade screens, upsell modals, or feature gates. Also use when the user mentions "paywall," "upgrade screen," "upgrade modal," "upsell," "feature gate," "convert free to paid," "freemium conversion," "trial expiration screen," "limit reached screen," "plan upgrade prompt," "in-app pricing," "free users won't upgrade," "trial to paid conversion," or "how do I get users to pay." Use this for any in-product moment where you're asking users to upgrade. Distinct from public pricing pages (see page-cro) — this focuses on in-product upgrade moments where the user has already experienced value. For pricing decisions, see pricing-strategy.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Paywall and Upgrade Screen CRO
|
||||
@@ -11,7 +12,7 @@ You are an expert in in-app paywalls and upgrade flows. Your goal is to convert
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before providing recommendations, understand:
|
||||
|
||||
@@ -220,6 +221,7 @@ What you've accomplished:
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **churn-prevention**: For cancel flows, save offers, and reducing churn post-upgrade
|
||||
- **page-cro**: For public pricing page optimization
|
||||
- **onboarding-cro**: For driving to aha moment before upgrade
|
||||
- **ab-test-setup**: For testing paywall variations
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
Comprehensive list of A/B tests and experiments for paywall optimization.
|
||||
|
||||
## Contents
|
||||
- Trigger & Timing Experiments (When to Show, Trigger Type)
|
||||
- Paywall Design Experiments (Layout & Format, Value Presentation, Visual Elements)
|
||||
- Pricing Presentation Experiments (Price Display, Plan Options, Discounts & Offers)
|
||||
- Copy & Messaging Experiments (Headlines, CTAs, Objection Handling)
|
||||
- Trial & Conversion Experiments (Trial Structure, Trial Expiration, Upgrade Path)
|
||||
- Personalization Experiments (Usage-Based, Segment-Specific)
|
||||
- Frequency & UX Experiments (Frequency Capping, Dismiss Behavior)
|
||||
|
||||
## Trigger & Timing Experiments
|
||||
|
||||
### When to Show
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: popup-cro
|
||||
version: 1.0.0
|
||||
description: When the user wants to create or optimize popups, modals, overlays, slide-ins, or banners for conversion purposes. Also use when the user mentions "exit intent," "popup conversions," "modal optimization," "lead capture popup," "email popup," "announcement banner," or "overlay." For forms outside of popups, see form-cro. For general page conversion optimization, see page-cro.
|
||||
description: When the user wants to create or optimize popups, modals, overlays, slide-ins, or banners for conversion purposes. Also use when the user mentions "exit intent," "popup conversions," "modal optimization," "lead capture popup," "email popup," "announcement banner," "overlay," "collect emails with a popup," "exit popup," "scroll trigger," "sticky bar," or "notification bar." Use this for any overlay or interrupt-style conversion element. For forms outside of popups, see form-cro. For general page conversion optimization, see page-cro.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Popup CRO
|
||||
@@ -11,7 +12,7 @@ You are an expert in popup and modal optimization. Your goal is to create popups
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before providing recommendations, understand:
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: pricing-strategy
|
||||
version: 1.0.0
|
||||
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,' or 'monetization.' This skill covers pricing research, tier structure, and packaging strategy."
|
||||
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 paywall-upgrade-cro."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Pricing Strategy
|
||||
@@ -11,7 +12,7 @@ You are an expert in SaaS pricing and monetization strategy. Your goal is to hel
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
@@ -221,7 +222,10 @@ Identifies which features customers value most:
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **churn-prevention**: For cancel flows, save offers, and reducing revenue churn
|
||||
- **page-cro**: For optimizing pricing page conversion
|
||||
- **copywriting**: For pricing page copy
|
||||
- **marketing-psychology**: For pricing psychology principles
|
||||
- **ab-test-setup**: For testing pricing changes
|
||||
- **revops**: For deal desk processes and pipeline pricing
|
||||
- **sales-enablement**: For proposal templates and pricing presentations
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# Pricing Research Methods
|
||||
|
||||
## Contents
|
||||
- Van Westendorp Price Sensitivity Meter (The Four Questions, How to Analyze, Survey Tips, Sample Output)
|
||||
- MaxDiff Analysis (How It Works, Example Survey Question, Analyzing Results, Using MaxDiff for Packaging)
|
||||
- Willingness to Pay Surveys
|
||||
- Usage-Value Correlation Analysis
|
||||
|
||||
## Van Westendorp Price Sensitivity Meter
|
||||
|
||||
The Van Westendorp survey identifies the acceptable price range for your product.
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Tier Structure and Packaging
|
||||
|
||||
## Contents
|
||||
- How Many Tiers?
|
||||
- Good-Better-Best Framework
|
||||
- Tier Differentiation Strategies
|
||||
- Example Tier Structure
|
||||
- Packaging for Personas (Identifying Pricing Personas, Persona-Based Packaging)
|
||||
- Freemium vs. Free Trial (When to Use Freemium, When to Use Free Trial, Hybrid Approaches)
|
||||
- Enterprise Pricing (When to Add Custom Pricing, Enterprise Tier Elements, Enterprise Pricing Strategies)
|
||||
|
||||
## How Many Tiers?
|
||||
|
||||
**2 tiers:** Simple, clear choice
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
---
|
||||
name: product-marketing-context
|
||||
version: 1.0.0
|
||||
description: "When the user wants to create or update their product marketing context document. Also use when the user mentions 'product context,' 'marketing context,' 'set up context,' 'positioning,' or wants to avoid repeating foundational information across marketing tasks. Creates `.claude/product-marketing-context.md` that other marketing skills reference."
|
||||
description: "When the user wants to create or update their product marketing context document. Also use when the user mentions 'product context,' 'marketing context,' 'set up context,' 'positioning,' 'who is my target audience,' 'describe my product,' 'ICP,' 'ideal customer profile,' or wants to avoid repeating foundational information across marketing tasks. Use this at the start of any new project before using other marketing skills — it creates `.agents/product-marketing-context.md` that all other skills reference for product, audience, and positioning context."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Product Marketing Context
|
||||
|
||||
You help users create and maintain a product marketing context document. This captures foundational positioning and messaging information that other marketing skills reference, so users don't repeat themselves.
|
||||
|
||||
The document is stored at `.claude/product-marketing-context.md`.
|
||||
The document is stored at `.agents/product-marketing-context.md`.
|
||||
|
||||
## Workflow
|
||||
|
||||
### Step 1: Check for Existing Context
|
||||
|
||||
First, check if `.claude/product-marketing-context.md` already exists.
|
||||
First, check if `.agents/product-marketing-context.md` already exists. Also check `.claude/product-marketing-context.md` for older setups — if found there but not in `.agents/`, offer to move it.
|
||||
|
||||
**If it exists:**
|
||||
- Read it and summarize what's captured
|
||||
@@ -127,7 +128,7 @@ The JTBD Four Forces:
|
||||
|
||||
## Step 3: Create the Document
|
||||
|
||||
After gathering information, create `.claude/product-marketing-context.md` with this structure:
|
||||
After gathering information, create `.agents/product-marketing-context.md` with this structure:
|
||||
|
||||
```markdown
|
||||
# Product Marketing Context
|
||||
@@ -226,7 +227,7 @@ After gathering information, create `.claude/product-marketing-context.md` with
|
||||
|
||||
- Show the completed document
|
||||
- Ask if anything needs adjustment
|
||||
- Save to `.claude/product-marketing-context.md`
|
||||
- Save to `.agents/product-marketing-context.md`
|
||||
- Tell them: "Other marketing skills will now use this context automatically. Run `/product-marketing-context` anytime to update it."
|
||||
|
||||
---
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: programmatic-seo
|
||||
version: 1.0.0
|
||||
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," or "building many pages for SEO." For auditing existing SEO issues, see seo-audit.
|
||||
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 seo-audit. For content strategy planning, see content-strategy.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Programmatic SEO
|
||||
@@ -11,7 +12,7 @@ You are an expert in programmatic SEO—building SEO-optimized pages at scale us
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before designing a programmatic SEO strategy, understand:
|
||||
|
||||
@@ -233,4 +234,5 @@ Watch for: Thin content warnings, Ranking drops, Manual actions, Crawl errors
|
||||
|
||||
- **seo-audit**: For auditing programmatic pages after launch
|
||||
- **schema-markup**: For adding structured data
|
||||
- **site-architecture**: For page hierarchy, URL structure, and internal linking
|
||||
- **competitor-alternatives**: For comparison page frameworks
|
||||
|
||||
@@ -2,6 +2,21 @@
|
||||
|
||||
Beyond mixing and matching data point permutations, these are the proven playbooks for programmatic SEO.
|
||||
|
||||
## Contents
|
||||
- 1. Templates
|
||||
- 2. Curation
|
||||
- 3. Conversions
|
||||
- 4. Comparisons
|
||||
- 5. Examples
|
||||
- 6. Locations
|
||||
- 7. Personas
|
||||
- 8. Integrations
|
||||
- 9. Glossary
|
||||
- 10. Translations
|
||||
- 11. Directory
|
||||
- 12. Profiles
|
||||
- Choosing Your Playbook (Match to Your Assets, Combine Playbooks)
|
||||
|
||||
## 1. Templates
|
||||
|
||||
**Pattern**: "[Type] template" or "free [type] template"
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: referral-program
|
||||
version: 1.0.0
|
||||
description: "When the user wants to create, optimize, or analyze a referral program, affiliate program, or word-of-mouth strategy. Also use when the user mentions 'referral,' 'affiliate,' 'ambassador,' 'word of mouth,' 'viral loop,' 'refer a friend,' or 'partner program.' This skill covers program design, incentive structure, and growth optimization."
|
||||
description: "When the user wants to create, optimize, or analyze a referral program, affiliate program, or word-of-mouth strategy. Also use when the user mentions 'referral,' 'affiliate,' 'ambassador,' 'word of mouth,' 'viral loop,' 'refer a friend,' 'partner program,' 'referral incentive,' 'how to get referrals,' 'customers referring customers,' or 'affiliate payout.' Use this whenever someone wants existing users or partners to bring in new customers. For launch-specific virality, see launch-strategy."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Referral & Affiliate Programs
|
||||
@@ -11,7 +12,7 @@ You are an expert in viral growth and referral marketing. Your goal is to help d
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
|
||||
Detailed guidance for building and managing affiliate programs.
|
||||
|
||||
## Contents
|
||||
- Commission Structures
|
||||
- Cookie Duration
|
||||
- Affiliate Recruitment
|
||||
- Affiliate Enablement
|
||||
- Tools & Platforms (Referral Program Tools, Affiliate Program Tools, Choosing a Tool)
|
||||
- Fraud Prevention (Common Referral Fraud, Prevention Measures)
|
||||
|
||||
## Commission Structures
|
||||
|
||||
**Percentage of sale:**
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
Real-world examples of successful referral programs.
|
||||
|
||||
## Contents
|
||||
- Dropbox (Classic)
|
||||
- Uber/Lyft
|
||||
- Morning Brew
|
||||
- Notion
|
||||
- Incentive Types Comparison
|
||||
- Incentive Sizing Framework
|
||||
- Viral Coefficient & Metrics (Key Metrics, Calculating Referral Program ROI)
|
||||
|
||||
## Dropbox (Classic)
|
||||
|
||||
**Program:** Give 500MB storage, get 500MB storage
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
---
|
||||
name: revops
|
||||
description: "When the user wants help with revenue operations, lead lifecycle management, or marketing-to-sales handoff processes. Also use when the user mentions 'RevOps,' 'revenue operations,' 'lead scoring,' 'lead routing,' 'MQL,' 'SQL,' 'pipeline stages,' 'deal desk,' 'CRM automation,' 'marketing-to-sales handoff,' 'data hygiene,' 'leads aren't getting to sales,' 'pipeline management,' 'lead qualification,' or 'when should marketing hand off to sales.' Use this for anything involving the systems and processes that connect marketing to revenue. For cold outreach emails, see cold-email. For email drip campaigns, see email-sequence. For pricing decisions, see pricing-strategy."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# RevOps
|
||||
|
||||
You are an expert in revenue operations. Your goal is to help design and optimize the systems that connect marketing, sales, and customer success into a unified revenue engine.
|
||||
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
1. **GTM motion** — Product-led (PLG), sales-led, or hybrid?
|
||||
2. **ACV range** — What's the average contract value?
|
||||
3. **Sales cycle length** — Days from first touch to closed-won?
|
||||
4. **Current stack** — CRM, marketing automation, scheduling, enrichment tools?
|
||||
5. **Current state** — How are leads managed today? What's working and what's not?
|
||||
6. **Goals** — Increase conversion? Reduce speed-to-lead? Fix handoff leaks? Build from scratch?
|
||||
|
||||
Work with whatever the user gives you. If they have a clear problem area, start there. Don't block on missing inputs — use what you have and note what would strengthen the solution.
|
||||
|
||||
---
|
||||
|
||||
## Core Principles
|
||||
|
||||
### Single Source of Truth
|
||||
One system of record for every lead and account. If data lives in multiple places, it will conflict. Pick a CRM as the canonical source and sync everything to it.
|
||||
|
||||
### Define Before Automate
|
||||
Get stage definitions, scoring criteria, and routing rules right on paper before building workflows. Automating a broken process just creates broken results faster.
|
||||
|
||||
### Measure Every Handoff
|
||||
Every handoff between teams is a potential leak. Marketing-to-sales, SDR-to-AE, AE-to-CS — each needs an SLA, a tracking mechanism, and someone accountable for follow-through.
|
||||
|
||||
### Revenue Team Alignment
|
||||
Marketing, sales, and customer success must agree on definitions. If marketing calls something an MQL but sales won't work it, the definition is wrong. Alignment meetings aren't optional.
|
||||
|
||||
---
|
||||
|
||||
## Lead Lifecycle Framework
|
||||
|
||||
### Stage Definitions
|
||||
|
||||
| Stage | Entry Criteria | Exit Criteria | Owner |
|
||||
|-------|---------------|---------------|-------|
|
||||
| **Subscriber** | Opts in to content (blog, newsletter) | Provides company info or shows engagement | Marketing |
|
||||
| **Lead** | Identified contact with basic info | Meets minimum fit criteria | Marketing |
|
||||
| **MQL** | Passes fit + engagement threshold | Sales accepts or rejects within SLA | Marketing |
|
||||
| **SQL** | Sales accepts and qualifies via conversation | Opportunity created or recycled | Sales (SDR/AE) |
|
||||
| **Opportunity** | Budget, authority, need, timeline confirmed | Closed-won or closed-lost | Sales (AE) |
|
||||
| **Customer** | Closed-won deal | Expands, renews, or churns | CS / Account Mgmt |
|
||||
| **Evangelist** | High NPS, referral activity, case study | Ongoing program participation | CS / Marketing |
|
||||
|
||||
### MQL Definition
|
||||
|
||||
An MQL requires both **fit** and **engagement**:
|
||||
|
||||
- **Fit score** — Does this person match your ICP? (company size, industry, role, tech stack)
|
||||
- **Engagement score** — Have they shown buying intent? (pricing page, demo request, multiple visits)
|
||||
|
||||
Neither alone is sufficient. A perfect-fit company that never engages isn't an MQL. A student downloading every ebook isn't an MQL.
|
||||
|
||||
### MQL-to-SQL Handoff SLA
|
||||
|
||||
Define response times and document them:
|
||||
- MQL alert sent to assigned rep
|
||||
- Rep contacts within **4 hours** (business hours)
|
||||
- Rep qualifies or rejects within **48 hours**
|
||||
- Rejected MQLs go to recycling nurture with reason code
|
||||
|
||||
**For complete lifecycle stage templates and SLA examples**: See [references/lifecycle-definitions.md](references/lifecycle-definitions.md)
|
||||
|
||||
---
|
||||
|
||||
## Lead Scoring
|
||||
|
||||
### Scoring Dimensions
|
||||
|
||||
**Explicit scoring (fit)** — Who they are:
|
||||
- Company size, industry, revenue
|
||||
- Job title, seniority, department
|
||||
- Tech stack, geography
|
||||
|
||||
**Implicit scoring (engagement)** — What they do:
|
||||
- Page visits (especially pricing, demo, case studies)
|
||||
- Content downloads, webinar attendance
|
||||
- Email engagement (opens, clicks)
|
||||
- Product usage (for PLG)
|
||||
|
||||
**Negative scoring** — Disqualifying signals:
|
||||
- Competitor email domains
|
||||
- Student/personal email
|
||||
- Unsubscribes, spam complaints
|
||||
- Job title mismatches (intern, student)
|
||||
|
||||
### Building a Scoring Model
|
||||
|
||||
1. Define your ICP attributes and weight them
|
||||
2. Identify high-intent behavioral signals from closed-won data
|
||||
3. Set point values for each attribute and behavior
|
||||
4. Set MQL threshold (typically 50-80 points on a 100-point scale)
|
||||
5. Test against historical data — does the model correctly identify past wins?
|
||||
6. Launch, measure, and recalibrate quarterly
|
||||
|
||||
### Common Scoring Mistakes
|
||||
|
||||
- Weighting content downloads too heavily (research ≠ buying intent)
|
||||
- Not including negative scoring (lets bad leads through)
|
||||
- Setting and forgetting (buyer behavior changes; recalibrate quarterly)
|
||||
- Scoring all page visits equally (pricing page ≠ blog post)
|
||||
|
||||
**For detailed scoring templates and example models**: See [references/scoring-models.md](references/scoring-models.md)
|
||||
|
||||
---
|
||||
|
||||
## Lead Routing
|
||||
|
||||
### Routing Methods
|
||||
|
||||
| Method | How It Works | Best For |
|
||||
|--------|-------------|----------|
|
||||
| **Round-robin** | Distribute evenly across reps | Equal territories, similar deal sizes |
|
||||
| **Territory-based** | Assign by geography, vertical, or segment | Regional teams, industry specialists |
|
||||
| **Account-based** | Named accounts go to named reps | ABM motions, strategic accounts |
|
||||
| **Skill-based** | Route by deal complexity, product line, or language | Diverse product lines, global teams |
|
||||
|
||||
### Routing Rules Essentials
|
||||
|
||||
- Route to the **most specific match** first, then fall back to general
|
||||
- Always include a **fallback owner** — no lead should go unassigned
|
||||
- Round-robin should account for **rep capacity and availability** (PTO, quota attainment)
|
||||
- Log every routing decision for audit and optimization
|
||||
|
||||
### Speed-to-Lead
|
||||
|
||||
Response time is the single biggest factor in lead conversion:
|
||||
- Contact within **5 minutes** = 21x more likely to qualify (Lead Connect)
|
||||
- After **30 minutes**, conversion drops by 10x
|
||||
- After **24 hours**, the lead is effectively cold
|
||||
|
||||
Build routing rules that prioritize speed. Alert reps immediately. Escalate if SLA is missed.
|
||||
|
||||
**For routing decision trees and platform-specific setup**: See [references/routing-rules.md](references/routing-rules.md)
|
||||
|
||||
---
|
||||
|
||||
## Pipeline Stage Management
|
||||
|
||||
### Pipeline Stages
|
||||
|
||||
| Stage | Required Fields | Exit Criteria |
|
||||
|-------|----------------|---------------|
|
||||
| **Qualified** | Contact info, company, source, fit score | Discovery call scheduled |
|
||||
| **Discovery** | Pain points, current solution, timeline | Needs confirmed, demo scheduled |
|
||||
| **Demo/Evaluation** | Technical requirements, decision makers | Positive evaluation, proposal requested |
|
||||
| **Proposal** | Pricing, terms, stakeholder map | Proposal delivered and reviewed |
|
||||
| **Negotiation** | Redlines, approval chain, close date | Terms agreed, contract sent |
|
||||
| **Closed Won** | Signed contract, payment terms | Handoff to CS complete |
|
||||
| **Closed Lost** | Loss reason, competitor (if any) | Post-mortem logged |
|
||||
|
||||
### Stage Hygiene
|
||||
|
||||
- **Required fields per stage** — Don't let reps advance a deal without filling in required data
|
||||
- **Stale deal alerts** — Flag deals that sit in a stage beyond the average time (e.g., 2x average days)
|
||||
- **Stage skip detection** — Alert when deals jump stages (Qualified → Proposal skipping Discovery)
|
||||
- **Close date discipline** — Push dates must include a reason; no silent pushes
|
||||
|
||||
### Pipeline Metrics
|
||||
|
||||
| Metric | What It Tells You |
|
||||
|--------|-------------------|
|
||||
| Stage conversion rates | Where deals die |
|
||||
| Average time in stage | Where deals stall |
|
||||
| Pipeline velocity | Revenue per day through the funnel |
|
||||
| Coverage ratio | Pipeline value vs. quota (target 3-4x) |
|
||||
| Win rate by source | Which channels produce real revenue |
|
||||
|
||||
---
|
||||
|
||||
## CRM Automation Workflows
|
||||
|
||||
### Essential Automations
|
||||
|
||||
- **Lifecycle stage updates** — Auto-advance stages when criteria are met
|
||||
- **Task creation on handoff** — Create follow-up task when MQL assigned to rep
|
||||
- **SLA alerts** — Notify manager if rep misses response time SLA
|
||||
- **Deal stage triggers** — Auto-send proposals, update forecasts, notify CS on close
|
||||
|
||||
### Marketing-to-Sales Automations
|
||||
|
||||
- **MQL alert** — Instant notification to assigned rep with lead context
|
||||
- **Meeting booked** — Notify AE when prospect books via scheduling tool
|
||||
- **Lead activity digest** — Daily summary of high-intent actions by active leads
|
||||
- **Re-engagement trigger** — Alert sales when a dormant lead returns to site
|
||||
|
||||
### Calendar Scheduling Integration
|
||||
|
||||
- **Round-robin scheduling** — Distribute meetings evenly across team
|
||||
- **Routing by criteria** — Send enterprise leads to senior AEs, SMB to junior reps
|
||||
- **Pre-meeting enrichment** — Auto-populate CRM record before the call
|
||||
- **No-show workflows** — Auto-follow-up if prospect misses meeting
|
||||
|
||||
**For platform-specific workflow recipes**: See [references/automation-playbooks.md](references/automation-playbooks.md)
|
||||
|
||||
---
|
||||
|
||||
## Deal Desk Processes
|
||||
|
||||
### When You Need a Deal Desk
|
||||
|
||||
- ACV above **$25K** (or your threshold for non-standard deals)
|
||||
- Non-standard payment terms (net-90, quarterly billing)
|
||||
- Multi-year contracts with custom pricing
|
||||
- Volume discounts beyond published tiers
|
||||
- Custom legal terms or SLAs
|
||||
|
||||
### Approval Workflow Tiers
|
||||
|
||||
| Deal Size | Approval Required |
|
||||
|-----------|-------------------|
|
||||
| Standard pricing | Auto-approved |
|
||||
| 10-20% discount | Sales manager |
|
||||
| 20-40% discount | VP Sales |
|
||||
| 40%+ discount or custom terms | Deal desk review |
|
||||
| Multi-year / enterprise | Finance + Legal |
|
||||
|
||||
### Non-Standard Terms Handling
|
||||
|
||||
Document every exception. Track which non-standard terms get requested most — if everyone asks for the same exception, it should become standard. Review quarterly.
|
||||
|
||||
---
|
||||
|
||||
## Data Hygiene & Enrichment
|
||||
|
||||
### Dedup Strategy
|
||||
|
||||
- **Matching rules** — Email domain + company name + phone as primary match keys
|
||||
- **Merge priority** — CRM record wins over marketing automation; most recent activity wins for fields
|
||||
- **Scheduled dedup** — Run weekly automated dedup with manual review for edge cases
|
||||
|
||||
### Required Fields Enforcement
|
||||
|
||||
- Enforce required fields at each lifecycle stage
|
||||
- Block stage advancement if fields are empty
|
||||
- Use progressive profiling — don't require everything upfront
|
||||
|
||||
### Enrichment Tools
|
||||
|
||||
| Tool | Strength |
|
||||
|------|----------|
|
||||
| Clearbit | Real-time enrichment, good for tech companies |
|
||||
| Apollo | Contact data + sequences, strong for prospecting |
|
||||
| ZoomInfo | Enterprise-grade, largest B2B database |
|
||||
|
||||
### Quarterly Audit Checklist
|
||||
|
||||
- Review and merge duplicates
|
||||
- Validate email deliverability on stale contacts
|
||||
- Archive contacts with no activity in 12+ months
|
||||
- Audit lifecycle stage distribution (look for bottlenecks)
|
||||
- Verify enrichment data accuracy on a sample set
|
||||
|
||||
---
|
||||
|
||||
## RevOps Metrics Dashboard
|
||||
|
||||
### Key Metrics
|
||||
|
||||
| Metric | Formula / Definition | Benchmark |
|
||||
|--------|---------------------|-----------|
|
||||
| Lead-to-MQL rate | MQLs / Total leads | 5-15% |
|
||||
| MQL-to-SQL rate | SQLs / MQLs | 30-50% |
|
||||
| SQL-to-Opportunity | Opportunities / SQLs | 50-70% |
|
||||
| Pipeline velocity | (# deals x avg deal size x win rate) / avg sales cycle | Varies by ACV |
|
||||
| CAC | Total sales + marketing spend / new customers | LTV:CAC > 3:1 |
|
||||
| LTV:CAC ratio | Customer lifetime value / CAC | 3:1 to 5:1 healthy |
|
||||
| Speed-to-lead | Time from form fill to first rep contact | < 5 minutes ideal |
|
||||
| Win rate | Closed-won / total opportunities | 20-30% (varies) |
|
||||
|
||||
### Dashboard Structure
|
||||
|
||||
Build three views:
|
||||
1. **Marketing view** — Lead volume, MQL rate, source attribution, cost per MQL
|
||||
2. **Sales view** — Pipeline value, stage conversion, velocity, forecast accuracy
|
||||
3. **Executive view** — CAC, LTV:CAC, revenue vs. target, pipeline coverage
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
When delivering RevOps recommendations, provide:
|
||||
|
||||
1. **Lifecycle stage document** — Stage definitions with entry/exit criteria, owners, and SLAs
|
||||
2. **Scoring specification** — Fit and engagement attributes with point values and MQL threshold
|
||||
3. **Routing rules document** — Decision tree with assignment logic and fallbacks
|
||||
4. **Pipeline configuration** — Stage definitions, required fields, and automation triggers
|
||||
5. **Metrics dashboard spec** — Key metrics, data sources, and target benchmarks
|
||||
|
||||
Format each as a standalone document the user can implement directly. Include platform-specific guidance when the CRM is known.
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What CRM platform are you using (or planning to use)?
|
||||
2. How many leads per month do you generate?
|
||||
3. What's your current MQL definition?
|
||||
4. Where do leads get stuck in your funnel?
|
||||
5. Do you have SLAs between marketing and sales today?
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For implementation, see the [tools registry](../../tools/REGISTRY.md). Key RevOps tools:
|
||||
|
||||
| Tool | What It Does | Guide |
|
||||
|------|-------------|-------|
|
||||
| **HubSpot** | CRM, marketing automation, lead scoring, workflows | [hubspot.md](../../tools/integrations/hubspot.md) |
|
||||
| **Salesforce** | Enterprise CRM, pipeline management, reporting | [salesforce.md](../../tools/integrations/salesforce.md) |
|
||||
| **Calendly** | Meeting scheduling, round-robin routing | [calendly.md](../../tools/integrations/calendly.md) |
|
||||
| **SavvyCal** | Scheduling with priority-based availability | [savvycal.md](../../tools/integrations/savvycal.md) |
|
||||
| **Clearbit** | Real-time lead enrichment and scoring | [clearbit.md](../../tools/integrations/clearbit.md) |
|
||||
| **Apollo** | Contact data, enrichment, and outbound sequences | [apollo.md](../../tools/integrations/apollo.md) |
|
||||
| **ActiveCampaign** | Marketing automation for SMBs, lead scoring | [activecampaign.md](../../tools/integrations/activecampaign.md) |
|
||||
| **Zapier** | Cross-tool automation and workflow glue | [zapier.md](../../tools/integrations/zapier.md) |
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **cold-email**: For outbound prospecting emails
|
||||
- **email-sequence**: For lifecycle and nurture email flows
|
||||
- **pricing-strategy**: For pricing decisions and packaging
|
||||
- **analytics-tracking**: For tracking pipeline metrics and attribution
|
||||
- **launch-strategy**: For go-to-market launch planning
|
||||
- **sales-enablement**: For sales collateral, decks, and objection handling
|
||||
@@ -0,0 +1,290 @@
|
||||
# Automation Playbooks
|
||||
|
||||
Platform-specific workflow recipes for HubSpot, Salesforce, scheduling tools, and cross-tool automation.
|
||||
|
||||
## HubSpot Workflow Recipes
|
||||
|
||||
### 1. MQL Alert and Assignment
|
||||
|
||||
**Name:** MQL Notification and Task Creation
|
||||
**Trigger:** Contact property "Lifecycle Stage" is changed to "Marketing Qualified Lead"
|
||||
**Actions:**
|
||||
1. Rotate contact owner among sales team (round-robin)
|
||||
2. Send internal email notification to contact owner with lead context
|
||||
3. Create task: "Follow up with [Contact Name]" — due in 4 hours
|
||||
4. Send Slack notification to #sales-alerts channel
|
||||
5. Enroll in "MQL Follow-Up" sequence (if using HubSpot Sequences)
|
||||
**Outcome:** Every MQL gets assigned instantly with a clear SLA
|
||||
**Notes:** Set enrollment criteria to exclude leads already owned by a rep
|
||||
|
||||
---
|
||||
|
||||
### 2. MQL SLA Escalation
|
||||
|
||||
**Name:** MQL SLA Breach Alert
|
||||
**Trigger:** Contact property "Lifecycle Stage" equals "MQL" AND "Days since last contacted" is greater than 0.5 (12 hours)
|
||||
**Actions:**
|
||||
1. Send internal email to contact owner: "SLA warning: [Contact Name] has not been contacted"
|
||||
2. If still no activity after 24 hours → send alert to sales manager
|
||||
3. If still no activity after 48 hours → reassign contact owner via rotation
|
||||
4. Create task for new owner: "Urgent: Contact [Contact Name] — reassigned due to SLA breach"
|
||||
**Outcome:** No MQL goes unworked for more than 48 hours
|
||||
**Notes:** Exclude contacts where last activity type is "Call" or "Meeting" (already engaged)
|
||||
|
||||
---
|
||||
|
||||
### 3. Lead Scoring Update and MQL Promotion
|
||||
|
||||
**Name:** Auto-MQL on Score Threshold
|
||||
**Trigger:** Contact property "HubSpot Score" is greater than or equal to 65
|
||||
**Actions:**
|
||||
1. Set lifecycle stage to "Marketing Qualified Lead"
|
||||
2. Set "MQL Date" to current date
|
||||
3. Suppress from marketing nurture workflows
|
||||
4. Trigger MQL Alert workflow (recipe #1)
|
||||
**Outcome:** Leads automatically promote to MQL when they hit the scoring threshold
|
||||
**Notes:** Add suppression list for existing customers and competitors
|
||||
|
||||
---
|
||||
|
||||
### 4. Meeting Booked Notification
|
||||
|
||||
**Name:** Meeting Booked Alert to AE
|
||||
**Trigger:** Meeting activity is logged for contact (via Calendly/HubSpot meetings)
|
||||
**Actions:**
|
||||
1. Send internal email to contact owner with meeting details
|
||||
2. Update contact property "Last Meeting Booked" to current date
|
||||
3. If lifecycle stage is "Lead" → update to "MQL"
|
||||
4. Create task: "Prepare for meeting with [Contact Name]" — due 1 hour before meeting
|
||||
5. Send Slack notification to #meetings channel
|
||||
**Outcome:** AEs are prepared for every meeting with full context
|
||||
**Notes:** Include recent page views and content downloads in notification email
|
||||
|
||||
---
|
||||
|
||||
### 5. Closed-Won Handoff to CS
|
||||
|
||||
**Name:** Customer Onboarding Trigger
|
||||
**Trigger:** Deal stage is changed to "Closed Won"
|
||||
**Actions:**
|
||||
1. Update associated contact lifecycle stage to "Customer"
|
||||
2. Set "Customer Since" date to current date
|
||||
3. Assign contact owner to CS team member (based on segment/territory)
|
||||
4. Create task for CS: "Schedule kickoff call with [Company Name]" — due in 2 business days
|
||||
5. Enroll contact in "Customer Onboarding" email sequence
|
||||
6. Send internal notification to CS manager
|
||||
7. Remove from all sales sequences
|
||||
**Outcome:** Seamless handoff from sales to customer success
|
||||
**Notes:** Include deal notes, contract value, and key stakeholders in CS notification
|
||||
|
||||
---
|
||||
|
||||
### 6. Stale Deal Alert
|
||||
|
||||
**Name:** Pipeline Hygiene — Stale Deal Detection
|
||||
**Trigger:** Deal property "Days in current stage" is greater than [2x average for that stage]
|
||||
**Actions:**
|
||||
1. Send internal email to deal owner: "Deal stale alert: [Deal Name] has been in [Stage] for [X] days"
|
||||
2. Create task: "Update or close [Deal Name]" — due in 3 business days
|
||||
3. If no update after 7 days → alert sales manager
|
||||
4. Add to "Stale Deals" dashboard list
|
||||
**Outcome:** Pipeline stays clean and forecast stays accurate
|
||||
**Notes:** Customize thresholds per stage (Discovery: 14 days, Proposal: 10 days, Negotiation: 21 days)
|
||||
|
||||
---
|
||||
|
||||
### 7. Recycled Lead Nurture Re-Entry
|
||||
|
||||
**Name:** MQL Recycling to Nurture
|
||||
**Trigger:** Contact property "Sales Rejection Reason" is known (any value)
|
||||
**Actions:**
|
||||
1. Update lifecycle stage to "Recycled"
|
||||
2. Reset engagement score to baseline (keep fit score)
|
||||
3. Enroll in "Recycled Lead Nurture" sequence (lower frequency)
|
||||
4. Set "Recycle Date" to current date
|
||||
5. Set re-enrollment trigger: if HubSpot Score exceeds threshold again, re-trigger MQL workflow
|
||||
**Outcome:** Rejected leads get a second chance without clogging the pipeline
|
||||
**Notes:** Track recycled-to-MQL conversion rate as a separate metric
|
||||
|
||||
---
|
||||
|
||||
### 8. Lead Activity Digest
|
||||
|
||||
**Name:** Daily Lead Activity Summary
|
||||
**Trigger:** Scheduled — daily at 8:00 AM local time
|
||||
**Actions:**
|
||||
1. Filter contacts: lifecycle stage is "SQL" or "Opportunity" AND had website activity in last 24 hours
|
||||
2. Send digest email to each contact owner with their leads' activity
|
||||
3. Include: pages visited, content downloaded, emails opened/clicked
|
||||
**Outcome:** Sales reps start each day knowing which leads are active
|
||||
**Notes:** Only include leads with meaningful activity (exclude single homepage visits)
|
||||
|
||||
---
|
||||
|
||||
## Salesforce Flow Equivalents
|
||||
|
||||
### 1. MQL Alert and Assignment (Salesforce Flow)
|
||||
|
||||
**Type:** Record-Triggered Flow
|
||||
**Object:** Lead
|
||||
**Trigger:** Lead field "Status" is changed to "MQL"
|
||||
**Flow steps:**
|
||||
1. Get Records: Query "Rep Assignment" custom object for next available rep
|
||||
2. Update Records: Set Lead Owner to assigned rep
|
||||
3. Create Records: Create Task — "Contact MQL: {Lead.Name}" with due date = NOW + 4 hours
|
||||
4. Action: Send email alert to new lead owner
|
||||
5. Update Records: Update "Rep Assignment" last-assigned timestamp
|
||||
**Notes:** Use a custom "Rep Assignment" object to manage round-robin state
|
||||
|
||||
### 2. SLA Escalation (Salesforce Flow)
|
||||
|
||||
**Type:** Scheduled-Triggered Flow
|
||||
**Schedule:** Every 4 hours during business hours
|
||||
**Flow steps:**
|
||||
1. Get Records: Leads where Status = "MQL" AND LastActivityDate < TODAY - 1
|
||||
2. Decision: Is lead older than 48 hours with no activity?
|
||||
- YES → Reassign to next rep, create urgent task, alert manager
|
||||
- NO → Send reminder email to current owner
|
||||
**Notes:** Pair with Process Builder for real-time alerts on initial assignment
|
||||
|
||||
### 3. Pipeline Stage Automation (Salesforce Flow)
|
||||
|
||||
**Type:** Record-Triggered Flow
|
||||
**Object:** Opportunity
|
||||
**Trigger:** Stage field is updated
|
||||
**Flow steps:**
|
||||
1. Decision: Which stage was it changed to?
|
||||
2. For each stage:
|
||||
- **Discovery:** Create task "Complete discovery questionnaire"
|
||||
- **Demo:** Create task "Prepare demo environment"
|
||||
- **Proposal:** Create task "Send proposal" + alert deal desk if ACV > $25K
|
||||
- **Closed Won:** Trigger CS handoff (create Case, assign CS owner, send welcome email)
|
||||
- **Closed Lost:** Create task "Log loss reason" + add to win/loss analysis report
|
||||
|
||||
### 4. Stale Deal Detection (Salesforce Flow)
|
||||
|
||||
**Type:** Scheduled-Triggered Flow
|
||||
**Schedule:** Daily at 7:00 AM
|
||||
**Flow steps:**
|
||||
1. Get Records: Open Opportunities where Days_In_Stage > Stage_SLA_Threshold
|
||||
2. Loop through results:
|
||||
- Create Task: "Update stale deal: {Opportunity.Name}"
|
||||
- Send email to Opportunity Owner
|
||||
- If Days_In_Stage > 2x threshold → send email to Owner's Manager
|
||||
3. Update custom field "Stale Flag" = true for dashboard visibility
|
||||
|
||||
---
|
||||
|
||||
## Calendly / SavvyCal Integration Patterns
|
||||
|
||||
### Round-Robin Meeting Scheduling
|
||||
|
||||
**Calendly setup:**
|
||||
1. Create a team event type with all eligible reps
|
||||
2. Distribution: "Optimize for equal distribution"
|
||||
3. Availability: Each rep manages their own calendar
|
||||
4. Buffer: 15 min before and after meetings
|
||||
5. Minimum notice: 4 hours (avoid last-minute bookings)
|
||||
|
||||
**CRM integration:**
|
||||
1. Calendly webhook fires on booking
|
||||
2. Match invitee email to CRM contact
|
||||
3. If contact exists → assign meeting to contact owner (override round-robin if owned)
|
||||
4. If new contact → create lead, assign via routing rules, log meeting
|
||||
5. Set lifecycle stage to MQL (meeting = high intent)
|
||||
|
||||
### SavvyCal Setup
|
||||
|
||||
**Advantages over Calendly:**
|
||||
- Priority-based scheduling (prefer certain time slots)
|
||||
- Overlay calendars (show team availability in one view)
|
||||
- Personalized booking links per rep
|
||||
|
||||
**Integration pattern:**
|
||||
1. Create team scheduling link with priority rules
|
||||
2. Webhook on booking → Zapier/Make → CRM
|
||||
3. Match or create contact, assign owner, create task
|
||||
4. Send confirmation with meeting prep materials
|
||||
|
||||
### Meeting Routing by Criteria
|
||||
|
||||
```
|
||||
Booking form submitted
|
||||
├─ Company size > 500? (form field)
|
||||
│ ├─ YES → Route to enterprise AE calendar
|
||||
│ └─ NO ↓
|
||||
├─ Existing customer? (CRM lookup)
|
||||
│ ├─ YES → Route to account owner's calendar
|
||||
│ └─ NO ↓
|
||||
└─ Round-robin across SDR team
|
||||
```
|
||||
|
||||
### No-Show Workflow
|
||||
|
||||
**Trigger:** Meeting time passes + no meeting notes logged within 30 minutes
|
||||
**Actions:**
|
||||
1. Wait 30 minutes after scheduled meeting time
|
||||
2. Check: Was a call or meeting logged?
|
||||
- YES → No action
|
||||
- NO → Send "Sorry we missed you" email to prospect
|
||||
3. Create task: "Reschedule with [Contact Name]" — due next business day
|
||||
4. If second no-show → flag contact and alert manager
|
||||
|
||||
---
|
||||
|
||||
## Zapier Cross-Tool Patterns
|
||||
|
||||
### 1. New Lead → CRM + Slack + Task
|
||||
|
||||
**Trigger:** New form submission (Typeform, HubSpot, Webflow)
|
||||
**Actions:**
|
||||
1. Create/update contact in CRM
|
||||
2. Enrich with Clearbit (if available)
|
||||
3. Post to Slack #new-leads with enriched data
|
||||
4. Create task in project management tool (Asana, Linear)
|
||||
|
||||
### 2. Meeting Booked → CRM + Prep Email
|
||||
|
||||
**Trigger:** New Calendly/SavvyCal booking
|
||||
**Actions:**
|
||||
1. Find or create CRM contact
|
||||
2. Update lifecycle stage to MQL
|
||||
3. Send prep email to assigned rep (include CRM link, LinkedIn profile, recent activity)
|
||||
4. Create pre-meeting task
|
||||
|
||||
### 3. Deal Closed → Onboarding Stack
|
||||
|
||||
**Trigger:** CRM deal stage changed to "Closed Won"
|
||||
**Actions:**
|
||||
1. Create customer record in CS tool (Vitally, Gainsight, ChurnZero)
|
||||
2. Add to onboarding project template
|
||||
3. Send welcome email via email tool
|
||||
4. Create Slack channel: #customer-[company-name]
|
||||
5. Notify CS team in Slack
|
||||
|
||||
### 4. Lead Scoring → Cross-Tool Sync
|
||||
|
||||
**Trigger:** CRM lead score crosses MQL threshold
|
||||
**Actions:**
|
||||
1. Update marketing automation platform status
|
||||
2. Add to retargeting audience (Facebook, Google Ads)
|
||||
3. Trigger SDR outreach sequence
|
||||
4. Log event in analytics (Mixpanel, Amplitude)
|
||||
|
||||
### 5. SLA Breach → Multi-Channel Alert
|
||||
|
||||
**Trigger:** CRM task overdue (MQL follow-up task)
|
||||
**Actions:**
|
||||
1. Send Slack DM to rep
|
||||
2. Send email to rep
|
||||
3. If 2+ hours overdue → Slack DM to manager
|
||||
4. If 4+ hours overdue → reassign in CRM (via webhook back to CRM)
|
||||
|
||||
### 6. Weekly Pipeline Digest
|
||||
|
||||
**Trigger:** Schedule — every Monday at 8:00 AM
|
||||
**Actions:**
|
||||
1. Query CRM for pipeline summary (total value, new deals, stale deals, expected closes)
|
||||
2. Format as summary
|
||||
3. Post to Slack #sales-team
|
||||
4. Send email digest to sales leadership
|
||||
@@ -0,0 +1,278 @@
|
||||
# Lifecycle Stage Definitions
|
||||
|
||||
Complete templates for lead lifecycle stages, MQL criteria by business type, SLAs, and rejection/recycling workflows.
|
||||
|
||||
## Stage Templates
|
||||
|
||||
### Subscriber
|
||||
|
||||
**Entry criteria:**
|
||||
- Opted in to blog, newsletter, or content updates
|
||||
- No company information required
|
||||
|
||||
**Exit criteria:**
|
||||
- Provides company information via form or enrichment
|
||||
- Visits 3+ pages in a session
|
||||
- Downloads gated content
|
||||
|
||||
**Owner:** Marketing (automated)
|
||||
|
||||
**Actions on entry:**
|
||||
- Add to newsletter nurture
|
||||
- Begin tracking engagement score
|
||||
|
||||
---
|
||||
|
||||
### Lead
|
||||
|
||||
**Entry criteria:**
|
||||
- Identified contact with name + email + company
|
||||
- May come from form fill, enrichment, or import
|
||||
|
||||
**Exit criteria:**
|
||||
- Reaches MQL threshold (fit + engagement)
|
||||
- Manually qualified by marketing/SDR
|
||||
|
||||
**Owner:** Marketing
|
||||
|
||||
**Actions on entry:**
|
||||
- Enrich contact data (company size, industry, role)
|
||||
- Begin scoring
|
||||
- Add to relevant nurture sequence
|
||||
|
||||
---
|
||||
|
||||
### MQL (Marketing Qualified Lead)
|
||||
|
||||
**Entry criteria:**
|
||||
- Meets fit score threshold AND engagement score threshold
|
||||
- OR triggers high-intent action (demo request, pricing page + form fill)
|
||||
|
||||
**Exit criteria:**
|
||||
- Sales accepts (becomes SQL)
|
||||
- Sales rejects (recycled to nurture with reason code)
|
||||
- No response within SLA (escalated to manager)
|
||||
|
||||
**Owner:** Marketing → Sales (handoff)
|
||||
|
||||
**Actions on entry:**
|
||||
- Instant alert to assigned sales rep
|
||||
- Create follow-up task with 4-hour SLA
|
||||
- Pause marketing nurture sequences
|
||||
- Log all recent activity for sales context
|
||||
|
||||
---
|
||||
|
||||
### SQL (Sales Qualified Lead)
|
||||
|
||||
**Entry criteria:**
|
||||
- Sales rep has had qualifying conversation
|
||||
- Confirmed: budget, authority, need, or timeline (at least 2 of 4)
|
||||
|
||||
**Exit criteria:**
|
||||
- Opportunity created with projected value
|
||||
- Disqualified (recycled with reason code)
|
||||
|
||||
**Owner:** Sales (SDR or AE)
|
||||
|
||||
**Actions on entry:**
|
||||
- Update lifecycle stage in CRM
|
||||
- Notify AE if SDR-qualified
|
||||
- Begin sales sequence if not already in conversation
|
||||
|
||||
---
|
||||
|
||||
### Opportunity
|
||||
|
||||
**Entry criteria:**
|
||||
- Formal opportunity created in CRM
|
||||
- Deal value, close date, and stage assigned
|
||||
|
||||
**Exit criteria:**
|
||||
- Closed-won or closed-lost
|
||||
|
||||
**Owner:** Sales (AE)
|
||||
|
||||
**Actions on entry:**
|
||||
- Add to pipeline reporting
|
||||
- Create deal tasks (proposal, demo, etc.)
|
||||
- Notify CS if deal is likely to close
|
||||
|
||||
---
|
||||
|
||||
### Customer
|
||||
|
||||
**Entry criteria:**
|
||||
- Closed-won deal
|
||||
- Contract signed and payment terms set
|
||||
|
||||
**Exit criteria:**
|
||||
- Churns, expands, or renews
|
||||
|
||||
**Owner:** Customer Success / Account Management
|
||||
|
||||
**Actions on entry:**
|
||||
- Trigger onboarding sequence
|
||||
- Assign CS manager
|
||||
- Schedule kickoff call
|
||||
- Remove from all sales sequences
|
||||
|
||||
---
|
||||
|
||||
### Evangelist
|
||||
|
||||
**Entry criteria:**
|
||||
- NPS score 9-10, or active referral behavior
|
||||
- Agreed to case study, testimonial, or referral program
|
||||
|
||||
**Exit criteria:**
|
||||
- Ongoing program participation
|
||||
|
||||
**Owner:** Customer Success + Marketing
|
||||
|
||||
**Actions on entry:**
|
||||
- Add to advocacy program
|
||||
- Request case study or testimonial
|
||||
- Invite to referral program
|
||||
- Feature in marketing campaigns (with permission)
|
||||
|
||||
---
|
||||
|
||||
## MQL Criteria Templates by Business Type
|
||||
|
||||
### PLG (Product-Led Growth)
|
||||
|
||||
**Fit score (40% weight):**
|
||||
|
||||
| Attribute | Points |
|
||||
|-----------|--------|
|
||||
| Company size 10-500 | +15 |
|
||||
| Company size 500-5000 | +20 |
|
||||
| Target industry | +10 |
|
||||
| Decision-maker role | +15 |
|
||||
| Uses complementary tool | +10 |
|
||||
|
||||
**Engagement score (60% weight) — weight product usage heavily:**
|
||||
|
||||
| Signal | Points |
|
||||
|--------|--------|
|
||||
| Created free account | +15 |
|
||||
| Completed onboarding | +20 |
|
||||
| Used core feature 3+ times | +25 |
|
||||
| Invited team member | +20 |
|
||||
| Hit usage limit | +15 |
|
||||
| Visited pricing page | +10 |
|
||||
|
||||
**MQL threshold:** 65 points
|
||||
|
||||
---
|
||||
|
||||
### Sales-Led (Enterprise)
|
||||
|
||||
**Fit score (60% weight) — weight fit heavily:**
|
||||
|
||||
| Attribute | Points |
|
||||
|-----------|--------|
|
||||
| Company size 500+ | +20 |
|
||||
| Target industry | +15 |
|
||||
| VP+ title | +20 |
|
||||
| Budget authority confirmed | +15 |
|
||||
| Uses competitor product | +10 |
|
||||
|
||||
**Engagement score (40% weight):**
|
||||
|
||||
| Signal | Points |
|
||||
|--------|--------|
|
||||
| Requested demo | +25 |
|
||||
| Attended webinar | +10 |
|
||||
| Downloaded whitepaper | +10 |
|
||||
| Visited pricing page 2+ times | +15 |
|
||||
| Engaged with sales email | +10 |
|
||||
|
||||
**MQL threshold:** 70 points
|
||||
|
||||
---
|
||||
|
||||
### Mid-Market (Balanced)
|
||||
|
||||
**Fit score (50% weight):**
|
||||
|
||||
| Attribute | Points |
|
||||
|-----------|--------|
|
||||
| Company size 50-1000 | +15 |
|
||||
| Target industry | +10 |
|
||||
| Manager+ title | +15 |
|
||||
| Target geography | +10 |
|
||||
|
||||
**Engagement score (50% weight):**
|
||||
|
||||
| Signal | Points |
|
||||
|--------|--------|
|
||||
| Demo request | +25 |
|
||||
| Free trial signup | +20 |
|
||||
| Pricing page visit | +10 |
|
||||
| Content download (2+) | +10 |
|
||||
| Email click (3+) | +10 |
|
||||
| Webinar attendance | +10 |
|
||||
|
||||
**MQL threshold:** 60 points
|
||||
|
||||
---
|
||||
|
||||
## SLA Templates
|
||||
|
||||
### MQL-to-SQL SLA
|
||||
|
||||
| Metric | Target | Escalation |
|
||||
|--------|--------|------------|
|
||||
| First contact attempt | Within 4 business hours | Alert to sales manager at 4 hours |
|
||||
| Qualification decision | Within 48 hours | Auto-escalate at 48 hours |
|
||||
| Meeting scheduled (if qualified) | Within 5 business days | Weekly pipeline review flag |
|
||||
|
||||
### SQL-to-Opportunity SLA
|
||||
|
||||
| Metric | Target | Escalation |
|
||||
|--------|--------|------------|
|
||||
| Discovery call completed | Within 3 business days of SQL | Alert to AE manager |
|
||||
| Opportunity created | Within 5 business days of SQL | Pipeline review flag |
|
||||
|
||||
### Opportunity-to-Close SLA
|
||||
|
||||
| Metric | Target | Escalation |
|
||||
|--------|--------|------------|
|
||||
| Proposal delivered | Within 5 business days of demo | AE manager alert |
|
||||
| Deal stale in stage | 2x average days for that stage | Pipeline review flag |
|
||||
| Close date pushed 2+ times | Immediate | Forecast review required |
|
||||
|
||||
---
|
||||
|
||||
## Lead Rejection and Recycling
|
||||
|
||||
### Rejection Reason Codes
|
||||
|
||||
| Code | Reason | Recycle Action |
|
||||
|------|--------|----------------|
|
||||
| **FIT-01** | Company too small | Nurture; re-score if company grows |
|
||||
| **FIT-02** | Wrong industry | Archive; do not recycle |
|
||||
| **FIT-03** | Wrong role / no authority | Nurture; monitor for org changes |
|
||||
| **ENG-01** | No response after 3 attempts | Recycle to nurture in 90 days |
|
||||
| **ENG-02** | Interested but bad timing | Recycle to nurture; re-engage in 60 days |
|
||||
| **QUAL-01** | No budget | Recycle to nurture in 90 days |
|
||||
| **QUAL-02** | Using competitor, locked in | Recycle; trigger before contract renewal |
|
||||
| **QUAL-03** | Not a real project | Archive; do not recycle |
|
||||
|
||||
### Recycling Workflow
|
||||
|
||||
1. Sales rejects MQL with reason code
|
||||
2. CRM updates lifecycle stage to "Recycled"
|
||||
3. Lead enters recycling nurture sequence (different from original nurture)
|
||||
4. Engagement score resets to baseline (keep fit score)
|
||||
5. If lead re-engages and crosses MQL threshold, re-route to sales with "Recycled MQL" flag
|
||||
6. Track recycled MQL conversion rate separately
|
||||
|
||||
### Recycling Nurture Sequence
|
||||
|
||||
- **Frequency:** Bi-weekly or monthly (lower frequency than initial nurture)
|
||||
- **Content:** Industry insights, case studies, product updates
|
||||
- **Duration:** 6 months, then archive if no engagement
|
||||
- **Re-MQL trigger:** High-intent action (demo request, pricing page revisit)
|
||||
@@ -0,0 +1,203 @@
|
||||
# Lead Routing Rules
|
||||
|
||||
Decision trees, platform-specific configurations, territory routing, ABM routing, and speed-to-lead benchmarks.
|
||||
|
||||
## Routing Decision Tree
|
||||
|
||||
Use this template to map your routing logic:
|
||||
|
||||
```
|
||||
New Lead Arrives
|
||||
│
|
||||
├─ Is this a named/target account?
|
||||
│ ├─ YES → Route to assigned account owner
|
||||
│ └─ NO ↓
|
||||
│
|
||||
├─ Is ACV likely > $50K? (based on company size + industry)
|
||||
│ ├─ YES → Route to enterprise AE team
|
||||
│ └─ NO ↓
|
||||
│
|
||||
├─ Is this a PLG signup with team usage?
|
||||
│ ├─ YES → Route to PLG sales specialist
|
||||
│ └─ NO ↓
|
||||
│
|
||||
├─ Does lead match a territory?
|
||||
│ ├─ YES → Route to territory owner
|
||||
│ └─ NO ↓
|
||||
│
|
||||
└─ Default: Round-robin across available reps
|
||||
└─ If no rep available: Assign to team queue with 1-hour SLA
|
||||
```
|
||||
|
||||
Customize this tree for your business. The key principle: **route to the most specific match first, fall back to general.**
|
||||
|
||||
---
|
||||
|
||||
## Round-Robin Configuration
|
||||
|
||||
### Basic Round-Robin Rules
|
||||
|
||||
1. Distribute leads evenly across eligible reps
|
||||
2. Skip reps who are on PTO, at capacity, or have a full pipeline
|
||||
3. Weight by quota attainment (reps below quota get slight priority)
|
||||
4. Reset distribution count weekly or monthly
|
||||
5. Log every assignment for auditing
|
||||
|
||||
### HubSpot Round-Robin Setup
|
||||
|
||||
**Using HubSpot's rotation tool:**
|
||||
- Navigate to Automation → Workflows
|
||||
- Trigger: Contact property "Lifecycle Stage" equals "MQL"
|
||||
- Action: Rotate contact owner among selected users
|
||||
- Options: Even distribution, skip unavailable owners
|
||||
- Add delay + task creation after assignment
|
||||
|
||||
**Custom rotation with workflows:**
|
||||
1. Create a custom property "Rotation Counter" (number)
|
||||
2. Workflow trigger: New MQL created
|
||||
3. Branch by rotation counter value (0, 1, 2... for each rep)
|
||||
4. Set contact owner to corresponding rep
|
||||
5. Increment counter (reset at max)
|
||||
6. Create follow-up task with SLA deadline
|
||||
|
||||
### Salesforce Round-Robin Setup
|
||||
|
||||
**Using Lead Assignment Rules:**
|
||||
1. Setup → Feature Settings → Marketing → Lead Assignment Rules
|
||||
2. Create rule entries in priority order (most specific first)
|
||||
3. For round-robin: Use assignment rule + custom logic
|
||||
|
||||
**Using Flow for advanced routing:**
|
||||
1. Create a Record-Triggered Flow on Lead creation
|
||||
2. Get Records: Query a custom "Rep Queue" object for next available rep
|
||||
3. Decision element: Check rep availability, capacity, territory
|
||||
4. Update Records: Assign lead owner
|
||||
5. Create Task: Follow-up task with SLA
|
||||
6. Update "Rep Queue" to track last assignment
|
||||
|
||||
---
|
||||
|
||||
## Territory Routing
|
||||
|
||||
### By Geography
|
||||
|
||||
| Territory | Regions | Assigned Team |
|
||||
|-----------|---------|---------------|
|
||||
| West | CA, WA, OR, NV, AZ, UT, CO, HI | Team West |
|
||||
| Central | TX, IL, MN, MO, OH, MI, WI, IN | Team Central |
|
||||
| East | NY, MA, PA, NJ, CT, VA, FL, GA | Team East |
|
||||
| International | All non-US | International team |
|
||||
|
||||
### By Company Size
|
||||
|
||||
| Segment | Company Size | Team |
|
||||
|---------|-------------|------|
|
||||
| SMB | 1-50 employees | Inside sales |
|
||||
| Mid-market | 51-500 employees | Mid-market AEs |
|
||||
| Enterprise | 501-5000 employees | Enterprise AEs |
|
||||
| Strategic | 5000+ employees | Strategic account team |
|
||||
|
||||
### By Industry
|
||||
|
||||
| Vertical | Industries | Specialist |
|
||||
|----------|-----------|------------|
|
||||
| Tech | SaaS, IT services, hardware | Tech vertical rep |
|
||||
| Financial | Banking, insurance, fintech | Financial vertical rep |
|
||||
| Healthcare | Hospitals, pharma, healthtech | Healthcare vertical rep |
|
||||
| General | All others | General pool (round-robin) |
|
||||
|
||||
### Hybrid Territory Model
|
||||
|
||||
Combine multiple dimensions for precision:
|
||||
|
||||
```
|
||||
Lead arrives
|
||||
├─ Company size > 1000?
|
||||
│ ├─ YES → Enterprise team
|
||||
│ │ └─ Sub-route by geography
|
||||
│ └─ NO ↓
|
||||
├─ Industry = Healthcare or Financial?
|
||||
│ ├─ YES → Vertical specialist
|
||||
│ └─ NO ↓
|
||||
└─ Round-robin across general pool
|
||||
└─ Weighted by geography preference
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Named Account / ABM Routing
|
||||
|
||||
### Setup
|
||||
|
||||
1. **Define target account list** (typically 50-500 accounts)
|
||||
2. **Assign account owners** in CRM (1 rep per account)
|
||||
3. **Match logic:** Any lead from a target account domain routes to account owner
|
||||
4. **Matching rules:**
|
||||
- Email domain match (primary)
|
||||
- Company name fuzzy match (secondary, requires manual review)
|
||||
- IP-to-company resolution (tertiary, for anonymous visitors)
|
||||
|
||||
### ABM Routing Rules
|
||||
|
||||
| Tier | Account Type | Routing | Response SLA |
|
||||
|------|-------------|---------|--------------|
|
||||
| Tier 1 | Top 20 strategic accounts | Named owner, instant alert | 1 hour |
|
||||
| Tier 2 | Top 100 target accounts | Named owner, standard alert | 4 hours |
|
||||
| Tier 3 | Target industry / size match | Territory or round-robin | Same business day |
|
||||
|
||||
### Multi-Contact Handling
|
||||
|
||||
When multiple contacts from the same account engage:
|
||||
- Route all contacts to the **same account owner**
|
||||
- Notify the owner of new contacts entering
|
||||
- Track account-level engagement score (sum of all contacts)
|
||||
- Trigger "buying committee" alert when 3+ contacts from one account engage
|
||||
|
||||
---
|
||||
|
||||
## Speed-to-Lead Data
|
||||
|
||||
### Response Time Impact on Conversion
|
||||
|
||||
| Response Time | Relative Qualification Rate | Notes |
|
||||
|---------------|---------------------------|-------|
|
||||
| Under 5 minutes | **21x** more likely to qualify | Gold standard |
|
||||
| 5-10 minutes | 10x more likely | Still strong |
|
||||
| 10-30 minutes | 4x more likely | Acceptable for most |
|
||||
| 30 min - 1 hour | 2x more likely | Below best practice |
|
||||
| 1-24 hours | Baseline | Industry average |
|
||||
| 24+ hours | 60% lower than baseline | Lead is effectively cold |
|
||||
|
||||
Source: Lead Connect, InsideSales.com
|
||||
|
||||
### Implementing Speed-to-Lead
|
||||
|
||||
1. **Instant notification** — Push notification + email to rep on MQL creation
|
||||
2. **Auto-task with timer** — Create task with 5-minute SLA countdown
|
||||
3. **Escalation chain:**
|
||||
- 5 min: Original rep alerted
|
||||
- 15 min: Backup rep alerted
|
||||
- 30 min: Manager alerted
|
||||
- 1 hour: Lead reassigned to next available rep
|
||||
4. **Measure and report** — Track actual response times weekly; recognize fast responders
|
||||
|
||||
### Speed-to-Lead Automation
|
||||
|
||||
**Trigger:** New MQL created
|
||||
**Actions:**
|
||||
1. Assign to rep via routing rules (instant)
|
||||
2. Send push notification + email to rep
|
||||
3. Create task: "Contact [Lead Name] — 5 min SLA"
|
||||
4. Start SLA timer
|
||||
5. If no activity logged in 15 min → alert backup rep
|
||||
6. If no activity in 30 min → alert manager
|
||||
7. If no activity in 60 min → reassign via round-robin
|
||||
|
||||
### Measuring Speed-to-Lead
|
||||
|
||||
Track these metrics weekly:
|
||||
- **Average time to first contact** (from MQL creation to first call/email)
|
||||
- **Median time to first contact** (less skewed by outliers)
|
||||
- **% of leads contacted within SLA** (target: 90%+)
|
||||
- **Contact rate by time of day** (identify coverage gaps)
|
||||
- **Conversion rate by response time** (prove the ROI of speed)
|
||||
@@ -0,0 +1,247 @@
|
||||
# Lead Scoring Models
|
||||
|
||||
Detailed scoring templates, example models by business type, and calibration guidance.
|
||||
|
||||
## Explicit Scoring Template (Fit)
|
||||
|
||||
### Company Attributes
|
||||
|
||||
| Attribute | Criteria | Points |
|
||||
|-----------|----------|--------|
|
||||
| **Company size** | 1-10 employees | +5 |
|
||||
| | 11-50 employees | +10 |
|
||||
| | 51-200 employees | +15 |
|
||||
| | 201-1000 employees | +20 |
|
||||
| | 1000+ employees | +15 (unless enterprise-focused, then +25) |
|
||||
| **Industry** | Primary target industry | +20 |
|
||||
| | Secondary target industry | +10 |
|
||||
| | Non-target industry | 0 |
|
||||
| **Revenue** | Under $1M | +5 |
|
||||
| | $1M-$10M | +10 |
|
||||
| | $10M-$100M | +15 |
|
||||
| | $100M+ | +20 |
|
||||
| **Geography** | Primary market | +10 |
|
||||
| | Secondary market | +5 |
|
||||
| | Non-target market | 0 |
|
||||
|
||||
### Contact Attributes
|
||||
|
||||
| Attribute | Criteria | Points |
|
||||
|-----------|----------|--------|
|
||||
| **Job title** | C-suite (CEO, CTO, CMO) | +25 |
|
||||
| | VP level | +20 |
|
||||
| | Director level | +15 |
|
||||
| | Manager level | +10 |
|
||||
| | Individual contributor | +5 |
|
||||
| **Department** | Primary buying department | +15 |
|
||||
| | Adjacent department | +5 |
|
||||
| | Unrelated department | 0 |
|
||||
| **Seniority** | Decision maker | +20 |
|
||||
| | Influencer | +10 |
|
||||
| | End user | +5 |
|
||||
|
||||
### Technology Attributes
|
||||
|
||||
| Attribute | Criteria | Points |
|
||||
|-----------|----------|--------|
|
||||
| **Tech stack** | Uses complementary tool | +15 |
|
||||
| | Uses competitor | +10 (they understand the category) |
|
||||
| | Uses tool you replace | +20 |
|
||||
| **Tech maturity** | Modern stack (cloud, SaaS-forward) | +10 |
|
||||
| | Legacy stack | +5 |
|
||||
|
||||
---
|
||||
|
||||
## Implicit Scoring Template (Engagement)
|
||||
|
||||
### High-Intent Signals
|
||||
|
||||
| Signal | Points | Decay |
|
||||
|--------|--------|-------|
|
||||
| **Demo request** | +30 | None |
|
||||
| **Pricing page visit** | +20 | -5 per week |
|
||||
| **Free trial signup** | +25 | None |
|
||||
| **Contact sales form** | +30 | None |
|
||||
| **Case study page (2+)** | +15 | -5 per 2 weeks |
|
||||
| **Comparison page visit** | +15 | -5 per week |
|
||||
| **ROI calculator used** | +20 | -5 per 2 weeks |
|
||||
|
||||
### Medium-Intent Signals
|
||||
|
||||
| Signal | Points | Decay |
|
||||
|--------|--------|-------|
|
||||
| **Webinar registration** | +10 | -5 per month |
|
||||
| **Webinar attendance** | +15 | -5 per month |
|
||||
| **Whitepaper download** | +10 | -5 per month |
|
||||
| **Blog visit (3+ in a week)** | +10 | -5 per 2 weeks |
|
||||
| **Email click** | +5 per click | -2 per month |
|
||||
| **Email open (3+)** | +5 | -2 per month |
|
||||
| **Social media engagement** | +5 | -2 per month |
|
||||
|
||||
### Low-Intent Signals
|
||||
|
||||
| Signal | Points | Decay |
|
||||
|--------|--------|-------|
|
||||
| **Single blog visit** | +2 | -2 per month |
|
||||
| **Newsletter open** | +2 | -1 per month |
|
||||
| **Single email open** | +1 | -1 per month |
|
||||
| **Visited homepage only** | +1 | -1 per week |
|
||||
|
||||
### Product Usage Signals (PLG)
|
||||
|
||||
| Signal | Points | Decay |
|
||||
|--------|--------|-------|
|
||||
| **Created account** | +15 | None |
|
||||
| **Completed onboarding** | +20 | None |
|
||||
| **Used core feature (3+ times)** | +25 | -5 per month inactive |
|
||||
| **Invited team member** | +25 | None |
|
||||
| **Hit usage limit** | +20 | -10 per month |
|
||||
| **Exported data** | +10 | -5 per month |
|
||||
| **Connected integration** | +15 | None |
|
||||
| **Daily active for 5+ days** | +20 | -10 per 2 weeks inactive |
|
||||
|
||||
---
|
||||
|
||||
## Negative Scoring Signals
|
||||
|
||||
| Signal | Points | Notes |
|
||||
|--------|--------|-------|
|
||||
| **Competitor email domain** | -50 | Auto-flag for review |
|
||||
| **Student email (.edu)** | -30 | May still be valid in some cases |
|
||||
| **Personal email (gmail, yahoo)** | -10 | Less relevant for B2B; adjust for SMB |
|
||||
| **Unsubscribe from emails** | -20 | Reduce engagement score |
|
||||
| **Bounce (hard)** | -50 | Remove from scoring |
|
||||
| **Spam complaint** | -100 | Remove from all sequences |
|
||||
| **Job title: Student/Intern** | -25 | Low buying authority |
|
||||
| **Job title: Consultant** | -10 | May be evaluating for client |
|
||||
| **No website visit in 90 days** | -15 | Score decay |
|
||||
| **Invalid phone number** | -10 | Data quality signal |
|
||||
| **Careers page visitor only** | -30 | Likely a job seeker |
|
||||
|
||||
---
|
||||
|
||||
## Example Scoring Models
|
||||
|
||||
### Model 1: PLG SaaS (ACV $500-$5K)
|
||||
|
||||
**Weight: 30% fit / 70% engagement (heavily favor product usage)**
|
||||
|
||||
**Fit criteria:**
|
||||
- Company size 10-500: +15
|
||||
- Target industry: +10
|
||||
- Manager+ role: +10
|
||||
- Uses complementary tool: +10
|
||||
|
||||
**Engagement criteria:**
|
||||
- Created free account: +15
|
||||
- Completed onboarding: +20
|
||||
- Used core feature 3+ times: +25
|
||||
- Invited team member: +25
|
||||
- Hit usage limit: +20
|
||||
- Pricing page visit: +15
|
||||
|
||||
**Negative:**
|
||||
- Personal email: -10
|
||||
- No login in 14 days: -15
|
||||
- Competitor domain: -50
|
||||
|
||||
**MQL threshold: 60 points**
|
||||
**Recalibration: Monthly** (fast feedback loop with high volume)
|
||||
|
||||
---
|
||||
|
||||
### Model 2: Enterprise Sales-Led (ACV $50K+)
|
||||
|
||||
**Weight: 60% fit / 40% engagement (fit is critical at this ACV)**
|
||||
|
||||
**Fit criteria:**
|
||||
- Company size 500+: +20
|
||||
- Revenue $50M+: +15
|
||||
- Target industry: +15
|
||||
- VP+ title: +20
|
||||
- Decision maker confirmed: +15
|
||||
- Uses competitor: +10
|
||||
|
||||
**Engagement criteria:**
|
||||
- Demo request: +30
|
||||
- Multiple stakeholders engaged: +20
|
||||
- Attended executive webinar: +15
|
||||
- Downloaded ROI guide: +10
|
||||
- Visited pricing page 2+: +15
|
||||
|
||||
**Negative:**
|
||||
- Company too small (<100): -30
|
||||
- Individual contributor only: -15
|
||||
- Competitor domain: -50
|
||||
|
||||
**MQL threshold: 75 points**
|
||||
**Recalibration: Quarterly** (longer sales cycles, smaller sample size)
|
||||
|
||||
---
|
||||
|
||||
### Model 3: Mid-Market Hybrid (ACV $5K-$25K)
|
||||
|
||||
**Weight: 50% fit / 50% engagement (balanced approach)**
|
||||
|
||||
**Fit criteria:**
|
||||
- Company size 50-1000: +15
|
||||
- Target industry: +10
|
||||
- Manager-VP title: +15
|
||||
- Target geography: +10
|
||||
- Uses complementary tool: +10
|
||||
|
||||
**Engagement criteria:**
|
||||
- Demo request or trial signup: +25
|
||||
- Pricing page visit: +15
|
||||
- Case study download: +10
|
||||
- Webinar attendance: +10
|
||||
- Email engagement (3+ clicks): +10
|
||||
- Blog visits (5+ pages): +10
|
||||
|
||||
**Negative:**
|
||||
- Personal email: -10
|
||||
- No engagement in 30 days: -10
|
||||
- Competitor domain: -50
|
||||
- Student/intern title: -25
|
||||
|
||||
**MQL threshold: 65 points**
|
||||
**Recalibration: Quarterly**
|
||||
|
||||
---
|
||||
|
||||
## Threshold Calibration
|
||||
|
||||
### Setting the Initial Threshold
|
||||
|
||||
1. **Pull closed-won data** from the last 6-12 months
|
||||
2. **Retroactively score** each deal using your new model
|
||||
3. **Find the natural breakpoint** — what score separated wins from losses?
|
||||
4. **Set threshold** just below where 80% of closed-won deals would have scored
|
||||
5. **Validate** against closed-lost — if many closed-lost score above threshold, tighten criteria
|
||||
|
||||
### Calibration Cadence
|
||||
|
||||
| Business Type | Recalibration Frequency | Why |
|
||||
|---------------|------------------------|-----|
|
||||
| PLG / High volume | Monthly | Fast feedback loop, lots of data |
|
||||
| Mid-market | Quarterly | Moderate cycle length |
|
||||
| Enterprise | Quarterly to semi-annually | Long cycles, small sample size |
|
||||
|
||||
### Calibration Steps
|
||||
|
||||
1. **Pull MQL-to-closed data** for the calibration period
|
||||
2. **Compare scored MQLs vs. actual outcomes:**
|
||||
- High score + closed-won = correctly scored
|
||||
- High score + closed-lost = possible false positive (tighten)
|
||||
- Low score + closed-won = possible false negative (loosen)
|
||||
3. **Adjust weights** based on which attributes actually correlated with wins
|
||||
4. **Adjust threshold** if MQL volume is too high (raise) or too low (lower)
|
||||
5. **Document changes** and communicate to sales team
|
||||
|
||||
### Warning Signs Your Model Needs Recalibration
|
||||
|
||||
- MQL-to-SQL acceptance rate drops below 30%
|
||||
- Sales consistently rejects MQLs as "not ready"
|
||||
- High-scoring leads don't convert; low-scoring leads do
|
||||
- MQL volume spikes without corresponding revenue
|
||||
- New product/market changes since last calibration
|
||||
@@ -0,0 +1,349 @@
|
||||
---
|
||||
name: sales-enablement
|
||||
description: "When the user wants to create sales collateral, pitch decks, one-pagers, objection handling docs, or demo scripts. Also use when the user mentions 'sales deck,' 'pitch deck,' 'one-pager,' 'leave-behind,' 'objection handling,' 'deal-specific ROI analysis,' 'demo script,' 'talk track,' 'sales playbook,' 'proposal template,' 'buyer persona card,' 'help my sales team,' 'sales materials,' or 'what should I give my sales reps.' Use this for any document or asset that helps a sales team close deals. For competitor comparison pages and battle cards, see competitor-alternatives. For marketing website copy, see copywriting. For cold outreach emails, see cold-email."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Sales Enablement
|
||||
|
||||
You are an expert in B2B sales enablement. Your goal is to create sales collateral that reps actually use — decks, one-pagers, objection docs, demo scripts, and playbooks that help close deals.
|
||||
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
1. **Value Proposition & Differentiators**
|
||||
- What do you sell and who is it for?
|
||||
- What makes you different from the next best alternative?
|
||||
- What outcomes can you prove?
|
||||
|
||||
2. **Sales Motion**
|
||||
- How do you sell? (self-serve, inside sales, field sales, hybrid)
|
||||
- Average deal size and sales cycle length
|
||||
- Key personas involved in the buying decision
|
||||
|
||||
3. **Collateral Needs**
|
||||
- What specific assets do you need?
|
||||
- What stage of the funnel are they for?
|
||||
- Who will use them? (AE, SDR, champion, prospect)
|
||||
|
||||
4. **Current State**
|
||||
- What materials exist today?
|
||||
- What's working and what's not?
|
||||
- What do reps ask for most?
|
||||
|
||||
---
|
||||
|
||||
## Core Principles
|
||||
|
||||
### Sales Uses What Sales Trusts
|
||||
Involve reps in creation. Use their language, not marketing's. If reps rewrite your deck before sending it, you wrote the wrong deck. Test drafts with your top performers first.
|
||||
|
||||
### Situation-Specific, Not Generic
|
||||
Tailor to persona, deal stage, and use case. A deck for a CTO should look different from one for a VP of Sales. A one-pager for post-meeting follow-up serves a different purpose than one for a trade show.
|
||||
|
||||
### Scannable Over Comprehensive
|
||||
Reps need information in 3 seconds, not 30. Use bold headers, short bullets, and visual hierarchy. If a rep can't find the answer mid-call, the doc has failed.
|
||||
|
||||
### Tie Back to Business Outcomes
|
||||
Every claim connects to revenue, efficiency, or risk reduction. Features mean nothing without the "so what." Replace "AI-powered analytics" with "cut reporting time by 80%."
|
||||
|
||||
---
|
||||
|
||||
## Sales Deck / Pitch Deck
|
||||
|
||||
### 10-12 Slide Framework
|
||||
|
||||
1. **Current World Problem** — The pain your buyer lives with today
|
||||
2. **Cost of the Problem** — What inaction costs (time, money, risk)
|
||||
3. **The Shift Happening** — Market or technology change creating urgency
|
||||
4. **Your Approach** — How you solve it differently
|
||||
5. **Product Walkthrough** — 3-4 key workflows, not a feature tour
|
||||
6. **Proof Points** — Metrics, logos, analyst recognition
|
||||
7. **Case Study** — One customer story told well
|
||||
8. **Implementation / Timeline** — How they get from here to live
|
||||
9. **ROI / Value** — Expected return and payback period
|
||||
10. **Pricing Overview** — Transparent, tiered if applicable
|
||||
11. **Next Steps / CTA** — Clear action with timeline
|
||||
|
||||
### Deck Principles
|
||||
|
||||
- **Story arc, not feature tour.** Every deck tells a story: the world has a problem, there's a better way, here's proof, here's how to get there.
|
||||
- **One idea per slide.** If you need two points, use two slides.
|
||||
- **Design for presenting, not reading.** Slides support the conversation — they don't replace it. Minimal text, strong visuals.
|
||||
|
||||
### Customization by Buyer Type
|
||||
|
||||
| Buyer | Emphasize | De-emphasize |
|
||||
|-------|-----------|--------------|
|
||||
| Technical buyer | Architecture, security, integrations, API | ROI calculations, business metrics |
|
||||
| Economic buyer | ROI, payback period, total cost, risk | Technical details, implementation specifics |
|
||||
| Champion | Internal selling points, quick wins, peer proof | Deep technical or financial detail |
|
||||
|
||||
**For full slide-by-slide guidance**: See [references/deck-frameworks.md](references/deck-frameworks.md)
|
||||
|
||||
---
|
||||
|
||||
## One-Pagers / Leave-Behinds
|
||||
|
||||
### When to Use
|
||||
|
||||
- **Post-meeting recap** — Reinforce what you discussed, keep momentum
|
||||
- **Champion internal selling** — Arm your champion to sell for you
|
||||
- **Trade show handout** — Quick intro that drives follow-up
|
||||
|
||||
### Structure
|
||||
|
||||
1. **Problem statement** — The pain in one sentence
|
||||
2. **Your solution** — What you do and how
|
||||
3. **3 differentiators** — Why you vs. alternatives
|
||||
4. **Proof point** — One strong metric or customer quote
|
||||
5. **CTA** — Clear next step with contact info
|
||||
|
||||
### Design Principles
|
||||
|
||||
- One page, literally. Front only, or front and back maximum.
|
||||
- Scannable in 30 seconds. Bold headers, short bullets, whitespace.
|
||||
- Include your logo, website, and a specific contact (not info@).
|
||||
- Match your brand but keep it clean — this is a sales tool, not a brand piece.
|
||||
|
||||
**For templates by use case**: See [references/one-pager-templates.md](references/one-pager-templates.md)
|
||||
|
||||
---
|
||||
|
||||
## Objection Handling Docs
|
||||
|
||||
### Objection Categories
|
||||
|
||||
| Category | Examples |
|
||||
|----------|----------|
|
||||
| Price | "Too expensive," "No budget this quarter," "Competitor is cheaper" |
|
||||
| Timing | "Not the right time," "Maybe next quarter," "Too busy to implement" |
|
||||
| Competition | "We already use X," "What makes you different?" |
|
||||
| Authority | "I need to check with my boss," "The committee decides" |
|
||||
| Status quo | "What we have works fine," "Not broken, don't fix it" |
|
||||
| Technical | "Does it integrate with X?," "Security concerns," "Can it scale?" |
|
||||
|
||||
### Response Framework
|
||||
|
||||
For each objection, document:
|
||||
|
||||
1. **Objection statement** — Exactly how reps hear it
|
||||
2. **Why they say it** — The real concern behind the words
|
||||
3. **Response approach** — How to acknowledge and redirect
|
||||
4. **Proof point** — Specific evidence that addresses the concern
|
||||
5. **Follow-up question** — Keep the conversation moving forward
|
||||
|
||||
### Two Formats
|
||||
|
||||
- **Quick-reference table** for live calls — objection, one-line response, proof point. Fits on one screen.
|
||||
- **Detailed doc** for prep and training — full context, talk tracks, role-play scenarios.
|
||||
|
||||
**For the full objection library**: See [references/objection-library.md](references/objection-library.md)
|
||||
|
||||
---
|
||||
|
||||
## ROI Calculators & Value Props
|
||||
|
||||
### Calculator Design
|
||||
|
||||
**Inputs** (current state metrics the prospect provides):
|
||||
- Time spent on manual processes
|
||||
- Current tool costs
|
||||
- Error rates or inefficiency metrics
|
||||
- Team size
|
||||
|
||||
**Calculations** (your formula for value):
|
||||
- Time saved per week/month/year
|
||||
- Cost reduction (tools, headcount, errors)
|
||||
- Revenue impact (faster deals, higher conversion)
|
||||
|
||||
**Outputs** (what the prospect sees):
|
||||
- Annual ROI percentage
|
||||
- Payback period in months
|
||||
- Total 3-year value
|
||||
|
||||
### Value Prop by Persona
|
||||
|
||||
| Persona | Cares About | Lead With |
|
||||
|---------|-------------|-----------|
|
||||
| CTO / VP Eng | Architecture, scale, security, team velocity | Technical superiority, integration depth |
|
||||
| VP Sales | Pipeline, quota attainment, rep productivity | Revenue impact, time savings per rep |
|
||||
| CFO | Total cost, payback period, risk | ROI, cost reduction, financial predictability |
|
||||
| End user | Ease of use, daily workflow, learning curve | Time saved, frustration eliminated |
|
||||
|
||||
### Implementation Options
|
||||
|
||||
- **Spreadsheet** — Fastest to build, easy to customize per deal. Works for inside sales.
|
||||
- **Web tool** — More polished, captures leads, scales better. Worth building if deal volume is high.
|
||||
- **Slide-based** — ROI story embedded in the deck. Good for executive presentations.
|
||||
|
||||
---
|
||||
|
||||
## Demo Scripts & Talk Tracks
|
||||
|
||||
### Script Structure
|
||||
|
||||
1. **Opening** (2 min) — Context setting, agenda, confirm goals for the call
|
||||
2. **Discovery recap** (3 min) — Summarize what you learned, confirm priorities
|
||||
3. **Solution walkthrough** (15-20 min) — 3-4 key workflows mapped to their pain
|
||||
4. **Interaction points** — Questions to ask during the demo, not just at the end
|
||||
5. **Close** (5 min) — Summarize value, propose next steps with timeline
|
||||
|
||||
### Talk Track Types
|
||||
|
||||
| Type | Duration | Focus |
|
||||
|------|----------|-------|
|
||||
| Discovery call | 30 min | Qualify, understand pain, map buying process |
|
||||
| First demo | 30-45 min | Show 3-4 workflows tied to their pain |
|
||||
| Technical deep-dive | 45-60 min | Architecture, security, integrations, API |
|
||||
| Executive overview | 20-30 min | Business outcomes, ROI, strategic alignment |
|
||||
|
||||
### Key Principles
|
||||
|
||||
- **Never demo without discovery.** If you don't know their pain, you're guessing which features matter.
|
||||
- **Customize to their use case.** Use their terminology, their data (if possible), their workflow.
|
||||
- **Leave time for questions.** A demo where the prospect doesn't talk is a demo that doesn't close.
|
||||
|
||||
**For full script templates**: See [references/demo-scripts.md](references/demo-scripts.md)
|
||||
|
||||
---
|
||||
|
||||
## Case Study Briefs (Sales Format)
|
||||
|
||||
### How Sales Case Studies Differ
|
||||
|
||||
Marketing case studies tell a story. Sales case studies arm reps with fast-access proof. Keep them short, outcome-focused, and tagged for retrieval.
|
||||
|
||||
### Structure
|
||||
|
||||
1. **Customer profile** — Industry, company size, buyer role
|
||||
2. **Challenge** — What they were struggling with (2-3 sentences)
|
||||
3. **Solution** — What they implemented (1-2 sentences)
|
||||
4. **Results** — 3 specific metrics (before/after)
|
||||
5. **Pull quote** — One sentence from the customer
|
||||
6. **Tags** — Industry, use case, company size, persona
|
||||
|
||||
### Organization
|
||||
|
||||
Organize case studies so reps can find the right one instantly:
|
||||
- **By industry** — "Show me a case study for healthcare"
|
||||
- **By use case** — "Show me someone who used us for X"
|
||||
- **By company size** — "Show me an enterprise example"
|
||||
|
||||
---
|
||||
|
||||
## Proposal Templates
|
||||
|
||||
### Structure
|
||||
|
||||
1. **Executive summary** — Their challenge, your solution, expected outcome (1 page max)
|
||||
2. **Proposed solution** — What you'll deliver, mapped to their requirements
|
||||
3. **Implementation plan** — Timeline, milestones, responsibilities
|
||||
4. **Investment** — Pricing, payment terms, what's included
|
||||
5. **Next steps** — How to move forward, decision timeline
|
||||
|
||||
### Customization Guidance
|
||||
|
||||
- Mirror their language from discovery calls
|
||||
- Reference specific pain points they mentioned
|
||||
- Include only relevant case studies (same industry or use case)
|
||||
- Name the stakeholders you've spoken with
|
||||
|
||||
### Common Mistakes
|
||||
|
||||
- **Too long** — If it's over 10 pages, it won't get read. Aim for 5-7.
|
||||
- **Too generic** — Templated proposals signal low effort. Customize the exec summary at minimum.
|
||||
- **Burying the price** — Don't make them hunt for it. Be transparent and confident.
|
||||
|
||||
---
|
||||
|
||||
## Sales Playbooks
|
||||
|
||||
### What Goes in a Playbook
|
||||
|
||||
- **Buyer profile** — Who you're selling to, their goals and pains
|
||||
- **Qualification criteria** — BANT, MEDDIC, or your framework
|
||||
- **Discovery questions** — Organized by topic, not a script
|
||||
- **Objection handling** — Top 10 objections with responses
|
||||
- **Competitive positioning** — How you win against each competitor
|
||||
- **Demo flow** — Recommended sequence for each persona
|
||||
- **Email templates** — Follow-up, proposal, check-in, breakup
|
||||
|
||||
### When to Build
|
||||
|
||||
- **New product launch** — Reps need a single source of truth
|
||||
- **New market segment** — Different buyers need different approaches
|
||||
- **New hire ramp** — Playbooks cut ramp time significantly
|
||||
|
||||
### Keeping It Living
|
||||
|
||||
Playbooks die when they're not updated. Review quarterly, get input from top reps, and remove anything outdated. Assign an owner — if nobody owns it, it rots.
|
||||
|
||||
---
|
||||
|
||||
## Buyer Persona Cards
|
||||
|
||||
### Card Structure
|
||||
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
| Role / title | Common titles and reporting structure |
|
||||
| Goals | What success looks like for them |
|
||||
| Pains | What frustrates them daily |
|
||||
| Top objections | The 3-5 objections you'll hear from this role |
|
||||
| Evaluation criteria | How they judge solutions |
|
||||
| Buying process | Their role in the decision, who they influence |
|
||||
| Messaging angle | The one sentence that resonates most |
|
||||
|
||||
### Persona Types
|
||||
|
||||
- **Economic buyer** — Signs the check. Cares about ROI and risk.
|
||||
- **Technical buyer** — Evaluates the product. Cares about capabilities and integration.
|
||||
- **End user** — Uses it daily. Cares about ease and workflow fit.
|
||||
- **Champion** — Advocates internally. Needs ammunition to sell for you.
|
||||
- **Blocker** — Opposes the purchase. Understand their concern to neutralize it.
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
Deliver the right format for each asset type:
|
||||
|
||||
| Asset | Deliverable |
|
||||
|-------|-------------|
|
||||
| Sales deck | Slide-by-slide outline with headline, body copy, and speaker notes |
|
||||
| One-pager | Full copy with layout guidance (visual hierarchy, sections) |
|
||||
| Objection doc | Table format: objection, response, proof point, follow-up |
|
||||
| Demo script | Scene-by-scene with timing, talk track, and interaction points |
|
||||
| ROI calculator | Input fields, formulas, output display with sample data |
|
||||
| Playbook | Structured document with table of contents and sections |
|
||||
| Persona card | One-page card format per persona |
|
||||
| Proposal | Section-by-section copy with customization notes |
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
If context is missing, ask:
|
||||
|
||||
1. What collateral do you need? (deck, one-pager, objection doc, etc.)
|
||||
2. Who will use it? (AE, SDR, champion, prospect)
|
||||
3. What sales stage is it for? (prospecting, discovery, demo, negotiation, close)
|
||||
4. Who is the target persona? (title, seniority, department)
|
||||
5. What are the top 3 objections you hear most?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **competitor-alternatives**: For public-facing comparison and alternative pages
|
||||
- **copywriting**: For marketing website copy
|
||||
- **cold-email**: For outbound prospecting emails
|
||||
- **revops**: For lead lifecycle, scoring, routing, and pipeline management
|
||||
- **pricing-strategy**: For pricing decisions and packaging
|
||||
- **product-marketing-context**: For foundational positioning and messaging
|
||||
@@ -0,0 +1,263 @@
|
||||
# Sales Deck Frameworks
|
||||
|
||||
Detailed slide-by-slide guidance for building sales decks that tell a story and close deals.
|
||||
|
||||
## The Storytelling Arc
|
||||
|
||||
Every great deck follows a narrative structure: **Situation → Complication → Resolution.**
|
||||
|
||||
- **Situation** (Slides 1-3): The world your buyer lives in. Establish shared understanding.
|
||||
- **Complication** (Slides 2-3): Why the status quo is no longer sustainable. Create urgency.
|
||||
- **Resolution** (Slides 4-11): Your approach, proof, and path forward.
|
||||
|
||||
The goal is not to present features. The goal is to make the buyer feel understood, then show them a better way.
|
||||
|
||||
---
|
||||
|
||||
## Slide-by-Slide Template
|
||||
|
||||
### Slide 1: Current World Problem
|
||||
|
||||
**What to include:**
|
||||
- The challenge your buyer faces daily
|
||||
- A stat or data point that quantifies the problem
|
||||
- Visual: simple graphic or striking number
|
||||
|
||||
**What to avoid:**
|
||||
- Starting with your company or product
|
||||
- Generic industry trends that don't connect to pain
|
||||
- More than one core problem
|
||||
|
||||
**Copy prompt:** "What is the one problem that, if you could describe it perfectly, would make your buyer say 'that's exactly my situation'?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 2: Cost of the Problem
|
||||
|
||||
**What to include:**
|
||||
- Financial impact (revenue lost, costs incurred)
|
||||
- Time impact (hours wasted, delays)
|
||||
- Risk impact (what happens if they do nothing)
|
||||
- Specific numbers wherever possible
|
||||
|
||||
**What to avoid:**
|
||||
- Vague claims without data
|
||||
- Fear-mongering without substance
|
||||
- Too many metrics (pick 2-3 that hit hardest)
|
||||
|
||||
**Copy prompt:** "If your buyer does nothing for the next 12 months, what does it cost them?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 3: The Shift Happening
|
||||
|
||||
**What to include:**
|
||||
- Market trend or technology change creating a new opportunity
|
||||
- Why "the old way" no longer works
|
||||
- Why now is the right time to act
|
||||
|
||||
**What to avoid:**
|
||||
- Hype-driven trends without substance
|
||||
- Making it about your product yet
|
||||
- Overly technical explanations
|
||||
|
||||
**Copy prompt:** "What has changed in the market that makes the old approach unsustainable?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 4: Your Approach
|
||||
|
||||
**What to include:**
|
||||
- Your philosophy or unique point of view
|
||||
- How your approach differs from conventional solutions
|
||||
- The "aha" insight that led to your product
|
||||
|
||||
**What to avoid:**
|
||||
- Feature lists (too early)
|
||||
- Jargon or acronyms
|
||||
- Claiming to be "the only" or "the first" unless provably true
|
||||
|
||||
**Copy prompt:** "What do you believe about solving this problem that most people get wrong?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 5: Product Walkthrough
|
||||
|
||||
**What to include:**
|
||||
- 3-4 key workflows that map to the pain from Slide 1
|
||||
- Screenshots or product visuals
|
||||
- Brief description of what each workflow accomplishes
|
||||
|
||||
**What to avoid:**
|
||||
- Showing every feature
|
||||
- Dense UI screenshots without callouts
|
||||
- Talking about technology instead of outcomes
|
||||
|
||||
**Copy prompt:** "Walk through 3 things the buyer would do in your product in their first week."
|
||||
|
||||
---
|
||||
|
||||
### Slide 6: Proof Points
|
||||
|
||||
**What to include:**
|
||||
- Customer logos (aim for recognizable names in their industry)
|
||||
- Key metrics: "X% improvement," "Y hours saved," "Z% increase"
|
||||
- Analyst recognition, awards, or certifications if relevant
|
||||
|
||||
**What to avoid:**
|
||||
- Unsubstantiated claims
|
||||
- Too many logos without context
|
||||
- Vanity metrics that don't relate to the buyer's pain
|
||||
|
||||
**Copy prompt:** "What are 3 numbers that prove your product works?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 7: Case Study
|
||||
|
||||
**What to include:**
|
||||
- One customer story told well: challenge, solution, results
|
||||
- Specific metrics (before and after)
|
||||
- Customer quote if available
|
||||
- Choose a customer similar to the prospect
|
||||
|
||||
**What to avoid:**
|
||||
- Multiple case studies crammed into one slide
|
||||
- Generic outcomes without specifics
|
||||
- Customers from irrelevant industries
|
||||
|
||||
**Copy prompt:** "Tell the story of one customer who went from struggling to succeeding with your product."
|
||||
|
||||
---
|
||||
|
||||
### Slide 8: Implementation / Timeline
|
||||
|
||||
**What to include:**
|
||||
- Clear phases with timeline (e.g., Week 1: Setup, Week 2-3: Integration, Week 4: Live)
|
||||
- What's required from their side vs. yours
|
||||
- Support resources available
|
||||
|
||||
**What to avoid:**
|
||||
- Overcomplicating the process
|
||||
- Hiding time requirements
|
||||
- Skipping the "what do I need to do?" question
|
||||
|
||||
**Copy prompt:** "How does a customer get from signing to live? What does each week look like?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 9: ROI / Value
|
||||
|
||||
**What to include:**
|
||||
- Expected return based on their inputs or industry benchmarks
|
||||
- Payback period
|
||||
- Total value over 1-3 years
|
||||
- Comparison to cost of inaction
|
||||
|
||||
**What to avoid:**
|
||||
- Unrealistic projections
|
||||
- ROI without showing your math
|
||||
- Generic numbers not tied to their situation
|
||||
|
||||
**Copy prompt:** "If they buy today, what does the next 12 months look like in dollars and hours?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 10: Pricing Overview
|
||||
|
||||
**What to include:**
|
||||
- Pricing tiers or structure
|
||||
- What's included at each level
|
||||
- Recommended plan for their situation
|
||||
|
||||
**What to avoid:**
|
||||
- Burying the price or being cagey
|
||||
- Too many options (3 tiers max)
|
||||
- Surprising them with hidden costs
|
||||
|
||||
**Copy prompt:** "What does it cost, what do they get, and which plan is right for them?"
|
||||
|
||||
---
|
||||
|
||||
### Slide 11: Next Steps / CTA
|
||||
|
||||
**What to include:**
|
||||
- Specific next action with timeline ("Start a pilot next week")
|
||||
- What happens after they say yes
|
||||
- Your contact information
|
||||
|
||||
**What to avoid:**
|
||||
- Vague CTAs ("Let's stay in touch")
|
||||
- Multiple competing next steps
|
||||
- Ending without energy
|
||||
|
||||
**Copy prompt:** "What is the one thing you want them to do after this meeting?"
|
||||
|
||||
---
|
||||
|
||||
## Persona Customization Guide
|
||||
|
||||
### Technical Buyer Deck
|
||||
|
||||
**Add:**
|
||||
- Architecture diagram slide after Product Walkthrough
|
||||
- Security and compliance details
|
||||
- Integration ecosystem and API capabilities
|
||||
- Technical implementation requirements
|
||||
|
||||
**Remove or minimize:**
|
||||
- ROI calculations (they care about capability, not cost)
|
||||
- High-level market trends (they want specifics)
|
||||
|
||||
**Adjust tone:** Precise, no fluff, respect their expertise. Avoid marketing superlatives.
|
||||
|
||||
### Economic Buyer Deck
|
||||
|
||||
**Add:**
|
||||
- Detailed ROI slide with calculations shown
|
||||
- Total cost of ownership comparison
|
||||
- Risk mitigation and compliance
|
||||
- Executive summary slide up front
|
||||
|
||||
**Remove or minimize:**
|
||||
- Technical details and architecture
|
||||
- Feature-level walkthroughs
|
||||
- Implementation specifics (they'll delegate)
|
||||
|
||||
**Adjust tone:** Business-focused, outcome-driven. Speak in dollars and percentages.
|
||||
|
||||
### Champion Deck
|
||||
|
||||
**Add:**
|
||||
- "Internal selling" slide — key points for them to present to their team
|
||||
- Quick-win slide — what success looks like in 30 days
|
||||
- Peer proof — companies like theirs who succeeded
|
||||
- Objection pre-handling — common pushback they'll face internally
|
||||
|
||||
**Remove or minimize:**
|
||||
- Deep technical or financial detail
|
||||
- Anything that requires context they can't relay
|
||||
|
||||
**Adjust tone:** Empowering, equipping. Make them look smart to their boss.
|
||||
|
||||
---
|
||||
|
||||
## Anti-Patterns
|
||||
|
||||
### The Feature Dump
|
||||
Every slide is a feature with a screenshot. No story, no "so what," no connection to the buyer's world. Reps click through it; prospects tune out.
|
||||
|
||||
### The Wall of Text
|
||||
Slides with 200+ words. Nobody reads them during a presentation. If the slide requires reading, it belongs in a leave-behind.
|
||||
|
||||
### The Missing Story Arc
|
||||
Slides exist in isolation — no narrative flow from problem to solution to proof. The deck feels like a brochure, not a conversation.
|
||||
|
||||
### The Generic Screenshot
|
||||
Product screenshots without callouts, annotations, or context. The prospect can't tell what they're looking at or why it matters.
|
||||
|
||||
### The Premature Demo
|
||||
Jumping to product features before establishing the problem. The buyer has no frame of reference for why your features matter.
|
||||
|
||||
### The Kitchen Sink
|
||||
Trying to address every persona, every use case, every feature in one deck. The result is a 40-slide monster that nobody wants to sit through.
|
||||
@@ -0,0 +1,355 @@
|
||||
# Demo Script Templates
|
||||
|
||||
Scene-by-scene templates for different call types, with timing, talk tracks, and interaction guidance.
|
||||
|
||||
## Discovery Call Script
|
||||
|
||||
**Duration:** 30 minutes
|
||||
**Goal:** Qualify the opportunity, understand pain, map the buying process.
|
||||
|
||||
### Scene 1: Opening (3 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Thanks for taking the time, [Name]. I've done some research on [Company] but I'd love to hear from you directly. My goal for today is to understand what you're working on and see if there's a fit — and if there's not, I'll tell you that too. Sound good?"
|
||||
|
||||
**What to establish:**
|
||||
- Set the agenda and time expectation
|
||||
- Position yourself as a peer, not a pitch person
|
||||
- Get permission to ask questions
|
||||
|
||||
---
|
||||
|
||||
### Scene 2: Situation Questions (7 min)
|
||||
|
||||
**Questions to ask:**
|
||||
- "Can you walk me through how your team handles [relevant process] today?"
|
||||
- "What tools are you currently using for this?"
|
||||
- "How many people are involved in this workflow?"
|
||||
- "How long has this been in place?"
|
||||
|
||||
**What you're listening for:**
|
||||
- Current process and tools
|
||||
- Team size and structure
|
||||
- How established (and how entrenched) the current approach is
|
||||
|
||||
---
|
||||
|
||||
### Scene 3: Pain Identification (10 min)
|
||||
|
||||
**Questions to ask:**
|
||||
- "What's the biggest challenge with that process today?"
|
||||
- "When that breaks down, what happens?"
|
||||
- "How much time does your team spend on [specific task] per week?"
|
||||
- "What have you tried to fix this?"
|
||||
- "If you could wave a magic wand, what would change?"
|
||||
|
||||
**What you're listening for:**
|
||||
- Specific, quantifiable pain points
|
||||
- Emotional frustration (not just logical problems)
|
||||
- Failed attempts to solve this (shows urgency)
|
||||
- The "magic wand" answer reveals their ideal state
|
||||
|
||||
**Interaction tip:** Take notes visibly. Repeat back what you hear: "So if I understand correctly, the biggest issue is [X], which costs you about [Y] per month. Is that right?"
|
||||
|
||||
---
|
||||
|
||||
### Scene 4: Impact & Priority (5 min)
|
||||
|
||||
**Questions to ask:**
|
||||
- "Where does solving this sit on your priority list this quarter?"
|
||||
- "What happens if you don't solve this in the next 6 months?"
|
||||
- "Who else is affected by this problem?"
|
||||
- "Is there budget allocated for solving this?"
|
||||
|
||||
**What you're listening for:**
|
||||
- Priority level (nice-to-have vs. must-solve)
|
||||
- Urgency and consequences of inaction
|
||||
- Organizational breadth of the problem
|
||||
- Budget signals
|
||||
|
||||
---
|
||||
|
||||
### Scene 5: Buying Process (3 min)
|
||||
|
||||
**Questions to ask:**
|
||||
- "If you decided this was the right solution, what does the evaluation process look like?"
|
||||
- "Who else would be involved in the decision?"
|
||||
- "Have you evaluated solutions for this before?"
|
||||
- "What's your timeline for making a decision?"
|
||||
|
||||
**What you're listening for:**
|
||||
- Decision-making process and stakeholders
|
||||
- Past evaluation experience (and why they didn't buy)
|
||||
- Timeline for decision
|
||||
|
||||
---
|
||||
|
||||
### Scene 6: Close (2 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Based on what you've shared, I think there's a strong fit — specifically around [pain point 1] and [pain point 2]. What I'd suggest as a next step is a 30-minute demo where I can show you exactly how we'd address those. I'll customize it to your workflow. Does [specific date/time] work?"
|
||||
|
||||
**What to do:**
|
||||
- Summarize the 2-3 key pain points
|
||||
- Propose a specific next step with a date
|
||||
- Send a calendar invite before you hang up
|
||||
|
||||
---
|
||||
|
||||
## First Demo Script
|
||||
|
||||
**Duration:** 30-45 minutes
|
||||
**Goal:** Show how your product solves their specific pain. Advance to evaluation/pilot.
|
||||
|
||||
### Scene 1: Opening & Recap (5 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Last time we spoke, you mentioned [pain point 1], [pain point 2], and [goal]. I've put together a demo focused on those three areas. If I've missed anything, flag it and we'll adjust. Sound good?"
|
||||
|
||||
**What to do:**
|
||||
- Recap discovery findings to show you listened
|
||||
- Confirm priorities haven't changed
|
||||
- Set expectation for what they'll see
|
||||
|
||||
---
|
||||
|
||||
### Scene 2: Workflow 1 — Primary Pain Point (10 min)
|
||||
|
||||
**Structure:**
|
||||
1. Restate the pain: "You mentioned [specific problem]..."
|
||||
2. Show the solution: Walk through the workflow step by step
|
||||
3. Highlight the outcome: "This means [specific benefit]..."
|
||||
|
||||
**Interaction point (at the 5-min mark):**
|
||||
> "How does this compare to how you're handling it today?"
|
||||
|
||||
**What to avoid:**
|
||||
- Showing every feature of this section
|
||||
- Getting lost in settings or configuration
|
||||
- Talking for more than 3 minutes without asking a question
|
||||
|
||||
---
|
||||
|
||||
### Scene 3: Workflow 2 — Secondary Pain Point (8 min)
|
||||
|
||||
**Structure:**
|
||||
Same as Workflow 1 — restate pain, show solution, highlight outcome.
|
||||
|
||||
**Interaction point:**
|
||||
> "Is this the kind of visibility your team has been asking for?"
|
||||
|
||||
---
|
||||
|
||||
### Scene 4: Workflow 3 — Differentiator (7 min)
|
||||
|
||||
**Structure:**
|
||||
Show something they can't do today and can't get from competitors.
|
||||
|
||||
**Talk track:**
|
||||
> "This is where we're really different from [competitor/status quo]. [Explain the unique capability]. For example, [Customer] uses this to [specific outcome]."
|
||||
|
||||
**Interaction point:**
|
||||
> "How would your team use this?"
|
||||
|
||||
---
|
||||
|
||||
### Scene 5: Proof Point (3 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Let me share a quick example. [Customer similar to them] was in a similar situation — [brief challenge]. After implementing, they saw [specific metrics]. Their [role] said [quote]."
|
||||
|
||||
**What to do:**
|
||||
- Choose a case study that matches their industry, size, or use case
|
||||
- Keep it brief — this is reinforcement, not a presentation
|
||||
|
||||
---
|
||||
|
||||
### Scene 6: Close (5 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Based on what we've covered, here's what I'd recommend as next steps: [specific next step]. This typically takes [timeline]. Who else on your team should be involved? I can set up a [follow-up meeting type] for [date]."
|
||||
|
||||
**What to do:**
|
||||
- Propose a specific next step (not "let me know")
|
||||
- Identify additional stakeholders to involve
|
||||
- Set a follow-up date before ending the call
|
||||
- Send recap email within 2 hours
|
||||
|
||||
---
|
||||
|
||||
## Technical Deep-Dive Script
|
||||
|
||||
**Duration:** 45-60 minutes
|
||||
**Goal:** Satisfy technical evaluation criteria. Address architecture, security, and integration concerns.
|
||||
|
||||
### Scene 1: Opening (3 min)
|
||||
|
||||
**Talk track:**
|
||||
> "I know your goal today is to understand the technical details — architecture, security, integrations, and how this fits your stack. I'll walk through each area and leave plenty of time for questions. What's your top priority for this session?"
|
||||
|
||||
**Attendees:** Typically includes their technical evaluator (engineer, architect, IT lead) plus your SE or solutions engineer.
|
||||
|
||||
---
|
||||
|
||||
### Scene 2: Architecture Overview (10 min)
|
||||
|
||||
**Cover:**
|
||||
- High-level architecture diagram
|
||||
- Infrastructure and hosting (cloud provider, regions)
|
||||
- Data flow and storage
|
||||
- Scalability approach
|
||||
- Uptime SLA and reliability track record
|
||||
|
||||
**Interaction point:**
|
||||
> "How does this compare to your current infrastructure requirements?"
|
||||
|
||||
---
|
||||
|
||||
### Scene 3: Security & Compliance (10 min)
|
||||
|
||||
**Cover:**
|
||||
- Certifications (SOC 2, ISO 27001, HIPAA, etc.)
|
||||
- Data encryption (at rest, in transit)
|
||||
- Access controls and authentication (SSO, RBAC)
|
||||
- Audit logging
|
||||
- Data residency and privacy (GDPR, CCPA)
|
||||
- Penetration testing cadence
|
||||
|
||||
**Interaction point:**
|
||||
> "What are your must-have security requirements? I want to make sure we address them specifically."
|
||||
|
||||
---
|
||||
|
||||
### Scene 4: Integrations & API (15 min)
|
||||
|
||||
**Cover:**
|
||||
- Native integrations relevant to their stack
|
||||
- API capabilities (REST, GraphQL, webhooks)
|
||||
- Authentication methods
|
||||
- Rate limits and data sync frequency
|
||||
- Live demo of relevant integration
|
||||
|
||||
**Interaction point:**
|
||||
> "Walk me through your current stack — I want to map out exactly how we'd fit in."
|
||||
|
||||
---
|
||||
|
||||
### Scene 5: Implementation & Migration (5 min)
|
||||
|
||||
**Cover:**
|
||||
- Implementation timeline and phases
|
||||
- Data migration process
|
||||
- Configuration requirements
|
||||
- Training and onboarding
|
||||
- Ongoing support model
|
||||
|
||||
**Interaction point:**
|
||||
> "What does your team's capacity look like for implementation? That helps me scope the right timeline."
|
||||
|
||||
---
|
||||
|
||||
### Scene 6: Q&A and Close (10 min)
|
||||
|
||||
**Talk track:**
|
||||
> "What questions do I need to answer for you to feel confident about the technical fit?"
|
||||
|
||||
**What to do:**
|
||||
- Answer directly — if you don't know, say so and follow up
|
||||
- Document all questions for follow-up
|
||||
- Propose next step (security review, proof of concept, pilot)
|
||||
- Send technical documentation summary within 24 hours
|
||||
|
||||
---
|
||||
|
||||
## Executive Overview Script
|
||||
|
||||
**Duration:** 20-30 minutes
|
||||
**Goal:** Get executive buy-in on the business case. Advance to budget approval or decision.
|
||||
|
||||
### Scene 1: Opening (2 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Thanks for your time, [Name]. [Champion] has been evaluating [your product] and the results look strong. I'll keep this focused on the business impact and what a partnership looks like. I know your time is valuable so I'll aim to leave 10 minutes for questions."
|
||||
|
||||
**What to do:**
|
||||
- Be concise — executives punish rambling
|
||||
- Reference the champion and work done so far
|
||||
- Set a clear agenda
|
||||
|
||||
---
|
||||
|
||||
### Scene 2: The Problem & Cost (5 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Based on what [Champion] shared, your team is spending [X hours/$ amount] on [problem]. That's [annual cost]. It's also creating [secondary impact: risk, delays, churn]. This isn't unique to you — it's an industry-wide challenge, and the companies solving it are seeing [outcome]."
|
||||
|
||||
**What to do:**
|
||||
- Use their numbers, not generic benchmarks
|
||||
- Connect to metrics they care about (revenue, cost, risk)
|
||||
- Keep it to 2-3 key points
|
||||
|
||||
---
|
||||
|
||||
### Scene 3: The Solution & Differentiation (5 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Here's what we do differently. [One-sentence explanation]. For your team specifically, this means [specific benefit 1] and [specific benefit 2]. [Champion]'s team has already seen [early result or reaction from evaluation]."
|
||||
|
||||
**What to do:**
|
||||
- High-level, not feature-level
|
||||
- Tie to their strategic priorities
|
||||
- Reference the champion's evaluation
|
||||
|
||||
---
|
||||
|
||||
### Scene 4: ROI & Business Case (5 min)
|
||||
|
||||
**Talk track:**
|
||||
> "Here's the business case. Based on your team's numbers: [walk through ROI calculation]. Expected payback period is [X months]. Over 3 years, the total value is [$ amount]. [Customer similar to them] saw [specific result] within [timeframe]."
|
||||
|
||||
**What to do:**
|
||||
- Show the math, not just the conclusion
|
||||
- Use conservative estimates (executives discount inflated numbers)
|
||||
- One strong case study, not three weak ones
|
||||
|
||||
---
|
||||
|
||||
### Scene 5: Q&A and Decision (5-10 min)
|
||||
|
||||
**Talk track:**
|
||||
> "What questions do you have? And — assuming the business case holds up, what does the decision process look like from here?"
|
||||
|
||||
**What to do:**
|
||||
- Listen more than talk
|
||||
- Answer concisely
|
||||
- Get a clear next step and timeline
|
||||
- Thank the champion in front of the executive
|
||||
|
||||
---
|
||||
|
||||
## Interaction Point Guidance
|
||||
|
||||
### When to Ask Questions During Demos
|
||||
|
||||
- **After showing each workflow** — "How does this compare to your current process?"
|
||||
- **When you see a reaction** — "I noticed you reacted to that — what are you thinking?"
|
||||
- **Before moving to the next section** — "Any questions on this before we move on?"
|
||||
- **When showing a differentiator** — "How would your team use this?"
|
||||
- **At the midpoint** — "Are we covering the right things, or should we adjust?"
|
||||
|
||||
### Questions NOT to Ask During Demos
|
||||
|
||||
- "Does that make sense?" (patronizing)
|
||||
- "Are you still with me?" (implies they're lost)
|
||||
- "Isn't that cool?" (salesy)
|
||||
- Rhetorical questions that don't invite real dialogue
|
||||
|
||||
### How to Handle "Can You Show Me X?"
|
||||
|
||||
When a prospect asks to see something during the demo:
|
||||
|
||||
1. **If it's quick** — show it now, then return to your flow
|
||||
2. **If it's a tangent** — "Great question. Let me note that and show you after the main flow so we stay on track."
|
||||
3. **If it's not possible** — "We don't do that today. Here's how customers handle it: [alternative]."
|
||||
|
||||
Never say "I'll get back to you" without writing it down and following up within 24 hours.
|
||||
@@ -0,0 +1,270 @@
|
||||
# Objection Library
|
||||
|
||||
Common B2B SaaS objections with response frameworks. Organized by category for quick reference.
|
||||
|
||||
## Quick-Reference Table
|
||||
|
||||
For live calls. Find the objection, scan the response, reference the proof.
|
||||
|
||||
| Objection | Response (1-line) | Proof Point |
|
||||
|-----------|--------------------|-------------|
|
||||
| "Too expensive" | "Compared to what? Let's look at what the problem costs you today." | ROI case study showing payback in X months |
|
||||
| "No budget" | "When budget opens up, what would need to be true for this to be a priority?" | Customer who started with a pilot to prove value |
|
||||
| "Competitor is cheaper" | "They are — here's what you give up at that price point." | Feature comparison + customer who switched |
|
||||
| "Not the right time" | "What changes next quarter that makes it better timing?" | Cost-of-delay calculation |
|
||||
| "Maybe next quarter" | "Happy to reconnect. What would a pilot look like before then?" | Customer who started small and expanded |
|
||||
| "We use X already" | "How's that working for [specific pain area]?" | Customer who switched from X |
|
||||
| "What makes you different?" | "For teams like yours, the biggest difference is [specific differentiator]." | Side-by-side comparison for their use case |
|
||||
| "Need to check with my boss" | "Absolutely. What would help you make the case? I can send materials." | Champion one-pager, ROI calculator |
|
||||
| "The committee decides" | "Who's on the committee and what does each person care about?" | Multi-persona case study |
|
||||
| "What we have works fine" | "It does work — the question is whether it's costing you more than it should." | Benchmark data showing efficiency gaps |
|
||||
| "Not broken, don't fix it" | "Agreed — this isn't about fixing, it's about the opportunity cost of the current approach." | Customer who didn't know what they were missing |
|
||||
| "Does it integrate with X?" | "Yes / Let me check and get you specifics by end of day." | Integration documentation, customer using same stack |
|
||||
| "Security concerns" | "Completely fair. Here's our security overview — happy to loop in our team." | SOC 2 report, security whitepaper |
|
||||
| "Can it scale?" | "We serve companies from [small] to [large]. Here's an example at your scale." | Case study at similar scale |
|
||||
| "We tried something like this before" | "What went wrong? Understanding that helps me show how we're different." | Customer with same failed experience who succeeded with you |
|
||||
|
||||
---
|
||||
|
||||
## Detailed Objection Responses
|
||||
|
||||
### Price Objections
|
||||
|
||||
#### "It's too expensive"
|
||||
|
||||
**Why they say it:** May be genuine budget constraint, sticker shock, or negotiation tactic. Often means they don't yet see enough value to justify the cost.
|
||||
|
||||
**Response approach:**
|
||||
1. Don't defend the price immediately. Ask "Compared to what?"
|
||||
2. Reframe from cost to investment — what does the problem cost them today?
|
||||
3. Walk through the ROI calculation together
|
||||
4. If budget is real, explore smaller starting points
|
||||
|
||||
**Talk track:**
|
||||
> "I hear that. Let me ask — what's the cost of the problem we discussed? You mentioned your team spends [X hours] on [task] every week. At your team's loaded cost, that's roughly [$ amount] per year. Our solution runs [$ price] — so the question is whether eliminating that problem is worth the investment."
|
||||
|
||||
**Proof point:** ROI calculator or case study showing payback period.
|
||||
|
||||
**Follow-up question:** "If the ROI was clear, is this something you'd prioritize this quarter?"
|
||||
|
||||
---
|
||||
|
||||
#### "We don't have budget for this"
|
||||
|
||||
**Why they say it:** Budget may genuinely be allocated. Or they haven't identified budget because priority isn't established.
|
||||
|
||||
**Response approach:**
|
||||
1. Validate — budget constraints are real
|
||||
2. Understand timing — when does budget cycle reset?
|
||||
3. Explore alternatives — pilot, smaller scope, different budget line
|
||||
4. Help them build the business case to create budget
|
||||
|
||||
**Talk track:**
|
||||
> "Totally understand. Two questions: When does your next budget cycle open? And — if we could show clear ROI with a limited pilot, is that something you could fund from a different line item? Sometimes teams fund this from the efficiency savings it creates."
|
||||
|
||||
**Proof point:** Customer who started with a small pilot and expanded after proving ROI.
|
||||
|
||||
**Follow-up question:** "Would it help if I put together an ROI brief you could share with your finance team?"
|
||||
|
||||
---
|
||||
|
||||
#### "Competitor X is cheaper"
|
||||
|
||||
**Why they say it:** They're comparing prices, possibly without comparing capabilities. May be using competitor price as leverage.
|
||||
|
||||
**Response approach:**
|
||||
1. Acknowledge the price difference — don't pretend it doesn't exist
|
||||
2. Shift to total cost of ownership and value delivered
|
||||
3. Highlight what they lose at the lower price point
|
||||
4. Share proof from customers who evaluated both
|
||||
|
||||
**Talk track:**
|
||||
> "You're right, [Competitor] is less expensive. Here's what I've seen from teams who evaluated both: [Competitor] works well for [their strength]. Where it falls short is [specific gap]. Customers like [name] actually switched to us after starting with [Competitor] because [specific reason]. The question is whether [specific capability] is worth the difference for your team."
|
||||
|
||||
**Proof point:** Customer who switched from the competitor, with specific reasons.
|
||||
|
||||
**Follow-up question:** "What's most important to your team — the lowest price or the best fit for [their specific need]?"
|
||||
|
||||
---
|
||||
|
||||
### Timing Objections
|
||||
|
||||
#### "Not the right time"
|
||||
|
||||
**Why they say it:** Competing priorities, organizational change, genuine capacity constraint, or lack of urgency.
|
||||
|
||||
**Response approach:**
|
||||
1. Understand what's competing for their attention
|
||||
2. Quantify the cost of waiting
|
||||
3. Explore low-commitment next steps that keep momentum
|
||||
4. Set a concrete follow-up date
|
||||
|
||||
**Talk track:**
|
||||
> "I get it — timing matters. Can I ask what's taking priority right now? The reason I bring up timing is that every month of [problem], based on our earlier conversation, costs your team roughly [$ amount]. A 3-month delay is [$ amount]. What if we mapped out a start date that works with your calendar so you're not losing that value?"
|
||||
|
||||
**Proof point:** Cost-of-delay calculation based on their specific numbers.
|
||||
|
||||
**Follow-up question:** "What would need to change for this to move up in priority?"
|
||||
|
||||
---
|
||||
|
||||
#### "Maybe next quarter"
|
||||
|
||||
**Why they say it:** Genuine scheduling, or a polite way of saying "not interested enough right now."
|
||||
|
||||
**Response approach:**
|
||||
1. Accept the timeline gracefully
|
||||
2. Propose a small action now that maintains momentum
|
||||
3. Get a specific date for follow-up
|
||||
4. Send value in the meantime (content, benchmarks, insights)
|
||||
|
||||
**Talk track:**
|
||||
> "Next quarter works. To make sure we hit the ground running, would it make sense to do [small next step] now? That way when Q[X] starts, you're not starting from scratch. I'll also send over [relevant content] in the meantime. Can we lock in [specific date] to reconnect?"
|
||||
|
||||
**Proof point:** Customer who started the evaluation process early and was live by their target date.
|
||||
|
||||
**Follow-up question:** "Is there anything I can send between now and then that would be helpful?"
|
||||
|
||||
---
|
||||
|
||||
### Competition Objections
|
||||
|
||||
#### "We already use X"
|
||||
|
||||
**Why they say it:** They have an existing solution and switching has real costs. May be satisfied, or may have frustrations they haven't voiced.
|
||||
|
||||
**Response approach:**
|
||||
1. Don't trash the competitor — ask how it's working
|
||||
2. Probe for specific pain points with their current solution
|
||||
3. Position as complementary if possible, replacement if not
|
||||
4. Offer a side-by-side comparison or trial
|
||||
|
||||
**Talk track:**
|
||||
> "How's that working for you? Specifically, when it comes to [area where you're stronger] — is that meeting your needs? The reason I ask is that most teams who come to us from [Competitor] tell us [specific pain point] was the tipping point. Not saying that's you, but worth exploring."
|
||||
|
||||
**Proof point:** Customer who switched from that specific competitor.
|
||||
|
||||
**Follow-up question:** "If you could change one thing about your current setup, what would it be?"
|
||||
|
||||
---
|
||||
|
||||
#### "What makes you different?"
|
||||
|
||||
**Why they say it:** They're evaluating options and want a clear differentiator. Sometimes a genuine question, sometimes a test.
|
||||
|
||||
**Response approach:**
|
||||
1. Don't list features — give the one thing that matters most for their situation
|
||||
2. Tie the differentiator to their specific pain
|
||||
3. Back it up with proof
|
||||
4. Offer to show, not just tell
|
||||
|
||||
**Talk track:**
|
||||
> "For teams like yours — [their industry/size/use case] — the biggest difference is [specific differentiator]. That matters because [connection to their pain]. For example, [Customer] was evaluating us alongside [Competitor] and chose us because [specific reason]. Want me to walk you through how that works?"
|
||||
|
||||
**Proof point:** Case study of a customer who chose you over alternatives.
|
||||
|
||||
**Follow-up question:** "What's the most important criteria for your decision?"
|
||||
|
||||
---
|
||||
|
||||
### Authority Objections
|
||||
|
||||
#### "I need to check with my boss"
|
||||
|
||||
**Why they say it:** They may not be the decision maker, or they need internal buy-in to proceed. Could also be a stall tactic.
|
||||
|
||||
**Response approach:**
|
||||
1. Support them, don't pressure them
|
||||
2. Arm them with materials to sell internally
|
||||
3. Offer to join a meeting with their boss
|
||||
4. Understand what their boss cares about
|
||||
|
||||
**Talk track:**
|
||||
> "Absolutely — what would help you make the case? I can put together a one-pager that covers the ROI and addresses the concerns your boss is likely to have. Also happy to jump on a quick call with them if that would be helpful. What does your boss typically prioritize — cost savings, risk reduction, or efficiency?"
|
||||
|
||||
**Proof point:** Champion enablement one-pager, ROI calculator.
|
||||
|
||||
**Follow-up question:** "What questions do you think your boss will ask?"
|
||||
|
||||
---
|
||||
|
||||
#### "A committee decides this"
|
||||
|
||||
**Why they say it:** Enterprise buying involves multiple stakeholders. Genuine process, not a brush-off.
|
||||
|
||||
**Response approach:**
|
||||
1. Map the buying committee — who's involved and what each person cares about
|
||||
2. Provide persona-specific materials
|
||||
3. Offer to present to the committee
|
||||
4. Help your champion navigate the internal process
|
||||
|
||||
**Talk track:**
|
||||
> "That makes sense. Can you walk me through who's on the committee and what each person cares about? I can tailor materials for each stakeholder so you're not doing all the heavy lifting. I've also got a deck designed for executive presentations if that would be useful."
|
||||
|
||||
**Proof point:** Multi-stakeholder case study showing how different personas were addressed.
|
||||
|
||||
**Follow-up question:** "Who on the committee is most likely to push back, and what would their concern be?"
|
||||
|
||||
---
|
||||
|
||||
### Status Quo Objections
|
||||
|
||||
#### "What we have works fine"
|
||||
|
||||
**Why they say it:** Inertia is real. The current solution may be adequate, and change has real costs.
|
||||
|
||||
**Response approach:**
|
||||
1. Agree — don't argue with their experience
|
||||
2. Shift from "broken vs. fixed" to "good vs. great"
|
||||
3. Introduce the concept of opportunity cost
|
||||
4. Show what peers are achieving
|
||||
|
||||
**Talk track:**
|
||||
> "It probably does work — and I wouldn't suggest changing something that's truly meeting your needs. The question I'd ask is: is 'works fine' the bar? Teams using [your product] are seeing [specific outcome]. If you're leaving [X% improvement] on the table, is that worth exploring?"
|
||||
|
||||
**Proof point:** Benchmark data showing what's possible vs. status quo.
|
||||
|
||||
**Follow-up question:** "If there were one area where your current approach could be better, what would it be?"
|
||||
|
||||
---
|
||||
|
||||
### Technical Objections
|
||||
|
||||
#### "Does it integrate with X?"
|
||||
|
||||
**Why they say it:** Integration is a real requirement. They need to know your product fits their stack.
|
||||
|
||||
**Response approach:**
|
||||
1. Answer directly — yes, no, or "let me check"
|
||||
2. If yes, provide specifics (native, API, Zapier, etc.)
|
||||
3. If no, explain alternatives or workarounds
|
||||
4. Never bluff — they'll find out during evaluation
|
||||
|
||||
**Talk track (if yes):**
|
||||
> "Yes, we integrate with [X] natively. It takes about [time] to set up. [Customer] runs the same stack and here's how they have it configured."
|
||||
|
||||
**Talk track (if no):**
|
||||
> "We don't have a native integration with [X] today. Here's what customers typically do: [alternative]. We also have an open API that [description]. Would it help to get our technical team on a call to explore options?"
|
||||
|
||||
**Proof point:** Customer using the same tech stack, integration documentation.
|
||||
|
||||
**Follow-up question:** "What other tools are in your stack that we'd need to work with?"
|
||||
|
||||
---
|
||||
|
||||
#### "We have security concerns"
|
||||
|
||||
**Why they say it:** Legitimate concern, especially in regulated industries or enterprise. Non-negotiable for many buyers.
|
||||
|
||||
**Response approach:**
|
||||
1. Take it seriously — never dismiss security concerns
|
||||
2. Provide documentation proactively (SOC 2, security whitepaper)
|
||||
3. Offer to loop in your security team
|
||||
4. Ask about their specific requirements
|
||||
|
||||
**Talk track:**
|
||||
> "That's exactly the right question to ask. Here's our security overview — we're [SOC 2 Type II / ISO 27001 / etc.] certified, and I can share our full security documentation. We also have a security team that's happy to do a review call with your infosec team. What are your specific requirements?"
|
||||
|
||||
**Proof point:** Security certifications, compliance documentation, customers in regulated industries.
|
||||
|
||||
**Follow-up question:** "Do you have a security questionnaire you'd like us to fill out?"
|
||||
@@ -0,0 +1,208 @@
|
||||
# One-Pager Templates
|
||||
|
||||
Templates for different one-pager use cases, with layout guidance and copy prompts.
|
||||
|
||||
## Product Overview One-Pager
|
||||
|
||||
The default one-pager. Introduces your product to someone who knows nothing about you.
|
||||
|
||||
### Structure
|
||||
|
||||
```
|
||||
[Logo] [Tagline]
|
||||
|
||||
HEADLINE: One sentence describing what you do and who it's for.
|
||||
|
||||
THE PROBLEM
|
||||
2-3 sentences describing the pain your buyer faces.
|
||||
|
||||
THE SOLUTION
|
||||
2-3 sentences describing how your product solves it.
|
||||
|
||||
WHY [YOUR PRODUCT]
|
||||
• Differentiator 1 — One sentence explaining the benefit
|
||||
• Differentiator 2 — One sentence explaining the benefit
|
||||
• Differentiator 3 — One sentence explaining the benefit
|
||||
|
||||
PROOF
|
||||
"Customer quote with specific result." — Name, Title, Company
|
||||
[Optional: 2-3 metric callouts: "X% improvement", "Y hours saved"]
|
||||
|
||||
[CTA Button/Link] [Contact: name@company.com]
|
||||
```
|
||||
|
||||
### Copy Prompts
|
||||
|
||||
- Headline: "What do you do, in one sentence, that makes someone say 'tell me more'?"
|
||||
- Problem: "What is your buyer struggling with before they find you?"
|
||||
- Differentiators: "If you could only tell them 3 things, what would make them choose you?"
|
||||
|
||||
---
|
||||
|
||||
## Use-Case Specific One-Pager
|
||||
|
||||
Tailored to a specific workflow, vertical, or problem. More targeted than the product overview.
|
||||
|
||||
### Structure
|
||||
|
||||
```
|
||||
[Logo] [Use Case: e.g., "For Sales Teams"]
|
||||
|
||||
HEADLINE: How [your product] helps [persona] [achieve outcome].
|
||||
|
||||
THE CHALLENGE
|
||||
When [persona] needs to [task], they face [specific pain].
|
||||
This leads to [consequence]: [time wasted / money lost / risk].
|
||||
|
||||
HOW IT WORKS
|
||||
1. [Step 1] — What happens and why it matters
|
||||
2. [Step 2] — What happens and why it matters
|
||||
3. [Step 3] — What happens and why it matters
|
||||
|
||||
RESULTS
|
||||
• [Metric 1]: Before → After
|
||||
• [Metric 2]: Before → After
|
||||
• [Metric 3]: Before → After
|
||||
|
||||
CUSTOMER SPOTLIGHT
|
||||
"Quote about this specific use case." — Name, Title, Company
|
||||
|
||||
[CTA: "See it in action" or "Start a pilot"] [Contact info]
|
||||
```
|
||||
|
||||
### When to Use
|
||||
|
||||
- Different buyer personas need different one-pagers
|
||||
- Industry-specific versions (healthcare, fintech, e-commerce)
|
||||
- Use-case versions (reporting, onboarding, security)
|
||||
|
||||
---
|
||||
|
||||
## Post-Meeting Leave-Behind
|
||||
|
||||
Designed to reinforce a conversation that already happened. Summarizes what you discussed and proposes next steps.
|
||||
|
||||
### Structure
|
||||
|
||||
```
|
||||
[Logo] [Date of Meeting]
|
||||
|
||||
MEETING RECAP: [Company Name]
|
||||
|
||||
WHAT WE DISCUSSED
|
||||
• [Pain point 1 they mentioned]
|
||||
• [Pain point 2 they mentioned]
|
||||
• [Goal they're trying to achieve]
|
||||
|
||||
HOW [YOUR PRODUCT] HELPS
|
||||
• [Solution to pain 1] — [Specific capability or workflow]
|
||||
• [Solution to pain 2] — [Specific capability or workflow]
|
||||
• [How you help them reach their goal]
|
||||
|
||||
RELEVANT PROOF
|
||||
"Quote from a similar customer." — Name, Title, Company
|
||||
[1-2 metrics from a similar customer]
|
||||
|
||||
PROPOSED NEXT STEPS
|
||||
1. [Next step with date]
|
||||
2. [Follow-up action]
|
||||
3. [Decision timeline]
|
||||
|
||||
[Your name] | [Your title] | [Email] | [Phone]
|
||||
```
|
||||
|
||||
### Tips
|
||||
|
||||
- Send within 24 hours of the meeting
|
||||
- Reference specific things they said (shows you listened)
|
||||
- Keep proposed next steps concrete and time-bound
|
||||
- This is the asset your champion forwards to their boss
|
||||
|
||||
---
|
||||
|
||||
## Champion Enablement One-Pager
|
||||
|
||||
Designed specifically for your internal champion to share with their team and leadership. Written to make them look smart.
|
||||
|
||||
### Structure
|
||||
|
||||
```
|
||||
[Logo]
|
||||
|
||||
WHY WE'RE EVALUATING [YOUR PRODUCT]
|
||||
|
||||
THE SITUATION
|
||||
[2-3 sentences about the internal challenge, written as if the champion
|
||||
is explaining it to their team. Use "we" and "our" language.]
|
||||
|
||||
WHAT [YOUR PRODUCT] DOES
|
||||
[1-2 sentences. Plain language, no jargon.]
|
||||
|
||||
WHY THIS SOLUTION
|
||||
• [Reason 1] — How it solves our specific problem
|
||||
• [Reason 2] — How it compares to what we do today
|
||||
• [Reason 3] — How it compares to alternatives we evaluated
|
||||
|
||||
EXPECTED IMPACT
|
||||
• [Metric]: Current state → Expected state
|
||||
• [Metric]: Current state → Expected state
|
||||
• [Time to value]: Live within [X weeks]
|
||||
|
||||
WHO ELSE USES IT
|
||||
[2-3 recognizable company names in their industry]
|
||||
"Relevant customer quote." — Name, Title, Company
|
||||
|
||||
NEXT STEPS
|
||||
• [What we're doing next]
|
||||
• [What we need from the team]
|
||||
• [Decision timeline]
|
||||
|
||||
Questions? Talk to [Champion name] or [Your name at email].
|
||||
```
|
||||
|
||||
### Why This Works
|
||||
|
||||
- Written in the champion's voice, not yours
|
||||
- Answers the questions their boss will ask
|
||||
- Includes peer proof from companies they respect
|
||||
- Clear ask and timeline to drive internal momentum
|
||||
|
||||
---
|
||||
|
||||
## Layout Guidance
|
||||
|
||||
### Visual Hierarchy
|
||||
|
||||
1. **Headline** — Largest text, top of page, immediately communicates value
|
||||
2. **Section headers** — Bold, clear, act as scannable anchors
|
||||
3. **Body text** — Short sentences, bullet points preferred over paragraphs
|
||||
4. **Proof elements** — Metrics and quotes should visually stand out (larger font, color, or callout box)
|
||||
5. **CTA** — Prominent placement, bottom of page or bottom-right
|
||||
|
||||
### Whitespace
|
||||
|
||||
- Margins: at least 0.75" on all sides
|
||||
- Space between sections: enough to visually separate (don't cram)
|
||||
- If it feels crowded, cut content. Never shrink font below 9pt.
|
||||
|
||||
### Font Sizing
|
||||
|
||||
| Element | Suggested Size |
|
||||
|---------|---------------|
|
||||
| Headline | 18-24pt |
|
||||
| Section headers | 12-14pt bold |
|
||||
| Body text | 10-11pt |
|
||||
| Fine print / footer | 8-9pt |
|
||||
|
||||
### Color
|
||||
|
||||
- Use brand colors for headers and accents
|
||||
- Keep body text dark (black or near-black) on white
|
||||
- Limit accent colors to 1-2 for visual consistency
|
||||
- Use color to draw attention to metrics and CTAs
|
||||
|
||||
### File Format
|
||||
|
||||
- **PDF** for email attachments and leave-behinds
|
||||
- **Google Slides / PowerPoint** for editable versions reps can customize
|
||||
- Always include both — reps will customize, prospects want clean PDFs
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: schema-markup
|
||||
version: 1.0.0
|
||||
description: When the user wants to add, fix, or optimize schema markup and structured data on their site. Also use when the user mentions "schema markup," "structured data," "JSON-LD," "rich snippets," "schema.org," "FAQ schema," "product schema," "review schema," or "breadcrumb schema." For broader SEO issues, see seo-audit.
|
||||
description: When the user wants to add, fix, or optimize schema markup and structured data on their site. Also use when the user mentions "schema markup," "structured data," "JSON-LD," "rich snippets," "schema.org," "FAQ schema," "product schema," "review schema," "breadcrumb schema," "Google rich results," "knowledge panel," "star ratings in search," or "add structured data." Use this whenever someone wants their pages to show enhanced results in Google. For broader SEO issues, see seo-audit. For AI search optimization, see ai-seo.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Schema Markup
|
||||
@@ -11,7 +12,7 @@ You are an expert in structured data and schema markup. Your goal is to implemen
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before implementing schema, understand:
|
||||
|
||||
@@ -173,4 +174,6 @@ You can combine multiple schema types on one page using `@graph`:
|
||||
## Related Skills
|
||||
|
||||
- **seo-audit**: For overall SEO including schema review
|
||||
- **ai-seo**: For AI search optimization (schema helps AI understand content)
|
||||
- **programmatic-seo**: For templated schema at scale
|
||||
- **site-architecture**: For breadcrumb structure and navigation schema planning
|
||||
|
||||
@@ -2,6 +2,20 @@
|
||||
|
||||
Complete JSON-LD examples for common schema types.
|
||||
|
||||
## Contents
|
||||
- Organization
|
||||
- WebSite (with SearchAction)
|
||||
- Article / BlogPosting
|
||||
- Product
|
||||
- SoftwareApplication
|
||||
- FAQPage
|
||||
- HowTo
|
||||
- BreadcrumbList
|
||||
- LocalBusiness
|
||||
- Event
|
||||
- Multiple Schema Types
|
||||
- Implementation Example (Next.js)
|
||||
|
||||
## Organization
|
||||
|
||||
For company/brand homepage or about page.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: seo-audit
|
||||
version: 1.0.0
|
||||
description: When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO audit," "technical SEO," "why am I not ranking," "SEO issues," "on-page SEO," "meta tags review," or "SEO health check." For building pages at scale to target keywords, see programmatic-seo. For adding structured data, see schema-markup.
|
||||
description: When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO audit," "technical SEO," "why am I not ranking," "SEO issues," "on-page SEO," "meta tags review," "SEO health check," "my traffic dropped," "lost rankings," "not showing up in Google," "site isn't ranking," "Google update hit me," "page speed," "core web vitals," "crawl errors," or "indexing issues." Use this even if the user just says something vague like "my SEO is bad" or "help with SEO" — start with an audit. For building pages at scale to target keywords, see programmatic-seo. For adding structured data, see schema-markup. For AI search optimization, see ai-seo.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# SEO Audit
|
||||
@@ -11,7 +12,7 @@ You are an expert in search engine optimization. Your goal is to identify SEO is
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before auditing, understand:
|
||||
|
||||
@@ -34,6 +35,19 @@ Before auditing, understand:
|
||||
|
||||
## Audit Framework
|
||||
|
||||
### ⚠️ Important: Schema Markup Detection Limitation
|
||||
|
||||
**`web_fetch` and `curl` cannot reliably detect structured data / schema markup.**
|
||||
|
||||
Many CMS plugins (AIOSEO, Yoast, RankMath) inject JSON-LD via client-side JavaScript — it won't appear in static HTML or `web_fetch` output (which strips `<script>` tags during conversion).
|
||||
|
||||
**To accurately check for schema markup, use one of these methods:**
|
||||
1. **Browser tool** — render the page and run: `document.querySelectorAll('script[type="application/ld+json"]')`
|
||||
2. **Google Rich Results Test** — https://search.google.com/test/rich-results
|
||||
3. **Screaming Frog export** — if the client provides one, use it (SF renders JavaScript)
|
||||
|
||||
**Never report "no schema found" based solely on `web_fetch` or `curl`.** This has led to false audit findings in production.
|
||||
|
||||
### Priority Order
|
||||
1. **Crawlability & Indexation** (can Google find and index it?)
|
||||
2. **Technical Foundations** (is the site fast and functional?)
|
||||
@@ -354,7 +368,7 @@ Same format as above
|
||||
## References
|
||||
|
||||
- [AI Writing Detection](references/ai-writing-detection.md): Common AI writing patterns to avoid (em dashes, overused phrases, filler words)
|
||||
- [AEO & GEO Patterns](references/aeo-geo-patterns.md): Content patterns optimized for answer engines and AI citation
|
||||
- For AI search optimization (AEO, GEO, LLMO, AI Overviews), see the **ai-seo** skill
|
||||
|
||||
---
|
||||
|
||||
@@ -364,10 +378,12 @@ Same format as above
|
||||
- Google Search Console (essential)
|
||||
- Google PageSpeed Insights
|
||||
- Bing Webmaster Tools
|
||||
- Rich Results Test
|
||||
- Rich Results Test (**use this for schema validation — it renders JavaScript**)
|
||||
- Mobile-Friendly Test
|
||||
- Schema Validator
|
||||
|
||||
> **Note on schema detection:** `web_fetch` strips `<script>` tags (including JSON-LD) and cannot detect JS-injected schema. Always use the browser tool, Rich Results Test, or Screaming Frog for schema checks. See the warning at the top of the Audit Framework section.
|
||||
|
||||
**Paid Tools** (if available)
|
||||
- Screaming Frog
|
||||
- Ahrefs / Semrush
|
||||
@@ -388,7 +404,9 @@ Same format as above
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **ai-seo**: For optimizing content for AI search engines (AEO, GEO, LLMO)
|
||||
- **programmatic-seo**: For building SEO pages at scale
|
||||
- **site-architecture**: For page hierarchy, navigation design, and URL structure
|
||||
- **schema-markup**: For implementing structured data
|
||||
- **page-cro**: For optimizing pages for conversion (not just ranking)
|
||||
- **analytics-tracking**: For measuring SEO performance
|
||||
|
||||
@@ -6,6 +6,16 @@ Sources: Grammarly (2025), Microsoft 365 Life Hacks (2025), GPTHuman (2025), Wal
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- Em Dashes: The Primary AI Tell
|
||||
- Overused Verbs
|
||||
- Overused Adjectives
|
||||
- Overused Transitions and Connectors
|
||||
- Phrases That Signal AI Writing (Opening Phrases, Transitional Phrases, Concluding Phrases, Structural Patterns)
|
||||
- Filler Words and Empty Intensifiers
|
||||
- Academic-Specific AI Tells
|
||||
- How to Self-Check
|
||||
|
||||
## Em Dashes: The Primary AI Tell
|
||||
|
||||
**The em dash (—) has become one of the most reliable markers of AI-generated content.**
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: signup-flow-cro
|
||||
version: 1.0.0
|
||||
description: When the user wants to optimize signup, registration, account creation, or trial activation flows. Also use when the user mentions "signup conversions," "registration friction," "signup form optimization," "free trial signup," "reduce signup dropoff," or "account creation flow." For post-signup onboarding, see onboarding-cro. For lead capture forms (not account creation), see form-cro.
|
||||
description: When the user wants to optimize signup, registration, account creation, or trial activation flows. Also use when the user mentions "signup conversions," "registration friction," "signup form optimization," "free trial signup," "reduce signup dropoff," "account creation flow," "people aren't signing up," "signup abandonment," "trial conversion rate," "nobody completes registration," "too many steps to sign up," or "simplify our signup." Use this whenever the user has a signup or registration flow that isn't performing. For post-signup onboarding, see onboarding-cro. For lead capture forms (not account creation), see form-cro.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Signup Flow CRO
|
||||
@@ -11,7 +12,7 @@ You are an expert in optimizing signup and registration flows. Your goal is to r
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before providing recommendations, understand:
|
||||
|
||||
|
||||
@@ -0,0 +1,357 @@
|
||||
---
|
||||
name: site-architecture
|
||||
description: When the user wants to plan, map, or restructure their website's page hierarchy, navigation, URL structure, or internal linking. Also use when the user mentions "sitemap," "site map," "visual sitemap," "site structure," "page hierarchy," "information architecture," "IA," "navigation design," "URL structure," "breadcrumbs," "internal linking strategy," "website planning," "what pages do I need," "how should I organize my site," or "site navigation." Use this whenever someone is planning what pages a website should have and how they connect. NOT for XML sitemaps (that's technical SEO — see seo-audit). For SEO audits, see seo-audit. For structured data, see schema-markup.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Site Architecture
|
||||
|
||||
You are an information architecture expert. Your goal is to help plan website structure — page hierarchy, navigation, URL patterns, and internal linking — so the site is intuitive for users and optimized for search engines.
|
||||
|
||||
## Before Planning
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
### 1. Business Context
|
||||
- What does the company do?
|
||||
- Who are the primary audiences?
|
||||
- What are the top 3 goals for the site? (conversions, SEO traffic, education, support)
|
||||
|
||||
### 2. Current State
|
||||
- New site or restructuring an existing one?
|
||||
- If restructuring: what's broken? (high bounce, poor SEO, users can't find things)
|
||||
- Existing URLs that must be preserved (for redirects)?
|
||||
|
||||
### 3. Site Type
|
||||
- SaaS marketing site
|
||||
- Content/blog site
|
||||
- E-commerce
|
||||
- Documentation
|
||||
- Hybrid (SaaS + content)
|
||||
- Small business / local
|
||||
|
||||
### 4. Content Inventory
|
||||
- How many pages exist or are planned?
|
||||
- What are the most important pages? (by traffic, conversions, or business value)
|
||||
- Any planned sections or expansions?
|
||||
|
||||
---
|
||||
|
||||
## Site Types and Starting Points
|
||||
|
||||
| Site Type | Typical Depth | Key Sections | URL Pattern |
|
||||
|-----------|--------------|--------------|-------------|
|
||||
| SaaS marketing | 2-3 levels | Home, Features, Pricing, Blog, Docs | `/features/name`, `/blog/slug` |
|
||||
| Content/blog | 2-3 levels | Home, Blog, Categories, About | `/blog/slug`, `/category/slug` |
|
||||
| E-commerce | 3-4 levels | Home, Categories, Products, Cart | `/category/subcategory/product` |
|
||||
| Documentation | 3-4 levels | Home, Guides, API Reference | `/docs/section/page` |
|
||||
| Hybrid SaaS+content | 3-4 levels | Home, Product, Blog, Resources, Docs | `/product/feature`, `/blog/slug` |
|
||||
| Small business | 1-2 levels | Home, Services, About, Contact | `/services/name` |
|
||||
|
||||
**For full page hierarchy templates**: See [references/site-type-templates.md](references/site-type-templates.md)
|
||||
|
||||
---
|
||||
|
||||
## Page Hierarchy Design
|
||||
|
||||
### The 3-Click Rule
|
||||
|
||||
Users should reach any important page within 3 clicks from the homepage. This isn't absolute, but if critical pages are buried 4+ levels deep, something is wrong.
|
||||
|
||||
### Flat vs Deep
|
||||
|
||||
| Approach | Best For | Tradeoff |
|
||||
|----------|----------|----------|
|
||||
| Flat (2 levels) | Small sites, portfolios | Simple but doesn't scale |
|
||||
| Moderate (3 levels) | Most SaaS, content sites | Good balance of depth and findability |
|
||||
| Deep (4+ levels) | E-commerce, large docs | Scales but risks burying content |
|
||||
|
||||
**Rule of thumb**: Go as flat as possible while keeping navigation clean. If a nav dropdown has 20+ items, add a level of hierarchy.
|
||||
|
||||
### Hierarchy Levels
|
||||
|
||||
| Level | What It Is | Example |
|
||||
|-------|-----------|---------|
|
||||
| L0 | Homepage | `/` |
|
||||
| L1 | Primary sections | `/features`, `/blog`, `/pricing` |
|
||||
| L2 | Section pages | `/features/analytics`, `/blog/seo-guide` |
|
||||
| L3+ | Detail pages | `/docs/api/authentication` |
|
||||
|
||||
### ASCII Tree Format
|
||||
|
||||
Use this format for page hierarchies:
|
||||
|
||||
```
|
||||
Homepage (/)
|
||||
├── Features (/features)
|
||||
│ ├── Analytics (/features/analytics)
|
||||
│ ├── Automation (/features/automation)
|
||||
│ └── Integrations (/features/integrations)
|
||||
├── Pricing (/pricing)
|
||||
├── Blog (/blog)
|
||||
│ ├── [Category: SEO] (/blog/category/seo)
|
||||
│ └── [Category: CRO] (/blog/category/cro)
|
||||
├── Resources (/resources)
|
||||
│ ├── Case Studies (/resources/case-studies)
|
||||
│ └── Templates (/resources/templates)
|
||||
├── Docs (/docs)
|
||||
│ ├── Getting Started (/docs/getting-started)
|
||||
│ └── API Reference (/docs/api)
|
||||
├── About (/about)
|
||||
│ └── Careers (/about/careers)
|
||||
└── Contact (/contact)
|
||||
```
|
||||
|
||||
**When to use ASCII vs Mermaid**:
|
||||
- ASCII: quick hierarchy drafts, text-only contexts, simple structures
|
||||
- Mermaid: visual presentations, complex relationships, showing nav zones or linking patterns
|
||||
|
||||
---
|
||||
|
||||
## Navigation Design
|
||||
|
||||
### Navigation Types
|
||||
|
||||
| Nav Type | Purpose | Placement |
|
||||
|----------|---------|-----------|
|
||||
| Header nav | Primary navigation, always visible | Top of every page |
|
||||
| Dropdown menus | Organize sub-pages under parent | Expands from header items |
|
||||
| Footer nav | Secondary links, legal, sitemap | Bottom of every page |
|
||||
| Sidebar nav | Section navigation (docs, blog) | Left side within a section |
|
||||
| Breadcrumbs | Show current location in hierarchy | Below header, above content |
|
||||
| Contextual links | Related content, next steps | Within page content |
|
||||
|
||||
### Header Navigation Rules
|
||||
|
||||
- **4-7 items max** in the primary nav (more causes decision paralysis)
|
||||
- **CTA button** goes rightmost (e.g., "Start Free Trial," "Get Started")
|
||||
- **Logo** links to homepage (left side)
|
||||
- **Order by priority**: most important/visited pages first
|
||||
- If you have a mega menu, limit to 3-4 columns
|
||||
|
||||
### Footer Organization
|
||||
|
||||
Group footer links into columns:
|
||||
- **Product**: Features, Pricing, Integrations, Changelog
|
||||
- **Resources**: Blog, Case Studies, Templates, Docs
|
||||
- **Company**: About, Careers, Contact, Press
|
||||
- **Legal**: Privacy, Terms, Security
|
||||
|
||||
### Breadcrumb Format
|
||||
|
||||
```
|
||||
Home > Features > Analytics
|
||||
Home > Blog > SEO Category > Post Title
|
||||
```
|
||||
|
||||
Breadcrumbs should mirror the URL hierarchy. Every breadcrumb segment should be a clickable link except the current page.
|
||||
|
||||
**For detailed navigation patterns**: See [references/navigation-patterns.md](references/navigation-patterns.md)
|
||||
|
||||
---
|
||||
|
||||
## URL Structure
|
||||
|
||||
### Design Principles
|
||||
|
||||
1. **Readable by humans** — `/features/analytics` not `/f/a123`
|
||||
2. **Hyphens, not underscores** — `/blog/seo-guide` not `/blog/seo_guide`
|
||||
3. **Reflect the hierarchy** — URL path should match site structure
|
||||
4. **Consistent trailing slash policy** — pick one (with or without) and enforce it
|
||||
5. **Lowercase always** — `/About` should redirect to `/about`
|
||||
6. **Short but descriptive** — `/blog/how-to-improve-landing-page-conversion-rates` is too long; `/blog/landing-page-conversions` is better
|
||||
|
||||
### URL Patterns by Page Type
|
||||
|
||||
| Page Type | Pattern | Example |
|
||||
|-----------|---------|---------|
|
||||
| Homepage | `/` | `example.com` |
|
||||
| Feature page | `/features/{name}` | `/features/analytics` |
|
||||
| Pricing | `/pricing` | `/pricing` |
|
||||
| Blog post | `/blog/{slug}` | `/blog/seo-guide` |
|
||||
| Blog category | `/blog/category/{slug}` | `/blog/category/seo` |
|
||||
| Case study | `/customers/{slug}` | `/customers/acme-corp` |
|
||||
| Documentation | `/docs/{section}/{page}` | `/docs/api/authentication` |
|
||||
| Legal | `/{page}` | `/privacy`, `/terms` |
|
||||
| Landing page | `/{slug}` or `/lp/{slug}` | `/free-trial`, `/lp/webinar` |
|
||||
| Comparison | `/compare/{competitor}` or `/vs/{competitor}` | `/compare/competitor-name` |
|
||||
| Integration | `/integrations/{name}` | `/integrations/slack` |
|
||||
| Template | `/templates/{slug}` | `/templates/marketing-plan` |
|
||||
|
||||
### Common Mistakes
|
||||
|
||||
- **Dates in blog URLs** — `/blog/2024/01/15/post-title` adds no value and makes URLs long. Use `/blog/post-title`.
|
||||
- **Over-nesting** — `/products/category/subcategory/item/detail` is too deep. Flatten where possible.
|
||||
- **Changing URLs without redirects** — Every old URL must 301 redirect to its new URL. No exceptions.
|
||||
- **IDs in URLs** — `/product/12345` is not human-readable. Use slugs.
|
||||
- **Query parameters for content** — `/blog?id=123` should be `/blog/post-title`.
|
||||
- **Inconsistent patterns** — Don't mix `/features/analytics` and `/product/automation`. Pick one parent.
|
||||
|
||||
### Breadcrumb-URL Alignment
|
||||
|
||||
The breadcrumb trail should mirror the URL path:
|
||||
|
||||
| URL | Breadcrumb |
|
||||
|-----|-----------|
|
||||
| `/features/analytics` | Home > Features > Analytics |
|
||||
| `/blog/seo-guide` | Home > Blog > SEO Guide |
|
||||
| `/docs/api/auth` | Home > Docs > API > Authentication |
|
||||
|
||||
---
|
||||
|
||||
## Visual Sitemap Output (Mermaid)
|
||||
|
||||
Use Mermaid `graph TD` for visual sitemaps. This makes hierarchy relationships clear and can annotate navigation zones.
|
||||
|
||||
### Basic Hierarchy
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
HOME[Homepage] --> FEAT[Features]
|
||||
HOME --> PRICE[Pricing]
|
||||
HOME --> BLOG[Blog]
|
||||
HOME --> ABOUT[About]
|
||||
|
||||
FEAT --> F1[Analytics]
|
||||
FEAT --> F2[Automation]
|
||||
FEAT --> F3[Integrations]
|
||||
|
||||
BLOG --> B1[Post 1]
|
||||
BLOG --> B2[Post 2]
|
||||
```
|
||||
|
||||
### With Navigation Zones
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph Header Nav
|
||||
HOME[Homepage]
|
||||
FEAT[Features]
|
||||
PRICE[Pricing]
|
||||
BLOG[Blog]
|
||||
CTA[Get Started]
|
||||
end
|
||||
|
||||
subgraph Footer Nav
|
||||
ABOUT[About]
|
||||
CAREERS[Careers]
|
||||
CONTACT[Contact]
|
||||
PRIVACY[Privacy]
|
||||
end
|
||||
|
||||
HOME --> FEAT
|
||||
HOME --> PRICE
|
||||
HOME --> BLOG
|
||||
HOME --> ABOUT
|
||||
|
||||
FEAT --> F1[Analytics]
|
||||
FEAT --> F2[Automation]
|
||||
```
|
||||
|
||||
**For more Mermaid templates**: See [references/mermaid-templates.md](references/mermaid-templates.md)
|
||||
|
||||
---
|
||||
|
||||
## Internal Linking Strategy
|
||||
|
||||
### Link Types
|
||||
|
||||
| Type | Purpose | Example |
|
||||
|------|---------|---------|
|
||||
| Navigational | Move between sections | Header, footer, sidebar links |
|
||||
| Contextual | Related content within text | "Learn more about [analytics](/features/analytics)" |
|
||||
| Hub-and-spoke | Connect cluster content to hub | Blog posts linking to pillar page |
|
||||
| Cross-section | Connect related pages across sections | Feature page linking to related case study |
|
||||
|
||||
### Internal Linking Rules
|
||||
|
||||
1. **No orphan pages** — every page must have at least one internal link pointing to it
|
||||
2. **Descriptive anchor text** — "our analytics features" not "click here"
|
||||
3. **5-10 internal links per 1000 words** of content (approximate guideline)
|
||||
4. **Link to important pages more often** — homepage, key feature pages, pricing
|
||||
5. **Use breadcrumbs** — free internal links on every page
|
||||
6. **Related content sections** — "Related Posts" or "You might also like" at page bottom
|
||||
|
||||
### Hub-and-Spoke Model
|
||||
|
||||
For content-heavy sites, organize around hub pages:
|
||||
|
||||
```
|
||||
Hub: /blog/seo-guide (comprehensive overview)
|
||||
├── Spoke: /blog/keyword-research (links back to hub)
|
||||
├── Spoke: /blog/on-page-seo (links back to hub)
|
||||
├── Spoke: /blog/technical-seo (links back to hub)
|
||||
└── Spoke: /blog/link-building (links back to hub)
|
||||
```
|
||||
|
||||
Each spoke links back to the hub. The hub links to all spokes. Spokes link to each other where relevant.
|
||||
|
||||
### Link Audit Checklist
|
||||
|
||||
- [ ] Every page has at least one inbound internal link
|
||||
- [ ] No broken internal links (404s)
|
||||
- [ ] Anchor text is descriptive (not "click here" or "read more")
|
||||
- [ ] Important pages have the most inbound internal links
|
||||
- [ ] Breadcrumbs are implemented on all pages
|
||||
- [ ] Related content links exist on blog posts
|
||||
- [ ] Cross-section links connect features to case studies, blog to product pages
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
When creating a site architecture plan, provide these deliverables:
|
||||
|
||||
### 1. Page Hierarchy (ASCII Tree)
|
||||
Full site structure with URLs at each node. Use the ASCII tree format from the Page Hierarchy Design section.
|
||||
|
||||
### 2. Visual Sitemap (Mermaid)
|
||||
Mermaid diagram showing page relationships and navigation zones. Use `graph TD` with subgraphs for nav zones where helpful.
|
||||
|
||||
### 3. URL Map Table
|
||||
|
||||
| Page | URL | Parent | Nav Location | Priority |
|
||||
|------|-----|--------|-------------|----------|
|
||||
| Homepage | `/` | — | Header | High |
|
||||
| Features | `/features` | Homepage | Header | High |
|
||||
| Analytics | `/features/analytics` | Features | Header dropdown | Medium |
|
||||
| Pricing | `/pricing` | Homepage | Header | High |
|
||||
| Blog | `/blog` | Homepage | Header | Medium |
|
||||
|
||||
### 4. Navigation Spec
|
||||
- Header nav items (ordered, with CTA)
|
||||
- Footer sections and links
|
||||
- Sidebar nav (if applicable)
|
||||
- Breadcrumb implementation notes
|
||||
|
||||
### 5. Internal Linking Plan
|
||||
- Hub pages and their spokes
|
||||
- Cross-section link opportunities
|
||||
- Orphan page audit (if restructuring)
|
||||
- Recommended links per key page
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. Is this a new site or are you restructuring an existing one?
|
||||
2. What type of site is it? (SaaS, content, e-commerce, docs, hybrid, small business)
|
||||
3. How many pages exist or are planned?
|
||||
4. What are the 5 most important pages on the site?
|
||||
5. Are there existing URLs that need to be preserved or redirected?
|
||||
6. Who are the primary audiences, and what are they trying to accomplish on the site?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **content-strategy**: For planning what content to create and topic clusters
|
||||
- **programmatic-seo**: For building SEO pages at scale with templates and data
|
||||
- **seo-audit**: For technical SEO, on-page optimization, and indexation issues
|
||||
- **page-cro**: For optimizing individual pages for conversion
|
||||
- **schema-markup**: For implementing breadcrumb and site navigation structured data
|
||||
- **competitor-alternatives**: For comparison page frameworks and URL patterns
|
||||
@@ -0,0 +1,216 @@
|
||||
# Mermaid Diagram Templates
|
||||
|
||||
Copy-paste-ready Mermaid diagrams for visual sitemaps. Customize node labels and connections for your site.
|
||||
|
||||
---
|
||||
|
||||
## Basic Hierarchy
|
||||
|
||||
Simple top-down page hierarchy.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
HOME["Homepage<br/>/"] --> FEAT["Features<br/>/features"]
|
||||
HOME --> PRICE["Pricing<br/>/pricing"]
|
||||
HOME --> BLOG["Blog<br/>/blog"]
|
||||
HOME --> ABOUT["About<br/>/about"]
|
||||
|
||||
FEAT --> F1["Analytics<br/>/features/analytics"]
|
||||
FEAT --> F2["Automation<br/>/features/automation"]
|
||||
FEAT --> F3["Integrations<br/>/features/integrations"]
|
||||
|
||||
BLOG --> B1["Post: SEO Guide<br/>/blog/seo-guide"]
|
||||
BLOG --> B2["Post: CRO Tips<br/>/blog/cro-tips"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Hierarchy with Navigation Zones
|
||||
|
||||
Uses subgraphs to show which pages appear in which navigation area.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "Header Nav"
|
||||
HOME["Homepage"]
|
||||
FEAT["Features"]
|
||||
PRICE["Pricing"]
|
||||
BLOG["Blog"]
|
||||
CTA["Get Started ★"]
|
||||
end
|
||||
|
||||
subgraph "Feature Pages"
|
||||
F1["Analytics"]
|
||||
F2["Automation"]
|
||||
F3["Integrations"]
|
||||
end
|
||||
|
||||
subgraph "Footer Nav"
|
||||
ABOUT["About"]
|
||||
CAREERS["Careers"]
|
||||
CONTACT["Contact"]
|
||||
PRIVACY["Privacy"]
|
||||
TERMS["Terms"]
|
||||
end
|
||||
|
||||
HOME --> FEAT
|
||||
HOME --> PRICE
|
||||
HOME --> BLOG
|
||||
FEAT --> F1
|
||||
FEAT --> F2
|
||||
FEAT --> F3
|
||||
HOME --> ABOUT
|
||||
ABOUT --> CAREERS
|
||||
HOME --> CONTACT
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Hierarchy with URL Labels
|
||||
|
||||
Each node shows the page name and URL path.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
HOME["Homepage<br/><small>/</small>"] --> PROD["Product<br/><small>/product</small>"]
|
||||
HOME --> PRICE["Pricing<br/><small>/pricing</small>"]
|
||||
HOME --> BLOG["Blog<br/><small>/blog</small>"]
|
||||
HOME --> DOCS["Docs<br/><small>/docs</small>"]
|
||||
HOME --> ABOUT["About<br/><small>/about</small>"]
|
||||
|
||||
PROD --> P1["Analytics<br/><small>/product/analytics</small>"]
|
||||
PROD --> P2["Reports<br/><small>/product/reports</small>"]
|
||||
|
||||
DOCS --> D1["Getting Started<br/><small>/docs/getting-started</small>"]
|
||||
DOCS --> D2["API Reference<br/><small>/docs/api</small>"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Hub-and-Spoke Content Model
|
||||
|
||||
Shows a hub page connected to spoke articles, with spokes linking to each other.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
HUB["SEO Guide<br/>(Hub Page)"]
|
||||
|
||||
HUB --> S1["Keyword Research"]
|
||||
HUB --> S2["On-Page SEO"]
|
||||
HUB --> S3["Technical SEO"]
|
||||
HUB --> S4["Link Building"]
|
||||
|
||||
S1 -.-> S2
|
||||
S2 -.-> S3
|
||||
S3 -.-> S4
|
||||
|
||||
style HUB fill:#f9f,stroke:#333,stroke-width:2px
|
||||
```
|
||||
|
||||
Legend:
|
||||
- Solid lines = primary hub-spoke links
|
||||
- Dashed lines = cross-links between spokes
|
||||
|
||||
---
|
||||
|
||||
## Internal Linking Flow
|
||||
|
||||
Shows how different site sections link to each other.
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "Marketing"
|
||||
HOME["Homepage"]
|
||||
FEAT["Features"]
|
||||
PRICE["Pricing"]
|
||||
end
|
||||
|
||||
subgraph "Content"
|
||||
BLOG["Blog"]
|
||||
GUIDE["Guides"]
|
||||
CASE["Case Studies"]
|
||||
end
|
||||
|
||||
subgraph "Product"
|
||||
DOCS["Docs"]
|
||||
API["API Ref"]
|
||||
CHANGE["Changelog"]
|
||||
end
|
||||
|
||||
BLOG --> FEAT
|
||||
BLOG --> CASE
|
||||
CASE --> FEAT
|
||||
CASE --> PRICE
|
||||
FEAT --> DOCS
|
||||
GUIDE --> BLOG
|
||||
GUIDE --> DOCS
|
||||
HOME --> FEAT
|
||||
HOME --> BLOG
|
||||
HOME --> CASE
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Before/After Restructuring
|
||||
|
||||
Compare current and proposed site structures side by side.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "Before"
|
||||
B_HOME["Homepage"] --> B_P1["Page 1"]
|
||||
B_HOME --> B_P2["Page 2"]
|
||||
B_HOME --> B_P3["Page 3"]
|
||||
B_HOME --> B_P4["Page 4"]
|
||||
B_HOME --> B_P5["Page 5"]
|
||||
B_HOME --> B_P6["Page 6"]
|
||||
B_HOME --> B_P7["Page 7"]
|
||||
B_HOME --> B_P8["Page 8"]
|
||||
end
|
||||
|
||||
subgraph "After"
|
||||
A_HOME["Homepage"] --> A_S1["Features"]
|
||||
A_HOME --> A_S2["Resources"]
|
||||
A_HOME --> A_S3["Company"]
|
||||
A_S1 --> A_P1["Feature A"]
|
||||
A_S1 --> A_P2["Feature B"]
|
||||
A_S2 --> A_P3["Blog"]
|
||||
A_S2 --> A_P4["Guides"]
|
||||
A_S3 --> A_P5["About"]
|
||||
A_S3 --> A_P6["Contact"]
|
||||
end
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Color-Coding Conventions
|
||||
|
||||
Use styles to highlight page status, priority, or type.
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
HOME["Homepage"] --> FEAT["Features"]
|
||||
HOME --> PRICE["Pricing"]
|
||||
HOME --> BLOG["Blog"]
|
||||
HOME --> NEW["New Section"]
|
||||
HOME --> REMOVE["Deprecated Page"]
|
||||
|
||||
FEAT --> F1["Existing Feature"]
|
||||
FEAT --> F2["New Feature"]
|
||||
|
||||
style HOME fill:#4CAF50,color:#fff
|
||||
style PRICE fill:#4CAF50,color:#fff
|
||||
style FEAT fill:#4CAF50,color:#fff
|
||||
style BLOG fill:#4CAF50,color:#fff
|
||||
style F1 fill:#4CAF50,color:#fff
|
||||
style NEW fill:#2196F3,color:#fff
|
||||
style F2 fill:#2196F3,color:#fff
|
||||
style REMOVE fill:#f44336,color:#fff
|
||||
```
|
||||
|
||||
Color key:
|
||||
- **Green** (`#4CAF50`): Existing pages (no changes)
|
||||
- **Blue** (`#2196F3`): New pages to create
|
||||
- **Red** (`#f44336`): Pages to remove or redirect
|
||||
- **Yellow** (`#FFC107`): Pages to restructure or move
|
||||
- **Purple** (`#9C27B0`): High-priority / CTA pages
|
||||
@@ -0,0 +1,305 @@
|
||||
# Navigation Patterns
|
||||
|
||||
Detailed navigation patterns for different site types and contexts.
|
||||
|
||||
---
|
||||
|
||||
## Header Navigation
|
||||
|
||||
### Simple Header (4-6 items)
|
||||
|
||||
Best for: small businesses, simple SaaS, portfolios.
|
||||
|
||||
```
|
||||
[Logo] Features Pricing Blog About [CTA Button]
|
||||
```
|
||||
|
||||
Rules:
|
||||
- Logo always links to homepage
|
||||
- CTA button is rightmost, visually distinct (filled button, contrasting color)
|
||||
- Items ordered by priority (most visited first)
|
||||
- Active page gets visual indicator (underline, bold, color)
|
||||
|
||||
### Mega Menu Header
|
||||
|
||||
Best for: SaaS with many features, e-commerce with categories, large content sites.
|
||||
|
||||
```
|
||||
[Logo] Product ▾ Solutions ▾ Resources ▾ Pricing Docs [CTA]
|
||||
```
|
||||
|
||||
When "Product" is hovered/clicked:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Features Platform Integrations │
|
||||
│ ───────── ───────── ──────────── │
|
||||
│ Analytics Security Slack │
|
||||
│ Automation API HubSpot │
|
||||
│ Reporting Compliance Salesforce │
|
||||
│ Dashboards Zapier │
|
||||
│ │
|
||||
│ [See all features →] │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
Mega menu rules:
|
||||
- 2-4 columns max
|
||||
- Group items logically (by feature area, use case, or audience)
|
||||
- Include a "See all" link at the bottom
|
||||
- Don't nest dropdowns inside mega menus
|
||||
- Show descriptions for items when labels alone aren't clear
|
||||
|
||||
### Split Navigation
|
||||
|
||||
Best for: apps with both marketing and product nav.
|
||||
|
||||
```
|
||||
[Logo] Features Pricing Blog [Login] [Sign Up]
|
||||
├── Marketing nav (left) ──────┘ └── Auth nav (right) ──┤
|
||||
```
|
||||
|
||||
Right side handles authentication actions. Left side handles page navigation.
|
||||
|
||||
---
|
||||
|
||||
## Footer Navigation
|
||||
|
||||
### Column-Based Footer (Standard)
|
||||
|
||||
Best for: most sites. Organize links into 3-5 themed columns.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ │
|
||||
│ Product Resources Company Legal │
|
||||
│ ───────── ────────── ───────── ───── │
|
||||
│ Features Blog About Privacy │
|
||||
│ Pricing Guides Careers Terms │
|
||||
│ Integrations Templates Contact GDPR │
|
||||
│ Changelog Case Studies Press │
|
||||
│ Security Webinars Partners │
|
||||
│ │
|
||||
│ [Logo] © 2026 Company Name │
|
||||
│ Social: [Twitter] [LinkedIn] [GitHub] │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Minimal Footer
|
||||
|
||||
Best for: simple sites, landing pages.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ [Logo] │
|
||||
│ © 2026 Company · Privacy · Terms · Contact │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Expanded Footer
|
||||
|
||||
Best for: sites using footer for SEO (comparison pages, location pages, resource links).
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Product Resources Compare Use Cases │
|
||||
│ Features Blog vs Competitor A For Startups │
|
||||
│ Pricing Guides vs Competitor B For Enterprise│
|
||||
│ API Templates vs Competitor C For Agencies │
|
||||
│ │
|
||||
│ Integrations Popular Posts │
|
||||
│ Slack Zapier How to Do X │
|
||||
│ HubSpot Salesforce Guide to Y │
|
||||
│ Template: Z │
|
||||
│ │
|
||||
│ [Logo] © 2026 · Privacy · Terms · Security │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Sidebar Navigation
|
||||
|
||||
### Documentation Sidebar
|
||||
|
||||
Persistent left sidebar with collapsible sections.
|
||||
|
||||
```
|
||||
Getting Started
|
||||
├── Installation
|
||||
├── Quick Start
|
||||
└── Configuration
|
||||
|
||||
Guides
|
||||
├── Authentication
|
||||
├── Data Models
|
||||
└── Deployment
|
||||
|
||||
API Reference
|
||||
├── REST API
|
||||
│ ├── Users
|
||||
│ ├── Projects
|
||||
│ └── Webhooks
|
||||
└── GraphQL
|
||||
|
||||
Examples
|
||||
├── Next.js
|
||||
├── Rails
|
||||
└── Python
|
||||
|
||||
Changelog
|
||||
```
|
||||
|
||||
Rules:
|
||||
- Current page highlighted
|
||||
- Sections collapsible (expanded by default for active section)
|
||||
- Search at top of sidebar
|
||||
- "Previous / Next" page navigation at bottom of content area
|
||||
- Sticky on scroll (doesn't scroll away)
|
||||
|
||||
### Blog Category Sidebar
|
||||
|
||||
```
|
||||
Categories
|
||||
├── SEO (24)
|
||||
├── CRO (18)
|
||||
├── Content (15)
|
||||
├── Paid Ads (12)
|
||||
└── Analytics (9)
|
||||
|
||||
Popular Posts
|
||||
├── How to Improve SEO
|
||||
├── Landing Page Guide
|
||||
└── Analytics Setup
|
||||
|
||||
Newsletter
|
||||
└── [Email signup form]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Breadcrumbs
|
||||
|
||||
### Standard Format
|
||||
|
||||
```
|
||||
Home > Features > Analytics
|
||||
Home > Blog > SEO Category > How to Do Keyword Research
|
||||
Home > Docs > API Reference > Authentication
|
||||
```
|
||||
|
||||
Rules:
|
||||
- Separator: `>` or `/` (be consistent)
|
||||
- Every segment is a link except the current page
|
||||
- Current page is plain text (not linked)
|
||||
- Don't include the current page if the title is already visible as an H1
|
||||
|
||||
### With Schema Markup
|
||||
|
||||
```html
|
||||
<nav aria-label="Breadcrumb">
|
||||
<ol itemscope itemtype="https://schema.org/BreadcrumbList">
|
||||
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
||||
<a itemprop="item" href="/"><span itemprop="name">Home</span></a>
|
||||
<meta itemprop="position" content="1" />
|
||||
</li>
|
||||
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
||||
<a itemprop="item" href="/features"><span itemprop="name">Features</span></a>
|
||||
<meta itemprop="position" content="2" />
|
||||
</li>
|
||||
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
||||
<span itemprop="name">Analytics</span>
|
||||
<meta itemprop="position" content="3" />
|
||||
</li>
|
||||
</ol>
|
||||
</nav>
|
||||
```
|
||||
|
||||
Or use JSON-LD (recommended):
|
||||
|
||||
```json
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" },
|
||||
{ "@type": "ListItem", "position": 2, "name": "Features", "item": "https://example.com/features" },
|
||||
{ "@type": "ListItem", "position": 3, "name": "Analytics" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Mobile Navigation
|
||||
|
||||
### Hamburger Menu
|
||||
|
||||
Standard for mobile. All nav items collapse into a menu icon.
|
||||
|
||||
Rules:
|
||||
- Hamburger icon (three lines) top-right or top-left
|
||||
- Full-screen or slide-out panel
|
||||
- CTA button visible without opening the menu (sticky header)
|
||||
- Search accessible from mobile menu
|
||||
- Accordion pattern for nested items
|
||||
|
||||
### Bottom Tab Bar
|
||||
|
||||
Best for: web apps, PWAs, mobile-first products.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────┐
|
||||
│ │
|
||||
│ [Page Content] │
|
||||
│ │
|
||||
├──────────────────────────────────────┤
|
||||
│ Home Search Create Profile │
|
||||
│ 🏠 🔍 ➕ 👤 │
|
||||
└──────────────────────────────────────┘
|
||||
```
|
||||
|
||||
Rules:
|
||||
- 3-5 items max
|
||||
- Icons + labels (not just icons)
|
||||
- Active state clearly indicated
|
||||
- Most important action in the center
|
||||
|
||||
---
|
||||
|
||||
## Anti-Patterns
|
||||
|
||||
### Things to Avoid
|
||||
|
||||
- **Too many header items** (8+): causes decision paralysis, nav becomes unreadable on smaller screens
|
||||
- **Dropdown inception**: dropdowns inside dropdowns inside dropdowns
|
||||
- **Mystery icons**: icons without labels — users don't know what they mean
|
||||
- **Hidden primary nav**: burying important pages in hamburger menus on desktop
|
||||
- **Inconsistent nav between pages**: nav should be identical across the site (except app vs marketing)
|
||||
- **No mobile consideration**: desktop nav that doesn't translate to mobile
|
||||
- **Footer as sitemap dump**: 50+ links in the footer with no organization
|
||||
- **Breadcrumbs that don't match URLs**: breadcrumb says "Products > Widget" but URL is `/shop/widget-pro`
|
||||
|
||||
### Common Fixes
|
||||
|
||||
| Problem | Fix |
|
||||
|---------|-----|
|
||||
| Too many nav items | Group into dropdowns or mega menus |
|
||||
| Users can't find pages | Add search, improve labeling |
|
||||
| High bounce from nav | Simplify choices, use clearer labels |
|
||||
| SEO pages not linked | Add to footer or resource sections |
|
||||
| Mobile nav is broken | Test on real devices, use hamburger pattern |
|
||||
|
||||
---
|
||||
|
||||
## Navigation for SEO
|
||||
|
||||
Internal links in navigation pass PageRank. Use this strategically:
|
||||
|
||||
- **Header nav links are strongest** — put your most important pages here
|
||||
- **Footer links pass less value** but still matter — good for comparison pages, location pages
|
||||
- **Sidebar links** help with section-level authority — good for blog categories, doc sections
|
||||
- **Breadcrumbs** provide structural signals to search engines — implement with schema markup
|
||||
- **Don't use JavaScript-only nav** — search engines need crawlable HTML links
|
||||
- **Use descriptive anchor text** — "Analytics Features" not just "Features"
|
||||
@@ -0,0 +1,293 @@
|
||||
# Site Type Templates
|
||||
|
||||
Full page hierarchy templates with ASCII trees, URL maps, and navigation recommendations for common site types.
|
||||
|
||||
---
|
||||
|
||||
## SaaS Marketing Site
|
||||
|
||||
### Page Hierarchy
|
||||
|
||||
```
|
||||
Homepage (/)
|
||||
├── Features (/features)
|
||||
│ ├── Feature A (/features/feature-a)
|
||||
│ ├── Feature B (/features/feature-b)
|
||||
│ └── Feature C (/features/feature-c)
|
||||
├── Pricing (/pricing)
|
||||
├── Customers (/customers)
|
||||
│ ├── Case Study 1 (/customers/company-name)
|
||||
│ └── Case Study 2 (/customers/company-name-2)
|
||||
├── Resources (/resources)
|
||||
│ ├── Blog (/blog)
|
||||
│ │ └── [Posts] (/blog/post-slug)
|
||||
│ ├── Templates (/resources/templates)
|
||||
│ │ └── [Template] (/resources/templates/template-slug)
|
||||
│ └── Guides (/resources/guides)
|
||||
│ └── [Guide] (/resources/guides/guide-slug)
|
||||
├── Integrations (/integrations)
|
||||
│ └── [Integration] (/integrations/integration-name)
|
||||
├── Docs (/docs)
|
||||
│ ├── Getting Started (/docs/getting-started)
|
||||
│ ├── Guides (/docs/guides)
|
||||
│ └── API Reference (/docs/api)
|
||||
├── About (/about)
|
||||
│ ├── Careers (/about/careers)
|
||||
│ └── Contact (/contact)
|
||||
├── Compare (/compare)
|
||||
│ └── [Competitor] (/compare/competitor-name)
|
||||
├── Privacy (/privacy)
|
||||
└── Terms (/terms)
|
||||
```
|
||||
|
||||
### URL Map
|
||||
|
||||
| Page | URL | Nav Location | Priority |
|
||||
|------|-----|-------------|----------|
|
||||
| Homepage | `/` | Header (logo) | Critical |
|
||||
| Features | `/features` | Header | High |
|
||||
| Feature pages | `/features/{slug}` | Header dropdown | Medium |
|
||||
| Pricing | `/pricing` | Header | Critical |
|
||||
| Customers | `/customers` | Header | Medium |
|
||||
| Case studies | `/customers/{slug}` | Customers dropdown | Medium |
|
||||
| Blog | `/blog` | Header (Resources) | High |
|
||||
| Blog posts | `/blog/{slug}` | — | Medium |
|
||||
| Integrations | `/integrations` | Header | Medium |
|
||||
| Docs | `/docs` | Header | Medium |
|
||||
| Compare | `/compare/{slug}` | Footer | High (SEO) |
|
||||
| About | `/about` | Footer | Low |
|
||||
| Pricing CTA | `/pricing` | Header (CTA button) | Critical |
|
||||
|
||||
### Navigation
|
||||
|
||||
**Header (6 items + CTA)**: Features | Pricing | Customers | Resources | Integrations | Docs | [Get Started]
|
||||
|
||||
**Footer columns**:
|
||||
- Product: Features, Pricing, Integrations, Changelog, Security
|
||||
- Resources: Blog, Templates, Guides, Case Studies
|
||||
- Company: About, Careers, Contact, Press
|
||||
- Legal: Privacy, Terms, Security
|
||||
|
||||
---
|
||||
|
||||
## Content / Blog Site
|
||||
|
||||
### Page Hierarchy
|
||||
|
||||
```
|
||||
Homepage (/)
|
||||
├── Blog (/blog)
|
||||
│ ├── [Category: Topic A] (/blog/category/topic-a)
|
||||
│ ├── [Category: Topic B] (/blog/category/topic-b)
|
||||
│ ├── [Category: Topic C] (/blog/category/topic-c)
|
||||
│ └── [Posts] (/blog/post-slug)
|
||||
├── Newsletter (/newsletter)
|
||||
├── Resources (/resources)
|
||||
│ ├── Guides (/resources/guides)
|
||||
│ │ └── [Guide] (/resources/guides/guide-slug)
|
||||
│ └── Tools (/resources/tools)
|
||||
│ └── [Tool] (/resources/tools/tool-slug)
|
||||
├── About (/about)
|
||||
├── Contact (/contact)
|
||||
├── Privacy (/privacy)
|
||||
└── Terms (/terms)
|
||||
```
|
||||
|
||||
### URL Map
|
||||
|
||||
| Page | URL | Nav Location | Priority |
|
||||
|------|-----|-------------|----------|
|
||||
| Homepage | `/` | Header (logo) | Critical |
|
||||
| Blog index | `/blog` | Header | High |
|
||||
| Categories | `/blog/category/{slug}` | Header dropdown | Medium |
|
||||
| Posts | `/blog/{slug}` | — | Medium |
|
||||
| Newsletter | `/newsletter` | Header (CTA) | High |
|
||||
| Guides | `/resources/guides` | Header | Medium |
|
||||
| About | `/about` | Header | Low |
|
||||
|
||||
### Navigation
|
||||
|
||||
**Header (4 items + CTA)**: Blog | Resources | About | Contact | [Subscribe]
|
||||
|
||||
**Sidebar** (on blog): Categories, Popular Posts, Newsletter signup
|
||||
|
||||
---
|
||||
|
||||
## E-Commerce
|
||||
|
||||
### Page Hierarchy
|
||||
|
||||
```
|
||||
Homepage (/)
|
||||
├── Shop (/shop)
|
||||
│ ├── Category A (/shop/category-a)
|
||||
│ │ ├── Subcategory (/shop/category-a/subcategory)
|
||||
│ │ │ └── [Product] (/shop/category-a/subcategory/product-slug)
|
||||
│ │ └── [Product] (/shop/category-a/product-slug)
|
||||
│ ├── Category B (/shop/category-b)
|
||||
│ │ └── [Product] (/shop/category-b/product-slug)
|
||||
│ └── Category C (/shop/category-c)
|
||||
│ └── [Product] (/shop/category-c/product-slug)
|
||||
├── Collections (/collections)
|
||||
│ └── [Collection] (/collections/collection-slug)
|
||||
├── Sale (/sale)
|
||||
├── Blog (/blog)
|
||||
│ └── [Posts] (/blog/post-slug)
|
||||
├── About (/about)
|
||||
│ └── Our Story (/about/our-story)
|
||||
├── Help (/help)
|
||||
│ ├── FAQ (/help/faq)
|
||||
│ ├── Shipping (/help/shipping)
|
||||
│ ├── Returns (/help/returns)
|
||||
│ └── Contact (/contact)
|
||||
├── Cart (/cart)
|
||||
├── Account (/account)
|
||||
├── Privacy (/privacy)
|
||||
└── Terms (/terms)
|
||||
```
|
||||
|
||||
### URL Map
|
||||
|
||||
| Page | URL | Nav Location | Priority |
|
||||
|------|-----|-------------|----------|
|
||||
| Homepage | `/` | Header (logo) | Critical |
|
||||
| Shop | `/shop` | Header | Critical |
|
||||
| Categories | `/shop/{category}` | Header mega menu | High |
|
||||
| Products | `/shop/{category}/{product}` | — | High |
|
||||
| Collections | `/collections/{slug}` | Header | Medium |
|
||||
| Sale | `/sale` | Header (highlighted) | High |
|
||||
| Cart | `/cart` | Header (icon) | Critical |
|
||||
| Account | `/account` | Header (icon) | Medium |
|
||||
|
||||
### Navigation
|
||||
|
||||
**Header (5 items + cart/account)**: Shop (mega menu) | Collections | Sale | Blog | Help | [Cart icon] [Account icon]
|
||||
|
||||
**Mega menu under Shop**: Category columns with featured products/images
|
||||
|
||||
---
|
||||
|
||||
## Documentation Site
|
||||
|
||||
### Page Hierarchy
|
||||
|
||||
```
|
||||
Docs Home (/docs)
|
||||
├── Getting Started (/docs/getting-started)
|
||||
│ ├── Installation (/docs/getting-started/installation)
|
||||
│ ├── Quick Start (/docs/getting-started/quick-start)
|
||||
│ └── Configuration (/docs/getting-started/configuration)
|
||||
├── Guides (/docs/guides)
|
||||
│ ├── Guide A (/docs/guides/guide-a)
|
||||
│ ├── Guide B (/docs/guides/guide-b)
|
||||
│ └── Guide C (/docs/guides/guide-c)
|
||||
├── API Reference (/docs/api)
|
||||
│ ├── Authentication (/docs/api/authentication)
|
||||
│ ├── Endpoints (/docs/api/endpoints)
|
||||
│ └── Webhooks (/docs/api/webhooks)
|
||||
├── Examples (/docs/examples)
|
||||
│ └── [Example] (/docs/examples/example-slug)
|
||||
├── Changelog (/docs/changelog)
|
||||
└── FAQ (/docs/faq)
|
||||
```
|
||||
|
||||
### URL Map
|
||||
|
||||
| Page | URL | Nav Location | Priority |
|
||||
|------|-----|-------------|----------|
|
||||
| Docs home | `/docs` | Header | High |
|
||||
| Getting Started | `/docs/getting-started` | Sidebar (top) | Critical |
|
||||
| Guides | `/docs/guides` | Sidebar | High |
|
||||
| API Reference | `/docs/api` | Sidebar | High |
|
||||
| Changelog | `/docs/changelog` | Sidebar (bottom) | Low |
|
||||
|
||||
### Navigation
|
||||
|
||||
**Header**: Docs | API | Blog | Community | GitHub | [Dashboard]
|
||||
|
||||
**Sidebar** (persistent, left): Getting Started, Guides, API Reference, Examples, Changelog — with expandable subsections
|
||||
|
||||
**On-page**: Previous/Next navigation at bottom of each doc page
|
||||
|
||||
---
|
||||
|
||||
## Hybrid SaaS + Content
|
||||
|
||||
### Page Hierarchy
|
||||
|
||||
```
|
||||
Homepage (/)
|
||||
├── Product (/product)
|
||||
│ ├── Feature A (/product/feature-a)
|
||||
│ ├── Feature B (/product/feature-b)
|
||||
│ └── Feature C (/product/feature-c)
|
||||
├── Solutions (/solutions)
|
||||
│ ├── By Use Case (/solutions/use-case-slug)
|
||||
│ └── By Industry (/solutions/industry-slug)
|
||||
├── Pricing (/pricing)
|
||||
├── Blog (/blog)
|
||||
│ ├── [Category] (/blog/category/slug)
|
||||
│ └── [Posts] (/blog/post-slug)
|
||||
├── Resources (/resources)
|
||||
│ ├── Guides (/resources/guides)
|
||||
│ ├── Templates (/resources/templates)
|
||||
│ ├── Webinars (/resources/webinars)
|
||||
│ └── Case Studies (/resources/case-studies)
|
||||
├── Docs (/docs)
|
||||
│ ├── Getting Started (/docs/getting-started)
|
||||
│ └── API (/docs/api)
|
||||
├── Integrations (/integrations)
|
||||
│ └── [Integration] (/integrations/slug)
|
||||
├── Compare (/compare)
|
||||
│ └── [Competitor] (/compare/competitor-slug)
|
||||
├── About (/about)
|
||||
│ ├── Careers (/about/careers)
|
||||
│ └── Contact (/contact)
|
||||
├── Privacy (/privacy)
|
||||
└── Terms (/terms)
|
||||
```
|
||||
|
||||
### Navigation
|
||||
|
||||
**Header (7 items + CTA)**: Product | Solutions | Pricing | Resources | Blog | Docs | Integrations | [Start Free Trial]
|
||||
|
||||
Use mega menus for Product (features list), Solutions (use cases + industries), and Resources (blog, guides, templates, webinars, case studies).
|
||||
|
||||
---
|
||||
|
||||
## Small Business / Local
|
||||
|
||||
### Page Hierarchy
|
||||
|
||||
```
|
||||
Homepage (/)
|
||||
├── Services (/services)
|
||||
│ ├── Service A (/services/service-a)
|
||||
│ ├── Service B (/services/service-b)
|
||||
│ └── Service C (/services/service-c)
|
||||
├── About (/about)
|
||||
├── Testimonials (/testimonials)
|
||||
├── Blog (/blog)
|
||||
│ └── [Posts] (/blog/post-slug)
|
||||
├── Contact (/contact)
|
||||
├── Privacy (/privacy)
|
||||
└── Terms (/terms)
|
||||
```
|
||||
|
||||
### URL Map
|
||||
|
||||
| Page | URL | Nav Location | Priority |
|
||||
|------|-----|-------------|----------|
|
||||
| Homepage | `/` | Header (logo) | Critical |
|
||||
| Services | `/services` | Header | High |
|
||||
| Service pages | `/services/{slug}` | Header dropdown | High |
|
||||
| About | `/about` | Header | Medium |
|
||||
| Testimonials | `/testimonials` | Header | Medium |
|
||||
| Blog | `/blog` | Header | Medium |
|
||||
| Contact | `/contact` | Header (CTA) | High |
|
||||
|
||||
### Navigation
|
||||
|
||||
**Header (5 items + CTA)**: Services | About | Testimonials | Blog | [Contact Us]
|
||||
|
||||
Keep it simple. Small business sites should be flat (1-2 levels max). Every page should be reachable from the header.
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
name: social-content
|
||||
version: 1.0.0
|
||||
description: "When the user wants help creating, scheduling, or optimizing social media content for LinkedIn, Twitter/X, Instagram, TikTok, Facebook, or other platforms. Also use when the user mentions 'LinkedIn post,' 'Twitter thread,' 'social media,' 'content calendar,' 'social scheduling,' 'engagement,' or 'viral content.' This skill covers content creation, repurposing, and platform-specific strategies."
|
||||
description: "When the user wants help creating, scheduling, or optimizing social media content for LinkedIn, Twitter/X, Instagram, TikTok, Facebook, or other platforms. Also use when the user mentions 'LinkedIn post,' 'Twitter thread,' 'social media,' 'content calendar,' 'social scheduling,' 'engagement,' 'viral content,' 'what should I post,' 'repurpose this content,' 'tweet ideas,' 'LinkedIn carousel,' 'social media strategy,' or 'grow my following.' Use this for any social media content creation, repurposing, or scheduling task. For broader content strategy, see content-strategy."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# Social Content
|
||||
@@ -11,7 +12,7 @@ You are an expert social media strategist. Your goal is to help create engaging
|
||||
## Before Creating Content
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.claude/product-marketing-context.md` exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
|
||||
Detailed strategies for each major social platform.
|
||||
|
||||
## Contents
|
||||
- LinkedIn
|
||||
- Twitter/X
|
||||
- Instagram
|
||||
- TikTok
|
||||
- Facebook
|
||||
|
||||
## LinkedIn
|
||||
|
||||
**Best for:** B2B, thought leadership, professional networking, recruiting
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
Ready-to-use templates for different platforms and content types.
|
||||
|
||||
## Contents
|
||||
- LinkedIn Post Templates (The Story Post, The Contrarian Take, The List Post, The How-To)
|
||||
- Twitter/X Thread Templates (The Tutorial Thread, The Story Thread, The Breakdown Thread)
|
||||
- Instagram Templates (The Carousel Hook, The Reel Script)
|
||||
- Hook Formulas (Curiosity Hooks, Story Hooks, Value Hooks, Contrarian Hooks, Social Proof Hooks)
|
||||
|
||||
## LinkedIn Post Templates
|
||||
|
||||
### The Story Post
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
Instead of guessing what works, systematically analyze top-performing content in your niche and extract proven patterns.
|
||||
|
||||
## Contents
|
||||
- The 6-Step Framework (Niche ID, Scrape, Analyze, Playbook, Layer Voice, Convert)
|
||||
- The Formula
|
||||
- Reverse Engineering Checklist
|
||||
|
||||
## The 6-Step Framework
|
||||
|
||||
### 1. NICHE ID — Find Top Creators
|
||||
|
||||
+281
-28
@@ -14,32 +14,71 @@ Quick reference for AI agents to discover tool capabilities and integration meth
|
||||
|
||||
| Tool | Category | API | MCP | CLI | SDK | Guide |
|
||||
|------|----------|:---:|:---:|:---:|:---:|-------|
|
||||
| ga4 | Analytics | ✓ | ✓ | - | ✓ | [ga4.md](integrations/ga4.md) |
|
||||
| mixpanel | Analytics | ✓ | - | - | ✓ | [mixpanel.md](integrations/mixpanel.md) |
|
||||
| amplitude | Analytics | ✓ | - | - | ✓ | [amplitude.md](integrations/amplitude.md) |
|
||||
| ga4 | Analytics | ✓ | ✓ | [✓](clis/ga4.js) | ✓ | [ga4.md](integrations/ga4.md) |
|
||||
| mixpanel | Analytics | ✓ | - | [✓](clis/mixpanel.js) | ✓ | [mixpanel.md](integrations/mixpanel.md) |
|
||||
| amplitude | Analytics | ✓ | - | [✓](clis/amplitude.js) | ✓ | [amplitude.md](integrations/amplitude.md) |
|
||||
| posthog | Analytics | ✓ | - | ✓ | ✓ | [posthog.md](integrations/posthog.md) |
|
||||
| segment | Analytics | ✓ | - | - | ✓ | [segment.md](integrations/segment.md) |
|
||||
| adobe-analytics | Analytics | ✓ | - | - | ✓ | [adobe-analytics.md](integrations/adobe-analytics.md) |
|
||||
| google-search-console | SEO | ✓ | - | - | ✓ | [google-search-console.md](integrations/google-search-console.md) |
|
||||
| semrush | SEO | ✓ | - | - | - | [semrush.md](integrations/semrush.md) |
|
||||
| ahrefs | SEO | ✓ | - | - | - | [ahrefs.md](integrations/ahrefs.md) |
|
||||
| segment | Analytics | ✓ | - | [✓](clis/segment.js) | ✓ | [segment.md](integrations/segment.md) |
|
||||
| adobe-analytics | Analytics | ✓ | - | [✓](clis/adobe-analytics.js) | ✓ | [adobe-analytics.md](integrations/adobe-analytics.md) |
|
||||
| plausible | Analytics | ✓ | - | [✓](clis/plausible.js) | - | [plausible.md](integrations/plausible.md) |
|
||||
| google-search-console | SEO | ✓ | - | [✓](clis/google-search-console.js) | ✓ | [google-search-console.md](integrations/google-search-console.md) |
|
||||
| semrush | SEO | ✓ | - | [✓](clis/semrush.js) | - | [semrush.md](integrations/semrush.md) |
|
||||
| ahrefs | SEO | ✓ | - | [✓](clis/ahrefs.js) | - | [ahrefs.md](integrations/ahrefs.md) |
|
||||
| dataforseo | SEO | ✓ | - | [✓](clis/dataforseo.js) | ✓ | [dataforseo.md](integrations/dataforseo.md) |
|
||||
| keywords-everywhere | SEO | ✓ | - | [✓](clis/keywords-everywhere.js) | - | [keywords-everywhere.md](integrations/keywords-everywhere.md) |
|
||||
| clearbit | Data Enrichment | ✓ | - | [✓](clis/clearbit.js) | ✓ | [clearbit.md](integrations/clearbit.md) |
|
||||
| apollo | Data Enrichment | ✓ | - | [✓](clis/apollo.js) | - | [apollo.md](integrations/apollo.md) |
|
||||
| zoominfo | Data Enrichment | ✓ | ✓ | [✓](clis/zoominfo.js) | - | [zoominfo.md](integrations/zoominfo.md) |
|
||||
| clay | Data Enrichment | ✓ | ✓ | [✓](clis/clay.js) | - | [clay.md](integrations/clay.md) |
|
||||
| supermetrics | Data Aggregation | ✓ | ✓ | [✓](clis/supermetrics.js) | - | [supermetrics.md](integrations/supermetrics.md) |
|
||||
| coupler | Data Aggregation | ✓ | ✓ | [✓](clis/coupler.js) | - | [coupler.md](integrations/coupler.md) |
|
||||
| hubspot | CRM | ✓ | - | ✓ | ✓ | [hubspot.md](integrations/hubspot.md) |
|
||||
| salesforce | CRM | ✓ | - | ✓ | ✓ | [salesforce.md](integrations/salesforce.md) |
|
||||
| close | CRM | ✓ | - | [✓](clis/close.js) | - | [close.md](integrations/close.md) |
|
||||
| stripe | Payments | ✓ | ✓ | ✓ | ✓ | [stripe.md](integrations/stripe.md) |
|
||||
| rewardful | Referral | ✓ | - | - | - | [rewardful.md](integrations/rewardful.md) |
|
||||
| tolt | Referral | ✓ | - | - | - | [tolt.md](integrations/tolt.md) |
|
||||
| dub-co | Links | ✓ | - | - | ✓ | [dub-co.md](integrations/dub-co.md) |
|
||||
| mention-me | Referral | ✓ | - | - | - | [mention-me.md](integrations/mention-me.md) |
|
||||
| mailchimp | Email | ✓ | ✓ | - | ✓ | [mailchimp.md](integrations/mailchimp.md) |
|
||||
| customer-io | Email | ✓ | - | - | ✓ | [customer-io.md](integrations/customer-io.md) |
|
||||
| sendgrid | Email | ✓ | - | - | ✓ | [sendgrid.md](integrations/sendgrid.md) |
|
||||
| resend | Email | ✓ | ✓ | - | ✓ | [resend.md](integrations/resend.md) |
|
||||
| kit | Email | ✓ | - | - | ✓ | [kit.md](integrations/kit.md) |
|
||||
| google-ads | Ads | ✓ | ✓ | - | ✓ | [google-ads.md](integrations/google-ads.md) |
|
||||
| meta-ads | Ads | ✓ | - | - | ✓ | [meta-ads.md](integrations/meta-ads.md) |
|
||||
| linkedin-ads | Ads | ✓ | - | - | - | [linkedin-ads.md](integrations/linkedin-ads.md) |
|
||||
| tiktok-ads | Ads | ✓ | - | - | ✓ | [tiktok-ads.md](integrations/tiktok-ads.md) |
|
||||
| zapier | Automation | ✓ | ✓ | - | - | [zapier.md](integrations/zapier.md) |
|
||||
| paddle | Payments | ✓ | - | [✓](clis/paddle.js) | ✓ | [paddle.md](integrations/paddle.md) |
|
||||
| rewardful | Referral | ✓ | - | [✓](clis/rewardful.js) | - | [rewardful.md](integrations/rewardful.md) |
|
||||
| tolt | Referral | ✓ | - | [✓](clis/tolt.js) | - | [tolt.md](integrations/tolt.md) |
|
||||
| dub-co | Links | ✓ | - | [✓](clis/dub.js) | ✓ | [dub-co.md](integrations/dub-co.md) |
|
||||
| mention-me | Referral | ✓ | - | [✓](clis/mention-me.js) | - | [mention-me.md](integrations/mention-me.md) |
|
||||
| partnerstack | Affiliate | ✓ | - | [✓](clis/partnerstack.js) | - | [partnerstack.md](integrations/partnerstack.md) |
|
||||
| mailchimp | Email | ✓ | ✓ | [✓](clis/mailchimp.js) | ✓ | [mailchimp.md](integrations/mailchimp.md) |
|
||||
| customer-io | Email | ✓ | - | [✓](clis/customer-io.js) | ✓ | [customer-io.md](integrations/customer-io.md) |
|
||||
| sendgrid | Email | ✓ | - | [✓](clis/sendgrid.js) | ✓ | [sendgrid.md](integrations/sendgrid.md) |
|
||||
| resend | Email | ✓ | ✓ | [✓](clis/resend.js) | ✓ | [resend.md](integrations/resend.md) |
|
||||
| kit | Email | ✓ | - | [✓](clis/kit.js) | ✓ | [kit.md](integrations/kit.md) |
|
||||
| beehiiv | Newsletter | ✓ | - | [✓](clis/beehiiv.js) | - | [beehiiv.md](integrations/beehiiv.md) |
|
||||
| klaviyo | Email/SMS | ✓ | - | [✓](clis/klaviyo.js) | ✓ | [klaviyo.md](integrations/klaviyo.md) |
|
||||
| postmark | Email | ✓ | - | [✓](clis/postmark.js) | ✓ | [postmark.md](integrations/postmark.md) |
|
||||
| brevo | Email/SMS | ✓ | - | [✓](clis/brevo.js) | ✓ | [brevo.md](integrations/brevo.md) |
|
||||
| activecampaign | Email/CRM | ✓ | - | [✓](clis/activecampaign.js) | ✓ | [activecampaign.md](integrations/activecampaign.md) |
|
||||
| hunter | Email Outreach | ✓ | - | [✓](clis/hunter.js) | - | [hunter.md](integrations/hunter.md) |
|
||||
| snov | Email Outreach | ✓ | - | [✓](clis/snov.js) | - | [snov.md](integrations/snov.md) |
|
||||
| lemlist | Email Outreach | ✓ | - | [✓](clis/lemlist.js) | - | [lemlist.md](integrations/lemlist.md) |
|
||||
| instantly | Email Outreach | ✓ | - | [✓](clis/instantly.js) | - | [instantly.md](integrations/instantly.md) |
|
||||
| google-ads | Ads | ✓ | ✓ | [✓](clis/google-ads.js) | ✓ | [google-ads.md](integrations/google-ads.md) |
|
||||
| meta-ads | Ads | ✓ | - | [✓](clis/meta-ads.js) | ✓ | [meta-ads.md](integrations/meta-ads.md) |
|
||||
| linkedin-ads | Ads | ✓ | - | [✓](clis/linkedin-ads.js) | - | [linkedin-ads.md](integrations/linkedin-ads.md) |
|
||||
| tiktok-ads | Ads | ✓ | - | [✓](clis/tiktok-ads.js) | ✓ | [tiktok-ads.md](integrations/tiktok-ads.md) |
|
||||
| zapier | Automation | ✓ | ✓ | [✓](clis/zapier.js) | - | [zapier.md](integrations/zapier.md) |
|
||||
| hotjar | CRO | ✓ | - | [✓](clis/hotjar.js) | - | [hotjar.md](integrations/hotjar.md) |
|
||||
| optimizely | A/B Testing | ✓ | - | [✓](clis/optimizely.js) | ✓ | [optimizely.md](integrations/optimizely.md) |
|
||||
| calendly | Scheduling | ✓ | - | [✓](clis/calendly.js) | - | [calendly.md](integrations/calendly.md) |
|
||||
| savvycal | Scheduling | ✓ | - | [✓](clis/savvycal.js) | - | [savvycal.md](integrations/savvycal.md) |
|
||||
| typeform | Forms | ✓ | - | [✓](clis/typeform.js) | ✓ | [typeform.md](integrations/typeform.md) |
|
||||
| intercom | Messaging | ✓ | - | [✓](clis/intercom.js) | ✓ | [intercom.md](integrations/intercom.md) |
|
||||
| outreach | Sales Engagement | ✓ | ✓ | [✓](clis/outreach.js) | - | [outreach.md](integrations/outreach.md) |
|
||||
| crossbeam | Partner Ecosystem | ✓ | ✓ | [✓](clis/crossbeam.js) | - | [crossbeam.md](integrations/crossbeam.md) |
|
||||
| pendo | Product Analytics | ✓ | - | [✓](clis/pendo.js) | - | [pendo.md](integrations/pendo.md) |
|
||||
| similarweb | Competitive Intelligence | ✓ | - | [✓](clis/similarweb.js) | - | [similarweb.md](integrations/similarweb.md) |
|
||||
| airops | AI Content | ✓ | - | [✓](clis/airops.js) | - | [airops.md](integrations/airops.md) |
|
||||
| buffer | Social | ✓ | - | [✓](clis/buffer.js) | - | [buffer.md](integrations/buffer.md) |
|
||||
| wistia | Video | ✓ | - | [✓](clis/wistia.js) | - | [wistia.md](integrations/wistia.md) |
|
||||
| trustpilot | Reviews | ✓ | - | [✓](clis/trustpilot.js) | - | [trustpilot.md](integrations/trustpilot.md) |
|
||||
| g2 | Reviews | ✓ | - | [✓](clis/g2.js) | - | [g2.md](integrations/g2.md) |
|
||||
| onesignal | Push | ✓ | - | [✓](clis/onesignal.js) | ✓ | [onesignal.md](integrations/onesignal.md) |
|
||||
| demio | Webinar | ✓ | - | [✓](clis/demio.js) | - | [demio.md](integrations/demio.md) |
|
||||
| livestorm | Webinar | ✓ | - | [✓](clis/livestorm.js) | - | [livestorm.md](integrations/livestorm.md) |
|
||||
| shopify | Commerce | ✓ | - | ✓ | ✓ | [shopify.md](integrations/shopify.md) |
|
||||
| wordpress | CMS | ✓ | - | ✓ | ✓ | [wordpress.md](integrations/wordpress.md) |
|
||||
| webflow | CMS | ✓ | - | ✓ | ✓ | [webflow.md](integrations/webflow.md) |
|
||||
@@ -60,8 +99,9 @@ Track user behavior, measure conversions, and analyze marketing performance.
|
||||
| **posthog** | Open-source analytics, session replay | - |
|
||||
| **segment** | Customer data platform, routing | - |
|
||||
| **adobe-analytics** | Enterprise analytics | - |
|
||||
| **plausible** | Privacy-focused analytics | - |
|
||||
|
||||
**Agent recommendation**: Start with GA4 if using Google ecosystem. Use Mixpanel or Amplitude for deeper product analytics.
|
||||
**Agent recommendation**: Start with GA4 if using Google ecosystem. Use Mixpanel or Amplitude for deeper product analytics. Plausible for privacy-focused sites.
|
||||
|
||||
### SEO
|
||||
|
||||
@@ -72,8 +112,10 @@ Search engine optimization tools for keyword research, rank tracking, and site a
|
||||
| **google-search-console** | Free, authoritative search data | Direct from Google |
|
||||
| **semrush** | Competitive analysis, keyword research | Comprehensive |
|
||||
| **ahrefs** | Backlink analysis, content research | Best for links |
|
||||
| **dataforseo** | SERP tracking, backlinks, on-page audits | Comprehensive API |
|
||||
| **keywords-everywhere** | Quick keyword research, traffic estimates | Credit-based |
|
||||
|
||||
**Agent recommendation**: Google Search Console is essential (free). Add Semrush or Ahrefs for competitive research.
|
||||
**Agent recommendation**: Google Search Console is essential (free). Add Semrush or Ahrefs for competitive research. DataForSEO for programmatic SERP data. Keywords Everywhere for quick keyword lookups.
|
||||
|
||||
### CRM
|
||||
|
||||
@@ -83,8 +125,9 @@ Customer relationship management and sales tools.
|
||||
|------|----------|:-------------:|
|
||||
| **hubspot** | SMB, marketing + sales alignment | ✓ |
|
||||
| **salesforce** | Enterprise, complex sales processes | ✓ |
|
||||
| **close** | SMB, high-velocity sales | [✓](clis/close.js) |
|
||||
|
||||
**Agent recommendation**: HubSpot for startups/SMBs, Salesforce for enterprise.
|
||||
**Agent recommendation**: HubSpot for startups/SMBs. Close for high-velocity inside sales. Salesforce for enterprise.
|
||||
|
||||
### Payments
|
||||
|
||||
@@ -93,8 +136,9 @@ Payment processing and subscription management.
|
||||
| Tool | Best For | MCP Available |
|
||||
|------|----------|:-------------:|
|
||||
| **stripe** | SaaS subscriptions, developer-friendly | ✓ |
|
||||
| **paddle** | SaaS billing with tax handling | - |
|
||||
|
||||
**Agent recommendation**: Stripe is the default for SaaS and developer-focused products.
|
||||
**Agent recommendation**: Stripe is the default for SaaS. Paddle for built-in tax compliance.
|
||||
|
||||
### Referral & Affiliate
|
||||
|
||||
@@ -106,8 +150,9 @@ Tools for referral programs, affiliate tracking, and partner management.
|
||||
| **tolt** | SaaS affiliate programs | ✓ |
|
||||
| **mention-me** | Enterprise referral programs | ✓ |
|
||||
| **dub-co** | Link tracking, attribution | - |
|
||||
| **partnerstack** | Enterprise partner programs | ✓ |
|
||||
|
||||
**Agent recommendation**: Rewardful or Tolt for Stripe-based SaaS. Dub.co for link attribution.
|
||||
**Agent recommendation**: Rewardful or Tolt for Stripe-based SaaS. PartnerStack for enterprise partner programs. Dub.co for link attribution.
|
||||
|
||||
### Email
|
||||
|
||||
@@ -120,8 +165,13 @@ Email marketing, transactional email, and automation platforms.
|
||||
| **sendgrid** | Transactional email at scale | - |
|
||||
| **resend** | Developer-friendly transactional | ✓ |
|
||||
| **kit** | Creator/newsletter focused | - |
|
||||
| **beehiiv** | Newsletter platform | - |
|
||||
| **klaviyo** | E-commerce email + SMS | - |
|
||||
| **postmark** | Deliverability-focused transactional | - |
|
||||
| **brevo** | Email + SMS, popular in EU | - |
|
||||
| **activecampaign** | Email automation + CRM | - |
|
||||
|
||||
**Agent recommendation**: Resend for transactional (dev-friendly). Customer.io for advanced automation. Kit for creators.
|
||||
**Agent recommendation**: Resend for transactional (dev-friendly). Postmark for deliverability. Customer.io for advanced automation. Kit for creators. Beehiiv for newsletters. Klaviyo for e-commerce email/SMS. ActiveCampaign for email + CRM combo.
|
||||
|
||||
### Advertising
|
||||
|
||||
@@ -146,6 +196,187 @@ Workflow automation and integration platforms.
|
||||
|
||||
**Agent recommendation**: Zapier for connecting tools without code.
|
||||
|
||||
### CRO & A/B Testing
|
||||
|
||||
Conversion rate optimization, heatmaps, and experimentation.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **hotjar** | Heatmaps, recordings, surveys | Visual behavior data |
|
||||
| **optimizely** | A/B testing, feature flags | Enterprise experimentation |
|
||||
|
||||
**Agent recommendation**: Hotjar for understanding user behavior. Optimizely for running experiments.
|
||||
|
||||
### Scheduling
|
||||
|
||||
Booking and appointment scheduling tools.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **calendly** | Meeting scheduling, lead gen | Most popular |
|
||||
| **savvycal** | Personalized scheduling | Developer-friendly |
|
||||
|
||||
**Agent recommendation**: Calendly for general use. SavvyCal for personalized booking experiences.
|
||||
|
||||
### Forms & Surveys
|
||||
|
||||
Form builders and survey platforms.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **typeform** | Interactive forms, surveys | Conversational UX |
|
||||
|
||||
**Agent recommendation**: Typeform for engaging forms and surveys.
|
||||
|
||||
### Messaging
|
||||
|
||||
In-app messaging, chat, and customer communication.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **intercom** | In-app messaging, support, product tours | Full customer platform |
|
||||
|
||||
**Agent recommendation**: Intercom for in-app messaging and customer support.
|
||||
|
||||
### Social Media
|
||||
|
||||
Social media scheduling, management, and analytics.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **buffer** | Social scheduling, analytics | Multi-platform |
|
||||
|
||||
**Agent recommendation**: Buffer for scheduling and analytics across social platforms.
|
||||
|
||||
### Video
|
||||
|
||||
Video hosting, analytics, and engagement.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **wistia** | Video hosting, marketing analytics | Best for marketing video |
|
||||
|
||||
**Agent recommendation**: Wistia for marketing video hosting with analytics.
|
||||
|
||||
### Data Enrichment
|
||||
|
||||
Company and person data enrichment for sales and marketing.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **clearbit** | Company/person enrichment | Now HubSpot Breeze |
|
||||
| **apollo** | B2B prospecting, email finding | Large database |
|
||||
| **zoominfo** | B2B contacts, intent data | Enterprise-grade |
|
||||
| **clay** | Waterfall enrichment, outbound | 75+ data providers |
|
||||
|
||||
**Agent recommendation**: Clearbit for enrichment. Apollo for prospecting and outbound. ZoomInfo for enterprise B2B data with intent signals. Clay for waterfall enrichment across multiple providers.
|
||||
|
||||
### Reviews
|
||||
|
||||
Review management and social proof platforms.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **trustpilot** | Consumer business reviews | Most recognized |
|
||||
| **g2** | Software/B2B reviews | Best for SaaS |
|
||||
|
||||
**Agent recommendation**: Trustpilot for consumer products. G2 for B2B software.
|
||||
|
||||
### Push Notifications
|
||||
|
||||
Push notification delivery platforms.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **onesignal** | Multi-channel push notifications | Web + mobile |
|
||||
|
||||
**Agent recommendation**: OneSignal for web and mobile push notifications.
|
||||
|
||||
### Webinar
|
||||
|
||||
Webinar and virtual event platforms.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **demio** | Marketing webinars | Simple, focused |
|
||||
| **livestorm** | Video engagement, webinars | Full event platform |
|
||||
|
||||
**Agent recommendation**: Demio for marketing-focused webinars. Livestorm for full event engagement.
|
||||
|
||||
### Sales Engagement
|
||||
|
||||
Sales engagement and outreach automation platforms.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **outreach** | Enterprise sales engagement | Sequences, tasks, analytics |
|
||||
|
||||
**Agent recommendation**: Outreach for enterprise sales teams managing multi-touch sequences at scale.
|
||||
|
||||
### Product Analytics
|
||||
|
||||
Product analytics, feature adoption tracking, and in-app guidance.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **pendo** | Feature adoption, in-app guides | Product-led growth |
|
||||
|
||||
**Agent recommendation**: Pendo for tracking feature adoption and delivering targeted in-app guidance.
|
||||
|
||||
### Competitive Intelligence
|
||||
|
||||
Traffic analytics, competitor benchmarking, and market research.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **similarweb** | Website traffic, competitor analysis | Traffic sources, keywords |
|
||||
|
||||
**Agent recommendation**: Similarweb for competitor traffic analysis and market benchmarking.
|
||||
|
||||
### AI Content
|
||||
|
||||
AI-powered content generation and optimization platforms.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **airops** | AI content workflows, SEO content | Flow-based automation |
|
||||
|
||||
**Agent recommendation**: AirOps for building AI content workflows that generate SEO-optimized content at scale.
|
||||
|
||||
### Partner Ecosystem
|
||||
|
||||
Partner data sharing, co-sell, and ecosystem management.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **crossbeam** | Account overlaps, co-sell | Now part of Reveal |
|
||||
|
||||
**Agent recommendation**: Crossbeam for identifying partner account overlaps and co-sell opportunities.
|
||||
|
||||
### Email Outreach
|
||||
|
||||
Cold email outreach and email finding tools for link building and sales prospecting.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **hunter** | Email finding, domain search | Largest email database |
|
||||
| **snov** | Email finding, drip campaigns | Built-in sequences |
|
||||
| **lemlist** | Cold email campaigns | Personalization features |
|
||||
| **instantly** | Cold email at scale | Email warmup built-in |
|
||||
|
||||
**Agent recommendation**: Hunter for finding emails. Lemlist or Instantly for sending cold email campaigns. Snov for combined finding + outreach.
|
||||
|
||||
### Data Aggregation
|
||||
|
||||
Marketing data pipeline tools that connect multiple platforms for unified reporting.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **supermetrics** | Cross-platform data pulling | 200+ connectors |
|
||||
| **coupler** | Automated data flows to sheets/BI | Scheduled pipelines |
|
||||
|
||||
**Agent recommendation**: Supermetrics for pulling data from multiple marketing platforms into unified reports. Coupler.io for automated data flows to spreadsheets and BI tools.
|
||||
|
||||
### Commerce & CMS
|
||||
|
||||
E-commerce platforms and content management systems.
|
||||
@@ -160,6 +391,18 @@ E-commerce platforms and content management systems.
|
||||
|
||||
---
|
||||
|
||||
## CLI Tools
|
||||
|
||||
Zero-dependency, single-file Node.js CLIs for tools that don't ship their own. See [`clis/README.md`](clis/README.md) for install instructions and usage.
|
||||
|
||||
All CLIs follow a consistent pattern:
|
||||
- **No dependencies** — Node 18+ only, uses native `fetch`
|
||||
- **JSON output** — pipe to `jq`, save to file, or use in scripts
|
||||
- **Env var auth** — set `{TOOL}_API_KEY` and go
|
||||
- **Consistent commands** — `{tool} <resource> <action> [options]`
|
||||
|
||||
---
|
||||
|
||||
## MCP-Enabled Tools
|
||||
|
||||
These tools have Model Context Protocol servers available, enabling direct agent interaction:
|
||||
@@ -170,6 +413,12 @@ These tools have Model Context Protocol servers available, enabling direct agent
|
||||
- **google-ads** - Ad campaign management
|
||||
- **resend** - Transactional email sending
|
||||
- **zapier** - Workflow automation
|
||||
- **zoominfo** - B2B contacts and intent data
|
||||
- **clay** - Data enrichment and outbound automation
|
||||
- **supermetrics** - Cross-platform marketing data
|
||||
- **coupler** - Marketing data pipelines
|
||||
- **outreach** - Sales engagement sequences
|
||||
- **crossbeam** - Partner ecosystem data
|
||||
|
||||
To use MCP tools, ensure the appropriate MCP server is configured in your environment.
|
||||
|
||||
@@ -189,6 +438,10 @@ To use MCP tools, ensure the appropriate MCP server is configured in your enviro
|
||||
1. Read [customer-io.md](integrations/customer-io.md) for behavior-based automation
|
||||
2. Read [resend.md](integrations/resend.md) for transactional email
|
||||
|
||||
### Running email outreach for backlinks
|
||||
1. Read [hunter.md](integrations/hunter.md) for finding emails
|
||||
2. Read [lemlist.md](integrations/lemlist.md) or [instantly.md](integrations/instantly.md) for sending campaigns
|
||||
|
||||
### Running paid ads
|
||||
1. Read [google-ads.md](integrations/google-ads.md) for search campaigns
|
||||
2. Read [meta-ads.md](integrations/meta-ads.md) for social campaigns
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
# Marketing CLIs
|
||||
|
||||
Zero-dependency, single-file CLI tools for marketing platforms that don't ship their own.
|
||||
|
||||
Every CLI is a standalone Node.js script (Node 18+) with no `npm install` required — just `chmod +x` and go.
|
||||
|
||||
## Install
|
||||
|
||||
### Option 1: Run directly
|
||||
|
||||
```bash
|
||||
node tools/clis/ahrefs.js backlinks list --target example.com
|
||||
```
|
||||
|
||||
### Option 2: Symlink for global access
|
||||
|
||||
```bash
|
||||
# Symlink any CLI you want available globally
|
||||
ln -sf "$(pwd)/tools/clis/ahrefs.js" ~/.local/bin/ahrefs
|
||||
ln -sf "$(pwd)/tools/clis/resend.js" ~/.local/bin/resend
|
||||
|
||||
# Then use directly
|
||||
ahrefs backlinks list --target example.com
|
||||
resend send --from you@example.com --to them@example.com --subject "Hello" --html "<p>Hi</p>"
|
||||
```
|
||||
|
||||
### Option 3: Add the whole directory to PATH
|
||||
|
||||
```bash
|
||||
export PATH="$PATH:/path/to/marketingskills/tools/clis"
|
||||
```
|
||||
|
||||
## Authentication
|
||||
|
||||
Every CLI reads credentials from environment variables:
|
||||
|
||||
| CLI | Environment Variable |
|
||||
|-----|---------------------|
|
||||
| `activecampaign` | `ACTIVECAMPAIGN_API_KEY`, `ACTIVECAMPAIGN_API_URL` |
|
||||
| `adobe-analytics` | `ADOBE_ACCESS_TOKEN`, `ADOBE_CLIENT_ID`, `ADOBE_COMPANY_ID` |
|
||||
| `ahrefs` | `AHREFS_API_KEY` |
|
||||
| `amplitude` | `AMPLITUDE_API_KEY`, `AMPLITUDE_SECRET_KEY` |
|
||||
| `apollo` | `APOLLO_API_KEY` |
|
||||
| `beehiiv` | `BEEHIIV_API_KEY` |
|
||||
| `brevo` | `BREVO_API_KEY` |
|
||||
| `buffer` | `BUFFER_API_KEY` |
|
||||
| `calendly` | `CALENDLY_API_KEY` |
|
||||
| `clearbit` | `CLEARBIT_API_KEY` |
|
||||
| `customer-io` | `CUSTOMERIO_APP_KEY` (App API), `CUSTOMERIO_SITE_ID` + `CUSTOMERIO_API_KEY` (Track API) |
|
||||
| `dataforseo` | `DATAFORSEO_LOGIN`, `DATAFORSEO_PASSWORD` |
|
||||
| `demio` | `DEMIO_API_KEY`, `DEMIO_API_SECRET` |
|
||||
| `dub` | `DUB_API_KEY` |
|
||||
| `g2` | `G2_API_TOKEN` |
|
||||
| `ga4` | `GA4_ACCESS_TOKEN` |
|
||||
| `google-ads` | `GOOGLE_ADS_TOKEN`, `GOOGLE_ADS_DEVELOPER_TOKEN`, `GOOGLE_ADS_CUSTOMER_ID` |
|
||||
| `google-search-console` | `GSC_ACCESS_TOKEN` |
|
||||
| `hotjar` | `HOTJAR_CLIENT_ID`, `HOTJAR_CLIENT_SECRET` |
|
||||
| `intercom` | `INTERCOM_API_KEY` |
|
||||
| `keywords-everywhere` | `KEYWORDS_EVERYWHERE_API_KEY` |
|
||||
| `kit` | `KIT_API_KEY`, `KIT_API_SECRET` |
|
||||
| `klaviyo` | `KLAVIYO_API_KEY` |
|
||||
| `linkedin-ads` | `LINKEDIN_ACCESS_TOKEN` |
|
||||
| `livestorm` | `LIVESTORM_API_TOKEN` |
|
||||
| `mailchimp` | `MAILCHIMP_API_KEY` |
|
||||
| `mention-me` | `MENTIONME_API_KEY` |
|
||||
| `meta-ads` | `META_ACCESS_TOKEN`, `META_AD_ACCOUNT_ID` |
|
||||
| `mixpanel` | `MIXPANEL_TOKEN` (ingestion), `MIXPANEL_API_KEY` + `MIXPANEL_SECRET` (query) |
|
||||
| `onesignal` | `ONESIGNAL_REST_API_KEY`, `ONESIGNAL_APP_ID` |
|
||||
| `optimizely` | `OPTIMIZELY_API_KEY` |
|
||||
| `paddle` | `PADDLE_API_KEY`, `PADDLE_SANDBOX` (optional) |
|
||||
| `partnerstack` | `PARTNERSTACK_PUBLIC_KEY`, `PARTNERSTACK_SECRET_KEY` |
|
||||
| `plausible` | `PLAUSIBLE_API_KEY`, `PLAUSIBLE_BASE_URL` (optional, for self-hosted) |
|
||||
| `postmark` | `POSTMARK_API_KEY` |
|
||||
| `resend` | `RESEND_API_KEY` |
|
||||
| `rewardful` | `REWARDFUL_API_KEY` |
|
||||
| `savvycal` | `SAVVYCAL_API_KEY` |
|
||||
| `segment` | `SEGMENT_WRITE_KEY` (tracking), `SEGMENT_ACCESS_TOKEN` (profile) |
|
||||
| `semrush` | `SEMRUSH_API_KEY` |
|
||||
| `sendgrid` | `SENDGRID_API_KEY` |
|
||||
| `tiktok-ads` | `TIKTOK_ACCESS_TOKEN`, `TIKTOK_ADVERTISER_ID` |
|
||||
| `tolt` | `TOLT_API_KEY` |
|
||||
| `trustpilot` | `TRUSTPILOT_API_KEY`, `TRUSTPILOT_API_SECRET`, `TRUSTPILOT_BUSINESS_UNIT_ID` |
|
||||
| `typeform` | `TYPEFORM_API_KEY` |
|
||||
| `hunter` | `HUNTER_API_KEY` |
|
||||
| `instantly` | `INSTANTLY_API_KEY` |
|
||||
| `lemlist` | `LEMLIST_API_KEY` |
|
||||
| `snov` | `SNOV_CLIENT_ID`, `SNOV_CLIENT_SECRET` |
|
||||
| `wistia` | `WISTIA_API_KEY` |
|
||||
| `zapier` | `ZAPIER_API_KEY` |
|
||||
|
||||
## Security
|
||||
|
||||
**Never hardcode API keys or tokens in scripts.** All CLIs read credentials exclusively from environment variables.
|
||||
|
||||
- Store keys in your shell profile (`~/.zshrc`, `~/.bashrc`) or a `.env` file
|
||||
- The `.env` file is gitignored — but double-check before committing
|
||||
- Use `--dry-run` on any command to preview the request without sending it (credentials are masked as `***`)
|
||||
- If you fork this repo, audit your commits to ensure no secrets are included
|
||||
|
||||
## Command Pattern
|
||||
|
||||
All CLIs follow the same structure:
|
||||
|
||||
```
|
||||
{tool} <resource> <action> [options]
|
||||
```
|
||||
|
||||
Examples:
|
||||
|
||||
```bash
|
||||
ahrefs backlinks list --target example.com --limit 50
|
||||
semrush keywords overview --phrase "marketing automation" --database us
|
||||
mailchimp campaigns list --limit 20
|
||||
resend send --from you@example.com --to them@example.com --subject "Hello" --html "<p>Hi</p>"
|
||||
dub links create --url https://example.com/landing --key summer-sale
|
||||
```
|
||||
|
||||
## Output
|
||||
|
||||
All CLIs output JSON to stdout for easy piping:
|
||||
|
||||
```bash
|
||||
# Pipe to jq
|
||||
ahrefs backlinks list --target example.com | jq '.backlinks[].url_from'
|
||||
|
||||
# Save to file
|
||||
semrush keywords overview --phrase "saas marketing" --database us > keywords.json
|
||||
|
||||
# Use in scripts
|
||||
DOMAINS=$(rewardful affiliates list | jq -r '.data[].email')
|
||||
```
|
||||
|
||||
## Available CLIs
|
||||
|
||||
| CLI | Category | Tool |
|
||||
|-----|----------|------|
|
||||
| `activecampaign.js` | Email/CRM | [ActiveCampaign](https://activecampaign.com) |
|
||||
| `adobe-analytics.js` | Analytics | [Adobe Analytics](https://business.adobe.com/products/analytics) |
|
||||
| `ahrefs.js` | SEO | [Ahrefs](https://ahrefs.com) |
|
||||
| `amplitude.js` | Analytics | [Amplitude](https://amplitude.com) |
|
||||
| `apollo.js` | Data Enrichment | [Apollo.io](https://apollo.io) |
|
||||
| `beehiiv.js` | Newsletter | [Beehiiv](https://beehiiv.com) |
|
||||
| `brevo.js` | Email/SMS | [Brevo](https://brevo.com) |
|
||||
| `buffer.js` | Social | [Buffer](https://buffer.com) |
|
||||
| `calendly.js` | Scheduling | [Calendly](https://calendly.com) |
|
||||
| `clearbit.js` | Data Enrichment | [Clearbit](https://clearbit.com) |
|
||||
| `customer-io.js` | Email | [Customer.io](https://customer.io) |
|
||||
| `dataforseo.js` | SEO | [DataForSEO](https://dataforseo.com) |
|
||||
| `demio.js` | Webinar | [Demio](https://demio.com) |
|
||||
| `dub.js` | Links | [Dub.co](https://dub.co) |
|
||||
| `g2.js` | Reviews | [G2](https://g2.com) |
|
||||
| `ga4.js` | Analytics | [Google Analytics 4](https://analytics.google.com) |
|
||||
| `google-ads.js` | Ads | [Google Ads](https://ads.google.com) |
|
||||
| `google-search-console.js` | SEO | [Google Search Console](https://search.google.com/search-console) |
|
||||
| `hotjar.js` | CRO | [Hotjar](https://hotjar.com) |
|
||||
| `hunter.js` | Email Outreach | [Hunter.io](https://hunter.io) |
|
||||
| `instantly.js` | Email Outreach | [Instantly.ai](https://instantly.ai) |
|
||||
| `intercom.js` | Messaging | [Intercom](https://intercom.com) |
|
||||
| `keywords-everywhere.js` | SEO | [Keywords Everywhere](https://keywordseverywhere.com) |
|
||||
| `kit.js` | Email | [Kit](https://kit.com) |
|
||||
| `klaviyo.js` | Email/SMS | [Klaviyo](https://klaviyo.com) |
|
||||
| `lemlist.js` | Email Outreach | [Lemlist](https://lemlist.com) |
|
||||
| `linkedin-ads.js` | Ads | [LinkedIn Ads](https://business.linkedin.com/marketing-solutions/ads) |
|
||||
| `livestorm.js` | Webinar | [Livestorm](https://livestorm.co) |
|
||||
| `mailchimp.js` | Email | [Mailchimp](https://mailchimp.com) |
|
||||
| `mention-me.js` | Referral | [Mention Me](https://www.mention-me.com) |
|
||||
| `meta-ads.js` | Ads | [Meta Ads](https://www.facebook.com/business/ads) |
|
||||
| `mixpanel.js` | Analytics | [Mixpanel](https://mixpanel.com) |
|
||||
| `onesignal.js` | Push | [OneSignal](https://onesignal.com) |
|
||||
| `optimizely.js` | A/B Testing | [Optimizely](https://optimizely.com) |
|
||||
| `paddle.js` | Payments | [Paddle](https://paddle.com) |
|
||||
| `partnerstack.js` | Affiliate | [PartnerStack](https://partnerstack.com) |
|
||||
| `plausible.js` | Analytics | [Plausible](https://plausible.io) |
|
||||
| `postmark.js` | Email | [Postmark](https://postmarkapp.com) |
|
||||
| `resend.js` | Email | [Resend](https://resend.com) |
|
||||
| `rewardful.js` | Referral | [Rewardful](https://www.getrewardful.com) |
|
||||
| `savvycal.js` | Scheduling | [SavvyCal](https://savvycal.com) |
|
||||
| `segment.js` | Analytics | [Segment](https://segment.com) |
|
||||
| `semrush.js` | SEO | [SEMrush](https://semrush.com) |
|
||||
| `sendgrid.js` | Email | [SendGrid](https://sendgrid.com) |
|
||||
| `snov.js` | Email Outreach | [Snov.io](https://snov.io) |
|
||||
| `tiktok-ads.js` | Ads | [TikTok Ads](https://ads.tiktok.com) |
|
||||
| `tolt.js` | Referral | [Tolt](https://tolt.io) |
|
||||
| `trustpilot.js` | Reviews | [Trustpilot](https://trustpilot.com) |
|
||||
| `typeform.js` | Forms | [Typeform](https://typeform.com) |
|
||||
| `wistia.js` | Video | [Wistia](https://wistia.com) |
|
||||
| `zapier.js` | Automation | [Zapier](https://zapier.com) |
|
||||
Executable
+435
@@ -0,0 +1,435 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.ACTIVECAMPAIGN_API_KEY
|
||||
const API_URL = process.env.ACTIVECAMPAIGN_API_URL
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'ACTIVECAMPAIGN_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
if (!API_URL) {
|
||||
console.error(JSON.stringify({ error: 'ACTIVECAMPAIGN_API_URL environment variable required (e.g. https://yourname.api-us1.com)' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const BASE_URL = `${API_URL.replace(/\/$/, '')}/api/3`
|
||||
|
||||
async function api(method, path, body) {
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Api-Token': '***', 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: {
|
||||
'Api-Token': API_KEY,
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
},
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
function parseArgs(args) {
|
||||
const result = { _: [] }
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i]
|
||||
if (arg.startsWith('--')) {
|
||||
const key = arg.slice(2)
|
||||
const next = args[i + 1]
|
||||
if (next && !next.startsWith('--')) {
|
||||
result[key] = next
|
||||
i++
|
||||
} else {
|
||||
result[key] = true
|
||||
}
|
||||
} else {
|
||||
result._.push(arg)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const args = parseArgs(process.argv.slice(2))
|
||||
const [cmd, sub, ...rest] = args._
|
||||
|
||||
async function main() {
|
||||
let result
|
||||
const limit = args.limit ? Number(args.limit) : 20
|
||||
const offset = args.offset ? Number(args.offset) : 0
|
||||
|
||||
switch (cmd) {
|
||||
case 'contacts':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
if (args.email) params.set('email', args.email)
|
||||
if (args.search) params.set('search', args.search)
|
||||
if (args['list-id']) params.set('listid', args['list-id'])
|
||||
if (args.status) params.set('status', args.status)
|
||||
result = await api('GET', `/contacts?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/contacts/${id}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const email = args.email
|
||||
if (!email) { result = { error: '--email required' }; break }
|
||||
const contact = { email }
|
||||
if (args['first-name']) contact.firstName = args['first-name']
|
||||
if (args['last-name']) contact.lastName = args['last-name']
|
||||
if (args.phone) contact.phone = args.phone
|
||||
result = await api('POST', '/contacts', { contact })
|
||||
break
|
||||
}
|
||||
case 'update': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
const contact = {}
|
||||
if (args.email) contact.email = args.email
|
||||
if (args['first-name']) contact.firstName = args['first-name']
|
||||
if (args['last-name']) contact.lastName = args['last-name']
|
||||
if (args.phone) contact.phone = args.phone
|
||||
result = await api('PUT', `/contacts/${id}`, { contact })
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/contacts/${id}`)
|
||||
break
|
||||
}
|
||||
case 'sync': {
|
||||
const email = args.email
|
||||
if (!email) { result = { error: '--email required' }; break }
|
||||
const contact = { email }
|
||||
if (args['first-name']) contact.firstName = args['first-name']
|
||||
if (args['last-name']) contact.lastName = args['last-name']
|
||||
if (args.phone) contact.phone = args.phone
|
||||
result = await api('POST', '/contact/sync', { contact })
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown contacts subcommand. Use: list, get, create, update, delete, sync' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'lists':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
result = await api('GET', `/lists?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/lists/${id}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const name = args.name
|
||||
if (!name) { result = { error: '--name required' }; break }
|
||||
const list = { name }
|
||||
if (args['string-id']) list.stringid = args['string-id']
|
||||
if (args['sender-url']) list.sender_url = args['sender-url']
|
||||
if (args['sender-reminder']) list.sender_reminder = args['sender-reminder']
|
||||
result = await api('POST', '/lists', { list })
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/lists/${id}`)
|
||||
break
|
||||
}
|
||||
case 'subscribe': {
|
||||
const listId = args['list-id'] || args.id
|
||||
const contactId = args['contact-id']
|
||||
if (!listId) { result = { error: '--list-id required' }; break }
|
||||
if (!contactId) { result = { error: '--contact-id required' }; break }
|
||||
result = await api('POST', '/contactLists', {
|
||||
contactList: { list: listId, contact: contactId, status: 1 }
|
||||
})
|
||||
break
|
||||
}
|
||||
case 'unsubscribe': {
|
||||
const listId = args['list-id'] || args.id
|
||||
const contactId = args['contact-id']
|
||||
if (!listId) { result = { error: '--list-id required' }; break }
|
||||
if (!contactId) { result = { error: '--contact-id required' }; break }
|
||||
result = await api('POST', '/contactLists', {
|
||||
contactList: { list: listId, contact: contactId, status: 2 }
|
||||
})
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown lists subcommand. Use: list, get, create, delete, subscribe, unsubscribe' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'campaigns':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
result = await api('GET', `/campaigns?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/campaigns/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown campaigns subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'deals':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
if (args.search) params.set('search', args.search)
|
||||
if (args.stage) params.set('filters[stage]', args.stage)
|
||||
if (args.owner) params.set('filters[owner]', args.owner)
|
||||
result = await api('GET', `/deals?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/deals/${id}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const title = args.title
|
||||
if (!title) { result = { error: '--title required' }; break }
|
||||
const deal = { title }
|
||||
if (args.value) deal.value = Number(args.value)
|
||||
if (args.currency) deal.currency = args.currency
|
||||
if (args.pipeline) deal.group = args.pipeline
|
||||
if (args.stage) deal.stage = args.stage
|
||||
if (args.owner) deal.owner = args.owner
|
||||
if (args['contact-id']) deal.contact = args['contact-id']
|
||||
result = await api('POST', '/deals', { deal })
|
||||
break
|
||||
}
|
||||
case 'update': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
const deal = {}
|
||||
if (args.title) deal.title = args.title
|
||||
if (args.value) deal.value = Number(args.value)
|
||||
if (args.stage) deal.stage = args.stage
|
||||
if (args.owner) deal.owner = args.owner
|
||||
if (args.status) deal.status = Number(args.status)
|
||||
result = await api('PUT', `/deals/${id}`, { deal })
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/deals/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown deals subcommand. Use: list, get, create, update, delete' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'automations':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
result = await api('GET', `/automations?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/automations/${id}`)
|
||||
break
|
||||
}
|
||||
case 'add-contact': {
|
||||
const automationId = args.id
|
||||
const contactId = args['contact-id']
|
||||
if (!automationId) { result = { error: '--id required (automation ID)' }; break }
|
||||
if (!contactId) { result = { error: '--contact-id required (contact ID, not email)' }; break }
|
||||
result = await api('POST', '/contactAutomations', {
|
||||
contactAutomation: { contact: contactId, automation: automationId }
|
||||
})
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown automations subcommand. Use: list, get, add-contact' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'tags':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
if (args.search) params.set('search', args.search)
|
||||
result = await api('GET', `/tags?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/tags/${id}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const name = args.name
|
||||
if (!name) { result = { error: '--name required' }; break }
|
||||
result = await api('POST', '/tags', {
|
||||
tag: { tag: name, tagType: args.type || 'contact' }
|
||||
})
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/tags/${id}`)
|
||||
break
|
||||
}
|
||||
case 'add-to-contact': {
|
||||
const tagId = args['tag-id']
|
||||
const contactId = args['contact-id']
|
||||
if (!tagId) { result = { error: '--tag-id required' }; break }
|
||||
if (!contactId) { result = { error: '--contact-id required' }; break }
|
||||
result = await api('POST', '/contactTags', {
|
||||
contactTag: { contact: contactId, tag: tagId }
|
||||
})
|
||||
break
|
||||
}
|
||||
case 'remove-from-contact': {
|
||||
const contactTagId = args.id
|
||||
if (!contactTagId) { result = { error: '--id required (contactTag ID)' }; break }
|
||||
result = await api('DELETE', `/contactTags/${contactTagId}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown tags subcommand. Use: list, get, create, delete, add-to-contact, remove-from-contact' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'pipelines':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
result = await api('GET', `/dealGroups?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/dealGroups/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown pipelines subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'webhooks':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
params.set('offset', String(offset))
|
||||
result = await api('GET', `/webhooks?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/webhooks/${id}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const name = args.name
|
||||
const url = args.url
|
||||
if (!name) { result = { error: '--name required' }; break }
|
||||
if (!url) { result = { error: '--url required' }; break }
|
||||
const events = args.events?.split(',') || ['subscribe']
|
||||
const sources = args.sources?.split(',') || ['public', 'admin', 'api', 'system']
|
||||
result = await api('POST', '/webhooks', {
|
||||
webhook: { name, url, events, sources }
|
||||
})
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/webhooks/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown webhooks subcommand. Use: list, get, create, delete' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'users':
|
||||
switch (sub) {
|
||||
case 'me':
|
||||
result = await api('GET', '/users/me')
|
||||
break
|
||||
case 'list':
|
||||
result = await api('GET', '/users')
|
||||
break
|
||||
default:
|
||||
result = { error: 'Unknown users subcommand. Use: me, list' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
contacts: 'contacts [list | get --id <id> | create --email <email> | update --id <id> | delete --id <id> | sync --email <email>]',
|
||||
lists: 'lists [list | get --id <id> | create --name <name> | delete --id <id> | subscribe --list-id <lid> --contact-id <cid> | unsubscribe --list-id <lid> --contact-id <cid>]',
|
||||
campaigns: 'campaigns [list | get --id <id>]',
|
||||
deals: 'deals [list | get --id <id> | create --title <title> | update --id <id> | delete --id <id>]',
|
||||
automations: 'automations [list | get --id <id> | add-contact --id <aid> --email <email>]',
|
||||
tags: 'tags [list | get --id <id> | create --name <name> | delete --id <id> | add-to-contact --tag-id <tid> --contact-id <cid>]',
|
||||
pipelines: 'pipelines [list | get --id <id>]',
|
||||
webhooks: 'webhooks [list | get --id <id> | create --name <name> --url <url> | delete --id <id>]',
|
||||
users: 'users [me | list]',
|
||||
options: '--limit <n> --offset <n> --search <query> --email <email>',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+161
@@ -0,0 +1,161 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const ACCESS_TOKEN = process.env.ADOBE_ACCESS_TOKEN
|
||||
const CLIENT_ID = process.env.ADOBE_CLIENT_ID
|
||||
const COMPANY_ID = process.env.ADOBE_COMPANY_ID
|
||||
|
||||
if (!ACCESS_TOKEN || !CLIENT_ID || !COMPANY_ID) {
|
||||
console.error(JSON.stringify({ error: 'ADOBE_ACCESS_TOKEN, ADOBE_CLIENT_ID, and ADOBE_COMPANY_ID environment variables required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const BASE_URL = `https://analytics.adobe.io/api/${COMPANY_ID}`
|
||||
|
||||
async function api(method, path, body) {
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Authorization': '***', 'x-api-key': '***', 'x-proxy-global-company-id': COMPANY_ID, 'Content-Type': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${ACCESS_TOKEN}`,
|
||||
'x-api-key': CLIENT_ID,
|
||||
'x-proxy-global-company-id': COMPANY_ID,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
function parseArgs(args) {
|
||||
const result = { _: [] }
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i]
|
||||
if (arg.startsWith('--')) {
|
||||
const key = arg.slice(2)
|
||||
const next = args[i + 1]
|
||||
if (next && !next.startsWith('--')) {
|
||||
result[key] = next
|
||||
i++
|
||||
} else {
|
||||
result[key] = true
|
||||
}
|
||||
} else {
|
||||
result._.push(arg)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const args = parseArgs(process.argv.slice(2))
|
||||
const [cmd, sub, ...rest] = args._
|
||||
|
||||
async function main() {
|
||||
let result
|
||||
|
||||
switch (cmd) {
|
||||
case 'reportsuites':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/reportsuites')
|
||||
break
|
||||
default:
|
||||
result = { error: 'Unknown reportsuites subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'dimensions':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!args.rsid) { result = { error: '--rsid required' }; break }
|
||||
const params = new URLSearchParams()
|
||||
params.set('rsid', args.rsid)
|
||||
result = await api('GET', `/dimensions?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown dimensions subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'metrics':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!args.rsid) { result = { error: '--rsid required' }; break }
|
||||
const params = new URLSearchParams()
|
||||
params.set('rsid', args.rsid)
|
||||
result = await api('GET', `/metrics?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown metrics subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'reports':
|
||||
switch (sub) {
|
||||
case 'run': {
|
||||
if (!args.rsid) { result = { error: '--rsid required' }; break }
|
||||
if (!args['start-date']) { result = { error: '--start-date required' }; break }
|
||||
if (!args['end-date']) { result = { error: '--end-date required' }; break }
|
||||
if (!args.metrics) { result = { error: '--metrics required (comma-separated)' }; break }
|
||||
const body = {
|
||||
rsid: args.rsid,
|
||||
globalFilters: [{
|
||||
type: 'dateRange',
|
||||
dateRange: `${args['start-date']}T00:00:00/${args['end-date']}T23:59:59`,
|
||||
}],
|
||||
metricContainer: {
|
||||
metrics: args.metrics.split(',').map(m => ({ id: m.trim() })),
|
||||
},
|
||||
}
|
||||
if (args.dimension) {
|
||||
body.dimension = args.dimension
|
||||
}
|
||||
result = await api('POST', '/reports', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown reports subcommand. Use: run' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'segments':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args.rsid) params.set('rsid', args.rsid)
|
||||
result = await api('GET', `/segments?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown segments subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
reportsuites: 'reportsuites list',
|
||||
dimensions: 'dimensions list --rsid <report_suite_id>',
|
||||
metrics: 'metrics list --rsid <report_suite_id>',
|
||||
reports: 'reports run --rsid <report_suite_id> --start-date <YYYY-MM-DD> --end-date <YYYY-MM-DD> --metrics <metrics> [--dimension <dimension>]',
|
||||
segments: 'segments list [--rsid <report_suite_id>]',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+192
@@ -0,0 +1,192 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.AHREFS_API_KEY
|
||||
const BASE_URL = 'https://api.ahrefs.com/v3'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'AHREFS_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function api(method, path) {
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Authorization': '***', 'Content-Type': 'application/json' } }
|
||||
}
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${API_KEY}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
function parseArgs(args) {
|
||||
const result = { _: [] }
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i]
|
||||
if (arg.startsWith('--')) {
|
||||
const key = arg.slice(2)
|
||||
const next = args[i + 1]
|
||||
if (next && !next.startsWith('--')) {
|
||||
result[key] = next
|
||||
i++
|
||||
} else {
|
||||
result[key] = true
|
||||
}
|
||||
} else {
|
||||
result._.push(arg)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const args = parseArgs(process.argv.slice(2))
|
||||
const [cmd, sub, ...rest] = args._
|
||||
|
||||
async function main() {
|
||||
let result
|
||||
const mode = args.mode || 'domain'
|
||||
|
||||
switch (cmd) {
|
||||
case 'domain-rating':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
if (!args.target) { result = { error: '--target required (domain)' }; break }
|
||||
const params = new URLSearchParams({ target: args.target })
|
||||
result = await api('GET', `/site-explorer/domain-rating?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown domain-rating subcommand. Use: get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'backlinks':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!args.target) { result = { error: '--target required (domain or URL)' }; break }
|
||||
const params = new URLSearchParams({ target: args.target, mode })
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
result = await api('GET', `/site-explorer/backlinks?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown backlinks subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'refdomains':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!args.target) { result = { error: '--target required (domain or URL)' }; break }
|
||||
const params = new URLSearchParams({ target: args.target, mode })
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
result = await api('GET', `/site-explorer/refdomains?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown refdomains subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'keywords':
|
||||
switch (sub) {
|
||||
case 'organic': {
|
||||
if (!args.target) { result = { error: '--target required (domain or URL)' }; break }
|
||||
const params = new URLSearchParams({ target: args.target, mode })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
result = await api('GET', `/site-explorer/organic-keywords?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown keywords subcommand. Use: organic' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'top-pages':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!args.target) { result = { error: '--target required (domain or URL)' }; break }
|
||||
const params = new URLSearchParams({ target: args.target, mode })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
result = await api('GET', `/site-explorer/top-pages?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown top-pages subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'keyword-overview':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
const params = new URLSearchParams({ keywords: args.keywords })
|
||||
if (args.country) params.set('country', args.country)
|
||||
result = await api('GET', `/keywords-explorer/overview?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown keyword-overview subcommand. Use: get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'keyword-suggestions':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
const params = new URLSearchParams({ keyword: args.keyword })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
result = await api('GET', `/keywords-explorer/matching-terms?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown keyword-suggestions subcommand. Use: get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'serp':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
const params = new URLSearchParams({ keyword: args.keyword })
|
||||
if (args.country) params.set('country', args.country)
|
||||
result = await api('GET', `/keywords-explorer/serp-overview?${params}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown serp subcommand. Use: get' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
'domain-rating': 'domain-rating get --target <domain>',
|
||||
'backlinks': 'backlinks list --target <domain> [--mode <mode>] [--limit <n>]',
|
||||
'refdomains': 'refdomains list --target <domain> [--mode <mode>] [--limit <n>]',
|
||||
'keywords': 'keywords organic --target <domain> [--country <cc>] [--limit <n>]',
|
||||
'top-pages': 'top-pages list --target <domain> [--country <cc>] [--limit <n>]',
|
||||
'keyword-overview': 'keyword-overview get --keywords <kw1,kw2> [--country <cc>]',
|
||||
'keyword-suggestions': 'keyword-suggestions get --keyword <keyword> [--country <cc>] [--limit <n>]',
|
||||
'serp': 'serp get --keyword <keyword> [--country <cc>]',
|
||||
'modes': 'domain (default), subdomains, prefix, exact',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+163
@@ -0,0 +1,163 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.AIROPS_API_KEY
|
||||
const WORKSPACE_ID = process.env.AIROPS_WORKSPACE_ID
|
||||
const BASE_URL = 'https://api.airops.com/public_api/v1'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'AIROPS_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
if (!WORKSPACE_ID) {
|
||||
console.error(JSON.stringify({ error: 'AIROPS_WORKSPACE_ID environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function api(method, path, body) {
|
||||
const url = `${BASE_URL}${path}`
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url, headers: { 'Authorization': 'Bearer ***', 'Content-Type': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(url, {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${API_KEY}`,
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
},
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
function parseArgs(args) {
|
||||
const result = { _: [] }
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i]
|
||||
if (arg.startsWith('--')) {
|
||||
const key = arg.slice(2)
|
||||
const next = args[i + 1]
|
||||
if (next && !next.startsWith('--')) {
|
||||
result[key] = next
|
||||
i++
|
||||
} else {
|
||||
result[key] = true
|
||||
}
|
||||
} else {
|
||||
result._.push(arg)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const args = parseArgs(process.argv.slice(2))
|
||||
const [cmd, sub, ...rest] = args._
|
||||
|
||||
async function main() {
|
||||
let result
|
||||
|
||||
switch (cmd) {
|
||||
case 'flows':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', `/workspaces/${WORKSPACE_ID}/flows`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/workspaces/${WORKSPACE_ID}/flows/${id}`)
|
||||
break
|
||||
}
|
||||
case 'execute': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
const inputs = args.inputs
|
||||
let parsedInputs = {}
|
||||
if (inputs) {
|
||||
try {
|
||||
parsedInputs = JSON.parse(inputs)
|
||||
} catch {
|
||||
result = { error: '--inputs must be valid JSON' }
|
||||
break
|
||||
}
|
||||
}
|
||||
result = await api('POST', `/workspaces/${WORKSPACE_ID}/flows/${id}/execute`, { inputs: parsedInputs })
|
||||
break
|
||||
}
|
||||
case 'runs': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/workspaces/${WORKSPACE_ID}/flows/${id}/runs`)
|
||||
break
|
||||
}
|
||||
case 'run-status': {
|
||||
const runId = args['run-id']
|
||||
if (!runId) { result = { error: '--run-id required' }; break }
|
||||
result = await api('GET', `/workspaces/${WORKSPACE_ID}/runs/${runId}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown flows subcommand. Use: list, get, execute, runs, run-status' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'workflows':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', `/workspaces/${WORKSPACE_ID}/workflows`)
|
||||
break
|
||||
}
|
||||
case 'execute': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
const inputs = args.inputs
|
||||
let parsedInputs = {}
|
||||
if (inputs) {
|
||||
try {
|
||||
parsedInputs = JSON.parse(inputs)
|
||||
} catch {
|
||||
result = { error: '--inputs must be valid JSON' }
|
||||
break
|
||||
}
|
||||
}
|
||||
result = await api('POST', `/workspaces/${WORKSPACE_ID}/workflows/${id}/execute`, { inputs: parsedInputs })
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown workflows subcommand. Use: list, execute' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
flows: {
|
||||
list: 'flows list',
|
||||
get: 'flows get --id <id>',
|
||||
execute: 'flows execute --id <id> --inputs <json>',
|
||||
runs: 'flows runs --id <id>',
|
||||
'run-status': 'flows run-status --run-id <id>',
|
||||
},
|
||||
workflows: {
|
||||
list: 'workflows list',
|
||||
execute: 'workflows execute --id <id> --inputs <json>',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+182
@@ -0,0 +1,182 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.AMPLITUDE_API_KEY
|
||||
const SECRET_KEY = process.env.AMPLITUDE_SECRET_KEY
|
||||
const INGESTION_URL = 'https://api2.amplitude.com'
|
||||
const QUERY_URL = 'https://amplitude.com/api/2'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'AMPLITUDE_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function ingestApi(method, path, body) {
|
||||
if (args['dry-run']) {
|
||||
const maskedBody = body ? JSON.parse(JSON.stringify(body)) : undefined
|
||||
if (maskedBody && maskedBody.api_key) maskedBody.api_key = '***'
|
||||
return { _dry_run: true, method, url: `${INGESTION_URL}${path}`, headers: { 'Content-Type': 'application/json' }, body: maskedBody }
|
||||
}
|
||||
const res = await fetch(`${INGESTION_URL}${path}`, {
|
||||
method,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
async function queryApi(method, path, params) {
|
||||
if (!SECRET_KEY) {
|
||||
return { error: 'AMPLITUDE_SECRET_KEY required for query/export operations' }
|
||||
}
|
||||
const url = params ? `${QUERY_URL}${path}?${params}` : `${QUERY_URL}${path}`
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url, headers: { 'Authorization': '***', 'Content-Type': 'application/json' } }
|
||||
}
|
||||
const auth = Buffer.from(`${API_KEY}:${SECRET_KEY}`).toString('base64')
|
||||
const res = await fetch(url, {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
function parseArgs(args) {
|
||||
const result = { _: [] }
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i]
|
||||
if (arg.startsWith('--')) {
|
||||
const key = arg.slice(2)
|
||||
const next = args[i + 1]
|
||||
if (next && !next.startsWith('--')) {
|
||||
result[key] = next
|
||||
i++
|
||||
} else {
|
||||
result[key] = true
|
||||
}
|
||||
} else {
|
||||
result._.push(arg)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const args = parseArgs(process.argv.slice(2))
|
||||
const [cmd, sub, ...rest] = args._
|
||||
|
||||
async function main() {
|
||||
let result
|
||||
|
||||
switch (cmd) {
|
||||
case 'track':
|
||||
switch (sub) {
|
||||
case 'event': {
|
||||
if (!args['user-id']) { result = { error: '--user-id required' }; break }
|
||||
if (!args['event-type']) { result = { error: '--event-type required' }; break }
|
||||
const event = {
|
||||
user_id: args['user-id'],
|
||||
event_type: args['event-type'],
|
||||
}
|
||||
if (args.properties) {
|
||||
event.event_properties = JSON.parse(args.properties)
|
||||
}
|
||||
result = await ingestApi('POST', '/2/httpapi', {
|
||||
api_key: API_KEY,
|
||||
events: [event],
|
||||
})
|
||||
break
|
||||
}
|
||||
case 'batch': {
|
||||
if (!args.events) { result = { error: '--events required (JSON array)' }; break }
|
||||
const events = JSON.parse(args.events)
|
||||
result = await ingestApi('POST', '/batch', {
|
||||
api_key: API_KEY,
|
||||
events,
|
||||
})
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown track subcommand. Use: event, batch' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'users':
|
||||
switch (sub) {
|
||||
case 'activity': {
|
||||
if (!args['user-id']) { result = { error: '--user-id required' }; break }
|
||||
const params = new URLSearchParams()
|
||||
params.set('user', args['user-id'])
|
||||
result = await queryApi('GET', '/useractivity', params)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown users subcommand. Use: activity' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'export':
|
||||
switch (sub) {
|
||||
case 'events': {
|
||||
if (!args.start) { result = { error: '--start required (e.g. 20240101T00)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (e.g. 20240131T23)' }; break }
|
||||
const params = new URLSearchParams()
|
||||
params.set('start', args.start)
|
||||
params.set('end', args.end)
|
||||
result = await queryApi('GET', '/export', params)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown export subcommand. Use: events' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'retention':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
if (!args.start) { result = { error: '--start required (e.g. 20240101)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (e.g. 20240131)' }; break }
|
||||
const params = new URLSearchParams()
|
||||
params.set('start', args.start)
|
||||
params.set('end', args.end)
|
||||
if (args.event) {
|
||||
params.set('e', JSON.stringify([{ event_type: args.event }]))
|
||||
}
|
||||
result = await queryApi('GET', '/retention', params)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown retention subcommand. Use: get' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
track: 'track [event --user-id <id> --event-type <type> [--properties <json>] | batch --events <json>]',
|
||||
users: 'users activity --user-id <id>',
|
||||
export: 'export events --start <YYYYMMDDThh> --end <YYYYMMDDThh>',
|
||||
retention: 'retention get --start <YYYYMMDD> --end <YYYYMMDD> [--event <type>]',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+142
@@ -0,0 +1,142 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.APOLLO_API_KEY
|
||||
const BASE_URL = 'https://api.apollo.io/api/v1'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'APOLLO_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function api(method, path, body) {
|
||||
const authBody = body ? { ...body, api_key: API_KEY } : { api_key: API_KEY }
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Content-Type': 'application/json' }, body: { ...authBody, api_key: '***' } }
|
||||
}
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(authBody),
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
function parseArgs(args) {
|
||||
const result = { _: [] }
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i]
|
||||
if (arg.startsWith('--')) {
|
||||
const key = arg.slice(2)
|
||||
const next = args[i + 1]
|
||||
if (next && !next.startsWith('--')) {
|
||||
result[key] = next
|
||||
i++
|
||||
} else {
|
||||
result[key] = true
|
||||
}
|
||||
} else {
|
||||
result._.push(arg)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const args = parseArgs(process.argv.slice(2))
|
||||
const [cmd, sub, ...rest] = args._
|
||||
|
||||
async function main() {
|
||||
let result
|
||||
const page = args.page ? Number(args.page) : 1
|
||||
const perPage = args['per-page'] ? Number(args['per-page']) : 25
|
||||
|
||||
switch (cmd) {
|
||||
case 'people':
|
||||
switch (sub) {
|
||||
case 'search': {
|
||||
const body = { page, per_page: perPage }
|
||||
if (args.titles) body.person_titles = args.titles.split(',')
|
||||
if (args.locations) body.person_locations = args.locations.split(',')
|
||||
if (args.seniorities) body.person_seniorities = args.seniorities.split(',')
|
||||
if (args['employee-ranges']) body.organization_num_employees_ranges = args['employee-ranges'].split(',').map(r => r.trim())
|
||||
if (args.keywords) body.q_keywords = args.keywords
|
||||
result = await api('POST', '/mixed_people/search', body)
|
||||
break
|
||||
}
|
||||
case 'enrich': {
|
||||
const body = {}
|
||||
if (args.email) body.email = args.email
|
||||
if (args['first-name']) body.first_name = args['first-name']
|
||||
if (args['last-name']) body.last_name = args['last-name']
|
||||
if (args.domain) body.domain = args.domain
|
||||
if (args.linkedin) body.linkedin_url = args.linkedin
|
||||
if (!args.email && !args.linkedin && !(args['first-name'] && args.domain)) {
|
||||
result = { error: '--email, --linkedin, or --first-name + --domain required' }
|
||||
break
|
||||
}
|
||||
result = await api('POST', '/people/match', body)
|
||||
break
|
||||
}
|
||||
case 'bulk-enrich': {
|
||||
const emails = args.emails?.split(',')
|
||||
if (!emails) { result = { error: '--emails required (comma-separated)' }; break }
|
||||
const details = emails.map(email => ({ email: email.trim() }))
|
||||
result = await api('POST', '/people/bulk_match', { details })
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown people subcommand. Use: search, enrich, bulk-enrich' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'organizations':
|
||||
switch (sub) {
|
||||
case 'search': {
|
||||
const body = { page, per_page: perPage }
|
||||
if (args.locations) body.organization_locations = args.locations.split(',')
|
||||
if (args['employee-ranges']) body.organization_num_employees_ranges = args['employee-ranges'].split(',').map(r => r.trim())
|
||||
if (args.keywords) body.q_keywords = args.keywords
|
||||
result = await api('POST', '/mixed_companies/search', body)
|
||||
break
|
||||
}
|
||||
case 'enrich': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
result = await api('POST', '/organizations/enrich', { domain })
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown organizations subcommand. Use: search, enrich' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
people: {
|
||||
search: 'people search [--titles <t1,t2>] [--locations <l1,l2>] [--seniorities <s1,s2>] [--employee-ranges <1,100>] [--keywords <kw>] [--page <n>]',
|
||||
enrich: 'people enrich --email <email> | --first-name <name> --last-name <name> --domain <domain> | --linkedin <url>',
|
||||
'bulk-enrich': 'people bulk-enrich --emails <e1,e2,e3>',
|
||||
},
|
||||
organizations: {
|
||||
search: 'organizations search [--locations <l1,l2>] [--employee-ranges <1,100>] [--keywords <kw>] [--page <n>]',
|
||||
enrich: 'organizations enrich --domain <domain>',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+245
@@ -0,0 +1,245 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.BEEHIIV_API_KEY
|
||||
const BASE_URL = 'https://api.beehiiv.com/v2'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'BEEHIIV_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function api(method, path, body) {
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Authorization': '***', 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${API_KEY}`,
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
},
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
})
|
||||
const text = await res.text()
|
||||
try {
|
||||
return JSON.parse(text)
|
||||
} catch {
|
||||
return { status: res.status, body: text }
|
||||
}
|
||||
}
|
||||
|
||||
function parseArgs(args) {
|
||||
const result = { _: [] }
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
const arg = args[i]
|
||||
if (arg.startsWith('--')) {
|
||||
const key = arg.slice(2)
|
||||
const next = args[i + 1]
|
||||
if (next && !next.startsWith('--')) {
|
||||
result[key] = next
|
||||
i++
|
||||
} else {
|
||||
result[key] = true
|
||||
}
|
||||
} else {
|
||||
result._.push(arg)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const args = parseArgs(process.argv.slice(2))
|
||||
const [cmd, sub, ...rest] = args._
|
||||
|
||||
async function main() {
|
||||
let result
|
||||
const pubId = args.publication || args.pub
|
||||
const limit = args.limit ? Number(args.limit) : 10
|
||||
|
||||
switch (cmd) {
|
||||
case 'publications':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/publications')
|
||||
break
|
||||
case 'get': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown publications subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'subscriptions':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
if (args.email) params.set('email', args.email)
|
||||
if (args.status) params.set('status', args.status)
|
||||
if (args.tier) params.set('tier', args.tier)
|
||||
if (args.cursor) params.set('cursor', args.cursor)
|
||||
if (args.expand) params.set('expand[]', args.expand)
|
||||
result = await api('GET', `/publications/${pubId}/subscriptions?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const subId = args.id
|
||||
if (!subId) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}/subscriptions/${subId}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const email = args.email
|
||||
if (!email) { result = { error: '--email required' }; break }
|
||||
const body = { email }
|
||||
if (args['reactivate-existing']) body.reactivate_existing = true
|
||||
if (args['send-welcome-email']) body.send_welcome_email = true
|
||||
if (args['utm-source']) body.utm_source = args['utm-source']
|
||||
if (args['utm-medium']) body.utm_medium = args['utm-medium']
|
||||
if (args['utm-campaign']) body.utm_campaign = args['utm-campaign']
|
||||
if (args.tier) body.tier = args.tier
|
||||
if (args['referring-site']) body.referring_site = args['referring-site']
|
||||
result = await api('POST', `/publications/${pubId}/subscriptions`, body)
|
||||
break
|
||||
}
|
||||
case 'update': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const subId = args.id
|
||||
if (!subId) { result = { error: '--id required' }; break }
|
||||
const body = {}
|
||||
if (args.tier) body.tier = args.tier
|
||||
result = await api('PUT', `/publications/${pubId}/subscriptions/${subId}`, body)
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const subId = args.id
|
||||
if (!subId) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/publications/${pubId}/subscriptions/${subId}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown subscriptions subcommand. Use: list, get, create, update, delete' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'posts':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const params = new URLSearchParams()
|
||||
params.set('limit', String(limit))
|
||||
if (args.status) params.set('status', args.status)
|
||||
if (args.cursor) params.set('cursor', args.cursor)
|
||||
result = await api('GET', `/publications/${pubId}/posts?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const postId = args.id
|
||||
if (!postId) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}/posts/${postId}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const title = args.title
|
||||
if (!title) { result = { error: '--title required' }; break }
|
||||
const body = { title }
|
||||
if (args.subtitle) body.subtitle = args.subtitle
|
||||
if (args.content) body.content = args.content
|
||||
if (args.status) body.status = args.status
|
||||
result = await api('POST', `/publications/${pubId}/posts`, body)
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const postId = args.id
|
||||
if (!postId) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/publications/${pubId}/posts/${postId}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown posts subcommand. Use: list, get, create, delete' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'segments':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}/segments`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const segId = args.id
|
||||
if (!segId) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}/segments/${segId}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown segments subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'automations':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}/automations`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
const autoId = args.id
|
||||
if (!autoId) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}/automations/${autoId}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown automations subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'referral-program':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
if (!pubId) { result = { error: '--publication required' }; break }
|
||||
result = await api('GET', `/publications/${pubId}/referral_program`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown referral-program subcommand. Use: get' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
publications: 'publications [list | get --publication <id>]',
|
||||
subscriptions: 'subscriptions [list | get --id <id> | create --email <email> | update --id <id> | delete --id <id>] --publication <id>',
|
||||
posts: 'posts [list | get --id <id> | create --title <title> | delete --id <id>] --publication <id>',
|
||||
segments: 'segments [list | get --id <id>] --publication <id>',
|
||||
automations: 'automations [list | get --id <id>] --publication <id>',
|
||||
'referral-program': 'referral-program [get] --publication <id>',
|
||||
options: '--publication <id> --limit <n> --email <email> --status <status> --tier <tier>',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user