Compare commits
90 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f23b665461 | |||
| 880386085e | |||
| dffa2fd3cb | |||
| db34fa2a21 | |||
| 0d586e4952 | |||
| 9125d8216e | |||
| 50e72e0a2d | |||
| 978051caf1 | |||
| e8623ad57d | |||
| e659c764dd | |||
| 58a9947df4 | |||
| ea4704a905 | |||
| 883f9b6380 | |||
| 743f718a7c | |||
| 5616e31192 | |||
| 2570f6ad4e | |||
| eb4256891a | |||
| 3448f557de | |||
| 9f9c2d6f59 | |||
| 7df49f2be8 | |||
| 2c7c108bd5 | |||
| fe670959f7 | |||
| 4874fe8979 | |||
| d88009d1a4 | |||
| 78da95de86 | |||
| 7c2e29c526 | |||
| 49f520f4eb | |||
| ef8e08ffd2 | |||
| e10c33406c | |||
| c31adfe89e | |||
| 1f295fa5c8 | |||
| af9fe5fb09 | |||
| bb54a76215 | |||
| 884cf5e108 | |||
| 295f1eef37 | |||
| 5c90bb8075 | |||
| 2fe1310881 | |||
| 6020ef6943 | |||
| 42ac956cb7 | |||
| d10c161c04 | |||
| 76d1f89df9 | |||
| 85b93be6d6 | |||
| dba8570870 | |||
| 28e8684fdd | |||
| 07a893efd0 | |||
| fdb1202f12 | |||
| 314230b6db | |||
| 330d220aca | |||
| c4cb25cb6c | |||
| 4ceaf88e96 | |||
| 7d85256e19 | |||
| 7c13fccdd9 | |||
| b902ed2d79 | |||
| 47db68aaba | |||
| fcac7f27b0 | |||
| fd98062849 | |||
| 40f20b2736 | |||
| 7c8c087486 | |||
| fcf4b4e784 | |||
| cc1a9c106b | |||
| cb4451c9a1 | |||
| 9d4d29a795 | |||
| b0fbcabc5f | |||
| 6d08784211 | |||
| b5a9bb57a9 | |||
| 6e47b53faf | |||
| b970e9d8e4 | |||
| 869321e949 | |||
| 1c32ad3dbf | |||
| 51146da746 | |||
| 8657fd4f78 | |||
| 2f5db8d95c | |||
| 3a8d01283d | |||
| 68f5eaf64e | |||
| 51e29954fb | |||
| a3ab09378b | |||
| 926c624d07 | |||
| 8c8090ed92 | |||
| b325e41c91 | |||
| b0a3a23699 | |||
| 7e7e7a09d8 | |||
| 11e9ea811f | |||
| 831dbe9616 | |||
| 6b1da2158e | |||
| e4283c6616 | |||
| 633f9c642d | |||
| 89fd57a8b0 | |||
| a2e646c2e6 | |||
| 9a2bb97784 | |||
| 4ff486a702 |
@@ -12,7 +12,7 @@
|
||||
"plugins": [
|
||||
{
|
||||
"name": "marketing-skills",
|
||||
"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",
|
||||
"description": "36 marketing skills for technical marketers and founders: ASO, CRO, copywriting, cold email, SEO, AI SEO, paid ads, ad creative, churn prevention, pricing strategy, referral programs, revenue operations, sales enablement, customer research, site architecture, and more",
|
||||
"source": "./",
|
||||
"strict": false,
|
||||
"skills": [
|
||||
@@ -20,16 +20,20 @@
|
||||
"./skills/ad-creative",
|
||||
"./skills/ai-seo",
|
||||
"./skills/analytics-tracking",
|
||||
"./skills/aso-audit",
|
||||
"./skills/churn-prevention",
|
||||
"./skills/cold-email",
|
||||
"./skills/community-marketing",
|
||||
"./skills/competitor-alternatives",
|
||||
"./skills/content-strategy",
|
||||
"./skills/copy-editing",
|
||||
"./skills/copywriting",
|
||||
"./skills/customer-research",
|
||||
"./skills/email-sequence",
|
||||
"./skills/form-cro",
|
||||
"./skills/free-tool-strategy",
|
||||
"./skills/launch-strategy",
|
||||
"./skills/lead-magnets",
|
||||
"./skills/marketing-ideas",
|
||||
"./skills/marketing-psychology",
|
||||
"./skills/onboarding-cro",
|
||||
|
||||
@@ -22,6 +22,7 @@ marketingskills/
|
||||
│ └── SKILL.md # Required skill file
|
||||
├── tools/
|
||||
│ ├── clis/ # Zero-dependency Node.js CLI tools (51 tools)
|
||||
│ ├── composio/ # Composio integration layer (quick start + toolkit mapping)
|
||||
│ ├── integrations/ # API integration guides per tool
|
||||
│ └── REGISTRY.md # Tool index with capabilities
|
||||
├── CONTRIBUTING.md
|
||||
@@ -167,7 +168,8 @@ 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, introw, composio
|
||||
- **Composio** (integration layer): Adds MCP access to OAuth-heavy tools without native MCP servers (HubSpot, Salesforce, Meta Ads, LinkedIn Ads, Google Sheets, Slack, etc.). See `tools/integrations/composio.md`
|
||||
|
||||
### Registry Structure
|
||||
|
||||
@@ -189,6 +191,8 @@ Skills reference relevant tools for implementation. For example:
|
||||
- `email-sequence` skill → customer-io, mailchimp, resend guides
|
||||
- `paid-ads` skill → google-ads, meta-ads, linkedin-ads guides
|
||||
|
||||
For tools without native MCP servers (HubSpot, Salesforce, Meta Ads, LinkedIn Ads, Google Sheets, Slack, Notion), Composio provides MCP access via a single server. See `tools/integrations/composio.md` for setup and `tools/composio/marketing-tools.md` for the full toolkit mapping.
|
||||
|
||||
## Checking for Updates
|
||||
|
||||
When using any skill from this repository:
|
||||
@@ -215,3 +219,36 @@ When using any skill from this repository:
|
||||
## Skill Categories
|
||||
|
||||
See `README.md` for the current list of skills organized by category. When adding new skills, follow the naming patterns of existing skills in that category.
|
||||
|
||||
## Claude Code-Specific Enhancements
|
||||
|
||||
These patterns are **Claude Code only** and must not be added to `SKILL.md` files directly, as skills are designed to be cross-agent compatible (Codex, Cursor, Windsurf, etc.). Apply them locally in your own project's `.claude/skills/` overrides instead.
|
||||
|
||||
### Dynamic content injection with `!`command``
|
||||
|
||||
Claude Code supports embedding shell commands in SKILL.md using `` !`command` `` syntax. When the skill is invoked, Claude Code runs the command and injects the output inline — the model sees the result, not the instruction.
|
||||
|
||||
**Most useful application: auto-inject the product marketing context file**
|
||||
|
||||
Instead of every skill telling the agent "go check if `.agents/product-marketing-context.md` exists and read it," you can inject it automatically:
|
||||
|
||||
```markdown
|
||||
Product context: !`cat .agents/product-marketing-context.md 2>/dev/null || echo "No product context file found — ask the user about their product before proceeding."`
|
||||
```
|
||||
|
||||
Place this at the top of a skill's body (after frontmatter) to make context available immediately without any file-reading step.
|
||||
|
||||
**Other useful injections:**
|
||||
|
||||
```markdown
|
||||
# Inject today's date for recency-sensitive skills
|
||||
Today's date: !`date +%Y-%m-%d`
|
||||
|
||||
# Inject current git branch (useful for workflow skills)
|
||||
Current branch: !`git branch --show-current 2>/dev/null`
|
||||
|
||||
# Inject recent commits for context
|
||||
Recent commits: !`git log --oneline -5 2>/dev/null`
|
||||
```
|
||||
|
||||
**Why this is Claude Code-only**: Other agents that load skills will see the literal `` !`command` `` string rather than executing it, which would appear as garbled instructions. Keep cross-agent skill files free of this syntax.
|
||||
|
||||
@@ -32,8 +32,8 @@ Skills reference each other and build on shared context. The `product-marketing-
|
||||
├──────────┤ ├──────────┤ ├──────────┤ ├────────────┤ ├──────────┤ ├─────────────┤ ├───────────┤
|
||||
│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 │ │ │
|
||||
│site-arch │ │onboard │ │cold-email│ │ab-test │ │churn- │ │launch │ │customer- │
|
||||
│programm │ │form-cro │ │email-seq │ │analytics │ │ prevent │ │pricing │ │research │
|
||||
│schema │ │popup-cro │ │social │ │ │ │ │ │competitor │ │ │
|
||||
│content │ │paywall │ │ │ │ │ │ │ │ │ │ │
|
||||
└────┬─────┘ └────┬─────┘ └────┬─────┘ └─────┬──────┘ └────┬─────┘ └──────┬──────┘ └─────┬─────┘
|
||||
@@ -44,6 +44,7 @@ Skills reference each other and build on shared context. The `product-marketing-
|
||||
copywriting ↔ page-cro ↔ ab-test-setup
|
||||
revops ↔ sales-enablement ↔ cold-email
|
||||
seo-audit ↔ schema-markup ↔ ai-seo
|
||||
customer-research → copywriting, page-cro, competitor-alternatives
|
||||
```
|
||||
|
||||
See each skill's **Related Skills** section for the full dependency map.
|
||||
@@ -53,20 +54,24 @@ See each skill's **Related Skills** section for the full dependency map.
|
||||
<!-- SKILLS:START -->
|
||||
| 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... |
|
||||
| [ab-test-setup](skills/ab-test-setup/) | When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program.... |
|
||||
| [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... |
|
||||
| [aso-audit](skills/aso-audit/) | When the user wants to audit or optimize an App Store or Google Play listing. Also use when the user mentions 'ASO... |
|
||||
| [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,... |
|
||||
| [community-marketing](skills/community-marketing/) | Build and leverage online communities to drive product growth and brand loyalty. Use when the user wants to create a... |
|
||||
| [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... |
|
||||
| [copy-editing](skills/copy-editing/) | When the user wants to edit, review, or improve existing marketing copy, or refresh outdated content. Also use when the... |
|
||||
| [copywriting](skills/copywriting/) | When the user wants to write, rewrite, or improve marketing copy for any page — including homepage, landing pages,... |
|
||||
| [customer-research](skills/customer-research/) | When the user wants to conduct, analyze, or synthesize customer research. Use when the user mentions "customer... |
|
||||
| [email-sequence](skills/email-sequence/) | When the user wants to create or optimize an email sequence, drip campaign, automated email flow, or lifecycle email... |
|
||||
| [form-cro](skills/form-cro/) | When the user wants to optimize any form that is NOT signup/registration — including lead capture forms, contact forms,... |
|
||||
| [free-tool-strategy](skills/free-tool-strategy/) | When the user wants to plan, evaluate, or build a free tool for marketing purposes — lead generation, SEO value, or... |
|
||||
| [launch-strategy](skills/launch-strategy/) | When the user wants to plan a product launch, feature announcement, or release strategy. Also use when the user... |
|
||||
| [lead-magnets](skills/lead-magnets/) | When the user wants to create, plan, or optimize a lead magnet for email capture or lead generation. Also use when the... |
|
||||
| [marketing-ideas](skills/marketing-ideas/) | When the user needs marketing ideas, inspiration, or strategies for their SaaS or software product. Also use when the... |
|
||||
| [marketing-psychology](skills/marketing-psychology/) | When the user wants to apply psychological principles, mental models, or behavioral science to marketing. Also use when... |
|
||||
| [onboarding-cro](skills/onboarding-cro/) | When the user wants to optimize post-signup onboarding, user activation, first-run experience, or time-to-value. Also... |
|
||||
|
||||
+44
-32
@@ -4,41 +4,53 @@ Current versions of all skills. Agents can compare against local versions to che
|
||||
|
||||
| Skill | Version | Last Updated |
|
||||
|-------|---------|--------------|
|
||||
| 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 |
|
||||
| ab-test-setup | 1.2.0 | 2026-03-14 |
|
||||
| ad-creative | 1.2.0 | 2026-03-14 |
|
||||
| ai-seo | 1.2.0 | 2026-03-14 |
|
||||
| analytics-tracking | 1.2.0 | 2026-03-14 |
|
||||
| churn-prevention | 1.2.0 | 2026-03-14 |
|
||||
| cold-email | 1.2.0 | 2026-03-14 |
|
||||
| competitor-alternatives | 1.2.0 | 2026-03-14 |
|
||||
| content-strategy | 1.2.0 | 2026-03-14 |
|
||||
| copy-editing | 1.2.0 | 2026-03-14 |
|
||||
| copywriting | 1.2.0 | 2026-03-14 |
|
||||
| email-sequence | 1.2.0 | 2026-03-14 |
|
||||
| form-cro | 1.2.0 | 2026-03-14 |
|
||||
| free-tool-strategy | 1.2.0 | 2026-03-14 |
|
||||
| launch-strategy | 1.2.0 | 2026-03-14 |
|
||||
| lead-magnets | 1.0.0 | 2026-03-14 |
|
||||
| marketing-ideas | 1.2.0 | 2026-03-14 |
|
||||
| marketing-psychology | 1.2.0 | 2026-03-14 |
|
||||
| onboarding-cro | 1.2.0 | 2026-03-14 |
|
||||
| page-cro | 1.2.0 | 2026-03-14 |
|
||||
| paid-ads | 1.2.0 | 2026-03-14 |
|
||||
| paywall-upgrade-cro | 1.2.0 | 2026-03-14 |
|
||||
| popup-cro | 1.2.0 | 2026-03-14 |
|
||||
| pricing-strategy | 1.2.0 | 2026-03-14 |
|
||||
| product-marketing-context | 1.2.0 | 2026-03-14 |
|
||||
| programmatic-seo | 1.2.0 | 2026-03-14 |
|
||||
| referral-program | 1.2.0 | 2026-03-14 |
|
||||
| revops | 1.2.0 | 2026-03-14 |
|
||||
| sales-enablement | 1.2.0 | 2026-03-14 |
|
||||
| schema-markup | 1.2.0 | 2026-03-14 |
|
||||
| seo-audit | 1.2.0 | 2026-03-14 |
|
||||
| signup-flow-cro | 1.2.0 | 2026-03-14 |
|
||||
| site-architecture | 1.2.0 | 2026-03-14 |
|
||||
| social-content | 1.2.0 | 2026-03-14 |
|
||||
|
||||
## Recent Changes
|
||||
|
||||
### 2026-03-14
|
||||
- Added `lead-magnets` skill for lead magnet strategy, format selection, and conversion optimization
|
||||
- Added Composio integration layer for MCP access to OAuth-heavy tools (HubSpot, Salesforce, Meta Ads, LinkedIn Ads, Google Sheets, Slack, Notion, etc.)
|
||||
- Added headless CMS integration guides (Sanity, Contentful, Strapi) with headless-cms reference
|
||||
- Added 197 evals across all 33 skills for automated quality testing
|
||||
- Optimized all 32 skill descriptions for better trigger phrase matching
|
||||
- Replaced rigid imperatives with reasoning-based guidance across all skills
|
||||
- Added 10 new CLI tools (airops, clay, close, coupler, crossbeam, outreach, pendo, similarweb, supermetrics, zoominfo)
|
||||
- Added 13 new integration guides
|
||||
- Bumped all 32 existing skills from 1.1.0 → 1.2.0
|
||||
|
||||
### 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
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
name: ab-test-setup
|
||||
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, or build a growth experimentation program. 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," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program," or "experiment playbook." Use this whenever someone is comparing two approaches and wants to measure which performs better, or when they want to build a systematic experimentation practice. For tracking implementation, see analytics-tracking. For page-level conversion optimization, see page-cro.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
version: 1.2.0
|
||||
---
|
||||
|
||||
# A/B Test Setup
|
||||
@@ -180,7 +180,7 @@ We'll know this is true when [metrics].
|
||||
- Check segment quality
|
||||
- Document external factors
|
||||
|
||||
**DON'T:**
|
||||
**Avoid:**
|
||||
- Peek at results and stop early
|
||||
- Make changes to variants
|
||||
- Add traffic from new sources
|
||||
@@ -229,6 +229,93 @@ Document every test with:
|
||||
|
||||
---
|
||||
|
||||
## Growth Experimentation Program
|
||||
|
||||
Individual tests are valuable. A continuous experimentation program is a compounding asset. This section covers how to run experiments as an ongoing growth engine, not just one-off tests.
|
||||
|
||||
### The Experiment Loop
|
||||
|
||||
```
|
||||
1. Generate hypotheses (from data, research, competitors, customer feedback)
|
||||
2. Prioritize with ICE scoring
|
||||
3. Design and run the test
|
||||
4. Analyze results with statistical rigor
|
||||
5. Promote winners to a playbook
|
||||
6. Generate new hypotheses from learnings
|
||||
→ Repeat
|
||||
```
|
||||
|
||||
### Hypothesis Generation
|
||||
|
||||
Feed your experiment backlog from multiple sources:
|
||||
|
||||
| Source | What to Look For |
|
||||
|--------|-----------------|
|
||||
| Analytics | Drop-off points, low-converting pages, underperforming segments |
|
||||
| Customer research | Pain points, confusion, unmet expectations |
|
||||
| Competitor analysis | Features, messaging, or UX patterns they use that you don't |
|
||||
| Support tickets | Recurring questions or complaints about conversion flows |
|
||||
| Heatmaps/recordings | Where users hesitate, rage-click, or abandon |
|
||||
| Past experiments | "Significant loser" tests often reveal new angles to try |
|
||||
|
||||
### ICE Prioritization
|
||||
|
||||
Score each hypothesis 1-10 on three dimensions:
|
||||
|
||||
| Dimension | Question |
|
||||
|-----------|----------|
|
||||
| **Impact** | If this works, how much will it move the primary metric? |
|
||||
| **Confidence** | How sure are we this will work? (Based on data, not gut.) |
|
||||
| **Ease** | How fast and cheap can we ship and measure this? |
|
||||
|
||||
**ICE Score** = (Impact + Confidence + Ease) / 3
|
||||
|
||||
Run highest-scoring experiments first. Re-score monthly as context changes.
|
||||
|
||||
### Experiment Velocity
|
||||
|
||||
Track your experimentation rate as a leading indicator of growth:
|
||||
|
||||
| Metric | Target |
|
||||
|--------|--------|
|
||||
| Experiments launched per month | 4-8 for most teams |
|
||||
| Win rate | 20-30% is common for mature programs (sustained higher rates may indicate conservative hypotheses) |
|
||||
| Average test duration | 2-4 weeks |
|
||||
| Backlog depth | 20+ hypotheses queued |
|
||||
| Cumulative lift | Compound gains from all winners |
|
||||
|
||||
### The Experiment Playbook
|
||||
|
||||
When a test wins, don't just implement it — document the pattern:
|
||||
|
||||
```
|
||||
## [Experiment Name]
|
||||
**Date**: [date]
|
||||
**Hypothesis**: [the hypothesis]
|
||||
**Sample size**: [n per variant]
|
||||
**Result**: [winner/loser/inconclusive] — [primary metric] changed by [X%] (95% CI: [range], p=[value])
|
||||
**Guardrails**: [any guardrail metrics and their outcomes]
|
||||
**Segment deltas**: [notable differences by device, segment, or cohort]
|
||||
**Why it worked/failed**: [analysis]
|
||||
**Pattern**: [the reusable insight — e.g., "social proof near pricing CTAs increases plan selection"]
|
||||
**Apply to**: [other pages/flows where this pattern might work]
|
||||
**Status**: [implemented / parked / needs follow-up test]
|
||||
```
|
||||
|
||||
Over time, your playbook becomes a library of proven growth patterns specific to your product and audience.
|
||||
|
||||
### Experiment Cadence
|
||||
|
||||
**Weekly (30 min)**: Review running experiments for technical issues and guardrail metrics. Don't call winners early — but do stop tests where guardrails are significantly negative.
|
||||
|
||||
**Bi-weekly**: Conclude completed experiments. Analyze results, update playbook, launch next experiment from backlog.
|
||||
|
||||
**Monthly (1 hour)**: Review experiment velocity, win rate, cumulative lift. Replenish hypothesis backlog. Re-prioritize with ICE.
|
||||
|
||||
**Quarterly**: Audit the playbook. Which patterns have been applied broadly? Which winning patterns haven't been scaled yet? What areas of the funnel are under-tested?
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
### Test Design
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"skill_name": "ab-test-setup",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "I want to A/B test our homepage headline. We currently say 'The All-in-One Project Management Tool' and want to test something benefit-focused. We get about 15,000 visitors/month and our current signup rate is 3.2%.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should build a proper hypothesis using the framework: 'Because [observation], we believe [change] will cause [outcome], which we'll measure by [metric].' Should identify this as an A/B test (two variants). Should calculate or reference sample size needs based on 15,000 monthly visitors and 3.2% baseline. Should define primary metric (signup rate), secondary metrics, and guardrail metrics. Should warn about the peeking problem and recommend a fixed test duration. Should provide the test plan in the structured output format.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Uses the hypothesis framework with observation, belief, outcome, and metric",
|
||||
"Identifies as A/B test type",
|
||||
"Addresses sample size calculation based on traffic and baseline rate",
|
||||
"Defines primary metric (signup rate)",
|
||||
"Defines secondary and guardrail metrics",
|
||||
"Warns about the peeking problem",
|
||||
"Provides structured test plan output"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "we want to test like 4 different CTA button colors on our pricing page. is that a good idea?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should identify this as an A/B/n test (multiple variants). Should caution that testing 4 variants requires significantly more traffic than a simple A/B test. Should reference the sample size quick reference showing traffic multipliers for multiple variants. Should question whether button color alone is likely to produce meaningful lift vs testing CTA copy, placement, or surrounding context. Should recommend either reducing to 2 variants or ensuring sufficient traffic. Should still provide hypothesis framework and test setup if proceeding.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Identifies as A/B/n test (multiple variants)",
|
||||
"Cautions about increased traffic needs for 4 variants",
|
||||
"References sample size requirements",
|
||||
"Questions whether button color alone is high-impact",
|
||||
"Suggests alternative higher-impact elements to test",
|
||||
"Provides hypothesis framework"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "Our test has been running for 3 days and Variant B is winning with 95% confidence. Should we call it?",
|
||||
"expected_output": "Should immediately address the peeking problem. Should explain that checking results early inflates false positive rates. Should recommend running for the full pre-calculated duration regardless of early results. Should explain why early significance can be misleading (regression to the mean, day-of-week effects, audience mix shifts). Should provide guidance on when it IS appropriate to stop early (sequential testing methods). Should recommend the pre-test commitment to duration.",
|
||||
"assertions": [
|
||||
"Addresses the peeking problem directly",
|
||||
"Explains why early significance is misleading",
|
||||
"Recommends running for full pre-calculated duration",
|
||||
"Mentions day-of-week effects or audience mix shifts",
|
||||
"Explains false positive rate inflation from peeking",
|
||||
"Mentions sequential testing as alternative approach"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Help me set up a multivariate test on our landing page. I want to test the headline, hero image, and CTA button simultaneously.",
|
||||
"expected_output": "Should identify this as a Multivariate Test (MVT). Should explain that MVT tests combinations of elements and requires much more traffic than A/B tests. Should calculate or reference traffic needs (combinations multiply: e.g., 2 headlines × 2 images × 2 CTAs = 8 combinations). Should recommend MVT only if traffic supports it, otherwise suggest sequential A/B tests. Should build hypotheses for each element being tested. Should define interaction effects to watch for. Should provide structured test plan.",
|
||||
"assertions": [
|
||||
"Identifies as multivariate test (MVT)",
|
||||
"Explains MVT tests combinations of elements",
|
||||
"Addresses dramatically higher traffic requirements",
|
||||
"Calculates number of combinations",
|
||||
"Suggests sequential A/B tests as alternative if traffic insufficient",
|
||||
"Builds hypotheses for each element",
|
||||
"Provides structured test plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "What metrics should I track for an A/B test on our trial signup page? We're testing a longer form (adds company size and role fields) against the current short form.",
|
||||
"expected_output": "Should apply the metrics selection framework with three tiers: primary, secondary, and guardrail metrics. Primary: form completion rate (the direct conversion metric). Secondary: lead quality metrics (SQL conversion rate, activation rate post-signup). Guardrail: overall signup volume (ensure longer form doesn't tank total signups below acceptable threshold). Should explain the tradeoff between conversion quantity and lead quality. Should note that this test needs longer observation window to measure downstream metrics.",
|
||||
"assertions": [
|
||||
"Applies three-tier metric framework (primary, secondary, guardrail)",
|
||||
"Identifies form completion rate as primary metric",
|
||||
"Identifies lead quality as secondary metric",
|
||||
"Defines guardrail metrics to protect against negative outcomes",
|
||||
"Explains quantity vs quality tradeoff",
|
||||
"Notes need for longer observation window for downstream metrics"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you help me write copy for our new landing page? We want to test it against the current version.",
|
||||
"expected_output": "Should recognize this is primarily a copywriting task, not a test setup task. Should defer to or cross-reference the copywriting skill for writing the actual copy. May help frame the test hypothesis and setup, but should make clear that copywriting is the right skill for creating the page copy itself.",
|
||||
"assertions": [
|
||||
"Recognizes this as primarily a copywriting task",
|
||||
"References or defers to copywriting skill",
|
||||
"Does not attempt to write full page copy using test setup patterns",
|
||||
"May offer to help with test hypothesis and setup"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"prompt": "We ran an A/B test on our pricing page for 4 weeks. Control: 2.1% conversion. Variant: 2.4% conversion. 12,000 visitors per variant. Is this statistically significant? Should we ship it?",
|
||||
"expected_output": "Should evaluate the results against statistical significance criteria. Should calculate or estimate whether the sample size is sufficient to detect a 0.3 percentage point lift from a 2.1% baseline (this is a ~14% relative lift). Should reference the 95% confidence threshold. Should discuss practical significance vs statistical significance. Should recommend whether to ship, continue testing, or iterate. Should consider segment analysis if results are borderline.",
|
||||
"assertions": [
|
||||
"Evaluates against statistical significance criteria",
|
||||
"Addresses whether sample size is sufficient for this effect size",
|
||||
"References 95% confidence threshold",
|
||||
"Distinguishes statistical significance from practical significance",
|
||||
"Provides clear recommendation on shipping",
|
||||
"Suggests segment analysis or follow-up if borderline"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
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,' or 'ad performance optimization.' This skill covers generating ad creative at scale, iterating based on performance data, and enforcing platform character limits. For campaign strategy and targeting, see paid-ads. For landing page copy, see copywriting."
|
||||
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
|
||||
---
|
||||
@@ -64,7 +64,7 @@ Pull performance data → Identify winning patterns → Generate new variations
|
||||
|
||||
## Platform Specs
|
||||
|
||||
**Always enforce these limits.** Never deliver creative that exceeds platform character limits.
|
||||
Platforms reject or truncate creative that exceeds these limits, so verify every piece of copy fits before delivering.
|
||||
|
||||
### Google Ads (Responsive Search Ads)
|
||||
|
||||
@@ -320,7 +320,7 @@ For large-scale creative production (Anthropic's growth team generates 100+ vari
|
||||
- **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
|
||||
- **No CTA headlines** — RSAs need action-oriented headlines to drive clicks; include at least 2-3
|
||||
- **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
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "ad-creative",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Generate ad creative for our Meta (Facebook/Instagram) campaign. We sell an AI writing assistant for content marketers. Main value prop: write blog posts 5x faster. Target audience: content marketing managers at B2B SaaS companies. Budget: $5k/month.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should generate creative following the angle-based approach: identify 3-5 angles (speed, quality, ROI, pain of blank page, competitive edge). For each angle, should generate primary text (≤125 chars), headline (≤40 chars), and description (≤30 chars) respecting Meta character limits. Should provide multiple variations per angle. Should suggest image/visual direction for each. Should organize output with angle name, hook, body, CTA for each variation. Should recommend which angles to test first.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Uses angle-based generation approach",
|
||||
"Identifies multiple angles (3-5)",
|
||||
"Respects Meta character limits (125/40/30)",
|
||||
"Generates multiple variations per angle",
|
||||
"Suggests image or visual direction",
|
||||
"Includes hook, body, and CTA for each",
|
||||
"Recommends which angles to test first"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "I need Google Ads copy for our CRM product. We're targeting the keyword 'best CRM for small business'. Need responsive search ads.",
|
||||
"expected_output": "Should generate Google RSA creative respecting character limits: headlines (≤30 chars each, need 10-15 variations) and descriptions (≤90 chars each, need 4+ variations). Should note that pinning should be used sparingly as it reduces optimization. Should include the target keyword in headlines. Should provide multiple angle-based variations. Should suggest ad extensions (sitelinks, callouts, structured snippets). Should follow Google Ads best practices for RSA.",
|
||||
"assertions": [
|
||||
"Respects Google RSA character limits (30 char headlines, 90 char descriptions)",
|
||||
"Generates 10-15 headline variations",
|
||||
"Generates 4+ description variations",
|
||||
"Includes target keyword in headlines",
|
||||
"Notes pinning should be used sparingly per skill guidance",
|
||||
"Suggests ad extensions",
|
||||
"Uses angle-based variation approach"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "Here's our ad performance data: Ad A (pain point angle) - CTR 2.1%, CPC $3.20, Conv rate 4.5%. Ad B (social proof angle) - CTR 1.4%, CPC $4.10, Conv rate 6.2%. Ad C (feature angle) - CTR 0.8%, CPC $5.50, Conv rate 2.1%. Help me iterate on these.",
|
||||
"expected_output": "Should activate the iteration-from-performance mode (not generate-from-scratch). Should analyze the data: Ad A has best CTR, Ad B has best conversion rate (highest efficiency despite lower CTR), Ad C is underperforming on all metrics. Should recommend doubling down on the pain point angle (high CTR) and social proof angle (high conversion), while pausing or reworking the feature angle. Should generate new variations that combine winning elements (pain point hook + social proof). Should suggest specific iterations on Ad A and Ad B.",
|
||||
"assertions": [
|
||||
"Activates iteration mode based on performance data",
|
||||
"Analyzes CTR, CPC, and conversion rate for each ad",
|
||||
"Identifies winning angles from the data",
|
||||
"Recommends pausing or reworking underperforming creative",
|
||||
"Generates new variations combining winning elements",
|
||||
"Provides specific iterations on top performers"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "we need linkedin ads for our enterprise security product. audience is CISOs and IT directors.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should generate LinkedIn ad creative respecting character limits: introductory text (≤150 chars), headline (≤70 chars), description (≤100 chars). Should adapt tone and messaging for enterprise security audience (CISOs, IT directors) — more formal, compliance-focused, risk-reduction language. Should provide multiple angles relevant to security buyers (risk reduction, compliance, incident response time, cost of breaches). Should suggest ad format recommendations for LinkedIn (sponsored content, message ads, etc.).",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Respects LinkedIn character limits (150/70/100)",
|
||||
"Adapts tone for enterprise security audience",
|
||||
"Uses risk-reduction and compliance language",
|
||||
"Provides multiple angles relevant to security buyers",
|
||||
"Suggests LinkedIn ad format recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "I need to generate a big batch of ad variations for a multi-platform campaign launching next week. We're a meal delivery service targeting busy professionals. Need ads for Google, Meta, and TikTok.",
|
||||
"expected_output": "Should activate the batch generation workflow. Should generate creative for all three platforms respecting each platform's character limits: Google RSA (30/90), Meta (125/40/30), TikTok (80 chars recommended, 100 max). Should identify 3-5 angles that work across platforms (convenience, health, time savings, variety, cost vs eating out). Should generate variations per angle per platform. Should note platform-specific creative considerations (TikTok needs video concepts, not just text). Should organize output clearly by platform.",
|
||||
"assertions": [
|
||||
"Activates batch generation workflow",
|
||||
"Generates for all three platforms",
|
||||
"Respects each platform's character limits",
|
||||
"Identifies angles that work across platforms",
|
||||
"Notes TikTok needs video concepts",
|
||||
"Organizes output by platform",
|
||||
"Generates multiple variations per angle per platform"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Help me plan our overall paid advertising strategy. We have a $20k monthly budget and want to figure out which platforms to use and how to allocate spend.",
|
||||
"expected_output": "Should recognize this is a paid advertising strategy task, not ad creative generation. Should defer to or cross-reference the paid-ads skill, which handles campaign strategy, platform selection, and budget allocation. May briefly mention creative considerations but should make clear that paid-ads is the right skill for strategy.",
|
||||
"assertions": [
|
||||
"Recognizes this as paid ads strategy, not creative generation",
|
||||
"References or defers to paid-ads skill",
|
||||
"Does not attempt full campaign strategy using creative generation patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
+49
-4
@@ -1,8 +1,8 @@
|
||||
---
|
||||
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,' or 'zero-click search.' This skill covers content optimization for AI answer engines, monitoring AI visibility, and getting cited as a source. For traditional technical and on-page SEO audits, see seo-audit. For structured data implementation, see schema-markup."
|
||||
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
|
||||
version: 1.2.0
|
||||
---
|
||||
|
||||
# AI SEO
|
||||
@@ -226,6 +226,50 @@ AI systems don't just cite your website — they cite where you appear.
|
||||
- Create YouTube content for key how-to queries
|
||||
- Answer relevant Quora questions with depth
|
||||
|
||||
### Machine-Readable Files for AI Agents
|
||||
|
||||
AI agents aren't just answering questions — they're becoming buyers. When an AI agent evaluates tools on behalf of a user, it needs structured, parseable information. If your pricing is locked in a JavaScript-rendered page or a "contact sales" wall, agents will skip you and recommend competitors whose information they can actually read.
|
||||
|
||||
Add these machine-readable files to your site root:
|
||||
|
||||
**`/pricing.md` or `/pricing.txt`** — Structured pricing data for AI agents
|
||||
|
||||
```markdown
|
||||
# Pricing — [Your Product Name]
|
||||
|
||||
## Free
|
||||
- Price: $0/month
|
||||
- Limits: 100 emails/month, 1 user
|
||||
- Features: Basic templates, API access
|
||||
|
||||
## Pro
|
||||
- Price: $29/month (billed annually) | $35/month (billed monthly)
|
||||
- Limits: 10,000 emails/month, 5 users
|
||||
- Features: Custom domains, analytics, priority support
|
||||
|
||||
## Enterprise
|
||||
- Price: Custom — contact sales@example.com
|
||||
- Limits: Unlimited emails, unlimited users
|
||||
- Features: SSO, SLA, dedicated account manager
|
||||
```
|
||||
|
||||
**Why this matters now:**
|
||||
- AI agents increasingly compare products programmatically before a human ever visits your site
|
||||
- Opaque pricing gets filtered out of AI-mediated buying journeys
|
||||
- A simple markdown file is trivially parseable by any LLM — no rendering, no JavaScript, no login walls
|
||||
- Same principle as `robots.txt` (for crawlers), `llms.txt` (for AI context), and `AGENTS.md` (for agent capabilities)
|
||||
|
||||
**Best practices:**
|
||||
- Use consistent units (monthly vs. annual, per-seat vs. flat)
|
||||
- Include specific limits and thresholds, not just feature names
|
||||
- List what's included at each tier, not just what's different
|
||||
- Keep it updated — stale pricing is worse than no file
|
||||
- Link to it from your sitemap and main pricing page
|
||||
|
||||
**`/llms.txt`** — Context file for AI systems (see [llmstxt.org](https://llmstxt.org))
|
||||
|
||||
If you don't have one yet, add an `llms.txt` that gives AI systems a quick overview of what your product does, who it's for, and links to key pages (including your pricing).
|
||||
|
||||
### Schema Markup for AI
|
||||
|
||||
Structured data helps AI systems understand your content. Key schemas:
|
||||
@@ -309,7 +353,7 @@ Monthly manual check:
|
||||
- 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)
|
||||
- Pricing transparency (AI cites pages with visible pricing) — add a `/pricing.md` file so AI agents can parse your plans without rendering your page (see "Machine-Readable Files" above)
|
||||
- FAQ section addressing common buyer questions
|
||||
|
||||
### Blog Content
|
||||
@@ -353,11 +397,12 @@ Monthly manual check:
|
||||
- **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
|
||||
- **No freshness signals** — Undated content loses to dated content because AI systems weight recency heavily. 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)
|
||||
- **Hiding pricing behind "contact sales" or JS-rendered pages** — AI agents evaluating your product on behalf of buyers can't parse what they can't read. Add a `/pricing.md` file
|
||||
- **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
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "ai-seo",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "How do I make sure our SaaS product shows up in AI search results? We're a project management tool and we keep getting left out of ChatGPT and Perplexity recommendations when people ask about project management software.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the three pillars framework: Structure (make content extractable), Authority (make content citable), Presence (be where AI looks). Should run through the AI Visibility Audit checklist across platforms (Google AI Overviews, ChatGPT, Perplexity, etc.). Should check content extractability (clear definitions, structured comparisons, statistics). Should reference Princeton GEO research findings (citations improve visibility +40%, statistics +37%). Should check AI bot access in robots.txt. Should provide a prioritized action plan.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies three pillars framework (Structure, Authority, Presence)",
|
||||
"Runs AI Visibility Audit across platforms",
|
||||
"Checks content extractability",
|
||||
"References Princeton GEO research findings",
|
||||
"Checks AI bot access in robots.txt",
|
||||
"Provides prioritized action plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Should we block AI crawlers like GPTBot and PerplexityBot in our robots.txt? We're worried about content theft.",
|
||||
"expected_output": "Should address the AI bot access question directly. Should explain the tradeoff: blocking AI bots prevents training on your content but also prevents AI platforms from citing and recommending you. Should reference the specific bots and their purposes (GPTBot, Google-Extended, PerplexityBot, ClaudeBot, etc.). Should provide the recommended robots.txt configuration. Should explain that blocking may hurt AI visibility more than it protects content. Should provide a nuanced recommendation based on business goals.",
|
||||
"assertions": [
|
||||
"Addresses the blocking tradeoff directly",
|
||||
"Explains impact on AI visibility vs content protection",
|
||||
"Lists specific AI bot user agents",
|
||||
"Provides recommended robots.txt configuration",
|
||||
"Gives nuanced recommendation based on business goals",
|
||||
"Explains what each bot does"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "What kind of content gets cited most by AI systems? We want to create content specifically optimized for AI search.",
|
||||
"expected_output": "Should reference the content types that get cited most, including comparisons (~33% of AI citations), definitive guides (~15%), and other high-citation content types. Should explain why these formats work (they provide the structured, extractable, authoritative information AI systems need). Should provide specific recommendations for creating AI-optimized content: clear definitions, structured data, original statistics, comparison tables, expert quotes. Should reference the Princeton GEO research on what increases citation probability.",
|
||||
"assertions": [
|
||||
"References specific content types with citation rates",
|
||||
"Mentions comparisons as highest-cited format",
|
||||
"Explains why these formats work for AI",
|
||||
"Provides specific content creation recommendations",
|
||||
"References Princeton GEO research",
|
||||
"Mentions structured data, statistics, and clear definitions"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "we noticed our competitors are showing up in google AI overviews but we're not. what do we need to change?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should focus specifically on Google AI Overviews visibility. Should explain how AI Overviews selects sources (authoritative, well-structured, directly answers queries). Should run through the Structure pillar checklist: content extractability, heading hierarchy, answer-first format, structured data. Should check Authority signals: domain authority, citations, E-E-A-T. Should recommend specific content structure changes. Should suggest monitoring approach.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Focuses on Google AI Overviews specifically",
|
||||
"Explains how AI Overviews selects sources",
|
||||
"Checks Structure pillar (extractability, headings, answer-first)",
|
||||
"Checks Authority signals",
|
||||
"Recommends specific content structure changes",
|
||||
"Suggests monitoring approach"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Can you audit our website for AI search readiness? We want to know how visible we are across ChatGPT, Perplexity, Google AI Overviews, and other AI platforms.",
|
||||
"expected_output": "Should run the full AI Visibility Audit. Should check each platform in the landscape (Google AI Overviews, ChatGPT, Perplexity, Claude, Gemini, Copilot). Should evaluate all three pillars: Structure (content extractability, JSON-LD, clear definitions), Authority (citations, backlinks, E-E-A-T signals), Presence (AI bot access, platform-specific factors). Should provide findings organized by pillar. Should provide a prioritized action plan with specific fixes.",
|
||||
"assertions": [
|
||||
"Runs full AI Visibility Audit",
|
||||
"Checks multiple AI platforms",
|
||||
"Evaluates all three pillars (Structure, Authority, Presence)",
|
||||
"Checks content extractability",
|
||||
"Checks AI bot access",
|
||||
"Provides findings organized by pillar",
|
||||
"Provides prioritized action plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Our organic search traffic has dropped 30% this quarter. Can you do a full SEO audit to figure out what's going on?",
|
||||
"expected_output": "Should recognize this is a traditional SEO audit request, not specifically an AI SEO task. Should defer to or cross-reference the seo-audit skill, which handles comprehensive traditional SEO audits including crawlability, technical foundations, on-page optimization, and content quality. May mention AI search as one factor to investigate but should make clear that seo-audit is the primary skill for this task.",
|
||||
"assertions": [
|
||||
"Recognizes this as a traditional SEO audit request",
|
||||
"References or defers to seo-audit skill",
|
||||
"Does not attempt a full traditional SEO audit using AI SEO patterns",
|
||||
"May mention AI search as one factor to consider"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: analytics-tracking
|
||||
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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "analytics-tracking",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me set up analytics tracking for our B2B SaaS product. We use GA4 and GTM. We need to track signups, feature usage, and upgrade events.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the 'track for decisions' principle — ask what decisions the tracking will inform. Should use the event naming convention (object_action, lowercase with underscores). Should define essential events for SaaS: signup_completed, trial_started, feature_used, plan_upgraded, etc. Should provide GA4 implementation details with proper event parameters. Should include GTM data layer push examples. Should organize output as a tracking plan with event name, trigger, parameters, and purpose for each event.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies 'track for decisions' principle",
|
||||
"Uses object_action naming convention",
|
||||
"Defines essential SaaS events (signup, feature usage, upgrade)",
|
||||
"Provides GA4 implementation details",
|
||||
"Includes GTM data layer examples",
|
||||
"Output follows tracking plan format"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "What UTM parameters should we use? We run ads on Google, Meta, and LinkedIn, plus send a weekly newsletter and post on LinkedIn organically.",
|
||||
"expected_output": "Should apply the UTM parameter strategy framework. Should define consistent UTM conventions: source (google, meta, linkedin, newsletter), medium (cpc, paid-social, email, organic-social), campaign (naming convention with date or identifier). Should provide specific UTM examples for each channel mentioned. Should warn about common UTM mistakes (inconsistent casing, redundant parameters, missing medium). Should recommend a UTM tracking spreadsheet or naming convention document.",
|
||||
"assertions": [
|
||||
"Applies UTM parameter strategy",
|
||||
"Defines source, medium, and campaign conventions",
|
||||
"Provides specific UTM examples for each channel",
|
||||
"Uses consistent naming conventions (lowercase)",
|
||||
"Warns about common UTM mistakes",
|
||||
"Recommends tracking documentation"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "our tracking seems broken — we're seeing duplicate events and our conversion numbers in GA4 don't match what our database shows. help?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the debugging and validation framework. Should systematically check for common issues: duplicate GTM tags firing, missing event deduplication, incorrect trigger conditions, cross-domain tracking issues, consent mode filtering. Should provide specific debugging steps: use GA4 DebugView, GTM Preview mode, browser developer tools. Should address the GA4 vs database discrepancy (common causes: consent mode, ad blockers, client-side vs server-side tracking, session timeout differences).",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies debugging and validation framework",
|
||||
"Checks for duplicate tag firing",
|
||||
"Provides specific debugging tools (GA4 DebugView, GTM Preview)",
|
||||
"Addresses GA4 vs database discrepancy",
|
||||
"Lists common causes of data mismatches",
|
||||
"Provides systematic troubleshooting steps"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We're launching an e-commerce store and need to set up tracking from scratch. What events do we absolutely need?",
|
||||
"expected_output": "Should reference the essential events by site type, specifically e-commerce. Should define the e-commerce event taxonomy: product_viewed, product_added_to_cart, cart_viewed, checkout_started, checkout_step_completed, purchase_completed, product_removed_from_cart. Should include enhanced e-commerce parameters (item_id, item_name, price, quantity, etc.). Should follow object_action naming convention. Should organize as a tracking plan with priorities (must-have vs nice-to-have).",
|
||||
"assertions": [
|
||||
"References essential events for e-commerce site type",
|
||||
"Defines full e-commerce event taxonomy",
|
||||
"Includes enhanced e-commerce parameters",
|
||||
"Follows object_action naming convention",
|
||||
"Organizes by priority (must-have vs nice-to-have)",
|
||||
"Provides tracking plan format output"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "We need to make sure our tracking is GDPR compliant. We have European users and we're using GA4, Hotjar, and Facebook Pixel.",
|
||||
"expected_output": "Should apply the privacy and compliance framework. Should address GDPR requirements for each tool: consent before tracking, consent management platform (CMP) setup, GA4 consent mode configuration, conditional loading of Hotjar and Facebook Pixel. Should recommend a consent hierarchy (necessary, analytics, marketing). Should provide GTM implementation for consent-based tag firing. Should mention data retention settings in GA4. Should address cookie banner requirements.",
|
||||
"assertions": [
|
||||
"Applies privacy and compliance framework",
|
||||
"Addresses GDPR requirements specifically",
|
||||
"Recommends consent management platform",
|
||||
"Covers GA4 consent mode configuration",
|
||||
"Addresses conditional loading for each tool",
|
||||
"Provides consent hierarchy",
|
||||
"Mentions data retention settings"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Help me set up tracking for our A/B test. We want to measure which version of our pricing page converts better.",
|
||||
"expected_output": "Should recognize this overlaps with A/B test setup, not just analytics tracking. Should defer to or cross-reference the ab-test-setup skill for the experiment design, hypothesis, and statistical analysis. May help with the tracking implementation (events to fire, parameters to include) but should make clear that ab-test-setup is the right skill for the experiment framework.",
|
||||
"assertions": [
|
||||
"Recognizes overlap with A/B test setup",
|
||||
"References or defers to ab-test-setup skill",
|
||||
"May help with tracking implementation specifics",
|
||||
"Does not attempt to design the full experiment"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,312 @@
|
||||
---
|
||||
name: aso-audit
|
||||
description: "When the user wants to audit or optimize an App Store or Google Play listing. Also use when the user mentions 'ASO audit,' 'app store optimization,' 'optimize my app listing,' 'improve app visibility,' 'app store ranking,' 'audit my listing,' 'why aren't people downloading my app,' 'improve my app conversion,' 'keyword optimization for app,' or 'compare my app to competitors.' Use when the user shares an App Store or Google Play URL and wants to improve it."
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# ASO Audit
|
||||
|
||||
Analyze App Store and Google Play listings against ASO best practices. Fetches
|
||||
live listing data, scores metadata, visuals, and ratings, then produces a
|
||||
prioritized action plan.
|
||||
|
||||
## When to Use
|
||||
|
||||
- User shares an App Store or Google Play URL
|
||||
- User asks to audit or optimize an app listing
|
||||
- User wants to compare their app against competitors
|
||||
- User asks about app store ranking, visibility, or download conversion
|
||||
|
||||
## Before Auditing
|
||||
|
||||
**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.
|
||||
|
||||
## Phase 1 — Identify Store & Fetch
|
||||
|
||||
### Detect store type from URL
|
||||
|
||||
```
|
||||
Apple: apps.apple.com/{country}/app/{name}/id{digits}
|
||||
Google: play.google.com/store/apps/details?id={package}
|
||||
```
|
||||
|
||||
If the user gives an app name instead of a URL, search the web for:
|
||||
`site:apps.apple.com "{app name}"` or `site:play.google.com "{app name}"`
|
||||
|
||||
### Fetch the listing
|
||||
|
||||
Use WebFetch to retrieve the listing page. Extract every available field:
|
||||
|
||||
**Apple App Store fields:**
|
||||
|
||||
- App name (title) — 30 char limit
|
||||
- Subtitle — 30 char limit
|
||||
- Description (long) — not indexed for search, but matters for conversion
|
||||
- Promotional text — 170 chars, updatable without new release
|
||||
- Category (primary + secondary)
|
||||
- Screenshots (count, order, caption text)
|
||||
- Preview video (presence, duration)
|
||||
- Rating (average + count)
|
||||
- Recent reviews (visible ones)
|
||||
- Price / in-app purchases
|
||||
- Developer name
|
||||
- Last updated date
|
||||
- Version history notes
|
||||
- Age rating
|
||||
- Size
|
||||
- Languages / localizations listed
|
||||
- In-app events (if any visible)
|
||||
|
||||
**Google Play fields:**
|
||||
|
||||
- App name (title) — 30 char limit
|
||||
- Short description — 80 char limit
|
||||
- Full description — 4,000 char limit, IS indexed for search
|
||||
- Category + tags
|
||||
- Feature graphic (presence)
|
||||
- Screenshots (count, order)
|
||||
- Preview video (presence)
|
||||
- Rating (average + count)
|
||||
- Recent reviews (visible ones)
|
||||
- Price / in-app purchases
|
||||
- Developer name
|
||||
- Last updated date
|
||||
- What's new text
|
||||
- Downloads range
|
||||
- Content rating
|
||||
- Data safety section
|
||||
- Languages listed
|
||||
|
||||
If WebFetch returns incomplete data (stores render client-side), note gaps and
|
||||
work with what's available. Ask the user to paste missing fields if critical.
|
||||
|
||||
### Visual asset assessment
|
||||
|
||||
WebFetch cannot extract screenshot images or caption text. **Take a screenshot
|
||||
of the listing page** to get visual data:
|
||||
|
||||
1. Navigate to the listing URL and capture a full-page screenshot
|
||||
2. Assess the screenshot for: icon quality, screenshot count, caption text,
|
||||
messaging quality, preview video presence, feature graphic (Google Play)
|
||||
3. If browser tools are unavailable, ask the user to share a screenshot of the
|
||||
listing page
|
||||
|
||||
**Promotional text (Apple):** This 170-char field appears above the description
|
||||
but is often indistinguishable from it in scraped HTML. If you cannot confirm
|
||||
its presence, note this and recommend the user check App Store Connect.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1.5 — Assess Brand Maturity
|
||||
|
||||
Before scoring, classify the app into one of three tiers. This determines how
|
||||
you interpret "textbook ASO" deviations — a deliberate brand choice by a
|
||||
household name is not the same as a missed opportunity by an unknown app.
|
||||
|
||||
### Tier definitions
|
||||
|
||||
| Tier | Signals | Examples |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------- |
|
||||
| **Dominant** | Household name, 1M+ ratings, top-10 in category, near-universal brand recognition. Users search by brand name, not generic keywords. | Instagram, Uber, Spotify, WhatsApp, Netflix |
|
||||
| **Established** | Well-known in their category, 100K+ ratings, strong organic installs, recognized brand but not universally known. | Strava, Notion, Duolingo, Cash App, Calm |
|
||||
| **Challenger** | Building awareness, <100K ratings, needs discovery through keywords and ASO tactics. Most apps fall here. | Your app, most indie/startup apps |
|
||||
|
||||
### How tier affects scoring
|
||||
|
||||
**Dominant apps** get adjusted scoring in these areas:
|
||||
|
||||
- **Title:** Brand-only or brand-first titles are valid (score 8+ if brand is the keyword). These apps don't need generic keyword discovery.
|
||||
- **Description:** Score purely on conversion quality, not keyword presence. If the app is a household name, a well-crafted brand description beats a keyword-stuffed one.
|
||||
- **Visual Assets:** Lifestyle/brand photography instead of UI demos is a legitimate conversion strategy. No video is acceptable if the product is hard to demo in 30s or brand awareness is near-universal.
|
||||
- **What's New:** Generic release notes at weekly+ cadence are acceptable (score 8+). At scale, detailed changelogs have minimal ROI and risk backlash.
|
||||
- **In-app events:** Missing events for utility apps with massive install bases (Uber, WhatsApp) is not a penalty. These apps don't need discovery help.
|
||||
- **Localization:** Score relative to actual market, not absolute count. A US-only fintech with 2 languages (English + Spanish) is appropriately localized.
|
||||
|
||||
**Established apps** get partial adjustment:
|
||||
|
||||
- Brand-first titles are fine but should still include 1-2 keywords
|
||||
- Strategic description choices get benefit of the doubt
|
||||
- Other dimensions scored normally
|
||||
|
||||
**Challenger apps** are scored strictly against textbook ASO best practices — every character, screenshot, and keyword matters.
|
||||
|
||||
**Key principle:** Before docking points, ask: "Is this a mistake or a deliberate
|
||||
choice by a team that has data I don't?" If the app has 1M+ ratings and a
|
||||
dedicated ASO team, assume their choices are data-informed unless clearly wrong.
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — Score Each Dimension
|
||||
|
||||
Score each dimension 0-10 using the criteria in `references/scoring-criteria.md`.
|
||||
Apply the brand maturity tier adjustments from Phase 1.5.
|
||||
|
||||
Reference files for platform specs and benchmarks:
|
||||
|
||||
- `references/apple-specs.md` — Official Apple character limits, screenshot/video specs, CPP/PPO rules, rejection triggers
|
||||
- `references/google-play-specs.md` — Official Google Play limits, screenshot specs, Android Vitals thresholds, policies
|
||||
- `references/benchmarks.md` — Conversion data, rating impact, video lift, screenshot behavior, CPP/event benchmarks
|
||||
|
||||
### Dimensions and Weights
|
||||
|
||||
| # | Dimension | Weight | What It Covers |
|
||||
| --- | -------------------- | ------ | ------------------------------------------------------------------------- |
|
||||
| 1 | Title & Subtitle | 20% | Character usage, keyword presence, clarity, brand + keyword balance |
|
||||
| 2 | Description | 15% | First 3 lines, keyword density (Google), CTA, structure, promotional text |
|
||||
| 3 | Visual Assets | 25% | Screenshot count/quality/messaging, video, icon, feature graphic |
|
||||
| 4 | Ratings & Reviews | 20% | Average rating, volume, recency, developer responses |
|
||||
| 5 | Metadata & Freshness | 10% | Category choice, update recency, localization count, data safety |
|
||||
| 6 | Conversion Signals | 10% | Price positioning, IAP transparency, social proof, download range |
|
||||
|
||||
**Final score** = weighted sum, out of 100.
|
||||
|
||||
### Score interpretation
|
||||
|
||||
| Score | Grade | Meaning |
|
||||
| ------ | ----- | --------------------------------------------------------- |
|
||||
| 85-100 | A | Well-optimized; focus on A/B testing and iteration |
|
||||
| 70-84 | B | Good foundation; clear opportunities to improve |
|
||||
| 50-69 | C | Significant gaps; prioritized fixes will have high impact |
|
||||
| 30-49 | D | Major optimization needed across multiple dimensions |
|
||||
| 0-29 | F | Listing needs a complete overhaul |
|
||||
|
||||
---
|
||||
|
||||
## Phase 3 — Competitor Comparison (Optional)
|
||||
|
||||
If the user provides competitor URLs or asks for comparison:
|
||||
|
||||
1. Fetch 2-3 top competitors in the same category
|
||||
2. Run the same scoring on each
|
||||
3. Build a comparison table highlighting where the user's app is weaker/stronger
|
||||
4. Identify keyword gaps — terms competitors rank for that the user's app doesn't target
|
||||
|
||||
If no competitors are specified, suggest the user provide 2-3 or offer to search
|
||||
for top apps in their category.
|
||||
|
||||
---
|
||||
|
||||
## Phase 4 — Generate Report
|
||||
|
||||
Use the template in `references/report-template.md` to structure the output.
|
||||
|
||||
The report must include:
|
||||
|
||||
1. **Score card** — table with all 6 dimensions, scores, and grade
|
||||
2. **Top 3 quick wins** — changes that take <1 hour and have highest impact
|
||||
3. **Detailed findings** — per-dimension breakdown with specific issues and fixes
|
||||
4. **Keyword suggestions** — based on title/description analysis and competitor gaps
|
||||
5. **Visual asset recommendations** — specific screenshot/video improvements
|
||||
6. **Priority action plan** — ordered list of changes by impact vs effort
|
||||
|
||||
### Report rules
|
||||
|
||||
- Every recommendation must be **specific and actionable** ("Change subtitle from X to Y" not "Improve subtitle")
|
||||
- Include character counts for all text recommendations
|
||||
- Flag platform-specific differences (Apple vs Google) when relevant
|
||||
- Note what CANNOT be assessed without paid tools (search volume, exact rankings)
|
||||
- When suggesting keyword changes, explain WHY each keyword matters
|
||||
|
||||
---
|
||||
|
||||
## Platform-Specific Rules
|
||||
|
||||
### Apple App Store — Key Facts
|
||||
|
||||
- Title (30 chars) + Subtitle (30 chars) + Keyword field (100 **bytes**, hidden) = indexed text
|
||||
- Keywords field is bytes not chars — Arabic/CJK use 2-3 bytes per char
|
||||
- Long description is NOT indexed for search — optimize for conversion only
|
||||
- Promotional text (170 chars) does NOT affect search (Apple confirmed)
|
||||
- Never repeat words across title/subtitle/keyword field (Apple indexes each word once)
|
||||
- Keyword field: commas, no spaces ("photo,editor,filter" not "photo, editor, filter")
|
||||
- Screenshots: up to 10 per device. First 3 visible in search — 90% never scroll past 3rd
|
||||
- Screenshot captions indexed since June 2025 (AI extraction)
|
||||
- In-app events: max 10 published at once, max 31 days each. Indexed and appear in search
|
||||
- Custom Product Pages (up to 70) in organic search since July 2025. +5.9% avg conversion lift
|
||||
- App preview video: up to 3, 15-30s each. Autoplays muted — +20-40% conversion lift
|
||||
- SKStoreReviewController: max 3 prompts per 365 days
|
||||
- Apple has human editorial curation — quality and design matter more
|
||||
- See `references/apple-specs.md` for full specs, dimensions, and rejection triggers
|
||||
|
||||
### Google Play — Key Facts
|
||||
|
||||
- Title (30 chars) + Short description (80 chars) + Full description (4,000 chars) = indexed text
|
||||
- Full description IS indexed — target 2-3% keyword density naturally
|
||||
- No hidden keyword field — all keywords must be in visible text
|
||||
- Google NLP/semantic understanding — keyword stuffing detected and penalized
|
||||
- Prohibited in title: emojis, ALL CAPS, "best"/"#1"/"free", CTAs (enforced since 2021)
|
||||
- Screenshots: min 2, **max 8** per device (not 10 like Apple)
|
||||
- Feature graphic (1024x500, exact) required for featured placements
|
||||
- Video does NOT autoplay — only ~6% of users tap play (low ROI vs iOS)
|
||||
- Android Vitals directly affect ranking: crash >1.09% or ANR >0.47% = reduced visibility
|
||||
- Promotional Content: submit 14 days early for featuring. Apps see 2x explore acquisitions
|
||||
- Custom Store Listings: up to 50 (can target churned users, specific countries, ad campaigns)
|
||||
- Store Listing Experiments: test up to 3 variants, run 7+ days, 1 experiment at a time
|
||||
- See `references/google-play-specs.md` for full specs and policy details
|
||||
|
||||
### What Apple Indexes vs What Google Indexes
|
||||
|
||||
| Field | Apple Indexed? | Google Indexed? |
|
||||
| --------------------- | ---------------- | ---------------------- |
|
||||
| Title | Yes | Yes (strongest signal) |
|
||||
| Subtitle / Short desc | Yes | Yes |
|
||||
| Keyword field | Yes (hidden) | Does not exist |
|
||||
| Long description | No | Yes (heavily) |
|
||||
| Screenshot captions | Yes (since 2025) | No |
|
||||
| In-app events | Yes | N/A (LiveOps instead) |
|
||||
| Developer name | No | Partial |
|
||||
| IAP names | Yes | Yes |
|
||||
|
||||
---
|
||||
|
||||
## Common Issues Checklist
|
||||
|
||||
Flag these if found. Items marked _(tier-dependent)_ should be evaluated against
|
||||
the app's brand maturity tier — they may be deliberate choices for Dominant apps.
|
||||
|
||||
**Always flag (all tiers):**
|
||||
|
||||
- [ ] Rating below 4.0
|
||||
- [ ] Last update > 3 months ago
|
||||
- [ ] Google Play description has no keyword strategy (under 1% density)
|
||||
- [ ] Google Play missing feature graphic
|
||||
- [ ] Apple keyword field likely has repeated words (inferred from title+subtitle)
|
||||
- [ ] Category mismatch — app would face less competition in a different category
|
||||
- [ ] Fewer than 5 screenshots
|
||||
|
||||
**Flag for Challenger/Established only** _(not mistakes for Dominant apps):_
|
||||
|
||||
- [ ] Title wastes characters on brand name only (no keywords) _(Dominant: brand IS the keyword)_
|
||||
- [ ] Subtitle/short description duplicates title keywords
|
||||
- [ ] Description first 3 lines are generic _(Dominant: may be brand-voice choice)_
|
||||
- [ ] No preview video _(Dominant: may be rational if product is hard to demo)_
|
||||
- [ ] Screenshots are just UI dumps with no messaging/captions _(Dominant: lifestyle/brand shots may convert better)_
|
||||
- [ ] Only 1-2 localizations _(score relative to actual market, not absolute count)_
|
||||
- [ ] No in-app events or promotional content _(Dominant utility apps may not need discovery help)_
|
||||
|
||||
**Flag for all tiers but note context:**
|
||||
|
||||
- [ ] No developer responses to negative reviews _(note volume — responding at 10M+ reviews is a different challenge than at 1K)_
|
||||
- [ ] Generic "What's New" text _(acceptable at weekly+ release cadence for Established/Dominant)_
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What is the App Store or Google Play URL?
|
||||
2. Is this your app or a competitor's?
|
||||
3. What category does the app compete in?
|
||||
4. Do you have competitor URLs to compare against?
|
||||
5. Are you focused on search visibility, conversion rate, or both?
|
||||
6. Do you have access to App Store Connect or Google Play Console data?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **page-cro**: For optimizing the conversion of web-based landing pages that drive app installs
|
||||
- **ad-creative**: For creating App Store and Google Play ad creatives
|
||||
- **analytics-tracking**: For setting up install attribution and in-app event tracking
|
||||
- **customer-research**: For understanding user needs and language to inform listing copy
|
||||
@@ -0,0 +1,107 @@
|
||||
# Apple App Store — Official Specs & Guidelines
|
||||
|
||||
All data from developer.apple.com as of March 2026.
|
||||
|
||||
## Character Limits
|
||||
|
||||
| Field | Limit | Indexed for Search? | Notes |
|
||||
| ----------------------- | ---------------- | ------------------------ | -------------------------------------------------------- |
|
||||
| App Name | 30 chars (min 2) | Yes | Must be unique; no trademarks, competitor names, pricing |
|
||||
| Subtitle | 30 chars | Yes | No unverifiable claims |
|
||||
| Keywords | 100 bytes | Yes (hidden) | Commas, no spaces between terms |
|
||||
| Description | 4,000 chars | **No** | Plain text only, no HTML |
|
||||
| Promotional Text | 170 chars | **No** (Apple confirmed) | Updatable without new version |
|
||||
| What's New | 4,000 chars | No | Required for all versions after first |
|
||||
| IAP Name | 35 chars | Yes | Appears in search |
|
||||
| IAP Description | 55 chars | No | |
|
||||
| In-App Event Name | 30 chars | Yes | Title case required |
|
||||
| In-App Event Short Desc | 50 chars | Yes | Sentence case |
|
||||
| In-App Event Long Desc | 120 chars | No | Sentence case |
|
||||
|
||||
**Keywords field is 100 bytes, not 100 characters.** Non-Latin scripts (Arabic,
|
||||
Chinese, Japanese, Korean) use 2-3 bytes per character, reducing effective
|
||||
keyword count significantly.
|
||||
|
||||
## Screenshot Specs
|
||||
|
||||
| Device | Required? | Count | Dimensions (portrait) |
|
||||
| ---------------- | ------------- | ----- | -------------------------- |
|
||||
| 6.9" iPhone | **Required** | 1-10 | 1260 x 2736 |
|
||||
| 13" iPad | **Required** | 1-10 | 2064 x 2752 |
|
||||
| Mac | If applicable | 1-10 | Up to 2880 x 1800 (16:10) |
|
||||
| Apple Watch | If applicable | 1-10 | Varies by model |
|
||||
| Apple TV | If applicable | 1-10 | 1920 x 1080 or 3840 x 2160 |
|
||||
| Apple Vision Pro | If applicable | 1-10 | 3840 x 2160 |
|
||||
|
||||
- Formats: JPEG, PNG
|
||||
- Apple auto-scales from required base sizes to smaller devices
|
||||
|
||||
## App Preview Video Specs
|
||||
|
||||
- **Count:** Up to 3 per app
|
||||
- **Duration:** 15-30 seconds
|
||||
- **Max file size:** 500 MB
|
||||
- **Codecs:** H.264 (10-12 Mbps, up to 30fps) or ProRes 422 HQ
|
||||
- **Audio:** Stereo, 256 kbps AAC or PCM, 44.1/48 kHz
|
||||
- **Formats:** .mov, .m4v, .mp4
|
||||
- **Behavior:** Autoplays muted on product page (iOS 11+)
|
||||
|
||||
## Custom Product Pages (CPPs)
|
||||
|
||||
- **Max:** 70 additional pages (plus 1 default)
|
||||
- **Customizable:** Screenshots, promotional text, app previews, deep links (iOS 18+)
|
||||
- **Keywords:** Each keyword combo must be unique to a single CPP
|
||||
- **Review:** Submitted to App Review independently of app updates
|
||||
- **Organic search:** CPPs appear in organic search results since July 2025
|
||||
- **Performance:** +2.5 percentage points higher conversion on average vs default
|
||||
|
||||
## Product Page Optimization (A/B Testing)
|
||||
|
||||
- **Treatments:** Up to 3 vs original
|
||||
- **Testable:** App icons, screenshots, app preview videos
|
||||
- **NOT testable:** Title, subtitle, description, keywords
|
||||
- **Concurrent tests:** 1 per app
|
||||
- **Max duration:** 90 days
|
||||
- **Icon constraint:** All icon variants must be in the published app binary
|
||||
- **Confidence:** Apple recommends 90% threshold (Bayesian method)
|
||||
- **Cannot modify** a test once started
|
||||
|
||||
## In-App Events
|
||||
|
||||
- **Max approved:** 15 in App Store Connect at once
|
||||
- **Max published:** 10 on App Store simultaneously
|
||||
- **Max duration:** 31 days per event
|
||||
- **Pre-event promotion:** Up to 14 days before start
|
||||
- **Badge types:** Challenge, Competition, Live Event, Major Update, New Season, Premiere, Special Event
|
||||
|
||||
**Event card image:** 16:9, min 1920x1080, max 3840x2160
|
||||
**Event details image:** 9:16, min 1080x1920, max 2160x3840
|
||||
|
||||
**Not suitable:** Repetitive daily tasks, price promotions without new content, general awareness campaigns.
|
||||
|
||||
## Ratings & Reviews
|
||||
|
||||
- **SKStoreReviewController:** Max 3 prompts per 365-day period
|
||||
- System controls display frequency (may show fewer than 3)
|
||||
- Do not use custom buttons to request reviews
|
||||
- Developers can respond to all reviews in App Store Connect
|
||||
- Summary rating is territory-specific
|
||||
|
||||
## Metadata Rejection Triggers (App Review Guidelines)
|
||||
|
||||
| Guideline | Rejection Trigger |
|
||||
| --------- | ------------------------------------------------------------------------- |
|
||||
| 2.3.1 | Hidden features, misleading marketing, false pricing |
|
||||
| 2.3.2 | Not disclosing IAPs in description/screenshots |
|
||||
| 2.3.3 | Screenshots that don't show app in use (only splash/login) |
|
||||
| 2.3.4 | Preview videos using non-app content |
|
||||
| 2.3.5 | Wrong category selected |
|
||||
| 2.3.7 | Keyword stuffing: trademarks, competitor names, pricing, irrelevant terms |
|
||||
| 2.3.8 | Metadata not appropriate for all audiences (must be 4+ rated) |
|
||||
| 2.3.10 | Other platform names/imagery (Android, etc.) in metadata |
|
||||
| 2.3.12 | Generic What's New for significant changes |
|
||||
| 2.3.13 | Inaccurate in-app event metadata |
|
||||
|
||||
Sources: developer.apple.com/app-store/product-page/,
|
||||
developer.apple.com/app-store/search/,
|
||||
developer.apple.com/app-store/review/guidelines/
|
||||
@@ -0,0 +1,129 @@
|
||||
# ASO Benchmarks & Conversion Data
|
||||
|
||||
Industry data from AppTweak, SplitMetrics, Sensor Tower, and others. Updated March 2026.
|
||||
|
||||
## Conversion Rate Benchmarks by Category
|
||||
|
||||
**Average CVR (page view to install):**
|
||||
|
||||
- iOS overall: **25.0%**
|
||||
- Google Play overall: **27.3%**
|
||||
|
||||
| Category | iOS CVR | Google Play CVR |
|
||||
| ----------------- | -------------- | --------------- |
|
||||
| Navigation | 115%\* | -- |
|
||||
| Auto & Vehicles | -- | 70.5% |
|
||||
| Business | 66.7% | -- |
|
||||
| Music (Games) | -- | 45.0% |
|
||||
| Utilities & Tools | -- | 36.8% |
|
||||
| Shopping | -- | 27.7% |
|
||||
| Health & Fitness | -- | 23.2% |
|
||||
| Finance | -- | 19.7% |
|
||||
| Food & Drink | -- | 13.1% |
|
||||
| Games (Board) | 1.2% | 7.3% |
|
||||
| Games (overall) | 3-5% realistic | -- |
|
||||
|
||||
\*Above 100% = some users install from search without visiting product page.
|
||||
|
||||
Source: AppTweak 2025 Benchmarks Report (H1 2024 data, US market)
|
||||
|
||||
## Rating Impact on Conversion
|
||||
|
||||
| Rating Change | Conversion Impact |
|
||||
| -------------------------- | --------------------------------------- |
|
||||
| 3.0 to 4.0 stars | **+89%** |
|
||||
| 4.0 to 4.5 stars | **+20-30%** |
|
||||
| 4.3 to 4.6 stars | **+22-28%** (Finance, Health) |
|
||||
| 0.4-star gap vs competitor | **~25% lost installs** from same search |
|
||||
| 3-star vs 5-star app | **50% fewer conversions** for 3-star |
|
||||
|
||||
**Critical thresholds:**
|
||||
|
||||
- **4.0 stars** = minimum for Apple featuring, user trust, conversion viability
|
||||
- **4.5+ stars** = optimal zone. Sweet spot: 4.1-4.9
|
||||
- **5.0 stars** can look suspicious to users
|
||||
- **Below 3.5** = sharp visibility drop on both stores
|
||||
- **79% of users** check ratings before downloading
|
||||
- **50% reject** apps below 3 stars
|
||||
|
||||
Sources: AppFollow, MobileAction, Sensor Tower, Troof.ai
|
||||
|
||||
## Preview Video Impact
|
||||
|
||||
**iOS:** +20-40% conversion lift (video autoplays on product page)
|
||||
**Google Play:** Minimal lift (only ~6% of visitors tap to play)
|
||||
|
||||
- Autoplay introduced in iOS 11 caused **+47% conversion jump**
|
||||
- Users who watch video are **2x more likely to install**
|
||||
- Average watch time: **4-6.5 seconds** (first 5 seconds are critical)
|
||||
- 50%+ of viewers watch to the end
|
||||
|
||||
**Takeaway:** Video is high-ROI on iOS, low-ROI on Google Play.
|
||||
|
||||
Sources: StoreMaven, SplitMetrics, Leanplum
|
||||
|
||||
## Screenshot Impact
|
||||
|
||||
- **90% of users** do not scroll past the 3rd screenshot
|
||||
- Average scroll rate: only **17%**
|
||||
- Users spend **6-10 seconds** scanning before deciding
|
||||
- **First screenshot decides everything**
|
||||
- Well-designed screenshots lift conversion **20-35%**
|
||||
- A/B test winners see **10-25% improvement**
|
||||
- **Optimal count:** 4-5 for utility apps, 5-6 for complex apps
|
||||
- More than 6: diminishing returns, can cause decision paralysis
|
||||
- Top 200 apps update screenshots **2-4 times/year**
|
||||
- Top Google Play games update visuals **up to 8x/year**
|
||||
- **57% of top games** A/B tested screenshots at least 2x in 2024
|
||||
|
||||
Sources: AppTweak, ASOMobile, Sensor Tower
|
||||
|
||||
## Custom Product Pages (Apple CPPs)
|
||||
|
||||
- Average conversion lift: **+5.9% for apps**, **+3.5% for games**
|
||||
- Best cases: up to **+8.6%**
|
||||
- Organic referral: **+2.5 percentage points** (156% lift vs 1.6% baseline)
|
||||
- Apple Ads CPP CVR: **55.8% in 2024** (up from 42.1% in 2023)
|
||||
- **Only 31% of apps** and **26% of games** use CPPs (low adoption = opportunity)
|
||||
- Screenshot reordering alone produced **+16.6% installs** in one case
|
||||
|
||||
Sources: AppTweak, SplitMetrics, MobileAction
|
||||
|
||||
## Custom Store Listings (Google Play CSLs)
|
||||
|
||||
- Up to **50 custom versions** per app
|
||||
- Case study (Lockwood/Avakin Life): **+57% CVR** over 2 months
|
||||
- Can target inactive/churned users (28+ days no activity)
|
||||
|
||||
Source: Phiture, MobileAction
|
||||
|
||||
## In-App Events (Apple)
|
||||
|
||||
- **55% of top 200 apps** use them regularly
|
||||
- +**15-20% more impressions** from editorial/browse placements
|
||||
- One case: **+124% surge** in total impressions
|
||||
- One case: **+50% impressions AND first-time downloads**
|
||||
- Search CVR uptick: **+10.3%**
|
||||
- Re-downloads increase: **+15.5%**
|
||||
- **Boost is short-lived** -- KPIs drop to baseline when event ends
|
||||
- Optimal: **2-4 active events per month**
|
||||
|
||||
Sources: Phiture, AppTweak, Appalize
|
||||
|
||||
## Promotional Content (Google Play)
|
||||
|
||||
- Apps with featuring see **2x explore acquisitions** (official Google)
|
||||
- +2% 28-day active users and +4% revenue on average
|
||||
|
||||
Source: Google Play Console documentation
|
||||
|
||||
## A/B Test Impact Thresholds
|
||||
|
||||
| Improvement | Classification |
|
||||
| ----------- | ---------------------------------- |
|
||||
| >10% | Strong winner -- apply immediately |
|
||||
| 5-10% | Meaningful winner |
|
||||
| 2-5% | Marginal winner |
|
||||
| <2% | Noise -- not significant |
|
||||
|
||||
Source: SplitMetrics, MobileAction
|
||||
@@ -0,0 +1,131 @@
|
||||
# Google Play Store — Official Specs & Guidelines
|
||||
|
||||
All data from support.google.com and developer.android.com as of March 2026.
|
||||
|
||||
## Character Limits
|
||||
|
||||
| Field | Limit | Indexed? | Notes |
|
||||
| ----------------- | ----------- | ---------------------- | ------------------------------------- |
|
||||
| App Title | 30 chars | Yes (strongest signal) | Reduced from 50 in Sept 2021 |
|
||||
| Short Description | 80 chars | Yes | Visible without expanding |
|
||||
| Full Description | 4,000 chars | **Yes (heavily)** | Google NLP indexes entire text |
|
||||
| Developer Name | 64 chars | Partial | Same emoji/caps restrictions as title |
|
||||
|
||||
## Prohibited in Metadata (enforced since Sept 2021)
|
||||
|
||||
**Title, Icon, Developer Name:**
|
||||
|
||||
- Emojis, emoticons, repeated special characters
|
||||
- ALL CAPS (unless registered brand)
|
||||
- Performance claims: "top," "best," "#1," "free," "no ads"
|
||||
- Misleading store performance or endorsement
|
||||
- Calls-to-action: "update now," "download now"
|
||||
|
||||
**Short Description:**
|
||||
|
||||
- Same performance claims as title
|
||||
- Calls-to-action
|
||||
- Unattributed testimonials
|
||||
|
||||
**Screenshots, Feature Graphic, Video:**
|
||||
|
||||
- Time-sensitive taglines
|
||||
- Calls-to-action ("Download now," "Play now")
|
||||
- Must authentically showcase app functionality
|
||||
|
||||
## Screenshot Specs
|
||||
|
||||
| Device | Min | Max | Aspect Ratio | Min Resolution | Max Long Edge |
|
||||
| ---------- | ----- | ----- | ------------ | -------------- | ------------- |
|
||||
| Phone | **2** | **8** | 9:16 or 16:9 | 320px any side | 3,840px |
|
||||
| 7" Tablet | 4 | 8 | 9:16 or 16:9 | 1,080px short | 7,680px |
|
||||
| 10" Tablet | 4 | 8 | 9:16 or 16:9 | 1,080px short | 7,680px |
|
||||
| Chromebook | 4 | 8 | 9:16 or 16:9 | 1,080px short | 7,680px |
|
||||
| Wear OS | 1 | 8 | **1:1** | 384x384 | 3,840px |
|
||||
| Android TV | 1 | 8 | **16:9** | 1,920x1,080 | 3,840px |
|
||||
|
||||
- **Recommended phone size:** 1080x1920 (portrait)
|
||||
- **Format:** JPEG or 24-bit PNG (no alpha)
|
||||
- **Max file size:** 8 MB each
|
||||
|
||||
**Note:** Google Play max is 8 screenshots per device, not 10 like Apple.
|
||||
|
||||
## Feature Graphic
|
||||
|
||||
- **Dimensions:** 1024 x 500 px (exact, required)
|
||||
- **Format:** JPEG or 24-bit PNG (no alpha)
|
||||
- Displayed at top of listing and in featured placements
|
||||
|
||||
## App Icon
|
||||
|
||||
- **Dimensions:** 512 x 512 px
|
||||
- **Format:** 32-bit PNG (with alpha)
|
||||
- **Max file size:** 1,024 KB
|
||||
- **Shape:** Full square (Google applies 30% corner radius automatically)
|
||||
- **Prohibited:** Ranking claims, download counts, deal text, emoji
|
||||
|
||||
## Preview Video
|
||||
|
||||
- **Format:** YouTube URL (public or unlisted)
|
||||
- **Duration:** 30 seconds to 2 minutes recommended
|
||||
- No ads, no monetization, must be embeddable, not age-restricted
|
||||
- **Does NOT autoplay** (only ~6% of visitors tap to play)
|
||||
|
||||
## Store Listing Experiments (A/B Testing)
|
||||
|
||||
- **Variants:** Up to 3 per experiment (plus control)
|
||||
- **Testable:** Icon, feature graphic, screenshots, video, short description, full description
|
||||
- **Concurrent:** Cannot run more than 1 default graphics experiment simultaneously
|
||||
- **Audience:** Signed-in Google Play users only
|
||||
- **Metrics:** First-time installers + retained first-time installers (1-day retention)
|
||||
- **Duration:** Run at least 7 days (weekday/weekend variance)
|
||||
- **Localized:** Test across up to 5 languages simultaneously
|
||||
|
||||
## Custom Store Listings
|
||||
|
||||
- **Max:** 50 per app (100 for Play partners)
|
||||
- **Customizable:** Title, short/full description, icon, screenshots, feature graphic, video
|
||||
- **Targeting:** Country/region, pre-registration, install state, Google Ads campaigns, inactive/churned users (28+ days)
|
||||
- **2025 addition:** Gemini AI auto-generates text for CSLs in Play Console
|
||||
|
||||
## Promotional Content (LiveOps)
|
||||
|
||||
| Type | Description | Duration |
|
||||
| ----------------- | ------------------------------ | -------------------- |
|
||||
| Offers | Discounts, free items, bundles | Up to 28 days |
|
||||
| Events | Time-limited in-app events | Must have time limit |
|
||||
| Major Update | Significant new features | Max 1 week |
|
||||
| Crossover (games) | Cross-game/IP collaboration | Varies |
|
||||
|
||||
- Submit **4+ days** before start (standard review)
|
||||
- Submit **14+ days** before for featuring requests
|
||||
- **Impact:** "Over twice as many explore acquisitions during featuring" (official Google)
|
||||
|
||||
## Android Vitals — Ranking Thresholds
|
||||
|
||||
Apps exceeding these thresholds get **reduced visibility** in search and recommendations.
|
||||
|
||||
| Metric | Overall Threshold | Per-Device Threshold |
|
||||
| ---------------------------- | ----------------- | -------------------- |
|
||||
| User-Perceived Crash Rate | **1.09%** | 8% |
|
||||
| User-Perceived ANR Rate | **0.47%** | 8% |
|
||||
| Excessive Partial Wake Locks | 5% | N/A |
|
||||
|
||||
**Consequences:** Reduced search visibility, warning labels on listing, quality alerts to users before install.
|
||||
**Recovery:** Google checks daily using 28-day rolling average.
|
||||
|
||||
## Search Ranking — Official Factors
|
||||
|
||||
Google confirms these affect ranking:
|
||||
|
||||
1. **Metadata relevance** — Title carries most weight. NLP scans title + short desc + full desc.
|
||||
2. **App quality** — Android Vitals (crash/ANR rates)
|
||||
3. **Ratings and reviews** — Star rating + review text. 85% of featured apps have 4.0+
|
||||
4. **Install volume and velocity** — Total installs + daily/weekly frequency
|
||||
5. **Engagement and retention** — Session frequency, duration, retention rates
|
||||
6. **Update frequency** — Regular updates signal active maintenance
|
||||
7. **Localization** — Regional keyword/visual adaptation. 59% of US apps localize titles.
|
||||
|
||||
Sources: support.google.com/googleplay/android-developer/answer/4448378,
|
||||
support.google.com/googleplay/android-developer/answer/9898842,
|
||||
developer.android.com/topic/performance/vitals
|
||||
@@ -0,0 +1,213 @@
|
||||
# ASO Audit Report Template
|
||||
|
||||
Use this structure for all ASO audit reports.
|
||||
|
||||
---
|
||||
|
||||
## Header
|
||||
|
||||
```
|
||||
# ASO Audit: {App Name}
|
||||
**Store:** {Apple App Store / Google Play}
|
||||
**URL:** {listing URL}
|
||||
**Audit date:** {date}
|
||||
**Brand tier:** {Dominant / Established / Challenger} — {one-line justification}
|
||||
**Overall Score:** {score}/100 (Grade: {A/B/C/D/F})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Score Card
|
||||
|
||||
```
|
||||
| Dimension | Score | Grade | Key Issue |
|
||||
|-----------|-------|-------|-----------|
|
||||
| Title & Subtitle | X/10 | {grade} | {one-line summary} |
|
||||
| Description | X/10 | {grade} | {one-line summary} |
|
||||
| Visual Assets | X/10 | {grade} | {one-line summary} |
|
||||
| Ratings & Reviews | X/10 | {grade} | {one-line summary} |
|
||||
| Metadata & Freshness | X/10 | {grade} | {one-line summary} |
|
||||
| Conversion Signals | X/10 | {grade} | {one-line summary} |
|
||||
| **OVERALL** | **{weighted}/100** | **{grade}** | |
|
||||
```
|
||||
|
||||
Grade scale per dimension: 9-10 = A, 7-8 = B, 5-6 = C, 3-4 = D, 1-2 = F
|
||||
|
||||
---
|
||||
|
||||
## Top 3 Quick Wins
|
||||
|
||||
Highest-impact changes that take under 1 hour:
|
||||
|
||||
```
|
||||
### 1. {Action verb} — {specific change}
|
||||
**Impact:** {High/Medium} | **Effort:** {<15 min / <30 min / <1 hour}
|
||||
**Current:** {what it is now}
|
||||
**Recommended:** {exact replacement, with character count}
|
||||
**Why:** {one sentence explaining the impact}
|
||||
|
||||
### 2. ...
|
||||
### 3. ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Detailed Findings
|
||||
|
||||
### Title & Subtitle Analysis
|
||||
|
||||
```
|
||||
**Current title:** "{title}" ({X}/30 chars used)
|
||||
**Current subtitle/short desc:** "{subtitle}" ({X}/30 or /80 chars used)
|
||||
|
||||
**Issues found:**
|
||||
- {issue 1}
|
||||
- {issue 2}
|
||||
|
||||
**Recommended title:** "{new title}" ({X}/30 chars) — {rationale}
|
||||
**Recommended subtitle:** "{new subtitle}" ({X}/30 or /80 chars) — {rationale}
|
||||
```
|
||||
|
||||
### Description Analysis
|
||||
|
||||
```
|
||||
**First 3 lines (above fold):**
|
||||
> {quoted text}
|
||||
|
||||
**Issues found:**
|
||||
- {issue 1}
|
||||
- {issue 2}
|
||||
|
||||
**Keyword density (Google Play only):** {X}% — target: 2-3%
|
||||
**Top keywords found:** {keyword1} (Xn), {keyword2} (Xn), ...
|
||||
**Missing high-value keywords:** {keyword1}, {keyword2}, ...
|
||||
|
||||
**Recommended first 3 lines:**
|
||||
> {rewritten text}
|
||||
```
|
||||
|
||||
### Visual Assets Analysis
|
||||
|
||||
```
|
||||
**Screenshots:** {count} ({store} shows first {3/all} in search)
|
||||
**Preview video:** {Yes/No}
|
||||
**Icon assessment:** {description}
|
||||
**Feature graphic (Google Play):** {Yes/No}
|
||||
|
||||
**Screenshot audit:**
|
||||
1. {screenshot 1 description} — {pass/issue}
|
||||
2. {screenshot 2 description} — {pass/issue}
|
||||
...
|
||||
|
||||
**Recommendations:**
|
||||
- {specific visual change 1}
|
||||
- {specific visual change 2}
|
||||
```
|
||||
|
||||
### Ratings & Reviews Analysis
|
||||
|
||||
```
|
||||
**Average rating:** {X.X} stars ({count} ratings)
|
||||
**Recent review sentiment:** {Positive/Mixed/Negative}
|
||||
**Common complaints:** {theme1}, {theme2}
|
||||
**Developer responses:** {Yes, active / Sporadic / None}
|
||||
|
||||
**Recommendations:**
|
||||
- {specific action 1}
|
||||
- {specific action 2}
|
||||
```
|
||||
|
||||
### Metadata & Freshness
|
||||
|
||||
```
|
||||
**Last updated:** {date} ({X days/months ago})
|
||||
**Localizations:** {count} languages
|
||||
**Category:** {current category}
|
||||
**In-app events/LiveOps:** {Yes/No}
|
||||
|
||||
**Recommendations:**
|
||||
- {specific action 1}
|
||||
- {specific action 2}
|
||||
```
|
||||
|
||||
### Conversion Signals
|
||||
|
||||
```
|
||||
**Price model:** {Free / Freemium / Paid}
|
||||
**IAP count:** {count}
|
||||
**Downloads (Google Play):** {range}
|
||||
**Social proof visible:** {awards, press, badges — or "none"}
|
||||
|
||||
**Recommendations:**
|
||||
- {specific action 1}
|
||||
- {specific action 2}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Keyword Suggestions
|
||||
|
||||
```
|
||||
| Keyword | Rationale | Where to Place | Priority |
|
||||
|---------|-----------|----------------|----------|
|
||||
| {keyword} | {why this keyword} | {title/subtitle/description/keyword field} | {High/Med/Low} |
|
||||
| ... | ... | ... | ... |
|
||||
```
|
||||
|
||||
Note: Without paid ASO tools, exact search volume is unavailable. These
|
||||
suggestions are based on category analysis, competitor metadata, and semantic
|
||||
relevance. Validate with AppTweak, Sensor Tower, or MobileAction for volume data.
|
||||
|
||||
---
|
||||
|
||||
## Competitor Comparison (if applicable)
|
||||
|
||||
```
|
||||
| Metric | {Your App} | {Competitor 1} | {Competitor 2} |
|
||||
|--------|-----------|----------------|----------------|
|
||||
| Title keywords | ... | ... | ... |
|
||||
| Rating | ... | ... | ... |
|
||||
| Screenshots | ... | ... | ... |
|
||||
| Video | ... | ... | ... |
|
||||
| Description keywords | ... | ... | ... |
|
||||
| Last updated | ... | ... | ... |
|
||||
| Overall ASO score | ... | ... | ... |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Priority Action Plan
|
||||
|
||||
Ordered by impact (high to low), grouped by effort:
|
||||
|
||||
```
|
||||
### Do This Week (Quick Wins)
|
||||
1. {action} — {expected impact}
|
||||
2. {action} — {expected impact}
|
||||
|
||||
### Do This Month (Medium Effort)
|
||||
3. {action} — {expected impact}
|
||||
4. {action} — {expected impact}
|
||||
|
||||
### Plan for Next Quarter (High Effort)
|
||||
5. {action} — {expected impact}
|
||||
6. {action} — {expected impact}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Limitations
|
||||
|
||||
Always include this section:
|
||||
|
||||
> **What this audit cannot measure without paid ASO tools:**
|
||||
>
|
||||
> - Exact keyword search volume and difficulty scores
|
||||
> - Historical keyword ranking positions
|
||||
> - Download and revenue estimates
|
||||
> - Apple keyword field contents (hidden from public view)
|
||||
> - Install conversion rate data (only available to app owner in console)
|
||||
> - A/B test results from previous experiments
|
||||
>
|
||||
> For these data points, consider using AppTweak ($69/mo), Sensor Tower, or
|
||||
> MobileAction ($69/mo).
|
||||
@@ -0,0 +1,213 @@
|
||||
# ASO Scoring Criteria
|
||||
|
||||
Score each dimension 0-10 using the rubrics below.
|
||||
**Apply brand maturity tier adjustments** from Phase 1.5 of the main skill.
|
||||
|
||||
---
|
||||
|
||||
## Brand Maturity Adjustments (apply to all dimensions)
|
||||
|
||||
Before scoring, determine the app's tier: **Dominant**, **Established**, or **Challenger**.
|
||||
|
||||
**Dominant apps (Instagram, Uber, Spotify, WhatsApp, Netflix):**
|
||||
|
||||
- Brand-only titles score 8+ (the brand IS the keyword)
|
||||
- Lifestyle/brand screenshots score same as captioned UI screenshots
|
||||
- Generic What's New at weekly+ cadence scores 8+
|
||||
- Missing in-app events for utility apps is not a penalty
|
||||
- Description scored on conversion quality only, not keyword presence
|
||||
- Localization scored relative to actual market footprint
|
||||
- Missing preview video is acceptable if brand awareness is near-universal
|
||||
|
||||
**Established apps (Duolingo, Strava, Notion, Calm, Cash App):**
|
||||
|
||||
- Brand-first titles with 1-2 keywords score normally
|
||||
- Strategic description/visual choices get benefit of the doubt
|
||||
- All other dimensions scored normally
|
||||
|
||||
**Challenger apps (most apps):**
|
||||
|
||||
- Scored strictly against textbook ASO — every character and feature matters
|
||||
|
||||
**Key principle:** Before docking points, ask: "Is this a mistake or a data-informed
|
||||
choice by a team with more information than I have?"
|
||||
|
||||
---
|
||||
|
||||
## 1. Title & Subtitle (Weight: 20%)
|
||||
|
||||
**Challenger rubric:**
|
||||
|
||||
| Score | Criteria |
|
||||
| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 9-10 | Brand + high-value keyword in title, complementary keywords in subtitle, no word repetition across fields, near max character usage, instantly communicates app purpose |
|
||||
| 7-8 | Good keyword presence, minor character waste (5+ unused chars), clear purpose |
|
||||
| 5-6 | Has keywords but poor placement, some repetition between fields, purpose somewhat clear |
|
||||
| 3-4 | Title is brand-only or generic, subtitle missing or weak, poor character usage |
|
||||
| 1-2 | No keyword strategy, title doesn't communicate purpose, major character waste |
|
||||
| 0 | Cannot assess (data unavailable) |
|
||||
|
||||
**Dominant/Established adjustment:** Brand-only titles (e.g., "Instagram") are
|
||||
valid if the brand has high search volume. Score 8+ for Dominant apps where
|
||||
brand recognition eliminates the need for generic keywords. Evaluate whether
|
||||
unused characters represent waste or intentional simplicity.
|
||||
|
||||
**Check for:**
|
||||
|
||||
- Characters used vs limit (title: 30, subtitle/short desc: 30/80). "Near max" = within 3 chars of the limit (27+/30, 77+/80)
|
||||
- Primary keyword in title
|
||||
- Keyword duplication between title and subtitle
|
||||
- Whether app purpose is immediately clear
|
||||
- Unnecessary words (articles, prepositions) consuming space
|
||||
- Special characters or claims ("#1", "best") that risk rejection (Apple)
|
||||
|
||||
---
|
||||
|
||||
## 2. Description (Weight: 15%)
|
||||
|
||||
### Apple App Store
|
||||
|
||||
| Score | Criteria |
|
||||
| ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 9-10 | First 3 lines hook with clear value prop, structured with features/benefits/social proof/CTA, promotional text actively used, compelling and scannable |
|
||||
| 7-8 | Good opening, decent structure, could improve scannability or CTA |
|
||||
| 5-6 | Generic opening ("Welcome to..."), some structure, missing CTA or social proof |
|
||||
| 3-4 | Wall of text, no clear value prop above fold, no promotional text |
|
||||
| 1-2 | Minimal or boilerplate description, no effort |
|
||||
| 0 | Cannot assess |
|
||||
|
||||
### Google Play
|
||||
|
||||
| Score | Criteria |
|
||||
| ----- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 9-10 | Keywords in first 3 sentences, 2-3% natural density throughout, HTML formatting used, structured sections, strong CTA, keywords feel natural |
|
||||
| 7-8 | Good keyword presence, some structure, density slightly off (1-2% or 3-4%) |
|
||||
| 5-6 | Keywords present but sparse (<1%) or stuffed (>5%), weak structure |
|
||||
| 3-4 | No keyword strategy visible, poor formatting, wall of text |
|
||||
| 1-2 | Minimal description, no keywords, no structure |
|
||||
| 0 | Cannot assess |
|
||||
|
||||
**Check for:**
|
||||
|
||||
- First 3 lines quality (visible before "Read More")
|
||||
- Feature-benefit framing (not just feature lists)
|
||||
- Social proof (downloads, awards, press mentions)
|
||||
- Call to action
|
||||
- Keyword density (Google Play only - count target keywords / total words)
|
||||
- HTML formatting usage (Google Play)
|
||||
- Promotional text presence and quality (Apple)
|
||||
|
||||
---
|
||||
|
||||
## 3. Visual Assets (Weight: 25%)
|
||||
|
||||
| Score | Criteria |
|
||||
| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 9-10 | 8-10 screenshots with clear messaging/captions, preview video present, screenshots tell a story in sequence, each communicates one benefit, icon is distinctive and memorable |
|
||||
| 7-8 | 6-7 screenshots with captions, good icon, no video OR good video but some screenshot messaging unclear |
|
||||
| 5-6 | 5+ screenshots but weak/no captions, basic icon, no video, screenshots are UI dumps |
|
||||
| 3-4 | 3-4 screenshots, no captions, generic icon, no storytelling |
|
||||
| 1-2 | Fewer than 3 screenshots, or screenshots are raw unedited UI, poor icon |
|
||||
| 0 | Cannot assess |
|
||||
|
||||
**Check for:**
|
||||
|
||||
- Screenshot count (minimum 5, ideal 8-10)
|
||||
- Caption/overlay text on screenshots (one message per screen, 5-7 words max)
|
||||
- First 3 screenshots (highest conversion impact on Apple)
|
||||
- Preview video presence and quality
|
||||
- Icon distinctiveness (no text in icon, bold shapes, stands out)
|
||||
- Feature graphic presence (Google Play - mandatory for featured placements)
|
||||
- Screenshot storytelling flow (do they tell a coherent story?)
|
||||
- Localized visual assets (for non-English markets)
|
||||
- Caption keywords (Apple - indexed since June 2025)
|
||||
|
||||
---
|
||||
|
||||
## 4. Ratings & Reviews (Weight: 20%)
|
||||
|
||||
| Score | Criteria |
|
||||
| ----- | ------------------------------------------------------------------------------------------------------ |
|
||||
| 9-10 | 4.5+ stars, 10K+ ratings, recent reviews positive, developer responds to negatives, steady review flow |
|
||||
| 7-8 | 4.0-4.4 stars, 1K+ ratings, mostly positive recent reviews, some developer responses |
|
||||
| 5-6 | 3.5-3.9 stars, 500+ ratings, mixed recent reviews, no developer responses |
|
||||
| 3-4 | 3.0-3.4 stars, <500 ratings, negative themes in recent reviews |
|
||||
| 1-2 | Below 3.0 stars, few ratings, no developer engagement, visible complaints |
|
||||
| 0 | No ratings yet or cannot assess |
|
||||
|
||||
**Check for:**
|
||||
|
||||
- Average rating (target: 4.0+ minimum, 4.5+ ideal)
|
||||
- Total rating count
|
||||
- Recent review sentiment (last 5-10 visible reviews)
|
||||
- Common complaint themes (bugs, crashes, pricing, UX)
|
||||
- Developer response presence and quality
|
||||
- Rating trend (improving or declining, if visible)
|
||||
- Review recency (fresh reviews signal active user base)
|
||||
|
||||
---
|
||||
|
||||
## 5. Metadata & Freshness (Weight: 10%)
|
||||
|
||||
| Score | Criteria |
|
||||
| ----- | ------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 9-10 | Updated within last month, 10+ localizations, optimal category choice, in-app events/LiveOps active, data safety complete |
|
||||
| 7-8 | Updated within 2 months, 5+ localizations, good category, data safety present |
|
||||
| 5-6 | Updated within 3 months, 2-4 localizations, acceptable category |
|
||||
| 3-4 | Updated 3-6 months ago, 1-2 localizations, possibly wrong category |
|
||||
| 1-2 | Not updated in 6+ months, single language, poor category choice |
|
||||
| 0 | Cannot assess |
|
||||
|
||||
**Check for:**
|
||||
|
||||
- Last update date and recency
|
||||
- Number of supported languages/localizations
|
||||
- Category selection (is it the best fit? less competitive alternative?)
|
||||
- In-app events (Apple) or promotional content (Google) presence
|
||||
- Data safety / privacy nutrition label completeness
|
||||
- Age rating appropriateness
|
||||
- Version history quality (do release notes communicate value?)
|
||||
- What's New text quality
|
||||
|
||||
---
|
||||
|
||||
## 6. Conversion Signals (Weight: 10%)
|
||||
|
||||
| Score | Criteria |
|
||||
| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 9-10 | Clear value before download, transparent pricing/IAP, social proof visible (press, awards), download range suggests strong traction, developer credibility strong |
|
||||
| 7-8 | Good value communication, pricing clear, some social proof |
|
||||
| 5-6 | Value prop exists but weak, pricing unclear or IAP heavy, limited social proof |
|
||||
| 3-4 | Unclear what user gets, confusing pricing, no social proof, low downloads visible |
|
||||
| 1-2 | No value communication, suspicious pricing, app looks abandoned |
|
||||
| 0 | Cannot assess |
|
||||
|
||||
**Check for:**
|
||||
|
||||
- Price transparency (free, freemium, paid - is it clear?)
|
||||
- In-app purchase list quality (do IAP names communicate value?)
|
||||
- Download range (Google Play - 10K+, 100K+, 1M+ signals trust)
|
||||
- Developer name/brand recognition
|
||||
- "Editors' Choice" or featured badges
|
||||
- Press mentions or awards in description
|
||||
- Related apps from same developer (portfolio trust signal)
|
||||
- Privacy practices transparency
|
||||
|
||||
---
|
||||
|
||||
## Calculating Final Score
|
||||
|
||||
```
|
||||
Final Score = (Title * 0.20) + (Description * 0.15) + (Visuals * 0.25)
|
||||
+ (Ratings * 0.20) + (Metadata * 0.10) + (Conversion * 0.10)
|
||||
|
||||
Scale to 100: Final Score * 10
|
||||
```
|
||||
|
||||
**Example:** Title: 7, Description: 6, Visuals: 8, Ratings: 9, Metadata: 5, Conversion: 7
|
||||
|
||||
```
|
||||
(7 * 0.20) + (6 * 0.15) + (8 * 0.25) + (9 * 0.20) + (5 * 0.10) + (7 * 0.10)
|
||||
= 1.4 + 0.9 + 2.0 + 1.8 + 0.5 + 0.7
|
||||
= 7.3 → 73/100 → Grade: B
|
||||
```
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
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,' or 'involuntary churn.' This skill covers voluntary churn (cancel flows, save offers, exit surveys) and involuntary churn (dunning, payment recovery). For post-cancel win-back email sequences, see email-sequence. For in-app upgrade paywalls, see paywall-upgrade-cro."
|
||||
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
|
||||
---
|
||||
@@ -375,7 +375,7 @@ Test one variable at a time:
|
||||
- **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
|
||||
- **No post-cancel path** — Make reactivation easy and trigger win-back emails, because some churned users will want to come back
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"skill_name": "churn-prevention",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Our SaaS product has a 7% monthly churn rate and we need to bring it down. We're a $49/month project management tool with about 2,000 paying customers. Can you help us design a churn prevention strategy?",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should address both voluntary and involuntary churn. Should design a cancel flow following the framework: trigger → exit survey → dynamic save offer → confirmation → post-cancel nurture. Should include the 7 exit survey categories and recommend dynamic save offers mapped to each cancellation reason. Should address dunning for involuntary churn (pre-dunning, smart retry, email sequence, grace period). Should recommend a health score model. Should provide prioritized implementation plan.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Addresses both voluntary and involuntary churn",
|
||||
"Designs cancel flow with proper stages",
|
||||
"Includes exit survey with multiple categories",
|
||||
"Maps save offers to cancellation reasons",
|
||||
"Addresses dunning stack for payment recovery",
|
||||
"Recommends health score model",
|
||||
"Provides prioritized implementation plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We keep losing customers because their credit cards expire. About 15% of our churn is from failed payments. How do we fix this?",
|
||||
"expected_output": "Should identify this as involuntary churn / payment recovery. Should apply the dunning stack framework: pre-dunning (card expiration reminders before failure), smart retry (retry logic based on failure reason), dunning email sequence (escalating urgency), grace period, and eventual cancellation. Should provide specific timing for each stage. Should recommend payment recovery tools and strategies (card updater services, backup payment methods). Should include recovery rate benchmarks.",
|
||||
"assertions": [
|
||||
"Identifies as involuntary churn / payment recovery",
|
||||
"Applies dunning stack framework",
|
||||
"Includes pre-dunning card expiration reminders",
|
||||
"Includes smart retry logic",
|
||||
"Provides dunning email sequence with escalating urgency",
|
||||
"Recommends grace period before cancellation",
|
||||
"Mentions card updater services or backup payment methods",
|
||||
"Includes recovery benchmarks"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "what should we show users when they click the cancel button? right now they just go straight to cancellation with no attempt to save them",
|
||||
"expected_output": "Should trigger on casual phrasing. Should design the cancel flow: cancel button → exit survey → dynamic save offer → confirmation → post-cancel. Should detail the exit survey categories (too expensive, missing feature, switched to competitor, not using enough, technical issues, bad support, other). Should provide dynamic save offers matched to each reason (e.g., too expensive → discount offer, missing feature → roadmap update, not using enough → onboarding help). Should include copy recommendations for each screen. Should warn against dark patterns (making it impossible to cancel).",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Designs multi-step cancel flow",
|
||||
"Includes exit survey with 7 categories",
|
||||
"Provides dynamic save offers mapped to reasons",
|
||||
"Includes copy recommendations",
|
||||
"Warns against dark patterns",
|
||||
"Includes confirmation and post-cancel steps"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "How do we identify which customers are at risk of churning before they actually cancel? We want to be proactive.",
|
||||
"expected_output": "Should apply the health score model framework. Should define health score components: product usage signals (login frequency, feature adoption, key action completion), engagement signals (support tickets, NPS responses, email engagement), and account signals (contract type, company growth, stakeholder changes). Should recommend scoring methodology (0-100 scale). Should define risk tiers and recommended interventions for each tier. Should suggest data sources and implementation approach.",
|
||||
"assertions": [
|
||||
"Applies health score model framework",
|
||||
"Defines usage-based health signals",
|
||||
"Defines engagement-based health signals",
|
||||
"Defines account-based health signals",
|
||||
"Recommends scoring methodology",
|
||||
"Defines risk tiers with interventions",
|
||||
"Suggests data sources and implementation"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Our exit survey shows that 40% of cancellations say 'too expensive' as the reason. What save offers should we try?",
|
||||
"expected_output": "Should reference the dynamic save offers mapped to the 'too expensive' reason. Should suggest multiple offer types: temporary discount, downgrade to cheaper plan, annual billing discount, pause instead of cancel, extended trial of current plan. Should recommend testing different offers to find what works best. Should also dig deeper — 'too expensive' often masks other issues (not seeing value, not using enough features). Should suggest follow-up questions in the exit survey to get more specific.",
|
||||
"assertions": [
|
||||
"References save offers for 'too expensive' reason",
|
||||
"Suggests multiple offer types (discount, downgrade, pause)",
|
||||
"Recommends testing different offers",
|
||||
"Notes that 'too expensive' often masks other issues",
|
||||
"Suggests deeper follow-up questions",
|
||||
"Provides specific save offer copy or structure"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "We want to set up a win-back email sequence for customers who already cancelled. Can you help write those emails?",
|
||||
"expected_output": "Should recognize this overlaps with email sequence work. Should defer to or cross-reference the email-sequence skill for writing the actual email sequence. May provide churn-specific context (timing post-cancel, re-engagement hooks, win-back offer strategy) but should make clear that email-sequence is the right skill for designing and writing the full email sequence.",
|
||||
"assertions": [
|
||||
"Recognizes overlap with email sequence work",
|
||||
"References or defers to email-sequence skill",
|
||||
"May provide churn-specific context for the sequence",
|
||||
"Does not attempt to write a full email sequence"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
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. Covers subject lines, opening lines, body copy, CTAs, personalization, and multi-touch follow-up sequences.
|
||||
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
|
||||
---
|
||||
@@ -100,7 +100,7 @@ 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."
|
||||
Each follow-up should add something new — a different angle, fresh proof, a useful resource. "Just checking in" gives the reader no reason to respond.
|
||||
|
||||
- 3-5 total emails, increasing gaps between them
|
||||
- Each email should stand alone (they may not have read the previous ones)
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"skill_name": "cold-email",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Write a cold email to VP of Marketing at mid-size B2B SaaS companies. We sell a content analytics platform that shows which blog posts actually drive pipeline. Our main proof point: customers see 3x increase in content-attributed revenue within 90 days.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should write like a peer, not a vendor. Should use one of the structure frameworks (observation→problem→proof→ask or similar). Subject line should be 2-4 words, lowercase, internal-looking. Every sentence should earn its place. Personalization should connect to the prospect's problem, not just their name. Should use the 3x revenue proof point as social proof, not a feature claim. CTA should be low-friction (not 'book a demo'). Should provide 2-3 variations. Should include a quality check against the guidelines.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Writes like a peer, not a vendor",
|
||||
"Uses a structure framework from the skill",
|
||||
"Subject line is short, lowercase, internal-looking",
|
||||
"Every sentence earns its place (concise)",
|
||||
"Personalization connects to prospect's problem",
|
||||
"Uses proof point as social proof",
|
||||
"CTA is low-friction",
|
||||
"Provides 2-3 variations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Help me write a cold email to CTOs at enterprise companies. I sell cybersecurity training. My current email has a 2% open rate and 0% reply rate.",
|
||||
"expected_output": "Should diagnose the current email's likely problems based on 2% open rate (subject line issue) and 0% reply rate (body/relevance issue). Should apply voice calibration for CTO audience (respect their time, technical credibility, executive-level language). Should provide a completely new email following structure frameworks. Subject line should be 2-4 words, look internal. Should adapt tone for enterprise CTOs — more formal than startup audience but still peer-like. Should provide the email plus analysis of why each element works.",
|
||||
"assertions": [
|
||||
"Diagnoses problems from the performance data",
|
||||
"Identifies subject line as likely open rate issue",
|
||||
"Applies voice calibration for CTO audience",
|
||||
"Subject line is short, lowercase, internal-looking",
|
||||
"Adapts tone for enterprise audience",
|
||||
"Uses structure framework from the skill",
|
||||
"Explains why each element works"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "write me a follow-up sequence. prospect didn't reply to my first email about our HR software. how many should I send and how far apart?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the follow-up sequence guidance: 3-5 follow-ups recommended. Each follow-up should add something new (new angle, new proof point, new value) — not just 'bumping' or 'checking in.' Should provide timing recommendations between emails. Should provide actual follow-up email copy for each touch, with different angles. Should include a breakup email at the end. Should note that each follow-up should be shorter than the previous.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Recommends 3-5 follow-up emails",
|
||||
"Each follow-up adds something new",
|
||||
"Does not use 'just bumping' or 'checking in' language",
|
||||
"Provides timing between emails",
|
||||
"Provides actual copy for each follow-up",
|
||||
"Includes a breakup email",
|
||||
"Follow-ups get progressively shorter"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Review this cold email and tell me what's wrong: 'Dear Sir/Madam, I hope this email finds you well. I wanted to reach out to introduce our innovative cloud-based platform that leverages AI to streamline your business operations. We have helped over 500 companies transform their workflows. I would love to schedule a 30-minute call to discuss how we can help your organization. Best regards, John'",
|
||||
"expected_output": "Should apply the quality check framework. Should identify multiple problems: 'Dear Sir/Madam' (no personalization), 'I hope this email finds you well' (filler), 'innovative cloud-based platform' (jargon/buzzwords), 'leverages AI to streamline' (vague vendor language), 'transform their workflows' (means nothing), '30-minute call' (too much ask for cold email), entire email is about the sender not the prospect. Should rewrite following the principles: peer tone, observation→problem→proof→ask structure, every sentence earns its place, personalization connected to their problem, low-friction CTA.",
|
||||
"assertions": [
|
||||
"Identifies lack of personalization",
|
||||
"Identifies filler phrases",
|
||||
"Identifies jargon and buzzwords",
|
||||
"Identifies vendor language vs peer language",
|
||||
"Identifies CTA as too high-friction",
|
||||
"Notes email is sender-focused not prospect-focused",
|
||||
"Provides a rewritten version",
|
||||
"Rewrite follows cold email principles"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "What are the best subject lines for cold emails? I want to maximize open rates.",
|
||||
"expected_output": "Should apply the subject line guidelines: short (2-4 words), lowercase or sentence case, internal-looking (should look like it came from a colleague, not a vendor). Should provide examples following these principles. Should explain why these work (bypass promotional filters, trigger curiosity, don't look like marketing). Should warn against common bad subject lines (ALL CAPS, emojis, clickbait, long subjects). Should note that subject line gets them to open but body gets them to reply.",
|
||||
"assertions": [
|
||||
"Applies subject line guidelines (2-4 words, lowercase, internal-looking)",
|
||||
"Provides specific examples",
|
||||
"Explains why the format works",
|
||||
"Warns against common bad subject line patterns",
|
||||
"Notes distinction between open rate and reply rate"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you help me set up an automated email drip campaign for leads who download our whitepaper?",
|
||||
"expected_output": "Should recognize this is a lifecycle/nurture email sequence, not cold outreach. Should defer to or cross-reference the email-sequence skill, which handles drip campaigns, lead nurture sequences, and lifecycle emails. Cold email is specifically for unsolicited outbound outreach to prospects who haven't opted in. Should make this distinction clear.",
|
||||
"assertions": [
|
||||
"Recognizes this as lifecycle/nurture email, not cold outreach",
|
||||
"References or defers to email-sequence skill",
|
||||
"Explains the distinction between cold email and lifecycle email",
|
||||
"Does not attempt to design a nurture sequence using cold email patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
---
|
||||
name: community-marketing
|
||||
description: "Build and leverage online communities to drive product growth and brand loyalty. Use when the user wants to create a community strategy, grow a Discord or Slack community, manage a forum or subreddit, build brand advocates, increase word-of-mouth, drive community-led growth, engage users post-signup, or turn customers into evangelists. Trigger phrases: \"build a community,\" \"community strategy,\" \"Discord community,\" \"Slack community,\" \"community-led growth,\" \"brand advocates,\" \"user community,\" \"forum strategy,\" \"community engagement,\" \"grow our community,\" \"ambassador program,\" \"community flywheel.\""
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# Community Marketing
|
||||
|
||||
You are an expert community builder and community-led growth strategist. Your goal is to help the user design, launch, and grow a community that creates genuine value for members while driving measurable business outcomes.
|
||||
|
||||
## Before You Start
|
||||
|
||||
**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.
|
||||
|
||||
Understand the situation (ask if not provided):
|
||||
|
||||
1. **What is the product or brand?** — What problem does it solve, who uses it
|
||||
2. **What community platform(s) are in play?** — Discord, Slack, Circle, Reddit, Facebook Groups, forum, etc.
|
||||
3. **What stage is the community at?** — Pre-launch, 0–100 members, 100–1k, scaling, or established
|
||||
4. **What is the primary community goal?** — Retention, activation, word-of-mouth, support deflection, product feedback, revenue
|
||||
5. **Who is the ideal community member?** — Role, motivation, what they hope to get from joining
|
||||
|
||||
Work with whatever context is available. If key details are missing, make reasonable assumptions and flag them.
|
||||
|
||||
---
|
||||
|
||||
## Community Strategy Principles
|
||||
|
||||
### Build around a shared identity, not just a product
|
||||
|
||||
The strongest communities are built around who members *are* or aspire to be — not around your product. Members join because of the product but stay because of the people and identity.
|
||||
|
||||
Examples:
|
||||
- Indie hackers (identity: bootstrapped founders)
|
||||
- r/homelab (identity: tinkerers who self-host)
|
||||
- Figma community (identity: designers who care about craft)
|
||||
|
||||
Always define: **What identity does this community reinforce for its members?**
|
||||
|
||||
### Value must flow to members first
|
||||
|
||||
Every community touchpoint should answer: *What does the member get from this?*
|
||||
|
||||
- Exclusive knowledge or early access
|
||||
- Peer connections they can't get elsewhere
|
||||
- Recognition and status within a group they respect
|
||||
- Direct influence on the product roadmap
|
||||
- Career opportunities, visibility, or credibility
|
||||
|
||||
### The Community Flywheel
|
||||
|
||||
Healthy communities compound over time:
|
||||
|
||||
```
|
||||
Members join → get value → engage → create content/help others
|
||||
↑ ↓
|
||||
←←←←← new members discover the community ←←
|
||||
```
|
||||
|
||||
Design for the flywheel from day one. Every decision should ask: *Does this accelerate the loop or slow it down?*
|
||||
|
||||
---
|
||||
|
||||
## Playbooks by Goal
|
||||
|
||||
### Launching a Community from Zero
|
||||
|
||||
1. **Recruit 20–50 founding members manually** — DM your most engaged users, beta testers, or fans. Don't open publicly until there is baseline activity.
|
||||
2. **Set the culture explicitly** — Write community guidelines that describe the *vibe*, not just the rules. What does great participation look like here?
|
||||
3. **Seed conversations before launch** — Pre-populate channels with 5–10 posts that model the behavior you want. Questions, wins, resources.
|
||||
4. **Do things that don't scale at first** — Reply to every post. Welcome every new member by name. Host a weekly call. You are buying social proof.
|
||||
5. **Define your core loop** — What action do you want members to take weekly? Make it easy and reward it publicly.
|
||||
|
||||
### Growing an Existing Community
|
||||
|
||||
1. **Audit where members drop off** — Are people joining but not posting? Posting once and disappearing? Identify the leaky stage.
|
||||
2. **Create a new member journey** — A pinned welcome post, a #introduce-yourself channel, a DM or email from a community manager, a clear "start here" path.
|
||||
3. **Surface member wins publicly** — Showcase user projects, testimonials, milestones. This reinforces identity and signals that participation has rewards.
|
||||
4. **Run recurring community rituals** — Weekly threads (e.g., "What are you working on?"), monthly AMAs, seasonal challenges. Rituals create habit.
|
||||
5. **Identify and invest in power users** — 1% of members generate 90% of value. Give them recognition, early access, moderator roles, or direct product input.
|
||||
|
||||
### Building a Brand Ambassador / Advocate Program
|
||||
|
||||
1. **Identify candidates** — Look for people who already recommend you unprompted. Check reviews, social mentions, community posts.
|
||||
2. **Make the ask personal** — Don't send a generic form. Reach out 1:1 and explain why you chose them specifically.
|
||||
3. **Offer meaningful benefits** — Exclusive access, swag, revenue share, or public recognition — not just "early access to features."
|
||||
4. **Give them tools and content** — Referral links, shareable assets, key talking points, a private Slack channel.
|
||||
5. **Measure and iterate** — Track referral traffic, signups, and engagement driven by advocates. Double down on what works.
|
||||
|
||||
### Community-Led Support (Deflection + Retention)
|
||||
|
||||
1. **Create a searchable knowledge base** from top community questions
|
||||
2. **Recognize members who help others** — "Community Expert" badges, leaderboards, shoutouts
|
||||
3. **Close the loop with product** — When community feedback drives a change, announce it publicly and credit the members who raised it
|
||||
4. **Monitor sentiment weekly** — Look for patterns in complaints or confusion before they become churn signals
|
||||
|
||||
---
|
||||
|
||||
## Platform Selection Guide
|
||||
|
||||
| Platform | Best For | Watch Out For |
|
||||
|----------|----------|---------------|
|
||||
| Discord | Developer, gaming, creator communities; real-time chat | High noise, hard to search, onboarding friction |
|
||||
| Slack | B2B / professional communities; familiar to SaaS buyers | Free tier limits history; feels like work |
|
||||
| Circle | Creator or course-based communities; clean UX | Less organic discovery; requires driving traffic |
|
||||
| Reddit | High-volume public communities; SEO benefit | You don't own it; moderation is hard |
|
||||
| Facebook Groups | Consumer brands; older demographics | Declining organic reach; algorithm dependent |
|
||||
| Forum (Discourse) | Long-form technical communities; SEO-rich | Slower velocity; higher effort to post |
|
||||
|
||||
---
|
||||
|
||||
## Community Health Metrics
|
||||
|
||||
Track these signals weekly:
|
||||
|
||||
- **DAU/MAU ratio** — Stickiness. Above 20% is healthy for most communities.
|
||||
- **New member post rate** — % of new members who post within 7 days of joining
|
||||
- **Thread reply rate** — % of posts that receive at least one reply
|
||||
- **Churn / lurker ratio** — Members who joined but haven't posted in 30+ days
|
||||
- **Content created by non-staff** — % of posts not written by the company team
|
||||
|
||||
**Warning signs:**
|
||||
- Most posts are from the company team, not members
|
||||
- Questions go unanswered for >24 hours
|
||||
- The same 5 people account for 80%+ of engagement
|
||||
- New members stop posting after their intro message
|
||||
|
||||
---
|
||||
|
||||
## Output Formats
|
||||
|
||||
Depending on what the user needs, produce one of:
|
||||
|
||||
- **Community Strategy Doc** — Platform choice, identity definition, core loop, 90-day launch plan
|
||||
- **Channel Architecture** — Recommended channels/categories with purpose and posting guidelines for each
|
||||
- **New Member Journey** — Welcome sequence: pinned post, DM template, first-week prompts
|
||||
- **Community Ritual Calendar** — Weekly/monthly recurring events and threads
|
||||
- **Ambassador Program Brief** — Criteria, benefits, outreach template, tracking plan
|
||||
- **Health Audit Report** — Current metrics, diagnosis, top 3 priorities to fix
|
||||
|
||||
Always be specific. Generic advice ("be consistent," "provide value") is not useful. Give the user something they can act on today.
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What platform are you building on (or considering)?
|
||||
2. What stage is the community at? (Pre-launch, early, growing, established)
|
||||
3. What's the primary business goal? (Retention, activation, word-of-mouth, support deflection)
|
||||
4. Who is the ideal community member and what motivates them?
|
||||
5. Do you have existing users or customers to seed from?
|
||||
6. How much time can you dedicate to community management weekly?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **referral-program**: For structured referral and ambassador incentive programs
|
||||
- **churn-prevention**: For retention strategies that complement community engagement
|
||||
- **social-content**: For content creation across social platforms
|
||||
- **customer-research**: For understanding your community members' needs and language
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: competitor-alternatives
|
||||
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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"skill_name": "competitor-alternatives",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Create a 'Best Asana Alternatives' page for our project management tool. We compete mainly on price (we're $8/user vs their $24/user) and simplicity (they've become bloated). Target audience is small teams (5-20 people).",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify this as the plural alternatives format ([Competitor] Alternatives). Should include the essential sections: TL;DR comparison, brief paragraphs on each alternative (including the user's product positioned first or prominently), feature comparison table, pricing comparison, who each alternative is best for. Should use the modular content architecture approach. Should address SEO considerations for the target keyword 'Asana alternatives.' Should position the user's product with the stated differentiators (price, simplicity).",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Identifies as plural alternatives format",
|
||||
"Includes TL;DR comparison section",
|
||||
"Includes feature comparison table",
|
||||
"Includes pricing comparison",
|
||||
"Includes 'who it's best for' per alternative",
|
||||
"Positions user's product prominently with differentiators",
|
||||
"Addresses SEO for target keyword"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Write a 'HubSpot vs Salesforce' comparison page. We're HubSpot and want to show why we're the better choice for SMBs.",
|
||||
"expected_output": "Should identify this as the 'you vs competitor' format. Should include structured comparison sections: overview of both, feature-by-feature comparison, pricing comparison, pros/cons of each, who each is best for, and migration path. Should be factually accurate about the competitor while strategically positioning the user's product. Should include a TL;DR at the top. Should address the SMB angle throughout. Should use the centralized competitor data architecture pattern.",
|
||||
"assertions": [
|
||||
"Identifies as 'you vs competitor' format",
|
||||
"Includes structured comparison sections",
|
||||
"Includes feature-by-feature comparison",
|
||||
"Includes pricing comparison",
|
||||
"Includes TL;DR at the top",
|
||||
"Factually accurate about competitor",
|
||||
"Strategically positions user's product for SMBs",
|
||||
"Includes migration path or switching section"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "we need a page targeting 'mailchimp alternative' (singular). we're an email marketing platform focused on e-commerce brands.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should identify this as the singular alternative format ([Competitor] Alternative — positioning your product as THE alternative). Should focus the entire page on why the user's product is the best Mailchimp alternative for e-commerce. Should include: why people switch from Mailchimp, what the user's product does better (e-commerce specific features), feature comparison, pricing comparison, migration guide, customer testimonials. Should optimize for the singular keyword 'Mailchimp alternative.'",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Identifies as singular alternative format",
|
||||
"Focuses on user's product as THE alternative",
|
||||
"Includes why people switch from Mailchimp",
|
||||
"Highlights e-commerce-specific advantages",
|
||||
"Includes feature and pricing comparison",
|
||||
"Includes migration guide",
|
||||
"Optimizes for singular keyword"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Can you create a comparison page for 'Notion vs Coda'? We're a third-party review site, not affiliated with either product.",
|
||||
"expected_output": "Should identify this as the 'competitor vs competitor' format (third-party perspective). Should maintain objectivity since the user isn't either product. Should include balanced comparison: overview of both, feature comparison, pricing, pros/cons, use case recommendations. Should use the essential page sections from the skill. Should suggest how to monetize the page (affiliate links, CTA to the user's own product if relevant). Should address SEO for the 'Notion vs Coda' keyword.",
|
||||
"assertions": [
|
||||
"Identifies as 'competitor vs competitor' format",
|
||||
"Maintains objectivity (third-party perspective)",
|
||||
"Includes balanced feature comparison",
|
||||
"Includes pricing comparison",
|
||||
"Includes use case recommendations",
|
||||
"Addresses SEO considerations",
|
||||
"Suggests monetization approach"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "We want to build a whole competitor comparison hub. We have 5 main competitors and want to create alternative pages for each, plus head-to-head comparisons. How should we structure this?",
|
||||
"expected_output": "Should apply the centralized competitor data architecture. Should recommend a hub structure with: individual alternative pages for each competitor (5 singular pages), a 'best alternatives' roundup page, head-to-head comparison pages for key matchups. Should address internal linking strategy between these pages. Should recommend the research process for gathering competitive data. Should address URL structure and site architecture for the hub.",
|
||||
"assertions": [
|
||||
"Applies centralized competitor data architecture",
|
||||
"Recommends hub structure with multiple page types",
|
||||
"Suggests individual and roundup alternative pages",
|
||||
"Addresses internal linking between comparison pages",
|
||||
"Recommends research process for competitive data",
|
||||
"Addresses URL structure"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "I need to create a battle card for our sales team comparing us to Zendesk. It should help reps handle competitive objections during sales calls.",
|
||||
"expected_output": "Should recognize this as internal sales enablement material, not a public comparison page. Should defer to or cross-reference the sales-enablement skill, which handles battle cards, objection handling docs, and internal competitive collateral. May provide some competitive positioning advice but should make clear that sales-enablement is the right skill for internal sales materials.",
|
||||
"assertions": [
|
||||
"Recognizes this as internal sales enablement material",
|
||||
"References or defers to sales-enablement skill",
|
||||
"Does not attempt to create internal battle card using public comparison page patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: content-strategy
|
||||
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
|
||||
---
|
||||
@@ -348,6 +348,12 @@ Visual or structured representation of how content interconnects.
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
- **[Headless CMS Guide](references/headless-cms.md)**: CMS selection, content modeling for marketing, editorial workflows, platform comparison (Sanity, Contentful, Strapi)
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **copywriting**: For writing individual content pieces
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "content-strategy",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me build a content strategy for our B2B SaaS product. We sell expense management software to finance teams at companies with 50-500 employees. We currently have no blog and want to start from scratch.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should establish content pillars (3-5 core topic areas). Should map content types by buyer stage (awareness → consideration → decision → implementation). Should identify keyword research opportunities by buyer stage. Should recommend a mix of searchable (SEO-driven) and shareable (thought leadership, data) content. Should use the prioritization scoring framework (customer impact 40%, content-market fit 30%, search potential 20%, resources 10%). Should provide an initial content calendar or publishing cadence. Should recommend content types appropriate for starting from scratch.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Establishes 3-5 content pillars",
|
||||
"Maps content by buyer stage (awareness through implementation)",
|
||||
"Includes keyword research by buyer stage",
|
||||
"Recommends mix of searchable and shareable content",
|
||||
"Uses prioritization scoring framework",
|
||||
"Provides publishing cadence or calendar",
|
||||
"Recommends appropriate starting content types"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We have 200+ blog posts but traffic has been flat for a year. Our content feels random — no clear strategy. How do we fix this?",
|
||||
"expected_output": "Should diagnose the 'random content' problem. Should recommend a content audit process to evaluate existing posts. Should introduce content pillars and topical clustering to organize the existing library. Should identify hub-and-spoke opportunities from existing content. Should recommend which posts to update, consolidate, or retire. Should use the prioritization framework to plan next steps. Should address topical authority building through clusters.",
|
||||
"assertions": [
|
||||
"Diagnoses the 'random content' problem",
|
||||
"Recommends content audit for existing posts",
|
||||
"Introduces content pillars and topical clustering",
|
||||
"Identifies hub-and-spoke opportunities",
|
||||
"Recommends update, consolidate, or retire decisions",
|
||||
"Uses prioritization framework",
|
||||
"Addresses topical authority building"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "what kind of content should we be creating? we're a developer tool (API testing platform) and our audience is backend developers and QA engineers",
|
||||
"expected_output": "Should trigger on casual phrasing. Should recommend content types appropriate for a developer audience: technical tutorials, documentation-style guides, use-case content, template/example libraries, data-driven benchmarks. Should note that developer audiences prefer depth, accuracy, and practical value over marketing fluff. Should suggest content pillars aligned with developer interests. Should use the ideation sources framework (keyword data, community forums like Stack Overflow/Reddit, competitor gaps).",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Recommends content types for developer audience",
|
||||
"Emphasizes technical depth and practical value",
|
||||
"Notes developers prefer substance over marketing",
|
||||
"Suggests content pillars for developer tool",
|
||||
"Uses ideation sources framework",
|
||||
"Mentions developer community channels"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "How should we prioritize which content to create first? We have a list of 50 blog post ideas but limited resources — one content marketer writing 2 posts per week.",
|
||||
"expected_output": "Should apply the prioritization scoring framework: customer impact (40%), content-market fit (30%), search potential (20%), resources required (10%). Should help score or rank the content ideas using this framework. Should recommend focusing on high-impact, lower-effort content first. Should consider the buyer stage distribution (don't write only top-of-funnel). Should provide a practical workflow for the single content marketer to use going forward.",
|
||||
"assertions": [
|
||||
"Applies prioritization scoring framework with weights",
|
||||
"Explains each scoring dimension",
|
||||
"Recommends focusing on high-impact, lower-effort first",
|
||||
"Considers buyer stage distribution",
|
||||
"Provides practical workflow for limited resources"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "We want to build topical authority in 'employee engagement.' What does a content cluster look like for this topic?",
|
||||
"expected_output": "Should apply the hub-and-spoke content cluster model. Should design a pillar page for 'employee engagement' (comprehensive, 3000+ word guide). Should identify 8-15 supporting spoke articles targeting long-tail keywords related to employee engagement. Should map the internal linking structure between hub and spokes. Should address keyword research for the cluster. Should recommend content types for each piece (guide, how-to, template, data-driven, etc.).",
|
||||
"assertions": [
|
||||
"Applies hub-and-spoke content cluster model",
|
||||
"Designs a pillar page for the core topic",
|
||||
"Identifies 8-15 supporting spoke articles",
|
||||
"Maps internal linking between hub and spokes",
|
||||
"Addresses keyword research for the cluster",
|
||||
"Recommends content types for each piece"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you write a blog post about remote work best practices for our HR software blog?",
|
||||
"expected_output": "Should recognize this is a copywriting/content creation task, not a content strategy task. Should defer to or cross-reference the copywriting skill for writing individual pieces of content. May provide strategic context (where this fits in the content strategy, keyword targeting, audience) but should make clear that copywriting is the right skill for writing the actual content.",
|
||||
"assertions": [
|
||||
"Recognizes this as content creation, not strategy",
|
||||
"References or defers to copywriting skill",
|
||||
"Does not attempt to write the full blog post",
|
||||
"May provide strategic context for the piece"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
# Headless CMS Guide
|
||||
|
||||
Reference for choosing, modeling, and implementing a headless CMS for marketing content.
|
||||
|
||||
## When to Use This Reference
|
||||
|
||||
Use this when selecting a CMS for a new project, designing content models for marketing sites, setting up editorial workflows, or connecting CMS content to programmatic pages.
|
||||
|
||||
---
|
||||
|
||||
## Headless vs Traditional CMS
|
||||
|
||||
A headless CMS separates content management from presentation. Content is stored in a structured backend and delivered via API to any frontend.
|
||||
|
||||
### When Headless Makes Sense
|
||||
|
||||
- Multiple frontends consume the same content (web, mobile, email)
|
||||
- Developers want full control over the frontend stack
|
||||
- Content needs to be reused across channels
|
||||
- You're building with a modern framework (Next.js, Remix, Astro)
|
||||
- Marketing needs structured, reusable content blocks
|
||||
|
||||
### When Traditional Works Better
|
||||
|
||||
- Small team with no dedicated developers
|
||||
- Simple blog or brochure site
|
||||
- WYSIWYG editing is a hard requirement
|
||||
- Budget is tight and WordPress/Webflow does the job
|
||||
|
||||
### Decision Checklist
|
||||
|
||||
| Factor | Headless | Traditional |
|
||||
|--------|----------|-------------|
|
||||
| Multi-channel delivery | Yes | Limited |
|
||||
| Developer control | Full | Constrained |
|
||||
| Non-technical editing | Requires setup | Built-in |
|
||||
| Time to launch | Longer | Faster |
|
||||
| Content reuse | Native | Manual |
|
||||
| Hosting flexibility | Any frontend | Platform-dependent |
|
||||
|
||||
---
|
||||
|
||||
## Content Modeling for Marketing
|
||||
|
||||
### Core Principles
|
||||
|
||||
1. **Think in types, not pages.** A "Landing Page" is a content type with fields — not an HTML file. This lets you reuse components across pages.
|
||||
2. **Separate content from presentation.** Store the headline text, not the styled headline. Presentation belongs in the frontend.
|
||||
3. **Design for reuse.** If testimonials appear on 5 pages, create a Testimonial type and reference it — don't duplicate.
|
||||
4. **Keep models flat.** Deeply nested structures are hard to query and maintain. Prefer references over nesting.
|
||||
|
||||
### Common Marketing Content Types
|
||||
|
||||
| Type | Key Fields | Notes |
|
||||
|------|-----------|-------|
|
||||
| **Landing Page** | title, slug, hero, sections[], seo | Modular sections for flexibility |
|
||||
| **Blog Post** | title, slug, body, author, category, tags, publishedAt, seo | Rich text or Portable Text body |
|
||||
| **Case Study** | title, customer, challenge, solution, results, metrics[], logo | Link to related products/features |
|
||||
| **Testimonial** | quote, author, role, company, avatar, rating | Reference from landing pages |
|
||||
| **FAQ** | question, answer, category | Group by category for programmatic pages |
|
||||
| **Author** | name, bio, avatar, social links | Reference from blog posts |
|
||||
| **CTA Block** | heading, body, buttonText, buttonUrl, variant | Reusable across pages |
|
||||
|
||||
### SEO Fields Checklist
|
||||
|
||||
Every page-level content type needs:
|
||||
|
||||
- `metaTitle` — 50-60 characters
|
||||
- `metaDescription` — 150-160 characters
|
||||
- `ogImage` — 1200x630px social preview
|
||||
- `slug` — URL path segment
|
||||
- `canonicalUrl` — optional override
|
||||
- `noIndex` — boolean for excluding from search
|
||||
- `structuredData` — optional JSON-LD override
|
||||
|
||||
---
|
||||
|
||||
## Editorial Workflows
|
||||
|
||||
### Draft → Review → Publish Cycle
|
||||
|
||||
1. **Draft** — Author creates or edits content
|
||||
2. **Review** — Editor reviews for accuracy, brand voice, SEO
|
||||
3. **Approve** — Stakeholder signs off
|
||||
4. **Schedule** — Set publish date/time
|
||||
5. **Publish** — Content goes live via API
|
||||
|
||||
### Preview APIs
|
||||
|
||||
All major headless CMS platforms support draft previews:
|
||||
|
||||
- **Sanity**: Real-time preview with `useLiveQuery` or Presentation tool
|
||||
- **Contentful**: Preview API (`preview.contentful.com`) with separate access token
|
||||
- **Strapi**: Draft & Publish system with `status=draft` query parameter (v5; replaces v4's `publicationState`)
|
||||
|
||||
Set up a preview route in your frontend (e.g., `/api/preview`) that authenticates and renders draft content.
|
||||
|
||||
### Roles and Permissions
|
||||
|
||||
| Role | Can Create | Can Edit | Can Publish | Can Delete |
|
||||
|------|:----------:|:--------:|:-----------:|:----------:|
|
||||
| Author | Yes | Own | No | Own drafts |
|
||||
| Editor | Yes | All | Yes | Drafts |
|
||||
| Admin | Yes | All | Yes | All |
|
||||
|
||||
Exact permission models vary by platform. Sanity uses role-based access. Contentful has space-level roles. Strapi has granular RBAC.
|
||||
|
||||
---
|
||||
|
||||
## Platform Comparison
|
||||
|
||||
| Feature | Sanity | Contentful | Strapi |
|
||||
|---------|--------|------------|--------|
|
||||
| Hosting | Cloud (managed) | Cloud (managed) | Self-hosted or Cloud |
|
||||
| Query Language | GROQ | REST / GraphQL | REST / GraphQL |
|
||||
| Free Tier | Generous | Limited | Open source (free) |
|
||||
| Real-time Collab | Yes (built-in) | Limited | No |
|
||||
| Best For | Developer flexibility | Enterprise multi-locale | Budget / self-hosted |
|
||||
| Content Modeling | Schema-as-code | Web UI | Web UI or code |
|
||||
| Media Handling | Built-in DAM | Built-in | Plugin-based |
|
||||
|
||||
### Sanity
|
||||
|
||||
**Strengths**: GROQ query language is powerful and flexible. Schema defined in code (version-controlled). Real-time collaborative editing. Portable Text for rich content. Generous free tier.
|
||||
|
||||
**Considerations**: Steeper learning curve for non-developers. Studio customization requires React knowledge. Vendor lock-in on GROQ queries.
|
||||
|
||||
**Marketing fit**: Best when developers and marketers collaborate closely. Strong for content-heavy sites with complex models.
|
||||
|
||||
### Contentful
|
||||
|
||||
**Strengths**: Mature enterprise platform. Excellent multi-locale support. Strong ecosystem of integrations. Composable content with Studio. Well-documented APIs.
|
||||
|
||||
**Considerations**: Pricing scales with content types and locales. Two separate APIs (Delivery and Management). Rate limits can be tight on lower plans.
|
||||
|
||||
**Marketing fit**: Best for enterprises with multi-market content needs. Good when you need established vendor reliability.
|
||||
|
||||
### Strapi
|
||||
|
||||
**Strengths**: Open source, self-hosted option. Full control over data. No per-seat pricing. Customizable admin panel. Plugin ecosystem. REST by default, GraphQL via plugin.
|
||||
|
||||
**Considerations**: Self-hosting means you handle infrastructure. Smaller ecosystem than Sanity/Contentful. V5 migration can be significant from V4.
|
||||
|
||||
**Marketing fit**: Best for teams with DevOps capability who want full control and no vendor lock-in. Good for budget-conscious projects.
|
||||
|
||||
### Others Worth Knowing
|
||||
|
||||
- **Hygraph** — GraphQL-native, strong for federation and multi-source content
|
||||
- **Keystatic** — Git-based, good for developer-content hybrid workflows
|
||||
- **Payload** — TypeScript-first, self-hosted, code-configured like Sanity
|
||||
- **Builder.io** — Visual editor with headless backend, good for non-technical marketers
|
||||
- **Prismic** — Slice-based content modeling, strong Next.js integration
|
||||
|
||||
---
|
||||
|
||||
## Integration with Marketing Skills
|
||||
|
||||
### Programmatic SEO
|
||||
|
||||
Use CMS as the data source for programmatic pages. Store structured data (FAQs, comparisons, city pages) as content types and generate pages from queries. See **programmatic-seo** skill.
|
||||
|
||||
### Copywriting
|
||||
|
||||
CMS content models enforce consistent structure. Define fields that match your copy frameworks (headline, subheadline, social proof, CTA). See **copywriting** skill.
|
||||
|
||||
### Site Architecture
|
||||
|
||||
URL structure, navigation hierarchy, and internal linking all depend on how content is organized in the CMS. Plan your content model and site architecture together. See **site-architecture** skill.
|
||||
|
||||
### Email Sequences
|
||||
|
||||
Pull CMS content into email templates for consistent messaging across web and email. Case studies, testimonials, and blog posts can feed email nurture sequences. See **email-sequence** skill.
|
||||
|
||||
---
|
||||
|
||||
## Implementation Checklist
|
||||
|
||||
- [ ] Define content types based on page types and reusable blocks
|
||||
- [ ] Add SEO fields to every page-level content type
|
||||
- [ ] Set up preview/draft mode in your frontend
|
||||
- [ ] Configure roles and permissions for your team
|
||||
- [ ] Create sample content for each type before building frontend
|
||||
- [ ] Set up webhook notifications for content changes (rebuild triggers)
|
||||
- [ ] Document content guidelines for editors (field descriptions, character limits)
|
||||
- [ ] Test content delivery performance (CDN, caching, ISR)
|
||||
- [ ] Plan migration strategy if moving from existing CMS
|
||||
|
||||
---
|
||||
|
||||
## Relevant Integration Guides
|
||||
|
||||
- [Sanity](../../../tools/integrations/sanity.md) — GROQ queries, mutations, CLI
|
||||
- [Contentful](../../../tools/integrations/contentful.md) — Delivery/Management APIs, publishing
|
||||
- [Strapi](../../../tools/integrations/strapi.md) — REST CRUD, filters, document API
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
name: copy-editing
|
||||
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, or refresh outdated content. 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,' 'sharpen the messaging,' 'refresh this content,' 'update this page,' 'this content is outdated,' or 'content audit.' Use this when the user already has copy and wants it improved or refreshed rather than rewritten from scratch. For writing new copy, see copywriting."
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
version: 1.3.0
|
||||
---
|
||||
|
||||
# Copy Editing
|
||||
@@ -256,6 +256,57 @@ For every statement, ask "Okay, so what?" If the copy doesn't answer that questi
|
||||
|
||||
---
|
||||
|
||||
## Expert Panel Scoring
|
||||
|
||||
Use this after completing the Seven Sweeps for an additional quality gate. For high-stakes copy (landing pages, launch emails, sales pages), a multi-persona expert review catches issues that a single perspective misses.
|
||||
|
||||
### How It Works
|
||||
|
||||
1. **Assemble 3-5 expert personas** relevant to the copy type
|
||||
2. **Each persona scores the copy 1-10** on their area of expertise
|
||||
3. **Collect specific critiques** — not just scores, but what to fix
|
||||
4. **Revise based on feedback** — address the lowest-scoring areas first
|
||||
5. **Re-score after revisions** — iterate until all personas score 7+, with an average of 8+ across the panel
|
||||
|
||||
### Recommended Expert Panels
|
||||
|
||||
**Landing page copy:**
|
||||
- Conversion copywriter (clarity, CTA strength, benefit hierarchy)
|
||||
- UX writer (scannability, cognitive load, user flow)
|
||||
- Target customer persona (does this speak to me? do I trust it?)
|
||||
- Brand strategist (voice consistency, positioning accuracy)
|
||||
|
||||
**Email sequence:**
|
||||
- Email marketing specialist (subject lines, open/click optimization)
|
||||
- Copywriter (hooks, storytelling, persuasion)
|
||||
- Spam filter analyst (deliverability red flags, trigger words)
|
||||
- Target customer persona (relevance, value, unsubscribe risk)
|
||||
|
||||
**Sales page / long-form:**
|
||||
- Direct response copywriter (offer structure, objection handling, urgency)
|
||||
- Skeptical buyer persona (proof gaps, trust issues, red flags)
|
||||
- Editor (flow, readability, conciseness)
|
||||
- SEO specialist (keyword coverage, search intent alignment)
|
||||
|
||||
### Scoring Rubric
|
||||
|
||||
| Score | Meaning |
|
||||
|-------|---------|
|
||||
| 9-10 | Publish-ready. No meaningful improvements. |
|
||||
| 7-8 | Strong. Minor tweaks only. |
|
||||
| 5-6 | Functional but has clear gaps. Needs another pass. |
|
||||
| 3-4 | Significant issues. Major revision needed. |
|
||||
| 1-2 | Fundamentally broken. Rethink approach. |
|
||||
|
||||
### When to Use
|
||||
|
||||
- **Always** for launch copy, pricing pages, and high-traffic landing pages
|
||||
- **Recommended** for email sequences, sales pages, and ad copy
|
||||
- **Optional** for blog posts, social content, and internal docs
|
||||
- **Skip** for quick updates, minor edits, and low-stakes content
|
||||
|
||||
---
|
||||
|
||||
## Quick-Pass Editing Checks
|
||||
|
||||
Use these for faster reviews when a full seven-sweep process isn't needed.
|
||||
@@ -416,6 +467,15 @@ This iterative process ensures each edit doesn't create new problems while respe
|
||||
## References
|
||||
|
||||
- [Plain English Alternatives](references/plain-english-alternatives.md): Replace complex words with simpler alternatives
|
||||
- [Content Refresh](references/content-refresh.md): Full checklist, refresh vs. rewrite matrix, and cadence guide
|
||||
|
||||
---
|
||||
|
||||
## Content Refresh Editing
|
||||
|
||||
Copy editing isn't just for new content. Existing pages decay over time — outdated stats, stale examples, and drifted brand voice. Use the content refresh framework when traffic is declining, data is stale, or the product has changed.
|
||||
|
||||
**For the full refresh checklist, refresh vs. rewrite decision matrix, and cadence guide**: See [references/content-refresh.md](references/content-refresh.md)
|
||||
|
||||
---
|
||||
|
||||
@@ -425,6 +485,7 @@ This iterative process ensures each edit doesn't create new problems while respe
|
||||
2. What action should readers take?
|
||||
3. Are there specific concerns or known issues?
|
||||
4. What proof/evidence do you have available?
|
||||
5. Is this new copy or a refresh of existing content?
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"skill_name": "copy-editing",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Edit this homepage copy for us: 'Welcome to CloudSync! We are very excited to offer you an innovative, cutting-edge platform that seamlessly integrates with your existing tools. Our powerful solution helps businesses of all sizes optimize their workflows and drive meaningful results. Get started today and experience the difference!'",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the Seven Sweeps Framework systematically. Sweep 1 (Clarity): identify vague language ('optimize workflows,' 'drive meaningful results,' 'experience the difference'). Sweep 2 (Voice & Tone): flag 'Welcome to' as weak opening, 'we are very excited' as company-focused. Sweep 3 (So What): question what specific value is being offered. Sweep 4 (Prove It): note no proof points, stats, or evidence. Sweep 5 (Specificity): flag 'businesses of all sizes,' 'existing tools,' 'powerful solution' as generic. Sweep 6 (Heightened Emotion): assess emotional impact. Sweep 7 (Zero Risk): check for trust signals. Should provide a rewritten version addressing all issues.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies Seven Sweeps Framework",
|
||||
"Identifies vague language (Clarity sweep)",
|
||||
"Flags weak opening and company-focused language (Voice & Tone sweep)",
|
||||
"Questions missing value proposition (So What sweep)",
|
||||
"Notes missing proof points (Prove It sweep)",
|
||||
"Flags generic terms (Specificity sweep)",
|
||||
"Provides a rewritten version"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Quick edit on this CTA section: 'Ready to take your business to the next level? Our team of dedicated professionals is standing by to help you achieve your goals. Click here to learn more about how we can help you succeed.'",
|
||||
"expected_output": "Should apply the quick-pass editing checks. Should identify: 'take your business to the next level' (cliché), 'team of dedicated professionals' (filler), 'standing by' (passive), 'click here' (weak CTA), 'learn more' (vague action), 'help you succeed' (generic). Should apply word-level, sentence-level, and paragraph-level checks. Should rewrite with specific value prop, active voice, and strong action-oriented CTA. Should be concise since this was requested as a 'quick edit.'",
|
||||
"assertions": [
|
||||
"Identifies clichés and filler phrases",
|
||||
"Flags 'click here' and 'learn more' as weak",
|
||||
"Applies word-level and sentence-level checks",
|
||||
"Rewrites with specific value and strong CTA",
|
||||
"Uses active voice in rewrite",
|
||||
"Keeps response concise for a quick edit"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "edit this product description, it feels too long and wordy: 'Our comprehensive project management solution provides teams with a robust set of tools that enable them to efficiently plan, execute, and monitor their projects from start to finish. With our intuitive interface, powerful analytics dashboard, and seamless integration capabilities, you can ensure that every aspect of your project is managed with precision and care. Whether you're a small startup or a large enterprise, our platform scales to meet your unique needs and requirements, helping you deliver projects on time and within budget every single time.'",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the Clarity and Specificity sweeps primarily. Should identify: redundancy ('plan, execute, and monitor' overlaps with 'from start to finish'), filler words ('comprehensive,' 'robust,' 'efficiently,' 'seamless,' 'unique'), hedge phrases ('ensuring every aspect,' 'with precision and care'), and generic claims ('scales to meet your needs,' 'on time and within budget every single time'). Should cut the copy significantly (probably by 50%+). Should provide a tighter rewrite that says the same thing in fewer, more specific words.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Identifies redundancy in the copy",
|
||||
"Identifies filler words and hedge phrases",
|
||||
"Identifies generic claims",
|
||||
"Cuts copy significantly (50%+ reduction)",
|
||||
"Provides tighter rewrite with specific language"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Review this testimonial section and improve it: 'CloudSync is great! It really helped our company. The team was very responsive and the product works well. We would recommend it to anyone looking for a solution. - John S., CEO'",
|
||||
"expected_output": "Should apply the Prove It and Specificity sweeps. Should identify the testimonial as too vague to be persuasive ('great,' 'really helped,' 'works well,' 'anyone looking for a solution'). Should recommend replacing with specific results ('reduced project delivery time by 30%'), specific context ('team of 45 engineers'), and specific outcomes. Should suggest questions to ask the customer for a better testimonial. Should not fabricate specific numbers but should provide a template showing what a strong testimonial looks like.",
|
||||
"assertions": [
|
||||
"Applies Prove It and Specificity sweeps",
|
||||
"Identifies testimonial as too vague",
|
||||
"Recommends specific results and context",
|
||||
"Suggests questions to get better testimonial",
|
||||
"Does not fabricate specific numbers",
|
||||
"Provides template for strong testimonial"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "I need you to apply the 'So What' and 'Zero Risk' sweeps to this pricing page copy: 'Our Pro plan includes unlimited projects, advanced reporting, priority support, and custom integrations. Starting at $99/month.'",
|
||||
"expected_output": "Should apply specifically the So What and Zero Risk sweeps as requested. So What: for each feature, ask 'so what does this mean for the customer?' — unlimited projects (what does that enable?), advanced reporting (what decisions can they make?), priority support (what does that mean in practice? response time?), custom integrations (which ones? what workflow does it enable?). Zero Risk: identify missing trust signals — no guarantee, no trial mention, no social proof near pricing, no 'cancel anytime' assurance. Should provide rewritten copy addressing both sweeps.",
|
||||
"assertions": [
|
||||
"Applies So What sweep to each feature",
|
||||
"Translates features to customer benefits",
|
||||
"Applies Zero Risk sweep",
|
||||
"Identifies missing trust signals",
|
||||
"Suggests guarantee, trial, or cancel-anytime language",
|
||||
"Provides rewritten copy addressing both sweeps"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Write fresh homepage copy for our new product. We're launching a CRM for real estate agents.",
|
||||
"expected_output": "Should recognize this is a copywriting-from-scratch task, not copy editing. Should defer to or cross-reference the copywriting skill, which handles writing new copy from scratch. Copy-editing is specifically for improving existing copy. Should make this distinction clear.",
|
||||
"assertions": [
|
||||
"Recognizes this as writing new copy, not editing existing copy",
|
||||
"References or defers to copywriting skill",
|
||||
"Explains that copy-editing is for improving existing copy",
|
||||
"Does not attempt to write full page copy from scratch"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
# Content Refresh Editing
|
||||
|
||||
Copy editing isn't just for new content. Existing pages and posts decay over time — outdated stats, stale examples, drifted brand voice, and missed SEO opportunities. A content refresh applies the same editing rigor to content that's already published.
|
||||
|
||||
## When to Refresh
|
||||
|
||||
- **Traffic declining** on a page that used to perform well
|
||||
- **Stats or data** are more than 12 months old
|
||||
- **Product has changed** — features, pricing, or positioning no longer match
|
||||
- **Competitors updated** their version of the same content
|
||||
- **AI search visibility** matters — outdated content gets cited less (see ai-seo skill)
|
||||
|
||||
## Content Refresh Checklist
|
||||
|
||||
1. **Freshness pass** — Update all dates, stats, and examples. Replace "in 2024" with current data. Remove references to deprecated features or tools.
|
||||
2. **Accuracy pass** — Verify all claims are still true. Check that linked resources still exist. Confirm pricing and feature descriptions match current state.
|
||||
3. **Voice pass** — Does the tone match your current brand voice? Older content often reflects an earlier stage of the company.
|
||||
4. **SEO pass** — Has search intent shifted for this topic? Are there new keywords or questions to address? Add "Last updated: [date]" prominently.
|
||||
5. **Proof pass** — Can you add newer testimonials, case studies, or data points that didn't exist when this was first published?
|
||||
6. **Structure pass** — Add comparison tables, FAQ sections, or other scannable formats that make the content easier to consume.
|
||||
|
||||
## Refresh vs. Rewrite
|
||||
|
||||
| Signal | Action |
|
||||
|--------|--------|
|
||||
| Core message still valid, details outdated | Refresh (update facts, stats, examples) |
|
||||
| Brand voice has evolved significantly | Refresh + voice rewrite |
|
||||
| Topic angle or audience has shifted | Full rewrite |
|
||||
| Page structure doesn't match current search intent | Full rewrite |
|
||||
| Just needs updated stats and links | Light refresh |
|
||||
|
||||
## Refresh Cadence
|
||||
|
||||
- **Pricing and product pages**: Every quarter, or when pricing/features change
|
||||
- **High-traffic blog posts**: Every 6 months
|
||||
- **Comparison and alternatives pages**: Every 3-6 months (competitors change fast)
|
||||
- **Evergreen guides**: Annually, unless traffic drops sooner
|
||||
- **Low-traffic pages**: Only when traffic data suggests an opportunity
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: copywriting
|
||||
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
|
||||
---
|
||||
@@ -67,7 +67,7 @@ Each section should advance one argument. Build a logical flow down the page.
|
||||
3. **Active over passive** — "We generate reports" not "Reports are generated"
|
||||
4. **Confident over qualified** — Remove "almost," "very," "really"
|
||||
5. **Show over tell** — Describe the outcome instead of using adverbs
|
||||
6. **Honest over sensational** — Never fabricate statistics or testimonials
|
||||
6. **Honest over sensational** — Fabricated statistics or testimonials erode trust and create legal liability
|
||||
|
||||
### Quick Quality Check
|
||||
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"skill_name": "copywriting",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Write homepage copy for a SaaS tool that automates employee onboarding. Target audience is HR directors at mid-size companies (200-2000 employees). Main differentiator is that it integrates with all major HRIS systems and cuts onboarding time from 2 weeks to 2 days.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should write full page copy organized by section: Headline, Subheadline, CTA (above the fold), then Social Proof, Problem/Pain, Solution/Benefits, How It Works, Objection Handling, and Final CTA. Should follow copywriting principles: clarity over cleverness, benefits over features, specificity (use the '2 weeks to 2 days' stat), customer language. Headline should communicate core value proposition. CTAs should be action-oriented ('Start Free Trial' not 'Submit'). Should provide 2-3 headline alternatives with rationale. Should include annotations explaining key copy choices. Should include meta content (SEO page title and meta description).",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Writes full page copy organized by section",
|
||||
"Includes Headline, Subheadline, and CTA above the fold",
|
||||
"Includes Social Proof, Problem/Pain, Solution/Benefits, How It Works sections",
|
||||
"Uses the '2 weeks to 2 days' specificity in copy",
|
||||
"CTAs are action-oriented, not generic",
|
||||
"Provides 2-3 headline alternatives with rationale",
|
||||
"Includes annotations explaining copy choices",
|
||||
"Includes meta content (SEO title and meta description)"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Rewrite this headline: 'An Innovative AI-Powered Platform for Streamlined Business Operations' — it's for a B2B SaaS tool that helps small businesses manage invoicing and payments.",
|
||||
"expected_output": "Should identify problems: jargon ('innovative,' 'AI-powered,' 'streamlined,' 'business operations'), too vague, company language not customer language. Should apply copywriting principles — specificity over vagueness, benefits over features, customer language over company language. Should provide 2-3 alternative headlines using formulas like '{Achieve outcome} without {pain point}' or 'The {category} for {audience}'. Each alternative should include rationale. Should also suggest a subheadline that adds specificity.",
|
||||
"assertions": [
|
||||
"Identifies jargon in original headline",
|
||||
"Identifies vagueness as a problem",
|
||||
"Identifies company language vs customer language issue",
|
||||
"Provides 2-3 alternative headlines",
|
||||
"Alternatives use headline formulas from the skill",
|
||||
"Each alternative includes rationale",
|
||||
"Suggests a subheadline"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "i need copy for my pricing page. we have three plans: starter ($29/mo), pro ($79/mo), business ($199/mo). it's a social media scheduling tool for marketers",
|
||||
"expected_output": "Should trigger on the casual phrasing. Should ask or infer audience context. Should apply Pricing Page guidance: help visitors choose the right plan, address 'which is right for me?' anxiety, make recommended plan obvious. Should write plan names, descriptions, feature lists with benefit-oriented copy (not just feature names). Should include a page headline that addresses the pricing decision. CTAs should be specific per plan. Should handle objection handling (FAQ copy). Should provide alternatives for key elements.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies Pricing Page guidance",
|
||||
"Addresses 'which plan is right for me' anxiety",
|
||||
"Makes recommended plan obvious",
|
||||
"Writes benefit-oriented feature copy, not just feature names",
|
||||
"Includes page headline",
|
||||
"CTAs are specific per plan",
|
||||
"Includes FAQ or objection handling copy",
|
||||
"Provides alternatives for key elements"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Write copy for our About page. We're a 3-person startup that built a developer tool for database migrations. Founded because we kept losing data during migrations at our last jobs. Tone should be professional but human.",
|
||||
"expected_output": "Should apply About Page guidance: tell the story of why you exist, connect mission to customer benefit, still include a CTA. Should adapt voice and tone to 'professional but human' as specified. Should tell the founder origin story authentically. Should connect the personal pain to the customer's pain. Should include a CTA even on the About page. Copy should follow style rules: active voice, confident, specific. Should NOT be overly corporate or generic.",
|
||||
"assertions": [
|
||||
"Applies About Page guidance",
|
||||
"Tells the story of why the company exists",
|
||||
"Connects mission to customer benefit",
|
||||
"Includes a CTA",
|
||||
"Adapts tone to professional but human",
|
||||
"Uses the founder origin story",
|
||||
"Connects personal pain to customer pain",
|
||||
"Uses active voice",
|
||||
"Avoids corporate jargon"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Can you improve this CTA? We currently have 'Learn More' on our feature page for our analytics dashboard product.",
|
||||
"expected_output": "Should immediately identify 'Learn More' as a weak CTA per the guidelines. Should apply the CTA formula: [Action Verb] + [What They Get] + [Qualifier]. Should provide 2-3 strong alternatives like 'See the Dashboard in Action,' 'Start Your Free Trial,' or 'Explore Analytics Features.' Each alternative should include rationale and context for when it works best. Should also consider CTA hierarchy — whether this is a primary or secondary CTA, and suggest complementary CTAs if relevant.",
|
||||
"assertions": [
|
||||
"Identifies 'Learn More' as a weak CTA",
|
||||
"Applies the CTA formula from the skill",
|
||||
"Provides 2-3 strong alternatives",
|
||||
"Each alternative includes rationale",
|
||||
"Considers CTA hierarchy (primary vs secondary)",
|
||||
"Suggests complementary CTAs"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Write me a 5-email welcome sequence for new trial users of our project management tool.",
|
||||
"expected_output": "Should recognize this is an email copywriting task, not page copywriting. Should defer to or cross-reference the email-sequence skill, which specifically handles email sequences, drip campaigns, and lifecycle emails. May provide brief general guidance but should make clear that email-sequence is the right skill for this task.",
|
||||
"assertions": [
|
||||
"Recognizes this as email sequence work",
|
||||
"References or defers to email-sequence skill",
|
||||
"Does not attempt to write a full email sequence using page copywriting patterns"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"prompt": "Review this copy and tell me what's wrong: 'We are extremely excited to announce our revolutionary, cutting-edge platform that will totally transform how businesses optimize their workflows! Sign up now!!'",
|
||||
"expected_output": "Should apply the Quick Quality Check. Should identify: exclamation points (remove them), marketing buzzwords without substance ('revolutionary,' 'cutting-edge,' 'totally transform,' 'optimize'), passive/weak constructions ('we are excited to announce'), vague language ('workflows'). Should apply writing style rules: simple over complex, specific over vague, confident over qualified, show over tell. Should rewrite the copy following these principles. Should provide 2-3 alternatives.",
|
||||
"assertions": [
|
||||
"Identifies exclamation point overuse",
|
||||
"Identifies marketing buzzwords without substance",
|
||||
"Identifies vague language",
|
||||
"Applies writing style rules",
|
||||
"Rewrites the copy following principles",
|
||||
"Provides alternatives",
|
||||
"Result is specific, clear, and jargon-free"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,270 @@
|
||||
---
|
||||
name: customer-research
|
||||
description: When the user wants to conduct, analyze, or synthesize customer research. Use when the user mentions "customer research," "ICP research," "talk to customers," "analyze transcripts," "customer interviews," "survey analysis," "support ticket analysis," "voice of customer," "VOC," "build personas," "customer personas," "jobs to be done," "JTBD," "what do customers say," "what are customers struggling with," "Reddit mining," "G2 reviews," "review mining," "digital watering holes," "community research," "forum research," "competitor reviews," "customer sentiment," or "find out why customers churn/convert/buy." Use for both analyzing existing research assets AND gathering new research from online sources. For writing copy informed by research, see copywriting. For acting on research to improve pages, see page-cro.
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# Customer Research
|
||||
|
||||
You are an expert customer researcher. Your goal is to help uncover what customers actually think, feel, say, and struggle with — so that everything from positioning to product to copy is grounded in reality rather than assumption.
|
||||
|
||||
## 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 to skip questions already answered.
|
||||
|
||||
---
|
||||
|
||||
## Two Modes of Research
|
||||
|
||||
### Mode 1: Analyze Existing Assets
|
||||
You have raw research material (transcripts, surveys, reviews, tickets). Your job is to extract signal.
|
||||
|
||||
### Mode 2: Go Find Research
|
||||
You need to gather intel from online sources (Reddit, G2, forums, communities, review sites). Your job is to know where to look and what to extract.
|
||||
|
||||
Most engagements combine both. Establish which mode applies before proceeding.
|
||||
|
||||
---
|
||||
|
||||
## Mode 1: Analyzing Existing Research Assets
|
||||
|
||||
### Asset Types
|
||||
|
||||
**Customer interview / sales call transcripts**
|
||||
- Extract: pains, triggers, desired outcomes, language used, objections, alternatives considered
|
||||
- Look for: the moment they decided to look for a solution, what they tried before, what success looks like to them
|
||||
|
||||
**Survey results**
|
||||
- Segment responses by customer tier, use case, or tenure before drawing conclusions
|
||||
- Flag: what open-ended answers say vs. what multiple-choice answers say (they often conflict)
|
||||
- Identify: the 20% of responses that contain the most useful signal
|
||||
|
||||
**Customer support conversations**
|
||||
- Mine for: recurring complaints, confusion points, feature requests, and "I wish it could…" language
|
||||
- Categorize tickets before analyzing — don't treat all tickets as equal signal
|
||||
- Separate bugs from confusion from missing features from expectation mismatches
|
||||
|
||||
**Win/loss interviews and churned customer notes**
|
||||
- Wins: what tipped the decision? What almost made them choose a competitor?
|
||||
- Losses and churn: was it price, features, fit, timing, or something else?
|
||||
- Segment by reason — don't average across different churn causes
|
||||
|
||||
**NPS responses**
|
||||
- Passives and detractors are higher signal than promoters for improvement work
|
||||
- Pair scores with verbatims — a 9 with a specific complaint beats a 10 with no comment
|
||||
|
||||
### Extraction Framework
|
||||
|
||||
For each asset, extract:
|
||||
|
||||
1. **Jobs to Be Done** — what outcome is the customer trying to achieve?
|
||||
- Functional job: the task itself
|
||||
- Emotional job: how they want to feel
|
||||
- Social job: how they want to be perceived
|
||||
|
||||
2. **Pain Points** — what's frustrating, broken, or inadequate about their current situation?
|
||||
- Prioritize pains mentioned unprompted and with emotional language
|
||||
|
||||
3. **Trigger Events** — what changed that made them seek a solution?
|
||||
- Common triggers: team growth, new hire, missed target, embarrassing incident, competitor doing something
|
||||
|
||||
4. **Desired Outcomes** — what does success look like in their words?
|
||||
- Capture exact quotes, not paraphrases
|
||||
|
||||
5. **Language and Vocabulary** — exact words and phrases customers use
|
||||
- This is gold for copy. "We were drowning in spreadsheets" > "manual process inefficiency"
|
||||
|
||||
6. **Alternatives Considered** — what else did they look at or try?
|
||||
- Includes doing nothing, hiring someone, or building internally
|
||||
|
||||
### Synthesis Steps
|
||||
|
||||
After extracting from individual assets:
|
||||
|
||||
1. **Cluster by theme** — group similar pains, outcomes, and triggers across assets
|
||||
2. **Frequency + intensity scoring** — how often does a theme appear, and how strongly is it felt?
|
||||
3. **Segment by customer profile** — do patterns differ by company size, role, use case, or tenure?
|
||||
4. **Identify the "money quotes"** — 5-10 verbatim quotes that best represent each theme
|
||||
5. **Flag contradictions** — where do customers say one thing but do another?
|
||||
|
||||
### Research Quality Guardrails
|
||||
|
||||
Label every insight with a confidence level before presenting it:
|
||||
|
||||
| Confidence | Criteria |
|
||||
|------------|----------|
|
||||
| **High** | Theme appears in 3+ independent sources; mentioned unprompted; consistent across segments |
|
||||
| **Medium** | Theme appears in 2 sources, or only prompted, or limited to one segment |
|
||||
| **Low** | Single source; could be an outlier; needs validation |
|
||||
|
||||
**Recency window**: Weight sources from the last 12 months more heavily. Markets shift — a 3-year-old transcript may reflect a different product and buyer.
|
||||
|
||||
**Sample bias checks**:
|
||||
- Online reviewers skew toward power users and people with strong opinions
|
||||
- Support tickets skew toward problems, not value
|
||||
- Reddit skews technical and skeptical vs. mainstream buyers
|
||||
- Factor this in when drawing conclusions about "all customers"
|
||||
|
||||
**Minimum viable sample**: Don't build personas or draw messaging conclusions from fewer than 5 independent data points per segment.
|
||||
|
||||
---
|
||||
|
||||
## Mode 2: Digital Watering Hole Research
|
||||
|
||||
Online communities are where customers speak without a filter. The goal is to find authentic, unmoderated language about the problem space.
|
||||
|
||||
### Where to Look
|
||||
|
||||
Choose sources based on your ICP type — then read `references/source-guides.md` for detailed playbooks, search operators, and per-platform extraction tips.
|
||||
|
||||
| ICP Type | Primary Sources |
|
||||
|----------|----------------|
|
||||
| B2B SaaS / technical buyers | Reddit (role-specific subs), G2/Capterra, Hacker News, LinkedIn, Indie Hackers, SparkToro |
|
||||
| SMB / founders | Reddit (r/entrepreneur, r/smallbusiness), Indie Hackers, Product Hunt, Facebook Groups, SparkToro |
|
||||
| Developer / DevOps | r/devops, r/programming, Hacker News, Stack Overflow, Discord servers |
|
||||
| B2C / consumer | App store reviews (1-3 star), Reddit hobby/lifestyle subs, YouTube comments, TikTok/Instagram comments |
|
||||
| Enterprise | LinkedIn, industry analyst reports, G2 Enterprise filter, job postings, SparkToro |
|
||||
|
||||
**Quick decision guide:**
|
||||
- Have a product category? → Start with G2/Capterra reviews (yours + competitors)
|
||||
- Need to know where your audience spends time? → SparkToro (reveals podcasts, YouTube, subreddits, websites, social accounts)
|
||||
- Need raw language? → Reddit and YouTube comments
|
||||
- Need trigger events? → LinkedIn posts, job postings, Hacker News "Ask HN" threads
|
||||
- Need competitive intel? → Competitor 4-star reviews on G2; Product Hunt discussions; SparkToro competitor audience analysis
|
||||
|
||||
### What to Extract from Each Source
|
||||
|
||||
For every piece of content you find:
|
||||
|
||||
| Field | What to Capture |
|
||||
|-------|----------------|
|
||||
| Source | Platform, thread URL, date |
|
||||
| Verbatim quote | Exact words — don't paraphrase |
|
||||
| Context | What prompted the comment? |
|
||||
| Sentiment | Positive / negative / neutral / frustrated |
|
||||
| Theme tag | Pain / trigger / outcome / alternative / language |
|
||||
| Customer profile signals | Role, company size, industry hints from the post |
|
||||
|
||||
### Research Synthesis Template
|
||||
|
||||
After gathering from multiple sources, synthesize into:
|
||||
|
||||
```
|
||||
## Top Themes (ranked by frequency × intensity)
|
||||
|
||||
### Theme 1: [Name]
|
||||
**Summary**: [1-2 sentences]
|
||||
**Frequency**: Appeared in X of Y sources
|
||||
**Intensity**: High / Medium / Low (based on emotional language used)
|
||||
**Representative quotes**:
|
||||
- "[exact quote]" — [source, date]
|
||||
- "[exact quote]" — [source, date]
|
||||
**Implications**: What this means for messaging / product / positioning
|
||||
|
||||
### Theme 2: ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Persona Generation
|
||||
|
||||
Personas should be built from research, not invented. Don't create a persona until you have at least 5-10 data points (interviews, reviews, or community posts) from a consistent segment.
|
||||
|
||||
### Persona Structure
|
||||
|
||||
```
|
||||
## [Persona Name] — [Role/Title]
|
||||
|
||||
**Profile**
|
||||
- Title range: [e.g., "Marketing Manager to VP of Marketing"]
|
||||
- Company size: [e.g., "50–500 employees, Series A–C SaaS"]
|
||||
- Industry: [if narrow]
|
||||
- Reports to: [who]
|
||||
- Team size managed: [if relevant]
|
||||
|
||||
**Primary Job to Be Done**
|
||||
[One sentence: what outcome are they trying to achieve in their role?]
|
||||
|
||||
**Trigger Events**
|
||||
What causes them to start looking for a solution like yours?
|
||||
- [trigger 1]
|
||||
- [trigger 2]
|
||||
|
||||
**Top Pains**
|
||||
1. [Pain — in their words if possible]
|
||||
2. [Pain]
|
||||
3. [Pain]
|
||||
|
||||
**Desired Outcomes**
|
||||
- [What success looks like to them]
|
||||
- [How they measure it]
|
||||
- [How it makes them look to their boss/team]
|
||||
|
||||
**Objections and Fears**
|
||||
- [What makes them hesitate to buy or switch]
|
||||
|
||||
**Alternatives They Consider**
|
||||
- [Competitor, DIY, do nothing, hire someone]
|
||||
|
||||
**Key Vocabulary**
|
||||
Words and phrases they actually use (sourced from research):
|
||||
- "[phrase]"
|
||||
- "[phrase]"
|
||||
|
||||
**How to Reach Them**
|
||||
- Channels: [where they spend time]
|
||||
- Content they consume: [formats, topics]
|
||||
- Influencers/communities they trust: [specific names if known]
|
||||
```
|
||||
|
||||
### Persona Anti-Patterns
|
||||
|
||||
- **Don't name them cutely** ("Marketing Mary") unless your team finds it helpful — it's often a distraction
|
||||
- **Don't average across segments** — a persona that represents everyone represents no one
|
||||
- **Don't invent details** — if you don't have data on something, leave it blank rather than filling it in
|
||||
- **Revisit quarterly** — personas decay as your market and product evolve
|
||||
|
||||
---
|
||||
|
||||
## Deliverable Formats
|
||||
|
||||
Depending on what the user needs, offer:
|
||||
|
||||
1. **Research synthesis report** — themes, quotes, patterns, and implications
|
||||
2. **VOC quote bank** — organized verbatim quotes by theme, for use in copy
|
||||
3. **Persona document** — 1-3 personas built from the research
|
||||
4. **Jobs-to-be-done map** — functional, emotional, and social jobs by segment
|
||||
5. **Competitive intelligence summary** — what customers say about competitors vs. you
|
||||
6. **Research gap analysis** — what you still don't know and how to find it
|
||||
|
||||
Ask the user which deliverable(s) they need before generating output.
|
||||
|
||||
---
|
||||
|
||||
## Questions to Ask Before Proceeding
|
||||
|
||||
If context is unclear:
|
||||
|
||||
1. **What's the goal?** Improve messaging? Build personas? Find product gaps? Understand churn?
|
||||
2. **What do you already have?** (transcripts, surveys, tickets, G2 reviews, nothing)
|
||||
3. **Who is the target segment?** (all customers, a specific tier, churned users, prospects who didn't buy)
|
||||
4. **What's your product?** (if not in the product marketing context file)
|
||||
5. **What do you want delivered?** (synthesis report, persona, quote bank, competitive intel)
|
||||
|
||||
Don't ask all five at once — lead with #1 and #2, then follow up as needed.
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
| When to hand off | Skill |
|
||||
|-----------------|-------|
|
||||
| Writing copy informed by the research | `copywriting` |
|
||||
| Optimizing a page using VOC insights | `page-cro` |
|
||||
| Building a competitor comparison page | `competitor-alternatives` |
|
||||
| Creating a churn prevention strategy from churn research | `churn-prevention` |
|
||||
| Planning paid ads informed by research | `paid-ads` |
|
||||
| Writing cold email using research on pain/trigger | `cold-email` |
|
||||
| Planning content based on discovered topics | `content-strategy` |
|
||||
@@ -0,0 +1,162 @@
|
||||
{
|
||||
"skill_name": "customer-research",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "I have 20 customer interview transcripts. Help me analyze them.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should ask about the goal before analyzing (improve messaging, build personas, find product gaps, etc.). Should apply the extraction framework: jobs to be done, pain points, trigger events, desired outcomes, language/vocabulary, alternatives considered. Should recommend clustering by theme, frequency + intensity scoring, and identifying money quotes. Should ask which deliverable is needed.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Asks about the goal before diving in (improve messaging, build personas, find gaps, etc.)",
|
||||
"Mentions extracting jobs to be done, pain points, and desired outcomes",
|
||||
"Suggests organizing quotes by theme",
|
||||
"References frequency and intensity scoring",
|
||||
"Asks which deliverable is needed"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "I want to do ICP research but I don't have any customer interviews yet.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should recommend digital watering hole research as a starting point. Should mention Reddit, G2, Capterra, forums, or niche communities as sources. Should offer to plan a research approach and explain what to extract from online sources. Should note this is Mode 2 and ask what product/category to research.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Recommends digital watering hole research as an alternative",
|
||||
"Mentions Reddit, G2, or review sites as starting points",
|
||||
"Asks what product or category to research",
|
||||
"Offers to help extract insights from online sources"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "Mine Reddit and G2 to understand what people hate about project management software.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify relevant subreddits (r/projectmanagement, r/productivity, r/agile) and search strategies. Should recommend reading 3-star and 1-star G2 reviews and competitor 4-star reviews. Should plan to extract verbatim quotes, pain themes, and switching triggers. Should apply the extraction table (source, quote, context, sentiment, theme tag, profile signals).",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Identifies relevant subreddits or search strategies for project management",
|
||||
"Suggests reading 3-star and 1-star G2 reviews",
|
||||
"Recommends competitor 4-star reviews for buried complaints",
|
||||
"Plans to extract verbatim quotes and pain themes",
|
||||
"Mentions what to look for: complaints, workarounds, switching triggers"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Build me a customer persona for a marketing manager at a B2B SaaS company.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should ask if there is existing research to build from before generating a persona. Should warn against inventing details without data. Should use the persona structure: profile, primary JTBD, trigger events, top pains, desired outcomes, objections, alternatives, key vocabulary, how to reach them. Should note that personas should be built from at least 5-10 data points.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Asks if there is existing research to build from before inventing details",
|
||||
"Warns against creating personas without data",
|
||||
"Includes jobs to be done, pains, triggers, and desired outcomes in persona structure",
|
||||
"Mentions the need to capture actual customer vocabulary",
|
||||
"Notes minimum data threshold (5-10 data points)"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "I have 6 months of customer support tickets. What insights can I pull from them?",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should recommend categorizing tickets before analyzing (bugs vs. confusion vs. feature requests vs. expectation mismatches). Should warn against treating all tickets as equal signal. Should suggest extracting recurring language, patterns, and 'I wish it could…' phrases. Should ask about the goal — product improvement, messaging, reducing support load, or something else.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Recommends categorizing tickets before analyzing (bugs vs confusion vs feature requests)",
|
||||
"Warns against treating all tickets as equal signal",
|
||||
"Mentions extracting recurring language and patterns",
|
||||
"Asks about the goal — product improvement, messaging, or something else"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "What are customers saying about my competitors on review sites?",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should ask which competitors to research. Should recommend G2 and Capterra as primary sources. Should specifically call out reading competitor 4-star reviews for buried complaints. Should describe what to extract: what they love (battlecard intel), what frustrates them (opportunities), unmet needs. Should use the review mining template.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Recommends reading competitor 4-star reviews specifically for buried complaints",
|
||||
"Mentions G2 or Capterra as sources",
|
||||
"Describes what to extract: what they love, what frustrates them, unmet needs",
|
||||
"Frames as competitive intelligence input"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"prompt": "Help me do voice of customer research for a new SaaS in the HR space.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should ask about the specific ICP segment within HR (recruiter, HR generalist, CHRO, etc.). Should suggest relevant digital watering holes: r/humanresources, r/recruiting, HR Slack communities, G2 HR category, LinkedIn. Should plan to extract verbatim language for copy use. Should offer to produce a VOC quote bank as a deliverable.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Asks about target ICP segment within HR",
|
||||
"Suggests relevant digital watering holes (subreddits, G2 categories, communities)",
|
||||
"Plans to extract verbatim language for copy use",
|
||||
"Mentions organizing findings into a VOC quote bank"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"prompt": "I want to understand why customers churn. I have exit survey results.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should recommend segmenting churn reasons before analyzing — do not average across different causes. Should suggest pairing open-ended responses with quantitative data. Should ask if win/loss interview data or support tickets are also available. Should apply confidence labels (high/med/low) based on sample size and source consistency.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Recommends segmenting churn reasons before analyzing",
|
||||
"Warns against averaging across different churn causes",
|
||||
"Suggests pairing open-ended responses with quantitative data",
|
||||
"Asks if win/loss interview data is also available"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"prompt": "Find the digital watering holes where DevOps engineers talk shop.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify specific relevant communities: r/devops, r/sysadmin, Hacker News, DevOps-focused Discord/Slack groups, LinkedIn, Stack Overflow. Should suggest what to search for in those communities. Should describe what signal to extract from each source type and reference source-guides.md for detailed playbooks.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Mentions specific relevant communities (r/devops, Hacker News, LinkedIn, Discord)",
|
||||
"Suggests what to search for in those communities",
|
||||
"Describes what signal to extract from each source type"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"prompt": "Turn my customer research into messaging I can use on my homepage.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should extract VOC language and top themes before moving to copy. Should identify the highest-signal quotes and language patterns. Should produce a VOC summary or quote bank, then hand off to the copywriting skill for the actual copy writing step rather than writing homepage copy directly.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Extracts the VOC language and themes first before jumping to copy",
|
||||
"Identifies the highest-signal quotes for messaging",
|
||||
"References the copywriting skill for the actual copy writing step"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"prompt": "I run a mobile fitness app and want to understand why users drop off after week 2.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should recognize this as a B2C research scenario. Should suggest B2C-appropriate sources: app store reviews (1-3 star), Reddit fitness communities, YouTube comment sections on fitness apps, TikTok/Instagram comments. Should also recommend in-app surveys and analyzing support tickets/reviews. Should frame around activation and habit formation research.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Recognizes this as a B2C research scenario",
|
||||
"Suggests app store reviews as a primary source",
|
||||
"Mentions Reddit or community sources relevant to fitness/consumer apps",
|
||||
"Frames around understanding drop-off triggers and desired outcomes"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"prompt": "I have no existing research and don't know who my best customers are yet.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should treat this as a bootstrap research scenario. Should recommend starting with hypothesis formation before gathering data. Should suggest a minimum viable research plan: 5-10 customer interviews + digital watering hole scan. Should provide interview recruiting tips and what questions to ask. Should warn against building personas before collecting any data.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Recognizes this as a zero-research bootstrap scenario",
|
||||
"Recommends forming hypotheses before gathering data",
|
||||
"Suggests a minimum viable research plan (interviews + online sources)",
|
||||
"Warns against building personas without any data"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
# Customer Research — Source Guides
|
||||
|
||||
Detailed, source-by-source playbooks for gathering customer intelligence from online watering holes.
|
||||
|
||||
---
|
||||
|
||||
## Reddit Research
|
||||
|
||||
### Finding the Right Subreddits
|
||||
|
||||
Start by identifying where your ICP spends time, not where your product is discussed.
|
||||
|
||||
**Discovery methods:**
|
||||
- Search `site:reddit.com "[job title] tools"` or `site:reddit.com "[problem category] software"`
|
||||
- Use [subreddit search tools](https://www.reddit.com/subreddits/search) with problem-space keywords
|
||||
- Look at what subreddits show up in Google results when you search ICP problems
|
||||
- Check what subreddits competitors' customers mention in reviews
|
||||
|
||||
**Common high-value subreddits by category:**
|
||||
- B2B SaaS: r/sales, r/marketing, r/entrepreneur, r/startups, r/smallbusiness
|
||||
- Dev tools: r/programming, r/devops, r/webdev, r/cscareerquestions
|
||||
- Analytics/data: r/analytics, r/dataengineering, r/BusinessIntelligence
|
||||
- Marketing: r/PPC, r/SEO, r/emailmarketing, r/content_marketing
|
||||
- HR/recruiting: r/recruiting, r/humanresources, r/jobs
|
||||
- Finance/ops: r/accounting, r/financialplanning, r/projectmanagement
|
||||
|
||||
### Search Operators
|
||||
|
||||
```
|
||||
site:reddit.com/r/[subreddit] "[keyword]"
|
||||
site:reddit.com "[problem]" "recommend" OR "suggestion" OR "alternative"
|
||||
site:reddit.com "[competitor name]" "vs" OR "alternative" OR "switched"
|
||||
```
|
||||
|
||||
### What to Look For
|
||||
|
||||
**High-signal post types:**
|
||||
- "What tools do you use for X?" → reveals alternatives and vocab
|
||||
- "Frustrated with [competitor], looking for alternatives" → reveals pain and switching triggers
|
||||
- "How do you handle X?" → reveals workflow and workarounds
|
||||
- "Is [your category] worth it?" → reveals objections and evaluation criteria
|
||||
- Complaint threads about competitors → reveals gaps you might fill
|
||||
|
||||
**What to extract:**
|
||||
- The exact problem described in the post
|
||||
- Top-voted solutions (what do practitioners actually recommend?)
|
||||
- Complaints about existing solutions in comments
|
||||
- The language used — note specific words and phrases
|
||||
- Upvote patterns — consensus vs. controversy
|
||||
|
||||
### Tools
|
||||
- Reddit's native search (limited but fast)
|
||||
- Google: `site:reddit.com [query]` (better results)
|
||||
- Pullpush.io — search archived Reddit posts (good for older threads)
|
||||
|
||||
---
|
||||
|
||||
## G2 and Review Site Mining
|
||||
|
||||
### Your Own Product Reviews
|
||||
|
||||
Read in this order for maximum signal:
|
||||
|
||||
1. **3-star reviews** — these are the most honest. Customer liked it enough to stay but felt something was missing.
|
||||
2. **1-star reviews** — understand the failure modes. Separate product issues from support/onboarding issues.
|
||||
3. **5-star reviews** — extract the "what they love" language. These are your proof points.
|
||||
4. **4-star reviews** — often contain "the only thing I wish…" buried in praise.
|
||||
|
||||
**What to extract:**
|
||||
- What they say they use it *for* (the job to be done)
|
||||
- What they say is hardest or most frustrating
|
||||
- What they compare it to ("coming from [X]", "better than [Y]")
|
||||
- Industry and role signals in reviewer profiles
|
||||
|
||||
### Competitor Reviews on G2
|
||||
|
||||
The 4-star competitor reviews are gold — customers who like the product but still have complaints.
|
||||
|
||||
**G2 structure to exploit:**
|
||||
- "What do you like best?" → their strengths (your battlecard intel)
|
||||
- "What do you dislike?" → their weaknesses (your opportunities)
|
||||
- "What problems are you solving?" → the job to be done
|
||||
|
||||
**Capterra** has similar structure. **Trustpilot** skews B2C. **AppSumo** reviews are useful for SMB/prosumer SaaS.
|
||||
|
||||
### Review Mining Template
|
||||
|
||||
For each competitor's 4-star reviews, extract:
|
||||
|
||||
| Category | Notes |
|
||||
|----------|-------|
|
||||
| Job to be done | Why do they use the product? |
|
||||
| Top praise | What do they love (and might be hard for you to match)? |
|
||||
| Top complaint | What frustrates them? |
|
||||
| Switching context | Did they mention switching from something else? |
|
||||
| Unmet need | "I wish it could…" or "It would be better if…" |
|
||||
|
||||
---
|
||||
|
||||
## Indie Hackers and Product Hunt
|
||||
|
||||
### Indie Hackers
|
||||
|
||||
Strong signal for founder/builder/SMB ICP.
|
||||
|
||||
**Where to look:**
|
||||
- "Ask IH" posts: questions about problems your product solves
|
||||
- Milestone posts: when founders describe their stack, they reveal tool preferences and pain
|
||||
- Comment threads on product launches in your category
|
||||
|
||||
**Search:** `site:indiehackers.com "[problem]"` or use IH's native search.
|
||||
|
||||
### Product Hunt
|
||||
|
||||
**Discussion tabs** on competing products are a research goldmine:
|
||||
- Questions asked = pre-sales concerns = objections
|
||||
- Comments = early adopter reactions = leading indicators of reception
|
||||
- "Alternatives to X" collections reveal the competitive landscape as users see it
|
||||
|
||||
---
|
||||
|
||||
## Hacker News
|
||||
|
||||
Strong signal for technical/developer ICP. Skews toward builders and skeptics.
|
||||
|
||||
**High-value searches:**
|
||||
- `site:news.ycombinator.com "[competitor or category]"`
|
||||
- HN "Ask HN: best tools for X" threads
|
||||
- "Show HN" posts for competitors — read the skeptical comments
|
||||
|
||||
**What's different about HN:**
|
||||
- Users are more likely to critique underlying architecture and business model
|
||||
- Strong opinions about pricing models (especially anything subscription-based)
|
||||
- First principles objections you might not hear elsewhere
|
||||
|
||||
---
|
||||
|
||||
## LinkedIn Research
|
||||
|
||||
### Posts and Comments
|
||||
|
||||
Search for posts by practitioners describing their workflows:
|
||||
- "[Role] at [company size]" + problem keyword
|
||||
- "We used to [old way] but now we [new way]" stories
|
||||
- Posts asking for tool recommendations get comments from active buyers
|
||||
|
||||
### Job Postings
|
||||
|
||||
A job posting is a company's admission of a pain point.
|
||||
|
||||
**What to look for:**
|
||||
- What tools are listed as "nice to have" vs. "required"? (reveals stack and adjacent tools)
|
||||
- What metrics and outcomes are mentioned in the role description?
|
||||
- What does the role spend most of its time doing? (reveals the job to be done)
|
||||
|
||||
**Search:** `site:linkedin.com/jobs "[role title]" "[relevant tool or category]"`
|
||||
|
||||
---
|
||||
|
||||
## YouTube Comments
|
||||
|
||||
### Finding High-Signal Videos
|
||||
|
||||
- Tutorial videos for problems your product solves
|
||||
- "Best tools for X in [year]" roundup videos
|
||||
- Competitor product demos and walkthroughs
|
||||
|
||||
**What to look for in comments:**
|
||||
- "Does this work for [specific use case]?" → edge cases and unmet needs
|
||||
- "I tried this but…" → failure points
|
||||
- "What about [competitor]?" → active evaluation
|
||||
- Timestamps with questions → confusion points in the workflow
|
||||
|
||||
---
|
||||
|
||||
## Twitter / X Research
|
||||
|
||||
### Search Operators
|
||||
|
||||
```
|
||||
"[competitor]" -filter:replies min_faves:10
|
||||
"[problem keyword]" "anyone know" OR "recommend" OR "alternative"
|
||||
"[category] is broken" OR "frustrated with [category]"
|
||||
```
|
||||
|
||||
### What to Find
|
||||
|
||||
- Real-time complaints about competitors
|
||||
- Practitioners discussing their stack
|
||||
- Influencers/thought leaders your ICP follows (useful for distribution)
|
||||
|
||||
---
|
||||
|
||||
## Blog Post and Forum Research
|
||||
|
||||
### Comparison Content
|
||||
|
||||
Google: `"[competitor 1] vs [competitor 2]"` or `"best [category] software [year]"`
|
||||
|
||||
Read the comments on these posts — people who find comparison content are actively evaluating. Their comments are questions your sales process should answer.
|
||||
|
||||
### Niche Communities
|
||||
|
||||
- **Slack communities**: Many industries have public or semi-public Slack groups. Search "[industry] Slack community".
|
||||
- **Discord servers**: Growing for developer and creator communities.
|
||||
- **Facebook Groups**: Still strong for SMB, e-commerce, agency, and coach/consultant ICP.
|
||||
- **Circle/Mighty Networks communities**: Check if there are paid communities in your ICP's space.
|
||||
|
||||
---
|
||||
|
||||
## B2C and Consumer App Research
|
||||
|
||||
B2C research requires different sources than B2B SaaS. Consumer buyers don't congregate on LinkedIn or G2 — they leave traces in app stores, social media, and communities built around the activity your product serves.
|
||||
|
||||
### App Store Reviews (iOS App Store / Google Play)
|
||||
|
||||
One of the richest unfiltered sources for mobile/consumer products.
|
||||
|
||||
**Read in this order:**
|
||||
1. **1-2 star reviews** — failure modes, unmet expectations, frustration peaks
|
||||
2. **3-star reviews** — honest tradeoffs and "it's good but…" feedback
|
||||
3. **5-star reviews** — what they love in their own words (proof points and positioning)
|
||||
|
||||
**What to extract:**
|
||||
- What job they hired the app to do ("I use this to…")
|
||||
- The moment it stopped working for them
|
||||
- What they compared it to or switched from
|
||||
- Emotional language — "I love how…", "I'm so frustrated that…"
|
||||
|
||||
**Search tip:** Sort by "Most Recent" to get fresh signal, then "Most Critical" for pain themes.
|
||||
|
||||
### Amazon Reviews (for physical products or software with Amazon presence)
|
||||
|
||||
Same priority order as app stores: 3-star reviews first.
|
||||
|
||||
**G2 analog for consumer SaaS**: Trustpilot, Sitejabber, and product-specific review aggregators.
|
||||
|
||||
### Reddit Consumer Communities
|
||||
|
||||
B2C Reddit is highly vertical — go to the hobby/lifestyle subreddit, not the general ones.
|
||||
|
||||
**Examples by product type:**
|
||||
- Fitness apps: r/running, r/loseit, r/fitness, r/MyFitnessPal
|
||||
- Personal finance: r/personalfinance, r/financialindependence, r/ynab
|
||||
- Productivity/notes: r/productivity, r/Notion, r/ObsidianMD
|
||||
- Travel: r/travel, r/solotravel, r/digitalnomad
|
||||
- Parenting: r/Parenting, r/beyondthebump, r/daddit
|
||||
|
||||
**Search pattern:** `site:reddit.com/r/[community] "[app name OR problem]"`
|
||||
|
||||
### TikTok and Instagram Comments
|
||||
|
||||
High-signal for consumer products with visual/lifestyle appeal.
|
||||
|
||||
**How to find signal:**
|
||||
- Search TikTok for "[product name] review" or "is [product] worth it"
|
||||
- Watch the top 5-10 videos; read ALL comments — not just likes
|
||||
- On Instagram, check tagged posts from real users (not brand posts)
|
||||
|
||||
**What to extract:**
|
||||
- Questions in comments = unmet needs or unclear positioning
|
||||
- "Does this work for…?" = jobs they want to hire it for
|
||||
- "I switched from X" comments = switching triggers
|
||||
- Complaints about price, missing features, or broken promises
|
||||
|
||||
### YouTube Comments (Consumer)
|
||||
|
||||
Same approach as B2B but different video types:
|
||||
|
||||
- "X app honest review" or "X app after 6 months"
|
||||
- "Best [category] apps [year]" comparison videos
|
||||
- Unboxing or "setup" videos for hardware/physical products
|
||||
|
||||
Comments on review videos are especially valuable — these are people actively in the consideration phase.
|
||||
|
||||
### Consumer Community Platforms
|
||||
|
||||
- **Facebook Groups**: Still dominant for many consumer verticals (parenting, fitness, local services, hobbies)
|
||||
- **Discord servers**: Growing for gaming, creator tools, productivity, crypto, lifestyle communities
|
||||
- **Nextdoor**: Useful for local service businesses
|
||||
- **Quora**: Long-form questions reveal decision anxiety and evaluation criteria
|
||||
|
||||
---
|
||||
|
||||
## SparkToro (Audience Intelligence)
|
||||
|
||||
SparkToro is a behavioral audience research tool. Instead of mining individual posts and comments, it aggregates clickstream, search, and social data to show what your audience does at scale — what they read, watch, listen to, follow, and search for.
|
||||
|
||||
### When to Use SparkToro vs. Manual Research
|
||||
|
||||
- **SparkToro first** when you need to understand where your ICP spends time, what content they consume, and which influencers they follow — it answers these questions in seconds with aggregated data
|
||||
- **Manual research first** (Reddit, G2, communities) when you need raw language, exact quotes, emotional context, and the "why" behind behavior
|
||||
- **Best together**: Use SparkToro to identify which podcasts, subreddits, and websites matter, then go mine those sources manually for voice-of-customer language
|
||||
|
||||
### Key Queries to Run
|
||||
|
||||
**By competitor:**
|
||||
- "People who follow @competitor" — reveals shared audience affinities
|
||||
- "People who visit competitor.com" — shows what else they consume
|
||||
|
||||
**By audience description:**
|
||||
- "People who frequently talk about [topic]" — finds audience behaviors
|
||||
- "People whose bio contains [job title]" — profiles a role-based segment
|
||||
|
||||
**By your own audience:**
|
||||
- "People who visit yourdomain.com" — understand your actual audience
|
||||
- Compare against competitor audience profiles to find gaps
|
||||
|
||||
### What to Extract
|
||||
|
||||
| Data Type | What It Tells You | Use It For |
|
||||
|-----------|------------------|------------|
|
||||
| Top websites visited | Where your audience reads | Content partnerships, guest posting targets |
|
||||
| Top podcasts | What they listen to | Podcast guesting, sponsorship decisions |
|
||||
| Top YouTube channels | What they watch | Video content strategy, ad placements |
|
||||
| Top subreddits | Where they discuss | Community participation, Reddit ad targeting |
|
||||
| Search keywords | What they Google | SEO and content topic planning |
|
||||
| AI prompt topics | What they ask AI tools | Emerging content opportunities |
|
||||
| Social accounts followed | Who influences them | Influencer partnerships, co-marketing |
|
||||
| Demographics | Who they are | Persona building, ad targeting |
|
||||
|
||||
### Source Weighting
|
||||
|
||||
SparkToro data is aggregated and anonymized — it shows patterns, not individual opinions. Treat it as:
|
||||
- **High confidence** for behavioral data (what they visit, follow, search for)
|
||||
- **Medium confidence** for demographic data (self-reported, may be incomplete)
|
||||
- **Not a substitute** for qualitative research (doesn't capture language, emotions, or the "why")
|
||||
|
||||
### Limitations
|
||||
|
||||
- Free tier: 5 reports/month, shallow results (top 5–10)
|
||||
- No public API — all research done through web interface
|
||||
- Skews English-language, US-centric
|
||||
- Shows what audiences do, not why — pair with qualitative sources
|
||||
|
||||
See [tools/integrations/sparktoro.md](../../../tools/integrations/sparktoro.md) for full tool details and pricing.
|
||||
|
||||
---
|
||||
|
||||
## Organizing Your Research
|
||||
|
||||
Use a simple tagging system across all sources:
|
||||
|
||||
| Tag | Meaning |
|
||||
|-----|---------|
|
||||
| `#pain` | A problem or frustration |
|
||||
| `#trigger` | An event that prompted the search |
|
||||
| `#outcome` | What success looks like |
|
||||
| `#language` | Exact phrases worth using in copy |
|
||||
| `#alternative` | Another solution they considered or use |
|
||||
| `#objection` | Reason to hesitate or not buy |
|
||||
| `#competitor` | Anything about a competing product |
|
||||
|
||||
Keep a running doc with columns: Source | Date | Quote | Tags | Notes
|
||||
|
||||
After 20-30 entries, patterns will emerge. Look for quotes that appear in multiple unrelated sources — those are your highest-confidence insights.
|
||||
|
||||
---
|
||||
|
||||
## Source Reliability and Confidence Scoring
|
||||
|
||||
Not all sources carry equal weight. Use this guide when assigning confidence labels.
|
||||
|
||||
### Source Weighting
|
||||
|
||||
| Source | Signal Strength | Bias to Note |
|
||||
|--------|----------------|--------------|
|
||||
| Customer interviews (unprompted) | Very high | Small sample; selection bias toward engaged customers |
|
||||
| Win/loss interviews | High | Recent memory only; rationalization common |
|
||||
| App store / G2 reviews | High | Skews toward strong opinions (love or hate) |
|
||||
| Reddit / community posts | Medium-high | Skews technical, skeptical, vocal minorities |
|
||||
| Support tickets | Medium | Skews toward problems; silent majority not represented |
|
||||
| Survey (open-ended) | Medium | Primed by question framing |
|
||||
| Survey (multiple choice) | Low-medium | Artifacts of the options you provided |
|
||||
| NPS verbatims | Medium | Correlates with score; prompted by the survey moment |
|
||||
| YouTube/TikTok comments | Medium | Skews toward engaged viewers; social performance |
|
||||
| SparkToro audience data | Medium-high | Aggregated behavioral data; strong for "what" but not "why" |
|
||||
| Job postings | Low-medium | Aspirational, not necessarily reflective of current pain |
|
||||
|
||||
### Confidence Labels in Practice
|
||||
|
||||
When presenting insights, lead with confidence:
|
||||
|
||||
```
|
||||
[HIGH CONFIDENCE] Customers feel overwhelmed by manual reporting — appears in 12 of 20 interviews,
|
||||
4 Reddit threads, and is the #1 complaint in 3-star G2 reviews. Consistent across SMB and mid-market.
|
||||
|
||||
[MEDIUM CONFIDENCE] Customers compare us to spreadsheets more than to direct competitors —
|
||||
mentioned in 6 interviews and 3 Reddit threads, but not yet seen in review data.
|
||||
|
||||
[LOW CONFIDENCE] Enterprise buyers may have procurement concerns — mentioned by 2 interviewees
|
||||
from companies 500+. Needs more signal before acting on it.
|
||||
```
|
||||
|
||||
### Recency Window
|
||||
|
||||
- **Use as primary source**: Data from the last 12 months
|
||||
- **Use with caution**: 12-24 months (product and market may have shifted)
|
||||
- **Use only for baseline context**: 2+ years old
|
||||
|
||||
When a theme appears consistently across old and new data, that's a durable signal worth acting on.
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: email-sequence
|
||||
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
|
||||
---
|
||||
@@ -293,6 +293,7 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key email
|
||||
|------|----------|:---:|-------|
|
||||
| **Customer.io** | Behavior-based automation | - | [customer-io.md](../../tools/integrations/customer-io.md) |
|
||||
| **Mailchimp** | SMB email marketing | ✓ | [mailchimp.md](../../tools/integrations/mailchimp.md) |
|
||||
| **Nitrosend** | AI-native email (sequences via prompts) | ✓ | [nitrosend.md](../../tools/integrations/nitrosend.md) |
|
||||
| **Resend** | Developer-friendly transactional | ✓ | [resend.md](../../tools/integrations/resend.md) |
|
||||
| **SendGrid** | Transactional email at scale | - | [sendgrid.md](../../tools/integrations/sendgrid.md) |
|
||||
| **Kit** | Creator/newsletter focused | - | [kit.md](../../tools/integrations/kit.md) |
|
||||
@@ -301,6 +302,7 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key email
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **lead-magnets**: For planning lead magnets that feed into nurture sequences
|
||||
- **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
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"skill_name": "email-sequence",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Create a welcome email sequence for new users who sign up for our project management tool's free trial. The trial is 14 days. We want to get them to their aha moment (creating their first project and inviting a team member).",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should create a welcome sequence (5-7 emails) following the core principles: one email one job, value before ask. Should map each email to a specific goal in the 14-day trial journey. Should include timing/delays between emails. Each email should follow the email copy structure: hook → context → value → CTA → sign-off. Should include subject lines following the subject line strategy. Should align sequence with the aha moment (first project + team invite). Output should follow the structured format with sequence overview and per-email specs.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Creates 5-7 email welcome sequence",
|
||||
"Follows one email one job principle",
|
||||
"Maps emails to trial timeline (14 days)",
|
||||
"Includes timing between emails",
|
||||
"Each email has hook, context, value, CTA",
|
||||
"Includes subject lines for each email",
|
||||
"Aligns with stated aha moment",
|
||||
"Output follows structured per-email format"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We need a lead nurture sequence for people who download our 'State of DevOps 2024' report. Goal is to get them to book a demo of our CI/CD platform.",
|
||||
"expected_output": "Should create a lead nurture sequence (6-8 emails). Should follow value before ask — first emails should provide related value, not immediately push for demo. Should map the sequence from awareness (report download) through consideration (related content, case studies) to decision (demo request). Should include timing between emails. Each email should have clear subject line, hook, single CTA. Should gradually increase commitment asks across the sequence.",
|
||||
"assertions": [
|
||||
"Creates 6-8 email lead nurture sequence",
|
||||
"Follows value before ask principle",
|
||||
"Maps from awareness through consideration to decision",
|
||||
"Includes timing between emails",
|
||||
"Each email has clear subject line and single CTA",
|
||||
"Gradually increases commitment asks",
|
||||
"Connects to original download topic"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "our email open rates have tanked. used to be 35% now we're at 18%. what's going on and how do we fix our subject lines?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should diagnose potential causes of declining open rates: sender reputation, list hygiene, subject line quality, sending frequency, deliverability issues. Should apply the subject line strategy from the skill: test curiosity vs benefit vs urgency patterns, personalization, optimal length. Should recommend a re-engagement campaign to clean the list. Should provide specific subject line formulas and examples. Should suggest testing framework for subject lines.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Diagnoses potential causes beyond just subject lines",
|
||||
"Addresses sender reputation and deliverability",
|
||||
"Recommends list hygiene or re-engagement",
|
||||
"Applies subject line strategy with specific patterns",
|
||||
"Provides subject line formulas and examples",
|
||||
"Suggests testing framework"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Build a re-engagement sequence for subscribers who haven't opened any emails in 90 days. We have about 5,000 inactive subscribers.",
|
||||
"expected_output": "Should create a re-engagement sequence (3-4 emails). Should follow the re-engagement pattern: first email acknowledges absence and offers value, middle emails escalate with compelling reasons to re-engage, final email is a clear 'last chance' before removal. Should recommend aggressive subject lines to break through. Should include a sunset policy (remove non-responders after sequence completes). Should address the impact on deliverability of keeping inactive subscribers.",
|
||||
"assertions": [
|
||||
"Creates 3-4 email re-engagement sequence",
|
||||
"Acknowledges absence in first email",
|
||||
"Escalates through the sequence",
|
||||
"Includes 'last chance' final email",
|
||||
"Recommends sunset policy for non-responders",
|
||||
"Addresses deliverability impact of inactive subscribers",
|
||||
"Uses compelling subject lines"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "What's the ideal timing for our onboarding email sequence? We send the first email immediately after signup, but we're not sure about the rest.",
|
||||
"expected_output": "Should provide timing guidance for onboarding sequences. Should reference the timing and delays framework: immediate first email (welcome/confirmation), then suggest data-driven timing based on user behavior triggers vs fixed time delays. Should recommend behavior-triggered emails when possible (user completed action → next email) with time-based fallbacks. Should provide typical timing patterns for SaaS onboarding (day 0, day 1, day 3, day 5, day 7, etc.). Should note that optimal timing depends on product complexity and trial length.",
|
||||
"assertions": [
|
||||
"Provides timing guidance for onboarding sequences",
|
||||
"Recommends immediate first email",
|
||||
"Discusses behavior-triggered vs time-based timing",
|
||||
"Provides typical timing patterns",
|
||||
"Notes timing depends on product and trial length",
|
||||
"Recommends behavior triggers with time-based fallbacks"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Help me optimize our post-signup onboarding experience. Users sign up but 60% never complete setup.",
|
||||
"expected_output": "Should recognize this is an in-app onboarding optimization task, not an email sequence task. Should defer to or cross-reference the onboarding-cro skill, which handles in-app onboarding flows, checklists, and activation optimization. May offer to help with the email component of onboarding but should make clear that onboarding-cro is the primary skill for this task.",
|
||||
"assertions": [
|
||||
"Recognizes this as in-app onboarding optimization",
|
||||
"References or defers to onboarding-cro skill",
|
||||
"Does not attempt full onboarding redesign using email patterns",
|
||||
"May offer email component support"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: form-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," 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
|
||||
---
|
||||
@@ -120,7 +120,7 @@ For each field, ask:
|
||||
4. Logical grouping if many fields
|
||||
|
||||
### Labels and Placeholders
|
||||
- Labels: Always visible (not just placeholder)
|
||||
- Labels: Keep visible (not just placeholder) — placeholders disappear when typing, leaving users unsure what they're filling in
|
||||
- Placeholders: Examples, not labels
|
||||
- Help text: Only when genuinely helpful
|
||||
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "form-cro",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Audit our demo request form. It currently has these fields: First Name, Last Name, Work Email, Phone Number, Company Name, Company Size, Job Title, Industry, Current Solution, Budget Range, and a 'Tell us about your needs' textarea. Our conversion rate is 3.1% and we want to improve it.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the 'every field has a cost' principle — 11 fields is excessive for a demo form. Should reference the field cost data (3 fields baseline, 7+ fields = 25-50% conversion reduction). Should evaluate each field: which are essential for demo prep, which can be collected later or inferred. Should recommend cutting to essential fields (likely Work Email, Company Name, and maybe one qualifier). Should provide audit findings in the structured format (Issue, Impact, Fix, Priority). Should recommend Quick Wins, High-Impact Changes, and Test Ideas.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies 'every field has a cost' principle",
|
||||
"References field count impact data",
|
||||
"Evaluates each field for necessity",
|
||||
"Recommends cutting to essential fields",
|
||||
"Provides findings in structured format (Issue, Impact, Fix, Priority)",
|
||||
"Includes Quick Wins, High-Impact Changes, Test Ideas"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Our contact form just has Name, Email, and Message fields but we're getting a lot of spam submissions and low-quality leads. How do we fix this without adding too much friction?",
|
||||
"expected_output": "Should apply the contact form type guidance. Should address spam with non-friction solutions first: honeypot fields, reCAPTCHA, server-side validation. Should then address lead quality: suggest adding one qualifying field (company name or budget range) to filter without excessive friction. Should apply the error handling guidance for validation. Should recommend form layout and submit button optimization. Should balance quality vs quantity in recommendations.",
|
||||
"assertions": [
|
||||
"Applies contact form type guidance",
|
||||
"Recommends anti-spam solutions (honeypot, reCAPTCHA)",
|
||||
"Suggests minimal qualifying fields for lead quality",
|
||||
"Balances quality vs quantity",
|
||||
"Addresses error handling and validation",
|
||||
"Recommends non-friction solutions first"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "should we use a single-step or multi-step form for our quote request? we need company info, project details, timeline, and budget.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the multi-step form guidance — with this many required data types, multi-step is likely better. Should reference the threshold: multi-step recommended when more than 5-6 fields. Should recommend grouping by type (contact info → project details → budget/timeline). Should include progress indicator recommendation. Should apply best practices: easy questions first, save progress, allow back navigation. Should note that multi-step often increases completion for longer forms.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Recommends multi-step based on field count",
|
||||
"References the 5-6 field threshold for multi-step",
|
||||
"Suggests logical field grouping",
|
||||
"Recommends progress indicator",
|
||||
"Applies multi-step best practices",
|
||||
"Notes multi-step increases completion for longer forms"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "How should we handle form errors? Users keep getting frustrated and abandoning our lead capture form when they hit validation errors.",
|
||||
"expected_output": "Should apply the error handling guidance. Should recommend inline validation (not just on submit). Should provide specific error message examples (helpful, not generic). Should recommend: don't clear the form on error, focus on the problem field, show requirements upfront not after failure. Should address common validation UX issues: email format, phone format, required field indicators. Should provide examples of good vs bad error messages.",
|
||||
"assertions": [
|
||||
"Applies error handling guidance",
|
||||
"Recommends inline validation",
|
||||
"Provides specific error message examples",
|
||||
"Recommends not clearing form on error",
|
||||
"Recommends showing requirements upfront",
|
||||
"Provides good vs bad error message examples",
|
||||
"Addresses common validation UX issues"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "We need to optimize our form for mobile. Over 60% of our traffic is mobile but our form conversion rate on mobile is half of desktop.",
|
||||
"expected_output": "Should apply the mobile optimization guidance. Should recommend: larger touch targets (44px+ height), appropriate keyboard types (email, tel), autofill support, single column layout, sticky CTA button, reduce typing (use dropdowns, toggles). Should address mobile-specific form issues: viewport, font size, button placement, scroll behavior. Should recommend testing with actual devices.",
|
||||
"assertions": [
|
||||
"Applies mobile optimization guidance",
|
||||
"Recommends larger touch targets (44px+)",
|
||||
"Recommends appropriate keyboard types",
|
||||
"Recommends autofill support",
|
||||
"Recommends single column layout",
|
||||
"Addresses mobile-specific issues",
|
||||
"Recommends testing with actual devices"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Our signup form has too many fields and people keep abandoning it halfway through. Can you help optimize it?",
|
||||
"expected_output": "Should recognize this is about signup/registration form optimization, not general form CRO. Should defer to or cross-reference the signup-flow-cro skill, which specifically handles signup, registration, and account creation flows. May provide general form friction advice but should make clear that signup-flow-cro is the right skill for signup forms.",
|
||||
"assertions": [
|
||||
"Recognizes this as signup flow optimization",
|
||||
"References or defers to signup-flow-cro skill",
|
||||
"Does not attempt full signup form optimization using general form CRO patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: free-tool-strategy
|
||||
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 downloadable content lead magnets (ebooks, checklists, templates), see lead-magnets.
|
||||
metadata:
|
||||
version: 1.1.0
|
||||
---
|
||||
@@ -172,6 +172,7 @@ Rate each factor 1-5:
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **lead-magnets**: For downloadable content lead magnets (ebooks, checklists, templates)
|
||||
- **page-cro**: For optimizing the tool's landing page
|
||||
- **seo-audit**: For SEO-optimizing the tool
|
||||
- **analytics-tracking**: For measuring tool usage
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "free-tool-strategy",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "We want to build a free tool to drive leads for our SEO software. We're thinking about an SEO audit tool or a keyword research tool. Which would be better and how should we approach it?",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the evaluation scorecard to compare both tool ideas across dimensions (audience alignment, lead quality, build effort, SEO value, maintenance burden, competitive differentiation). Should reference the tool types from the skill (analyzers, testers). Should recommend the stronger option with rationale. Should discuss lead capture gating strategy (what's free vs what requires email). Should address MVP scope — what's the minimum valuable version. Should provide implementation recommendations.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies evaluation scorecard to compare options",
|
||||
"References tool types from the skill",
|
||||
"Recommends one option with clear rationale",
|
||||
"Discusses lead capture gating strategy",
|
||||
"Addresses MVP scope",
|
||||
"Provides implementation recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "I want to build a free ROI calculator for our HR software. Users input their company size and current processes, and it shows how much time and money they'd save.",
|
||||
"expected_output": "Should identify this as a calculator tool type. Should apply the ideation framework to validate the concept. Should discuss lead capture strategy: should the basic result be free and detailed report gated? Should address the build vs buy decision. Should recommend MVP scope (what inputs, what outputs, what formula). Should discuss SEO considerations for the tool page. Should reference the evaluation scorecard to score the idea.",
|
||||
"assertions": [
|
||||
"Identifies as calculator tool type",
|
||||
"Applies ideation framework to validate",
|
||||
"Discusses lead capture gating strategy",
|
||||
"Addresses build vs buy decision",
|
||||
"Recommends MVP scope (inputs, outputs, formula)",
|
||||
"Discusses SEO considerations",
|
||||
"References evaluation scorecard"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "give me some ideas for free tools we could build. we sell email marketing software for e-commerce brands.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the ideation framework to generate tool ideas relevant to email marketing + e-commerce. Should provide 5-8 ideas across different tool types (calculators, generators, analyzers, testers). Examples: email subject line tester, email deliverability checker, email ROI calculator, email template generator, spam score checker. Should briefly score each against the evaluation dimensions. Should recommend top 2-3 to pursue.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies ideation framework",
|
||||
"Generates ideas across multiple tool types",
|
||||
"Ideas are relevant to email marketing + e-commerce",
|
||||
"Provides 5-8 ideas",
|
||||
"Briefly evaluates each idea",
|
||||
"Recommends top 2-3 to pursue"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We built a free website speed test tool 6 months ago but it's barely getting any traffic. What went wrong and how do we fix it?",
|
||||
"expected_output": "Should diagnose why the tool isn't getting traffic. Should investigate: SEO strategy for the tool page (target keywords, on-page optimization), distribution strategy (was it launched and forgotten?), competitive landscape (are there dominant free tools already?), tool quality and UX (does it provide unique value?). Should apply the engineering as marketing principles. Should recommend a recovery plan: SEO improvements, content marketing around the tool, product improvements for differentiation.",
|
||||
"assertions": [
|
||||
"Diagnoses potential traffic issues",
|
||||
"Investigates SEO strategy for the tool",
|
||||
"Assesses competitive landscape",
|
||||
"Questions unique value proposition",
|
||||
"Applies engineering as marketing principles",
|
||||
"Recommends recovery plan with specific actions"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Should we gate our free tool behind an email capture or make it completely free? We want leads but don't want to kill usage.",
|
||||
"expected_output": "Should apply the lead capture gating strategy framework. Should present the spectrum: fully ungated → partial gating (basic results free, detailed report gated) → fully gated. Should recommend partial gating as the typical best approach — give enough value to demonstrate the tool's worth, gate the detailed/actionable output. Should discuss tradeoffs: ungated = more SEO value and usage, gated = more leads but fewer users. Should provide specific gating recommendations based on tool type.",
|
||||
"assertions": [
|
||||
"Applies lead capture gating strategy",
|
||||
"Presents gating spectrum (ungated to fully gated)",
|
||||
"Recommends partial gating approach",
|
||||
"Discusses tradeoffs of each approach",
|
||||
"Provides specific gating recommendations",
|
||||
"Addresses SEO impact of gating decisions"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "How do I optimize the landing page for our free tool to get more signups? The tool itself is great but nobody finds it.",
|
||||
"expected_output": "Should recognize this is a landing page conversion optimization task, not a free tool strategy task. Should defer to or cross-reference the page-cro skill for optimizing the tool's landing page conversion rate. May provide free-tool-specific context (gating strategy, value demonstration) but should make clear that page-cro is the right skill for page conversion optimization.",
|
||||
"assertions": [
|
||||
"Recognizes this as page CRO, not free tool strategy",
|
||||
"References or defers to page-cro skill",
|
||||
"May provide free-tool-specific context",
|
||||
"Does not attempt full page CRO using free tool strategy patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: launch-strategy
|
||||
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
|
||||
---
|
||||
@@ -93,7 +93,7 @@ Tap into someone else's audience to shortcut the hardest part—getting noticed.
|
||||
1. List industry leaders your audience follows
|
||||
2. Pitch win-win collaborations
|
||||
3. Use tools like SparkToro or Listen Notes to find audience overlap
|
||||
4. Set up affiliate/referral incentives
|
||||
4. Set up affiliate/referral incentives (for channel partner launches, use [Introw](../../tools/integrations/introw.md) to manage deal registration and commissions)
|
||||
|
||||
**Example - TRMNL:**
|
||||
Sent a free e-ink display to YouTuber Snazzy Labs—not a paid sponsorship, just hoping he'd like it. He created an in-depth review that racked up 500K+ views and drove $500K+ in sales. They also set up an affiliate program for ongoing promotion.
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"skill_name": "launch-strategy",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "We're launching a new B2B SaaS product for design teams in 6 weeks. It's a design review tool. We have a small audience (500 email subscribers, 2k Twitter followers). Help us plan the launch.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the ORB Framework (Owned, Rented, Borrowed channels) with the user's specific resources. Owned: email list (500 subscribers), website. Rented: Twitter (2k followers). Borrowed: partnerships, communities, Product Hunt. Should recommend the five-phase launch approach with a timeline mapped to the 6-week window: Internal prep, Alpha (existing network), Beta (expanded), Early Access, Full Launch. Should provide specific tactics for each phase. Should recommend building up the audience before launch day. Should include a launch day checklist.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies ORB Framework (Owned, Rented, Borrowed)",
|
||||
"Maps to user's specific channels and audience sizes",
|
||||
"Recommends five-phase launch approach",
|
||||
"Provides timeline mapped to 6-week window",
|
||||
"Provides specific tactics for each phase",
|
||||
"Recommends audience building before launch",
|
||||
"Includes launch day checklist"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We want to launch on Product Hunt. Any tips? We've never done it before.",
|
||||
"expected_output": "Should apply the Product Hunt strategy section. Should cover: choosing the right day and time, preparing assets (logo, gallery images, maker video), crafting the tagline and description, building a hunter network, activating supporters on launch day, engaging with comments, and post-launch follow-up. Should recommend preparation timeline (start 2-4 weeks before). Should mention common mistakes to avoid. Should set realistic expectations about outcomes.",
|
||||
"assertions": [
|
||||
"Applies Product Hunt strategy section",
|
||||
"Covers timing (day and time selection)",
|
||||
"Covers asset preparation",
|
||||
"Addresses hunter network and supporter activation",
|
||||
"Recommends preparation timeline",
|
||||
"Mentions common mistakes to avoid",
|
||||
"Sets realistic expectations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "we just shipped a major feature update. how should we announce it? it's not a full product launch, just a big new feature.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the ongoing launch strategy section, specifically the major/medium/minor update matrix. Should identify this as a major feature update. Should recommend appropriate channels and tactics for a feature launch (less than a full product launch but more than a changelog entry). Should include: announcement email, blog post, social media push, in-app notification, and possibly a mini Product Hunt launch. Should provide a feature announcement framework.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies ongoing launch strategy / update matrix",
|
||||
"Identifies as major feature update",
|
||||
"Scales tactics appropriately (not full launch)",
|
||||
"Recommends announcement channels",
|
||||
"Includes email, blog, social, and in-app notification",
|
||||
"Provides feature announcement framework"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Our launch flopped. We launched 3 weeks ago and only got 50 signups. We expected at least 500. What went wrong and what can we do now?",
|
||||
"expected_output": "Should apply the post-launch product marketing section. Should diagnose potential failure causes: insufficient audience building pre-launch, wrong channels, weak value proposition messaging, poor launch execution, targeting the wrong audience. Should recommend post-launch recovery tactics: iterate on messaging, identify which channels produced the 50 signups and double down, try new distribution channels, leverage early users for testimonials. Should provide a specific 30-day recovery plan.",
|
||||
"assertions": [
|
||||
"Applies post-launch product marketing guidance",
|
||||
"Diagnoses potential failure causes",
|
||||
"Addresses pre-launch audience building gap",
|
||||
"Recommends post-launch recovery tactics",
|
||||
"Suggests analyzing which channels produced signups",
|
||||
"Provides specific recovery plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "How do we leverage partnerships and borrowed audiences for our launch? We don't have a big audience of our own.",
|
||||
"expected_output": "Should focus on the Borrowed channel from the ORB Framework. Should provide specific borrowed audience tactics: podcast guest appearances, co-marketing with complementary tools, influencer partnerships, community engagement (relevant Slack groups, Discord servers, Reddit), guest posts, cross-promotions. Should recommend how to identify and approach potential partners. Should note that borrowed audience strategies take time to build and should start well before launch day.",
|
||||
"assertions": [
|
||||
"Focuses on Borrowed channel from ORB Framework",
|
||||
"Provides specific borrowed audience tactics",
|
||||
"Mentions partnerships, communities, guest content",
|
||||
"Recommends how to identify and approach partners",
|
||||
"Notes borrowed strategies take time to build",
|
||||
"Suggests starting well before launch day"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Give me some creative marketing ideas to promote our product. We're bootstrapped and don't have a big budget.",
|
||||
"expected_output": "Should recognize this is a broader marketing ideas request, not specifically a launch strategy task. Should defer to or cross-reference the marketing-ideas skill, which provides 139 marketing ideas organized by category and filtered by budget. May provide some launch-related tactical ideas but should make clear that marketing-ideas is the right skill for a broader brainstorming session.",
|
||||
"assertions": [
|
||||
"Recognizes this as broader marketing ideas request",
|
||||
"References or defers to marketing-ideas skill",
|
||||
"Does not attempt full marketing brainstorm using launch strategy patterns",
|
||||
"May provide some launch-related tactical ideas"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
---
|
||||
name: lead-magnets
|
||||
description: When the user wants to create, plan, or optimize a lead magnet for email capture or lead generation. Also use when the user mentions "lead magnet," "gated content," "content upgrade," "downloadable," "ebook," "cheat sheet," "checklist," "template download," "opt-in," "freebie," "PDF download," "resource library," "content offer," "email capture content," "Notion template," "spreadsheet template," or "what should I give away for emails." Use this for planning what to create and how to distribute it. For interactive tools as lead magnets, see free-tool-strategy. For writing the actual content, see copywriting. For the email sequence after capture, see email-sequence.
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# Lead Magnets
|
||||
|
||||
You are an expert in lead magnet strategy. Your goal is to help plan lead magnets that capture emails, generate qualified leads, and naturally lead to product adoption.
|
||||
|
||||
## 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 is the ideal customer?
|
||||
- What problems does your product solve?
|
||||
|
||||
### 2. Current Lead Generation
|
||||
- How do you currently capture leads?
|
||||
- What lead magnets or offers do you have?
|
||||
- What's your current conversion rate on email capture?
|
||||
|
||||
### 3. Content Assets
|
||||
- What existing content could be repurposed? (blog posts, guides, data)
|
||||
- What expertise can you package?
|
||||
- What templates or tools do you use internally?
|
||||
|
||||
### 4. Goals
|
||||
- Primary goal: email list growth, lead quality, product education?
|
||||
- Target audience stage: awareness, consideration, or decision?
|
||||
- Timeline and resource constraints?
|
||||
|
||||
---
|
||||
|
||||
## Lead Magnet Principles
|
||||
|
||||
### 1. Solve a Specific Problem
|
||||
- Address one clear pain point, not a broad topic
|
||||
- "How to write cold emails that get replies" > "Marketing guide"
|
||||
|
||||
### 2. Match the Buyer Stage
|
||||
- Awareness leads need education
|
||||
- Consideration leads need comparison and evaluation
|
||||
- Decision leads need implementation help
|
||||
|
||||
### 3. High Perceived Value, Low Time Investment
|
||||
- Should look like it's worth paying for
|
||||
- Consumable in under 30 minutes (ideally under 10)
|
||||
- Immediate, actionable takeaway
|
||||
|
||||
### 4. Natural Path to Product
|
||||
- Solves a problem your product also solves
|
||||
- Creates awareness of a gap your product fills
|
||||
- Demonstrates your expertise in the space
|
||||
|
||||
### 5. Easy to Consume
|
||||
- One clear format (don't mix ebook + video + spreadsheet)
|
||||
- Works on mobile
|
||||
- No special software required
|
||||
|
||||
---
|
||||
|
||||
## Lead Magnet Types
|
||||
|
||||
| Type | Best For | Effort | Time to Create |
|
||||
|------|----------|--------|----------------|
|
||||
| Checklist | Quick wins, process steps | Low | 1-2 hours |
|
||||
| Cheat sheet | Reference material, shortcuts | Low | 2-4 hours |
|
||||
| Template (doc/spreadsheet/Notion) | Repeatable processes, workflows | Low-Med | 2-8 hours |
|
||||
| Swipe file | Inspiration, examples | Medium | 4-8 hours |
|
||||
| Ebook/guide | Deep education, authority | High | 1-3 weeks |
|
||||
| Mini-course (email) | Education + nurture | Medium | 1-2 weeks |
|
||||
| Mini-course (video) | Education + personality | High | 2-4 weeks |
|
||||
| Quiz/assessment | Segmentation, engagement | Medium | 1-2 weeks |
|
||||
| Webinar | Authority, live engagement | Medium | 1 week prep |
|
||||
| Resource library | Ongoing value, return visits | High | Ongoing |
|
||||
| Free trial/community access | Product experience | Varies | Varies |
|
||||
|
||||
**For detailed creation guidance per format**: See [references/format-guide.md](references/format-guide.md)
|
||||
|
||||
---
|
||||
|
||||
## Matching Lead Magnets to Buyer Stage
|
||||
|
||||
### Awareness Stage
|
||||
Goal: Educate on the problem. Attract people who don't know you yet.
|
||||
|
||||
| Format | Example |
|
||||
|--------|---------|
|
||||
| Checklist | "10-Point Website Audit Checklist" |
|
||||
| Cheat sheet | "SEO Cheat Sheet for Beginners" |
|
||||
| Ebook/guide | "The Complete Guide to Email Marketing" |
|
||||
| Quiz | "What Type of Marketer Are You?" |
|
||||
|
||||
### Consideration Stage
|
||||
Goal: Help evaluate solutions. Build trust and demonstrate expertise.
|
||||
|
||||
| Format | Example |
|
||||
|--------|---------|
|
||||
| Comparison template | "CRM Comparison Spreadsheet" |
|
||||
| Assessment | "Marketing Maturity Assessment" |
|
||||
| Case study collection | "5 Companies That 3x'd Their Pipeline" |
|
||||
| Webinar | "How to Choose the Right Analytics Tool" |
|
||||
|
||||
### Decision Stage
|
||||
Goal: Help implement. Remove friction to purchase.
|
||||
|
||||
| Format | Example |
|
||||
|--------|---------|
|
||||
| Template | "Ready-to-Use Sales Email Templates" |
|
||||
| Free trial | "14-Day Free Trial" |
|
||||
| Implementation guide | "Migration Checklist: Switch in 30 Minutes" |
|
||||
| ROI calculator | "Calculate Your Savings" (→ see **free-tool-strategy**) |
|
||||
|
||||
---
|
||||
|
||||
## Gating Strategy
|
||||
|
||||
### Gating Options
|
||||
|
||||
| Approach | When to Use | Trade-off |
|
||||
|----------|-------------|-----------|
|
||||
| **Full gate** | High-value content, bottom-funnel | Max capture, lower reach |
|
||||
| **Partial gate** | Preview + full version | Balance of reach and capture |
|
||||
| **Ungated + optional** | Top-funnel education | Max reach, lower capture |
|
||||
| **Content upgrade** | Blog post + bonus | Contextual, high-intent |
|
||||
|
||||
### What to Ask For
|
||||
|
||||
- **Email only** — highest conversion, lowest friction
|
||||
- **Email + name** — enables personalization, slight friction increase
|
||||
- **Email + company/role** — better lead qualification, more friction
|
||||
- **Multi-field** — only for high-value offers (webinars, demos)
|
||||
|
||||
Rule of thumb: Ask for the minimum needed. Every extra field reduces conversion by 5-10%.
|
||||
|
||||
### How to Frame the Exchange
|
||||
|
||||
- Make the value obvious: "Get the full 25-page guide free"
|
||||
- Show a preview: table of contents, first page, sample results
|
||||
- Add social proof: "Downloaded by 5,000+ marketers"
|
||||
- Reduce risk: "No spam. Unsubscribe anytime."
|
||||
|
||||
**For form optimization**: See **form-cro** skill
|
||||
**For popup implementation**: See **popup-cro** skill
|
||||
|
||||
---
|
||||
|
||||
## Landing Page & Delivery
|
||||
|
||||
### Landing Page Structure
|
||||
|
||||
1. **Headline** — Clear benefit: what they'll get and why it matters
|
||||
2. **Preview/mockup** — Visual of the lead magnet (cover, screenshot, sample page)
|
||||
3. **What's inside** — 3-5 bullet points of key takeaways
|
||||
4. **Social proof** — Download count, testimonials, logos
|
||||
5. **Form** — Minimal fields, clear CTA button
|
||||
6. **FAQ** — Address hesitations (Is it really free? What format?)
|
||||
|
||||
**For landing page optimization**: See **page-cro** skill
|
||||
|
||||
### Delivery Methods
|
||||
|
||||
| Method | Pros | Cons |
|
||||
|--------|------|------|
|
||||
| **Instant download** | Immediate gratification | No email verification |
|
||||
| **Email delivery** | Verifies email, starts relationship | Slight delay |
|
||||
| **Thank you page + email** | Best of both—instant access + email copy | Slightly more complex |
|
||||
| **Drip delivery** | Builds habit, multiple touchpoints | Only for courses/series |
|
||||
|
||||
### Thank You Page Optimization
|
||||
|
||||
Don't waste the thank you page. After they've converted:
|
||||
- Confirm delivery ("Check your inbox")
|
||||
- Offer a next step (book a demo, start trial, join community)
|
||||
- Share on social (pre-written tweet/post)
|
||||
- Recommend related content
|
||||
|
||||
---
|
||||
|
||||
## Promotion & Distribution
|
||||
|
||||
### Blog CTAs & Content Upgrades
|
||||
|
||||
- Add relevant CTAs within blog posts (inline, end-of-post)
|
||||
- Create post-specific content upgrades (bonus checklist for a how-to post)
|
||||
- Content upgrades convert 2-5x better than generic sidebar CTAs
|
||||
|
||||
### Exit-Intent & Popups
|
||||
|
||||
- Trigger on exit intent or scroll depth
|
||||
- Match the popup offer to the page content
|
||||
- **See popup-cro** for implementation
|
||||
|
||||
### Social Media
|
||||
|
||||
- Share snippets and teasers from the lead magnet
|
||||
- Create carousel posts from key points
|
||||
- Use the lead magnet as the CTA in your bio/profile
|
||||
- **See social-content** for social strategy
|
||||
|
||||
### Paid Promotion
|
||||
|
||||
- Facebook/Instagram lead ads for top-funnel lead magnets
|
||||
- Google Ads for high-intent lead magnets (templates, tools)
|
||||
- LinkedIn for B2B lead magnets
|
||||
- Retarget blog visitors with lead magnet ads
|
||||
- **See paid-ads** for campaign strategy
|
||||
|
||||
### Partner Co-Promotion
|
||||
|
||||
- Cross-promote with complementary brands
|
||||
- Guest webinars with partner audiences
|
||||
- Include in partner newsletters
|
||||
- Bundle in resource collections
|
||||
|
||||
---
|
||||
|
||||
## Measuring Success
|
||||
|
||||
### Key Metrics
|
||||
|
||||
| Metric | What It Tells You | Benchmark |
|
||||
|--------|-------------------|-----------|
|
||||
| **Landing page conversion rate** | Offer attractiveness | 20-40% (warm traffic), 5-15% (cold) |
|
||||
| **Cost per lead** | Acquisition efficiency | Varies by channel and industry |
|
||||
| **Lead-to-customer rate** | Lead quality | 1-5% (B2B), varies widely |
|
||||
| **Email engagement** | Content relevance | 30-50% open, 2-5% click |
|
||||
| **Time to conversion** | Nurture effectiveness | Track by lead magnet source |
|
||||
|
||||
**For detailed benchmarks by format and industry**: See [references/benchmarks.md](references/benchmarks.md)
|
||||
|
||||
### A/B Testing Ideas
|
||||
|
||||
- **Headline**: Benefit-focused vs. curiosity-driven
|
||||
- **Format**: Checklist vs. guide on same topic
|
||||
- **Gate level**: Full gate vs. partial preview
|
||||
- **Form fields**: Email-only vs. email + name
|
||||
- **CTA copy**: "Download Free Guide" vs. "Get Your Copy"
|
||||
- **Delivery**: Instant download vs. email delivery
|
||||
|
||||
### Lead Quality Signals
|
||||
|
||||
Good lead magnet attracted quality leads if:
|
||||
- Higher-than-average email engagement
|
||||
- Leads progress to trial/demo at expected rates
|
||||
- Low unsubscribe rate after delivery
|
||||
- Leads match ICP demographics
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
When creating a lead magnet strategy, provide:
|
||||
|
||||
### 1. Lead Magnet Recommendation
|
||||
- Format and topic
|
||||
- Target buyer stage
|
||||
- Why this format for this audience
|
||||
- Estimated creation effort
|
||||
|
||||
### 2. Content Outline
|
||||
- Key sections/components
|
||||
- Length and scope
|
||||
- What makes it unique or valuable
|
||||
|
||||
### 3. Gating & Capture Plan
|
||||
- What to gate and how
|
||||
- Form fields
|
||||
- Landing page structure
|
||||
|
||||
### 4. Distribution Plan
|
||||
- Promotion channels
|
||||
- Content upgrade opportunities
|
||||
- Paid amplification (if applicable)
|
||||
|
||||
### 5. Measurement Plan
|
||||
- KPIs and targets
|
||||
- What to A/B test first
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What existing content or expertise could you turn into a lead magnet?
|
||||
2. Where does your audience spend time online?
|
||||
3. What's the most common question prospects ask before buying?
|
||||
4. Do you have an email nurture sequence set up for new leads?
|
||||
5. What's your budget for design and promotion?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **free-tool-strategy**: For interactive tools as lead magnets (calculators, graders, quizzes)
|
||||
- **copywriting**: For writing the lead magnet content itself
|
||||
- **email-sequence**: For nurture sequences after lead capture
|
||||
- **page-cro**: For optimizing lead magnet landing pages
|
||||
- **popup-cro**: For popup-based lead capture
|
||||
- **form-cro**: For optimizing capture forms
|
||||
- **content-strategy**: For content planning and topic selection
|
||||
- **analytics-tracking**: For measuring lead magnet performance
|
||||
- **paid-ads**: For paid promotion of lead magnets
|
||||
- **social-content**: For social media promotion
|
||||
@@ -0,0 +1,129 @@
|
||||
# Lead Magnet Benchmarks
|
||||
|
||||
Reference data for planning and evaluating lead magnet performance.
|
||||
|
||||
---
|
||||
|
||||
## Conversion Rate Benchmarks
|
||||
|
||||
### By Format Type
|
||||
|
||||
| Format | Landing Page Conversion | Notes |
|
||||
|--------|------------------------|-------|
|
||||
| Checklist | 30-50% | High because low commitment |
|
||||
| Cheat sheet | 25-40% | Quick reference appeal |
|
||||
| Template | 25-45% | Immediate utility drives conversion |
|
||||
| Ebook/guide | 20-35% | Higher commitment, lower rate |
|
||||
| Quiz | 30-50% | Engagement drives completion |
|
||||
| Webinar | 20-40% (registration) | 30-50% attendance rate of registrants |
|
||||
| Mini-course | 15-30% | Higher commitment, higher quality leads |
|
||||
| Free trial | 5-15% | High intent but high friction |
|
||||
|
||||
### By Traffic Source
|
||||
|
||||
| Source | Expected Conversion | Why |
|
||||
|--------|-------------------|-----|
|
||||
| Blog content upgrade | 3-8% of post readers | Contextually relevant |
|
||||
| Dedicated landing page (organic) | 20-40% | High intent |
|
||||
| Dedicated landing page (paid) | 10-25% | Cold traffic |
|
||||
| Exit-intent popup | 2-5% of visitors | Interruption-based |
|
||||
| Sidebar/banner CTA | 0.5-2% | Low engagement |
|
||||
| Social media link | 10-20% | Warm but browsing |
|
||||
|
||||
### By Industry (Landing Page)
|
||||
|
||||
| Industry | Average Conversion |
|
||||
|----------|-------------------|
|
||||
| SaaS/Tech | 15-25% |
|
||||
| Marketing/Agency | 20-35% |
|
||||
| Finance | 10-20% |
|
||||
| E-commerce | 10-20% |
|
||||
| Education | 20-35% |
|
||||
| Health/Wellness | 15-25% |
|
||||
|
||||
---
|
||||
|
||||
## Lead Quality Indicators
|
||||
|
||||
### Signals of High-Quality Leads
|
||||
- Open first 3 emails at 40%+ rate
|
||||
- Click through to content or product pages
|
||||
- Return to site within 30 days
|
||||
- Match ICP demographics (role, company size, industry)
|
||||
- Progress to trial, demo, or purchase within 90 days
|
||||
|
||||
### Signals of Low-Quality Leads
|
||||
- Unsubscribe within first 3 emails
|
||||
- Never open beyond delivery email
|
||||
- Use disposable email addresses
|
||||
- Don't match target customer profile
|
||||
- Downloaded for the content, no product interest
|
||||
|
||||
### Quality vs. Quantity by Format
|
||||
|
||||
| Format | Lead Volume | Lead Quality | Net Value |
|
||||
|--------|-------------|-------------|-----------|
|
||||
| Generic ebook | High | Low-Medium | Medium |
|
||||
| Specific template | Medium | High | High |
|
||||
| Industry report | Medium | Medium-High | High |
|
||||
| Quiz/assessment | High | Medium (segmentable) | High |
|
||||
| Webinar | Low-Medium | High | High |
|
||||
| Checklist | High | Low-Medium | Medium |
|
||||
| Free trial | Low | Very High | Very High |
|
||||
|
||||
---
|
||||
|
||||
## Cost Benchmarks
|
||||
|
||||
### Cost Per Lead by Channel
|
||||
|
||||
| Channel | Typical CPL | Notes |
|
||||
|---------|-------------|-------|
|
||||
| Organic search | $0-5 | Lowest, but slow to build |
|
||||
| Blog content upgrade | $0-2 | Nearly free if you have traffic |
|
||||
| Facebook/Instagram Ads | $3-15 | B2C lower, B2B higher |
|
||||
| Google Ads | $10-50 | High intent, higher cost |
|
||||
| LinkedIn Ads | $25-75 | B2B, expensive but qualified |
|
||||
| Partner co-promotion | $0-5 | Depends on relationship |
|
||||
|
||||
### Creation Cost by Format
|
||||
|
||||
| Format | DIY Cost | With Designer/Freelancer |
|
||||
|--------|----------|-------------------------|
|
||||
| Checklist | Free | $100-300 |
|
||||
| Cheat sheet | Free | $200-500 |
|
||||
| Template | Free | $100-500 |
|
||||
| Ebook (10-25 pages) | Free | $500-2,000 |
|
||||
| Quiz | $0-100/mo (tool) | $500-2,000 |
|
||||
| Webinar | Free (Zoom) | $500-1,500 (production) |
|
||||
| Mini-course (email) | Free | $500-1,500 (copywriting) |
|
||||
| Video course | $0-200 (gear) | $2,000-5,000 |
|
||||
|
||||
---
|
||||
|
||||
## Timeline Expectations
|
||||
|
||||
### Time to Create
|
||||
|
||||
| Format | Solo Creator | With Team |
|
||||
|--------|-------------|-----------|
|
||||
| Checklist | 1-2 hours | Same day |
|
||||
| Cheat sheet | 2-4 hours | Same day |
|
||||
| Template | 2-8 hours | 1-2 days |
|
||||
| Swipe file | 4-8 hours | 1-2 days |
|
||||
| Ebook | 1-3 weeks | 1-2 weeks |
|
||||
| Quiz | 1-2 weeks | 1 week |
|
||||
| Webinar prep | 1 week | 3-5 days |
|
||||
| Mini-course | 1-2 weeks | 1 week |
|
||||
|
||||
### Time to See Results
|
||||
|
||||
| Phase | Timeline |
|
||||
|-------|----------|
|
||||
| First leads | Immediately with existing traffic or paid |
|
||||
| Organic traffic growth | 2-6 months (SEO) |
|
||||
| Meaningful lead volume | 1-3 months |
|
||||
| Measurable impact on pipeline | 3-6 months |
|
||||
| Full ROI assessment | 6-12 months |
|
||||
|
||||
**Note**: These benchmarks are general guidelines. Your actual results depend on audience, niche, traffic volume, and offer quality. Start measuring from day one and build your own benchmarks.
|
||||
@@ -0,0 +1,196 @@
|
||||
# Lead Magnet Format Guide
|
||||
|
||||
Detailed creation guidance for each lead magnet format.
|
||||
|
||||
## Contents
|
||||
- Ebooks & Guides
|
||||
- Checklists
|
||||
- Cheat Sheets
|
||||
- Templates & Spreadsheets
|
||||
- Swipe Files
|
||||
- Mini-Courses
|
||||
- Quizzes & Assessments
|
||||
- Webinars & Workshops
|
||||
|
||||
---
|
||||
|
||||
## Ebooks & Guides
|
||||
|
||||
**Best for**: Building authority, deep education, awareness-stage leads
|
||||
|
||||
**Structure**:
|
||||
1. Title page with professional design
|
||||
2. Table of contents
|
||||
3. Introduction — frame the problem, set expectations
|
||||
4. 3-7 chapters — one key concept per chapter
|
||||
5. Summary — recap key takeaways
|
||||
6. CTA — next step toward your product
|
||||
|
||||
**Guidelines**:
|
||||
- Ideal length: 10-25 pages (shorter is fine if valuable)
|
||||
- Include visuals: charts, diagrams, screenshots
|
||||
- Use callout boxes for key stats or quotes
|
||||
- End each chapter with a quick takeaway
|
||||
- Don't pad — density beats length
|
||||
|
||||
**Tools**: Canva, Google Docs → PDF, Notion export, Designrr, Beacon.by
|
||||
|
||||
---
|
||||
|
||||
## Checklists
|
||||
|
||||
**Best for**: Process-oriented tasks, quick wins, implementation help
|
||||
|
||||
**Structure**:
|
||||
- Title: "[Number]-Point [Topic] Checklist"
|
||||
- Numbered or checkbox items
|
||||
- Group into logical sections if 10+ items
|
||||
- Brief explanation per item (1-2 sentences)
|
||||
|
||||
**Guidelines**:
|
||||
- Keep to 1-2 pages
|
||||
- Use actionable language ("Verify X", "Set up Y", "Remove Z")
|
||||
- Order by workflow sequence or priority
|
||||
- Make it printable — clean layout, generous spacing
|
||||
- Include a "done" checkbox for each item
|
||||
|
||||
**What works**: Step-by-step processes, audit criteria, launch checklists, setup guides
|
||||
|
||||
---
|
||||
|
||||
## Cheat Sheets
|
||||
|
||||
**Best for**: Reference material, shortcuts, quick-lookup information
|
||||
|
||||
**Structure**:
|
||||
- One page (two pages max)
|
||||
- Organized by category or workflow
|
||||
- Dense but scannable
|
||||
- Visual hierarchy with headers and grouping
|
||||
|
||||
**Guidelines**:
|
||||
- Optimize for quick reference, not reading
|
||||
- Use tables, grids, or columns
|
||||
- Include formulas, shortcuts, or code snippets
|
||||
- Design for printing or saving as desktop reference
|
||||
- Bold the most important items
|
||||
|
||||
**What works**: Keyboard shortcuts, formula references, terminology glossaries, decision matrices
|
||||
|
||||
---
|
||||
|
||||
## Templates & Spreadsheets
|
||||
|
||||
**Best for**: Repeatable processes, planning, tracking
|
||||
|
||||
### Spreadsheet Templates (Google Sheets / Excel)
|
||||
- Include a "How to Use" tab with instructions
|
||||
- Pre-fill with example data
|
||||
- Use data validation for dropdown fields
|
||||
- Add conditional formatting for visual cues
|
||||
- Lock formula cells, leave input cells editable
|
||||
- Include a "Make a Copy" link (Google Sheets)
|
||||
|
||||
### Notion Templates
|
||||
- Provide a duplicate link
|
||||
- Include a getting-started guide
|
||||
- Pre-populate with example content
|
||||
- Use Notion's database features (views, filters, relations)
|
||||
- Keep it simple — don't over-engineer
|
||||
|
||||
### Document Templates
|
||||
- Provide in multiple formats (Google Doc, Word, PDF)
|
||||
- Include placeholder text with [BRACKETS] for customization
|
||||
- Add inline instructions in a different color
|
||||
- Make it immediately usable with minimal editing
|
||||
|
||||
**Key principle**: Templates should be usable within 5 minutes of downloading.
|
||||
|
||||
---
|
||||
|
||||
## Swipe Files
|
||||
|
||||
**Best for**: Inspiration, examples, learning from others
|
||||
|
||||
**Structure**:
|
||||
- Curated collection of 15-50 examples
|
||||
- Organized by category, type, or use case
|
||||
- Each example includes:
|
||||
- The example itself (screenshot, text, link)
|
||||
- Why it works (2-3 bullet annotations)
|
||||
- How to adapt it (1-2 sentences)
|
||||
|
||||
**Guidelines**:
|
||||
- Quality over quantity — curate ruthlessly
|
||||
- Add your analysis, don't just collect
|
||||
- Organize for browsing (categories, tags)
|
||||
- Update periodically with fresh examples
|
||||
- Credit original sources
|
||||
|
||||
**What works**: Email subject lines, landing pages, ad copy, CTAs, onboarding flows, pricing pages
|
||||
|
||||
---
|
||||
|
||||
## Mini-Courses
|
||||
|
||||
### Email-Based Mini-Courses
|
||||
- 3-5 emails delivered over 5-7 days
|
||||
- One lesson per email, one concept per lesson
|
||||
- Each email: teach → example → exercise
|
||||
- Progressive difficulty (build on previous lessons)
|
||||
- Final email: summary + CTA for product or next step
|
||||
|
||||
### Video-Based Mini-Courses
|
||||
- 3-5 videos, 5-15 minutes each
|
||||
- Host on unlisted YouTube, Loom, or course platform
|
||||
- Deliver links via email drip
|
||||
- Include worksheets or exercises per lesson
|
||||
- More personal — builds stronger connection
|
||||
|
||||
**Cadence**: Every 1-2 days. Don't stretch too thin or compress too tight.
|
||||
|
||||
**Key principle**: Each lesson should deliver standalone value. If someone only watches lesson 2, they should still learn something useful.
|
||||
|
||||
---
|
||||
|
||||
## Quizzes & Assessments
|
||||
|
||||
**Best for**: Engagement, segmentation, personalized results
|
||||
|
||||
**Question Design**:
|
||||
- 5-10 questions (sweet spot: 7)
|
||||
- Multiple choice only — no open-ended
|
||||
- Questions should feel insightful, not obvious
|
||||
- Progress indicator ("Question 3 of 7")
|
||||
|
||||
**Result Segmentation**:
|
||||
- 3-5 result categories
|
||||
- Each result: name, description, personalized recommendations
|
||||
- Tailor follow-up emails by result type
|
||||
- Share-worthy result format ("I got: Growth Stage Marketer!")
|
||||
|
||||
**Implementation**: Gate results behind email capture. The quiz itself is ungated — the personalized results require an email.
|
||||
|
||||
**For building interactive quizzes**: See **free-tool-strategy** skill for technical implementation guidance.
|
||||
|
||||
---
|
||||
|
||||
## Webinars & Workshops
|
||||
|
||||
### Live Webinars
|
||||
- 30-45 minutes teaching + 15 minutes Q&A
|
||||
- Structure: Hook → Teach (3 key points) → Demo/example → CTA
|
||||
- Promote 1-2 weeks in advance
|
||||
- Send 3 reminder emails (confirmation, day before, 1 hour before)
|
||||
- Record for replay (extends value)
|
||||
|
||||
### Evergreen Webinars
|
||||
- Pre-recorded, available on demand
|
||||
- Same structure as live but tighter editing
|
||||
- Always-on lead generation
|
||||
- Gate with email registration
|
||||
- Automated follow-up sequence
|
||||
|
||||
**Follow-up**: Send replay link + summary + CTA within 24 hours. Continue with nurture sequence.
|
||||
|
||||
**Key principle**: Teach something genuinely useful. A webinar that's just a sales pitch will damage trust.
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: marketing-ideas
|
||||
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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "marketing-ideas",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "I need marketing ideas for my SaaS product. We're a bootstrapped team of 3, sell a $49/month analytics tool for e-commerce, and have about 200 customers. Budget is tight — maybe $500/month for marketing.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should filter ideas by low budget and early-stage constraints. Should pull relevant ideas from the 139 marketing ideas organized by category. Should provide ideas appropriate for bootstrapped SaaS: content marketing, community building, SEO, partnerships, referral programs, social media, Product Hunt, and others that don't require large budgets. Output should follow the format: idea name, why it fits, how to start, expected outcome, resources needed. Should prioritize by likely impact given their stage.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Filters ideas by low budget constraint",
|
||||
"Provides ideas from the 139 marketing ideas catalog",
|
||||
"Ideas are appropriate for bootstrapped SaaS stage",
|
||||
"Output follows structured format per idea",
|
||||
"Includes why it fits, how to start, expected outcome",
|
||||
"Prioritizes by likely impact",
|
||||
"Includes resources needed per idea"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "What's the fastest way to get more leads? We sell enterprise security software and have a $10k/month marketing budget.",
|
||||
"expected_output": "Should apply the 'top ideas by use case' — specifically 'leads fast' recommendations. Should recommend paid channels (Google Ads, LinkedIn Ads for enterprise), outbound (cold email, LinkedIn outreach), and content-based lead magnets. Should filter for enterprise-appropriate tactics. Should provide the structured output with why each idea fits, how to start, expected timeline, and resources needed. Should note that 'fast leads' typically means paid or outbound channels.",
|
||||
"assertions": [
|
||||
"Applies 'leads fast' use case filter",
|
||||
"Recommends paid channels appropriate for enterprise",
|
||||
"Recommends outbound tactics",
|
||||
"Filters for enterprise-appropriate tactics",
|
||||
"Provides structured output per idea",
|
||||
"Notes that fast leads means paid or outbound",
|
||||
"Includes timeline expectations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "how do we grow without spending money on ads? we're a PLG (product-led growth) company with a freemium model",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the 'PLG' use case filter from top ideas. Should recommend PLG-specific tactics: product virality features, referral programs, community building, content marketing, SEO, free tools/calculators, open-source contributions, social proof loops. Should avoid ad-dependent ideas given the constraint. Should provide structured output with implementation guidance.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies PLG use case filter",
|
||||
"Recommends PLG-specific tactics",
|
||||
"Avoids ad-dependent ideas",
|
||||
"Includes virality and referral tactics",
|
||||
"Provides structured output with implementation guidance"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We want to build authority and thought leadership in the HR tech space. We're a newer company and nobody knows who we are yet.",
|
||||
"expected_output": "Should apply the 'authority building' use case filter. Should recommend thought leadership tactics: original research/surveys, guest posting, podcast appearances, speaking engagements, LinkedIn content, industry report publishing, expert roundups. Should note that authority building is a longer-term play. Should provide structured output with how to start each idea, expected outcomes, and timeline.",
|
||||
"assertions": [
|
||||
"Applies 'authority building' use case filter",
|
||||
"Recommends thought leadership tactics",
|
||||
"Includes original research and content",
|
||||
"Includes community and media appearances",
|
||||
"Notes authority building is longer-term",
|
||||
"Provides structured output with timelines"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Give me 20 marketing ideas. We sell project management software.",
|
||||
"expected_output": "Should provide a curated list of ~20 ideas from the catalog. Should organize them by category or by effort/impact. Should provide brief implementation context for each. Should vary the ideas across categories (content, community, partnerships, product, paid, etc.) for a well-rounded set. Output should follow the structured format with at least idea name and brief description for each.",
|
||||
"assertions": [
|
||||
"Provides approximately 20 ideas",
|
||||
"Ideas span multiple categories",
|
||||
"Organizes by category or effort/impact",
|
||||
"Provides brief implementation context per idea",
|
||||
"Output follows structured format",
|
||||
"Ideas are relevant to project management software"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "We want to set up a referral program. How should we structure it?",
|
||||
"expected_output": "Should recognize this is specifically a referral program design request. Should defer to or cross-reference the referral-program skill, which provides detailed guidance on referral loop design, incentive structures, implementation, and optimization. May briefly mention referral programs as a marketing idea but should make clear that referral-program is the right skill for detailed program design.",
|
||||
"assertions": [
|
||||
"Recognizes this as a referral program design request",
|
||||
"References or defers to referral-program skill",
|
||||
"Does not attempt detailed referral program design",
|
||||
"May briefly mention as a marketing idea"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: marketing-psychology
|
||||
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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"skill_name": "marketing-psychology",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "How can I use psychology to increase conversions on our pricing page? We sell a B2B SaaS tool with three tiers ($29, $79, $199/month).",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply relevant pricing psychology models: anchoring (show the highest plan first or use a decoy), charm pricing (consider $29 vs $30), Rule of 100 (percentage vs dollar discounts), Good-Better-Best framing, loss aversion (show what they miss on lower tiers). Should also apply broader persuasion models: social proof near pricing, scarcity for limited-time offers, default effect (pre-select recommended plan). Should provide specific, actionable recommendations tied to their price points.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies pricing psychology models (anchoring, charm pricing, Rule of 100)",
|
||||
"Applies Good-Better-Best framing",
|
||||
"Applies loss aversion to tier differentiation",
|
||||
"Applies social proof near pricing",
|
||||
"Provides specific recommendations for their price points",
|
||||
"References specific mental models by name"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Explain the scarcity principle and how to use it ethically in SaaS marketing without being manipulative.",
|
||||
"expected_output": "Should explain scarcity as a mental model (limited availability increases perceived value). Should provide legitimate SaaS applications: limited beta spots, early-bird pricing with real deadlines, limited-time feature access, cohort-based launches. Should distinguish ethical scarcity (real constraints) from manufactured urgency (fake countdown timers, artificial limits). Should provide specific examples and implementation guidance. Should reference related models (urgency, FOMO, loss aversion).",
|
||||
"assertions": [
|
||||
"Explains scarcity principle clearly",
|
||||
"Provides legitimate SaaS applications",
|
||||
"Distinguishes ethical from manipulative use",
|
||||
"Provides specific examples",
|
||||
"References related mental models",
|
||||
"Addresses ethical considerations directly"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "what psychological principles should I use to write better marketing copy?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should recommend copy-relevant mental models from the skill's taxonomy: social proof, reciprocity, loss aversion, anchoring, scarcity, IKEA Effect, Endowment Effect, Commitment & Consistency. For each principle, should explain what it is and provide a specific copywriting application. Should reference the quick reference table by challenge. Should organize by where in the copy each principle applies (headlines, body, CTAs, testimonials).",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Recommends copy-relevant mental models",
|
||||
"Explains each principle briefly",
|
||||
"Provides specific copywriting application per principle",
|
||||
"Organizes by where each applies in copy",
|
||||
"References multiple model categories"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "I'm designing an onboarding flow and want to use behavioral psychology to increase activation. What models should I apply?",
|
||||
"expected_output": "Should apply design and behavioral models from the skill's taxonomy: Goal-Gradient Effect (motivation increases near goal), Hick's Law (reduce choices), IKEA Effect (let users build something), Endowment Effect (let them experience ownership), Zeigarnik Effect (incomplete tasks drive completion), Commitment & Consistency (small asks first). Should explain how each applies to onboarding specifically. Should provide actionable recommendations for each model.",
|
||||
"assertions": [
|
||||
"Applies Goal-Gradient Effect",
|
||||
"Applies Hick's Law",
|
||||
"Applies IKEA Effect or Endowment Effect",
|
||||
"Applies Zeigarnik Effect or commitment principles",
|
||||
"Explains how each applies to onboarding",
|
||||
"Provides actionable recommendations per model"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "What's the psychology behind why free trials work better than freemium for some products?",
|
||||
"expected_output": "Should apply relevant mental models: loss aversion (trial users fear losing access), endowment effect (they feel ownership after using), sunk cost (time invested during trial), Zero-Price Effect (free removes psychological barrier to start), status quo bias (inertia to keep what they have). Should explain how these models interact in trial vs freemium contexts. Should note when each model works best (trial for products with high activation effort, freemium for products with network effects).",
|
||||
"assertions": [
|
||||
"Applies loss aversion to trial context",
|
||||
"Applies endowment effect",
|
||||
"Applies Zero-Price Effect",
|
||||
"Explains how models interact in trial vs freemium",
|
||||
"Notes when each approach works best",
|
||||
"Provides clear, educational explanation"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Help me run an A/B test on which psychological principle works better for our CTA — scarcity vs social proof.",
|
||||
"expected_output": "Should recognize this is an A/B test setup task, not a psychology task. Should defer to or cross-reference the ab-test-setup skill for the experiment design. May provide psychological context on both principles to inform the hypothesis, but should make clear that ab-test-setup is the right skill for designing and running the experiment.",
|
||||
"assertions": [
|
||||
"Recognizes this as an A/B test setup task",
|
||||
"References or defers to ab-test-setup skill",
|
||||
"May provide psychological context for hypothesis",
|
||||
"Does not attempt full test design using psychology patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: onboarding-cro
|
||||
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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
{
|
||||
"skill_name": "onboarding-cro",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me optimize our onboarding flow. We have a project management tool and only 30% of trial users create their first project within the first week. We need to get them to value faster.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should start by defining the activation/aha moment — in this case, creating a first project. Should evaluate the current time-to-value and identify friction points. Should recommend an onboarding flow approach (product-first, guided setup, or value-first). Should apply the checklist pattern (3-7 items for onboarding completion). Should address empty states as opportunities to guide users. Should provide experiment ideas for testing improvements. Should include measurement metrics.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Defines the activation/aha moment",
|
||||
"Evaluates time-to-value",
|
||||
"Recommends onboarding flow approach",
|
||||
"Applies checklist pattern with 3-7 items",
|
||||
"Addresses empty states as opportunities",
|
||||
"Provides experiment ideas",
|
||||
"Includes measurement metrics"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "What should our onboarding checklist include? We're a design collaboration tool. Users need to upload a design, invite a team member, and leave a comment to get full value.",
|
||||
"expected_output": "Should apply the checklist pattern. Should include the 3 stated activation actions (upload design, invite team, leave comment). Should recommend 3-7 total items ordered by increasing commitment. Should suggest starting with the quickest win to build momentum. Should recommend progress indicators and completion rewards. Should address what happens when users skip items. Should provide specific UX recommendations for the checklist implementation.",
|
||||
"assertions": [
|
||||
"Applies checklist pattern",
|
||||
"Includes the 3 stated activation actions",
|
||||
"Limits to 3-7 total items",
|
||||
"Orders by increasing commitment",
|
||||
"Starts with quickest win",
|
||||
"Recommends progress indicators",
|
||||
"Addresses skipped items",
|
||||
"Provides UX recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "our users sign up but then never come back. like 50% don't even log in a second time. what do we do?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should address this as a stalled users problem. Should apply the handling stalled users framework: identify drop-off points, re-engagement triggers, multi-channel outreach (email, in-app, push). Should investigate root causes: is the first-run experience too complex? Is value not immediately apparent? Is the setup too long? Should recommend immediate improvements to the first session experience. Should suggest multi-channel onboarding (email sequences to bring them back). Should cross-reference email-sequence for re-engagement emails.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies stalled users framework",
|
||||
"Identifies potential root causes for drop-off",
|
||||
"Recommends first-session experience improvements",
|
||||
"Suggests multi-channel onboarding",
|
||||
"Cross-references email-sequence for re-engagement",
|
||||
"Provides specific re-engagement triggers"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "How do we handle the empty state when a new user first logs in? Right now they just see a blank dashboard.",
|
||||
"expected_output": "Should apply the empty states as opportunities guidance. Should recommend turning the blank dashboard into a guided experience: sample data to show what the product looks like populated, a clear first action CTA, contextual tips, or a quick-start wizard. Should provide specific recommendations for empty state design: what to show, what action to prompt, how to reduce the 'blank canvas paralysis.' Should reference patterns by product type if applicable.",
|
||||
"assertions": [
|
||||
"Applies empty states as opportunities guidance",
|
||||
"Recommends alternatives to blank dashboard",
|
||||
"Suggests sample data or templates",
|
||||
"Provides clear first action CTA",
|
||||
"Addresses blank canvas paralysis",
|
||||
"Provides specific empty state design recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Should we use tooltips, a product tour, or a setup wizard for onboarding? What works best?",
|
||||
"expected_output": "Should apply the tooltips/guided tours guidance. Should compare the approaches: tooltips (contextual, on-demand, less intrusive), product tours (guided walkthrough, can overwhelm), setup wizards (structured, ensures key setup steps). Should recommend based on product complexity and onboarding goals. Should note that the best approach often combines elements. Should provide best practices for each: tooltip fatigue avoidance, tour length limits, wizard step count. Should recommend testing different approaches.",
|
||||
"assertions": [
|
||||
"Compares tooltips, product tours, and setup wizards",
|
||||
"Explains when each works best",
|
||||
"Notes that combination approaches often work",
|
||||
"Provides best practices for each",
|
||||
"Addresses tooltip fatigue and tour length",
|
||||
"Recommends testing different approaches"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Our signup form has 8 fields and people keep dropping off. Can you help us fix the signup flow?",
|
||||
"expected_output": "Should recognize this is a signup flow optimization task, not post-signup onboarding. Should defer to or cross-reference the signup-flow-cro skill, which handles signup form optimization, field reduction, and registration flow design. Onboarding-cro covers what happens after signup. Should make this distinction clear.",
|
||||
"assertions": [
|
||||
"Recognizes this as signup flow optimization, not onboarding",
|
||||
"References or defers to signup-flow-cro skill",
|
||||
"Explains that onboarding-cro covers post-signup",
|
||||
"Does not attempt signup form redesign using onboarding patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: page-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," 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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"skill_name": "page-cro",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Here's my SaaS landing page: https://example.com/product. We get about 5,000 visitors/month from Google Ads but only 1.2% convert to free trial signups. Can you help me figure out what's wrong?",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify page type (landing page) and conversion goal (free trial signup). Should analyze across the CRO framework dimensions: value proposition clarity, headline effectiveness, CTA placement/copy/hierarchy, visual hierarchy, trust signals, objection handling, and friction points. Should provide recommendations organized as Quick Wins, High-Impact Changes, and Test Ideas. Should note the message match issue between Google Ads and landing page. Should provide 2-3 headline and CTA copy alternatives with rationale.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Identifies page type as landing page",
|
||||
"Identifies conversion goal as free trial signup",
|
||||
"Analyzes value proposition clarity",
|
||||
"Analyzes CTA placement and copy",
|
||||
"Notes message match between ads and landing page",
|
||||
"Output has Quick Wins section",
|
||||
"Output has High-Impact Changes section",
|
||||
"Output has Test Ideas section",
|
||||
"Provides 2-3 headline or CTA alternatives"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Our pricing page has three tiers but nobody picks the middle one. 60% choose the cheapest plan and 30% bounce entirely. What should we change?",
|
||||
"expected_output": "Should apply the Pricing Page CRO framework. Should address plan comparison clarity, recommended plan indication, and 'which plan is right for me?' anxiety. Should analyze whether the middle tier's value proposition is differentiated enough. Should recommend trust signals and social proof near pricing. Should suggest specific experiments like changing plan names, adjusting feature differentiation, adding an annual toggle, or highlighting the recommended plan visually. Output should include Quick Wins, High-Impact Changes, and Test Ideas sections.",
|
||||
"assertions": [
|
||||
"Applies Pricing Page CRO framework",
|
||||
"Addresses recommended plan indication",
|
||||
"Addresses 'which plan is right for me' anxiety",
|
||||
"Analyzes middle tier differentiation",
|
||||
"Suggests specific experiments",
|
||||
"Output has Quick Wins section",
|
||||
"Output has High-Impact Changes section",
|
||||
"Output has Test Ideas section"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "this page isn't converting. can you take a look? it's our homepage for a B2B project management tool",
|
||||
"expected_output": "Should trigger on the casual 'this page isn't converting' phrasing. Should identify this as a Homepage CRO analysis. Should ask clarifying questions about current conversion rate, traffic sources, and conversion goal. Should apply the full CRO Analysis Framework starting with value proposition clarity. Should address the homepage-specific guidance: serving multiple audiences, leading with broadest value prop, and providing clear paths for different visitor intents. Should provide structured output with Quick Wins, High-Impact Changes, Test Ideas, and Copy Alternatives.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Identifies as Homepage CRO",
|
||||
"Asks about current conversion rate",
|
||||
"Asks about traffic sources",
|
||||
"Applies CRO Analysis Framework",
|
||||
"Addresses serving multiple audiences",
|
||||
"Addresses clear paths for different visitor intents",
|
||||
"Output has structured sections"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We have a blog that gets 20k organic visits/month but almost nobody clicks through to our product. How do we get more conversions from blog readers?",
|
||||
"expected_output": "Should apply the Blog Post CRO framework. Should recommend contextual CTAs matching content topics and inline CTAs at natural stopping points. Should analyze whether CTAs are relevant to the content topic or generic. Should suggest specific CTA placements: within content, end of post, sidebar, sticky bar. Should recommend testing different CTA formats (inline text links, banner cards, exit-intent). Should cross-reference copywriting skill for CTA copy improvement.",
|
||||
"assertions": [
|
||||
"Applies Blog Post CRO framework",
|
||||
"Recommends contextual CTAs matching content",
|
||||
"Recommends inline CTAs at natural stopping points",
|
||||
"Suggests specific CTA placements",
|
||||
"Suggests testing different CTA formats",
|
||||
"Cross-references copywriting or related skill"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "We redesigned our landing page and conversions dropped from 4.2% to 2.8%. Here's the new page. What went wrong?",
|
||||
"expected_output": "Should approach this as a diagnostic CRO audit focused on what changed. Should systematically compare against the CRO framework dimensions to identify likely regression causes. Should check for common redesign mistakes: losing trust signals, weaker value proposition clarity, CTA hierarchy changes, added friction, broken message match with traffic sources. Should provide specific fixes organized by likely impact. Should recommend reverting high-risk changes while testing others.",
|
||||
"assertions": [
|
||||
"Approaches as diagnostic audit",
|
||||
"Checks for lost trust signals",
|
||||
"Checks for weakened value proposition",
|
||||
"Checks for CTA hierarchy changes",
|
||||
"Checks for added friction",
|
||||
"Checks for broken message match with traffic sources",
|
||||
"Provides fixes organized by impact",
|
||||
"Recommends reverting high-risk changes"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Our signup form has too many fields and people keep abandoning it halfway through. Can you help optimize it?",
|
||||
"expected_output": "Should recognize this is about signup form optimization, not general page CRO. Should defer to or cross-reference the signup-flow-cro skill, which specifically handles signup, registration, and account creation flows. May provide some general friction reduction advice but should make clear that signup-flow-cro is the right skill for this task.",
|
||||
"assertions": [
|
||||
"Recognizes this as signup flow optimization",
|
||||
"References or defers to signup-flow-cro skill",
|
||||
"Does not attempt full page-cro analysis on a form"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"prompt": "Review this feature page for our API monitoring tool. Most traffic comes from organic search for 'API monitoring tools'. We want them to start a free trial.",
|
||||
"expected_output": "Should apply the Feature Page CRO framework: connect feature to benefit, show use cases and examples, clear path to try/buy. Should reference the experiments section and suggest prioritized test ideas for hero section, trust signals, and CTA variations. Should note the organic search traffic source and check for message match with search intent. Should cross-reference ab-test-setup skill for proper test implementation.",
|
||||
"assertions": [
|
||||
"Applies Feature Page CRO framework",
|
||||
"Connects features to benefits",
|
||||
"Suggests use cases and examples",
|
||||
"Provides clear path to try/buy",
|
||||
"Notes organic traffic source and search intent match",
|
||||
"Suggests specific experiment hypotheses",
|
||||
"Cross-references ab-test-setup skill"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: paid-ads
|
||||
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,' or 'audience targeting.' This skill covers campaign strategy, audience targeting, and optimization. For bulk ad creative generation and iteration, see ad-creative."
|
||||
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
|
||||
---
|
||||
@@ -122,7 +122,7 @@ LI_LeadGen_CMOs-SaaS_Whitepaper_Mar24
|
||||
|
||||
- **Lookalikes**: Base on best customers (by LTV), not all customers
|
||||
- **Retargeting**: Segment by funnel stage (visitors vs. cart abandoners)
|
||||
- **Exclusions**: Always exclude existing customers and recent converters
|
||||
- **Exclusions**: Exclude existing customers and recent converters — showing ads to people who already bought wastes spend
|
||||
|
||||
**For detailed targeting strategies by platform**: See [references/audience-targeting.md](references/audience-targeting.md)
|
||||
|
||||
@@ -245,6 +245,8 @@ Before launching campaigns, ensure proper tracking and account setup.
|
||||
|
||||
**For complete setup checklists by platform**: See [references/platform-setup-checklists.md](references/platform-setup-checklists.md)
|
||||
|
||||
**For conversion pixel installation and event setup**: See [references/conversion-tracking.md](references/conversion-tracking.md)
|
||||
|
||||
### Universal Pre-Launch Checklist
|
||||
- [ ] Conversion tracking tested with real conversion
|
||||
- [ ] Landing page loads fast (<3 sec)
|
||||
@@ -302,7 +304,7 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key adver
|
||||
| **LinkedIn Ads** | B2B, job title targeting | - | [linkedin-ads.md](../../tools/integrations/linkedin-ads.md) |
|
||||
| **TikTok Ads** | Younger demographics, video | - | [tiktok-ads.md](../../tools/integrations/tiktok-ads.md) |
|
||||
|
||||
For tracking, see also: [ga4.md](../../tools/integrations/ga4.md), [segment.md](../../tools/integrations/segment.md)
|
||||
For tracking setup, see [references/conversion-tracking.md](references/conversion-tracking.md), [ga4.md](../../tools/integrations/ga4.md), [segment.md](../../tools/integrations/segment.md)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "paid-ads",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me plan a paid advertising strategy. We're a B2B SaaS tool for HR teams, selling at $99/month per seat. We have $15k/month to spend on ads and want to generate demo requests. Where should we advertise?",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the platform selection guide based on B2B, HR audience, $99/month price point. Should recommend LinkedIn (B2B targeting by job title/industry), Google Ads (search intent for HR software keywords), and potentially Meta (retargeting). Should recommend campaign structure with naming conventions. Should define audience targeting strategy for each platform. Should set budget allocation across platforms. Should define success metrics and attribution approach. Should recommend starting structure and scaling plan.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies platform selection guide",
|
||||
"Recommends platforms appropriate for B2B HR audience",
|
||||
"Recommends campaign structure with naming conventions",
|
||||
"Defines audience targeting per platform",
|
||||
"Sets budget allocation across platforms",
|
||||
"Defines success metrics",
|
||||
"Recommends starting structure and scaling plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Our Google Ads CPC is $12 and our cost per lead is $180. Is that good? We're getting about 80 leads/month from a $15k budget.",
|
||||
"expected_output": "Should evaluate the metrics in context. Should assess: $12 CPC for B2B (reasonable depending on industry), $180 CPL (depends on LTV — need to compare against customer lifetime value), 80 leads/month from $15k (math checks out). Should apply the campaign optimization framework: check quality score, search term relevance, landing page conversion rate, negative keywords. Should recommend specific optimization levers to reduce CPC and CPL. Should frame performance against industry benchmarks if applicable. Should ask about downstream conversion rates (lead → demo → customer).",
|
||||
"assertions": [
|
||||
"Evaluates metrics in context",
|
||||
"Compares CPL against LTV considerations",
|
||||
"Applies campaign optimization framework",
|
||||
"Recommends specific optimization levers",
|
||||
"Asks about downstream conversion rates",
|
||||
"Provides industry context for benchmarking"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "we want to run retargeting ads for people who visited our site but didn't convert. how should we set this up?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the retargeting strategies section, specifically the funnel-based approach. Should recommend audience segments: all visitors (broad), pricing page visitors (high intent), blog readers (lower intent), and cart/signup abandoners (highest intent). Should recommend different messaging and offers for each segment. Should address frequency capping to avoid ad fatigue. Should recommend retargeting platforms (Meta, Google Display, LinkedIn). Should include duration windows for each audience.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies funnel-based retargeting approach",
|
||||
"Recommends audience segments by intent level",
|
||||
"Recommends different messaging per segment",
|
||||
"Addresses frequency capping",
|
||||
"Recommends retargeting platforms",
|
||||
"Includes audience duration windows"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Should we advertise on TikTok? We sell accounting software to small businesses. Our current ads are on Google and Meta.",
|
||||
"expected_output": "Should apply the platform selection guide for TikTok specifically. Should evaluate TikTok fit for accounting software + small business audience: likely a weaker fit than Google/Meta for this category (lower purchase intent, younger skewing audience, less B2B targeting). Should discuss when TikTok CAN work for B2B (brand awareness, creative content, younger business owners). Should provide an honest recommendation with caveats. Should suggest a small test budget approach if they want to try.",
|
||||
"assertions": [
|
||||
"Applies platform selection guide for TikTok",
|
||||
"Evaluates fit for accounting + small business audience",
|
||||
"Provides honest assessment of likely weaker fit",
|
||||
"Discusses when TikTok can work for B2B",
|
||||
"Suggests small test budget if proceeding",
|
||||
"Compares to their existing Google/Meta performance"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "How do we structure our Google Ads campaigns? We have 50+ keywords we want to target for our CRM product.",
|
||||
"expected_output": "Should apply the campaign structure and naming conventions framework. Should recommend organizing campaigns by theme/intent (brand, competitor, product features, pain points). Should recommend ad group structure (tightly themed, 5-15 keywords per group). Should define naming conventions for campaigns and ad groups. Should recommend match types strategy. Should include negative keyword lists. Should provide a sample campaign structure.",
|
||||
"assertions": [
|
||||
"Applies campaign structure framework",
|
||||
"Organizes campaigns by theme/intent",
|
||||
"Recommends tight ad group structure",
|
||||
"Defines naming conventions",
|
||||
"Recommends match types strategy",
|
||||
"Includes negative keyword lists",
|
||||
"Provides sample campaign structure"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you write some ad copy for our Facebook ads? We need headlines and descriptions for 5 different angles.",
|
||||
"expected_output": "Should recognize this is an ad creative generation task, not campaign strategy. Should defer to or cross-reference the ad-creative skill, which handles platform-specific ad copy generation with character limits, angle-based variation, and batch generation. May provide brief ad copy framework guidance but should make clear that ad-creative is the right skill for generating ad copy at scale.",
|
||||
"assertions": [
|
||||
"Recognizes this as ad creative generation",
|
||||
"References or defers to ad-creative skill",
|
||||
"Does not attempt bulk ad copy generation using campaign strategy patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,361 @@
|
||||
# Conversion Tracking Setup
|
||||
|
||||
How to set up conversion tracking pixels across ad platforms. This guide covers installation, event configuration, and validation — everything a marketer needs to ensure ad spend is properly attributed.
|
||||
|
||||
---
|
||||
|
||||
## Why This Matters
|
||||
|
||||
Without conversion tracking:
|
||||
- Ad platforms can't optimize for your actual goals
|
||||
- You're flying blind on ROAS and CPA
|
||||
- Retargeting audiences can't be built
|
||||
- You'll waste budget on impressions that don't convert
|
||||
|
||||
Get tracking right before spending a dollar on ads.
|
||||
|
||||
---
|
||||
|
||||
## Platform Pixels Overview
|
||||
|
||||
| Platform | Pixel/Tag Name | Events API | Key Events |
|
||||
|----------|---------------|:----------:|------------|
|
||||
| **Google Ads** | Google tag (gtag.js) | Enhanced Conversions | purchase, sign_up, generate_lead |
|
||||
| **Meta** | Meta Pixel + CAPI | Conversions API | Purchase, Lead, ViewContent, AddToCart |
|
||||
| **LinkedIn** | Insight Tag | Conversions API | conversion (URL or event-based) |
|
||||
| **TikTok** | TikTok Pixel | Events API | Purchase, ViewContent, AddToCart, CompleteRegistration |
|
||||
| **Twitter/X** | Twitter Pixel | - | Purchase, SignUp, Download |
|
||||
|
||||
---
|
||||
|
||||
## Google Ads
|
||||
|
||||
### Install the Google tag
|
||||
|
||||
Add to every page, in `<head>`:
|
||||
|
||||
```html
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXXXXX"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'AW-XXXXXXXXX');
|
||||
</script>
|
||||
```
|
||||
|
||||
Replace `AW-XXXXXXXXX` with your Conversion ID from Google Ads > Tools > Conversions.
|
||||
|
||||
### Set up conversion actions
|
||||
|
||||
In Google Ads > Goals > Conversions > New conversion action:
|
||||
|
||||
| Conversion | Category | Value | Count |
|
||||
|-----------|----------|-------|-------|
|
||||
| Purchase | Purchase | Dynamic (order value) | Every |
|
||||
| Sign up / Lead | Sign-up | Fixed ($X estimated value) | One |
|
||||
| Demo request | Lead | Fixed ($X estimated value) | One |
|
||||
| Free trial start | Sign-up | Fixed ($X estimated value) | One |
|
||||
|
||||
### Fire conversion events
|
||||
|
||||
```javascript
|
||||
// Purchase
|
||||
gtag('event', 'conversion', {
|
||||
'send_to': 'AW-XXXXXXXXX/CONVERSION_LABEL',
|
||||
'value': 99.00,
|
||||
'currency': 'USD',
|
||||
'transaction_id': 'ORDER-123'
|
||||
});
|
||||
|
||||
// Lead / Sign up
|
||||
gtag('event', 'conversion', {
|
||||
'send_to': 'AW-XXXXXXXXX/CONVERSION_LABEL',
|
||||
'value': 50.00,
|
||||
'currency': 'USD'
|
||||
});
|
||||
```
|
||||
|
||||
### Enhanced Conversions
|
||||
|
||||
Sends hashed first-party data (email, phone) to improve attribution after cookie restrictions. Enable in Google Ads > Goals > Settings > Enhanced conversions.
|
||||
|
||||
```javascript
|
||||
gtag('set', 'user_data', {
|
||||
'email': 'user@example.com', // auto-hashed by gtag
|
||||
'phone_number': '+11234567890'
|
||||
});
|
||||
```
|
||||
|
||||
### Google Tag Manager alternative
|
||||
|
||||
If using GTM instead of inline gtag.js:
|
||||
1. Install GTM container on all pages
|
||||
2. Create Google Ads conversion tags in GTM
|
||||
3. Set triggers for conversion events (form submissions, purchases)
|
||||
4. Use the Data Layer to pass dynamic values (order amount, transaction ID)
|
||||
5. Test with GTM Preview mode before publishing
|
||||
|
||||
---
|
||||
|
||||
## Meta (Facebook/Instagram)
|
||||
|
||||
### Install the Meta Pixel
|
||||
|
||||
Add to every page, in `<head>`:
|
||||
|
||||
```html
|
||||
<script>
|
||||
!function(f,b,e,v,n,t,s)
|
||||
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
|
||||
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
|
||||
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
|
||||
n.queue=[];t=b.createElement(e);t.async=!0;
|
||||
t.src=v;s=b.getElementsByTagName(e)[0];
|
||||
s.parentNode.insertBefore(t,s)}(window, document,'script',
|
||||
'https://connect.facebook.net/en_US/fbevents.js');
|
||||
fbq('init', 'YOUR_PIXEL_ID');
|
||||
fbq('track', 'PageView');
|
||||
</script>
|
||||
```
|
||||
|
||||
Replace `YOUR_PIXEL_ID` from Meta Events Manager.
|
||||
|
||||
### Standard events
|
||||
|
||||
```javascript
|
||||
// View a product or key page
|
||||
fbq('track', 'ViewContent', {
|
||||
content_name: 'Pro Plan',
|
||||
content_category: 'Pricing',
|
||||
value: 29.00,
|
||||
currency: 'USD'
|
||||
});
|
||||
|
||||
// Lead capture (form submit, demo request)
|
||||
fbq('track', 'Lead', {
|
||||
content_name: 'Demo Request',
|
||||
value: 50.00,
|
||||
currency: 'USD'
|
||||
});
|
||||
|
||||
// Purchase
|
||||
fbq('track', 'Purchase', {
|
||||
value: 99.00,
|
||||
currency: 'USD',
|
||||
content_type: 'product',
|
||||
contents: [{ id: 'pro-plan', quantity: 1 }]
|
||||
});
|
||||
|
||||
// Add to cart (e-commerce)
|
||||
fbq('track', 'AddToCart', {
|
||||
content_ids: ['SKU-123'],
|
||||
content_type: 'product',
|
||||
value: 49.00,
|
||||
currency: 'USD'
|
||||
});
|
||||
```
|
||||
|
||||
### Conversions API (CAPI)
|
||||
|
||||
Server-side tracking that works alongside the pixel. Required for accurate tracking after iOS 14+ and cookie restrictions.
|
||||
|
||||
Set up via:
|
||||
- **Direct integration** — send events from your server to Meta's API
|
||||
- **Partner integrations** — Shopify, WooCommerce, Segment, etc. have built-in CAPI support
|
||||
- **Conversions API Gateway** — Meta's managed solution via AWS
|
||||
|
||||
Key: send the same events from both pixel (browser) AND CAPI (server), with a shared `event_id` for deduplication.
|
||||
|
||||
### Aggregated Event Measurement
|
||||
|
||||
Required for iOS 14+ tracking. In Events Manager > Aggregated Event Measurement:
|
||||
1. Verify your domain
|
||||
2. Configure and prioritize your top 8 events in order of business importance
|
||||
3. Purchase should typically be #1, Lead #2
|
||||
|
||||
---
|
||||
|
||||
## LinkedIn
|
||||
|
||||
### Install the Insight Tag
|
||||
|
||||
Add to every page, before `</body>`:
|
||||
|
||||
```html
|
||||
<script type="text/javascript">
|
||||
_linkedin_partner_id = "YOUR_PARTNER_ID";
|
||||
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
|
||||
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
|
||||
(function(l) {
|
||||
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
|
||||
window.lintrk.q=[]}
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
var b = document.createElement("script");
|
||||
b.type = "text/javascript";b.async = true;
|
||||
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
|
||||
s.parentNode.insertBefore(b, s);})(window.lintrk);
|
||||
</script>
|
||||
```
|
||||
|
||||
### Conversion tracking
|
||||
|
||||
LinkedIn supports two methods:
|
||||
|
||||
**URL-based**: Fires when someone visits a specific URL (e.g., `/thank-you`).
|
||||
Set up in Campaign Manager > Analyze > Conversion Tracking > Create Conversion.
|
||||
|
||||
**Event-based**: Fire manually on specific actions:
|
||||
|
||||
```javascript
|
||||
window.lintrk('track', { conversion_id: YOUR_CONVERSION_ID });
|
||||
```
|
||||
|
||||
### LinkedIn CAPI
|
||||
|
||||
For server-side tracking, LinkedIn offers a Conversions API. Set up via partner integrations (Segment, Tealium) or direct API calls. Deduplicates with the Insight Tag automatically when configured correctly.
|
||||
|
||||
---
|
||||
|
||||
## TikTok
|
||||
|
||||
### Install the TikTok Pixel
|
||||
|
||||
Add to every page, in `<head>`:
|
||||
|
||||
```html
|
||||
<script>
|
||||
!function (w, d, t) {
|
||||
w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];
|
||||
ttq.methods=["page","track","identify","instances","debug","on","off",
|
||||
"once","ready","alias","group","enableCookie","disableCookie","holdConsent",
|
||||
"revokeConsent","grantConsent"],ttq.setAndDefer=function(t,e)
|
||||
{t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};
|
||||
for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);
|
||||
ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;
|
||||
n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e};
|
||||
ttq.load=function(e,n){var r="https://analytics.tiktok.com/i18n/pixel/events.js",
|
||||
o=n&&n.partner;ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=r,
|
||||
ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},
|
||||
ttq._o[e]=n||{};var s=document.createElement("script");
|
||||
s.type="text/javascript",s.async=!0,s.src=r+"?sdkid="+e+"&lib="+t;
|
||||
var a=document.getElementsByTagName("script")[0];
|
||||
a.parentNode.insertBefore(s,a)};
|
||||
ttq.load('YOUR_PIXEL_ID');
|
||||
ttq.page();
|
||||
}(window, document, 'ttq');
|
||||
</script>
|
||||
```
|
||||
|
||||
### Standard events
|
||||
|
||||
```javascript
|
||||
// View content
|
||||
ttq.track('ViewContent', {
|
||||
content_id: 'pro-plan',
|
||||
content_type: 'product',
|
||||
content_name: 'Pro Plan',
|
||||
value: 29.00,
|
||||
currency: 'USD'
|
||||
});
|
||||
|
||||
// Complete registration / sign up
|
||||
ttq.track('CompleteRegistration', {
|
||||
content_name: 'Free Trial'
|
||||
});
|
||||
|
||||
// Purchase
|
||||
ttq.track('Purchase', {
|
||||
content_id: 'pro-plan',
|
||||
content_type: 'product',
|
||||
value: 99.00,
|
||||
currency: 'USD',
|
||||
quantity: 1
|
||||
});
|
||||
|
||||
// Add to cart
|
||||
ttq.track('AddToCart', {
|
||||
content_id: 'SKU-123',
|
||||
content_type: 'product',
|
||||
value: 49.00,
|
||||
currency: 'USD'
|
||||
});
|
||||
```
|
||||
|
||||
### Events API (server-side)
|
||||
|
||||
TikTok's Events API works like Meta's CAPI — send the same events from your server for better attribution. Use `event_id` for deduplication with browser pixel events.
|
||||
|
||||
### Advanced Matching
|
||||
|
||||
Pass hashed user data for better attribution:
|
||||
|
||||
```javascript
|
||||
ttq.identify({
|
||||
email: 'user@example.com', // auto-hashed
|
||||
phone_number: '+11234567890'
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Validation Checklist
|
||||
|
||||
After installing any pixel, verify before going live:
|
||||
|
||||
### Browser-side checks
|
||||
|
||||
- [ ] Pixel fires on every page (check via browser extension)
|
||||
- [ ] Conversion events fire at the right moment (after confirmed action, not on button click)
|
||||
- [ ] Event parameters contain correct values (currency, amount, content IDs)
|
||||
- [ ] No duplicate events firing on the same action
|
||||
- [ ] Events fire on both desktop and mobile
|
||||
|
||||
### Platform-side checks
|
||||
|
||||
- [ ] Events appear in the platform's event manager/diagnostics
|
||||
- [ ] Test conversions show correct values
|
||||
- [ ] Event match quality is acceptable (Meta: score > 6)
|
||||
- [ ] Server-side events are deduplicating with browser events (not double-counting)
|
||||
|
||||
### Debugging tools
|
||||
|
||||
| Platform | Tool |
|
||||
|----------|------|
|
||||
| Google | Google Tag Assistant, Chrome DevTools Network tab |
|
||||
| Meta | Meta Pixel Helper (Chrome extension), Events Manager Test Events |
|
||||
| LinkedIn | Insight Tag Validator in Campaign Manager |
|
||||
| TikTok | TikTok Pixel Helper (Chrome extension), Events Manager |
|
||||
| All | GTM Preview Mode (if using Google Tag Manager) |
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
- **Firing purchase events on button click instead of confirmed payment** — always fire on the success/thank-you page or after server confirmation
|
||||
- **Missing deduplication between pixel and server events** — without a shared `event_id`, you'll double-count conversions
|
||||
- **Not testing on mobile** — many pixels break on mobile browsers or in-app webviews
|
||||
- **Hardcoded test values** — remove test transaction amounts before going live
|
||||
- **Forgetting to exclude internal traffic** — your team's visits inflate conversion data
|
||||
- **Installing pixels without consent management** — GDPR/CCPA require user consent before firing tracking pixels in applicable regions
|
||||
- **Pixel installed but no conversion actions created** — the pixel collects data, but the ad platform won't optimize without defined conversion actions
|
||||
|
||||
---
|
||||
|
||||
## When to Use Server-Side Tracking
|
||||
|
||||
Browser-only tracking is increasingly unreliable due to:
|
||||
- iOS 14+ App Tracking Transparency
|
||||
- Third-party cookie deprecation
|
||||
- Ad blockers (30%+ of tech audiences)
|
||||
|
||||
**Use server-side (CAPI/Events API) when:**
|
||||
- Running Meta or TikTok ads (strongly recommended)
|
||||
- Your audience is tech-savvy (higher ad blocker usage)
|
||||
- You need accurate purchase/revenue attribution
|
||||
- You're spending >$5K/month on any platform
|
||||
|
||||
**Server-side is optional when:**
|
||||
- Running Google Ads only (Enhanced Conversions covers most gaps)
|
||||
- Low ad spend / testing phase
|
||||
- B2B with LinkedIn only (Insight Tag is still reliable)
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: paywall-upgrade-cro
|
||||
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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"skill_name": "paywall-upgrade-cro",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me design the upgrade paywall for our project management tool. Free users can have 3 projects, and we want to show an upgrade screen when they try to create a 4th project.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify this as a usage limit trigger point. Should apply the paywall screen components: headline (communicate the value of upgrading, not just the limit), value demonstration (show what they get with paid plan), plan comparison (free vs paid), social proof, CTA (specific and action-oriented), and escape hatch (option to go back). Should provide specific copy recommendations. Should address the emotional state of the user at this moment (frustrated by the limit). Should warn against anti-patterns.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Identifies as usage limit trigger",
|
||||
"Applies paywall screen components framework",
|
||||
"Includes headline, value demo, comparison, social proof, CTA",
|
||||
"Provides specific copy recommendations",
|
||||
"Addresses user's emotional state at the limit",
|
||||
"Includes escape hatch option",
|
||||
"Warns against anti-patterns"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Our free trial expires in 14 days and users see a generic 'Your trial has expired' screen. Upgrade rate from this screen is only 2%. How do we improve it?",
|
||||
"expected_output": "Should identify this as a trial expiration trigger. Should apply the trial expiration paywall type guidance. Should recommend: show what they've built/accomplished during the trial (endowment effect), highlight specific features they used, show the value they'd lose, provide clear plan options, include social proof from similar users who upgraded. Should diagnose why 2% is low: likely a weak value prop, no personalization, no urgency or loss framing. Should provide specific redesign recommendations.",
|
||||
"assertions": [
|
||||
"Identifies as trial expiration trigger",
|
||||
"Applies trial expiration paywall guidance",
|
||||
"Recommends showing user's accomplishments during trial",
|
||||
"Uses loss framing (what they'd lose)",
|
||||
"Provides clear plan options",
|
||||
"Includes social proof",
|
||||
"Diagnoses why current 2% rate is low",
|
||||
"Provides specific redesign recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "when should we show upgrade prompts? we don't want to be annoying but we also need to convert free users to paid.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the timing and frequency rules. Should recommend trigger points from the skill: feature gates (when they try a paid feature), usage limits (when they hit a threshold), value moments (when they've just experienced success), and natural transition points. Should address frequency capping to avoid being annoying. Should recommend the anti-patterns to avoid (blocking basic functionality, too frequent popups, dark patterns). Should provide a balanced approach that respects user experience while driving upgrades.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies timing and frequency rules",
|
||||
"Recommends specific trigger points",
|
||||
"Addresses frequency capping",
|
||||
"Warns against anti-patterns",
|
||||
"Balances user experience with conversion goals",
|
||||
"Provides specific recommendations for each trigger type"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Design a feature gate paywall. When free users click on 'Advanced Analytics' in our dashboard, we want to show them an upgrade prompt.",
|
||||
"expected_output": "Should identify this as a feature gate trigger. Should apply the feature lock paywall type guidance. Should recommend: show a preview or screenshot of the advanced analytics feature, explain the specific benefit (not just 'this is a paid feature'), include a plan comparison relevant to analytics, provide a clear CTA to upgrade, and include an escape hatch to go back to basic analytics. Should recommend showing what insights they're missing. Should provide copy recommendations for the paywall screen.",
|
||||
"assertions": [
|
||||
"Identifies as feature gate trigger",
|
||||
"Applies feature lock paywall guidance",
|
||||
"Recommends showing preview of the feature",
|
||||
"Explains specific benefit of the feature",
|
||||
"Includes relevant plan comparison",
|
||||
"Provides clear CTA and escape hatch",
|
||||
"Provides copy recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "What are common mistakes to avoid with in-app paywalls? I don't want to be pushy or make users feel tricked.",
|
||||
"expected_output": "Should apply the anti-patterns section. Should cover: dark patterns (making it hard to find the close button, confusing opt-out language), conversion killers (blocking basic functionality, showing paywalls too early before value is demonstrated, no escape hatch), frequency issues (too many prompts, showing the same paywall repeatedly). Should provide positive alternatives for each anti-pattern. Should emphasize that good paywalls feel helpful, not pushy.",
|
||||
"assertions": [
|
||||
"Applies anti-patterns section",
|
||||
"Covers dark patterns to avoid",
|
||||
"Covers conversion killers",
|
||||
"Covers frequency issues",
|
||||
"Provides positive alternatives for each",
|
||||
"Emphasizes helpful over pushy approach"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you help me optimize our public pricing page? We want more visitors to choose the Pro plan over the Basic plan.",
|
||||
"expected_output": "Should recognize this is a public pricing page optimization task, not an in-app paywall task. Should defer to or cross-reference the page-cro skill for pricing page CRO. Paywall-upgrade-cro specifically handles in-app upgrade prompts for existing users, not public-facing pricing pages.",
|
||||
"assertions": [
|
||||
"Recognizes this as public pricing page optimization",
|
||||
"References or defers to page-cro skill",
|
||||
"Explains that paywall-upgrade-cro is for in-app upgrade prompts",
|
||||
"Does not attempt public pricing page optimization"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: popup-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," 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
|
||||
---
|
||||
@@ -182,7 +182,7 @@ Before providing recommendations, understand:
|
||||
- Leave space to close (visible X, click outside)
|
||||
|
||||
### Close Button
|
||||
- Always visible (top right is convention)
|
||||
- Keep visible (top right is convention) — users who can't find the close button will bounce entirely
|
||||
- Large enough to tap on mobile
|
||||
- "No thanks" text link as alternative
|
||||
- Click outside to close
|
||||
@@ -447,6 +447,7 @@ Ideas to A/B test with expected outcomes
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **lead-magnets**: For planning lead magnets to promote via popups
|
||||
- **form-cro**: For optimizing the form inside the popup
|
||||
- **page-cro**: For the page context around popups
|
||||
- **email-sequence**: For what happens after popup conversion
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"skill_name": "popup-cro",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me create an exit-intent popup for our SaaS landing page. We want to capture emails from visitors who are about to leave without signing up. Our product is a social media scheduling tool.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify the popup type as exit-intent email capture. Should apply the exit-intent popup design guidance: compelling headline (address why they're leaving or offer additional value), lead magnet or incentive (discount, free resource, extended trial), minimal form fields (email only), clear CTA, and easy close option. Should apply copy formulas from the skill. Should address trigger configuration (exit intent detection). Should recommend frequency rules (don't show again if dismissed). Should include benchmarks (exit intent popups typically 3-10% conversion).",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Identifies as exit-intent popup type",
|
||||
"Includes compelling headline",
|
||||
"Includes lead magnet or incentive",
|
||||
"Minimal form fields (email only)",
|
||||
"Applies copy formulas from the skill",
|
||||
"Addresses trigger configuration",
|
||||
"Recommends frequency rules",
|
||||
"Includes conversion benchmarks"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We want to offer a 10% discount to first-time visitors via a popup. When should we show it and what should it say?",
|
||||
"expected_output": "Should identify this as a discount/offer popup type. Should apply trigger strategy guidance: recommend against showing immediately on page load (too aggressive). Should suggest time-based delay (30-60 seconds), scroll-based trigger (50%+ page scroll), or exit intent as better alternatives. Should apply the copy formula for discount popups: headline that frames the value, clear offer terms, urgency element, email capture, and CTA. Should address compliance (GDPR cookie consent if applicable). Should recommend frequency capping.",
|
||||
"assertions": [
|
||||
"Identifies as discount popup type",
|
||||
"Recommends against immediate page load trigger",
|
||||
"Suggests better trigger alternatives (time, scroll, exit)",
|
||||
"Applies copy formula for discount popups",
|
||||
"Includes urgency element",
|
||||
"Addresses frequency capping",
|
||||
"Addresses compliance considerations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "our popups are annoying everyone. we keep getting complaints but we also get a lot of email signups from them. how do we balance this?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the frequency and rules guidance. Should address the balance: reduce annoyance while preserving conversions. Should recommend: frequency capping (once per session or once per X days), don't show to returning visitors who already dismissed, don't show to existing subscribers, respect 'close' action, consider less intrusive formats (slide-in instead of full modal, announcement bar instead of overlay). Should address compliance and accessibility requirements. Should suggest A/B testing different triggers and formats to find the best balance.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies frequency and rules guidance",
|
||||
"Addresses balance between conversions and UX",
|
||||
"Recommends frequency capping",
|
||||
"Suggests excluding existing subscribers",
|
||||
"Recommends less intrusive alternatives",
|
||||
"Suggests A/B testing to optimize"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "What types of popups should we use on our blog? We publish content about email marketing and want to grow our email list.",
|
||||
"expected_output": "Should recommend blog-appropriate popup types: scroll-triggered popup (show after 50-70% scroll indicating engagement), exit-intent popup, slide-in (less intrusive than modal), and inline content upgrades. Should recommend lead magnets relevant to the blog topic (email marketing templates, checklist, swipe file). Should address different popup placements: mid-content, end of post, sidebar slide-in. Should recommend behavior-based triggers over time-based for blog content. Should apply copy formulas with blog-specific hooks.",
|
||||
"assertions": [
|
||||
"Recommends blog-appropriate popup types",
|
||||
"Includes scroll-triggered and exit-intent",
|
||||
"Suggests less intrusive formats (slide-in)",
|
||||
"Recommends relevant lead magnets",
|
||||
"Addresses popup placement on blog pages",
|
||||
"Recommends behavior-based triggers for blog",
|
||||
"Applies copy formulas"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Design an announcement banner for our new feature launch. We want it to show at the top of the site for 2 weeks.",
|
||||
"expected_output": "Should identify this as an announcement banner popup type. Should apply banner design guidance: short, clear headline announcing the feature, brief description of benefit, CTA to learn more or try it, dismiss option. Should recommend banner positioning (top of page, sticky or static). Should address duration (2 weeks as stated). Should recommend targeting (show to existing users who'd benefit, not just everyone). Should provide copy recommendations.",
|
||||
"assertions": [
|
||||
"Identifies as announcement banner type",
|
||||
"Provides short, clear headline",
|
||||
"Includes brief benefit description and CTA",
|
||||
"Includes dismiss option",
|
||||
"Addresses banner positioning",
|
||||
"Recommends audience targeting",
|
||||
"Provides copy recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "We need to optimize the lead capture form inside our popup. It currently asks for name, email, company, and phone number. Too many fields?",
|
||||
"expected_output": "Should recognize this overlaps with form optimization. Should defer to or cross-reference the form-cro skill, which handles form field optimization, layout, and conversion. May provide popup-specific context (popups need minimal fields due to fleeting attention) but should make clear that form-cro is the right skill for detailed form optimization.",
|
||||
"assertions": [
|
||||
"Recognizes overlap with form optimization",
|
||||
"References or defers to form-cro skill",
|
||||
"Notes popups need minimal fields due to context",
|
||||
"Does not attempt detailed form redesign"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: pricing-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,' 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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"skill_name": "pricing-strategy",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me figure out pricing for our new SaaS product. It's a customer support platform for e-commerce stores. We're not sure whether to charge per agent, per ticket, or flat rate. Currently thinking $49-199/month range.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the three pricing axes framework: packaging (what's included in each tier), pricing metric (per agent, per ticket, flat rate — evaluate each), price point ($49-199 range evaluation). Should discuss value metrics and which aligns best with value delivered (per agent is common in support, but per ticket aligns with usage). Should recommend a good-better-best tier structure. Should address pricing psychology. Should provide a specific pricing recommendation with rationale.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies three pricing axes framework",
|
||||
"Evaluates multiple pricing metrics",
|
||||
"Discusses which metric aligns with value delivered",
|
||||
"Recommends good-better-best tier structure",
|
||||
"Addresses pricing psychology",
|
||||
"Provides specific pricing recommendation with rationale"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We want to raise our prices by 30%. We've been at $29/month for 2 years and we've added a lot of features. How do we do this without losing customers?",
|
||||
"expected_output": "Should apply the 'when to raise prices' and price increase strategies sections. Should recommend a strategy: grandfather existing customers (or give them a grace period), tie the increase to new value, communicate the change clearly with advance notice, consider an annual billing discount as a softening measure. Should address different approaches (immediate for new customers, delayed for existing). Should recommend specific communication strategy. Should note that some churn is expected and acceptable.",
|
||||
"assertions": [
|
||||
"Applies price increase strategies",
|
||||
"Recommends grandfathering or grace period approach",
|
||||
"Recommends tying increase to new value",
|
||||
"Provides communication strategy",
|
||||
"Addresses new vs existing customer timing",
|
||||
"Suggests annual billing as softening measure",
|
||||
"Notes some churn is expected"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "how do we figure out what people will actually pay? we're launching a new product and have no idea what to charge.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the pricing research methods: Van Westendorp price sensitivity analysis (too cheap, bargain, expensive, too expensive), MaxDiff for feature importance, competitive benchmarking. Should explain how to run each method. Should also recommend simpler approaches: talking to potential customers, analyzing competitor pricing, testing different price points. Should provide a practical pricing research plan they can execute.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies Van Westendorp price sensitivity method",
|
||||
"Applies MaxDiff for feature importance",
|
||||
"Recommends competitive benchmarking",
|
||||
"Explains how to run each method",
|
||||
"Suggests practical alternatives (customer interviews, competitive analysis)",
|
||||
"Provides executable pricing research plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We have a Basic ($19), Pro ($49), and Enterprise (custom) plan. The Pro plan gets 70% of signups. Should we add a plan between Pro and Enterprise?",
|
||||
"expected_output": "Should apply the good-better-best tier structure framework. Should analyze the current situation: Pro capturing 70% is actually healthy, but the gap to Enterprise suggests there may be mid-market customers underserved. Should evaluate whether a 4th tier makes sense: does it address a real gap, or will it create choice paralysis? Should apply pricing psychology (Hick's Law — more options can reduce decisions). Should recommend either a 4th tier with clear differentiation or adjusting the Pro plan to better bridge the gap.",
|
||||
"assertions": [
|
||||
"Applies good-better-best tier structure",
|
||||
"Analyzes current tier performance",
|
||||
"Evaluates whether 4th tier addresses real gap",
|
||||
"Considers choice paralysis risk",
|
||||
"Applies pricing psychology (Hick's Law)",
|
||||
"Provides specific recommendation with rationale"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "What pricing psychology tactics should we use on our pricing page? We want the $79 plan to be the most popular.",
|
||||
"expected_output": "Should apply the pricing psychology section: anchoring (show the $79 plan next to a higher-priced plan), decoy effect (make the lower plan look less valuable), visual emphasis (highlight or 'recommend' the $79 plan), charm pricing ($79 vs $80), Rule of 100 (percentage discounts below $100, dollar discounts above), loss framing (show what lower plans miss). Should provide specific pricing page design recommendations. Should cross-reference page-cro for broader pricing page optimization.",
|
||||
"assertions": [
|
||||
"Applies pricing psychology tactics",
|
||||
"Applies anchoring effect",
|
||||
"Applies decoy effect or visual emphasis",
|
||||
"Applies charm pricing or Rule of 100",
|
||||
"Provides specific pricing page recommendations",
|
||||
"Cross-references page-cro or marketing-psychology"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Our pricing page conversion rate is only 1.5%. Can you review the page and suggest improvements?",
|
||||
"expected_output": "Should recognize this is a pricing page conversion optimization task, not a pricing strategy task. Should defer to or cross-reference the page-cro skill, which handles pricing page conversion rate optimization including plan comparison clarity, CTA optimization, and trust signals. Pricing-strategy focuses on the actual pricing decisions (what to charge, how to package), not the page design.",
|
||||
"assertions": [
|
||||
"Recognizes this as pricing page CRO, not pricing strategy",
|
||||
"References or defers to page-cro skill",
|
||||
"Explains that pricing-strategy is about pricing decisions",
|
||||
"Does not attempt full page CRO audit"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: product-marketing-context
|
||||
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 `.agents/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
|
||||
---
|
||||
@@ -47,7 +47,7 @@ For each section:
|
||||
3. Confirm accuracy
|
||||
4. Move to the next
|
||||
|
||||
**Important:** Push for verbatim customer language. Exact phrases are more valuable than polished descriptions.
|
||||
Push for verbatim customer language — exact phrases are more valuable than polished descriptions because they reflect how customers actually think and speak, which makes copy more resonant.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"skill_name": "product-marketing-context",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "I want to set up my product marketing context. We're a B2B SaaS company that sells a customer feedback platform to product teams.",
|
||||
"expected_output": "Should check if .agents/product-marketing-context.md already exists. If not, should offer two options: (1) Auto-draft from codebase (recommended) or (2) Start from scratch. If user chooses start from scratch, should walk through sections conversationally one at a time. Should cover all applicable sections: Product Overview, Target Audience, Personas, Problems You Solve, Competitive Landscape, Differentiation, Objections, Switching Dynamics, Customer Language, Brand Voice, Proof Points, and Goals. Should create the file at .agents/product-marketing-context.md when complete.",
|
||||
"assertions": [
|
||||
"Checks for existing product-marketing-context.md",
|
||||
"Offers two options: auto-draft or start from scratch",
|
||||
"Covers applicable sections",
|
||||
"Walks through sections conversationally one at a time",
|
||||
"Creates file at .agents/product-marketing-context.md"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Update our product marketing context. We just added a new enterprise tier and our target audience has expanded to include VP of Engineering, not just Product Managers.",
|
||||
"expected_output": "Should check for existing .agents/product-marketing-context.md and read it. Should identify which sections need updating based on the changes: Target Audience (add VP of Engineering), Personas (add new persona), Product Overview (new enterprise tier, including pricing updates within that section), Objections (enterprise-specific), and Competitive Landscape (enterprise competitors). Should update only the relevant sections, preserving existing content that hasn't changed.",
|
||||
"assertions": [
|
||||
"Reads existing product-marketing-context.md",
|
||||
"Identifies sections that need updating",
|
||||
"Updates Target Audience with VP of Engineering",
|
||||
"Adds new persona for the expanded audience",
|
||||
"Updates Product Overview for enterprise tier",
|
||||
"Preserves unchanged sections"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "create a product context doc for my app. it's a mobile app that helps people find hiking trails. we're just getting started.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should check for existing context doc. Should offer auto-draft or start-from-scratch options. Should adapt questions for an early-stage B2C mobile app (outdoor/fitness niche). Should note that some sections may be sparse for an early-stage product and that's okay — they can be filled in as the business matures. Should skip non-applicable sections (e.g., Personas section is B2B-focused) rather than forcing all 12. Should accept lighter answers for sections like Proof Points or Competitive Landscape if the company is new.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Checks for existing context doc",
|
||||
"Offers auto-draft or start-from-scratch options",
|
||||
"Adapts questions for early-stage B2C mobile app",
|
||||
"Notes some sections may be sparse early on",
|
||||
"Skips non-applicable sections rather than forcing all 12",
|
||||
"Creates file at .agents/product-marketing-context.md"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Can you auto-draft our product marketing context from our existing codebase and marketing materials?",
|
||||
"expected_output": "Should activate the auto-draft workflow mode. Should scan the codebase for existing marketing context: README, landing page copy, pricing page, about page, meta descriptions, any existing documentation. Should draft the product-marketing-context.md from what it finds, filling in sections where information is available and flagging sections that need manual input. Should present the draft for review before saving.",
|
||||
"assertions": [
|
||||
"Activates auto-draft workflow mode",
|
||||
"Scans codebase for existing marketing materials",
|
||||
"Drafts context from found information",
|
||||
"Flags sections needing manual input",
|
||||
"Presents draft for review before saving"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Do we have a product marketing context set up? I want to make sure the other marketing skills have context about our product.",
|
||||
"expected_output": "Should check for .agents/product-marketing-context.md (and the older .claude/product-marketing-context.md location). Should report whether it exists and summarize its contents if found. If it doesn't exist, should offer to create one and explain why it's valuable (other skills like copywriting, page-cro, seo-audit check for it first). Should explain how other skills use this context document.",
|
||||
"assertions": [
|
||||
"Checks both file locations",
|
||||
"Reports whether context doc exists",
|
||||
"Summarizes contents if found",
|
||||
"Offers to create if missing",
|
||||
"Explains how other skills use it"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Write homepage copy for our SaaS product.",
|
||||
"expected_output": "Should recognize this is a copywriting task, not a product marketing context task. Should check for product-marketing-context.md (as other skills do), and if it doesn't exist, may suggest creating one first. But should defer to the copywriting skill for actually writing the homepage copy.",
|
||||
"assertions": [
|
||||
"Recognizes this as a copywriting task",
|
||||
"May check for or suggest creating product-marketing-context.md",
|
||||
"References or defers to copywriting skill for the actual copy",
|
||||
"Does not attempt to write homepage copy using context creation patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: programmatic-seo
|
||||
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
|
||||
---
|
||||
@@ -49,7 +49,7 @@ Hierarchy of data defensibility:
|
||||
5. Public (anyone can use—weakest)
|
||||
|
||||
### 3. Clean URL Structure
|
||||
**Always use subfolders, not subdomains**:
|
||||
**Use subfolders, not subdomains** — subfolders consolidate domain authority while subdomains split it:
|
||||
- Good: `yoursite.com/templates/resume/`
|
||||
- Bad: `templates.yoursite.com/resume/`
|
||||
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"skill_name": "programmatic-seo",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "We want to create programmatic SEO pages for our CRM. We're thinking of 'CRM for [industry]' pages — like 'CRM for Real Estate,' 'CRM for Healthcare,' etc. How should we approach this?",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify this as the Personas playbook (industry-specific pages). Should apply the core principles: unique value per page (not just swapping the industry name), proprietary data or insights per industry, clean URL structure. Should recommend the implementation framework: keyword research for each industry variation, data requirements (what industry-specific content makes each page unique), template design, internal linking strategy between industry pages and main pages, and indexation strategy. Should warn against thin content (just template + keyword swap).",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Identifies as Personas playbook",
|
||||
"Applies core principles (unique value, proprietary data, clean URLs)",
|
||||
"Recommends keyword research per variation",
|
||||
"Addresses data requirements for unique content",
|
||||
"Provides template design guidance",
|
||||
"Includes internal linking strategy",
|
||||
"Warns against thin content"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Create a comparison page strategy. We want pages like 'Notion vs Asana', 'Notion vs Monday', etc. for all our competitors. We have 15 competitors.",
|
||||
"expected_output": "Should identify this as the Comparisons playbook. Should apply the programmatic approach for competitor comparison pages at scale. Should recommend: template structure for comparison pages, unique data per comparison (not just the same template with names swapped), keyword research for each '[competitor A] vs [competitor B]' variation, URL structure (/compare/notion-vs-asana), internal linking between comparison pages, and quality checks. Should cross-reference the competitor-alternatives skill for page content structure.",
|
||||
"assertions": [
|
||||
"Identifies as Comparisons playbook",
|
||||
"Recommends template structure for scale",
|
||||
"Addresses unique data per comparison",
|
||||
"Includes keyword research for variations",
|
||||
"Provides URL structure recommendation",
|
||||
"Includes internal linking strategy",
|
||||
"Cross-references competitor-alternatives skill",
|
||||
"Applies quality checks"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "we want to rank for '[tool name] integration' keywords. we integrate with 50+ tools and want a page for each. like 'Slack integration', 'Salesforce integration' etc.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should identify this as the Integrations playbook. Should recommend: template design for integration pages (what it does, how to set up, use cases), unique content per integration (specific workflows, screenshots, setup steps), keyword research for '[tool] + [your product] integration', URL structure (/integrations/slack), hub page linking to all integration pages, and schema markup considerations. Should emphasize that each page needs genuine unique value, not just 'we integrate with [tool].'",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Identifies as Integrations playbook",
|
||||
"Recommends template with unique content per integration",
|
||||
"Includes setup steps and use cases per page",
|
||||
"Provides URL structure recommendation",
|
||||
"Recommends hub page for all integrations",
|
||||
"Emphasizes genuine unique value per page"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We built 500 programmatic pages but Google isn't indexing most of them. Only 80 are in the index. What's going wrong?",
|
||||
"expected_output": "Should diagnose the indexation problem. Should apply the quality checks and indexation strategy guidance. Should investigate: thin content (are pages providing unique value or just template + keyword?), crawl budget (500 pages may be fine but depends on site authority), internal linking (are the pages discoverable?), XML sitemap inclusion, duplicate/near-duplicate content issues. Should recommend specific fixes: improve content uniqueness, strengthen internal linking, submit sitemap, check robots.txt, use Search Console for indexation requests. Should warn that Google may choose not to index thin pages regardless.",
|
||||
"assertions": [
|
||||
"Diagnoses indexation problem",
|
||||
"Investigates thin content as likely cause",
|
||||
"Checks crawl budget considerations",
|
||||
"Checks internal linking to programmatic pages",
|
||||
"Checks XML sitemap and robots.txt",
|
||||
"Recommends specific fixes for indexation",
|
||||
"Warns about Google's thin content policies"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Help me create a glossary section for our marketing automation platform. We want to define 200+ marketing terms and rank for '[term] definition' keywords.",
|
||||
"expected_output": "Should identify this as the Glossary playbook. Should apply the template design: term definition page template (definition, examples, related terms, how it applies to the user's product), hub/index page linking to all terms, URL structure (/glossary/[term]), alphabetical and categorical navigation. Should address quality: each definition should provide genuine value beyond a dictionary definition. Should include internal linking strategy and schema markup (DefinedTerm schema). Should recommend starting with highest-volume terms.",
|
||||
"assertions": [
|
||||
"Identifies as Glossary playbook",
|
||||
"Provides template design for term pages",
|
||||
"Recommends hub/index page",
|
||||
"Provides URL structure",
|
||||
"Addresses content quality beyond dictionary definitions",
|
||||
"Includes internal linking strategy",
|
||||
"Recommends starting with highest-volume terms"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you audit our existing programmatic SEO pages for technical issues? We have crawl errors and some pages return 404s.",
|
||||
"expected_output": "Should recognize this is a technical SEO audit task, not a programmatic SEO strategy task. Should defer to or cross-reference the seo-audit skill, which handles crawlability, indexation, and technical SEO issues. Programmatic-seo focuses on strategy, template design, and content planning for scaled pages.",
|
||||
"assertions": [
|
||||
"Recognizes this as technical SEO audit task",
|
||||
"References or defers to seo-audit skill",
|
||||
"Explains that programmatic-seo is for strategy and template design",
|
||||
"Does not attempt full technical SEO audit"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: referral-program
|
||||
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
|
||||
---
|
||||
@@ -244,6 +244,8 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key tools
|
||||
| **Mention Me** | Enterprise referral programs | [mention-me.md](../../tools/integrations/mention-me.md) |
|
||||
| **Dub.co** | Link tracking and attribution | [dub-co.md](../../tools/integrations/dub-co.md) |
|
||||
| **Stripe** | Payment processing (for commission tracking) | [stripe.md](../../tools/integrations/stripe.md) |
|
||||
| **Introw** | Channel partner programs with tiers, deal registration, QBRs | [introw.md](../../tools/integrations/introw.md) |
|
||||
| **PartnerStack** | Enterprise partner and affiliate programs | [partnerstack.md](../../tools/integrations/partnerstack.md) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"skill_name": "referral-program",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me design a referral program for our SaaS product. We're a $49/month project management tool with about 1,000 customers. We want to encourage word-of-mouth growth.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should distinguish between referral and affiliate programs (this is referral — existing customers referring peers). Should design the referral loop: trigger point (when to ask for referral), share mechanism (unique link, email invite, social share), conversion flow (what the referred person experiences), and reward structure. Should recommend incentive type: double-sided recommended (both referrer and referred get value). Should suggest specific incentives appropriate for $49/month SaaS (e.g., free month for both). Should include the launch checklist. Should recommend tool integrations (Rewardful, Tolt, etc.).",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Distinguishes referral from affiliate",
|
||||
"Designs the referral loop (trigger, share, convert, reward)",
|
||||
"Recommends double-sided incentive structure",
|
||||
"Suggests specific incentives for the price point",
|
||||
"Includes launch checklist",
|
||||
"Recommends tool integrations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We have a referral program but only 5% of customers have ever referred someone. How do we increase participation?",
|
||||
"expected_output": "Should apply the program optimization guidance. Should diagnose low participation: are customers aware of the program? Is the trigger point well-timed? Is the incentive compelling enough? Is sharing easy? Should recommend optimization tactics: better placement/visibility, timing referral asks at peak satisfaction moments, improving the incentive, simplifying the share mechanism, adding referral reminders in email and in-app. Should provide specific experiment ideas to test improvements.",
|
||||
"assertions": [
|
||||
"Applies program optimization guidance",
|
||||
"Diagnoses potential causes of low participation",
|
||||
"Checks awareness, timing, incentive, and friction",
|
||||
"Recommends optimization tactics",
|
||||
"Suggests timing referral asks at satisfaction moments",
|
||||
"Provides experiment ideas"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "should we do referral or affiliate? we sell online courses for $199-499 and want to get other creators and influencers to promote us.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the referral vs affiliate distinction clearly. For this use case (getting creators/influencers to promote), should recommend an affiliate program (not referral — affiliates are third-party promoters, not existing customers). Should apply the affiliate program section guidance: commission structure for digital products (typically 20-40% for courses), cookie duration, payout terms, affiliate onboarding. Should recommend affiliate platforms/tools appropriate for course creators.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Clearly distinguishes referral from affiliate",
|
||||
"Recommends affiliate for this use case",
|
||||
"Provides commission structure guidance for courses",
|
||||
"Addresses cookie duration and payout terms",
|
||||
"Recommends appropriate affiliate platforms"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "What incentive structure works best? We've been offering $10 off for referrers but it's not working. Our product is $29/month.",
|
||||
"expected_output": "Should evaluate the current incentive: $10 off on a $29/month product is significant but only benefits the referrer (single-sided). Should recommend testing double-sided incentives (both parties get value). Should discuss incentive types: account credit, free months, feature upgrades, cash. Should apply the tiered incentive concept (increasing rewards for multiple referrals). Should provide specific alternative incentive structures to test. Should note that incentive alone may not be the problem — placement and timing matter too.",
|
||||
"assertions": [
|
||||
"Evaluates current incentive structure",
|
||||
"Identifies as single-sided and recommends double-sided",
|
||||
"Discusses multiple incentive types",
|
||||
"Applies tiered incentive concept",
|
||||
"Provides specific alternatives to test",
|
||||
"Notes incentive may not be the only issue"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "How do we measure the success of our referral program? What metrics should we track?",
|
||||
"expected_output": "Should apply the measuring success framework. Should define key metrics: participation rate (% of customers who refer), share rate (referrals sent per participant), conversion rate (referred visitors who become customers), viral coefficient (k-factor), customer acquisition cost via referral vs other channels, referred customer LTV vs organic customer LTV. Should recommend tracking tools and dashboards. Should provide benchmark ranges for each metric.",
|
||||
"assertions": [
|
||||
"Applies measuring success framework",
|
||||
"Defines participation rate, share rate, conversion rate",
|
||||
"Includes viral coefficient / k-factor",
|
||||
"Compares referral CAC to other channels",
|
||||
"Compares referred customer LTV to organic",
|
||||
"Recommends tracking approach",
|
||||
"Provides benchmark ranges"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you write the referral invitation emails? I need the email that goes out when someone shares their referral link.",
|
||||
"expected_output": "Should recognize this overlaps with email writing. Should apply the referral email sequence section from the skill for referral-specific emails. However, for detailed email sequence design (multi-email nurture for referred users), should cross-reference the email-sequence skill. Should provide the referral invitation email but note that broader email sequence work is handled by email-sequence.",
|
||||
"assertions": [
|
||||
"Applies referral email section from the skill",
|
||||
"Provides referral invitation email guidance",
|
||||
"Cross-references email-sequence for broader email work",
|
||||
"Provides specific referral email copy or template"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -118,6 +118,9 @@ Provide affiliates with:
|
||||
- Tapfiliate — Simple SaaS affiliate tracking
|
||||
- FirstPromoter — SaaS affiliate management
|
||||
|
||||
**Partner Relationship Management (PRM):**
|
||||
- Introw — Full PRM with deal registration, commissions, tiers, QBRs, and partner engagement tracking ([integration guide](../../../tools/integrations/introw.md))
|
||||
|
||||
**Self-hosted:**
|
||||
- Rewardful — Stripe-integrated affiliates
|
||||
- Refersion — E-commerce affiliates
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
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,' or 'data hygiene.' For cold outreach emails, see cold-email. For email drip campaigns, see email-sequence. For pricing decisions, see pricing-strategy."
|
||||
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
|
||||
---
|
||||
@@ -133,7 +133,7 @@ Define response times and document them:
|
||||
### 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
|
||||
- Include a **fallback owner** — unassigned leads go cold fast and waste pipeline
|
||||
- Round-robin should account for **rep capacity and availability** (PTO, quota attainment)
|
||||
- Log every routing decision for audit and optimization
|
||||
|
||||
@@ -330,6 +330,8 @@ For implementation, see the [tools registry](../../tools/REGISTRY.md). Key RevOp
|
||||
| **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) |
|
||||
| **Introw** | Partner-sourced pipeline, commissions, deal registration, QBRs | [introw.md](../../tools/integrations/introw.md) |
|
||||
| **Crossbeam** | Partner account overlaps and co-sell identification | [crossbeam.md](../../tools/integrations/crossbeam.md) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"skill_name": "revops",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me set up our lead lifecycle stages. We're a B2B SaaS company selling to mid-market. We use HubSpot as our CRM and have marketing and sales teams that aren't aligned on lead definitions.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the lead lifecycle framework: Subscriber → Lead → MQL → SQL → Opportunity → Customer → Evangelist. Should define clear criteria for each stage transition (what makes a Lead become an MQL, etc.). Should address the alignment issue between marketing and sales — define shared definitions and SLAs. Should recommend CRM implementation steps for HubSpot. Should include lead scoring setup. Should provide a handoff process between marketing and sales.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies lead lifecycle framework with all stages",
|
||||
"Defines criteria for each stage transition",
|
||||
"Addresses marketing-sales alignment",
|
||||
"Provides CRM implementation guidance for HubSpot",
|
||||
"Includes lead scoring setup",
|
||||
"Provides handoff process between teams"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Set up lead scoring for us. We want to prioritize which leads sales should call first. We sell enterprise software ($50k+ ACV).",
|
||||
"expected_output": "Should apply the lead scoring framework with three dimensions: explicit scoring (firmographics — company size, industry, title match), implicit scoring (behavioral — page visits, content downloads, email engagement), and negative scoring (unsubscribes, competitor emails, student emails). Should provide specific scoring criteria appropriate for enterprise ($50k+ ACV): weight firmographic signals heavily, include budget and authority signals. Should define score thresholds for MQL and SQL. Should recommend lead routing based on scores.",
|
||||
"assertions": [
|
||||
"Applies lead scoring with explicit, implicit, and negative dimensions",
|
||||
"Provides specific scoring criteria for enterprise",
|
||||
"Weights firmographic signals appropriately",
|
||||
"Includes behavioral scoring signals",
|
||||
"Includes negative scoring signals",
|
||||
"Defines MQL and SQL score thresholds",
|
||||
"Recommends lead routing based on scores"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "our pipeline is a mess. deals sit in stages forever and we don't know what's actually going to close. how do we fix this?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the pipeline stage management guidance. Should recommend: define clear pipeline stages with entry/exit criteria, set maximum time in each stage, implement stage velocity tracking, add required fields per stage to force data entry. Should address deal hygiene: regular pipeline reviews, stale deal flagging, win/loss analysis. Should recommend CRM automation to enforce stage rules. Should provide a practical cleanup plan for the current mess.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies pipeline stage management",
|
||||
"Defines stages with entry/exit criteria",
|
||||
"Recommends maximum time per stage",
|
||||
"Addresses deal hygiene and pipeline reviews",
|
||||
"Recommends CRM automation for enforcement",
|
||||
"Provides practical cleanup plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "What RevOps metrics should we be tracking? We want to build a dashboard for our leadership team.",
|
||||
"expected_output": "Should apply the RevOps metrics dashboard framework. Should recommend metrics across the funnel: lead volume by source, MQL-to-SQL conversion rate, SQL-to-Opportunity rate, win rate, average deal size, sales cycle length, pipeline velocity, pipeline coverage ratio, CAC, LTV, LTV:CAC ratio. Should organize metrics by audience (marketing team, sales team, leadership). Should recommend dashboard structure and cadence for reviews.",
|
||||
"assertions": [
|
||||
"Applies RevOps metrics dashboard",
|
||||
"Covers full-funnel metrics",
|
||||
"Includes conversion rates between stages",
|
||||
"Includes pipeline velocity and coverage",
|
||||
"Includes CAC, LTV, LTV:CAC",
|
||||
"Organizes by audience",
|
||||
"Recommends dashboard structure and review cadence"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Our CRM data is a disaster. Duplicate records, missing fields, inconsistent naming. How do we clean it up and keep it clean?",
|
||||
"expected_output": "Should apply the data hygiene guidance. Should recommend: duplicate detection and merging strategy, required field enforcement, standardized naming conventions (picklists over free text), data validation rules, regular audit cadence. Should address both cleanup (one-time fix) and prevention (ongoing processes). Should recommend CRM automation for data hygiene. Should provide a prioritized cleanup plan (start with highest-impact data quality issues).",
|
||||
"assertions": [
|
||||
"Applies data hygiene guidance",
|
||||
"Recommends duplicate detection and merging",
|
||||
"Recommends required field enforcement",
|
||||
"Addresses standardized naming conventions",
|
||||
"Covers both cleanup and prevention",
|
||||
"Recommends CRM automation for hygiene",
|
||||
"Provides prioritized cleanup plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Can you help me write cold outreach emails to prospects in our pipeline?",
|
||||
"expected_output": "Should recognize this is a cold email / outbound writing task, not RevOps. Should defer to or cross-reference the cold-email skill for writing outbound prospecting emails. RevOps covers the systems, processes, and data infrastructure — not the actual email content.",
|
||||
"assertions": [
|
||||
"Recognizes this as cold email writing, not RevOps",
|
||||
"References or defers to cold-email skill",
|
||||
"Explains RevOps covers systems and processes, not email content"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
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,' 'ROI calculator,' 'demo script,' 'talk track,' 'sales playbook,' 'proposal template,' or 'buyer persona card.' For competitor battle cards and comparison pages, see competitor-alternatives. For marketing website copy, see copywriting. For cold outreach emails, see cold-email."
|
||||
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
|
||||
---
|
||||
@@ -205,7 +205,7 @@ For each objection, document:
|
||||
|
||||
### Key Principles
|
||||
|
||||
- **Never demo without discovery.** If you don't know their pain, you're guessing which features matter.
|
||||
- **Demo after discovery, not before.** 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.
|
||||
|
||||
@@ -339,6 +339,16 @@ If context is missing, ask:
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For partner sales enablement, see the [tools registry](../../tools/REGISTRY.md):
|
||||
|
||||
| Tool | What It Does | Guide |
|
||||
|------|-------------|-------|
|
||||
| **Introw** | Partner engagement tracking, deal registration, mutual action plans | [introw.md](../../tools/integrations/introw.md) |
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **competitor-alternatives**: For public-facing comparison and alternative pages
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
"skill_name": "sales-enablement",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me create a sales deck for our B2B SaaS product. We sell an employee engagement platform to HR directors at companies with 500-5000 employees. Our main differentiator is real-time pulse surveys with AI-powered insights.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the 10-12 slide sales deck framework: Title, Problem/Stakes, Current Solutions Failing, Vision, Product/Solution, How It Works, Proof (case studies/metrics), Pricing, Why Now, and Next Steps. Should tailor the deck to the HR director audience and employee engagement space. Should incorporate the differentiator (real-time pulse surveys + AI insights). Should provide slide-by-slide content recommendations with speaker notes. Should recommend visual direction.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies 10-12 slide framework",
|
||||
"Includes Problem, Solution, Proof, Pricing, Next Steps slides",
|
||||
"Tailors to HR director audience",
|
||||
"Incorporates stated differentiator",
|
||||
"Provides slide-by-slide content",
|
||||
"Includes speaker notes or talking points"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Our sales team keeps getting the same objections. The top ones are: 'we already use SurveyMonkey,' 'we don't have budget right now,' and 'our team is too small to need this.' Help me create an objection handling doc.",
|
||||
"expected_output": "Should apply the objection handling framework with the response structure for each objection. Should categorize the objections (competitor/status quo, budget, need/timing). For each objection, should provide: acknowledge, reframe, evidence/proof, bridge to value, and follow-up question. Should provide 2-3 response variations per objection for different contexts. Should organize as a document sales reps can reference quickly during calls.",
|
||||
"assertions": [
|
||||
"Applies objection handling framework",
|
||||
"Categorizes the three objections",
|
||||
"Provides structured response for each (acknowledge, reframe, evidence, bridge)",
|
||||
"Provides 2-3 response variations per objection",
|
||||
"Organizes for quick reference during calls",
|
||||
"Categorizes objections using the skill's framework (competitor, budget, need/timing)"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "i need a one-pager we can leave behind after sales meetings. something that summarizes our product and key benefits.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the one-pager/leave-behind framework. Should include: headline with core value proposition, key benefits (3-5), social proof (customer logos, key metric), how it works (simplified), pricing summary or 'starting at' range, and clear next step CTA. Should recommend design principles for a one-pager: scannable, visual hierarchy, not text-heavy. Should note this should fit on one page (front, or front and back).",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies one-pager/leave-behind framework",
|
||||
"Includes headline, benefits, social proof, how it works, CTA",
|
||||
"Keeps to one page format",
|
||||
"Recommends scannable design",
|
||||
"Provides specific content for each section"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Create a demo script for our analytics dashboard product. Typical demo is 30 minutes with a VP of Marketing.",
|
||||
"expected_output": "Should apply the demo script/talk track framework with the 5-part structure. Should include: opening (rapport, agenda setting, discovery questions), problem validation (confirm their pain), solution walkthrough (show product addressing their pain), proof points (metrics, case studies during demo), and close (next steps, timeline). Should time-box each section for 30 minutes. Should include key questions to ask during discovery. Should note when to customize based on prospect's answers.",
|
||||
"assertions": [
|
||||
"Applies 5-part demo script structure",
|
||||
"Includes opening with discovery questions",
|
||||
"Includes problem validation",
|
||||
"Includes solution walkthrough",
|
||||
"Includes proof points",
|
||||
"Includes close with next steps",
|
||||
"Time-boxes for 30 minutes",
|
||||
"Notes customization based on prospect responses"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Help me build an ROI calculator we can use during sales calls. We need to show prospects how much money they'll save by switching to our product.",
|
||||
"expected_output": "Should apply the ROI calculator framework. Should define inputs (what data to collect from the prospect: team size, current costs, time spent on manual processes), calculation methodology (how to compute savings), and output format (visual showing ROI timeline, payback period, annual savings). Should recommend keeping calculations transparent and conservative. Should suggest validating assumptions during the sales call. Should provide the calculator structure and formula logic.",
|
||||
"assertions": [
|
||||
"Applies ROI calculator framework",
|
||||
"Defines required inputs",
|
||||
"Provides calculation methodology",
|
||||
"Recommends conservative assumptions",
|
||||
"Includes ROI timeline and payback period",
|
||||
"Suggests validating assumptions during calls",
|
||||
"Provides calculator structure"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "We need a public comparison page showing how we stack up against Zendesk and Intercom.",
|
||||
"expected_output": "Should recognize this is a public-facing competitor comparison page, not internal sales collateral. Should defer to or cross-reference the competitor-alternatives skill, which handles public comparison and alternatives pages. Sales-enablement covers internal materials (battle cards, objection handling) while competitor-alternatives handles SEO-focused public comparison content.",
|
||||
"assertions": [
|
||||
"Recognizes this as a public comparison page",
|
||||
"References or defers to competitor-alternatives skill",
|
||||
"Explains the distinction between internal and public collateral",
|
||||
"Does not attempt public SEO comparison page using sales enablement patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: schema-markup
|
||||
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
|
||||
---
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"skill_name": "schema-markup",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Add schema markup to our SaaS product's homepage. We're a project management tool called TaskFlow. We need Organization schema and any other relevant types.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should implement Organization schema in JSON-LD format with all required and recommended properties (name, url, logo, description, sameAs for social profiles). Should recommend additional schema types for a SaaS homepage: WebSite (with SearchAction if applicable), SoftwareApplication or Product. Should use @graph for multiple schema types on one page. Should provide the complete JSON-LD code ready to implement. Should recommend validation with Google's Rich Results Test and Schema.org validator.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Implements Organization schema in JSON-LD",
|
||||
"Includes required and recommended properties",
|
||||
"Recommends additional relevant schema types",
|
||||
"Uses @graph for multiple types",
|
||||
"Provides complete JSON-LD code",
|
||||
"Recommends validation tools"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "We have a FAQ page with 20 questions about our product. How do I add FAQ schema to get the rich results in Google?",
|
||||
"expected_output": "Should implement FAQPage schema in JSON-LD format. Should show the correct structure: FAQPage as mainEntity containing Question items, each with acceptedAnswer. Should provide a complete code example with 2-3 sample questions. Should explain that FAQ schema can enable rich results showing questions/answers directly in search. Should note Google's guidelines for FAQ schema (factual answers, not promotional). Should recommend validation approach.",
|
||||
"assertions": [
|
||||
"Implements FAQPage schema in JSON-LD",
|
||||
"Shows correct nested structure (FAQPage > Question > Answer)",
|
||||
"Provides complete code example",
|
||||
"Explains rich result benefits",
|
||||
"Notes Google's FAQ schema guidelines",
|
||||
"Recommends validation"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "add schema to our blog posts. we publish articles about marketing tips.",
|
||||
"expected_output": "Should trigger on casual phrasing. Should implement Article (or BlogPosting) schema in JSON-LD. Should include required properties: headline, author (as Person with name and url), datePublished, dateModified, image, publisher (as Organization). Should recommend BreadcrumbList schema alongside the article schema. Should provide template code that can be reused across blog posts. Should address how to populate dynamic fields (date, author, headline) from the CMS.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Implements Article or BlogPosting schema",
|
||||
"Includes author, datePublished, image, publisher",
|
||||
"Recommends BreadcrumbList alongside",
|
||||
"Provides reusable template code",
|
||||
"Addresses CMS integration for dynamic fields"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We're an e-commerce site selling physical products. What schema markup do we need for our product pages?",
|
||||
"expected_output": "Should implement Product schema with full properties: name, description, image, brand, sku, offers (with price, priceCurrency, availability, url). Should recommend AggregateRating if they have reviews, and Review schema for individual reviews. Should include BreadcrumbList for navigation. Should address common e-commerce schema types: Product, Offer, AggregateRating, Review. Should provide complete JSON-LD code. Should note that Product schema can enable rich results (price, availability, ratings in search).",
|
||||
"assertions": [
|
||||
"Implements Product schema with full properties",
|
||||
"Includes Offer with price, availability",
|
||||
"Recommends AggregateRating and Review schema",
|
||||
"Includes BreadcrumbList",
|
||||
"Provides complete JSON-LD code",
|
||||
"Notes rich result benefits for products"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "We added schema markup to our site but it's not showing rich results in Google. Can you help debug?",
|
||||
"expected_output": "Should provide a systematic debugging approach: first validate with Google Rich Results Test and Schema.org validator (syntax errors), then check for common issues (incorrect nesting, missing required properties, JSON-LD placement errors). Should explain that valid schema doesn't guarantee rich results — Google chooses when to show them. Should recommend checking Search Console for structured data reports and errors. Should address common debugging scenarios: schema not detected, warnings vs errors, eligible vs displayed.",
|
||||
"assertions": [
|
||||
"Recommends validation tools for debugging",
|
||||
"Checks for common schema errors",
|
||||
"Explains valid schema doesn't guarantee rich results",
|
||||
"Recommends Search Console structured data reports",
|
||||
"Addresses warnings vs errors distinction",
|
||||
"Provides systematic debugging approach"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Our organic search traffic dropped after a site redesign. Can you do a technical SEO audit?",
|
||||
"expected_output": "Should recognize this is a technical SEO audit request, not a schema markup task. Should defer to or cross-reference the seo-audit skill, which handles comprehensive technical SEO audits. Schema markup is one component of SEO but doesn't address the broader technical issues (redirects, crawlability, indexation) that likely caused the traffic drop.",
|
||||
"assertions": [
|
||||
"Recognizes this as a technical SEO audit request",
|
||||
"References or defers to seo-audit skill",
|
||||
"Does not attempt full SEO audit using schema markup patterns"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: seo-audit
|
||||
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
|
||||
---
|
||||
@@ -35,7 +35,7 @@ Before auditing, understand:
|
||||
|
||||
## Audit Framework
|
||||
|
||||
### ⚠️ Important: Schema Markup Detection Limitation
|
||||
### Schema Markup Detection Limitation
|
||||
|
||||
**`web_fetch` and `curl` cannot reliably detect structured data / schema markup.**
|
||||
|
||||
@@ -46,7 +46,7 @@ Many CMS plugins (AIOSEO, Yoast, RankMath) inject JSON-LD via client-side JavaSc
|
||||
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.
|
||||
Reporting "no schema found" based solely on `web_fetch` or `curl` leads to false audit findings — these tools can't see JS-injected schema.
|
||||
|
||||
### Priority Order
|
||||
1. **Crawlability & Indexation** (can Google find and index it?)
|
||||
@@ -164,7 +164,7 @@ Many CMS plugins (AIOSEO, Yoast, RankMath) inject JSON-LD via client-side JavaSc
|
||||
- Primary keyword near beginning
|
||||
- 50-60 characters (visible in SERP)
|
||||
- Compelling and click-worthy
|
||||
- Brand name placement (end, usually)
|
||||
- No brand name placement (SERPs include brand name above title already)
|
||||
|
||||
**Common issues:**
|
||||
- Duplicate titles
|
||||
@@ -382,7 +382,7 @@ Same format as above
|
||||
- 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.
|
||||
> **Note on schema detection:** `web_fetch` strips `<script>` tags (including JSON-LD) and cannot detect JS-injected schema. Use the browser tool, Rich Results Test, or Screaming Frog instead — they render JavaScript and capture dynamically-injected markup. See the Schema Markup Detection Limitation section above.
|
||||
|
||||
**Paid Tools** (if available)
|
||||
- Screaming Frog
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"skill_name": "seo-audit",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Can you do an SEO audit of our SaaS website? We're getting about 2,000 organic visits/month but feel like we should be getting more. URL: https://example.com",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should ask clarifying questions about priority keywords, Search Console access, recent changes, and competitors. Should follow the audit framework priority order: Crawlability & Indexation, Technical Foundations, On-Page Optimization, Content Quality, Authority & Links. Should check robots.txt, XML sitemap, site architecture. Should evaluate title tags, meta descriptions, heading structure, and content optimization. Should NOT report on schema markup based solely on web_fetch (must note the detection limitation). Output should follow the Audit Report Structure: Executive Summary, Technical SEO Findings, On-Page SEO Findings, Content Findings, and Prioritized Action Plan.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Asks clarifying questions about keywords, Search Console, recent changes",
|
||||
"Follows audit priority order: crawlability first, then technical, on-page, content, authority",
|
||||
"Checks robots.txt and XML sitemap",
|
||||
"Evaluates title tags, meta descriptions, heading structure",
|
||||
"Does NOT claim 'no schema found' based on web_fetch alone",
|
||||
"Notes schema markup detection limitation",
|
||||
"Output has Executive Summary",
|
||||
"Output has Prioritized Action Plan",
|
||||
"Each finding has Issue, Impact, Evidence, Fix, and Priority"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Why am I not ranking for 'project management software'? We have a page targeting that keyword but it's stuck on page 3.",
|
||||
"expected_output": "Should trigger on the casual 'why am I not ranking' phrasing. Should investigate both on-page and off-page factors. On-page: check title tag, H1, URL alignment with keyword; evaluate content depth vs competitors; check for keyword cannibalization. Technical: check indexation status, canonical tags, crawlability. Content quality: assess E-E-A-T signals, content depth, user engagement. Should provide specific, actionable fixes organized by priority. Should mention competitive analysis against current top-ranking pages.",
|
||||
"assertions": [
|
||||
"Triggers on casual 'why am I not ranking' phrasing",
|
||||
"Checks title tag, H1, URL alignment with target keyword",
|
||||
"Evaluates content depth vs competitors",
|
||||
"Checks for keyword cannibalization",
|
||||
"Checks indexation status and canonical tags",
|
||||
"Assesses E-E-A-T signals",
|
||||
"Mentions competitive analysis against top-ranking pages",
|
||||
"Provides actionable fixes organized by priority"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "We just migrated from WordPress to Next.js and our organic traffic dropped 40% in the last month. Help!",
|
||||
"expected_output": "Should treat this as an urgent migration diagnostic. Should immediately check: redirect mapping (301s from old URLs to new), canonical tags on new pages, robots.txt not blocking crawlers, XML sitemap submitted and updated, meta tags preserved. Should check for common migration issues: redirect chains/loops, soft 404s, lost internal links, changed URL structures without redirects. Should reference Search Console coverage report for indexation issues. Should provide a prioritized recovery plan with critical fixes first. Should mention monitoring timeline expectations (recovery can take weeks).",
|
||||
"assertions": [
|
||||
"Treats as urgent migration diagnostic",
|
||||
"Checks redirect mapping (301s)",
|
||||
"Checks canonical tags on new pages",
|
||||
"Checks robots.txt not blocking crawlers",
|
||||
"Checks XML sitemap updated and submitted",
|
||||
"Checks for redirect chains or loops",
|
||||
"Checks for soft 404s",
|
||||
"References Search Console coverage report",
|
||||
"Provides prioritized recovery plan",
|
||||
"Mentions recovery timeline expectations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "Review the technical SEO of our e-commerce site. We have about 50,000 products and use faceted navigation.",
|
||||
"expected_output": "Should focus on e-commerce-specific technical issues: faceted navigation creating duplicate content, crawl budget management for large product catalog, parameterized URLs, product schema markup (with the caveat about detection limitations). Should check for thin category pages, duplicate product descriptions, out-of-stock page handling. Should address crawl budget issues: pagination, infinite scroll handling, session IDs in URLs. Should provide structured findings with Impact ratings and specific fixes.",
|
||||
"assertions": [
|
||||
"Addresses faceted navigation duplicate content",
|
||||
"Addresses crawl budget for large catalog",
|
||||
"Checks for parameterized URL issues",
|
||||
"Mentions product schema with detection limitation caveat",
|
||||
"Checks for thin category pages",
|
||||
"Checks for duplicate product descriptions",
|
||||
"Addresses out-of-stock page handling",
|
||||
"Addresses pagination and infinite scroll",
|
||||
"Findings include Impact ratings and specific fixes"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Can you check our blog posts for on-page SEO issues? We publish 4 posts per week but traffic has been flat for 6 months.",
|
||||
"expected_output": "Should apply the Content/Blog Sites framework: check for outdated content not refreshed, keyword cannibalization, missing topical clustering, poor internal linking, missing author pages. Should audit on-page elements: title tags, meta descriptions, heading structure, keyword targeting per post. Should assess E-E-A-T signals for blog content. Should check for content depth issues and whether posts answer search intent. Should recommend a content audit process and provide a prioritized action plan for the existing content library.",
|
||||
"assertions": [
|
||||
"Applies Content/Blog Sites framework",
|
||||
"Checks for outdated content",
|
||||
"Checks for keyword cannibalization",
|
||||
"Checks for topical clustering",
|
||||
"Checks for internal linking quality",
|
||||
"Checks for author pages and E-E-A-T signals",
|
||||
"Audits title tags, meta descriptions, heading structure",
|
||||
"Assesses whether content answers search intent",
|
||||
"Recommends content audit process",
|
||||
"Provides prioritized action plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "I run a local plumbing business with 3 locations. My website barely shows up when people search for 'plumber near me' in our areas. What's wrong?",
|
||||
"expected_output": "Should apply the Local Business site-type framework. Should check for: inconsistent NAP (Name, Address, Phone) across the site, missing local schema markup (with detection limitation caveat), Google Business Profile optimization, missing individual location pages for each of the 3 locations, and missing local content. Should also check standard technical and on-page factors. Should recommend local-specific fixes: location-specific pages with unique content, local schema on each, GBP optimization, citation consistency.",
|
||||
"assertions": [
|
||||
"Applies Local Business framework",
|
||||
"Checks NAP consistency",
|
||||
"Checks for local schema markup with detection caveat",
|
||||
"Addresses Google Business Profile optimization",
|
||||
"Recommends individual location pages for each location",
|
||||
"Recommends local content strategy",
|
||||
"Checks standard technical SEO factors too",
|
||||
"Provides prioritized local SEO action plan"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"prompt": "Our site loads really slowly, especially on mobile. Pages take 5-6 seconds to load. Is this hurting our SEO?",
|
||||
"expected_output": "Should focus on Site Speed and Core Web Vitals. Should explain CWV thresholds: LCP < 2.5s, INP < 200ms, CLS < 0.1, and that 5-6s load time is well above acceptable. Should investigate speed factors: server response time (TTFB), image optimization, JavaScript execution, CSS delivery, caching headers, CDN usage, font loading. Should recommend specific tools: PageSpeed Insights, WebPageTest, Chrome DevTools, Search Console CWV report. Should explain that yes, page speed is a ranking factor and directly impacts SEO. Should provide prioritized fixes.",
|
||||
"assertions": [
|
||||
"Focuses on Core Web Vitals",
|
||||
"Explains CWV thresholds (LCP, INP, CLS)",
|
||||
"Identifies 5-6s as well above acceptable",
|
||||
"Investigates specific speed factors",
|
||||
"Recommends specific diagnostic tools",
|
||||
"Confirms page speed impacts SEO rankings",
|
||||
"Provides prioritized speed fixes",
|
||||
"Addresses mobile-specific performance"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"prompt": "I want to add FAQ schema to my product pages. Can you help me set that up?",
|
||||
"expected_output": "Should recognize this is a schema markup implementation task, not an SEO audit. Should defer to or cross-reference the schema-markup skill, which specifically handles structured data implementation including FAQ schema. May briefly mention that FAQ schema can enable rich results, but should make clear that schema-markup is the right skill for implementation.",
|
||||
"assertions": [
|
||||
"Recognizes this as schema markup implementation",
|
||||
"References or defers to schema-markup skill",
|
||||
"Does not attempt a full SEO audit",
|
||||
"May briefly mention FAQ schema benefits"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: signup-flow-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," 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
|
||||
---
|
||||
@@ -161,7 +161,7 @@ Every field reduces conversion. For each field, ask:
|
||||
|
||||
### Microcopy
|
||||
- Placeholder text: Use for examples, not labels
|
||||
- Labels: Always visible (not just placeholders)
|
||||
- Labels: Keep visible (not just placeholders) — placeholders disappear when typing, leaving users unsure what they're filling in
|
||||
- Help text: Only when needed, placed close to field
|
||||
|
||||
---
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"skill_name": "signup-flow-cro",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Audit our signup flow. We have a 3-step process: Step 1 asks for email, password, and full name. Step 2 asks for company name, company size, role, and industry. Step 3 asks for use case and how they heard about us. Current completion rate is 45%.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should identify the flow type (likely B2B SaaS trial). Should apply the core principles: minimize required fields (which of these are genuinely needed before they can use the product?). Should evaluate each step: Step 1 is reasonable, Step 2 fields are mostly deferrable to progressive profiling, Step 3 is entirely deferrable. Should recommend cutting to Step 1 only or at most 2 steps. Should provide audit findings in structured format (Issue, Impact, Fix, Priority). Should include Quick Wins, High-Impact Changes, and Test Hypotheses.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Identifies flow type",
|
||||
"Applies minimize required fields principle",
|
||||
"Evaluates each field for necessity",
|
||||
"Recommends deferring most Step 2 and all Step 3 fields",
|
||||
"Provides findings in structured format",
|
||||
"Includes Quick Wins, High-Impact Changes, Test Hypotheses"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Should we add Google and Microsoft SSO to our signup page? We're a B2B project management tool and currently only have email/password signup.",
|
||||
"expected_output": "Should apply the social auth options guidance. For B2B, should recommend Google and Microsoft as the primary SSO options (matching the B2B recommendation). Should explain benefits: higher conversion (less friction), pre-verified email, faster onboarding. Should recommend placing SSO prominently (often higher conversion than email). Should address implementation considerations: clear visual separation from email signup, button copy ('Sign up with Google' not just Google icon), consider which option to emphasize based on audience.",
|
||||
"assertions": [
|
||||
"Applies social auth options guidance",
|
||||
"Recommends Google and Microsoft for B2B",
|
||||
"Explains conversion benefits of SSO",
|
||||
"Recommends prominent placement",
|
||||
"Addresses visual separation from email signup",
|
||||
"Provides implementation recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "our signup form is just email and password but we still only get 35% of visitors to complete it. what else could be wrong?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should investigate beyond just form fields since the form is already minimal. Should apply trust and friction reduction guidance: is there a 'No credit card required' message? Privacy assurance? Testimonial near the form? Should check form-level issues: error handling, password requirements clarity, submit button copy. Should also look at pre-form factors: is the value proposition clear? Is the page optimized? (cross-reference page-cro). Should provide diagnostic checklist and recommendations.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Investigates beyond form fields",
|
||||
"Applies trust and friction reduction",
|
||||
"Checks for 'No credit card required' messaging",
|
||||
"Checks error handling and password UX",
|
||||
"Considers pre-form factors (value prop, page CRO)",
|
||||
"Provides diagnostic checklist"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We require email verification before users can access the product. Is that hurting our conversion? Should we change it?",
|
||||
"expected_output": "Should apply the verification flows guidance. Should explain that requiring verification before product access does create friction and likely reduces activation. Should recommend alternatives: delay verification until needed (let users explore first), magic link as alternative to password, let users start while verification is pending. Should discuss when email verification IS required (compliance, preventing abuse). Should provide specific recommendations for improving the verification experience if kept.",
|
||||
"assertions": [
|
||||
"Applies verification flows guidance",
|
||||
"Explains verification friction impact",
|
||||
"Recommends delaying verification",
|
||||
"Suggests letting users explore while pending",
|
||||
"Discusses when verification is required",
|
||||
"Provides improvements if verification is kept"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "What experiments should we run on our signup page? We want to improve our trial signup rate.",
|
||||
"expected_output": "Should apply the experiment ideas section. Should provide experiments across categories: form design experiments (layout, field count, SSO), copy and messaging experiments (headline, CTA text, trust elements), trial and commitment experiments (credit card required vs not, trial length), and post-submit experiments. Should prioritize experiments by likely impact. Should cross-reference ab-test-setup for proper experiment design.",
|
||||
"assertions": [
|
||||
"Applies experiment ideas section",
|
||||
"Covers form design experiments",
|
||||
"Covers copy and messaging experiments",
|
||||
"Covers trial and commitment experiments",
|
||||
"Prioritizes by likely impact",
|
||||
"Cross-references ab-test-setup skill"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Users sign up fine but then never activate. Only 20% complete onboarding. What do we do?",
|
||||
"expected_output": "Should recognize this is a post-signup onboarding problem, not a signup flow problem. Should defer to or cross-reference the onboarding-cro skill, which handles post-signup activation and onboarding optimization. Signup-flow-cro covers getting users through the signup form, not what happens after.",
|
||||
"assertions": [
|
||||
"Recognizes this as post-signup onboarding, not signup flow",
|
||||
"References or defers to onboarding-cro skill",
|
||||
"Explains signup-flow-cro covers the signup form, not post-signup"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
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," or "website planning." NOT for XML sitemaps (that's technical SEO — see seo-audit). For SEO audits, see seo-audit. For structured data, see schema-markup.
|
||||
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
|
||||
---
|
||||
@@ -186,7 +186,7 @@ Breadcrumbs should mirror the URL hierarchy. Every breadcrumb segment should be
|
||||
|
||||
- **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.
|
||||
- **Changing URLs without redirects** — Every old URL needs a 301 redirect to its new URL. Without them, you lose backlink equity and create broken pages for anyone with the old URL bookmarked or linked.
|
||||
- **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.
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"skill_name": "site-architecture",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me plan the site architecture for our new SaaS marketing website. We have a homepage, product page, pricing page, about page, blog, and want to add competitor comparison pages and integration pages.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should apply the page hierarchy design principles (3-click rule, flat vs deep). Should create an ASCII tree showing the full site structure. Should organize pages logically: main nav (Home, Product, Pricing, About, Blog), comparison pages section, integrations hub. Should recommend URL structure patterns for each section. Should provide navigation design recommendations (4-7 header items). Should include internal linking strategy (hub-and-spoke for comparisons and integrations). Should provide the full deliverable set: hierarchy, URL map, nav spec.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Applies 3-click rule and flat vs deep principles",
|
||||
"Creates ASCII tree for site structure",
|
||||
"Organizes pages logically",
|
||||
"Recommends URL structure for each section",
|
||||
"Provides navigation design (4-7 header items)",
|
||||
"Includes internal linking strategy",
|
||||
"Provides hierarchy, URL map, and nav spec"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Our website has grown organically and the navigation is a mess. We have 50+ pages and users can't find anything. Help us reorganize.",
|
||||
"expected_output": "Should treat this as a site architecture audit and redesign. Should recommend starting with a content inventory of all 50+ pages. Should apply the page hierarchy design to reorganize: group related pages, establish clear parent-child relationships, apply the 3-click rule. Should redesign the navigation (reduce header items, use mega-menu or dropdowns for deeper pages). Should provide before/after ASCII tree structure. Should address URL redirects for any pages that move. Should include a visual sitemap (Mermaid).",
|
||||
"assertions": [
|
||||
"Recommends content inventory first",
|
||||
"Groups related pages logically",
|
||||
"Applies 3-click rule",
|
||||
"Redesigns navigation structure",
|
||||
"Provides ASCII tree or visual sitemap",
|
||||
"Addresses URL redirects for moved pages",
|
||||
"Reduces header navigation items"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "what should our url structure look like? we keep debating between /blog/post-name vs /resources/blog/post-name and /product/feature vs /features/feature-name",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the URL structure patterns guidance. Should recommend clean, descriptive URLs: prefer shorter paths (/blog/post-name over /resources/blog/post-name), use consistent patterns, avoid unnecessary nesting. Should provide URL structure recommendations for each section type (blog, features, comparisons, integrations). Should address SEO implications of URL structure. Should provide a complete URL map as a reference.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies URL structure patterns",
|
||||
"Recommends shorter, cleaner paths",
|
||||
"Provides recommendations for each section type",
|
||||
"Addresses SEO implications",
|
||||
"Provides URL map reference"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "We're adding programmatic SEO pages — 200 integration pages and 50 comparison pages. How should these fit into our site architecture?",
|
||||
"expected_output": "Should address how to integrate scaled content into the site architecture. Should recommend hub pages for both sections (/integrations and /compare or /vs). Should apply the hub-and-spoke internal linking model. Should address navigation: these shouldn't clutter the main nav, but should be accessible via hub pages. Should provide URL structure for both sections. Should address crawl budget considerations for 250 new pages. Should cross-reference programmatic-seo for the content strategy.",
|
||||
"assertions": [
|
||||
"Recommends hub pages for each section",
|
||||
"Applies hub-and-spoke internal linking",
|
||||
"Keeps programmatic pages out of main nav",
|
||||
"Provides URL structure for both sections",
|
||||
"Addresses crawl budget for 250 pages",
|
||||
"Cross-references programmatic-seo skill"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Can you create a visual sitemap for our site? We want something we can share with our design team.",
|
||||
"expected_output": "Should provide a visual sitemap using Mermaid diagram format. Should organize the sitemap hierarchically showing page relationships. Should use the Mermaid graph syntax that can be rendered by most tools. Should include all major sections and key pages. Should be clear enough for a design team to use as a reference for navigation and wireframing.",
|
||||
"assertions": [
|
||||
"Provides visual sitemap in Mermaid format",
|
||||
"Shows hierarchical page relationships",
|
||||
"Includes all major sections",
|
||||
"Uses clear, readable format",
|
||||
"Suitable for sharing with design team"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Our XML sitemap hasn't been updated in 6 months and we have crawl errors in Search Console. Can you fix our technical SEO?",
|
||||
"expected_output": "Should recognize this is a technical SEO audit task, not a site architecture design task. Should defer to or cross-reference the seo-audit skill, which handles XML sitemaps, crawl errors, and technical SEO issues. Site-architecture focuses on page hierarchy, navigation, and URL structure design — not technical SEO troubleshooting.",
|
||||
"assertions": [
|
||||
"Recognizes this as technical SEO, not site architecture",
|
||||
"References or defers to seo-audit skill",
|
||||
"Explains site-architecture covers design, not technical SEO"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
name: social-content
|
||||
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
|
||||
version: 1.2.0
|
||||
---
|
||||
|
||||
# Social Content
|
||||
@@ -50,6 +50,8 @@ Gather this context (ask if not provided):
|
||||
|
||||
**For detailed platform strategies**: See [references/platforms.md](references/platforms.md)
|
||||
|
||||
**For hashtag limits and character counts**: See [references/platform-limits.md](references/platform-limits.md)
|
||||
|
||||
---
|
||||
|
||||
## Content Pillars Framework
|
||||
@@ -107,7 +109,7 @@ The first line determines whether anyone reads the rest.
|
||||
|
||||
## Content Repurposing System
|
||||
|
||||
Turn one piece of content into many:
|
||||
Turn one piece of content into many. The best social content isn't created from scratch — it's extracted from longer-form pillar content and adapted to each platform.
|
||||
|
||||
### Blog Post → Social Content
|
||||
|
||||
@@ -119,13 +121,61 @@ Turn one piece of content into many:
|
||||
| Instagram | Carousel with visuals |
|
||||
| Instagram | Reel summarizing the post |
|
||||
|
||||
### Podcast / Video → Social Content
|
||||
|
||||
Extract "content atoms" — self-contained moments from any long-form content that work on their own:
|
||||
|
||||
| Atom Type | What to Look For | Best Platform |
|
||||
|-----------|-----------------|---------------|
|
||||
| Quotable moment | A bold claim, hot take, or memorable line (15-60 sec) | Twitter/X, LinkedIn, TikTok |
|
||||
| Story arc | A complete mini-story with setup, conflict, resolution (60-90 sec) | Instagram Reels, TikTok, YouTube Shorts |
|
||||
| Tactical tip | A specific how-to or framework explained clearly (30-60 sec) | LinkedIn, YouTube Shorts |
|
||||
| Controversial take | A contrarian opinion that sparks debate | Twitter/X, LinkedIn |
|
||||
| Data/stat callout | A surprising number or research finding | LinkedIn carousel, Twitter/X |
|
||||
| Behind-the-scenes | Authentic, unpolished moments | Instagram Stories, TikTok |
|
||||
|
||||
**Podcast repurposing workflow:**
|
||||
1. **Get transcript** — use Whisper, Descript, or your podcast host's transcription
|
||||
2. **Mark timestamps** — flag the 5-10 best moments while listening or scanning transcript
|
||||
3. **Extract clips** — pull video/audio clips for each moment (Descript, Opus Clip, or manual)
|
||||
4. **Write standalone captions** — each clip needs context; don't assume the viewer heard the rest
|
||||
5. **Add subtitles** — most social video is watched without sound
|
||||
6. **Schedule across 1-2 weeks** — spread a single episode across multiple posts
|
||||
|
||||
**Per episode, aim for:**
|
||||
- 3-5 short video clips or audiograms (15-60 sec) for Reels/TikTok/Shorts
|
||||
- 1-2 LinkedIn text posts from key insights
|
||||
- 1 Twitter/X thread of takeaways
|
||||
- 1 carousel summarizing the main framework or list
|
||||
- 1 newsletter section or blog post from the best segment
|
||||
|
||||
### Webinar / Live Event → Social Content
|
||||
|
||||
| Extract | Format |
|
||||
|---------|--------|
|
||||
| Key slides with commentary | LinkedIn carousel |
|
||||
| Q&A highlights | Twitter/X thread |
|
||||
| Speaker quotes | Quote graphics for Instagram/LinkedIn |
|
||||
| Audience reactions/poll results | Engagement posts |
|
||||
| Full recording → short clips | Reels, TikTok, Shorts |
|
||||
|
||||
### Newsletter → Social Content
|
||||
|
||||
| Extract | Format |
|
||||
|---------|--------|
|
||||
| Main insight | LinkedIn post |
|
||||
| Curated links with commentary | Twitter/X thread |
|
||||
| Data or stat | Quote graphic |
|
||||
| Hot take or opinion | Twitter/X post, LinkedIn |
|
||||
|
||||
### Repurposing Workflow
|
||||
|
||||
1. **Create pillar content** (blog, video, podcast)
|
||||
2. **Extract key insights** (3-5 per piece)
|
||||
3. **Adapt to each platform** (format and tone)
|
||||
4. **Schedule across the week** (spread distribution)
|
||||
5. **Update and reshare** (evergreen content can repeat)
|
||||
1. **Create pillar content** (blog, video, podcast, webinar, newsletter)
|
||||
2. **Extract content atoms** (5-10 per piece — quotes, stories, tips, data)
|
||||
3. **Adapt to each platform** (format, length, and tone)
|
||||
4. **Write standalone captions** (each post must work without context)
|
||||
5. **Schedule across the week** (spread distribution, don't dump all at once)
|
||||
6. **Update and reshare** (evergreen content can repeat every 3-6 months)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
{
|
||||
"skill_name": "social-content",
|
||||
"evals": [
|
||||
{
|
||||
"id": 1,
|
||||
"prompt": "Help me create a LinkedIn content strategy. I'm a SaaS founder building in public and want to grow my personal brand to drive awareness for my product. I currently have 500 followers and post maybe once a week.",
|
||||
"expected_output": "Should check for product-marketing-context.md first. Should establish content pillars (3-5) appropriate for a SaaS founder building in public: industry insights, behind-the-scenes, educational content, personal stories, promotional (minimal). Should apply the platform quick reference for LinkedIn (3-5x/week recommended, carousels and stories perform well). Should provide hook formulas for LinkedIn posts. Should create a weekly content calendar. Should include engagement strategy (daily 30-min routine). Should address going from 1x/week to 3-5x/week with a batching strategy.",
|
||||
"assertions": [
|
||||
"Checks for product-marketing-context.md",
|
||||
"Establishes 3-5 content pillars",
|
||||
"Applies LinkedIn platform guidance",
|
||||
"Provides hook formulas",
|
||||
"Creates weekly content calendar",
|
||||
"Includes engagement strategy",
|
||||
"Addresses batching strategy for consistency",
|
||||
"Recommends increasing from 1x to 3-5x per week"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"prompt": "Write me a Twitter/X thread about the lessons I learned bootstrapping my SaaS to $10k MRR. Include hooks and a CTA at the end.",
|
||||
"expected_output": "Should apply the hook formulas for a story hook (e.g., '6 months ago, I had $0 MRR. Today, I hit $10k.'). Should structure the thread following platform best practices: strong hook in tweet 1, each tweet should stand alone but flow together, use specific numbers and stories, end with a CTA. Should reference the content pillar this fits into (behind-the-scenes / founder journey). Should provide the actual thread content with 8-12 tweets. Should include engagement prompts.",
|
||||
"assertions": [
|
||||
"Applies hook formulas from the skill",
|
||||
"Uses a story hook for the first tweet",
|
||||
"Structures thread with standalone but flowing tweets",
|
||||
"Uses specific numbers and stories",
|
||||
"Ends with clear CTA",
|
||||
"Provides 8-12 tweet thread content",
|
||||
"Includes engagement prompts"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"prompt": "i have a blog post that did really well. how do i turn it into social media content for multiple platforms?",
|
||||
"expected_output": "Should trigger on casual phrasing. Should apply the content repurposing system. Should use the Blog Post → Social Content mapping: LinkedIn (key insight post + carousel of main points), Twitter/X (thread of key takeaways), Instagram (carousel with visuals + Reel summarizing the post). Should follow the repurposing workflow: create pillar content → extract key insights (3-5) → adapt to each platform → schedule across the week. Should provide specific format recommendations per platform.",
|
||||
"assertions": [
|
||||
"Triggers on casual phrasing",
|
||||
"Applies content repurposing system",
|
||||
"Uses Blog Post → Social Content mapping",
|
||||
"Provides format for LinkedIn, Twitter/X, and Instagram",
|
||||
"Follows the repurposing workflow",
|
||||
"Extracts 3-5 key insights to repurpose",
|
||||
"Provides platform-specific format recommendations"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"prompt": "My LinkedIn posts get like 200 impressions and almost no engagement. What am I doing wrong?",
|
||||
"expected_output": "Should apply the analytics and optimization section, specifically the 'if engagement is low' guidance. Should diagnose potential issues: weak hooks (first line not compelling), posting at wrong times, not engaging with others' content, poor formatting (no line breaks, walls of text), content not resonating with audience. Should recommend specific fixes: test new hook formulas, post at different times, increase engagement with others (the daily engagement routine), try different formats (carousels, stories). Should provide before/after hook examples.",
|
||||
"assertions": [
|
||||
"Applies analytics and optimization guidance",
|
||||
"Diagnoses potential engagement issues",
|
||||
"Addresses hook quality",
|
||||
"Addresses posting timing",
|
||||
"Recommends daily engagement routine",
|
||||
"Suggests trying different content formats",
|
||||
"Provides specific before/after hook examples"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"prompt": "Help me reverse-engineer what's working for top creators in the DevTools space on Twitter. I want to understand their content patterns.",
|
||||
"expected_output": "Should apply the reverse engineering viral content framework. Should walk through the process: identify 10-20 top accounts in DevTools, collect high-performing posts, analyze patterns (hooks, formats, CTAs, topics, posting times), codify a playbook of repeatable patterns, then layer the user's authentic voice. Should provide specific guidance on what to look for in the analysis. Should recommend tools or methods for collecting the data.",
|
||||
"assertions": [
|
||||
"Applies reverse engineering viral content framework",
|
||||
"Walks through the full process (find, collect, analyze, codify, apply)",
|
||||
"Recommends identifying 10-20 accounts",
|
||||
"Describes what patterns to analyze",
|
||||
"Emphasizes layering authentic voice",
|
||||
"Provides data collection guidance"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"prompt": "Write me a 5-email welcome sequence for new email subscribers who came from my LinkedIn audience.",
|
||||
"expected_output": "Should recognize this is an email sequence task, not social content. Should defer to or cross-reference the email-sequence skill, which handles welcome sequences, drip campaigns, and lifecycle emails. May note the social-to-email bridge context but should make clear that email-sequence is the right skill for writing email sequences.",
|
||||
"assertions": [
|
||||
"Recognizes this as email sequence work",
|
||||
"References or defers to email-sequence skill",
|
||||
"Does not attempt to write email sequence using social content patterns",
|
||||
"May note social-to-email bridge context"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
# Platform Limits Reference
|
||||
|
||||
Quick reference for hashtag limits, character counts, and visible text thresholds on each major social platform.
|
||||
|
||||
---
|
||||
|
||||
## Instagram
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | 5 (official limit) |
|
||||
| Recommended hashtags | 3 – 5 |
|
||||
| Max caption chars | 2,200 |
|
||||
| Visible before "more" | ~125 chars |
|
||||
|
||||
---
|
||||
|
||||
## Facebook
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | No official limit |
|
||||
| Recommended hashtags | 1 – 2 |
|
||||
| Max post chars | 63,206 |
|
||||
| Ideal for engagement | 40 – 80 chars |
|
||||
|
||||
---
|
||||
|
||||
## TikTok
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | 5 (since August 2025) |
|
||||
| Recommended hashtags | 3 – 5 |
|
||||
| Max caption chars | 4,000 |
|
||||
| Visible before "more" | ~150 chars |
|
||||
|
||||
---
|
||||
|
||||
## LinkedIn
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | No official limit |
|
||||
| Recommended hashtags | 3 – 5 |
|
||||
| Max post chars | 3,000 |
|
||||
| Visible before "more" | ~210 chars |
|
||||
|
||||
---
|
||||
|
||||
## Twitter/X
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | No official limit |
|
||||
| Recommended hashtags | 1 – 2 |
|
||||
| Max tweet chars | 280 (standard) / 25,000 (Premium+) |
|
||||
| Visible before "more" | Full tweet (280 standard) |
|
||||
|
||||
---
|
||||
|
||||
## YouTube
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | 15 (exceeding this causes YouTube to ignore ALL hashtags) |
|
||||
| Recommended hashtags | 3 – 5 |
|
||||
| Max title chars | 100 (visible before truncation: ~70) |
|
||||
| Max description chars | 5,000 |
|
||||
| Visible before "Show more" | ~100 chars |
|
||||
|
||||
> The first 3 hashtags in the description automatically appear above the title as clickable links. For Shorts, use 1 – 5 hashtags.
|
||||
|
||||
---
|
||||
|
||||
## Pinterest
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | 20 per pin |
|
||||
| Recommended hashtags | 2 – 5 |
|
||||
| Max pin title chars | 100 |
|
||||
| Max description chars | 500 |
|
||||
| Visible before "More" | ~50 chars (desktop) |
|
||||
|
||||
> Pinterest has deprioritized hashtags. Focus on keywords as natural sentences within the description for better SEO instead of relying on hashtags.
|
||||
|
||||
---
|
||||
|
||||
## Threads (Meta)
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Max hashtags | 1 per post (topic tag) |
|
||||
| Recommended hashtags | 1 |
|
||||
| Max post chars | 500 |
|
||||
| Max with text attachment | 10,500 (500 + 10,000 expandable) |
|
||||
| Visible without expanding | First ~1 – 2 lines |
|
||||
|
||||
> Threads limits topic tags to one per post. The platform is not hashtag-driven — the algorithm prioritizes content from followed accounts mixed with recommendations.
|
||||
|
||||
---
|
||||
|
||||
## Usage Tips
|
||||
|
||||
- **Hashtags count against character limits** on all platforms
|
||||
- **Front-load your message** before the "more" truncation point
|
||||
- On Instagram and TikTok, fewer hashtags now outperform hashtag-stuffing
|
||||
- On LinkedIn, hashtags at the end of the post perform better than inline
|
||||
- On Facebook, hashtags have minimal impact on reach — use sparingly
|
||||
+142
-8
@@ -28,8 +28,13 @@ Quick reference for AI agents to discover tool capabilities and integration meth
|
||||
| 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) |
|
||||
| paddle | Payments | ✓ | - | [✓](clis/paddle.js) | ✓ | [paddle.md](integrations/paddle.md) |
|
||||
| rewardful | Referral | ✓ | - | [✓](clis/rewardful.js) | - | [rewardful.md](integrations/rewardful.md) |
|
||||
@@ -41,6 +46,7 @@ Quick reference for AI agents to discover tool capabilities and integration meth
|
||||
| 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) |
|
||||
| nitrosend | Email | ✓ | ✓ | - | - | [nitrosend.md](integrations/nitrosend.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) |
|
||||
@@ -55,13 +61,23 @@ Quick reference for AI agents to discover tool capabilities and integration meth
|
||||
| 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) |
|
||||
| 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) |
|
||||
| introw | Partner Ecosystem | - | ✓ | - | - | [introw.md](integrations/introw.md) |
|
||||
| pendo | Product Analytics | ✓ | - | [✓](clis/pendo.js) | - | [pendo.md](integrations/pendo.md) |
|
||||
| similarweb | Competitive Intelligence | ✓ | - | [✓](clis/similarweb.js) | - | [similarweb.md](integrations/similarweb.md) |
|
||||
| firehose | Competitive Intelligence | ✓ | - | - | - | [firehose.md](integrations/firehose.md) |
|
||||
| sparktoro | Audience Research | - | - | - | - | [sparktoro.md](integrations/sparktoro.md) |
|
||||
| rb2b | Visitor Identification | ✓ | - | - | - | [rb2b.md](integrations/rb2b.md) |
|
||||
| gong | Revenue Intelligence | ✓ | - | - | - | [gong.md](integrations/gong.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) |
|
||||
@@ -72,6 +88,10 @@ Quick reference for AI agents to discover tool capabilities and integration meth
|
||||
| shopify | Commerce | ✓ | - | ✓ | ✓ | [shopify.md](integrations/shopify.md) |
|
||||
| wordpress | CMS | ✓ | - | ✓ | ✓ | [wordpress.md](integrations/wordpress.md) |
|
||||
| webflow | CMS | ✓ | - | ✓ | ✓ | [webflow.md](integrations/webflow.md) |
|
||||
| sanity | Headless CMS | ✓ | - | ✓ | ✓ | [sanity.md](integrations/sanity.md) |
|
||||
| contentful | Headless CMS | ✓ | - | ✓ | ✓ | [contentful.md](integrations/contentful.md) |
|
||||
| strapi | Headless CMS | ✓ | - | ✓ | ✓ | [strapi.md](integrations/strapi.md) |
|
||||
| composio | Integration Layer | ✓ | ✓ | ✓ | ✓ | [composio.md](integrations/composio.md) |
|
||||
|
||||
---
|
||||
|
||||
@@ -115,8 +135,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
|
||||
|
||||
@@ -125,7 +146,6 @@ 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. Paddle for built-in tax compliance.
|
||||
@@ -182,9 +202,9 @@ Workflow automation and integration platforms.
|
||||
|
||||
| Tool | Best For | MCP Available |
|
||||
|------|----------|:-------------:|
|
||||
| **zapier** | No-code integrations | ✓ |
|
||||
| **zapier** | No-code integrations + SDK for 8,000+ apps | ✓ |
|
||||
|
||||
**Agent recommendation**: Zapier for connecting tools without code.
|
||||
**Agent recommendation**: Zapier SDK for agents that need to interact with any app directly. Zaps for always-on automations.
|
||||
|
||||
### CRO & A/B Testing
|
||||
|
||||
@@ -256,8 +276,10 @@ Company and person data enrichment for sales and marketing.
|
||||
|------|----------|-------|
|
||||
| **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.
|
||||
**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
|
||||
|
||||
@@ -291,6 +313,87 @@ Webinar and virtual event platforms.
|
||||
|
||||
**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.
|
||||
|
||||
### Audience Research
|
||||
|
||||
Audience intelligence and behavioral research tools.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **sparktoro** | Audience affinities, behavioral data | Clickstream + social data |
|
||||
|
||||
**Agent recommendation**: SparkToro for discovering where your ICP spends time — what they read, watch, listen to, follow, and search for. Essential for customer research, content strategy, and media buying decisions.
|
||||
|
||||
### Visitor Identification
|
||||
|
||||
Website visitor de-anonymization for B2B sales and marketing.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **rb2b** | Person-level visitor ID, intent signals | LinkedIn profiles, emails, page-level data |
|
||||
|
||||
**Agent recommendation**: RB2B for identifying anonymous B2B website visitors and routing high-intent visitors to outreach tools. Pairs well with Clay for enrichment and Instantly/Lemlist for cold email.
|
||||
|
||||
### Revenue Intelligence
|
||||
|
||||
Sales conversation analytics, call recording, and deal intelligence.
|
||||
|
||||
| Tool | Best For | Notes |
|
||||
|------|----------|-------|
|
||||
| **gong** | Call recording, transcript analysis, deal insights | REST API, 10k API calls/day |
|
||||
|
||||
**Agent recommendation**: Gong for mining sales call transcripts for customer research, competitive intelligence, and coaching insights. Essential for revenue attribution and win/loss analysis.
|
||||
|
||||
### 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 |
|
||||
| **introw** | Partner management, deal registration, QBRs | MCP-enabled PRM |
|
||||
|
||||
**Agent recommendation**: Crossbeam for identifying partner account overlaps and co-sell opportunities. Introw for full partner relationship management — partner pipeline, commissions, tasks, and automated business review prep.
|
||||
|
||||
### Email Outreach
|
||||
|
||||
Cold email outreach and email finding tools for link building and sales prospecting.
|
||||
@@ -304,6 +407,17 @@ Cold email outreach and email finding tools for link building and sales prospect
|
||||
|
||||
**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.
|
||||
@@ -313,8 +427,11 @@ E-commerce platforms and content management systems.
|
||||
| **shopify** | E-commerce, product sales | ✓ |
|
||||
| **wordpress** | Blogs, content sites | ✓ |
|
||||
| **webflow** | Design-focused marketing sites | ✓ |
|
||||
| **sanity** | Headless CMS, structured content | ✓ |
|
||||
| **contentful** | Enterprise headless CMS, multi-locale | ✓ |
|
||||
| **strapi** | Open-source headless CMS, self-hosted | ✓ |
|
||||
|
||||
**Agent recommendation**: Shopify for e-commerce. Webflow for marketing sites. WordPress for blogs.
|
||||
**Agent recommendation**: Shopify for e-commerce. Webflow for marketing sites. WordPress for blogs. For headless CMS: Sanity for developer-flexible content, Contentful for enterprise multi-locale, Strapi for self-hosted/budget-conscious. See [headless CMS guide](../skills/content-strategy/references/headless-cms.md) for selection criteria.
|
||||
|
||||
---
|
||||
|
||||
@@ -339,10 +456,27 @@ These tools have Model Context Protocol servers available, enabling direct agent
|
||||
- **mailchimp** - Email campaign management
|
||||
- **google-ads** - Ad campaign management
|
||||
- **resend** - Transactional email sending
|
||||
- **zapier** - Workflow automation
|
||||
- **zapier** - Workflow automation + SDK for 8,000+ app integrations
|
||||
- **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
|
||||
- **introw** - Partner relationship management
|
||||
|
||||
To use MCP tools, ensure the appropriate MCP server is configured in your environment.
|
||||
|
||||
### Composio Integration
|
||||
|
||||
[Composio](integrations/composio.md) provides managed OAuth and pre-built connectors for 500+ tools via a single MCP server. It adds MCP access to tools that don't have native MCP servers, including HubSpot, Salesforce, Meta Ads, LinkedIn Ads, Google Sheets, Slack, Notion, and more.
|
||||
|
||||
- **Setup**: `npx @composio/mcp@latest setup`
|
||||
- **Quick start**: See [tools/composio/README.md](composio/README.md)
|
||||
- **Marketing tool mapping**: See [tools/composio/marketing-tools.md](composio/marketing-tools.md)
|
||||
|
||||
Use Composio when you need MCP access to OAuth-heavy tools. Prefer native MCP servers (GA4, Stripe, Mailchimp, etc.) when available — they have deeper coverage.
|
||||
|
||||
---
|
||||
|
||||
## Quick Start by Use Case
|
||||
|
||||
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
+159
@@ -0,0 +1,159 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.CLAY_API_KEY
|
||||
const BASE_URL = 'https://api.clay.com/v3'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'CLAY_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': 'Bearer ***', 'Content-Type': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const options = {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${API_KEY}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
}
|
||||
if (body) options.body = JSON.stringify(body)
|
||||
const res = await fetch(`${BASE_URL}${path}`, options)
|
||||
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 'tables':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', `/tables?page=${page}&per_page=${perPage}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/tables/${id}`)
|
||||
break
|
||||
}
|
||||
case 'rows': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/tables/${id}/rows?page=${page}&per_page=${perPage}`)
|
||||
break
|
||||
}
|
||||
case 'add-row': {
|
||||
const id = args.id
|
||||
const data = args.data
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
if (!data) { result = { error: '--data required (JSON string)' }; break }
|
||||
let parsed
|
||||
try {
|
||||
parsed = JSON.parse(data)
|
||||
} catch {
|
||||
result = { error: 'Invalid JSON in --data' }
|
||||
break
|
||||
}
|
||||
result = await api('POST', `/tables/${id}/rows`, parsed)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown tables subcommand. Use: list, get, rows, add-row' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'people':
|
||||
switch (sub) {
|
||||
case 'enrich': {
|
||||
const body = {}
|
||||
if (args.email) body.email = args.email
|
||||
if (args.linkedin) body.linkedin_url = args.linkedin
|
||||
if (args['first-name']) body.first_name = args['first-name']
|
||||
if (args['last-name']) body.last_name = args['last-name']
|
||||
if (args['first-name'] && args['last-name'] && args.domain) body.domain = args.domain
|
||||
if (!args.email && !args.linkedin && !(args['first-name'] && args['last-name'] && args.domain)) {
|
||||
result = { error: '--email or --linkedin required (or --first-name + --last-name + --domain)' }
|
||||
break
|
||||
}
|
||||
result = await api('POST', '/people/enrich', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown people subcommand. Use: enrich' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'companies':
|
||||
switch (sub) {
|
||||
case 'enrich': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
result = await api('POST', '/companies/enrich', { domain })
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown companies subcommand. Use: enrich' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
tables: {
|
||||
list: 'tables list [--page <n>] [--per-page <n>]',
|
||||
get: 'tables get --id <table_id>',
|
||||
rows: 'tables rows --id <table_id> [--page <n>] [--per-page <n>]',
|
||||
'add-row': 'tables add-row --id <table_id> --data <json>',
|
||||
},
|
||||
people: {
|
||||
enrich: 'people enrich --email <email> | --linkedin <url> | --first-name <n> --last-name <n> --domain <d>',
|
||||
},
|
||||
companies: {
|
||||
enrich: 'companies enrich --domain <domain>',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+232
@@ -0,0 +1,232 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.CLOSE_API_KEY
|
||||
const BASE_URL = 'https://api.close.com/api/v1'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'CLOSE_API_KEY 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: { 'Content-Type': 'application/json', 'Authorization': 'Basic ***' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(url, {
|
||||
method,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
'Authorization': `Basic ${btoa(API_KEY + ':')}`,
|
||||
},
|
||||
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 'leads':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args.query) params.set('query', args.query)
|
||||
if (args.page) params.set('_skip', (parseInt(args.page) - 1) * 100)
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/lead/${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/lead/${id}/`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const name = args.name
|
||||
if (!name) { result = { error: '--name required' }; break }
|
||||
const body = { name }
|
||||
if (args.url) body.url = args.url
|
||||
if (args.description) body.description = args.description
|
||||
result = await api('POST', '/lead/', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown leads subcommand. Use: list, get, create' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'contacts':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args['lead-id']) params.set('lead_id', args['lead-id'])
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/contact/${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/contact/${id}/`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const leadId = args['lead-id']
|
||||
const name = args.name
|
||||
if (!leadId) { result = { error: '--lead-id required' }; break }
|
||||
if (!name) { result = { error: '--name required' }; break }
|
||||
const body = { lead_id: leadId, name }
|
||||
if (args.email) {
|
||||
body.emails = [{ email: args.email, type: 'office' }]
|
||||
}
|
||||
if (args.phone) {
|
||||
body.phones = [{ phone: args.phone, type: 'office' }]
|
||||
}
|
||||
result = await api('POST', '/contact/', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown contacts subcommand. Use: list, get, create' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'opportunities':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args.status) params.set('status', args.status)
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/opportunity/${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/opportunity/${id}/`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const leadId = args['lead-id']
|
||||
const value = args.value
|
||||
if (!leadId) { result = { error: '--lead-id required' }; break }
|
||||
if (!value) { result = { error: '--value required (in cents)' }; break }
|
||||
const body = { lead_id: leadId, value: parseInt(value) }
|
||||
if (args.status) body.status_type = args.status
|
||||
result = await api('POST', '/opportunity/', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown opportunities subcommand. Use: list, get, create' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'activities':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args['lead-id']) params.set('lead_id', args['lead-id'])
|
||||
if (args.type) params.set('_type__type', args.type)
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/activity/${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown activities subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'tasks':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args['assigned-to']) params.set('assigned_to', args['assigned-to'])
|
||||
if (args['is-complete']) params.set('is_complete', args['is-complete'])
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/task/${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const leadId = args['lead-id']
|
||||
const text = args.text
|
||||
if (!leadId) { result = { error: '--lead-id required' }; break }
|
||||
if (!text) { result = { error: '--text required' }; break }
|
||||
const body = { lead_id: leadId, text, _type: 'lead' }
|
||||
if (args['assigned-to']) body.assigned_to = args['assigned-to']
|
||||
if (args.date) body.date = args.date
|
||||
result = await api('POST', '/task/', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown tasks subcommand. Use: list, create' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
leads: {
|
||||
list: 'leads list [--query <q>] [--page <n>]',
|
||||
get: 'leads get --id <id>',
|
||||
create: 'leads create --name <name> [--url <url>] [--description <desc>]',
|
||||
},
|
||||
contacts: {
|
||||
list: 'contacts list [--lead-id <id>]',
|
||||
get: 'contacts get --id <id>',
|
||||
create: 'contacts create --lead-id <id> --name <name> [--email <email>] [--phone <phone>]',
|
||||
},
|
||||
opportunities: {
|
||||
list: 'opportunities list [--status <status>]',
|
||||
get: 'opportunities get --id <id>',
|
||||
create: 'opportunities create --lead-id <id> --value <cents> [--status <status>]',
|
||||
},
|
||||
activities: {
|
||||
list: 'activities list [--lead-id <id>] [--type <type>]',
|
||||
},
|
||||
tasks: {
|
||||
list: 'tasks list [--assigned-to <user-id>] [--is-complete <bool>]',
|
||||
create: 'tasks create --lead-id <id> --text <text> [--assigned-to <user-id>] [--date <date>]',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+173
@@ -0,0 +1,173 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.COUPLER_API_KEY
|
||||
const BASE_URL = 'https://api.coupler.io/v1'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'COUPLER_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': 'Bearer ***', 'Content-Type': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${API_KEY}`,
|
||||
'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 'importers':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
if (args.offset) params.set('offset', args.offset)
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/importers${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/importers/${id}`)
|
||||
break
|
||||
}
|
||||
case 'run': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('POST', `/importers/${id}/run`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const source = args.source
|
||||
const destination = args.destination
|
||||
const name = args.name
|
||||
if (!source) { result = { error: '--source required' }; break }
|
||||
if (!destination) { result = { error: '--destination required' }; break }
|
||||
if (!name) { result = { error: '--name required' }; break }
|
||||
const body = { source_type: source, destination_type: destination, name }
|
||||
if (args.schedule) body.schedule = args.schedule
|
||||
result = await api('POST', '/importers', body)
|
||||
break
|
||||
}
|
||||
case 'delete': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('DELETE', `/importers/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown importers subcommand. Use: list, get, run, create, delete' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'runs':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const importerId = args['importer-id']
|
||||
if (!importerId) { result = { error: '--importer-id required' }; break }
|
||||
const params = new URLSearchParams()
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
if (args.offset) params.set('offset', args.offset)
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/importers/${importerId}/runs${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/runs/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown runs subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'sources':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/sources')
|
||||
break
|
||||
default:
|
||||
result = { error: 'Unknown sources subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'destinations':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/destinations')
|
||||
break
|
||||
default:
|
||||
result = { error: 'Unknown destinations subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
importers: {
|
||||
list: 'importers list [--limit <n>] [--offset <n>]',
|
||||
get: 'importers get --id <id>',
|
||||
run: 'importers run --id <id>',
|
||||
create: 'importers create --source <source-type> --destination <dest-type> --name <name> [--schedule <schedule>]',
|
||||
delete: 'importers delete --id <id>',
|
||||
},
|
||||
runs: {
|
||||
list: 'runs list --importer-id <id> [--limit <n>] [--offset <n>]',
|
||||
get: 'runs get --id <id>',
|
||||
},
|
||||
sources: 'sources list',
|
||||
destinations: 'destinations list',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+193
@@ -0,0 +1,193 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.CROSSBEAM_API_KEY
|
||||
const BASE_URL = 'https://api.crossbeam.com/v1'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'CROSSBEAM_API_KEY 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 'partners':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', '/partners')
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/partners/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown partners subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'populations':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', '/populations')
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/populations/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown populations subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'overlaps':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args['partner-id']) params.set('partner_id', args['partner-id'])
|
||||
if (args['population-id']) params.set('population_id', args['population-id'])
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/overlaps${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/overlaps/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown overlaps subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'reports':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', '/reports')
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/reports/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown reports subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'threads':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', '/threads')
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown threads subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'accounts':
|
||||
switch (sub) {
|
||||
case 'search': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
const params = new URLSearchParams({ domain })
|
||||
result = await api('GET', `/accounts/search?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown accounts subcommand. Use: search' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
partners: {
|
||||
list: 'partners list',
|
||||
get: 'partners get --id <id>',
|
||||
},
|
||||
populations: {
|
||||
list: 'populations list',
|
||||
get: 'populations get --id <id>',
|
||||
},
|
||||
overlaps: {
|
||||
list: 'overlaps list [--partner-id <id>] [--population-id <id>]',
|
||||
get: 'overlaps get --id <id>',
|
||||
},
|
||||
reports: {
|
||||
list: 'reports list',
|
||||
get: 'reports get --id <id>',
|
||||
},
|
||||
threads: {
|
||||
list: 'threads list',
|
||||
},
|
||||
accounts: {
|
||||
search: 'accounts search --domain <domain>',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+213
@@ -0,0 +1,213 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const ACCESS_TOKEN = process.env.OUTREACH_ACCESS_TOKEN
|
||||
const BASE_URL = 'https://api.outreach.io/api/v2'
|
||||
|
||||
if (!ACCESS_TOKEN) {
|
||||
console.error(JSON.stringify({ error: 'OUTREACH_ACCESS_TOKEN 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/vnd.api+json', 'Accept': 'application/vnd.api+json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(url, {
|
||||
method,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${ACCESS_TOKEN}`,
|
||||
'Content-Type': 'application/vnd.api+json',
|
||||
'Accept': 'application/vnd.api+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 'prospects':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args.page) params.set('page[number]', args.page)
|
||||
if (args['per-page']) params.set('page[size]', args['per-page'])
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/prospects${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/prospects/${id}`)
|
||||
break
|
||||
}
|
||||
case 'create': {
|
||||
const email = args.email
|
||||
if (!email) { result = { error: '--email required' }; break }
|
||||
const attributes = { emails: [email] }
|
||||
if (args['first-name']) attributes.firstName = args['first-name']
|
||||
if (args['last-name']) attributes.lastName = args['last-name']
|
||||
const body = { data: { type: 'prospect', attributes } }
|
||||
result = await api('POST', '/prospects', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown prospects subcommand. Use: list, get, create' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'sequences':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', '/sequences')
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/sequences/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown sequences subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'sequence-states':
|
||||
switch (sub) {
|
||||
case 'create': {
|
||||
const sequenceId = args['sequence-id']
|
||||
const prospectId = args['prospect-id']
|
||||
if (!sequenceId) { result = { error: '--sequence-id required' }; break }
|
||||
if (!prospectId) { result = { error: '--prospect-id required' }; break }
|
||||
const body = {
|
||||
data: {
|
||||
type: 'sequenceState',
|
||||
relationships: {
|
||||
prospect: { data: { type: 'prospect', id: prospectId } },
|
||||
sequence: { data: { type: 'sequence', id: sequenceId } },
|
||||
},
|
||||
},
|
||||
}
|
||||
result = await api('POST', '/sequenceStates', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown sequence-states subcommand. Use: create' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'mailings':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args['sequence-id']) params.set('filter[sequence][id]', args['sequence-id'])
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/mailings${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown mailings subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'accounts':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
result = await api('GET', '/accounts')
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/accounts/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown accounts subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'tasks':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args.status) params.set('filter[status]', args.status)
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/tasks${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown tasks subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
prospects: {
|
||||
list: 'prospects list [--page <n>] [--per-page <n>]',
|
||||
get: 'prospects get --id <id>',
|
||||
create: 'prospects create --email <email> [--first-name <name>] [--last-name <name>]',
|
||||
},
|
||||
sequences: {
|
||||
list: 'sequences list',
|
||||
get: 'sequences get --id <id>',
|
||||
},
|
||||
'sequence-states': {
|
||||
create: 'sequence-states create --sequence-id <id> --prospect-id <id>',
|
||||
},
|
||||
mailings: {
|
||||
list: 'mailings list [--sequence-id <id>]',
|
||||
},
|
||||
accounts: {
|
||||
list: 'accounts list',
|
||||
get: 'accounts get --id <id>',
|
||||
},
|
||||
tasks: {
|
||||
list: 'tasks list [--status <status>]',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+221
@@ -0,0 +1,221 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.PENDO_INTEGRATION_KEY
|
||||
const BASE_URL = 'https://app.pendo.io/api/v1'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'PENDO_INTEGRATION_KEY 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: { 'Content-Type': 'application/json', 'x-pendo-integration-key': '***' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(url, {
|
||||
method,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'x-pendo-integration-key': API_KEY,
|
||||
},
|
||||
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 'features':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/feature')
|
||||
break
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/feature/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown features subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'pages':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/page')
|
||||
break
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/page/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown pages subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'guides':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const params = new URLSearchParams()
|
||||
if (args.state) params.set('state', args.state)
|
||||
const qs = params.toString()
|
||||
result = await api('GET', `/guide${qs ? '?' + qs : ''}`)
|
||||
break
|
||||
}
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/guide/${id}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown guides subcommand. Use: list, get' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'visitors':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/visitor/${id}`)
|
||||
break
|
||||
}
|
||||
case 'search': {
|
||||
const query = args.query
|
||||
if (!query) { result = { error: '--query <json> required' }; break }
|
||||
let body
|
||||
try { body = JSON.parse(query) } catch { result = { error: 'Invalid JSON in --query' }; break }
|
||||
result = await api('POST', '/aggregation', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown visitors subcommand. Use: get, search' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'accounts':
|
||||
switch (sub) {
|
||||
case 'get': {
|
||||
const id = args.id
|
||||
if (!id) { result = { error: '--id required' }; break }
|
||||
result = await api('GET', `/account/${id}`)
|
||||
break
|
||||
}
|
||||
case 'search': {
|
||||
const query = args.query
|
||||
if (!query) { result = { error: '--query <json> required' }; break }
|
||||
let body
|
||||
try { body = JSON.parse(query) } catch { result = { error: 'Invalid JSON in --query' }; break }
|
||||
result = await api('POST', '/aggregation', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown accounts subcommand. Use: get, search' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'reports':
|
||||
switch (sub) {
|
||||
case 'funnel': {
|
||||
const pipeline = args.pipeline
|
||||
if (!pipeline) { result = { error: '--pipeline <json> required' }; break }
|
||||
let body
|
||||
try { body = JSON.parse(pipeline) } catch { result = { error: 'Invalid JSON in --pipeline' }; break }
|
||||
result = await api('POST', '/aggregation', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown reports subcommand. Use: funnel' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'metadata':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const kind = args.kind
|
||||
if (!kind) { result = { error: '--kind <visitor|account|parentAccount> required' }; break }
|
||||
result = await api('GET', `/metadata/schema/${kind}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown metadata subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
features: {
|
||||
list: 'features list',
|
||||
get: 'features get --id <id>',
|
||||
},
|
||||
pages: {
|
||||
list: 'pages list',
|
||||
get: 'pages get --id <id>',
|
||||
},
|
||||
guides: {
|
||||
list: 'guides list [--state <state>]',
|
||||
get: 'guides get --id <id>',
|
||||
},
|
||||
visitors: {
|
||||
get: 'visitors get --id <id>',
|
||||
search: 'visitors search --query <json>',
|
||||
},
|
||||
accounts: {
|
||||
get: 'accounts get --id <id>',
|
||||
search: 'accounts search --query <json>',
|
||||
},
|
||||
reports: {
|
||||
funnel: 'reports funnel --pipeline <json>',
|
||||
},
|
||||
metadata: {
|
||||
list: 'metadata list --kind <visitor|account|parentAccount>',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+214
@@ -0,0 +1,214 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.SIMILARWEB_API_KEY
|
||||
const BASE_URL = 'https://api.similarweb.com/v1'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'SIMILARWEB_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function api(method, path, body) {
|
||||
const separator = path.includes('?') ? '&' : '?'
|
||||
const url = `${BASE_URL}${path}${separator}api_key=${API_KEY}`
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: url.replace(API_KEY, '***'), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(url, {
|
||||
method,
|
||||
headers: {
|
||||
'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 'traffic':
|
||||
switch (sub) {
|
||||
case 'visits': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.granularity) params.set('granularity', args.granularity)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/total-traffic-and-engagement/visits?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'pages-per-visit': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.granularity) params.set('granularity', args.granularity)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/total-traffic-and-engagement/pages-per-visit?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'avg-duration': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.granularity) params.set('granularity', args.granularity)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/total-traffic-and-engagement/average-visit-duration?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'bounce-rate': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.granularity) params.set('granularity', args.granularity)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/total-traffic-and-engagement/bounce-rate?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'sources': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/traffic-sources/overview?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown traffic subcommand. Use: visits, pages-per-visit, avg-duration, bounce-rate, sources' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'referrals': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/traffic-sources/referrals?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
|
||||
case 'search':
|
||||
switch (sub) {
|
||||
case 'keywords-organic': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/search/organic-search-keywords?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
case 'keywords-paid': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
if (args.country) params.set('country', args.country)
|
||||
if (args.limit) params.set('limit', args.limit)
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/search/paid-search-keywords?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown search subcommand. Use: keywords-organic, keywords-paid' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'competitors': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/similar-sites/similarsites`)
|
||||
break
|
||||
}
|
||||
|
||||
case 'category-rank': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/category-rank/category-rank`)
|
||||
break
|
||||
}
|
||||
|
||||
case 'geography': {
|
||||
const domain = args.domain
|
||||
if (!domain) { result = { error: '--domain required' }; break }
|
||||
if (!args.start) { result = { error: '--start required (YYYY-MM)' }; break }
|
||||
if (!args.end) { result = { error: '--end required (YYYY-MM)' }; break }
|
||||
const params = new URLSearchParams({ start_date: args.start, end_date: args.end })
|
||||
result = await api('GET', `/website/${encodeURIComponent(domain)}/geo/traffic-by-country?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
traffic: {
|
||||
visits: 'traffic visits --domain <domain> --start <YYYY-MM> --end <YYYY-MM> [--country <cc>] [--granularity <monthly|weekly|daily>]',
|
||||
'pages-per-visit': 'traffic pages-per-visit --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
'avg-duration': 'traffic avg-duration --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
'bounce-rate': 'traffic bounce-rate --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
sources: 'traffic sources --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
},
|
||||
referrals: 'referrals --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
search: {
|
||||
'keywords-organic': 'search keywords-organic --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
'keywords-paid': 'search keywords-paid --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
},
|
||||
competitors: 'competitors --domain <domain>',
|
||||
'category-rank': 'category-rank --domain <domain>',
|
||||
geography: 'geography --domain <domain> --start <YYYY-MM> --end <YYYY-MM>',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
Executable
+168
@@ -0,0 +1,168 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const API_KEY = process.env.SUPERMETRICS_API_KEY
|
||||
const BASE_URL = 'https://api.supermetrics.com/enterprise/v2'
|
||||
|
||||
if (!API_KEY) {
|
||||
console.error(JSON.stringify({ error: 'SUPERMETRICS_API_KEY environment variable required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function api(method, path, body) {
|
||||
const separator = path.includes('?') ? '&' : '?'
|
||||
const url = `${BASE_URL}${path}${separator}api_key=${API_KEY}`
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: url.replace(API_KEY, '***'), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: body || undefined }
|
||||
}
|
||||
const res = await fetch(url, {
|
||||
method,
|
||||
headers: {
|
||||
'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 'query': {
|
||||
const dsId = args['ds-id']
|
||||
const dsAccounts = args['ds-accounts']
|
||||
const dateRange = args['date-range']
|
||||
const fields = args.fields
|
||||
if (!dsId) { result = { error: '--ds-id required (e.g., GA4, AW, FB, LI, GSC)' }; break }
|
||||
if (!dsAccounts) { result = { error: '--ds-accounts required' }; break }
|
||||
if (!dateRange) { result = { error: '--date-range required (e.g., last_28_days, last_month, this_month, custom)' }; break }
|
||||
if (!fields) { result = { error: '--fields required (comma-separated field names)' }; break }
|
||||
const body = {
|
||||
ds_id: dsId,
|
||||
ds_accounts: dsAccounts,
|
||||
date_range_type: dateRange,
|
||||
fields: fields.split(',').map(f => ({ name: f.trim() })),
|
||||
}
|
||||
if (args.filter) body.filter = args.filter
|
||||
if (args['max-rows']) body.max_rows = parseInt(args['max-rows'], 10)
|
||||
if (args['start-date']) body.start_date = args['start-date']
|
||||
if (args['end-date']) body.end_date = args['end-date']
|
||||
result = await api('POST', '/query/data/json', body)
|
||||
break
|
||||
}
|
||||
|
||||
case 'sources':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/datasources')
|
||||
break
|
||||
default:
|
||||
result = { error: 'Unknown sources subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'accounts':
|
||||
switch (sub) {
|
||||
case 'list': {
|
||||
const dsId = args['ds-id']
|
||||
if (!dsId) { result = { error: '--ds-id required (e.g., GA4, AW, FB)' }; break }
|
||||
const params = new URLSearchParams({ ds_id: dsId })
|
||||
result = await api('GET', `/datasources/accounts?${params.toString()}`)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown accounts subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'teams':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/teams')
|
||||
break
|
||||
default:
|
||||
result = { error: 'Unknown teams subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'users':
|
||||
switch (sub) {
|
||||
case 'list':
|
||||
result = await api('GET', '/users')
|
||||
break
|
||||
default:
|
||||
result = { error: 'Unknown users subcommand. Use: list' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
query: 'query --ds-id <data-source> --ds-accounts <account-id> --date-range <range> --fields <f1,f2> [--filter <filter>] [--max-rows <n>] [--start-date <date>] [--end-date <date>]',
|
||||
sources: {
|
||||
list: 'sources list',
|
||||
},
|
||||
accounts: {
|
||||
list: 'accounts list --ds-id <data-source>',
|
||||
},
|
||||
teams: {
|
||||
list: 'teams list',
|
||||
},
|
||||
users: {
|
||||
list: 'users list',
|
||||
},
|
||||
'data-source-ids': {
|
||||
'GA4': 'Google Analytics 4',
|
||||
'GA4_PAID': 'Google Analytics (paid)',
|
||||
'AW': 'Google Ads',
|
||||
'FB': 'Facebook Ads',
|
||||
'LI': 'LinkedIn Ads',
|
||||
'TW_ADS': 'Twitter Ads',
|
||||
'IG_IA': 'Instagram',
|
||||
'FB_IA': 'Facebook Pages',
|
||||
'GSC': 'Google Search Console',
|
||||
'SE': 'Semrush',
|
||||
'MC': 'Mailchimp',
|
||||
},
|
||||
'date-ranges': ['last_28_days', 'last_month', 'this_month', 'custom'],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
@@ -122,7 +122,9 @@ async function main() {
|
||||
case 'hooks':
|
||||
switch (sub) {
|
||||
case 'send': {
|
||||
// Sends a POST to a Zapier webhook catch hook URL (e.g. https://hooks.zapier.com/hooks/catch/...)
|
||||
if (!args.url) { result = { error: '--url required' }; break }
|
||||
if (!args.url.startsWith('https://')) { result = { error: '--url must use https://' }; break }
|
||||
if (!args.data) { result = { error: '--data required (JSON string)' }; break }
|
||||
let data
|
||||
try {
|
||||
|
||||
Executable
+216
@@ -0,0 +1,216 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const BASE_URL = 'https://api.zoominfo.com'
|
||||
|
||||
let ACCESS_TOKEN = process.env.ZOOMINFO_ACCESS_TOKEN
|
||||
|
||||
if (!ACCESS_TOKEN && !process.env.ZOOMINFO_USERNAME) {
|
||||
console.error(JSON.stringify({ error: 'ZOOMINFO_ACCESS_TOKEN or ZOOMINFO_USERNAME + ZOOMINFO_PRIVATE_KEY environment variables required' }))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
async function authenticate() {
|
||||
if (ACCESS_TOKEN) return ACCESS_TOKEN
|
||||
const username = process.env.ZOOMINFO_USERNAME
|
||||
const password = process.env.ZOOMINFO_PRIVATE_KEY
|
||||
if (!username || !password) {
|
||||
throw new Error('ZOOMINFO_USERNAME and ZOOMINFO_PRIVATE_KEY required for authentication')
|
||||
}
|
||||
const res = await fetch(`${BASE_URL}/authenticate`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ username, password }),
|
||||
})
|
||||
const text = await res.text()
|
||||
if (!res.ok) {
|
||||
throw new Error(`Authentication failed (${res.status}): ${text}`)
|
||||
}
|
||||
try {
|
||||
const data = JSON.parse(text)
|
||||
if (!data.jwt) throw new Error('No JWT in response')
|
||||
ACCESS_TOKEN = data.jwt
|
||||
return ACCESS_TOKEN
|
||||
} catch (e) {
|
||||
if (e.message === 'No JWT in response') throw e
|
||||
throw new Error(`Authentication failed: ${text}`)
|
||||
}
|
||||
}
|
||||
|
||||
async function api(method, path, body) {
|
||||
if (args['dry-run']) {
|
||||
return { _dry_run: true, method, url: `${BASE_URL}${path}`, headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ***' }, body }
|
||||
}
|
||||
const token = await authenticate()
|
||||
const res = await fetch(`${BASE_URL}${path}`, {
|
||||
method,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
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 page = args.page ? Number(args.page) : 1
|
||||
const perPage = args['per-page'] ? Number(args['per-page']) : 25
|
||||
|
||||
switch (cmd) {
|
||||
case 'auth': {
|
||||
if (args['dry-run']) {
|
||||
result = { _dry_run: true, action: 'authenticate', url: `${BASE_URL}/authenticate`, jwt: '***' }
|
||||
break
|
||||
}
|
||||
const token = await authenticate()
|
||||
result = { jwt: token }
|
||||
break
|
||||
}
|
||||
|
||||
case 'contacts':
|
||||
switch (sub) {
|
||||
case 'search': {
|
||||
const body = { rpp: perPage, page }
|
||||
if (args['job-title']) body.jobTitle = [args['job-title']]
|
||||
if (args.company) body.companyName = [args.company]
|
||||
if (args.location) body.locationSearchType = 'PersonLocation', body.personLocationCity = [args.location]
|
||||
if (args.seniority) body.managementLevel = [args.seniority]
|
||||
if (args.department) body.department = [args.department]
|
||||
result = await api('POST', '/search/contact', body)
|
||||
break
|
||||
}
|
||||
case 'enrich': {
|
||||
const body = {}
|
||||
if (args.email) body.matchEmail = [args.email]
|
||||
if (args['person-id']) body.personId = [args['person-id']]
|
||||
if (!args.email && !args['person-id']) {
|
||||
result = { error: '--email or --person-id required' }
|
||||
break
|
||||
}
|
||||
result = await api('POST', '/enrich/contact', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown contacts subcommand. Use: search, enrich' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'companies':
|
||||
switch (sub) {
|
||||
case 'search': {
|
||||
const body = { rpp: perPage, page }
|
||||
if (args.name) body.companyName = [args.name]
|
||||
if (args.industry) body.industry = [args.industry]
|
||||
if (args['revenue-min']) body.revenueMin = Number(args['revenue-min'])
|
||||
if (args['revenue-max']) body.revenueMax = Number(args['revenue-max'])
|
||||
if (args['employees-min']) body.employeeCountMin = Number(args['employees-min'])
|
||||
if (args['employees-max']) body.employeeCountMax = Number(args['employees-max'])
|
||||
result = await api('POST', '/search/company', body)
|
||||
break
|
||||
}
|
||||
case 'enrich': {
|
||||
const body = {}
|
||||
if (args.domain) body.matchCompanyWebsite = [args.domain]
|
||||
if (args['company-id']) body.companyId = [args['company-id']]
|
||||
if (!args.domain && !args['company-id']) {
|
||||
result = { error: '--domain or --company-id required' }
|
||||
break
|
||||
}
|
||||
result = await api('POST', '/enrich/company', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown companies subcommand. Use: search, enrich' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'intent':
|
||||
switch (sub) {
|
||||
case 'search': {
|
||||
if (!args.topic) {
|
||||
result = { error: '--topic required' }
|
||||
break
|
||||
}
|
||||
const body = { topicId: [args.topic] }
|
||||
if (args['company-id']) body.companyId = [args['company-id']]
|
||||
result = await api('POST', '/lookup/intent', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown intent subcommand. Use: search' }
|
||||
}
|
||||
break
|
||||
|
||||
case 'scoops':
|
||||
switch (sub) {
|
||||
case 'search': {
|
||||
const body = { rpp: perPage, page }
|
||||
if (args['company-id']) body.companyId = [args['company-id']]
|
||||
if (args.topic) body.topicId = [args.topic]
|
||||
result = await api('POST', '/lookup/scoops', body)
|
||||
break
|
||||
}
|
||||
default:
|
||||
result = { error: 'Unknown scoops subcommand. Use: search' }
|
||||
}
|
||||
break
|
||||
|
||||
default:
|
||||
result = {
|
||||
error: 'Unknown command',
|
||||
usage: {
|
||||
auth: 'auth — authenticate and get JWT token',
|
||||
contacts: {
|
||||
search: 'contacts search [--job-title <t>] [--company <c>] [--location <l>] [--seniority <s>] [--department <d>] [--page <n>]',
|
||||
enrich: 'contacts enrich --email <email> | --person-id <id>',
|
||||
},
|
||||
companies: {
|
||||
search: 'companies search [--name <n>] [--industry <i>] [--revenue-min <n>] [--employees-min <n>] [--page <n>]',
|
||||
enrich: 'companies enrich --domain <domain> | --company-id <id>',
|
||||
},
|
||||
intent: {
|
||||
search: 'intent search --topic <topic> [--company-id <id>]',
|
||||
},
|
||||
scoops: {
|
||||
search: 'scoops search [--company-id <id>] [--topic <topic>] [--page <n>]',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(result, null, 2))
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(JSON.stringify({ error: err.message }))
|
||||
process.exit(1)
|
||||
})
|
||||
@@ -0,0 +1,105 @@
|
||||
# Composio Quick Start
|
||||
|
||||
Get MCP access to 500+ marketing tools through a single integration.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Node.js 18+
|
||||
- Claude Code installed
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npx @composio/mcp@latest setup
|
||||
```
|
||||
|
||||
Verify by running `/mcp` in Claude Code — `composio` should appear in the server list.
|
||||
|
||||
## Connect a Tool
|
||||
|
||||
When you ask the agent to use a Composio-backed tool for the first time, it will provide a Connect Link. Open the link in your browser, authorize the app, and you're set. The connection persists across sessions.
|
||||
|
||||
```
|
||||
You: "Get my top HubSpot contacts"
|
||||
Agent: "Please connect HubSpot first: https://app.composio.dev/connect/..."
|
||||
# Click the link → authorize → return to Claude Code
|
||||
Agent: "Here are your top contacts: ..."
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Pull CRM contacts
|
||||
|
||||
```
|
||||
"Show me my 10 most recent HubSpot contacts with their deal stages"
|
||||
```
|
||||
|
||||
### Get ad performance
|
||||
|
||||
```
|
||||
"What's my Meta Ads spend and ROAS for the last 7 days?"
|
||||
```
|
||||
|
||||
### Write to a spreadsheet
|
||||
|
||||
```
|
||||
"Add a row to my 'Campaign Tracker' Google Sheet with today's LinkedIn Ads metrics"
|
||||
```
|
||||
|
||||
### Cross-tool workflow
|
||||
|
||||
```
|
||||
"Find Salesforce leads from this week and post a summary in Slack #new-leads"
|
||||
```
|
||||
|
||||
## Available Marketing Tools
|
||||
|
||||
See [marketing-tools.md](marketing-tools.md) for the full list of Composio toolkits mapped to marketing use cases.
|
||||
|
||||
Key tools with new MCP access (no native MCP server in this repo):
|
||||
- **HubSpot** — contacts, deals, companies, lists
|
||||
- **Salesforce** — SOQL queries, leads, opportunities
|
||||
- **Meta Ads** — campaigns, ad sets, insights
|
||||
- **LinkedIn Ads** — campaigns, analytics
|
||||
- **Google Sheets** — read, write, create spreadsheets
|
||||
- **Slack** — messages, channels
|
||||
- **Notion** — pages, databases
|
||||
- **Klaviyo** — profiles, lists, campaigns
|
||||
- **ActiveCampaign** — contacts, automations
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Tool not found" error
|
||||
|
||||
The tool may not be connected yet. Ask the agent to connect it, or run:
|
||||
|
||||
```bash
|
||||
npx composio apps list
|
||||
```
|
||||
|
||||
### Expired authentication
|
||||
|
||||
OAuth tokens expire. If a tool stops working, re-authenticate:
|
||||
|
||||
```bash
|
||||
npx composio connections list # Find the connection
|
||||
npx composio connections remove {id} # Remove it
|
||||
# Then ask the agent to use the tool again to trigger re-auth
|
||||
```
|
||||
|
||||
### Rate limit errors
|
||||
|
||||
Composio has its own rate limits (free: 20K calls/mo, 10 req/sec). If you hit them:
|
||||
- Reduce request frequency
|
||||
- Upgrade your Composio plan
|
||||
- Use native CLI tools for high-volume operations
|
||||
|
||||
### MCP server not appearing
|
||||
|
||||
Re-run the setup command:
|
||||
|
||||
```bash
|
||||
npx @composio/mcp@latest setup
|
||||
```
|
||||
|
||||
Then restart Claude Code.
|
||||
@@ -0,0 +1,91 @@
|
||||
# Composio Marketing Tools
|
||||
|
||||
Detailed mapping of Composio toolkits to marketing use cases. Organized by the same categories as [REGISTRY.md](../REGISTRY.md).
|
||||
|
||||
## CRM
|
||||
|
||||
| Composio Toolkit | Auth | Key Marketing Actions | Depth |
|
||||
|-----------------|------|----------------------|-------|
|
||||
| `HUBSPOT` | OAuth 2.0 | Get/create contacts, list deals by stage, get company info, manage lists, search contacts by property | Deep |
|
||||
| `SALESFORCE` | OAuth 2.0 | Run SOQL queries, get/create leads, list opportunities, get account details, update records | Deep |
|
||||
|
||||
## Email & SMS
|
||||
|
||||
| Composio Toolkit | Auth | Key Marketing Actions | Depth |
|
||||
|-----------------|------|----------------------|-------|
|
||||
| `ACTIVECAMPAIGN` | API Key | Get contacts, list automations, add contacts to lists, get campaign stats | Medium |
|
||||
| `KLAVIYO` | API Key | Get profiles, list segments, get campaign metrics, add to lists | Medium |
|
||||
| `MAILCHIMP` | OAuth 2.0 | Get audiences, list campaigns, get campaign reports, add subscribers | Deep |
|
||||
| `GMAIL` | OAuth 2.0 | Send emails, search inbox, read messages, manage labels | Deep |
|
||||
|
||||
## Advertising
|
||||
|
||||
| Composio Toolkit | Auth | Key Marketing Actions | Depth |
|
||||
|-----------------|------|----------------------|-------|
|
||||
| `FACEBOOKADS` | OAuth 2.0 | Get campaign insights, list ad sets, get ad performance, read audience data | Medium |
|
||||
| `LINKEDIN` | OAuth 2.0 | Get campaign analytics, list campaigns, get company page stats | Medium |
|
||||
| `GOOGLEADS` | OAuth 2.0 | Get campaign performance, list ad groups, keyword stats | Medium |
|
||||
|
||||
## Productivity & Collaboration
|
||||
|
||||
| Composio Toolkit | Auth | Key Marketing Actions | Depth |
|
||||
|-----------------|------|----------------------|-------|
|
||||
| `GOOGLESHEETS` | OAuth 2.0 | Read/write cells, create sheets, format ranges, append rows | Deep |
|
||||
| `SLACK` | OAuth 2.0 | Send messages, read channels, upload files, search messages | Deep |
|
||||
| `NOTION` | OAuth 2.0 | Read/create pages, query databases, update blocks, search | Deep |
|
||||
| `AIRTABLE` | OAuth 2.0 | List/create/update records, query views, manage tables | Deep |
|
||||
|
||||
## Commerce
|
||||
|
||||
| Composio Toolkit | Auth | Key Marketing Actions | Depth |
|
||||
|-----------------|------|----------------------|-------|
|
||||
| `SHOPIFY` | OAuth 2.0 | Get products, list orders, get customer data, inventory levels | Deep |
|
||||
|
||||
## Analytics
|
||||
|
||||
| Composio Toolkit | Auth | Key Marketing Actions | Depth |
|
||||
|-----------------|------|----------------------|-------|
|
||||
| `GOOGLEANALYTICS` | OAuth 2.0 | Run reports, get real-time data, list properties | Medium |
|
||||
|
||||
## Coverage Depth Guide
|
||||
|
||||
- **Deep** — 20+ actions, covers most common operations, suitable for daily use
|
||||
- **Medium** — 5-20 actions, covers core read operations and some writes
|
||||
- **Shallow** — Under 5 actions, basic read-only access
|
||||
|
||||
## Coverage vs. Native Tools
|
||||
|
||||
This table shows where Composio adds value compared to what's already in the MarketingSkills registry:
|
||||
|
||||
| Tool | Native MCP | Native CLI | Composio MCP | Recommendation |
|
||||
|------|:----------:|:----------:|:------------:|----------------|
|
||||
| HubSpot | - | ✓ | ✓ | **Use Composio** — adds MCP access |
|
||||
| Salesforce | - | ✓ | ✓ | **Use Composio** — adds MCP access |
|
||||
| Meta Ads | - | ✓ | ✓ | **Use Composio** — adds MCP access |
|
||||
| LinkedIn Ads | - | ✓ | ✓ | **Use Composio** — adds MCP access |
|
||||
| Google Sheets | - | - | ✓ | **Use Composio** — only MCP option |
|
||||
| Slack | - | - | ✓ | **Use Composio** — only MCP option |
|
||||
| Notion | - | - | ✓ | **Use Composio** — only MCP option |
|
||||
| Airtable | - | - | ✓ | **Use Composio** — only MCP option |
|
||||
| ActiveCampaign | - | ✓ | ✓ | **Use Composio** — adds MCP access |
|
||||
| Klaviyo | - | ✓ | ✓ | **Use Composio** — adds MCP access |
|
||||
| Shopify | - | ✓ | ✓ | **Use Composio** — adds MCP access |
|
||||
| Gmail | - | - | ✓ | **Use Composio** — only MCP option |
|
||||
| GA4 | ✓ | ✓ | ✓ | **Use native** — deeper coverage |
|
||||
| Stripe | ✓ | ✓ | ✓ | **Use native** — deeper coverage |
|
||||
| Mailchimp | ✓ | ✓ | ✓ | **Use native** — deeper coverage |
|
||||
| Google Ads | ✓ | ✓ | ✓ | **Use native** — deeper coverage |
|
||||
|
||||
## Toolkit Reference
|
||||
|
||||
Each Composio toolkit name maps to its `TOOL_NAME` identifier used in the Composio platform. When searching for available actions, use these exact names:
|
||||
|
||||
```bash
|
||||
# List all actions for a toolkit
|
||||
npx composio actions list --app HUBSPOT
|
||||
|
||||
# Search for specific actions
|
||||
npx composio actions list --app FACEBOOKADS --search "insights"
|
||||
```
|
||||
|
||||
For the full integration guide including setup, pricing, and limitations, see [composio.md](../integrations/composio.md).
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user