mirror of
https://github.com/boxpositron/absolute-dotfiles.git
synced 2026-10-24 08:23:19 +00:00
Compare commits
20 Commits
4290874f43
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3975a5b97d | |||
| 66d1d21011 | |||
| 5805f45358 | |||
| 161d205dfd | |||
| 721d7fbb0a | |||
| 786925b583 | |||
| dd90b462f5 | |||
| cd0ed704ab | |||
| 2c58626e0b | |||
| c9059d4867 | |||
| 46e7c8e04b | |||
| c155860ff1 | |||
| b2eca8e1a0 | |||
| adf62ac948 | |||
| d92041b6dd | |||
| 5fbdaa9810 | |||
| ea570af409 | |||
| 12f283e7c9 | |||
| cac5c1d036 | |||
| 0ec56aa8c5 |
+1
-1
Submodule .config/nvim updated: 13ddbe2f56...d24b3ba574
@@ -0,0 +1,27 @@
|
||||
// Enter is caught before the editor submits, where omo handles /quit, so :q never fires prompt hooks
|
||||
// such as UserPromptSubmit. ctx.shutdown() waits for the agent to go idle, so :q mid-turn quits after it.
|
||||
import type { ExtensionAPI } from "@code-yeongyu/senpi";
|
||||
import { Key, matchesKey } from "@earendil-works/pi-tui";
|
||||
|
||||
const QUIT_COMMANDS = new Set([":q", ":q!", ":qa", ":wq"]);
|
||||
|
||||
export default function (pi: ExtensionAPI) {
|
||||
let unsubscribe: (() => void) | undefined;
|
||||
|
||||
pi.on("session_start", (_event, ctx) => {
|
||||
unsubscribe?.();
|
||||
unsubscribe = ctx.ui.onTerminalInput((data) => {
|
||||
if (!matchesKey(data, Key.enter) || !QUIT_COMMANDS.has(ctx.ui.getEditorText().trim())) {
|
||||
return undefined;
|
||||
}
|
||||
ctx.ui.setEditorText("");
|
||||
ctx.shutdown();
|
||||
return { consume: true };
|
||||
});
|
||||
});
|
||||
|
||||
pi.on("session_shutdown", () => {
|
||||
unsubscribe?.();
|
||||
unsubscribe = undefined;
|
||||
});
|
||||
}
|
||||
@@ -3,7 +3,8 @@
|
||||
"UserPromptSubmit": [
|
||||
{
|
||||
"hooks": [
|
||||
{ "type": "command", "command": "~/.local/bin/omo-notify", "timeout": 10 }
|
||||
{ "type": "command", "command": "~/.local/bin/omo-notify", "timeout": 10 },
|
||||
{ "type": "command", "command": "~/.local/bin/owt hook", "timeout": 5 }
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"app.interrupt": "ctrl+g",
|
||||
"app.editor.external": "ctrl+q"
|
||||
}
|
||||
@@ -110,6 +110,33 @@
|
||||
"reasoning": "high",
|
||||
"prompt_append": "Before substantive UI work, load frontend-workflow. Follow the product's design context, keep one writer per file set, inspect actual desktop and mobile screenshots, exercise the primary interaction, and report verification evidence. Stop when acceptance criteria pass."
|
||||
},
|
||||
// impeccable critique. A = design-director review (taste, heuristics): Opus 5.5 has the top Design Arena
|
||||
// website Elo of the models we run (1339 vs Sonnet 5.5 1322, Fable 5.1 1318; GPT-6 unranked, Oct 2026).
|
||||
// B = detector + browser evidence (mechanical tool use): GPT-6.1 Sol, with a Claude fallback so B stays available.
|
||||
"design-critique-a": {
|
||||
"models": [
|
||||
{
|
||||
"model": "anthropic-subscription/claude-opus-5-5",
|
||||
"reasoning": "xhigh"
|
||||
},
|
||||
{
|
||||
"model": "anthropic-subscription/claude-fable-5-1",
|
||||
"reasoning": "xhigh"
|
||||
}
|
||||
]
|
||||
},
|
||||
"design-critique-b": {
|
||||
"models": [
|
||||
{
|
||||
"model": "chatgpt-subscription/gpt-6.1-sol",
|
||||
"reasoning": "high"
|
||||
},
|
||||
{
|
||||
"model": "anthropic-subscription/claude-sonnet-5-5",
|
||||
"reasoning": "high"
|
||||
}
|
||||
]
|
||||
},
|
||||
"writing": {
|
||||
"models": [
|
||||
{
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Analyze vault structure and organization
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Analyze Vault Structure
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
description: Design, critique, audit, or polish a frontend interface with the impeccable skill
|
||||
argument-hint: "[shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live|generate] [target]"
|
||||
requires-arguments: false
|
||||
---
|
||||
Read the impeccable skill at `~/.omo/agent/skills/impeccable/SKILL.md` and follow its `Setup` and `Commands` sections to handle: $ARGUMENTS
|
||||
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Ingest local documentation files to Obsidian vault
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Ingest Notes
|
||||
-2
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Preview which documentation files will be delegated to vault vs local
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Preview Notes Delegation
|
||||
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Reorganize vault with AI-assisted suggestions
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Reorganize Notes
|
||||
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Intelligently analyze and setup documentation architecture for the project
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Intelligent Documentation Setup
|
||||
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Bidirectionally sync documentation files between local project and Obsidian vault
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Sync Notes
|
||||
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Teleport documentation files from Obsidian vault to local project
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Teleport Notes
|
||||
-2
@@ -1,7 +1,5 @@
|
||||
---
|
||||
description: Validate .withcontextconfig.jsonc for errors and warnings
|
||||
agent: general
|
||||
subtask: true
|
||||
---
|
||||
|
||||
# Validate Notes Configuration
|
||||
@@ -0,0 +1,63 @@
|
||||
# Vendored agent skills
|
||||
|
||||
These skills are vendored copies, not submodules. `link-ai-configs.sh` links every
|
||||
directory here into `~/.omo/agent/skills/`, and all of them except
|
||||
`frontend-workflow` into `~/.claude/skills/`, so OmO and Claude Code read one
|
||||
canonical source instead of divergent copies.
|
||||
|
||||
They moved here from `.config/opencode/skills/` when OpenCode was retired; the
|
||||
OpenCode-era evaluation notes and rollback steps are in git history at
|
||||
`.config/opencode/README.md`.
|
||||
|
||||
## Provenance
|
||||
|
||||
| Skill | Upstream | Revision | License |
|
||||
|---|---|---|---|
|
||||
| `impeccable` | [pbakaus/impeccable](https://github.com/pbakaus/impeccable) (`.opencode` integration, tag `skill-v4.6.0`, engine 0.1.15) | `8a0e198da34ebc5b936a9d5975fb7a3b1cf353b7` | Apache 2.0, included |
|
||||
| `web-design-guidelines` | [vercel-labs/agent-skills](https://github.com/vercel-labs/agent-skills) (`skills/web-design-guidelines/SKILL.md`) | `063bee94c3f4df8453406c830b0a7df0f2860278` | per upstream |
|
||||
| ten marketing and copy skills | [coreyhaines31/marketingskills](https://github.com/coreyhaines31/marketingskills) (`skills/`) | `b9ba399dd88b082b926e261e8ccfb843d20aa066` | MIT, copied into each skill |
|
||||
| `frontend-workflow` | local | - | - |
|
||||
| `sound-design` | local | - | - |
|
||||
|
||||
The ten marketing skills are `product-marketing`, `copywriting`, `copy-editing`,
|
||||
`emails`, `cold-email`, `content-strategy`, `seo-audit`, `ai-seo`, `launch` and
|
||||
`social`.
|
||||
|
||||
## Local modifications
|
||||
|
||||
- **`impeccable`**: every `.opencode/skills/impeccable/scripts/impeccable` command
|
||||
path was rewritten to `~/.omo/agent/skills/impeccable/scripts/impeccable`,
|
||||
including the `allowed-tools` Bash entry and the base-directory fallback in
|
||||
`SKILL.md`. Without this the detector and live-server verbs do not resolve under
|
||||
OmO. `reference/critique.md` also carries an OmO routing line that sends
|
||||
Assessment A to the `design-critique-a` category and Assessment B to
|
||||
`design-critique-b` (defined in `.config/omo/omo.jsonc`). `LICENSE` comes from the
|
||||
upstream repository root, because the `.opencode` directory ships without one. The
|
||||
engine binary is not vendored: on first run, `scripts/impeccable` downloads the
|
||||
version named in `scripts/VERSION` into `~/.impeccable/bin/<version>/` and checks it
|
||||
against the published checksum.
|
||||
- **`web-design-guidelines`**: unchanged. It fetches the current
|
||||
[Web Interface Guidelines](https://raw.githubusercontent.com/vercel-labs/web-interface-guidelines/main/command.md)
|
||||
when invoked, so its rule feed is intentionally not pinned.
|
||||
- **marketing skills**: unchanged. They read a per-project
|
||||
`.agents/product-marketing.md` for product context, and a project's own copy
|
||||
skill overrides their generic direct-response advice. Links to the upstream
|
||||
repo's top-level `tools/` directory were not vendored and resolve to nothing.
|
||||
|
||||
## Upgrading
|
||||
|
||||
Re-copy the same directories from a newer upstream revision, update the revision
|
||||
in the table above, then re-apply the local modifications listed for that skill
|
||||
and rerun `link-ai-configs.sh`. For `impeccable`, re-apply the path rewrite:
|
||||
|
||||
```bash
|
||||
cd .config/omo/skills/impeccable
|
||||
rg -l -F '.opencode/skills/impeccable/scripts' . \
|
||||
| xargs sed -i '' 's#\.opencode/skills/impeccable/scripts#~/.omo/agent/skills/impeccable/scripts#g'
|
||||
```
|
||||
|
||||
This pattern also covers the base-directory fallback in `SKILL.md`, which ends at
|
||||
`scripts` rather than `scripts/impeccable`. Keep `LICENSE` when re-copying (for
|
||||
example `rsync -a --delete --exclude LICENSE <upstream>/.opencode/skills/impeccable/ .`),
|
||||
and re-add the OmO routing line after the "Delegate Assessment A and Assessment B"
|
||||
paragraph in `reference/critique.md`.
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Corey Haines
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,487 @@
|
||||
---
|
||||
name: ai-seo
|
||||
description: "When the user wants to optimize content for AI search engines, get cited by LLMs, or appear in AI-generated answers. Also use when the user mentions 'AI SEO,' 'AEO,' 'GEO,' 'LLMO,' 'answer engine optimization,' 'generative engine optimization,' 'LLM optimization,' 'AI Overviews,' 'optimize for ChatGPT,' 'optimize for Perplexity,' 'AI citations,' 'AI visibility,' 'zero-click search,' 'how do I show up in AI answers,' 'LLM mentions,' 'optimize for Claude/Gemini,' 'llms.txt,' 'llms-full.txt,' 'OKF,' 'Open Knowledge Format,' 'knowledge bundle,' 'agent-readable site,' 'agent readiness,' 'is my site agent-ready,' 'WebMCP,' 'do listicles still work for AI,' 'ChatGPT stopped citing comparison pages,' 'how do LLMs see our brand,' 'LinkedIn for AEO,' or 'AI citation format shift.' 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."
|
||||
metadata:
|
||||
version: 2.7.4
|
||||
---
|
||||
|
||||
# AI SEO
|
||||
|
||||
You are an expert in AI search optimization — the practice of making content discoverable, extractable, and citable by AI systems including Google AI Overviews, ChatGPT, Perplexity, Claude, Gemini, and Copilot. Your goal is to help users get their content cited as a source in AI-generated answers.
|
||||
|
||||
## Before Starting
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Gather this context (ask if not provided):
|
||||
|
||||
### 1. Current AI Visibility
|
||||
- Do you know if your brand appears in AI-generated answers today?
|
||||
- Have you checked ChatGPT, Perplexity, or Google AI Overviews for your key queries?
|
||||
- What queries matter most to your business?
|
||||
|
||||
### 2. Content & Domain
|
||||
- What type of content do you produce? (Blog, docs, comparisons, product pages)
|
||||
- What's your domain authority / traditional SEO strength?
|
||||
- Do you have existing structured data (schema markup)?
|
||||
|
||||
### 3. Goals
|
||||
- Get cited as a source in AI answers?
|
||||
- Appear in Google AI Overviews for specific queries?
|
||||
- Compete with specific brands already getting cited?
|
||||
- Optimize existing content or create new AI-optimized content?
|
||||
|
||||
### 4. Competitive Landscape
|
||||
- Who are your top competitors in AI search results?
|
||||
- Are they being cited where you're not?
|
||||
|
||||
---
|
||||
|
||||
## How AI Search Works
|
||||
|
||||
### The AI Search Landscape
|
||||
|
||||
| Platform | How It Works | Source Selection |
|
||||
|----------|-------------|----------------|
|
||||
| **Google AI Overviews** | Summarizes top-ranking pages | Strong correlation with traditional rankings |
|
||||
| **ChatGPT (with search)** | Searches web, cites sources | Draws from wider range, not just top-ranked |
|
||||
| **Perplexity** | Always cites sources with links | Favors authoritative, recent, well-structured content |
|
||||
| **Gemini** | Google's AI assistant | Pulls from Google index + Knowledge Graph |
|
||||
| **Copilot** | Bing-powered AI search | Bing index + authoritative sources |
|
||||
| **Claude** | Brave Search (when enabled) | Training data + Brave search results |
|
||||
|
||||
For a deep dive on how each platform selects sources and what to optimize per platform, see [references/platform-ranking-factors.md](references/platform-ranking-factors.md).
|
||||
|
||||
### Key Difference from Traditional SEO
|
||||
|
||||
Traditional SEO gets you ranked. AI SEO gets you **cited**.
|
||||
|
||||
In traditional search, you need to rank on page 1. In AI search, a well-structured page can get cited even if it ranks on page 2 or 3 — AI systems select sources based on content quality, structure, and relevance, not just rank position. Strong organic rankings are still one of the best predictors of AI visibility, so treat structure as a layer on top of SEO, not a replacement.
|
||||
|
||||
**Critical stats** (they drift; re-check before quoting to a client, and distrust vendor stats with no source or date):
|
||||
- AI Overviews appeared on ~45% of the keywords BrightEdge tracks, and position-one desktop CTR fell ~58% when one was present (Ahrefs, Dec 2025 data). Both are sample-specific, so don't forecast a site's traffic loss from them
|
||||
- Adding statistics and citations raised visibility by roughly 30–40% in the original GEO study (Aggarwal et al., 2023)
|
||||
|
||||
### Google's Official Stance vs. Multi-Platform Reality
|
||||
|
||||
This is important to read once before doing anything else.
|
||||
|
||||
**Google's position** ([AI features optimization guide](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)):
|
||||
> "The best practices for SEO continue to be relevant because our generative AI features on Google Search are rooted in our core Search ranking and quality systems."
|
||||
|
||||
Google explicitly says:
|
||||
- **No special markup or files are required** for AI Overviews or AI Mode
|
||||
- **Don't chunk content for AI** — write for people, organize with normal headings and paragraphs
|
||||
- **Don't write separate content for AI** — that risks "scaled content abuse" spam policy
|
||||
- **Helpful, reliable, people-first content** wins — same E-E-A-T standards as regular Search
|
||||
- **No AI-specific Search Console reporting** — use standard SEO metrics
|
||||
|
||||
**Other AI engines (ChatGPT, Claude, Perplexity, Copilot) behave differently:**
|
||||
- They actively reward extractable structure — passages, FAQs, comparison tables, definition blocks
|
||||
- They parse `llms.txt`, structured pricing pages, and machine-readable files when present
|
||||
- They cite third-party sources (Reddit, Wikipedia, review sites) more heavily than top-ranked pages
|
||||
|
||||
**What this means for the work:**
|
||||
- The structural patterns in this skill (40–60 word answer blocks, FAQ schema, comparison tables) help **non-Google AI engines** materially. They also don't hurt Google — they're just normal good content organization.
|
||||
- For Google AI Overviews / AI Mode specifically: optimize for people and core Search, full stop. Strong E-E-A-T, original information, semantic HTML, clean indexability.
|
||||
- For ChatGPT/Claude/Perplexity: layer on the extractable structure + llms.txt + machine-readable files.
|
||||
|
||||
When in doubt, default to "write for people, organize for clarity" — that satisfies both camps.
|
||||
|
||||
### Query Fan-Out (Google AI Search)
|
||||
|
||||
Google's AI features don't just answer the one query a user typed — they generate **concurrent, related queries** under the hood and retrieve results for each.
|
||||
|
||||
Google's own example: a user asking "how to fix lawns" triggers fan-out queries about herbicides, chemical-free removal, weed prevention, etc. The AI synthesizes across all of them.
|
||||
|
||||
**Implications:**
|
||||
- Single-page-per-keyword targeting is less effective. Cover the **full topical cluster** so you're retrievable for the fan-out variants too.
|
||||
- Long-tail intent matters less than topical authority — Google's AI systems understand synonyms and semantic equivalence.
|
||||
- A page that comprehensively answers a parent topic (with sub-questions covered) will be retrieved more often than narrow per-query pages.
|
||||
|
||||
**Action**: when planning content, brainstorm the 5–10 related queries the AI is likely to fan out to and make sure your content (or your site as a whole) covers them.
|
||||
|
||||
ChatGPT fans out too — and you can extract its *literal* background queries for your niche via DevTools (method in [references/format-volatility.md](references/format-volatility.md)). Post-5.6, ChatGPT's fan-outs shifted away from "best/vs/top" modifiers toward `site:` and "official" searches — use the extraction to see where your category's fan-outs stand today.
|
||||
|
||||
---
|
||||
|
||||
## AI Visibility Audit
|
||||
|
||||
Before optimizing, assess your current AI search presence.
|
||||
|
||||
### Step 1: Check AI Answers for Your Key Queries
|
||||
|
||||
Test 10-20 of your most important queries across platforms:
|
||||
|
||||
| Query | Google AI Overview | ChatGPT | Perplexity | You Cited? | Competitors Cited? |
|
||||
|-------|:-----------------:|:-------:|:----------:|:----------:|:-----------------:|
|
||||
| [query 1] | Yes/No | Yes/No | Yes/No | Yes/No | [who] |
|
||||
| [query 2] | Yes/No | Yes/No | Yes/No | Yes/No | [who] |
|
||||
|
||||
**Query types to test**, spread across buyer awareness stages and written the way people actually type into a chat box:
|
||||
- Problem-aware: "How do I [problem your product solves]?"
|
||||
- Solution-aware: "What is [your product category]?" / "Best [category] for [use case]"
|
||||
- Product-aware: "[Your brand] vs [competitor]" / "Is [your brand] good for [use case]?"
|
||||
- Most aware: "[Your brand] pricing" / "Does [your brand] integrate with [tool]?"
|
||||
|
||||
Keep the list to prompts that would change revenue. A citation for a glossary question ("what is gross profit?") rarely sells anything. Track prompts like keywords: collapse wording variants of the same intent into one core prompt, then run each several times.
|
||||
|
||||
### Step 2: Analyze Citation Patterns
|
||||
|
||||
When your competitors get cited and you don't, examine:
|
||||
- **Content structure** — Is their content more extractable?
|
||||
- **Authority signals** — Do they have more citations, stats, expert quotes?
|
||||
- **Freshness** — Is their content more recently updated?
|
||||
- **Schema markup** — Do they have structured data you're missing?
|
||||
- **Third-party presence** — Are they cited via Wikipedia, Reddit, review sites?
|
||||
|
||||
**Turn findings into work.** If an assistant states something wrong or vague about you, the page that should state that fact isn't saying it plainly; fix that page first. If you're absent, the sources it cites for the prompt are your target list for PR, review sites, and directories.
|
||||
|
||||
### Step 3: Content Extractability Check
|
||||
|
||||
For each priority page, verify:
|
||||
|
||||
| Check | Pass/Fail |
|
||||
|-------|-----------|
|
||||
| Clear definition in first paragraph? | |
|
||||
| Self-contained answer blocks (work without surrounding context)? | |
|
||||
| Statistics with sources cited? | |
|
||||
| Comparison tables for "[X] vs [Y]" queries? | |
|
||||
| FAQ section with natural-language questions? | |
|
||||
| Schema markup (FAQ, HowTo, Article, Product)? | |
|
||||
| Expert attribution (author name, credentials)? | |
|
||||
| Recently updated (within 6 months)? | |
|
||||
| Heading structure matches query patterns? | |
|
||||
| AI crawler policy matches discovery and training goals? | |
|
||||
|
||||
### Step 4: AI Bot Access Check
|
||||
|
||||
Audit AI user agents by purpose. Search-discovery, user-triggered retrieval, model-training, and product-control tokens are not interchangeable:
|
||||
|
||||
- **Search discovery:** `OAI-SearchBot` (ChatGPT), `PerplexityBot`, `Claude-SearchBot`, and the conventional search crawlers that feed an answer product
|
||||
- **User-triggered retrieval:** `ChatGPT-User`, `Claude-User`, and `Perplexity-User`; vendor handling can differ from automatic crawlers, so verify the current documentation
|
||||
- **Potential model training:** `GPTBot` and `ClaudeBot`
|
||||
- **Google product control:** `Google-Extended` controls certain Gemini training and grounding uses of content Google already crawls; it does not affect Google Search inclusion or ranking
|
||||
|
||||
Check each relevant user-agent group and any WAF or CDN rules separately. A publisher can allow search discovery while disallowing model-development crawlers; do not infer that blocking a training crawler necessarily blocks citations.
|
||||
|
||||
See [references/platform-ranking-factors.md](references/platform-ranking-factors.md) for the full robots.txt configuration.
|
||||
|
||||
---
|
||||
|
||||
## Optimization Strategy
|
||||
|
||||
### The Three Pillars
|
||||
|
||||
```
|
||||
1. Structure (make it extractable)
|
||||
2. Authority (make it citable)
|
||||
3. Presence (be where AI looks)
|
||||
```
|
||||
|
||||
### Pillar 1: Structure — Make Content Extractable
|
||||
|
||||
AI systems extract passages, not pages. Every key claim should work as a standalone statement.
|
||||
|
||||
**Content block patterns:**
|
||||
- **Definition blocks** for "What is X?" queries
|
||||
- **Step-by-step blocks** for "How to X" queries
|
||||
- **Comparison tables** for "X vs Y" queries
|
||||
- **Pros/cons blocks** for evaluation queries
|
||||
- **FAQ blocks** for common questions
|
||||
- **Statistic blocks** with cited sources
|
||||
|
||||
For detailed templates for each block type, see [references/content-patterns.md](references/content-patterns.md).
|
||||
|
||||
**Structural rules:**
|
||||
- Lead every section with a direct answer (don't bury it)
|
||||
- Keep key answer passages to 40-60 words (optimal for snippet extraction)
|
||||
- Use H2/H3 headings that match how people phrase queries
|
||||
- Tables beat prose for comparison content
|
||||
- Numbered lists beat paragraphs for process content
|
||||
- Each paragraph should convey one clear idea
|
||||
|
||||
### Pillar 2: Authority — Make Content Citable
|
||||
|
||||
AI systems prefer sources they can trust. Build citation-worthiness.
|
||||
|
||||
**The Princeton GEO research** (KDD 2024, studied across Perplexity.ai) ranked 9 optimization methods:
|
||||
|
||||
| Method | Visibility Boost | How to Apply |
|
||||
|--------|:---------------:|--------------|
|
||||
| **Cite sources** | +40% | Add authoritative references with links |
|
||||
| **Add statistics** | +37% | Include specific numbers with sources |
|
||||
| **Add quotations** | +30% | Expert quotes with name and title |
|
||||
| **Authoritative tone** | +25% | Write with demonstrated expertise |
|
||||
| **Improve clarity** | +20% | Simplify complex concepts |
|
||||
| **Technical terms** | +18% | Use domain-specific terminology |
|
||||
| **Unique vocabulary** | +15% | Increase word diversity |
|
||||
| **Fluency optimization** | +15-30% | Improve readability and flow |
|
||||
| ~~Keyword stuffing~~ | **-10%** | **Actively hurts AI visibility** |
|
||||
|
||||
**Best combination:** Fluency + Statistics = maximum boost. Low-ranking sites benefit even more — up to 115% visibility increase with citations.
|
||||
|
||||
**Statistics and data** (+37-40% citation boost)
|
||||
- Include specific numbers with sources
|
||||
- Cite original research, not summaries of research
|
||||
- Add dates to all statistics
|
||||
- Original data beats aggregated data
|
||||
|
||||
**Expert attribution** (+25-30% citation boost)
|
||||
- Named authors with credentials
|
||||
- Expert quotes with titles and organizations
|
||||
- "According to [Source]" framing for claims
|
||||
- Author bios with relevant expertise
|
||||
|
||||
**Freshness signals**
|
||||
- "Last updated: [date]" prominently displayed
|
||||
- Regular content refreshes (quarterly minimum for competitive topics)
|
||||
- Current year references and recent statistics
|
||||
- Remove or update outdated information
|
||||
|
||||
**E-E-A-T alignment**
|
||||
- First-hand experience demonstrated
|
||||
- Specific, detailed information (not generic)
|
||||
- Transparent sourcing and methodology
|
||||
- Clear author expertise for the topic
|
||||
|
||||
### Pillar 3: Presence — Be Where AI Looks
|
||||
|
||||
AI systems don't just cite your website — they cite where you appear.
|
||||
|
||||
**Third-party sources matter more than your own site:**
|
||||
- Wikipedia mentions (7.8% of all ChatGPT citations)
|
||||
- Reddit discussions (volatile: ~1.8% of ChatGPT citations historically, but nearly wiped from ChatGPT by Aug 2026 retrieval changes — still retrieved elsewhere; see the volatility section in [references/agent-readiness.md](references/agent-readiness.md))
|
||||
- Industry publications and guest posts
|
||||
- LinkedIn — among the most-cited domains for professional queries, but which surface gets cited depends on the engine (ChatGPT now favors posts over articles; Gemini barely cites LinkedIn). Front-load the target phrase, since a post's first words become its URL slug. See [references/linkedin-ai-citations.md](references/linkedin-ai-citations.md)
|
||||
- Review sites (G2, Capterra, TrustRadius for B2B SaaS)
|
||||
- YouTube (frequently cited by Google AI Overviews)
|
||||
- Podcasts (episodes get transcribed, show notes published — both get crawled and cited)
|
||||
- Quora answers
|
||||
|
||||
**Actions:**
|
||||
- Ensure your Wikipedia page is accurate and current
|
||||
- Participate authentically in Reddit communities — but as one surface in a portfolio, never the whole strategy (citation mixes shift overnight with retrieval updates)
|
||||
- Get featured in industry roundups and comparison articles
|
||||
- Make every third-party profile (G2, Capterra, Gartner, Crunchbase, LinkedIn) describe you with the same segment and positioning as your About page; models look for consensus. For repositioning, mergers, and head terms, see [references/positioning-and-consensus.md](references/positioning-and-consensus.md)
|
||||
- Create YouTube content for key how-to queries — models don't watch the video, they read the text layer around it; see [references/youtube-ai-citations.md](references/youtube-ai-citations.md) for the full anatomy (transcript, captions, chapters, description, pinned comment)
|
||||
- Guest on podcasts in your category (prep with the public-relations skill's podcast guest prep)
|
||||
- Answer relevant Quora questions with depth
|
||||
|
||||
### Machine-Readable Files for AI Agents
|
||||
|
||||
> **Google's stance**: not required for AI Overviews or AI Mode. Their guide explicitly says you don't need new markup, AI files, or markdown to appear in generative AI search.
|
||||
>
|
||||
> **Why include them anyway**: non-Google AI engines (ChatGPT, Claude, Perplexity) and autonomous buying agents do reward extractable structure. The files below help with those engines without harming Google.
|
||||
|
||||
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.
|
||||
|
||||
**Audit this layer first**: [references/agent-readiness.md](references/agent-readiness.md) — the access/discovery/parseability checklist, free scoring tools (`npx is-agentic`, Frase's checker), Markdown content negotiation + `Link` headers, `llms-full.txt`, and the emerging agent-*actionable* layer (WebMCP).
|
||||
|
||||
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).
|
||||
|
||||
**`/okf/` — Open Knowledge Format bundle (Google-backed, v0.1)**
|
||||
|
||||
Google [introduced OKF](https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing) in June 2026 — a markdown spec for representing site content as a directory of cross-linked files with YAML frontmatter, agent-readable without scraping. Built primarily for data-team catalog metadata; the site-readable-by-agents repurposing was popularized by Suganthan Mohanadasan. No confirmed AI-search ranking signal today — treat it as protocol-layer registration like early schema.org. **For the full breakdown, implementation paths (free generator, WordPress plugin, by-hand), hosting guidance, and when to skip, see [references/okf.md](references/okf.md).**
|
||||
|
||||
### Schema Markup for AI
|
||||
|
||||
Structured data helps AI systems understand your content. Key schemas:
|
||||
|
||||
| Content Type | Schema | Why It Helps |
|
||||
|-------------|--------|-------------|
|
||||
| Articles/Blog posts | `Article`, `BlogPosting` | Author, date, topic identification |
|
||||
| How-to content | `HowTo` | Step extraction for process queries |
|
||||
| FAQs | `FAQPage` | Direct Q&A extraction |
|
||||
| Products | `Product` | Pricing, features, reviews |
|
||||
| Comparisons | `ItemList` | Structured comparison data |
|
||||
| Reviews | `Review`, `AggregateRating` | Trust signals |
|
||||
| Organization | `Organization` | Entity recognition |
|
||||
|
||||
Content with proper schema shows 30-40% higher AI visibility on non-Google AI engines. **Google's note**: structured data is "not required for generative AI search" but is recommended for overall SEO strategy. For implementation, use the **schema** skill.
|
||||
|
||||
---
|
||||
|
||||
## Agentic Experiences
|
||||
|
||||
Beyond AI search engines summarizing content, autonomous agents are starting to access sites directly — clicking, reading, comparing, even buying on behalf of users. Google's guide flags this as an emerging category to plan for.
|
||||
|
||||
**How agents access your site:**
|
||||
- **Visual rendering** — they screenshot/read the page like a user would
|
||||
- **DOM inspection** — they parse the page's HTML structure
|
||||
- **Accessibility tree** — they rely on the same semantic information assistive tech uses (labels, roles, landmarks, headings)
|
||||
|
||||
**What to do:**
|
||||
- **Render meaningful content without heavy JS gymnastics** — if the page is blank until 4 frameworks finish loading, agents see blank
|
||||
- **Semantic HTML** — use `<main>`, `<nav>`, `<article>`, `<button>`, proper heading hierarchy, `alt` text on images
|
||||
- **Clean accessibility tree** — every interactive element labelled; ARIA used correctly (or not at all when native HTML suffices)
|
||||
- **Stable selectors / predictable layouts** — agents struggle with sites that re-render every interaction
|
||||
- **Visible pricing, specs, contact info** — anything an agent would need to make a buying recommendation should be on a public, indexable page (this is where `/pricing.md` and similar files help)
|
||||
|
||||
**Emerging — Universal Commerce Protocol (UCP):**
|
||||
Google references UCP as a forthcoming protocol that will give agents standardized hooks for commerce interactions (catalog discovery, pricing, checkout). Watch for adoption; for now, the structural recommendations above are the precursor.
|
||||
|
||||
For ecom and local business specifically, Google highlights:
|
||||
- **Merchant Center feeds** + **Google Business Profile** for product/service visibility in AI Search
|
||||
- **Business Agent** for conversational customer engagement (where applicable)
|
||||
|
||||
---
|
||||
|
||||
## Content Types That Get Cited Most
|
||||
|
||||
Not all content is equally citable — and the format mix is **volatile**. The long-standing baseline had comparison articles (~33%) and listicles (~10%) among the top citation earners, but **ChatGPT 5.6 (Aug 2026) demoted the exploited formats: listicle citations fell −50.5% and comparison-page citations −32.1%, while `site:` and "official" retrieval surged** — a shift toward primary sources and owned pages. Format strategy is now per-platform (comparisons still work on Google AIO/Gemini/Perplexity). See [references/format-volatility.md](references/format-volatility.md) for the shift data, the per-platform format table, LinkedIn's citation numbers, and the ChatGPT fan-out extraction diagnostic.
|
||||
|
||||
**Evergreen winners across platforms:** original research and data, definitive guides, and owned "official" pages — product, docs, pricing — with extractable structure.
|
||||
|
||||
**Underperformers:** generic unstructured posts, thin or gated or PDF-only content, and anything undated without author attribution.
|
||||
|
||||
**Citation ≠ recommendation.** Getting cited means your content was useful to consult; getting *recommended* — onto the buyer's actual shortlist — is governed by web-wide consensus (reviews, forums, analysts, press) and is largely independent of your own content. Self-promotional "best [category]" listicles can even backfire for emerging brands: in one 100-query B2B study, 69% of the AI Overview citations that self-promotional listicles earned came in answers that recommended competitors instead of the publishing brand. See [references/citations-vs-recommendations.md](references/citations-vs-recommendations.md) for the visibility ladder (retrieved → cited → mentioned → recommended), stage-dependent buyer's-guide strategy, what earns recommendations, and the attribution blind spot.
|
||||
|
||||
---
|
||||
|
||||
## Monitoring AI Visibility
|
||||
|
||||
### What to Track
|
||||
|
||||
| Metric | What It Measures | How to Check |
|
||||
|--------|-----------------|-------------|
|
||||
| AI Overview presence | Do AI Overviews appear for your queries? | Manual check or Semrush/Ahrefs |
|
||||
| Brand citation rate | How often you're cited in AI answers | AI visibility tools (see below) |
|
||||
| Share of AI voice | Your citations vs. competitors | Peec AI, Otterly, ZipTie |
|
||||
| Citation sentiment | How AI describes your brand | Manual review + monitoring tools |
|
||||
| Recommendation rate | Whether you're on the shortlist, not just cited (see [citations-vs-recommendations.md](references/citations-vs-recommendations.md)) | Prompt tracking + mention framing |
|
||||
| Source attribution | Which of your pages get cited | Track referral traffic from AI sources |
|
||||
|
||||
### AI Visibility Monitoring Tools
|
||||
|
||||
| Tool | Coverage | Best For |
|
||||
|------|----------|----------|
|
||||
| **Otterly AI** | ChatGPT, Perplexity, Google AI Overviews | Share of AI voice tracking |
|
||||
| **Peec AI** | ChatGPT, Gemini, Perplexity, Claude, Copilot+ | Multi-platform monitoring at scale |
|
||||
| **ZipTie** | Google AI Overviews, ChatGPT, Perplexity | Brand mention + sentiment tracking |
|
||||
| **LLMrefs** | ChatGPT, Perplexity, AI Overviews, Gemini | SEO keyword → AI visibility mapping |
|
||||
|
||||
### DIY Monitoring (No Tools)
|
||||
|
||||
Monthly manual check:
|
||||
1. Pick your top 20 queries
|
||||
2. Run each through ChatGPT, Perplexity, and Google
|
||||
3. Record: Are you cited? Who is? What page?
|
||||
4. Log in a spreadsheet, track month-over-month
|
||||
|
||||
AI answers are **non-deterministic** — one run is an anecdote, not a measurement. Run each query 3–5 times per platform and track the mention *rate* with its sample size ("cited 3/5, n=5"), comparing rates over time rather than single runs. Full rigor checklist in [references/format-volatility.md](references/format-volatility.md).
|
||||
|
||||
### Search Console expectations
|
||||
|
||||
Google's guide is explicit: **there is no AI-specific Search Console reporting**. AI Overviews and AI Mode use core Search ranking, so the standard Search Console reports (Performance, Coverage, Core Web Vitals) are still what you measure with for Google. The third-party tools above are the only way to see cross-platform AI citation behavior.
|
||||
|
||||
---
|
||||
|
||||
## What NOT to Do
|
||||
|
||||
Google's guide calls these out explicitly — they hurt across both traditional Search and AI features.
|
||||
|
||||
1. **Write separate content "for AI"**. Same content should serve people and AI. Writing variants targeted at AI systems risks the **scaled content abuse spam policy** — Google's words.
|
||||
2. **Chunk pages into AI-bait fragments**. Google's guide is direct: *"Don't break your content into tiny pieces for AI to better understand it."* Use normal paragraph + heading structure.
|
||||
3. **Generate at scale for ranking manipulation**. AI-generated content is fine *if* it meets Search Essentials and spam policies. Mass-producing thin variations does not.
|
||||
4. **Pursue inauthentic mentions**. Don't fabricate citations, invent awards, run "independent" review sites you own, or bulk-spam Reddit/Wikipedia for AI visibility. Fake or misleadingly sourced reviews can also break the FTC's 2024 reviews rule. Real participation only.
|
||||
5. **Treat every AI user agent as the same control**. `GPTBot`, `ClaudeBot`, and `Google-Extended` have different documented purposes from `OAI-SearchBot`, `Claude-SearchBot`, and `PerplexityBot`. Decide separately for discovery, user retrieval, training, and grounding.
|
||||
6. **Hide your main content behind JS that doesn't render**. Both core Search and AI agents need to see your content; JS-only rendering loses both audiences.
|
||||
7. **Skip E-E-A-T fundamentals**. Author identity, first-hand experience, expertise signals, transparent sourcing — Google's guide leans heavily on these for AI features.
|
||||
|
||||
---
|
||||
|
||||
## AI SEO by Content Type
|
||||
|
||||
For tactical guidance on SaaS product pages, blog content, comparison/alternative pages, documentation, and local/ecom (Google's emphasis on Merchant Center + Business Profile), see [references/content-types.md](references/content-types.md).
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
- **Ignoring AI search entirely** — ~45% of Google searches now show AI Overviews, and ChatGPT/Perplexity are growing fast
|
||||
- **Treating AI SEO as separate from SEO** — Good traditional SEO is the foundation; AI SEO adds structure and authority on top
|
||||
- **Writing for AI, not humans** — If content reads like it was written to game an algorithm, it won't get cited or convert
|
||||
- **No freshness signals** — Undated content loses to dated content 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 discovery crawlers without checking their purpose** — Restricting `OAI-SearchBot`, `PerplexityBot`, or `Claude-SearchBot` may reduce search visibility; training controls are separate
|
||||
- **Generic content without data** — "We're the best" won't get cited. "Our customers see 3x improvement in [metric]" will
|
||||
- **Forgetting to monitor** — You can't improve what you don't measure. Check AI visibility monthly at minimum
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For implementation, see the [tools registry](https://github.com/coreyhaines31/marketingskills/blob/main/tools/REGISTRY.md).
|
||||
|
||||
| Tool | Use For |
|
||||
|------|---------|
|
||||
| `semrush` | AI Overview tracking, keyword research, content gap analysis |
|
||||
| `ahrefs` | Backlink analysis, content explorer, AI Overview data |
|
||||
| `gsc` | Search Console performance data, query tracking |
|
||||
| `ga4` | Referral traffic from AI sources |
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What are your top 10-20 most important queries?
|
||||
2. Have you checked if AI answers exist for those queries today?
|
||||
3. Do you have structured data (schema markup) on your site?
|
||||
4. What content types do you publish? (Blog, docs, comparisons, etc.)
|
||||
5. Are competitors being cited by AI where you're not?
|
||||
6. Do you have a Wikipedia page or presence on review sites?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **seo-audit**: For traditional technical and on-page SEO audits
|
||||
- **schema**: For implementing structured data that helps AI understand your content
|
||||
- **content-strategy**: For planning what content to create
|
||||
- **competitors**: For building comparison pages that get cited
|
||||
- **programmatic-seo**: For building SEO pages at scale
|
||||
- **copywriting**: For writing content that's both human-readable and AI-extractable
|
||||
@@ -0,0 +1,163 @@
|
||||
{
|
||||
"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.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.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 crawler-access question directly and separate controls by purpose. GPTBot and ClaudeBot are potential model-training crawlers; blocking them is a training opt-out and does not by itself block search citations. PerplexityBot, OAI-SearchBot, and Claude-SearchBot support automatic search discovery, so blocking them may reduce visibility. ChatGPT-User, Claude-User, and Perplexity-User support user-triggered retrieval and may have vendor-specific robots behavior. Google-Extended controls certain Gemini training and grounding uses and does not affect Google Search inclusion or ranking. Should provide a purpose-specific robots.txt example and recommend verifying current vendor documentation before implementation.",
|
||||
"assertions": [
|
||||
"Addresses the blocking tradeoff directly",
|
||||
"Distinguishes search discovery from model-training controls",
|
||||
"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": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"prompt": "We're a seed-stage data-quality startup (barely anyone knows us yet). Plan: publish 20 'best data quality tools' style listicles ranking ourselves #1 so ChatGPT and AI Overviews recommend us. Good idea?",
|
||||
"expected_output": "Should apply references/citations-vs-recommendations.md rather than endorsing the plan as-is. Should explain the citation vs. recommendation distinction — self-promotional listicles from low-authority brands often earn citations while the AI answer recommends the competitors named in the guide instead (cites the study directionally: ~69% of self-promotional listicle citations — 224 of 323 — excluded the publisher from recommendations). Should present the visibility ladder (retrieved → cited → mentioned → recommended) and explain recommendation is governed by offsite consensus (reviews, forums, analysts, press). Should NOT say 'don't publish guides' — should reframe: publish a small number of genuinely useful guides for category framing, and rebalance investment toward reviews/communities/earned media. Should mention the attribution blind spot (AI-influenced visits mostly appear as branded search/direct; only a small share is visible AI traffic) and the measurement triad (prompt tracking, self-reported attribution, call recordings).",
|
||||
"assertions": [
|
||||
"Does not endorse 20 self-ranked listicles as a path to AI recommendations for a low-authority brand",
|
||||
"Distinguishes citations from recommendations with the different governing criteria",
|
||||
"References the visibility ladder (retrieved/cited/mentioned/recommended)",
|
||||
"Warns the guides may surface competitors in AI answers (vote-for-competitors mechanism)",
|
||||
"Recommends offsite consensus building (reviews, communities, analysts, or PR) as the recommendation lever",
|
||||
"Does not tell the user to stop publishing buyer's guides entirely — reframes expectations toward citation and category framing",
|
||||
"Mentions the attribution blind spot and at least two of: prompt tracking, self-reported attribution, call recordings"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"prompt": "We publish YouTube tutorials for our category's biggest how-to queries but never get cited in AI answers, while a competitor's uglier videos show up in Google AI Overviews and ChatGPT constantly. The videos themselves are well produced. What are we missing?",
|
||||
"expected_output": "Should load references/youtube-ai-citations.md and diagnose the text layer, not the footage: models don't watch the video, they read everything around it. Should check, in leverage order: transcript quality (key answers spoken as complete, liftable sentences; entities said out loud), captions (cleaned/uploaded, not messy auto-captions), question-shaped title matching the real query, chapters titled by sub-question, a keyword-rich description restating the key points as text, and a pinned comment carrying the summary. Should note engagement/thumbnail feeds YouTube ranking which feeds AI surfacing, and should not recommend re-shooting or higher production value as the fix.",
|
||||
"assertions": [
|
||||
"States that AI models read the text layer (transcript, captions, title, chapters, description, pinned comment) rather than watching the video",
|
||||
"Recommends cleaning/uploading captions and speaking key answers as complete liftable statements with entities said aloud",
|
||||
"Recommends question-shaped titles, chapters titled by sub-question, a structured description, and a pinned summary comment",
|
||||
"Does not attribute the gap to production quality or recommend re-shooting as the primary fix"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"prompt": "Our content is well-written and we have schema markup, but AI assistants never seem to use our site. Someone said our site might not be 'agent-ready.' We also put most of our AI-visibility effort into Reddit this year since that's where ChatGPT cites from. What should we do?",
|
||||
"expected_output": "Should load references/agent-readiness.md and address both halves. (1) Agent readiness: recommend running a free scoring tool (npx is-agentic and/or Frase's Agent Readiness Checker) and walk the access/discovery/parseability triad — core content must be in the initial HTML without JavaScript execution, no bot challenge/firewall blocking intended search-discovery crawlers, purpose-specific robots.txt controls that separate discovery from model training, a clean sitemap, llms.txt (+llms-full.txt as bonus), structured data, and a Markdown representation via content negotiation (Accept: text/markdown at the same canonical URL) or a Link header. May mention WebMCP as the emerging agent-actionable layer, labeled emerging. (2) Reddit concentration: flag citation-source volatility — ChatGPT's Aug 2026 retrieval changes nearly wiped Reddit as a source (practitioner-reported), so single-surface concentration is fragile; recommend the portfolio approach across third-party surfaces plus owned-site fundamentals (which dominate Gemini citations), and verifying any citation-share stat against their own monitoring before betting budget.",
|
||||
"assertions": [
|
||||
"Recommends running an agent-readiness scoring tool (is-agentic or Frase checker) and structures the audit as access / discovery / parseability",
|
||||
"Identifies JavaScript-only content rendering and bot/firewall blocking as first-order access failures",
|
||||
"Covers the discovery/parseability file stack: robots.txt AI stance, sitemap, llms.txt or llms-full.txt, structured data, and a Markdown representation (content negotiation or Link header)",
|
||||
"Flags the Reddit-only strategy as fragile, citing citation-source volatility (Aug 2026 ChatGPT retrieval change, labeled practitioner-reported) and recommends a portfolio plus owned-site fundamentals",
|
||||
"Does not present citation-share statistics as stable facts; recommends verifying against the user's own citation monitoring"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"prompt": "We're a B2B SaaS planning our 2026 content roadmap. The plan is 40 comparison pages ('us vs competitor') and 20 'best tools' listicles, mainly to win ChatGPT citations. Also, how do I know if it's working — I checked ChatGPT once last week and we weren't mentioned.",
|
||||
"expected_output": "Should load references/format-volatility.md and push back on the rationale with the ChatGPT 5.6 shift (Aug 2026, Peec AI data): listicle citations fell ~50% and comparison-page citations ~32% post-5.6, with fan-out queries dropping 'best/vs/top/comparison' modifiers in favor of site: and 'official' searches — so 'win ChatGPT citations' no longer justifies scaled comparison/listicle production. Should NOT say comparison pages are dead: they still convert humans and still earn citations on Google AI Overviews, Gemini, and Perplexity — format strategy is per-platform. Should steer investment toward owned 'official' pages (product, docs, pricing, original research), which are rising as the citable class and dominate Gemini (~60% business sites). May suggest extracting ChatGPT's real fan-out queries via the DevTools method for coverage planning (while warning against mass-generating a page per query — scaled content abuse). On measurement: one ChatGPT check is an anecdote — AI answers are non-deterministic; run each query 3–5 times per platform, track mention rate with sample size (e.g. 'cited 3/5'), and compare rates over time. Numbers should be treated as dated snapshots to verify against own monitoring."
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"prompt": "We've been known as a mid-market HR platform for ten years. Next quarter we're repositioning as enterprise and rewriting the whole site at once. How do we make sure ChatGPT and Google's AI start recommending us for enterprise HR software?",
|
||||
"expected_output": "Should warn that LLM brand associations move slowly: enterprise prompts are already tied to incumbents, and rewriting the whole site at once can lose mid-market answers before enterprise ones arrive. Should recommend recording a baseline for both old- and new-segment prompts, setting expectations for a dip, moving off-site signals first (G2/Capterra/Gartner profiles, reviews, analyst and press coverage) so they match the new About page, and staging the on-site rewrite. Should suggest extracting real fan-out queries to see which third-party domains (e.g. site: searches on Gartner/G2) matter for the category. Should label these as practitioner experience rather than proven data, and not recommend invented awards or self-owned review sites.",
|
||||
"assertions": [
|
||||
"Flags a possible visibility dip as practitioner experience, not a certainty",
|
||||
"Recommends baselining old- and new-segment prompts",
|
||||
"Prioritizes aligning third-party profiles with the new positioning",
|
||||
"Suggests staging the on-site rewrite instead of switching all at once",
|
||||
"Uses fan-out analysis to find which third-party sources matter",
|
||||
"Doesn't recommend fake awards or self-owned review sites"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"prompt": "I keep hearing LinkedIn articles get cited by ChatGPT. Should I republish all our blog posts as LinkedIn articles to get more AI citations?",
|
||||
"expected_output": "Should not recommend blanket republishing. Should explain that which LinkedIn surface gets cited depends on the engine and shifted in 2026: ChatGPT now cites feed posts far more than Pulse articles, while Perplexity, Copilot, and Google's AI features still cite articles and company pages, and Gemini barely cites LinkedIn. Should warn that LinkedIn sets its own canonical, so full republishing competes with the blog; recommend publishing on the site first and posting adapted versions or summaries. Should suggest checking articles for crawler noindex, note that engagement and follower count barely predict citation while original, specific, technical content does, and recommend tracking citations per engine. Should label figures as dated vendor or platform data.",
|
||||
"assertions": [
|
||||
"Does not recommend republishing everything as-is",
|
||||
"Explains the engine split (ChatGPT favors posts; others still cite articles; Gemini barely cites LinkedIn)",
|
||||
"Warns about canonical/duplication and recommends site-first with adapted versions",
|
||||
"Mentions checking for crawler noindex",
|
||||
"Notes engagement and followers barely predict citation",
|
||||
"Labels figures as dated and vendor/platform-reported"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
# Agent Readiness — Can an Agent Reach, Navigate, and Parse Your Site?
|
||||
|
||||
AI visibility work splits into two layers: what your content says (the rest of this skill) and whether an agent can *get to it at all*. This reference covers the second layer — the access/discovery/parseability audit — plus the emerging shift from agent-*readable* to agent-*actionable* sites.
|
||||
|
||||
Two free scoring tools shipped in August 2026 and turned this into a measurable discipline:
|
||||
|
||||
| Tool | Run it | Method |
|
||||
|---|---|---|
|
||||
| **Is Agentic** (Vercel + Ora) | `npx is-agentic yourdomain.com` or [is-agentic.com](https://is-agentic.com) | 100+ checks; Essential checks carry most of the score; Recommended checks activate only when evidence shows you have that surface (API, MCP server, commerce); not-applicable checks are excluded, not failed; includes an observed agent journey showing where a real agent hit friction |
|
||||
| **Frase Agent Readiness Checker** | [frase.io/tools/agent-readiness](https://www.frase.io/tools/agent-readiness) | Access / Discovery / Parseability triad; 80+ = agents can reliably use the site, 60–79 = solid with gaps, <60 = real access problems |
|
||||
|
||||
Run one before and after any agent-readiness work — the score is a shareable artifact and the failed checks are your worklist. (Both are vendor tools with a product behind them; the *checks* are the value, not the pitch.)
|
||||
|
||||
## The three questions
|
||||
|
||||
### 1. Access — can an agent get to the page and see real content?
|
||||
|
||||
- **Core content in the initial HTML response.** Most agents never execute JavaScript. If the content only exists after client-side rendering, it doesn't exist. This is the #1 essential check in both tools.
|
||||
- **No bot challenge or firewall block** on the intended discovery path. Blocking `OAI-SearchBot`, `PerplexityBot`, or `Claude-SearchBot` may reduce search visibility. Blocking model-development crawlers such as `GPTBot` or `ClaudeBot` can be an intentional training opt-out and is not, by itself, a visibility failure. Audit what your CDN/WAF actually does to each user agent — many sites block them by default without anyone deciding to.
|
||||
- **Correct HTTP behavior**: real status codes (no soft-404s), stable canonical URLs, recoverable errors.
|
||||
|
||||
### 2. Discovery — do your files tell agents what's here?
|
||||
|
||||
- **robots.txt with an explicit AI-crawler stance** — name the relevant user agents and state a purpose-specific policy, rather than leaving it to be assumed (see the bot-access guidance in SKILL.md).
|
||||
- **A sitemap that loads and parses cleanly.**
|
||||
- **llms.txt at the domain root** (see Machine-Readable Files in SKILL.md).
|
||||
- **`llms-full.txt`** — the newer companion: your entire site content in one file, so an agent gets everything in a single request instead of crawling. Emerging, cheap to generate alongside llms.txt, and scored as bonus signal by both tools.
|
||||
- **robots.txt content-usage statements** — an emerging convention for declaring what AI may do with your content (train / cite / summarize), so the answer comes from you instead of being assumed.
|
||||
|
||||
### 3. Parseability — once there, can the agent tell what the page is?
|
||||
|
||||
- **Valid, substantive structured data** (JSON-LD — see the `schema` skill).
|
||||
- **A Markdown representation of the page.** This is the newest technique in the stack, two implementations:
|
||||
- **Content negotiation**: serve compact Markdown at the *same canonical URL* when the request asks for `Accept: text/markdown`, with a `Vary` header keeping the HTML and Markdown cache entries separate. (This is how Is Agentic serves its own reports — agents get Markdown, browsers get HTML, one URL.)
|
||||
- **Link header**: an HTTP `Link` header on the HTML page pointing to a parallel Markdown version — discoverable without guessing URLs.
|
||||
- Clear document structure — one H1, headings that answer sub-questions, extractable answer blocks (the content-patterns reference).
|
||||
|
||||
## Emerging: agent-actionable, not just agent-readable
|
||||
|
||||
Reading is becoming table stakes. The next race is whether an agent can *act* on your site — fill the form, book the meeting, start the trial. **WebMCP** is the emerging standard here: a page declares its forms and CTAs as callable tools with input schemas, so an agent doesn't have to reverse-engineer your UI. Early days (label: emerging, not yet a ranking/citation signal), but the direction is clear — if agents are becoming buyers, the site that exposes "start trial" as a structured action wins the agent-mediated conversion that a pretty button loses.
|
||||
|
||||
Practical today: make sure your highest-intent actions (signup, pricing, demo booking, contact) work without JavaScript-only flows, have labeled semantic form fields, and return machine-readable confirmation.
|
||||
|
||||
**Ways to add WebMCP** (all early; confirm browser and assistant support before promising anything):
|
||||
- **Implement it yourself.** Follow the WebMCP draft to declare each action as a tool with an input schema, wired to the form or API the page already uses. Keep the tool list short (the 2–4 highest-intent actions) and reuse existing validation, spam protection, and permissions rather than building a parallel path.
|
||||
- **Use your platform's support, if it has any.** Some site platforms and agent workflows add WebMCP for you. Ploy ◆, for example, has a Ploybook that inspects the site, defines tool contracts, implements them against existing form logic, and validates them. It's a guided workflow, not a hosted MCP server. ◆ marks a [Verified Partner](https://github.com/coreyhaines31/marketingskills/blob/main/tools/REGISTRY.md#verified-partners) of this repository (disclosure, not endorsement); name an alternative alongside it when you mention it.
|
||||
- **Have a coding agent do it** in the site's repo, with the same scoping: a few actions, existing logic, a test for each.
|
||||
|
||||
Whichever path, test that each tool rejects bad input, that submissions land where the normal form's do (CRM, inbox, conversion tracking), and that nothing bypasses consent or rate limits.
|
||||
|
||||
## Citation-source volatility (why you diversify)
|
||||
|
||||
Third-party citation mixes are **not stable** — they shift overnight with model and retrieval updates, and August 2026 provided the case study: **ChatGPT's query fan-out changes nearly wiped Reddit as a citation source** within days (practitioner-reported by multiple AEO teams; one had been earning 24-hour citations from Reddit at 1M+ impressions/month before the change). Meanwhile the same practitioners report **business-owned websites dominate Gemini citations (~60%)**.
|
||||
|
||||
LinkedIn moved in the same update: ChatGPT's LinkedIn citations fell ~36% in mid-August 2026, and its citations of Pulse articles fell ~86% from May to Oct while citations of feed posts rose. Perplexity and Copilot moved the other way. See [linkedin-ai-citations.md](linkedin-ai-citations.md).
|
||||
|
||||
What this means for strategy:
|
||||
|
||||
- **Never concentrate AI-visibility work in one third-party surface.** The Presence pillar's list (Wikipedia, Reddit, YouTube, podcasts, review sites, Quora) is a portfolio, not a menu to pick one from. A surface that's 2% of citations today can be 0% after one retrieval update — or vice versa.
|
||||
- **Owned-site fundamentals hedge the volatility.** Platform deals and retrieval changes reshuffle third-party sources; your own agent-readable site is the one surface no platform can drop you from — and on Gemini it's already the dominant citation class.
|
||||
- **Treat any citation-share statistic as dated.** The "Reddit = 1.8% of ChatGPT citations" class of stats (including the ones in this skill) are snapshots — check the date, and verify against your own citation monitoring (the DIY monitoring loop in SKILL.md) before betting budget on them.
|
||||
- **Speed is real**: fresh content on retrieved surfaces can be cited within ~24 hours. AI search rewards freshness faster than classic SEO ever did.
|
||||
|
||||
---
|
||||
|
||||
*Agent-readiness check taxonomy distilled from Vercel/Ora's Is Agentic (is-agentic.com) and Frase's Agent Readiness Checker (both August 2026, credited); citation-volatility events practitioner-reported (Ashni of Hype Partners (@ashnichrist) and others, August 2026) — labeled accordingly, verify against your own monitoring.*
|
||||
@@ -0,0 +1,89 @@
|
||||
# Citations vs. Recommendations: The AI Visibility Ladder
|
||||
|
||||
Being cited by an AI engine and being recommended by it are **two different outcomes governed by two different systems**. A citation means your page was useful enough to pull information from. A recommendation means the model put your brand on the buyer's shortlist. Optimizing for the first does not automatically earn the second — and for smaller brands, conflating them leads to content strategies that can actively help competitors.
|
||||
|
||||
Source note: the analysis and data in this reference draw on Lily Ray's (Amsive) 2026 study of B2B "best [category] software" queries, behavioral studies by Scrunch and SimilarWeb, and commentary by John-Henry Scherck (Growth Plays).
|
||||
|
||||
---
|
||||
|
||||
## The Visibility Ladder
|
||||
|
||||
AI visibility is a ladder, not a binary. Each rung has different selection criteria and different measurement:
|
||||
|
||||
| Rung | What it means | What governs it | How to see it |
|
||||
|---|---|---|---|
|
||||
| **1. Retrieved** | The model read your content while building its answer, without citing it | Crawlability, parseable structure, query relevance | Mostly invisible; bot logs hint at it |
|
||||
| **2. Cited** | Your page appears as a source in the answer | Content usefulness: structure, statistics, clarity, freshness | Prompt-tracking tools, AI Overview source lists |
|
||||
| **3. Mentioned** | Your brand is named in the answer text | Entity recognition + how the web talks about you | Prompt-tracking tools |
|
||||
| **4. Recommended** | Your product is on the shortlist the buyer actually considers | **Aggregate web consensus** — reviews, forums, analysts, press, video — largely independent of your own content | Prompt tracking + the framing around the mention |
|
||||
|
||||
Rungs 1–3 are legitimate signals your content is working, and most prompt-tracking tools report them. But rung 4 is where buying behavior changes, and it's earned differently: **citation is about whether your content is useful to consult; recommendation is mostly a reflection of what the broader web says about you** — whether you published a guide on the topic or not.
|
||||
|
||||
There is also a shadow rung: **recommended against**. On detailed, requirements-heavy prompts, models increasingly name products a buyer should *avoid* for their use case, with sources. The downside of weak third-party consensus is no longer just absence from the shortlist — it can be an explicit rule-out. This makes monitoring the *framing* around your mentions (favorable / neutral / hedged / negative), not just counting them, part of the job.
|
||||
|
||||
**Repairing a weakness models repeat.** Address it in public, with specifics, from a real person. One practitioner's client was "slaughtered" on implementation time; over 1.5–2 years, founder posts about the process, guides on real timelines, and a concrete "4–8 weeks" on the implementation page shifted how models described it (anecdote, Harpreet Singh on Edward Sturm's podcast, Sep 2026). More in [positioning-and-consensus.md](positioning-and-consensus.md).
|
||||
|
||||
---
|
||||
|
||||
## The Self-Promotional Listicle Risk
|
||||
|
||||
The common tactic — publish a "best [category] software" guide, rank yourself #1, and let it shape both organic search and AI answers — now has a stage-dependent payoff.
|
||||
|
||||
**The data:** Lily Ray (Amsive) analyzed 100 B2B "best [category] software" queries across three dates in spring 2026. Across the dataset, self-promotional listicles earned 323 citations in AI Overviews — and in 224 of them (**69% of the citations**), the answer left the publishing brand out of the recommendations, pointing buyers to competitors instead.
|
||||
|
||||
**The mechanism:** the model treats your guide as a source about the *category*. It happily extracts the competitor names, comparisons, and evaluation criteria you compiled — then makes its recommendation from web-wide consensus, where the established players dominate. For an emerging brand, a self-promotional buyer's guide can function as **a vote for your competitors**: you did the research that helps the model describe them.
|
||||
|
||||
**The split by stage:**
|
||||
|
||||
- **Established category leaders** get both outcomes. Their guides earn citations *and* their brands get recommended — because analysts, review sites, and forum discussions already validate them. For leaders, a definitive buyer's guide is highly advantageous: it shapes how the whole category (competitors included) gets described.
|
||||
- **Emerging brands** may win the citation and even shape the category's framing, but miss the recommendation. That's not a wasted outcome — influencing how an LLM defines the category and its evaluation criteria is real positioning work — but it is not the shortlist placement the tactic promises.
|
||||
|
||||
**What this changes (and doesn't):** genuinely useful buyer's guides still belong in a B2B content strategy at any stage. What changes is the expectation and the investment split. If you're not yet the consensus pick, weight effort toward the offsite signals that actually govern recommendations (below) rather than publishing a plethora of self-ranked listicles.
|
||||
|
||||
**A third option between ranking yourself #1 and not writing the guide:** name the category leader first, say honestly what it does well, then show the specific cases where your product goes further (practitioner pattern, Sep 2026). It reads as a fair source, which is what models are now starting to filter for.
|
||||
|
||||
---
|
||||
|
||||
## What Earns Recommendations
|
||||
|
||||
Recommendation is a consensus signal. The inputs the models weigh live mostly off your site:
|
||||
|
||||
| Channel | Why it moves recommendations | Related skill |
|
||||
|---|---|---|
|
||||
| **Review platforms** (G2, Capterra, TrustRadius, app stores) | Third-party validation models treat as evidence of legitimacy | customer-research (review generation loops) |
|
||||
| **Analyst coverage** (Gartner, Forrester, industry reports) | High-authority category framing; models echo analyst shortlists | public-relations |
|
||||
| **Communities and forums** (Reddit, HN, Slack/Discord, niche forums) | Unprompted practitioner discussion is heavily retrieved and hard to fake | community-marketing |
|
||||
| **Earned media and PR** | Independent sources repeating your positioning beyond your own site | public-relations |
|
||||
| **Video and podcasts** | Increasingly retrieved; transcripts carry brand + category associations | video, social |
|
||||
|
||||
The test to apply before investing in another self-ranked guide: *if a model ignored everything on our domain, would the rest of the web still put us on the shortlist?* If not, that gap is the priority. AEO discourse often stops at "are we in the answer?" — the better question is "are we credible enough to be recommended?"
|
||||
|
||||
The encouraging flip side: earning an AI recommendation is harder to game than a top search ranking ever was. The durable strategy is the same at every stage — be the best fit for a clear set of buyers, and give those buyers reasons to talk about you in public, where the models can retrieve it.
|
||||
|
||||
---
|
||||
|
||||
## What a Recommendation Is Worth
|
||||
|
||||
Two behavioral studies quantified the gap between rungs:
|
||||
|
||||
- **Scrunch** (opt-in panel linking AI conversations to subsequent web behavior, compared against each user's own baseline — observational, not a controlled experiment): a genuine recommendation ("a great option is X") was associated with people searching for, visiting, and evaluating a brand **about twice as often** as a passing mention. For users with no recent observed engagement with the brand, a recommendation was followed within a week by **+182% branded searches, +117% site visits, and +185% product views**.
|
||||
- **SimilarWeb** (thousands of real user journeys, seven days post-answer): when ChatGPT recommended a brand, it received **roughly 2.5× more new visitors** the following week than the competitors left off the list.
|
||||
|
||||
**The attribution blind spot:** in the SimilarWeb data, only about **9%** of those post-recommendation visits arrived as visible AI referral traffic; the largest share arrived via branded search, with direct and other channels making up the rest — indistinguishable from ordinary organic visitors. AI recommendations are already sending real, engaged buyers, but standard attribution underreports the AI touch.
|
||||
|
||||
**Measurement triad** (no single signal is complete; together they give a reliable read):
|
||||
|
||||
1. **AI prompt tracking** — whether and how you're mentioned/recommended in LLM answers, even when no click ever lands (tools in SKILL.md's Monitoring section). Track the framing around mentions — recommended, neutral, hedged, or recommended-against — not just the count.
|
||||
2. **Self-reported attribution** — a "how did you hear about us?" field catches buyers whose journey started in an AI chat but arrived via branded search or direct. Add an AI option with a follow-up, "What did you type?", so buyers hand you real prompts to track. ChatGPT referral UTMs undercount, and AI Overview revenue can't be separated from organic in analytics, so this field is often the clearest signal you have.
|
||||
3. **Sales call recordings** — buyers' own language often reveals an AI conversation shaped the shortlist long before any form fill.
|
||||
|
||||
Also watch **branded search volume** as a proxy: sustained lifts without a matching campaign are increasingly AI-influence showing up under another name.
|
||||
|
||||
---
|
||||
|
||||
## Applying This
|
||||
|
||||
- **Auditing an established brand:** buyer's guides and comparison content are high-leverage — publish the definitive version and shape the category's evaluation criteria.
|
||||
- **Auditing an emerging brand:** publish the genuinely useful guides your ICP needs, but set expectations (citation and framing, not near-term recommendation) and rebalance investment toward reviews, communities, analysts, and earned media.
|
||||
- **Reporting:** report the ladder, not a single "AI visibility" number — retrieved/cited/mentioned/recommended plus mention framing. A rising citation count with a flat recommendation rate is a specific, diagnosable gap: the web doesn't yet corroborate your content.
|
||||
- **Risk check:** for requirements-heavy queries in your category, check whether models recommend *against* you, and trace the sources they cite when they do.
|
||||
@@ -0,0 +1,287 @@
|
||||
# AEO and GEO Content Patterns
|
||||
|
||||
Reusable content block patterns optimized for answer engines and AI citation.
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- Answer Engine Optimization (AEO) Patterns (Definition Block, Step-by-Step Block, Comparison Table Block, Pros and Cons Block, FAQ Block, Listicle Block)
|
||||
- Generative Engine Optimization (GEO) Patterns (Statistic Citation Block, Expert Quote Block, Authoritative Claim Block, Self-Contained Answer Block, Evidence Sandwich Block)
|
||||
- Domain-Specific GEO Tactics (Technology Content, Health/Medical Content, Financial Content, Legal Content, Business/Marketing Content)
|
||||
- Voice Search Optimization (Question Formats for Voice, Voice-Optimized Answer Structure)
|
||||
|
||||
## Answer Engine Optimization (AEO) Patterns
|
||||
|
||||
These patterns help content appear in featured snippets, AI Overviews, voice search results, and answer boxes.
|
||||
|
||||
### Definition Block
|
||||
|
||||
Use for "What is [X]?" queries.
|
||||
|
||||
```markdown
|
||||
## What is [Term]?
|
||||
|
||||
[Term] is [concise 1-sentence definition]. [Expanded 1-2 sentence explanation with key characteristics]. [Brief context on why it matters or how it's used].
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
## What is Answer Engine Optimization?
|
||||
|
||||
Answer Engine Optimization (AEO) is the practice of structuring content so AI-powered systems can easily extract and present it as direct answers to user queries. Unlike traditional SEO that focuses on ranking in search results, AEO optimizes for featured snippets, AI Overviews, and voice assistant responses. This approach has become essential as over 60% of Google searches now end without a click.
|
||||
```
|
||||
|
||||
### Step-by-Step Block
|
||||
|
||||
Use for "How to [X]" queries. Optimal for list snippets.
|
||||
|
||||
```markdown
|
||||
## How to [Action/Goal]
|
||||
|
||||
[1-sentence overview of the process]
|
||||
|
||||
1. **[Step Name]**: [Clear action description in 1-2 sentences]
|
||||
2. **[Step Name]**: [Clear action description in 1-2 sentences]
|
||||
3. **[Step Name]**: [Clear action description in 1-2 sentences]
|
||||
4. **[Step Name]**: [Clear action description in 1-2 sentences]
|
||||
5. **[Step Name]**: [Clear action description in 1-2 sentences]
|
||||
|
||||
[Optional: Brief note on expected outcome or time estimate]
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
## How to Optimize Content for Featured Snippets
|
||||
|
||||
Earning featured snippets requires strategic formatting and direct answers to search queries.
|
||||
|
||||
1. **Identify snippet opportunities**: Use tools like Semrush or Ahrefs to find keywords where competitors have snippets you could capture.
|
||||
2. **Match the snippet format**: Analyze whether the current snippet is a paragraph, list, or table, and format your content accordingly.
|
||||
3. **Answer the question directly**: Provide a clear, concise answer (40-60 words for paragraph snippets) immediately after the question heading.
|
||||
4. **Add supporting context**: Expand on your answer with examples, data, and expert insights in the following paragraphs.
|
||||
5. **Use proper heading structure**: Place your target question as an H2 or H3, with the answer immediately following.
|
||||
|
||||
Most featured snippets appear within 2-4 weeks of publishing well-optimized content.
|
||||
```
|
||||
|
||||
### Comparison Table Block
|
||||
|
||||
Use for "[X] vs [Y]" queries. Optimal for table snippets.
|
||||
|
||||
```markdown
|
||||
## [Option A] vs [Option B]: [Brief Descriptor]
|
||||
|
||||
| Feature | [Option A] | [Option B] |
|
||||
|---------|------------|------------|
|
||||
| [Criteria 1] | [Value/Description] | [Value/Description] |
|
||||
| [Criteria 2] | [Value/Description] | [Value/Description] |
|
||||
| [Criteria 3] | [Value/Description] | [Value/Description] |
|
||||
| [Criteria 4] | [Value/Description] | [Value/Description] |
|
||||
| Best For | [Use case] | [Use case] |
|
||||
|
||||
**Bottom line**: [1-2 sentence recommendation based on different needs]
|
||||
```
|
||||
|
||||
### Pros and Cons Block
|
||||
|
||||
Use for evaluation queries: "Is [X] worth it?", "Should I [X]?"
|
||||
|
||||
```markdown
|
||||
## Advantages and Disadvantages of [Topic]
|
||||
|
||||
[1-sentence overview of the evaluation context]
|
||||
|
||||
### Pros
|
||||
|
||||
- **[Benefit category]**: [Specific explanation]
|
||||
- **[Benefit category]**: [Specific explanation]
|
||||
- **[Benefit category]**: [Specific explanation]
|
||||
|
||||
### Cons
|
||||
|
||||
- **[Drawback category]**: [Specific explanation]
|
||||
- **[Drawback category]**: [Specific explanation]
|
||||
- **[Drawback category]**: [Specific explanation]
|
||||
|
||||
**Verdict**: [1-2 sentence balanced conclusion with recommendation]
|
||||
```
|
||||
|
||||
### FAQ Block
|
||||
|
||||
Use for topic pages with multiple common questions. Essential for FAQ schema.
|
||||
|
||||
```markdown
|
||||
## Frequently Asked Questions
|
||||
|
||||
### [Question phrased exactly as users search]?
|
||||
|
||||
[Direct answer in first sentence]. [Supporting context in 2-3 additional sentences].
|
||||
|
||||
### [Question phrased exactly as users search]?
|
||||
|
||||
[Direct answer in first sentence]. [Supporting context in 2-3 additional sentences].
|
||||
|
||||
### [Question phrased exactly as users search]?
|
||||
|
||||
[Direct answer in first sentence]. [Supporting context in 2-3 additional sentences].
|
||||
```
|
||||
|
||||
**Tips for FAQ questions:**
|
||||
- Use natural question phrasing ("How do I..." not "How does one...")
|
||||
- Include question words: what, how, why, when, where, who, which
|
||||
- Match "People Also Ask" queries from search results
|
||||
- Keep answers between 50-100 words
|
||||
|
||||
### Listicle Block
|
||||
|
||||
Use for "Best [X]", "Top [X]", "[Number] ways to [X]" queries.
|
||||
|
||||
**Caveat for self-promotional listicles:** ranking yourself #1 in your own "best [category]" guide gets the page *cited* far more reliably than it gets your brand *recommended* — for emerging brands, AI answers often harvest the competitor names from the guide and recommend them instead. See [citations-vs-recommendations.md](citations-vs-recommendations.md) before building these at scale.
|
||||
|
||||
```markdown
|
||||
## [Number] Best [Items] for [Goal/Purpose]
|
||||
|
||||
[1-2 sentence intro establishing context and selection criteria]
|
||||
|
||||
### 1. [Item Name]
|
||||
|
||||
[Why it's included in 2-3 sentences with specific benefits]
|
||||
|
||||
### 2. [Item Name]
|
||||
|
||||
[Why it's included in 2-3 sentences with specific benefits]
|
||||
|
||||
### 3. [Item Name]
|
||||
|
||||
[Why it's included in 2-3 sentences with specific benefits]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Generative Engine Optimization (GEO) Patterns
|
||||
|
||||
These patterns optimize content for citation by AI assistants like ChatGPT, Claude, Perplexity, and Gemini.
|
||||
|
||||
### Statistic Citation Block
|
||||
|
||||
Statistics increase AI citation rates by 15-30%. Always include sources.
|
||||
|
||||
```markdown
|
||||
[Claim statement]. According to [Source/Organization], [specific statistic with number and timeframe]. [Context for why this matters].
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
Mobile optimization is no longer optional for SEO success. According to Google's 2024 Core Web Vitals report, 70% of web traffic now comes from mobile devices, and pages failing mobile usability standards see 24% higher bounce rates. This makes mobile-first indexing a critical ranking factor.
|
||||
```
|
||||
|
||||
### Expert Quote Block
|
||||
|
||||
Named expert attribution adds credibility and increases citation likelihood.
|
||||
|
||||
```markdown
|
||||
"[Direct quote from expert]," says [Expert Name], [Title/Role] at [Organization]. [1 sentence of context or interpretation].
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
"The shift from keyword-driven search to intent-driven discovery represents the most significant change in SEO since mobile-first indexing," says Rand Fishkin, Co-founder of SparkToro. This perspective highlights why content strategies must evolve beyond traditional keyword optimization.
|
||||
```
|
||||
|
||||
### Authoritative Claim Block
|
||||
|
||||
Structure claims for easy AI extraction with clear attribution.
|
||||
|
||||
```markdown
|
||||
[Topic] [verb: is/has/requires/involves] [clear, specific claim]. [Source] [confirms/reports/found] that [supporting evidence]. This [explains/means/suggests] [implication or action].
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
E-E-A-T is the cornerstone of Google's content quality evaluation. Google's Search Quality Rater Guidelines confirm that trust is the most critical factor, stating that "untrustworthy pages have low E-E-A-T no matter how experienced, expert, or authoritative they may seem." This means content creators must prioritize transparency and accuracy above all other optimization tactics.
|
||||
```
|
||||
|
||||
### Self-Contained Answer Block
|
||||
|
||||
Create quotable, standalone statements that AI can extract directly.
|
||||
|
||||
```markdown
|
||||
**[Topic/Question]**: [Complete, self-contained answer that makes sense without additional context. Include specific details, numbers, or examples in 2-3 sentences.]
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
**Ideal blog post length for SEO**: The optimal length for SEO blog posts is 1,500-2,500 words for competitive topics. This range allows comprehensive topic coverage while maintaining reader engagement. HubSpot research shows long-form content earns 77% more backlinks than short articles, directly impacting search rankings.
|
||||
```
|
||||
|
||||
### Evidence Sandwich Block
|
||||
|
||||
Structure claims with evidence for maximum credibility.
|
||||
|
||||
```markdown
|
||||
[Opening claim statement].
|
||||
|
||||
Evidence supporting this includes:
|
||||
- [Data point 1 with source]
|
||||
- [Data point 2 with source]
|
||||
- [Data point 3 with source]
|
||||
|
||||
[Concluding statement connecting evidence to actionable insight].
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Domain-Specific GEO Tactics
|
||||
|
||||
Different content domains benefit from different authority signals.
|
||||
|
||||
### Technology Content
|
||||
- Emphasize technical precision and correct terminology
|
||||
- Include version numbers and dates for software/tools
|
||||
- Reference official documentation
|
||||
- Add code examples where relevant
|
||||
|
||||
### Health/Medical Content
|
||||
- Cite peer-reviewed studies with publication details
|
||||
- Include expert credentials (MD, RN, etc.)
|
||||
- Note study limitations and context
|
||||
- Add "last reviewed" dates
|
||||
|
||||
### Financial Content
|
||||
- Reference regulatory bodies (SEC, FTC, etc.)
|
||||
- Include specific numbers with timeframes
|
||||
- Note that information is educational, not advice
|
||||
- Cite recognized financial institutions
|
||||
|
||||
### Legal Content
|
||||
- Cite specific laws, statutes, and regulations
|
||||
- Reference jurisdiction clearly
|
||||
- Include professional disclaimers
|
||||
- Note when professional consultation is advised
|
||||
|
||||
### Business/Marketing Content
|
||||
- Include case studies with measurable results
|
||||
- Reference industry research and reports
|
||||
- Add percentage changes and timeframes
|
||||
- Quote recognized thought leaders
|
||||
|
||||
---
|
||||
|
||||
## Voice Search Optimization
|
||||
|
||||
Voice queries are conversational and question-based. Optimize for these patterns:
|
||||
|
||||
### Question Formats for Voice
|
||||
- "What is..."
|
||||
- "How do I..."
|
||||
- "Where can I find..."
|
||||
- "Why does..."
|
||||
- "When should I..."
|
||||
- "Who is..."
|
||||
|
||||
### Voice-Optimized Answer Structure
|
||||
- Lead with direct answer (under 30 words ideal)
|
||||
- Use natural, conversational language
|
||||
- Avoid jargon unless targeting expert audience
|
||||
- Include local context where relevant
|
||||
- Structure for single spoken response
|
||||
@@ -0,0 +1,82 @@
|
||||
# AI SEO by Content Type
|
||||
|
||||
Tactical guidance for optimizing specific content types for AI search citation. These tactics work for non-Google AI engines (ChatGPT, Claude, Perplexity, Copilot) and don't hurt Google AI Overviews / AI Mode.
|
||||
|
||||
For the cross-cutting strategy, see [SKILL.md](../SKILL.md).
|
||||
|
||||
---
|
||||
|
||||
## SaaS Product Pages
|
||||
|
||||
**Goal:** Get cited in "What is [category]?" and "Best [category]" queries. (Citation is the realistic goal here; being *recommended* in the answer depends on offsite consensus — see [citations-vs-recommendations.md](citations-vs-recommendations.md).)
|
||||
|
||||
**Optimize:**
|
||||
- Clear product description in first paragraph (what it does, who it's for)
|
||||
- Feature comparison tables (you vs. category, not just competitors)
|
||||
- Specific metrics ("processes 10,000 transactions/sec" not "blazing fast")
|
||||
- Customer count or social proof with numbers
|
||||
- Pricing transparency (AI cites pages with visible pricing) — add a `/pricing.md` file so AI agents can parse your plans without rendering your page (see "Machine-Readable Files" in the main skill)
|
||||
- FAQ section addressing common buyer questions
|
||||
|
||||
---
|
||||
|
||||
## Blog Content
|
||||
|
||||
**Goal:** Get cited as an authoritative source on topics in your space.
|
||||
|
||||
**Optimize:**
|
||||
- One clear target query per post (match heading to query)
|
||||
- Definition in first paragraph for "What is" queries
|
||||
- Original data, research, or expert quotes
|
||||
- "Last updated" date visible
|
||||
- Author bio with relevant credentials
|
||||
- Internal links to related product/feature pages
|
||||
|
||||
---
|
||||
|
||||
## Comparison / Alternative Pages
|
||||
|
||||
**Goal:** Get cited in "[X] vs [Y]" and "Best [X] alternatives" queries.
|
||||
|
||||
**Optimize:**
|
||||
- Structured comparison tables (not just prose)
|
||||
- Fair and balanced (AI penalizes obviously biased comparisons)
|
||||
- Specific criteria with ratings or scores
|
||||
- Updated pricing and feature data
|
||||
- Cite the `competitors` skill for building these pages
|
||||
|
||||
---
|
||||
|
||||
## Industry / Segment Pages
|
||||
|
||||
**Goal:** Get recommended when a prompt names an industry or company size ("email marketing software for e-commerce," "RFP software for government," "enterprise [category]"). Models increasingly sort brands into segments and personalize answers, so a generic page can lose to a competitor's segment page.
|
||||
|
||||
**Optimize:**
|
||||
- One page per core industry or segment you actually serve, with industry-specific workflows, integrations, compliance, and customer proof
|
||||
- Start with core segments. Many pages are fine if each adds real, segment-specific value; templated pages that only swap the industry name are what the scaled-content policy targets (see the `programmatic-seo` skill)
|
||||
- Match the segment language used on your third-party profiles (see [positioning-and-consensus.md](positioning-and-consensus.md))
|
||||
|
||||
---
|
||||
|
||||
## Documentation / Help Content
|
||||
|
||||
**Goal:** Get cited in "How to [X] with [your product]" queries.
|
||||
|
||||
**Optimize:**
|
||||
- Step-by-step format with numbered lists
|
||||
- Code examples where relevant
|
||||
- HowTo schema markup
|
||||
- Screenshots with descriptive alt text
|
||||
- Clear prerequisites and expected outcomes
|
||||
|
||||
---
|
||||
|
||||
## Local Business / Ecom (Google emphasis)
|
||||
|
||||
Google's AI features pull from product feeds and business profiles for local + ecom queries. Optimize:
|
||||
|
||||
- **Merchant Center feeds** kept current with accurate inventory, pricing, attributes
|
||||
- **Google Business Profile** complete with hours, services, photos, posts, Q&A answered
|
||||
- **Reviews** — recent + sufficient volume; respond to reviews to signal active management
|
||||
- **Service area schema** for local services
|
||||
- **Business Agent** (where available) for conversational customer engagement
|
||||
@@ -0,0 +1,95 @@
|
||||
# Format Volatility — Which Content Formats AI Cites (and How Fast That Changes)
|
||||
|
||||
Citation-*source* volatility (Reddit wiped overnight, Gemini favoring owned sites) is covered in [agent-readiness.md](agent-readiness.md). This reference covers the second volatility axis: citation-*format* — which page types AI engines retrieve and cite, and the August 2026 evidence that heavily-exploited formats get demoted.
|
||||
|
||||
Read this before recommending comparison pages, listicles, or "best X" content for AI visibility. The advice changed materially with ChatGPT 5.6.
|
||||
|
||||
## The ChatGPT 5.6 format shift (August 2026)
|
||||
|
||||
Data from Peec AI (shared by Tomek Rudzki via Lily Ray, Aug 2026), comparing ChatGPT retrieval behavior before and after the 5.6 launch:
|
||||
|
||||
**Fan-out queries** — the modifiers that declined most as a share of ChatGPT's background searches:
|
||||
|
||||
- "vs"
|
||||
- "comparison"
|
||||
- "top"
|
||||
- "best"
|
||||
- "reviews"
|
||||
|
||||
At the same time: a surge in `site:` searches and modifiers like **"official"**.
|
||||
|
||||
**Citations by page type** — share of total ChatGPT citations:
|
||||
|
||||
| Page type | Pre-5.6 | Post-5.6 | Change |
|
||||
|---|---:|---:|---:|
|
||||
| Listicles ("Top 10 X," "8 best Y") | 15.77% | 7.80% | **−50.5%** |
|
||||
| Comparison pages ("X vs Y," alternatives) | 9.08% | 6.17% | **−32.1%** |
|
||||
|
||||
The interpretation (Lily Ray's, and it fits the fan-out data): these are exactly the two formats companies scaled for GEO over the prior 18 months, and ChatGPT adjusted retrieval to mitigate the spam. The `site:`/"official" surge points the same direction — **toward primary sources and owned domains, away from aggregator formats**.
|
||||
|
||||
## What this changes (and what it doesn't)
|
||||
|
||||
**It does NOT mean "stop making comparison pages."** Comparison and best-of content still:
|
||||
|
||||
- Converts human buyers (its original job)
|
||||
- Gets cited by Google AI Overviews (which follow core rankings, not ChatGPT's retrieval)
|
||||
- Feeds Gemini and Perplexity, which haven't shown the same demotion
|
||||
- Answers real mid-funnel queries on your own site
|
||||
|
||||
**It DOES mean:**
|
||||
|
||||
1. **Stop justifying scaled listicle/comparison production with "it wins AI citations."** On ChatGPT — the largest AI answer surface — that rationale lost half its force in one release.
|
||||
2. **The "official"/primary-source shift favors your owned pages.** Product pages, docs, pricing pages, original research — the pages only you can publish — are rising as the citable class. This compounds the Gemini finding (business-owned sites ≈ 60% of citations).
|
||||
3. **Format strategy is now per-platform.** Check which engines matter for your category before choosing formats:
|
||||
|
||||
| Format | ChatGPT (post-5.6) | Google AIO | Gemini | Perplexity |
|
||||
|---|---|---|---|---|
|
||||
| Listicles / best-of | Demoted | Rankings-dependent | OK | OK |
|
||||
| Comparison / vs pages | Demoted | Rankings-dependent | OK | OK |
|
||||
| Original research + data | Strong | Strong | Strong | Strong |
|
||||
| Product/docs/pricing (owned, "official") | **Rising** | Strong | **Dominant** | Strong |
|
||||
| How-to / guides | Steady | Strong | OK | Strong |
|
||||
|
||||
*(Table caveat: the demotion was measured on ChatGPT only. "OK" for Gemini/Perplexity means no demotion has been reported there — not that stability was measured. Any engine can ship its own 5.6-style shift.)*
|
||||
|
||||
4. **Treat every number above as a dated snapshot.** Same doctrine as source volatility: these are Aug 2026 measurements of a moving system. Verify against your own citation monitoring before betting budget.
|
||||
|
||||
## LinkedIn as a citation surface
|
||||
|
||||
LinkedIn is among the most-cited domains for professional queries, but the surface mix shifted during 2026 and differs by engine: ChatGPT moved from Pulse articles to feed posts, Perplexity and Copilot still cite articles and company pages, and Gemini barely cites LinkedIn at all. A post's first words still become its URL slug, so front-load the target phrase.
|
||||
|
||||
Correction: LinkedIn's guide doesn't say Articles get ~60% of citations versus ~40% for Posts. It says articles, newsletters, and posts *combined* account for 60%. Third-party splits put Articles ahead overall (roughly 60–70% vs 25–35%), but not on ChatGPT anymore.
|
||||
|
||||
Full breakdown by engine, crawler access, a `noindex` self-check, and what makes posts citable: [linkedin-ai-citations.md](linkedin-ai-citations.md).
|
||||
|
||||
## DIY diagnostic: extract ChatGPT's real fan-out queries
|
||||
|
||||
You don't need a tool to see what ChatGPT actually searches for in your niche (method circulating publicly, Aug 2026):
|
||||
|
||||
1. Run an important query for your category in ChatGPT (with search).
|
||||
2. Open DevTools → Network tab, refresh the conversation (URL id after `/c/`).
|
||||
3. Find the conversation response payload and search it for `queries`.
|
||||
4. You'll see the literal background searches ChatGPT fanned out to.
|
||||
|
||||
**Use it for:** building your query-test list from *real* fan-out behavior instead of guesses; checking whether your category's fan-outs still use "best/vs" modifiers or have shifted to `site:`/"official" patterns; finding sub-topics your content doesn't cover.
|
||||
|
||||
**Then work backwards from the domains.** If the fan-out runs `site:` searches on third-party sources (Gartner, G2, Capterra) for your category, those profiles are your priority list, often ahead of new pages on your own site. See [positioning-and-consensus.md](positioning-and-consensus.md).
|
||||
|
||||
**Do not use it for:** auto-generating and mass-publishing an article per fan-out query. That's the exact scaled-content pattern 5.6 demoted (and Google's scaled content abuse policy names). The diagnostic is for coverage planning, not content spam.
|
||||
|
||||
## Measurement rigor: AI answers are non-deterministic
|
||||
|
||||
A single ChatGPT answer is an anecdote, not a measurement — the same prompt returns different sources run-to-run. (The statistical-rigor framing here is popularized by Initial Commit's AEO audit skill, Josh Pigford, Aug 2026; the practice stands on its own.)
|
||||
|
||||
When auditing or monitoring:
|
||||
|
||||
- **Track prompts like keywords.** "I'm looking for the best X," "what is the best X," and "find me the best X" usually return the same brands. Collapse wording variants into one core prompt per intent, and spend the budget on repeat runs instead.
|
||||
- **Run each query 3–5 times per platform**, fresh session each time.
|
||||
- **Track mention/citation *rate*** ("cited in 3 of 5 runs"), never a yes/no from one run.
|
||||
- **Report the sample size** with every number ("40% mention rate, n=5") so future-you knows how much to trust it.
|
||||
- **Compare rates over time, not runs.** A drop from 4/5 to 3/5 is noise; a drop from 4/5 to 0/5 sustained across a month is signal.
|
||||
- Before diagnosing *why* you're not cited, split causes the way an audit should: **technical** (can't be crawled/parsed — see agent-readiness.md), **comprehension** (AI describes you inaccurately or vaguely), or **trust** (understood but not selected — see citations-vs-recommendations.md).
|
||||
|
||||
---
|
||||
|
||||
*Sources, all labeled and dated: Peec AI pre/post-5.6 citation data via Tomek Rudzki and Lily Ray (Aug 2026); LinkedIn's AEO guide numbers via Chris Long (Sep 2026, platform-reported); fan-out extraction method as publicly circulated (Aug 2026); measurement-rigor framing credited to Initial Commit's AEO audit skill (Josh Pigford, Aug 2026). All snapshots of a volatile system — verify against your own monitoring.*
|
||||
@@ -0,0 +1,131 @@
|
||||
# LinkedIn Content That Gets Cited by AI
|
||||
|
||||
LinkedIn is one of the most-cited domains for professional and B2B queries. But which LinkedIn surface gets cited depends heavily on the engine, and the mix moved sharply during 2026. Treat every number here as a dated snapshot and check your own prompts.
|
||||
|
||||
## Contents
|
||||
- Which Surface, Which Engine
|
||||
- Who Can Crawl What
|
||||
- What Makes LinkedIn Content Citable
|
||||
- Durability
|
||||
- Risks
|
||||
- Checklist
|
||||
- Sources
|
||||
|
||||
---
|
||||
|
||||
## Which Surface, Which Engine
|
||||
|
||||
| Engine | What it cites from LinkedIn (2026) |
|
||||
|---|---|
|
||||
| **ChatGPT** | Shifted from Pulse articles to feed posts. Ahrefs data shows ChatGPT citations of `/pulse/` down ~86% and `/posts/` up ~74% between May and Oct 2026, with a ~36% overall LinkedIn drop in the mid-August retrieval change that also hit Reddit |
|
||||
| **Perplexity** | Largest raw count of LinkedIn citations in OtterlyAI's sample and our Ahrefs pull, with company pages the biggest share in Ahrefs. (Semrush, measuring the share of answers that cite LinkedIn at all, found it lower on Perplexity than on ChatGPT or AI Mode, so the ranking depends on the measure) |
|
||||
| **Copilot** | Cites LinkedIn heavily and increasingly (citations more than doubled May → Oct 2026, ~6.5× its Reddit citations). Pulse and posts both appear |
|
||||
| **Google AI Overviews / AI Mode** | Posts and Pulse both cited, plus company pages |
|
||||
| **Gemini** | Almost never cites LinkedIn (~0 in three separate datasets). Don't count on LinkedIn for Gemini visibility |
|
||||
| **Claude** | Its search crawler is allowed on articles, posts, profiles, and company pages; little published citation data |
|
||||
|
||||
**What this means:**
|
||||
- Publish both: feed posts for ChatGPT, long-form articles for Perplexity, Copilot, and Google's AI features.
|
||||
- Maintain the company page as well as people's profiles. Perplexity cites company pages most; ChatGPT and AI Mode mostly cite individual members.
|
||||
- Skip collaborative articles (`/advice/`). They're effectively uncited now.
|
||||
|
||||
**Our Ahrefs snapshot** (citations of linkedin.com URLs in Ahrefs' AI-responses data, pulled 2026-10-02; the prompt pool changes over time, so treat as directional):
|
||||
|
||||
| Path | ChatGPT, May 1 | ChatGPT, now | Perplexity | AI Overviews | AI Mode | Copilot | Gemini |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| All linkedin.com | 239K | 185K | 787K | 352K | 292K | 154K (65K in May) | ~0.7K |
|
||||
| `/pulse/` articles | 22.7K | 3.3K | 84K | 43K | 51K | 23K | ~0 |
|
||||
| `/posts/` | 17.7K | 30.8K | 133K | 62K | 55K | 18K | 0 |
|
||||
| `/company/` | — | — | 474K | 51K | 41K | 15K | — |
|
||||
| `/in/` profiles | — | — | 103K | 12K | 13K | 15K | — |
|
||||
|
||||
---
|
||||
|
||||
## Who Can Crawl What
|
||||
|
||||
LinkedIn's robots.txt (checked 2026-10-02):
|
||||
|
||||
| Crawler | Articles, posts, profiles, company pages |
|
||||
|---|---|
|
||||
| Googlebot, Bingbot | Allowed |
|
||||
| OAI-SearchBot (ChatGPT search), Claude-SearchBot | Allowed |
|
||||
| GPTBot, ChatGPT-User, ClaudeBot, Claude-User, PerplexityBot, Perplexity-User, Google-Extended, CCBot | Blocked |
|
||||
|
||||
So ChatGPT and Claude can cite LinkedIn from their search indexes, but their live "go read this page" agents can't fetch it. Perplexity cites LinkedIn most despite both of its bots being blocked, presumably through another index.
|
||||
|
||||
**Check your own articles for `noindex`.** LinkedIn appears to noindex some Pulse articles, reportedly from low-follower or low-engagement accounts, and only for crawlers, so the logged-in author never sees it (one small test, n=3). Check both the robots meta tag and the `X-Robots-Tag` header on the final response, for each crawler you care about:
|
||||
|
||||
```bash
|
||||
URL=https://www.linkedin.com/pulse/your-article-slug
|
||||
for UA in Googlebot bingbot OAI-SearchBot; do
|
||||
echo "== $UA"
|
||||
curl -sIL -A "$UA" "$URL" | grep -iE '^(HTTP/|x-robots-tag)'
|
||||
curl -sL -A "$UA" "$URL" | grep -ioE '<meta[^>]+name="(robots|googlebot|bingbot)"[^>]*>'
|
||||
done
|
||||
```
|
||||
|
||||
A `noindex` in either place for a crawler means that engine's index likely won't carry the article. An absent tag isn't proof it's indexed; confirm with a `site:` search.
|
||||
|
||||
---
|
||||
|
||||
## What Makes LinkedIn Content Citable
|
||||
|
||||
**Supported by independent data:**
|
||||
- **Engagement barely matters.** Likes and comments show almost no correlation with citation. The median cited post has 15–25 reactions; 100 reactions get cited about as often as 10,000.
|
||||
- **Follower count matters little.** Authors under 500 followers get cited, and about half of citations come from authors under 10K.
|
||||
- **Original over reshared.** About 95% of cited posts are original.
|
||||
- **Teach something.** Most cited posts share knowledge or advice.
|
||||
- **Consistency.** About 75% of cited post authors posted 5+ times in the prior four weeks.
|
||||
- **Length.** Cited articles are mostly 500–2,000 words; cited posts mostly 50–300 words.
|
||||
- **Recent.** About half of cited content is under three months old.
|
||||
|
||||
**Vendor causal model (Scrunch, ~4K posts, treat as directional):** technical detail (+77%), named entities like tools, companies, and people (+33%), and a niche topic (+18%) raised citation. Unicode bold or italic text (−58%) and "link in comments" (−31%) lowered the post's own citations. The study is about ChatGPT, and it also found link-in-comments can help the linked page get cited, so it's a trade-off if your goal is citations for your own site.
|
||||
|
||||
**Platform-reported (LinkedIn's guide, Mar 2026):** articles of 800–1,200 words, posts of 200–300 words, post 2–3 times a week. The guide also suggests 3,000+ followers and 10+ comments help, which the independent data above doesn't support.
|
||||
|
||||
**Mechanics:**
|
||||
- A post's first words become its URL slug, so front-load the target phrase.
|
||||
- Structure articles like blog content: clear headings, a direct answer early, specific numbers and names.
|
||||
|
||||
---
|
||||
|
||||
## Durability
|
||||
|
||||
- Citations can be durable for specific, low-competition prompts. One B2B writer's six Pulse articles were cited in 54–86% of 28 tracked runs over ~20 weeks for a niche prompt (Kaleigh Moore, Sep 2026, anecdote).
|
||||
- At the platform level they're volatile. One fixed-prompt study measured LinkedIn's share of AI answers falling ~65% from Feb to Jul 2026, while others measured it rising on Perplexity over the same months. Track by engine, and don't put all your third-party effort into LinkedIn (see the volatility section in [agent-readiness.md](agent-readiness.md)).
|
||||
|
||||
---
|
||||
|
||||
## Risks
|
||||
|
||||
- **No canonical control.** LinkedIn sets its own canonical on articles, so a full republish of your blog post competes with your own page. Publish on your site first, then post an adapted version (rewrite a meaningful share of it) or a summary that links back.
|
||||
- **You don't own it.** LinkedIn decides indexing, can noindex articles, and changes formats. By default, US members' content can be used to train LinkedIn and Microsoft models.
|
||||
- **Gemini blind spot.** Visibility built on LinkedIn won't carry to Gemini.
|
||||
|
||||
---
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] Feed posts and long-form articles both in the mix, matched to the engines you care about
|
||||
- [ ] Company page complete and consistent with your About page (see [positioning-and-consensus.md](positioning-and-consensus.md))
|
||||
- [ ] Target phrase in a post's first words
|
||||
- [ ] Original, specific, technical content with named entities; no Unicode bold; decide deliberately where the link goes (in-post helps the post, in-comments may help the destination)
|
||||
- [ ] Articles checked for crawler `noindex`
|
||||
- [ ] Blog posts published on your own site first; LinkedIn version adapted, not duplicated
|
||||
- [ ] Citations tracked per engine, re-checked monthly
|
||||
|
||||
---
|
||||
|
||||
## Sources
|
||||
|
||||
All dated; most are vendor studies running their own trackers, so none is fully neutral.
|
||||
|
||||
- Profound, LinkedIn as most-cited domain for professional queries (Mar 2026): https://www.tryprofound.com/blog/linkedin-is-the-most-cited-domain-for-professional-queries-in-ai-search
|
||||
- Semrush, LinkedIn AI visibility study, 325K prompts (Mar 2026): https://www.semrush.com/blog/linkedin-ai-visibility-study/
|
||||
- OtterlyAI, LinkedIn AI search citations study, 1.31M citations (Jun 2026): https://otterly.ai/blog/linkedin-ai-search-citations-study/
|
||||
- Cloro, LinkedIn articles vs posts (Aug–Sep 2026): https://cloro.dev/blog/linkedin-articles-vs-posts/
|
||||
- Goodie, social media AI citations study (Sep 2026): https://higoodie.com/blog/social-media-ai-citations-study-2026/
|
||||
- Scrunch, LinkedIn posts and ChatGPT citations (May 2026): https://scrunch.com/blog/linkedin-posts-robots-cant-resist-what-data-says-about-chatgpt-citations
|
||||
- Mid-August 2026 ChatGPT source shift (Promptwatch, Petra Labs): https://somethinginc.com/blog/chatgpt-citation-sources-docs-replaced-reddit/
|
||||
- Ahrefs AI responses data by URL path, pulled 2026-10-02 (directional; the prompt pool changes over time)
|
||||
- LinkedIn robots.txt, fetched 2026-10-02; LinkedIn's AEO guide (Mar 2026)
|
||||
@@ -0,0 +1,104 @@
|
||||
# Open Knowledge Format (OKF)
|
||||
|
||||
Google's v0.1 markdown spec for representing site content as an agent-readable bundle. Introduced on the [Google Cloud blog](https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing) on 2026-06-12 and shipped inside Knowledge Catalog.
|
||||
|
||||
## What it is
|
||||
|
||||
OKF is a directory of cross-linked markdown files. Each file has:
|
||||
|
||||
- A YAML frontmatter block (`type` required; `title`, `description`, `resource`, `tags`, `timestamp` recommended)
|
||||
- A standard markdown body
|
||||
- Standard markdown links to other files in the bundle (which the spec treats as concept relationships)
|
||||
|
||||
An optional `index.md` lists the files for progressive disclosure. The bundle can be distributed as a git repo (recommended), a tarball/zip, or a subdirectory of a larger repo.
|
||||
|
||||
The [full spec](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/HEAD/okf/SPEC.md) fits on one page. The repo lives under `GoogleCloudPlatform` (the "not an official Google product" disclaimer is Google's standard open-source boilerplate, not a denial — it appears on most of Google's open-source repos including their main AI samples repo).
|
||||
|
||||
### A minimal concept file
|
||||
|
||||
```markdown
|
||||
---
|
||||
type: Article
|
||||
title: How to Connect the Ahrefs MCP Server to Manus
|
||||
description: The official MCP servers, why they did not connect, and the fix.
|
||||
resource: https://yoursite.com/blog/ahrefs-mcp-manus/
|
||||
tags: [mcp, ahrefs]
|
||||
---
|
||||
|
||||
# How to Connect the Ahrefs MCP Server to Manus
|
||||
|
||||
The body of the post, as clean markdown.
|
||||
```
|
||||
|
||||
Add an `index.md` that lists all files so an agent can see the bundle's shape before opening each file, and that is the entire format.
|
||||
|
||||
## Honest framing
|
||||
|
||||
**Google built OKF for data teams sharing catalog metadata** — BigQuery tables, API endpoints, metrics, playbooks. Most of the spec's examples are data-team artifacts, not blog posts. Google's blog post framing: "improve data sharing" and "standardized documentation" for collaboration across teams.
|
||||
|
||||
Pointing OKF at a marketing site is a **clever repurposing** popularized by [Suganthan Mohanadasan](https://suganthan.com/blog/open-knowledge-format/). It's a legitimate use case for the format but not Google's primary one. Frame it accurately when explaining it to founders or marketing teams.
|
||||
|
||||
## What it does for AI search today
|
||||
|
||||
Nothing immediate. Nothing crawls the web for OKF bundles yet — the spec is weeks old, no AI engine has announced integration, and Knowledge Catalog ingests bundles only for paying enterprise customers' data teams.
|
||||
|
||||
Treat OKF as **protocol-layer registration** — the same shape of bet as early `schema.org` adoption was a decade ago. Schema took the better part of ten years to pay off; people who shipped it early are still glad they did.
|
||||
|
||||
A secondary benefit that pays off today regardless: **generating the bundle is itself an internal-linking audit**. Suganthan's tool draws every page as a node and every internal link as an edge, so islands and orphans become obvious at a glance.
|
||||
|
||||
## Where OKF fits in the agent-readable stack
|
||||
|
||||
| Layer | Purpose |
|
||||
|---|---|
|
||||
| `sitemap.xml` | Tells a crawler which URLs exist |
|
||||
| `robots.txt` (with AI bot rules) | Permits or blocks AI crawlers |
|
||||
| `llms.txt` | Points an agent at the handful of pages you most want read |
|
||||
| `/pricing.md` | Structured pricing for agent-buyer comparisons |
|
||||
| **`/okf/` bundle** | Hands over the content itself as cross-linked concepts |
|
||||
| Schema markup | Per-page structured data (Article, FAQPage, Product, etc.) |
|
||||
|
||||
These stack rather than compete. `llms.txt` is a signpost, OKF is the library.
|
||||
|
||||
## How to ship one
|
||||
|
||||
Three options, ordered by how much effort they take:
|
||||
|
||||
### 1. Suganthan's free web tool (recommended for most sites)
|
||||
|
||||
[suganthan.com/okf-generator](https://suganthan.com/okf-generator/) — paste a URL or sitemap, crawls up to 100 pages, returns a downloadable bundle. Also draws the resulting page graph so you can spot disconnected pages before publishing.
|
||||
|
||||
### 2. WordPress plugin (pending wp.org approval)
|
||||
|
||||
Suganthan's plugin (free, GPL, awaiting wp.org approval at time of writing) installs in a minute, serves the bundle at `/okf/`, and rebuilds on every publish or edit so it stays in sync. Direct download link is in [his blog post](https://suganthan.com/blog/open-knowledge-format/). Requires WordPress 6.0+ and PHP 7.4+. Read-only — never edits posts or settings.
|
||||
|
||||
### 3. By hand
|
||||
|
||||
Only practical for a handful of pages. Each post becomes a markdown file with frontmatter that you cross-link manually. Miserable for a whole site.
|
||||
|
||||
## Hosting & discovery
|
||||
|
||||
Serve the bundle at `yoursite.com/okf/`, starting with `yoursite.com/okf/index.md`:
|
||||
|
||||
- **Static hosts / Cloudflare**: drag and drop
|
||||
- **WordPress**: Suganthan's plugin handles the serving
|
||||
- **Static sites with custom paths**: upload the directory to `/okf/`
|
||||
- **Closed platforms (Wix, Squarespace, most page-builders)**: you usually can't serve files at custom paths — skip OKF entirely
|
||||
|
||||
After it's serving, add a line to `llms.txt` pointing to the bundle so agents that read `llms.txt` (today) can discover the bundle (later).
|
||||
|
||||
## When to skip
|
||||
|
||||
- Site is <10 pages — overhead exceeds payoff
|
||||
- Site is on a closed platform that won't allow custom paths
|
||||
- You're not maintaining `llms.txt`, schema markup, or other machine-readable files (OKF compounds with those; alone it does nothing)
|
||||
- You can't budget the 30 minutes a quarter to refresh the bundle as content changes
|
||||
|
||||
## What to watch
|
||||
|
||||
OKF is v0.1, weeks old. Worth tracking, not worth obsessing over:
|
||||
|
||||
- Whether Google announces OKF support in AI Overviews / Knowledge Graph (currently no signal)
|
||||
- Whether non-Google engines (ChatGPT, Perplexity, Claude) announce OKF reading
|
||||
- Whether the spec moves to v1.0 (breaking changes are possible at <1.0)
|
||||
- Whether Knowledge Catalog adds public ingestion endpoints
|
||||
- Adoption signals — search GitHub for `okf/index.md` to see who's shipping bundles
|
||||
@@ -0,0 +1,167 @@
|
||||
# How Each AI Platform Picks Sources
|
||||
|
||||
Each AI search platform has its own search index, ranking logic, and content preferences. This guide covers what matters for getting cited on each one.
|
||||
|
||||
Sources cited throughout: Princeton GEO study (KDD 2024), SE Ranking domain authority study, ZipTie content-answer fit analysis.
|
||||
|
||||
---
|
||||
|
||||
## The Fundamentals
|
||||
|
||||
Every AI platform shares three baseline requirements:
|
||||
|
||||
1. **Your content must be in their index** — Each platform uses a different search backend (Google, Bing, Brave, or their own). If you're not indexed, you can't be cited.
|
||||
2. **Your content must be crawlable for discovery** — Allow the relevant search-discovery path through robots.txt and your WAF; model-training controls are separate.
|
||||
3. **Your content must be extractable** — AI systems pull passages, not pages. Clear structure and self-contained paragraphs win.
|
||||
|
||||
Beyond these basics, each platform weights different signals. Here's what matters and where.
|
||||
|
||||
---
|
||||
|
||||
## Google AI Overviews
|
||||
|
||||
Google AI Overviews pull from Google's own index and lean heavily on E-E-A-T signals (Experience, Expertise, Authoritativeness, Trustworthiness). Studies have measured them on roughly 45% of tracked keywords (BrightEdge).
|
||||
|
||||
**What makes Google AI Overviews different:** They already have your traditional SEO signals — backlinks, page authority, topical relevance. The additional AI layer adds a preference for content with cited sources and structured data. The GEO study (Aggarwal et al., 2023) found that adding citations, quotations, and statistics raised visibility by roughly 30–40% on its own metric; individual examples in the paper show much larger jumps, but those aren't typical or additive.
|
||||
|
||||
**AI Overviews don't just recycle the traditional Top 10.** Some studies have put the overlap between AI Overview sources and conventional organic results as low as ~15%, though figures vary widely by study, date, and query set. Pages that wouldn't crack page 1 can still get cited with clear, extractable answers. Even so, practitioners consistently find that better organic rankings mean better AI visibility, so don't treat the low-overlap stat as permission to skip SEO.
|
||||
|
||||
**What to focus on:**
|
||||
- Schema markup gives AI Overviews structured context (Article, HowTo, Product). It's one lever among several, and Google says no special markup is required for AI features. Google limited FAQ rich results to government and health sites in 2023, so don't promise an AI lift from FAQPage schema
|
||||
- Build topical authority through content clusters with strong internal linking
|
||||
- Include named, sourced citations in your content (not just claims)
|
||||
- Author bios with real credentials matter — E-E-A-T is weighted heavily
|
||||
- Get into Google's Knowledge Graph where possible (an accurate Wikipedia entry helps)
|
||||
- Target "how to" and "what is" query patterns — these trigger AI Overviews most often
|
||||
|
||||
**Watch for OKF.** In June 2026 Google introduced the [Open Knowledge Format](https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing) — a markdown spec for agent-readable site bundles. There is no confirmed signal that AI Overviews factor it in today, but the spec is published, the GitHub repo lives under `GoogleCloudPlatform`, and it ships inside Knowledge Catalog. For protocol-layer "register early" plays, it has the same shape as early schema.org adoption did a decade ago. See **Machine-Readable Files for AI Agents** in the main `SKILL.md` for how to generate and serve a bundle.
|
||||
|
||||
---
|
||||
|
||||
## ChatGPT
|
||||
|
||||
ChatGPT's web search draws from a Bing-based index. It combines this with its training knowledge to generate answers, then cites the web sources it relied on.
|
||||
|
||||
**What makes ChatGPT different:** Domain authority matters more here than on other AI platforms. An SE Ranking analysis of 129,000 domains found that authority and credibility signals account for roughly 40% of what determines citation, with content quality at about 35% and platform trust at 25%. Sites with very high referring domain counts (350K+) average 8.4 citations per response, while sites with slightly lower trust scores (91-96 vs 97-100) drop from 8.4 to 6 citations.
|
||||
|
||||
**Freshness is a major differentiator.** Content updated within the last 30 days gets cited about 3.2x more often than older content. ChatGPT clearly favors recent information.
|
||||
|
||||
**The most important signal is content-answer fit** — a ZipTie analysis of 400,000 pages found that how well your content's style and structure matches ChatGPT's own response format accounts for about 55% of citation likelihood. This is far more important than domain authority (12%) or on-page structure (14%) alone. Write the way ChatGPT would answer the question, and you're more likely to be the source it cites.
|
||||
|
||||
**Where ChatGPT looks beyond your site:** Wikipedia accounts for 7.8% of all ChatGPT citations, Reddit for 1.8%, and Forbes for 1.1%. Brand official sites are cited frequently but third-party mentions carry significant weight.
|
||||
|
||||
**What to focus on:**
|
||||
- Invest in backlinks and domain authority — it's the strongest baseline signal
|
||||
- Update competitive content at least monthly
|
||||
- Structure your content the way ChatGPT structures its answers (conversational, direct, well-organized)
|
||||
- Include verifiable statistics with named sources
|
||||
- Clean heading hierarchy (H1 > H2 > H3) with descriptive headings
|
||||
|
||||
---
|
||||
|
||||
## Perplexity
|
||||
|
||||
Perplexity always cites its sources with clickable links, making it the most transparent AI search platform. It combines its own index with Google's and runs results through multiple reranking passes — initial relevance retrieval, then traditional ranking factor scoring, then ML-based quality evaluation that can discard entire result sets if they don't meet quality thresholds.
|
||||
|
||||
**What makes Perplexity different:** It's the most "research-oriented" AI search engine, and its citation behavior reflects that. Perplexity maintains curated lists of authoritative domains (Amazon, GitHub, major academic sites) that get inherent ranking boosts. It uses a time-decay algorithm that evaluates new content quickly, giving fresh publishers a real shot at citation.
|
||||
|
||||
**Perplexity has unique content preferences:**
|
||||
- **FAQ Schema (JSON-LD)** — Pages with FAQ structured data get cited noticeably more often
|
||||
- **PDF documents** — Publicly accessible PDFs (whitepapers, research reports) are prioritized. If you have authoritative PDF content gated behind a form, consider making a version public.
|
||||
- **Publishing velocity** — How frequently you publish matters more than keyword targeting
|
||||
- **Self-contained paragraphs** — Perplexity prefers atomic, semantically complete paragraphs it can extract cleanly
|
||||
|
||||
**What to focus on:**
|
||||
- Allow PerplexityBot in robots.txt
|
||||
- Implement FAQPage schema on any page with Q&A content
|
||||
- Host PDF resources publicly (whitepapers, guides, reports)
|
||||
- Add Article schema with publication and modification timestamps
|
||||
- Write in clear, self-contained paragraphs that work as standalone answers
|
||||
- Build deep topical authority in your specific niche
|
||||
|
||||
---
|
||||
|
||||
## Microsoft Copilot
|
||||
|
||||
Copilot is embedded across Microsoft's ecosystem — Edge, Windows, Microsoft 365, and Bing Search. It relies entirely on Bing's index, so if Bing hasn't indexed your content, Copilot can't cite it.
|
||||
|
||||
**What makes Copilot different:** The Microsoft ecosystem connection creates unique optimization opportunities. Copilot cites LinkedIn heavily (its LinkedIn citations more than doubled May → Oct 2026 and run about 6.5× its Reddit citations, per Ahrefs data), and GitHub content is a natural fit too. Copilot also puts more weight on page speed — sub-2-second load times are a clear threshold.
|
||||
|
||||
**What to focus on:**
|
||||
- Submit your site to Bing Webmaster Tools (many sites only submit to Google Search Console)
|
||||
- Use IndexNow protocol for faster indexing of new and updated content
|
||||
- Optimize page speed to under 2 seconds
|
||||
- Write clear entity definitions — when your content defines a term or concept, make the definition explicit and extractable
|
||||
- Build presence on LinkedIn (articles, posts, and a complete company page; see [linkedin-ai-citations.md](linkedin-ai-citations.md)) and GitHub if relevant
|
||||
- Ensure Bingbot has full crawl access
|
||||
|
||||
---
|
||||
|
||||
## Claude
|
||||
|
||||
Claude uses Brave Search as its search backend when web search is enabled — not Google, not Bing. This is a completely different index, which means your Brave Search visibility directly determines whether Claude can find and cite you.
|
||||
|
||||
**What makes Claude different:** Claude is extremely selective about what it cites. While it processes enormous amounts of content, its citation rate is very low — it's looking for the most factually accurate, well-sourced content on a given topic. Data-rich content with specific numbers and clear attribution performs significantly better than general-purpose content.
|
||||
|
||||
**What to focus on:**
|
||||
- Verify your content appears in Brave Search results (search for your brand and key terms at search.brave.com)
|
||||
- Decide separately whether to allow `Claude-SearchBot` for search discovery, `Claude-User` for user-directed retrieval, and `ClaudeBot` for potential model training
|
||||
- Maximize factual density — specific numbers, named sources, dated statistics
|
||||
- Use clear, extractable structure with descriptive headings
|
||||
- Cite authoritative sources within your content
|
||||
- Aim to be the most factually accurate source on your topic — Claude rewards precision
|
||||
- Don't rely on self-ranked "best X" lists. In a live test (Sep 2026), Claude noted that results for a "best [category]" query were dominated by vendors ranking themselves #1 and leaned on juried awards and practitioner reputation instead
|
||||
|
||||
---
|
||||
|
||||
## Allowing AI Bots in robots.txt
|
||||
|
||||
Do not copy one blanket allowlist. Choose controls by documented purpose, then check WAF and CDN rules as well as `robots.txt`.
|
||||
|
||||
```text
|
||||
# Automatic search discovery
|
||||
User-agent: Bingbot
|
||||
User-agent: Googlebot
|
||||
User-agent: OAI-SearchBot
|
||||
User-agent: PerplexityBot
|
||||
User-agent: Claude-SearchBot
|
||||
Allow: /
|
||||
|
||||
# Potential model training (publisher choice shown as disallow)
|
||||
User-agent: GPTBot
|
||||
User-agent: ClaudeBot
|
||||
Disallow: /
|
||||
|
||||
# Gemini model training and grounding (publisher choice shown as disallow)
|
||||
User-agent: Google-Extended
|
||||
Disallow: /
|
||||
```
|
||||
|
||||
User-triggered fetchers such as `ChatGPT-User`, `Claude-User`, and `Perplexity-User` are separate from automatic discovery. Vendor behavior can differ: OpenAI says `robots.txt` rules may not apply to `ChatGPT-User`, and Perplexity says `Perplexity-User` generally ignores them because these fetches are user-requested. Use `OAI-SearchBot`, not `ChatGPT-User`, to manage ChatGPT Search inclusion. `Google-Extended` is a standalone product token rather than a separate HTTP crawler; Google says it controls certain Gemini training and grounding uses and does not affect Google Search inclusion or ranking.
|
||||
|
||||
Verify the current names and consequences in the vendors' maintained documentation: [OpenAI](https://developers.openai.com/api/docs/bots), [Perplexity](https://docs.perplexity.ai/docs/resources/perplexity-crawlers), [Anthropic](https://privacy.anthropic.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler), and [Google](https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers).
|
||||
|
||||
For implementation, inspect `/robots.txt` manually first. Optional helpers include each vendor's own crawler documentation and robots.txt testing tools.
|
||||
|
||||
---
|
||||
|
||||
## Where to Start
|
||||
|
||||
If you're optimizing for AI search for the first time, focus your effort where your audience actually is:
|
||||
|
||||
**Start with Google AI Overviews** — They reach the most users (45%+ of Google searches) and you likely already have Google SEO foundations in place. Add schema markup, include cited sources in your content, and strengthen E-E-A-T signals.
|
||||
|
||||
**Then address ChatGPT** — It's the most-used standalone AI search tool for tech and business audiences. Focus on freshness (update content monthly), domain authority, and matching your content structure to how ChatGPT formats its responses.
|
||||
|
||||
**Then expand to Perplexity** — Especially valuable if your audience includes researchers, early adopters, or tech professionals. Add FAQ schema, publish PDF resources, and write in clear, self-contained paragraphs.
|
||||
|
||||
**Copilot and Claude are lower priority** unless your audience skews enterprise/Microsoft (Copilot) or developer/analyst (Claude). But the fundamentals — structured content, cited sources, schema markup — help across all platforms.
|
||||
|
||||
**Actions that help everywhere:**
|
||||
1. Set an explicit, purpose-specific robots policy: allow relevant discovery crawlers while deciding training and user-triggered retrieval separately
|
||||
2. Implement schema markup (FAQPage, Article, Organization at minimum)
|
||||
3. Include statistics with named sources in your content
|
||||
4. Update content regularly — monthly for competitive topics
|
||||
5. Use clear heading structure (H1 > H2 > H3)
|
||||
6. Keep page load time under 2 seconds
|
||||
7. Add author bios with credentials
|
||||
@@ -0,0 +1,102 @@
|
||||
# Positioning and Consensus in AI Answers
|
||||
|
||||
LLMs don't just retrieve pages. They hold an association between your brand and a category, a segment, and a set of strengths and weaknesses, built from everything written about you. This reference covers how to shape that association, and why it moves slowly.
|
||||
|
||||
Most of this comes from practitioner experience rather than controlled studies, mainly Harpreet Singh on Edward Sturm's podcast (E1182, "AEO Companies Are Selling You 2016 SEO," Sep 2026). Claims are labeled as anecdote or opinion where that's all they are.
|
||||
|
||||
## Contents
|
||||
- Old SEO, New Name
|
||||
- Positioning Moves Slowly
|
||||
- Make Every Profile Say the Same Thing
|
||||
- Work Backwards from the Fan-Out
|
||||
- Segment and Industry Pages
|
||||
- Managing the "Cons" Others Write
|
||||
- Head Terms Where Incumbents Are Already Chosen
|
||||
- What Not to Copy
|
||||
|
||||
---
|
||||
|
||||
## Old SEO, New Name
|
||||
|
||||
Much of what gets sold as AEO is traditional SEO: keywords in URLs, FAQs, meta descriptions, solution pages, listicles, press releases. These still work, because strong organic rankings remain one of the best predictors of AI visibility, especially in Google's AI features.
|
||||
|
||||
The risk is applying them without the history. Tactics that were tuned for years (how many FAQs, how keyword-stuffed a URL, how many near-duplicate pages) get overused when someone presents them as new, and the result can be a short-term lift followed by lost organic traffic (practitioner opinion; no data cited).
|
||||
|
||||
**How to apply:** before recommending a tactic as "for AI," ask whether it's an SEO tactic with a known failure mode, and keep it inside normal SEO limits. Be skeptical of vendor statistics with no source or date.
|
||||
|
||||
---
|
||||
|
||||
## Positioning Moves Slowly
|
||||
|
||||
A brand known for one segment for years doesn't become known for another because its pages change.
|
||||
|
||||
- **Repositioning:** a mid-market brand that rewrites its site for enterprise can lose mid-market answers before it earns enterprise ones, and "disappear from LLMs for a while." Enterprise prompts are already associated with incumbents (anecdote, one client).
|
||||
- **Mergers and rebrands:** an acquired brand often stops appearing for prompts it used to own once its pages fold into the parent (practitioner observation).
|
||||
- **Local and niche markets too:** for many categories, models have "already picked their winners," and new entrants start behind (opinion).
|
||||
|
||||
**How to apply before a repositioning, rebrand, or merger** (a practitioner sequence, not a tested playbook):
|
||||
1. Record a baseline for the old segment's prompts *and* the target segment's prompts.
|
||||
2. Watch for a dip and warn stakeholders it may happen. This rests on practitioner reports, not controlled data.
|
||||
3. Move off-site signals first (profiles, reviews, press, analyst listings, partner pages), then stage the on-site rewrite, rather than switching everything at once.
|
||||
4. Keep pages that still win old-segment prompts until the new association shows up in tracking.
|
||||
|
||||
---
|
||||
|
||||
## Make Every Profile Say the Same Thing
|
||||
|
||||
Models look for consensus. Your G2, Capterra, Gartner, Crunchbase, LinkedIn, and partner-directory profiles should describe you with the same segment, category, and differentiators as your About page. If you're targeting enterprise, those profiles should say enterprise.
|
||||
|
||||
- Fill in free profiles fully (what you do, who it's for, which industries), even on platforms you don't pay for.
|
||||
- Review text matters as much as profile text. Models read what customers say on those pages.
|
||||
- This is one of the cheapest changes available: an afternoon of edits across profiles you already have.
|
||||
|
||||
Pair with the review-generation playbook in the directory-submissions skill.
|
||||
|
||||
---
|
||||
|
||||
## Work Backwards from the Fan-Out
|
||||
|
||||
Extract the real background queries for your key prompts (the DevTools method in [format-volatility.md](format-volatility.md)), then look at which domains they name.
|
||||
|
||||
- If ChatGPT's first fan-out round runs `site:` searches on Gartner, G2, or Capterra for your category, those profiles are your priority, often ahead of publishing another page on your own site.
|
||||
- The mix differs by category and changes over time, so check your own prompts rather than copying someone else's list. One practitioner saw Gartner rise in finance-software fan-outs and moved review effort from G2 toward Gartner (anecdote).
|
||||
|
||||
---
|
||||
|
||||
## Segment and Industry Pages
|
||||
|
||||
AI answers are increasingly personalized and segment-aware: models place brands into enterprise, mid-market, or SMB, and match them to industries.
|
||||
|
||||
- Build pages for the core industries or segments you actually serve ("email marketing for e-commerce," "RFP software for government"), with real specifics for each.
|
||||
- Start with your core segments. Scale isn't the problem in itself; near-duplicate pages that swap the industry name without adding real value are what Google's scaled-content policy targets. See [content-types.md](content-types.md).
|
||||
|
||||
---
|
||||
|
||||
## Managing the "Cons" Others Write
|
||||
|
||||
Affiliates and review aggregators list a con for every product to look balanced. Find what they say about you.
|
||||
|
||||
- If a listed con reinforces a known weakness models already repeat (for example, long implementation), ask the publisher to use a different con that is also true and less central.
|
||||
- Never ask for negatives to be removed or for false claims. The goal is accuracy, not a clean sheet.
|
||||
|
||||
To repair a weakness models repeat, address it in public with specifics: one practitioner's client turned "implementation takes forever" around over 1.5–2 years with founder posts about the process, guides on real timelines, and a concrete "4–8 weeks" on the implementation page (anecdote). See also the "recommended against" section of [citations-vs-recommendations.md](citations-vs-recommendations.md).
|
||||
|
||||
---
|
||||
|
||||
## Head Terms Where Incumbents Are Already Chosen
|
||||
|
||||
For prompts like "best email marketing software," incumbents are in the training data and on every list. Practitioner playbooks (opinion, not tested):
|
||||
|
||||
- **Run both formats.** A solution page for the term and a buyer's-guide listicle, since engines currently weight them differently (see [format-volatility.md](format-volatility.md)).
|
||||
- **Amplify earned third-party proof.** Publish and promote G2 grid placements and analyst mentions; don't just collect them.
|
||||
- **Occupy several places on the results page.** Your YouTube video, creator coverage, review profiles, and press, not only your own page. Compare Google and Bing results, since different engines draw on different backends.
|
||||
- **Rank the leader honestly.** In a "best X for Y" guide, it can work better to name the category leader first and show where you go further, than to rank yourself #1 (see the self-promotional listicle risk in [citations-vs-recommendations.md](citations-vs-recommendations.md)).
|
||||
|
||||
---
|
||||
|
||||
## What Not to Copy
|
||||
|
||||
The same episode floats tactics this skill does not recommend:
|
||||
|
||||
- **Invented awards or brand-run "review" sites** presented as independent. These are inauthentic mentions, and fake or misleadingly sourced reviews can break the FTC's 2024 rule on consumer reviews and testimonials (16 CFR Part 465).
|
||||
- **Fast-decaying press-release tricks** (which cheap wire syndicates into which outlets). If you use press releases, check that the destination pages are indexed before paying; outlets change this without notice.
|
||||
@@ -0,0 +1,66 @@
|
||||
# YouTube Videos That Get Cited by AI
|
||||
|
||||
YouTube is one of the most-cited third-party surfaces in AI answers — Google AI Overviews and Gemini cite it heavily, and ChatGPT/Perplexity lift from it for how-to queries. The core insight that changes how you produce for it:
|
||||
|
||||
**Models don't watch your video. They read everything around it.** The citation is earned by the text layer — title, transcript, captions, chapters, description, and comments — not the footage. A mediocre-looking video with a clean, structured text layer beats a beautiful one that's opaque to a crawler.
|
||||
|
||||
## The anatomy
|
||||
|
||||
Work through these in order of leverage:
|
||||
|
||||
### 1. The transcript (the real content)
|
||||
|
||||
This is what the model actually reads. Optimize the *spoken words*:
|
||||
|
||||
- **Answer questions in complete, liftable sentences.** "The five steps to create an SOP are…" extracts cleanly; a rambling answer spread across three tangents doesn't.
|
||||
- Script or outline the key answers before recording so each core question gets a clear, structured spoken answer in one place.
|
||||
- Say the important terms out loud — the product name, the category, the entities you want associated. If it's only on a slide, the model may never see it.
|
||||
|
||||
### 2. Accurate captions
|
||||
|
||||
Auto-captions are messy — misheard product names, no punctuation, broken sentences — and messy captions are what the model reads if you don't fix them. Upload cleaned captions (or at minimum correct the auto-generated ones). This is the cheapest fix on the list.
|
||||
|
||||
### 3. A question-shaped title
|
||||
|
||||
Models match the title against the user's prompt. "How to Create SOPs That Scale Your Business" beats a clever title every time. Front-load the question or task; save the branding for the channel.
|
||||
|
||||
### 4. Chapters and timestamps
|
||||
|
||||
Chapters let the model (and viewers) jump to the exact answer. Structure = extractability: each chapter title is another labeled, liftable claim about what the video covers. Match chapter titles to the sub-questions people actually ask.
|
||||
|
||||
### 5. A keyword-rich, structured description
|
||||
|
||||
Restate the video's key points *as text* in the description — a short summary, then a bulleted list of what's covered, then resource links. This reinforces the topic and entities in plain crawlable text and gives the model a second, cleaner copy of the answer.
|
||||
|
||||
### 6. A pinned comment with the summary
|
||||
|
||||
An extra liftable text block: pin a comment with the core answer in numbered steps plus the key links. It's indexed, it's structured, and it survives even when viewers never open the description.
|
||||
|
||||
### 7. Thumbnail and engagement
|
||||
|
||||
Engagement isn't read directly by LLMs, but it drives the watch signals that lift YouTube ranking — and YouTube ranking feeds what AI systems surface and cite. The thumbnail's job is the click; the text layer's job is the citation.
|
||||
|
||||
## Publishing checklist
|
||||
|
||||
- [ ] Title is question- or task-shaped and matches a real query
|
||||
- [ ] Key answers spoken as complete, structured statements
|
||||
- [ ] Captions uploaded or corrected (product names spelled right)
|
||||
- [ ] Chapters added, titled by sub-question
|
||||
- [ ] Description restates the key points in text with a bulleted breakdown
|
||||
- [ ] Pinned comment carries the summary + links
|
||||
- [ ] Important entities (brand, category, product) spoken *and* written
|
||||
|
||||
## Field notes (Sep 2026)
|
||||
|
||||
- **The citation bar can be low.** In a live check, an 8-day-old video with under 100 views was the first source cited in Google's AI Overview for "best email marketing software." Fresh, well-labeled videos on head terms are worth testing.
|
||||
- **Ungate your demos.** Post product demos publicly with keyword-first titles ("[Category] software demo – [Brand]") instead of locking them behind a form.
|
||||
- **Sponsored creator videos are hard to attribute.** Practitioners quote $20–40K per sponsored video and no reliable way to prove the return. Budget them with an attribution plan (the self-reported field in [citations-vs-recommendations.md](citations-vs-recommendations.md)) or not at all.
|
||||
|
||||
## Related
|
||||
|
||||
- The same "models read the text layer" logic applies to podcasts: episodes get transcribed and show notes get published, so podcast guesting is earned media that compounds in AI answers — see the `public-relations` skill's podcast guest prep reference.
|
||||
- For producing the videos themselves, see the `video` skill.
|
||||
|
||||
---
|
||||
|
||||
*Anatomy pattern from Ross Simmonds / Foundation Inc. ("The Anatomy of a YouTube Video AI Cites," 2026), distilled and extended with credit.*
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Corey Haines
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,214 @@
|
||||
---
|
||||
name: cold-email
|
||||
description: Write and run B2B cold outbound that gets replies, from cold emails and follow-ups to sending setup, LinkedIn, multichannel cadences, and reply handling. Use when the user mentions "cold email," "cold outreach," "outbound," "prospecting email," "SDR emails," "follow-up sequence," "nobody's replying," "email deliverability," "sending domains," "warm up inboxes," "LinkedIn outreach," "connection request message," "multichannel sequence," "cadence," "cold call," "voicemail," "handle replies," "AI SDR," "teardown outreach," or "product-led outbound." Send from secondary domains, verify lists first, turn off open tracking, and stop every channel when a prospect replies. Copy avoids AI tells like 'it's not X, it's Y' reveals. For building the list and account research, see prospecting. For lifecycle email, see emails. For call scripts and sales collateral, see sales-enablement.
|
||||
metadata:
|
||||
version: 2.2.0
|
||||
---
|
||||
|
||||
# Cold Email Writing
|
||||
|
||||
You are an expert in cold outbound. Your goal is to write emails that sound like they came from a sharp, thoughtful human — not a sales machine following a template — and to make sure they reach the inbox, work alongside the other channels, and turn replies into meetings.
|
||||
|
||||
## Before Writing
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Understand the situation (ask if not provided):
|
||||
|
||||
1. **Who are you writing to?** — Role, company, why them specifically
|
||||
2. **What do you want?** — The outcome (meeting, reply, intro, demo)
|
||||
3. **What's the value?** — The specific problem you solve for people like them
|
||||
4. **What's your proof?** — A result, case study, or credibility signal
|
||||
5. **Any research signals?** — Funding, hiring, LinkedIn posts, company news, tech stack changes
|
||||
|
||||
Work with whatever the user gives you. If they have a strong signal and a clear value prop, that's enough to write. Don't block on missing inputs — use what you have and note what would make it stronger.
|
||||
|
||||
---
|
||||
|
||||
## Writing Principles
|
||||
|
||||
### Write like a peer, not a vendor
|
||||
|
||||
The email should read like it came from someone who understands their world and isn't trying to sell them something. Use contractions. Read it aloud. If it sounds like marketing copy, rewrite it.
|
||||
|
||||
### Every sentence must earn its place
|
||||
|
||||
Cold email is ruthlessly short. If a sentence doesn't move the reader toward replying, cut it. The best cold emails feel like they could have been shorter, not longer.
|
||||
|
||||
### Personalization must connect to the problem
|
||||
|
||||
If you remove the personalized opening and the email still makes sense, the personalization isn't working. The observation should naturally lead into why you're reaching out.
|
||||
|
||||
See [personalization.md](references/personalization.md) for the 4-level system and research signals.
|
||||
|
||||
### Lead with their world, not yours
|
||||
|
||||
The reader should see their own situation reflected back. "You/your" should dominate over "I/we." Don't open with who you are or what your company does.
|
||||
|
||||
### One ask, low friction
|
||||
|
||||
Interest-based CTAs ("Worth exploring?" / "Would this be useful?") beat meeting requests. One CTA per email. Make it easy to say yes with a one-line reply.
|
||||
|
||||
---
|
||||
|
||||
## Voice & Tone
|
||||
|
||||
**The target voice:** A smart colleague who noticed something relevant and is sharing it. Conversational but not sloppy. Confident but not pushy.
|
||||
|
||||
**Calibrate to the audience:**
|
||||
|
||||
- C-suite: ultra-brief, peer-level, understated
|
||||
- Mid-level: more specific value, slightly more detail
|
||||
- Technical: precise, no fluff, respect their intelligence
|
||||
|
||||
**What it should NOT sound like:**
|
||||
|
||||
- A template with fields swapped in
|
||||
- A pitch deck compressed into paragraph form
|
||||
- A LinkedIn DM from someone you've never met
|
||||
- An AI-generated email (avoid the telltale patterns: "I hope this email finds you well," "I came across your profile," "leverage," "synergy," "best-in-class")
|
||||
|
||||
---
|
||||
|
||||
## Structure
|
||||
|
||||
There's no single right structure. Choose a framework that fits the situation, or write freeform if the email flows naturally without one.
|
||||
|
||||
**Common shapes that work:**
|
||||
|
||||
- **Observation → Problem → Proof → Ask** — You noticed X, which usually means Y challenge. We helped Z with that. Interested?
|
||||
- **Question → Value → Ask** — Struggling with X? We do Y. Company Z saw [result]. Worth a look?
|
||||
- **Trigger → Insight → Ask** — Congrats on X. That usually creates Y challenge. We've helped similar companies with that. Curious?
|
||||
- **Story → Bridge → Ask** — [Similar company] had [problem]. They [solved it this way]. Relevant to you?
|
||||
|
||||
For the full catalog of frameworks with examples, see [frameworks.md](references/frameworks.md).
|
||||
|
||||
---
|
||||
|
||||
## Subject Lines
|
||||
|
||||
Short, boring, internal-looking. The subject line's only job is to get the email opened.
|
||||
|
||||
- 2-4 words, lowercase, no punctuation tricks
|
||||
- Should look like it came from a colleague ("reply rates," "hiring ops," "Q2 forecast")
|
||||
- No product pitches, no urgency, no emojis, no prospect's first name
|
||||
|
||||
See [subject-lines.md](references/subject-lines.md) for the full data.
|
||||
|
||||
---
|
||||
|
||||
## Follow-Up Sequences
|
||||
|
||||
Each follow-up 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)
|
||||
- The breakup email is your last touch — honor it
|
||||
|
||||
See [follow-up-sequences.md](references/follow-up-sequences.md) for cadence, angle rotation, and breakup email templates.
|
||||
|
||||
---
|
||||
|
||||
## Before You Send
|
||||
|
||||
Copy only matters if it reaches the inbox. Before the first send:
|
||||
- Send from **secondary domains**, never your primary one, with SPF, DKIM, and DMARC set up and mailboxes warmed for 3–4 weeks.
|
||||
- **Verify every list** right before upload and keep bounces under 2%.
|
||||
- **Turn off open and click tracking.** Measure replies.
|
||||
- Include a plain-text **opt-out line and your postal address** in every email.
|
||||
|
||||
Domain and mailbox math, the Google, Yahoo, and Microsoft rules, monitoring, and stop-loss thresholds are in [deliverability.md](references/deliverability.md).
|
||||
|
||||
---
|
||||
|
||||
## Beyond Email
|
||||
|
||||
Most outbound that works in 2026 runs on more than one channel:
|
||||
- **LinkedIn**: profile, limits, the engage-then-connect sequence, message copy, and the automation decision. See [linkedin-outreach.md](references/linkedin-outreach.md).
|
||||
- **Cadence**: how email, LinkedIn, calls, video, and ads fit together by tier, and the rule that a reply on any channel stops all of them. See [multichannel-cadence.md](references/multichannel-cadence.md). Call scripts are in the sales-enablement skill.
|
||||
- **Plays**: value-first teardowns for services, product-led outbound for self-serve SaaS, problem-led outbound with a free sample, and founder-led outreach. See [outbound-plays.md](references/outbound-plays.md).
|
||||
|
||||
## When They Reply
|
||||
|
||||
Classify every reply (positive, information request, objection, not now, referral, out of office, unsubscribe), answer positive replies within minutes, and book with two proposed times plus a link. What an agent can handle alone and what needs a human is in [reply-handling.md](references/reply-handling.md).
|
||||
|
||||
---
|
||||
|
||||
## Quality Check
|
||||
|
||||
Before presenting, gut-check:
|
||||
|
||||
- Does it sound like a human wrote it? (Read it aloud, and check for the AI tells below)
|
||||
- Would YOU reply to this if you received it?
|
||||
- Does every sentence serve the reader, not the sender?
|
||||
- Is the personalization connected to the problem?
|
||||
- Is there one clear, low-friction ask?
|
||||
|
||||
---
|
||||
|
||||
## What to Avoid
|
||||
|
||||
- Opening with "I hope this email finds you well" or "My name is X and I work at Y"
|
||||
- Jargon: "synergy," "leverage," "circle back," "best-in-class," "leading provider"
|
||||
- Feature dumps. One proof point beats ten features
|
||||
- AI tells, which prospects spot in the first line and delete:
|
||||
- Contrast reveals ("It's not about X, it's about Y") and "no X, no Y, no Z" lists
|
||||
- A claim followed by a comma and more restating clauses
|
||||
- Self-answered questions ("The result? 40% more meetings.") and colon reveals. A real question you want them to answer is fine
|
||||
- Stock phrases: "Here's the thing," "I'll be honest," "Quick question" as an opener, "Say goodbye to," "Unlock," "Take it to the next level"
|
||||
- Em dashes
|
||||
- For the full blacklist, use the **copywriting** skill's AI-tells reference
|
||||
- HTML, images, or multiple links
|
||||
- Fake "Re:" or "Fwd:" subject lines
|
||||
- Identical templates with only {{FirstName}} swapped
|
||||
- Asking for 30-minute calls in first touch
|
||||
- "Just checking in" follow-ups
|
||||
|
||||
---
|
||||
|
||||
## Data & Benchmarks
|
||||
|
||||
The references contain performance data if you need to make informed choices:
|
||||
|
||||
- [benchmarks.md](references/benchmarks.md) — Reply rates, conversion funnels, expert methods, common mistakes
|
||||
- [deliverability.md](references/deliverability.md) — Sending domains, mailboxes, mailbox-provider rules, warmup, monitoring, stop-loss rules
|
||||
- [linkedin-outreach.md](references/linkedin-outreach.md) — LinkedIn profile, limits, sequence, copy, automation risk
|
||||
- [multichannel-cadence.md](references/multichannel-cadence.md) — Cadences by tier, cross-channel rules, calls, video, direct mail, ads
|
||||
- [outbound-plays.md](references/outbound-plays.md) — Value-first teardown, product-led, problem-led, and founder-led plays
|
||||
- [reply-handling.md](references/reply-handling.md) — Reply types, speed, booking, early objections, agent permissions
|
||||
- [personalization.md](references/personalization.md) — 4-level personalization system, research signals
|
||||
- [subject-lines.md](references/subject-lines.md) — Subject line data and optimization
|
||||
- [follow-up-sequences.md](references/follow-up-sequences.md) — Cadence, angles, breakup emails
|
||||
- [frameworks.md](references/frameworks.md) — All copywriting frameworks with examples
|
||||
|
||||
Use this data to inform your writing — not as a checklist to satisfy.
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For setup, see the [tools registry](https://github.com/coreyhaines31/marketingskills/blob/main/tools/REGISTRY.md), including its sales outbound quick start. Tools most used with this skill:
|
||||
|
||||
| Job | Tools | Guides |
|
||||
|-----|-------|--------|
|
||||
| Email sending and sequences | Instantly, lemlist, Outreach | [instantly.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/instantly.md), [lemlist.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/lemlist.md), [outreach.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/outreach.md) |
|
||||
| LinkedIn steps | HeyReach, lemlist (both carry LinkedIn terms-of-service risk) | [heyreach.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/heyreach.md) |
|
||||
| Verification before send | Truelist, Hunter | [truelist.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/truelist.md), [hunter.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/hunter.md) |
|
||||
| CRM and reply logging | HubSpot, Attio, Close | [attio.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/attio.md), [close.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/close.md) |
|
||||
| Booking | Calendly, SavvyCal | [calendly.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/calendly.md), [savvycal.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/savvycal.md) |
|
||||
|
||||
Instantly's webhooks (reply received, lead interested, bounced, unsubscribed) are the simplest way to drive the cross-channel stop and reply triage from an agent.
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **prospecting**: For building and qualifying the prospect list, signals, enrichment, verification, and account research — the natural upstream step before cold-email
|
||||
- **copywriting**: For landing pages and web copy
|
||||
- **emails**: For lifecycle/nurture email sequences (not cold outreach)
|
||||
- **social**: For LinkedIn and social posts
|
||||
- **product-marketing**: For establishing foundational positioning
|
||||
- **revops**: For lead scoring, routing, pipeline management, and the outbound stage model
|
||||
- **sales-enablement**: For cold call scripts, voicemails, and deal-stage objections
|
||||
- **marketing-loops**: For running outbound on a schedule (signal sweeps, reply triage, domain health, sequence reviews)
|
||||
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"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.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.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 emails 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 emails skill",
|
||||
"Explains the distinction between cold email and lifecycle email",
|
||||
"Does not attempt to design a nurture sequence using cold email patterns"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"prompt": "Write a cold email to a VP of Finance at a 200-person company pitching our expense-report tool.",
|
||||
"expected_output": "Should write a short peer-style cold email following the skill's principles and avoid AI tells: no contrast reveals ('It's not about X, it's about Y'), no 'no X, no Y, no Z' lists, no self-answered questions ('The result?'), no 'Here's the thing' or 'Quick question' opener, no em dashes. One low-friction ask.",
|
||||
"assertions": [
|
||||
"No contrast reveal or negation list",
|
||||
"No self-answered question",
|
||||
"No 'Here's the thing' / 'Quick question' opener",
|
||||
"No em dashes",
|
||||
"One low-friction ask"
|
||||
],
|
||||
"files": [],
|
||||
"id": 7
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"prompt": "We're about to start cold email for our agency. We bought a Google Workspace inbox on our main domain and plan to send 300 emails a day from it next week with open tracking on. Anything we should change?",
|
||||
"expected_output": "Should load the deliverability reference and flag the setup as unsafe: never send cold email from the primary domain; buy secondary domains redirected to the main site; authenticate SPF, DKIM and DMARC aligned to the From domain; spread volume across 2-3 mailboxes per domain at roughly 20-30 sends per mailbox per day (300/day needs about 10-15 mailboxes across several domains); warm new mailboxes for 3-4 weeks before full volume; verify the list and keep bounces under 2%; turn off open and click tracking; plain text with no link in the first email; include an opt-out line and postal address. Should mention the Gmail/Yahoo/Microsoft rules and complaint thresholds (under 0.1%, never 0.3%) and set stop-loss rules.",
|
||||
"assertions": [
|
||||
"Says not to send from the primary domain",
|
||||
"Recommends secondary domains with SPF, DKIM and DMARC",
|
||||
"Splits volume across multiple mailboxes with a per-mailbox cap",
|
||||
"Requires a 3-4 week warmup",
|
||||
"Says to turn off open tracking",
|
||||
"Requires list verification and a bounce limit around 2%",
|
||||
"Includes an opt-out line and postal address",
|
||||
"Gives stop-loss thresholds"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"prompt": "Someone replied to our cold email on LinkedIn saying 'interesting, what does this cost?' but our email sequence is still running. What should happen now?",
|
||||
"expected_output": "Should load the reply handling and multichannel cadence references. Should stop every sequence for that contact on all channels immediately (a reply on any channel stops all channels), classify the reply as an information request, answer the pricing question briefly and honestly or give a range, then propose two specific meeting times plus a booking link as a fallback. Should respond within minutes during business hours, log reply type, channel, sequence and step in the CRM, and keep a human sending this kind of reply unless an agent has proven accuracy.",
|
||||
"assertions": [
|
||||
"Stops the email sequence and all other channels for that contact",
|
||||
"Classifies it as an information request",
|
||||
"Answers the question briefly before asking for a meeting",
|
||||
"Proposes two specific times plus a booking link",
|
||||
"Emphasizes responding within minutes",
|
||||
"Logs the reply in the CRM with channel and sequence step"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
# Benchmarks, Data & Expert Methods
|
||||
|
||||
## Core Performance Metrics
|
||||
|
||||
Almost every public cold email benchmark comes from a vendor that sells sending, data, or agency services, and each measures differently (some count auto-replies as replies, some don't). Use these as ranges, and judge yourself against your own baseline.
|
||||
|
||||
| Metric | Average | Good | Excellent | Source |
|
||||
|--------|---------|------|-----------|--------|
|
||||
| Reply rate | ~3.4% | 5.5%+ (top quartile) | 10%+ (top decile) | Instantly, 2025 sends (published 2026) |
|
||||
| Reply rate (signal-based, small segments) | — | 2–3× your static-list rate | — | Inferred from several 2025–26 vendor datasets; claims of 15–25% are unverified |
|
||||
| Share of replies from email 1 | ~58% | — | — | Instantly 2026 |
|
||||
| Meetings booked | 0.5–1% of contacts | 1–2% | 2.5%+ | Reachoutly, Cleverly |
|
||||
| Bounce rate | — | under 2% | under 1% | Mailbox-provider guidance; see deliverability.md |
|
||||
| Spam complaints | — | under 0.1% | — | Google sender guidelines |
|
||||
|
||||
**Don't use open rate.** Apple Mail Privacy Protection opens tracked emails automatically, many filters treat the tracking pixel as a spam signal, and one large sender dataset found reply rates roughly doubled with open tracking off. Measure replies, positive replies, and meetings.
|
||||
|
||||
## Realistic Funnel Model
|
||||
|
||||
1,000 contacts → ~34 replies (3.4%) → ~10–15 positive (30–45% of replies) → ~5–8 meetings → 1–2 customers. Roughly **100–200 contacts per meeting** on a static list; signal-based segments often need 30–60 (an estimate from the ranges above, not a measured benchmark).
|
||||
|
||||
## Performance Levers (ranked by impact)
|
||||
|
||||
1. **Hook type** — Timeline hooks outperform problem hooks by 3.4x in meetings
|
||||
2. **Personalization depth** — Up to 250% more replies
|
||||
3. **Brevity** — 25–75 words optimal, 83% more replies under 75 words
|
||||
4. **Targeting precision** — ≤50 contacts per campaign = 2.76x higher reply rates
|
||||
5. **Follow-up strategy** — First follow-up adds 49% more replies
|
||||
6. **Reading level** — 3rd–5th grade = 67% more replies
|
||||
7. **Send timing** — Thursday peaks at 6.87% reply rate
|
||||
|
||||
## Declining Effectiveness Trend
|
||||
|
||||
Reply rates fell from 7–8% (2020–2022) to roughly 3.5–5.8% (2024–2025 datasets). Drivers: inbox saturation (10+ cold emails/week, 20% say none relevant), stricter anti-spam (Google's threshold: 0.1% complaints), AI email flood (more volume, less quality signal). Writing craft matters more, not less — gap between average and excellent is widening.
|
||||
|
||||
## Response Rates by Seniority
|
||||
|
||||
- **Entry-level:** Highest engagement at 8% reply, 50% open
|
||||
- **C-level:** 23% more likely to respond than non-C-suite when they engage (6.4% vs 5.2%)
|
||||
- **CTOs/VP Tech:** 7.68% reply
|
||||
- **CEOs/Founders:** 7.63% reply
|
||||
- **Heads of Sales:** 6.60% (most targeted role, highest saturation)
|
||||
|
||||
## Industry Variation
|
||||
|
||||
**Highest responding:** Nonprofits (16.5%+), legal (10%), EdTech (7.8%), chemical (7.3%), manufacturing (6.1%).
|
||||
**Lowest responding:** SaaS (3.5%), financial services (3.4%), IT services (3.5%).
|
||||
|
||||
## Top 15 Mistakes (ranked by impact)
|
||||
|
||||
1. **Too long** — 70% of emails above 10th-grade level. Under 75 words = 83% more replies
|
||||
2. **Too self-focused** — "We are a leading..." signals sales pitch. Count I/We sentences
|
||||
3. **No clear value prop** — 71% of decision-makers ignore irrelevant emails
|
||||
4. **Generic templates** — {{FirstName}} isn't personalization. Recipients detect instantly
|
||||
5. **Feature dumping** — "Great reps lead with problems" (Lavender). One proof point beats ten features
|
||||
6. **False personalization** — "Loved your post!" without specifics is transparent
|
||||
7. **Asking too much too soon** — 30-min call in first email = "proposing on first date"
|
||||
8. **Pushy language** — "Act Now" stacking increases spam flagging by 67%
|
||||
9. **No CTA** — Without a clear next step, momentum dies
|
||||
10. **"Just checking in" follow-ups** — "I never heard back" = 12% drop in bookings
|
||||
11. **Wrong tone for audience** — Founder ≠ RevOps lead ≠ sales leader
|
||||
12. **Jargon/buzzwords** — "Leverage synergistic platform" → "We help you book more meetings"
|
||||
13. **Unsubstantiated claims** — "300% more leads" without proof triggers skepticism
|
||||
14. **Too many contacts per company** — 1–2 people = 7.8% reply; 10+ = 3.8%
|
||||
15. **Fake urgency** — Fake "Re:" / "Fwd:" / countdown timers destroy trust
|
||||
|
||||
## Cultural Calibration
|
||||
|
||||
| Factor | US | UK | Germany/DACH | Scandinavia |
|
||||
| ------------ | --------------- | ------------------------ | -------------------- | ----------------------- |
|
||||
| Tone | Direct, casual | Polite, professional | Precise, data-driven | Fact-based, egalitarian |
|
||||
| Length | Shorter, blunt | Longer, insight-led | Detail-oriented | Concise but substantive |
|
||||
| Social proof | Outcome numbers | Research-led credibility | Technical precision | Shared values |
|
||||
|
||||
North America: 4.1% response. Europe: 3.1%. Asia-Pacific: 2.8%. Shorter, more direct sequences work better in US. UK needs more insight/personality. GDPR affects European tone.
|
||||
|
||||
## Expert Quick Reference
|
||||
|
||||
| Expert | Core Method | Best For |
|
||||
| -------------- | --------------------------------------------------------------- | ----------------------------------------------- |
|
||||
| Alex Berman | 3C's: Compliment → Case Study → CTA | High-ticket B2B services, agencies |
|
||||
| Josh Braun | "Poke the Bear" — neutral questions exposing invisible problems | Empathy-driven consultative selling |
|
||||
| Kyle Coleman | Systematic research + AI personalization at scale | Bridging mass outreach and deep personalization |
|
||||
| Becc Holland | Psychographic personalization, Premise Buckets | Combining personalization with relevance |
|
||||
| Will Allred | Data-driven coaching, Mouse Trap, Vanilla Ice Cream | Any context; universal frameworks |
|
||||
| Justin Michael | 1–3 sentence hyper-brevity, quote their own words | High-velocity SDR teams at scale |
|
||||
| Sam Nelson | Agoge Sequence — Triple on Day 1 (email + LinkedIn + call) | Multi-channel, tiered personalization |
|
||||
@@ -0,0 +1,111 @@
|
||||
# Cold Email Deliverability
|
||||
|
||||
The best cold email does nothing if it lands in spam. Deliverability is set up before the first send and watched every week after. This reference covers the sending setup, the mailbox providers' rules, volume limits, warmup, monitoring, and when to stop.
|
||||
|
||||
Numbers here come mostly from sending-infrastructure vendors and mailbox providers' own guidelines. Mailbox providers change enforcement without notice, so treat the volume figures as starting points and let your own placement tests decide.
|
||||
|
||||
## The rules from Google, Yahoo, and Microsoft
|
||||
|
||||
| Provider | What it requires | Enforcement |
|
||||
|----------|------------------|-------------|
|
||||
| **Gmail** | SPF and DKIM for everyone; for bulk senders (about 5,000+ messages a day to personal Gmail), also DMARC, alignment, one-click unsubscribe on marketing mail, and spam complaints under 0.3% | Since November 2025, non-compliant mail gets permanent rejections rather than temporary deferrals. Once you're classified as a bulk sender, the status is permanent |
|
||||
| **Yahoo** | Matches Google's requirements | Since 2024 |
|
||||
| **Microsoft** (Outlook.com, Hotmail, Live) | SPF, DKIM, and DMARC for senders above 5,000 a day | Since May 5, 2025, non-compliant mail is rejected (`550 5.7.515`) |
|
||||
|
||||
Google's bulk-sender rules apply to mail sent to personal Gmail accounts, not to Google Workspace business addresses. A cold program under 5,000 a day isn't technically a "bulk sender." Follow the rules anyway: they describe what every filter rewards, and the complaint threshold applies to everyone.
|
||||
|
||||
**Complaint rate:** keep spam complaints under 0.1% and never reach 0.3%. Practitioners report Workspace sending degrading well before 0.3%.
|
||||
|
||||
## Sending setup
|
||||
|
||||
**Never send cold email from your primary domain.** One bad campaign can damage the domain your customers, invoices, and password resets depend on.
|
||||
|
||||
1. **Buy secondary domains** that are obviously yours (`getacme.com`, `acmehq.com`, `tryacme.com`). Redirect each to your main site.
|
||||
2. **Authenticate every domain:** SPF, DKIM, and DMARC (start at `p=none` with reporting), aligned to the From domain. Add a custom tracking domain only if you track clicks (see Tracking, below).
|
||||
3. **Create 2–3 mailboxes per domain**, each a real-looking person with a name, photo, and signature. Never use aliases of a single mailbox; both Google and Microsoft treat that as abuse of their terms.
|
||||
4. **Only buy mailboxes from properly licensed tenants.** In late 2025 Google reportedly suspended large numbers of resold Workspace mailboxes built on education, nonprofit, or legacy accounts. Cheap "reseller" inboxes are disposable at best.
|
||||
5. **Match the provider to your prospects where you can.** Google-hosted mailboxes for audiences on Google Workspace (most startups and SaaS), Microsoft-hosted for enterprise audiences on Microsoft 365. Vendors report better inbox placement when the two match. Check a prospect's mail host from their MX record.
|
||||
|
||||
### Volume math
|
||||
|
||||
| Setting | Starting point |
|
||||
|---------|----------------|
|
||||
| Sends per mailbox per day | 20–30 (Google-hosted); test lower for Microsoft-hosted, where 2026 operator reports range from single digits to dozens |
|
||||
| Mailboxes per domain | 2–3 |
|
||||
| Daily volume | Mailboxes × sends per mailbox |
|
||||
|
||||
Example: 500 sends a day ≈ 20 mailboxes at 25 each ≈ 7–10 domains. Follow-ups count toward the daily volume.
|
||||
|
||||
Plan for spares. Keep 10–20% extra domains warmed and idle, so a burned domain can be swapped out without stopping the program.
|
||||
|
||||
## Warmup
|
||||
|
||||
New mailboxes need 3–4 weeks of ramp before full cold volume:
|
||||
- **Weeks 1–2:** warmup only, plus a handful of real emails to people likely to reply.
|
||||
- **Weeks 3–4:** start cold sends at 5–10 a day per mailbox and increase gradually.
|
||||
- **After that:** keep light warmup running in the background.
|
||||
|
||||
Warmup networks still help new mailboxes, but a mailbox whose only engagement is warmup traffic is a recognizable pattern. Real replies are the strongest reputation signal there is, which is one more reason to write emails people answer.
|
||||
|
||||
## The email itself
|
||||
|
||||
- **Plain text.** No images, no HTML templates, no attachments.
|
||||
- **No link in the first email,** and at most one link in later ones. Never use link shorteners.
|
||||
- **Turn off open tracking.** Apple Mail Privacy Protection makes opens meaningless, and the tracking pixel itself is a spam signal. One large sender dataset found reply rates roughly doubled when open tracking was off. Measure replies instead.
|
||||
- **Turn off click tracking** unless you need it, and then only with a custom tracking domain.
|
||||
- **Under about 80 words** for the first email.
|
||||
- **Vary the copy.** Identical bodies across thousands of sends look like bulk mail. Segment-specific copy and real personalization fix this naturally. Keep spintax as a last resort.
|
||||
- **Opt-out line.** A plain-text line ("If this isn't relevant, reply 'no' and I won't follow up") plus your postal address in the signature. CAN-SPAM requires both; see the prospecting skill's compliance reference.
|
||||
|
||||
## Verify before you send
|
||||
|
||||
Bounces are the fastest way to damage a domain. Keep them under 2% per campaign; under 1% is best in class. A single day with several percent bounces can trigger a review at Google.
|
||||
|
||||
- Verify every list before upload, and re-verify anything older than about a week.
|
||||
- Handle catch-all domains with a policy. See the prospecting skill's sourcing and enrichment reference.
|
||||
- Pause any campaign automatically when its bounce rate passes 2%.
|
||||
|
||||
## Monitoring
|
||||
|
||||
| Check | How | When |
|
||||
|-------|-----|------|
|
||||
| Inbox placement | Seed tests (MailReach, GlockApps, or your sending tool's built-in test) | Before every new campaign and weekly |
|
||||
| Domain reputation | Google Postmaster Tools; Microsoft SNDS | Weekly |
|
||||
| Bounce rate | Sending tool, per campaign and per mailbox | Daily |
|
||||
| Spam complaints | Postmaster Tools; replies containing "spam" or "stop" | Weekly |
|
||||
| Blocklists | A blocklist checker for each sending domain | Weekly |
|
||||
| Authentication | DMARC aggregate reports | Monthly |
|
||||
|
||||
## Stop-loss rules
|
||||
|
||||
Decide these before launch and enforce them automatically where your tool allows:
|
||||
|
||||
| Trigger | Action |
|
||||
|---------|--------|
|
||||
| Bounce rate above 2% on a campaign | Pause the campaign and re-verify the list |
|
||||
| Inbox placement below ~70% on a mailbox or domain | Pull it from rotation, return it to warmup, investigate |
|
||||
| Spam complaints approaching 0.1% | Pause, cut volume, review targeting and copy |
|
||||
| Domain appears on a major blocklist | Stop sending from it; delist or retire it |
|
||||
| Reply rate under ~1% after 300+ sends | Stop the campaign; the targeting or offer is wrong, and more volume makes it worse |
|
||||
|
||||
## Common mistakes
|
||||
|
||||
- Sending from the primary domain
|
||||
- Buying the cheapest reseller mailboxes and losing all of them at once
|
||||
- Skipping verification "because the data provider verified it"
|
||||
- Leaving open tracking on and optimizing for a number that isn't real
|
||||
- Scaling volume to fix a low reply rate
|
||||
- Running warmup and cold sends at full volume from day one
|
||||
|
||||
## Tools
|
||||
|
||||
| Job | Options |
|
||||
|-----|---------|
|
||||
| Sending and mailbox rotation | Instantly, Smartlead, lemlist, EmailBison, Salesforge |
|
||||
| Domain and mailbox provisioning | Inframail, Maildoso, Mailforge, Truelist Outbound (managed domains, mailboxes, and a dedicated IP with an enforced ramp), Zapmail, or Google Workspace and Microsoft 365 directly |
|
||||
| Placement testing | GlockApps, MailReach, or your sending tool's built-in test (Instantly has one) |
|
||||
| Reputation | Google Postmaster Tools, Microsoft SNDS |
|
||||
| DMARC monitoring | EasyDMARC, dmarcian, Valimail |
|
||||
| List verification | Bouncer, MillionVerifier, NeverBounce, Truelist, ZeroBounce, and others |
|
||||
|
||||
Setup guides: [tools registry](https://github.com/coreyhaines31/marketingskills/blob/main/tools/REGISTRY.md).
|
||||
@@ -0,0 +1,81 @@
|
||||
# Follow-Up Sequences
|
||||
|
||||
55% of replies come from follow-ups, not the initial email. Yet 48% of salespeople never follow up even once.
|
||||
|
||||
## How Many: 3–5 Total Emails
|
||||
|
||||
- Highest single-email reply rate: **8.4%** (Belkins).
|
||||
- 4–7 email campaigns achieve **27% reply rates** vs 9% for 1–3 emails (Woodpecker, 20M emails).
|
||||
- By 4th follow-up, response rates drop **55%** and spam complaints **triple**.
|
||||
- Resolution: longer sequences catch different timing windows. Cap at 4 follow-ups (5 total emails). Each must add genuinely new value.
|
||||
|
||||
## Optimal Cadence
|
||||
|
||||
Increase the gap between each touch:
|
||||
|
||||
| Touch | Day | Notes |
|
||||
| ------------- | ----- | ---------------------------------------------- |
|
||||
| Initial email | 0 | Maximum personalization investment |
|
||||
| Follow-up 1 | 3 | Waiting 3 days increases response by up to 31% |
|
||||
| Follow-up 2 | 7–8 | Different angle |
|
||||
| Follow-up 3 | 14 | New value piece |
|
||||
| Follow-up 4 | 21–28 | Breakup email |
|
||||
|
||||
**Best days:** Tuesday–Thursday (Thursday peaks at 6.87% reply rate).
|
||||
**Best times:** 9–11 AM or 1–3 PM in prospect's local time.
|
||||
**Avoid:** Monday mornings (inbox overload), Friday afternoons (checked out).
|
||||
|
||||
## Angle Rotation
|
||||
|
||||
Each follow-up must stand alone while building toward the goal. Never just "bump this up."
|
||||
|
||||
| Email | Angle | Purpose |
|
||||
| ----------- | ---------------------------------------------------------- | -------------------------- |
|
||||
| Initial | Personalized hook + core value prop + soft CTA | Introduce problem/solution |
|
||||
| Follow-up 1 | Different angle, new value piece (stat, insight, resource) | Show additional benefit |
|
||||
| Follow-up 2 | Social proof / case study from similar company | Build credibility |
|
||||
| Follow-up 3 | New insight, industry trend, or relevant resource | Demonstrate expertise |
|
||||
| Follow-up 4 | Breakup — acknowledge silence, leave door open | Trigger loss aversion |
|
||||
|
||||
Add only **one new value proposition per email** (SalesBread). This naturally forces different angles.
|
||||
|
||||
## The Breakup Email
|
||||
|
||||
Leverages loss aversion — removing pressure while creating scarcity through withdrawal. Close.com reports **10–15% response rates** from breakup emails with cold prospects.
|
||||
|
||||
**Structure:**
|
||||
|
||||
1. Acknowledge you've reached out multiple times
|
||||
2. Validate their potential lack of interest
|
||||
3. State this is your final email for now
|
||||
4. Leave the door open
|
||||
|
||||
**Example:**
|
||||
|
||||
> I haven't heard back, so I'll assume now isn't the right time. Before I close the loop: [1-sentence insight or resource]. If that changes things, feel free to reply. Otherwise, no hard feelings. Good luck with [their goal].
|
||||
|
||||
**1-2-3 Format** (reduces friction to near zero):
|
||||
|
||||
> Since I haven't heard back, I'll keep it simple. Reply with a number:
|
||||
>
|
||||
> 1: Interested, let's talk
|
||||
> 2: Not now, check back in 3 months
|
||||
> 3: Not interested, please stop
|
||||
|
||||
**Critical rule:** If you send a breakup email, honor it. Do not contact the prospect again.
|
||||
|
||||
## Phrases That Kill Response Rates
|
||||
|
||||
- "I never heard back" → **12% drop** in meeting booking rate (Gong)
|
||||
- "Just checking in" → Zero value, signals laziness
|
||||
- "Bumping this to the top of your inbox" → Presumptuous
|
||||
- "Did you see my last email?" → Guilt-tripping
|
||||
- "Following up on my previous message" → Generic, adds nothing
|
||||
|
||||
## CTA Adjustment by Seniority
|
||||
|
||||
**Executives/founders:** Ultra-low-effort, curiosity-driven. "Curious?" or "Worth 2 min?"
|
||||
|
||||
**Mid-level managers:** More specific value. "Want me to walk through how [Company] saved 15 hours/week?"
|
||||
|
||||
Higher in the org chart = less friction you can ask for.
|
||||
@@ -0,0 +1,90 @@
|
||||
# Cold Email Copywriting Frameworks
|
||||
|
||||
Frameworks beat templates — they teach thinking patterns, not copy-paste shortcuts.
|
||||
|
||||
## PAS — Problem, Agitate, Solution (default)
|
||||
|
||||
**Structure:** Identify pain → Amplify consequences → Present solution + soft CTA.
|
||||
**Best for:** Problem-aware but not solution-aware prospects. The workhorse framework.
|
||||
|
||||
> Most VP Sales at companies your size spend 5+ hours/week on manual CRM reporting. That's 250+ hours/year not spent coaching reps, and it often means inaccurate forecasts reaching leadership. We built a tool that auto-generates CRM reports in real time. Teams like Datadog reduced reporting time by 80%. Would it make sense to see how?
|
||||
|
||||
## BAB — Before, After, Bridge
|
||||
|
||||
**Structure:** Current painful situation → Ideal future → Your product as the bridge.
|
||||
**Best for:** Transformation-driven offers with clear before/after. Emotional decision-makers.
|
||||
|
||||
> Right now, your team is likely spending hours manually sourcing leads. Feast or famine each quarter. Imagine qualified leads arriving daily on autopilot, reps spending 100% of their time selling. That's what our platform does. Companies like HubSpot saw a 40% pipeline increase within 90 days. Can I show you how?
|
||||
|
||||
## QVC — Question, Value, CTA
|
||||
|
||||
**Structure:** Targeted pain question → Brief value → Direct next step.
|
||||
**Best for:** C-suite prospects who prefer brevity. Qualify interest immediately.
|
||||
|
||||
> Are your SDRs spending more time researching than selling? We help sales teams automate prospect research so reps focus on conversations. Clients see 3x more meetings per rep per week. Worth a 10-minute demo?
|
||||
|
||||
## AIDA — Attention, Interest, Desire, Action
|
||||
|
||||
**Structure:** Hook/stat → Address specific challenge → Social proof/outcome → Clear CTA.
|
||||
**Best for:** Data-driven prospects, high-ticket pitches with strong stats.
|
||||
|
||||
> Companies in pharma lose 30% of leads due to manual outreach. Given {{Company}}'s growth this quarter, pipeline velocity is likely top of mind. Customers like Pfizer use our platform to automate lead qualification and cut time-to-contact by 60%. Worth a 15-minute call?
|
||||
|
||||
## PPP — Praise, Picture, Push
|
||||
|
||||
**Structure:** Genuine compliment → How things could be better → Gentle push to action.
|
||||
**Best for:** Senior prospects who respond to relationship-building. Requires genuine trigger.
|
||||
|
||||
> Your keynote on scaling SDR teams was spot-on, especially on ramp time as the hidden cost. What if you could cut that in half? Our in-inbox coach helps new reps write effective emails from day one with real-time scoring. Open to a quick chat about how this could support your growth?
|
||||
|
||||
## Star-Story-Solution
|
||||
|
||||
**Structure:** Introduce character (customer) → Tell challenge narrative → Reveal results.
|
||||
**Best for:** Strong customer success stories. Humanizes the pitch.
|
||||
|
||||
> Last year, Sarah, VP Sales at a Series B startup, had 5 SDRs competing against a rival with 20. Her team was getting crushed on volume. They adopted our AI prospecting tool and sent hyper-personalized emails at 3x pace without losing quality. Within 90 days, they booked more meetings than their competitor's entire team. Happy to share how this could work for {{Company}}.
|
||||
|
||||
## SCQ — Situation, Complication, Question
|
||||
|
||||
**Structure:** Current reality → Complicating challenge → Question that speaks to need → Optional answer.
|
||||
**Best for:** Consultative selling. Mirrors how professionals present to leadership.
|
||||
|
||||
> Your team doubled this year. That usually means onboarding is eating into selling time. How are you handling ramp for new hires?
|
||||
|
||||
## ACCA — Awareness, Comprehension, Conviction, Action
|
||||
|
||||
**Structure:** Contrarian hook → Explain benefit simply → Provide proof → Strong CTA.
|
||||
**Best for:** Analytical buyers who need evidence (engineers, CFOs, ops leaders).
|
||||
|
||||
> Most sales teams measure rep activity. The top 5% measure rep efficiency instead. When Acme switched, they booked 40% more meetings with fewer emails. Worth seeing how?
|
||||
|
||||
## 3C's (Alex Berman)
|
||||
|
||||
**Structure:** Compliment → Case Study → CTA.
|
||||
**Best for:** Agency/services cold outreach. Case study does the heavy lifting.
|
||||
|
||||
> Big fan of [Company]. We just built an app for [Competitor] that does XYZ. I have a few more ideas. Interested?
|
||||
|
||||
## Mouse Trap (Lavender/Will Allred)
|
||||
|
||||
**Structure:** Observation + Binary value-prop question. 1–2 sentences total.
|
||||
**Best for:** Maximum brevity. Impulsive reply based on curiosity.
|
||||
|
||||
> Looks like you're hiring reps. Would it be helpful to get a more granular look at how they're ramping on email?
|
||||
|
||||
## Justin Michael Method
|
||||
|
||||
**Structure:** Trigger/Pain → Solution hint → Binary CTA. 1–3 sentences, no intro.
|
||||
**Best for:** High-velocity SDR teams. Mobile-optimized. Deliberately polarizing.
|
||||
|
||||
Spend max 1 minute on personalization. Use industry/persona-level signals. For top-tier prospects, quote their own words from interviews — they almost always respond.
|
||||
|
||||
## Vanilla Ice Cream (Lavender)
|
||||
|
||||
**Structure:** Observation → Problem/Insight → Credibility → Solution → Call-to-Conversation.
|
||||
**Best for:** Universal "base" framework that works everywhere. Five parts.
|
||||
|
||||
## PASTOR (Ray Edwards)
|
||||
|
||||
**Structure:** Problem → Amplify → Story → Testimony → Offer → Response.
|
||||
**Best for:** Longer-form or multi-email sequences. Consulting, education, complex B2B services. Each element can be developed across separate touches.
|
||||
@@ -0,0 +1,91 @@
|
||||
# LinkedIn Outreach
|
||||
|
||||
LinkedIn is the second channel in most B2B outbound and the first for some audiences: people who ignore cold email often accept a relevant connection request. It also has the tightest limits and the highest account risk of any channel. This reference covers the profile, the limits, the sequence, the copy, and the automation decision.
|
||||
|
||||
Figures below come mostly from LinkedIn automation vendors' and agencies' own datasets (2025–26). Use them as ranges.
|
||||
|
||||
## Fix the profile first
|
||||
|
||||
Every prospect who gets a request or a message looks at the sender's profile. Before outreach:
|
||||
- **Headline** says who you help and how.
|
||||
- **About** opens with the problem you solve, then proof.
|
||||
- **Featured** holds one case study, teardown, or resource a prospect would actually click.
|
||||
- **Recent activity** shows posts or thoughtful comments from the last few weeks. Accounts that post regularly see noticeably higher acceptance rates.
|
||||
- A real photo and a banner that reinforces what you do.
|
||||
|
||||
## Limits
|
||||
|
||||
| Action | Safe range |
|
||||
|--------|-----------|
|
||||
| Connection requests | About 100 a week per account; 15–25 a day. New or low-activity accounts start at 20–30 a week |
|
||||
| Messages to connections | Roughly 50–100 a day, spread out |
|
||||
| Profile views | A few hundred a day at most |
|
||||
| InMail | Limited by your Sales Navigator or Premium credits |
|
||||
|
||||
Volume isn't the only thing LinkedIn looks at. In 2026 it also flags unusual behavior: activity from data-center IP addresses, identical timing between actions, and low acceptance rates. A 15% acceptance rate tells LinkedIn your requests are unwanted. Keep acceptance above about 25–30% by sending fewer, better-targeted requests.
|
||||
|
||||
Withdraw requests that are still pending after 2–3 weeks; a large pending pile counts against you.
|
||||
|
||||
## The sequence
|
||||
|
||||
Warm up the account's visibility before asking for anything:
|
||||
|
||||
1. **Day 1:** view their profile, follow them, and react to or comment on a recent post (a real comment, not "Great post!").
|
||||
2. **Day 2–3:** connection request. A note is optional (see below).
|
||||
3. **After acceptance:** a short first message tied to why you connected. No pitch.
|
||||
4. **3–5 days later:** a message with value: an insight, a resource, a relevant example.
|
||||
5. **5–7 days later:** a light ask, or a voice note.
|
||||
|
||||
Stop at three messages without a reply. Vendor data shows replies falling sharply beyond that.
|
||||
|
||||
Run LinkedIn alongside email, not instead of it, and stop both the moment either gets a reply. See [multichannel-cadence.md](multichannel-cadence.md).
|
||||
|
||||
## Copy
|
||||
|
||||
**Connection request**
|
||||
- Notes cut acceptance slightly but raise replies once accepted (one 2025 agency study: about 25% vs 28% acceptance, 8% vs 5% reply). Use a note when you have a specific, credible reason; skip it when you don't.
|
||||
- Under ~200 characters. The reason you're connecting, nothing else.
|
||||
- AI-written notes underperform human ones by a measurable margin in vendor data. Write these yourself, or edit hard.
|
||||
|
||||
> Saw your post on moving pricing tests off the homepage. We've run a few of those for SaaS teams; would be good to connect.
|
||||
|
||||
**First message after acceptance**
|
||||
- 150–200 characters performs best in vendor datasets.
|
||||
- Reference the reason you connected. Ask something easy to answer.
|
||||
|
||||
> Thanks for connecting. Curious how you're deciding what to test first on the new pricing page. Is that sitting with you or with product?
|
||||
|
||||
**Voice notes** (mobile app only) stand out in a text inbox. Keep them under 45 seconds, say their name and the specific reason, and never read a script. Public data on voice notes is thin, so test them.
|
||||
|
||||
**InMail** suits senior people you can't reach any other way. It gets the same rules as cold email: short, specific, one ask.
|
||||
|
||||
Everything in the main cold-email skill about voice and AI tells applies here, even more strongly: LinkedIn messages sit next to the sender's face and name.
|
||||
|
||||
## The automation decision
|
||||
|
||||
**Every third-party LinkedIn automation tool violates LinkedIn's User Agreement.** That includes cloud tools, browser extensions, and APIs that operate your account through its session. LinkedIn has escalated from restricting individual users to acting against vendors: it removed company pages for Apollo and Seamless in 2025 and HeyReach in March 2026, and sued scraping vendors.
|
||||
|
||||
Make the decision deliberately:
|
||||
|
||||
| Option | Risk | When it fits |
|
||||
|--------|------|--------------|
|
||||
| **Manual** (Sales Navigator, phone, a daily routine) | None beyond normal limits | Tier 1 accounts; founders; anyone whose personal profile is a business asset |
|
||||
| **Assisted** (tools that queue tasks for a human to do, CRM reminders) | Low | Most teams |
|
||||
| **Automated** (HeyReach, Expandi, La Growth Machine, Dripify, Waalaxy, Unipile-based tools) | Account restriction, and the vendor itself can disappear | High-volume Tier 3 programs, on profiles the business can afford to lose |
|
||||
|
||||
If you automate:
|
||||
- Use only real profiles owned by the people they represent. Never rent or buy accounts.
|
||||
- Stay well under the limits above, with randomized timing.
|
||||
- Prefer tools with dedicated residential IPs per account.
|
||||
- Keep a plan for losing the tool overnight: export your data regularly.
|
||||
|
||||
For agents: HeyReach and Unipile expose APIs (and HeyReach an MCP), which makes them the most scriptable options. The terms-of-service risk is the same as any other automation.
|
||||
|
||||
## Measure
|
||||
|
||||
| Metric | Typical range (vendor data, 2025–26) |
|
||||
|--------|--------------------------------------|
|
||||
| Acceptance rate | 25–30% average; 30%+ for active, followed profiles |
|
||||
| Reply rate to messages | 7–10% |
|
||||
|
||||
Track positive replies and meetings, the same as email. A high acceptance rate with no replies means the targeting is fine and the messages aren't.
|
||||
@@ -0,0 +1,79 @@
|
||||
# Multichannel Cadence
|
||||
|
||||
Most buyers need to see a name a few times, in more than one place, before they respond. A cadence coordinates email, LinkedIn, phone, and the occasional video or package so each touch builds on the last and nobody gets hit on four channels in one afternoon.
|
||||
|
||||
## Which channels for which tier
|
||||
|
||||
| Tier | Channels |
|
||||
|------|----------|
|
||||
| Tier 1 (1:1) | Email, LinkedIn, phone, personalized video; direct mail after engagement |
|
||||
| Tier 2 (1:few) | Email and LinkedIn; phone for the best-fit accounts |
|
||||
| Tier 3 (1:many) | Email; LinkedIn only if it can be done without automation risk |
|
||||
|
||||
Tiers are defined in the prospecting skill's signal plays reference.
|
||||
|
||||
## A 21-day Tier 1 cadence
|
||||
|
||||
| Day | Touch |
|
||||
|-----|-------|
|
||||
| 1 | View their LinkedIn profile and engage with a recent post. Send email 1 (short, no link) |
|
||||
| 3 | LinkedIn connection request |
|
||||
| 4 | Email 2, as a reply in the same thread |
|
||||
| 6 | Call 1. If no answer, leave a short voicemail and send an email recapping it |
|
||||
| 8 | LinkedIn message if connected; otherwise a short personalized video by email |
|
||||
| 11 | Email 3: new angle or a case study |
|
||||
| 13 | Call 2 |
|
||||
| 15 | LinkedIn voice note or a comment on a new post |
|
||||
| 18 | Email 4: breakup or referral ask |
|
||||
| 21 | Call 3. Then move the contact to nurture and ad retargeting |
|
||||
|
||||
Shorten it for Tier 2 (email and LinkedIn over about 14 days). Tier 3 is the email sequence alone; see [follow-up-sequences.md](follow-up-sequences.md).
|
||||
|
||||
## Rules that hold any cadence together
|
||||
|
||||
1. **A reply on any channel stops every channel.** Someone who answered on LinkedIn mustn't get email 3 the next morning. This needs one shared record of who has replied, checked before each touch.
|
||||
2. **An opt-out on one channel is an opt-out on all of them.** Key the suppression list on email, LinkedIn URL, and phone together. See the prospecting skill's sourcing and enrichment reference.
|
||||
3. **One sender per account at a time.** Two reps, or a rep and an agent, sequencing the same company looks disorganized and doubles the annoyance.
|
||||
4. **Each touch references the last** when it helps ("Following up on the voicemail I left Tuesday"), but must also make sense on its own.
|
||||
5. **Keep it to 4–7 emails and at most 3 LinkedIn messages.** More touches don't rescue the wrong offer.
|
||||
6. **Space touches across days.** Never two channels on the same day except a voicemail and its recap email.
|
||||
|
||||
Most sequencing tools only coordinate their own channels. When email, LinkedIn, and calls run in different tools, connect them with a shared state (the CRM or a simple table keyed on the contact) and webhooks that pause every sequence when any reply arrives.
|
||||
|
||||
## Calls
|
||||
|
||||
Calls are the slowest channel and the fastest to a conversation. Vendor and agency datasets from 2025 put the dial-to-conversation rate around 10% and roughly one meeting per several hundred dials. Mobile numbers connect far better than office lines.
|
||||
|
||||
- **Best times:** mid-week, mid-to-late afternoon in the prospect's time zone. Test your own.
|
||||
- **Attempts:** 3 calls per contact across the cadence, on different days and times.
|
||||
- **Openers:** say who you are and why you're calling, then ask permission to continue. Avoid "Did I catch you at a bad time?", which call-analysis data ranks among the worst openers.
|
||||
- **Voicemail:** 20–30 seconds, your name, one specific reason, and "I'll send you a note too." Then send it.
|
||||
- **Rules:** scrub against Do Not Call lists, and never use AI voice on US mobile numbers without consent. See the prospecting skill's compliance reference.
|
||||
|
||||
Scripts for openers, voicemails, and common pushback are in the sales-enablement skill's cold call scripts reference.
|
||||
|
||||
## Video
|
||||
|
||||
A short video recorded for one person stands out in a text inbox, and it's the natural format for value-first plays (see [outbound-plays.md](outbound-plays.md)).
|
||||
- **60–120 seconds** for a pure outreach video; **2–4 minutes** for a teardown or audit.
|
||||
- Show their thing (their site, their product, their dashboard) on screen in the first few seconds.
|
||||
- Send a thumbnail or GIF that shows their page, linked to the video. Don't attach the file.
|
||||
- For Tier 1 only, or after a reply. Video doesn't scale like text, and that's the point.
|
||||
|
||||
Tools: Loom, Tella, Sendspark, Vidyard.
|
||||
|
||||
## Direct mail and gifts
|
||||
|
||||
Useful for Tier 1 accounts that have engaged but stalled. Something relevant to the conversation (a book you referenced, a printed teardown) beats a generic gift. Sendoso and Reachdesk handle sending and address confirmation. Check company gift policies, which often cap or ban gifts in regulated industries and government.
|
||||
|
||||
## Ads to target accounts
|
||||
|
||||
Upload your target account and contact lists to LinkedIn Matched Audiences (or other ad platforms) and run light awareness ads during the cadence. When the email arrives, the name is already familiar. See the ads skill's ABM playbook.
|
||||
|
||||
## SMS and WhatsApp
|
||||
|
||||
Not for cold outreach. US SMS to mobile numbers needs consent and 10DLC registration; WhatsApp business messaging needs an opt-in. Use them only after a prospect has engaged and agreed, for scheduling and reminders.
|
||||
|
||||
## Measure by channel
|
||||
|
||||
Track, per channel and per step: touches sent, replies, positive replies, meetings. Attribute the meeting to the touch that produced the reply, and keep the full sequence on the record so you can see which combinations work. A channel that never produces a positive reply after a few hundred touches is costing more than it returns.
|
||||
@@ -0,0 +1,88 @@
|
||||
# Outbound Plays
|
||||
|
||||
A play is a repeatable outbound motion: a trigger, an offer, a sequence, and a definition of success. Plays keep outbound from becoming a pile of one-off emails. This reference covers four that work in 2026, with the conditions each needs.
|
||||
|
||||
## 1. Value-first teardown (services and agencies)
|
||||
|
||||
Give a specific piece of the work before asking for anything. It works best when what you sell is expertise someone can see: conversion optimization, design, SEO, ads, copy, analytics.
|
||||
|
||||
**Trigger:** something visible changed or matters right now: a new pricing or landing page, a redesign, launched ad campaigns, a new head of growth, fresh funding with growth targets.
|
||||
|
||||
**The sequence**
|
||||
1. **Email 1 asks permission, with no link.** Name one specific thing you noticed on their page, and offer the rest.
|
||||
> Looked at your new pricing page. The annual toggle defaults to monthly, which usually costs a few points of annual uptake. I noted two other things I'd test there. Want me to send them over?
|
||||
2. **When they say yes,** send a 2–4 minute video (or a one-page annotated screenshot) covering 3 specific, testable ideas on *their* page. Show their page on screen in the first seconds.
|
||||
3. **Follow-up** asks a small question about the ideas, not for a meeting: "Was the second one already on your list?"
|
||||
4. **Then offer the call:** "Happy to walk through how we'd prioritize the rest."
|
||||
|
||||
**Why the permission step:** no link or attachment in the first email protects deliverability, a "yes" filters for real interest, and the teardown goes only to people who asked for it. That keeps a time-intensive asset efficient.
|
||||
|
||||
**Rules**
|
||||
- The ideas must be real and specific to their page. A generic checklist dressed as a teardown burns trust and the brand.
|
||||
- Give enough to be useful, and leave the "how we'd do all of it" for the call.
|
||||
- Volume is low by design: around 50 well-chosen accounts a week, mostly Tier 1 and 2.
|
||||
- An agent can draft the teardown (screenshot, analysis against your CRO or design framework), but a human expert reviews every one before it goes out. It represents your expertise.
|
||||
|
||||
**Measure:** permission rate (yes to email 1), teardown-to-call rate, call-to-proposal rate.
|
||||
|
||||
## 2. Product-led outbound (self-serve and freemium SaaS)
|
||||
|
||||
Reach out to people already using the product, when their usage shows they're ready for more.
|
||||
|
||||
**Triggers**, in rough order of strength:
|
||||
- Hitting a plan, credit, or usage limit
|
||||
- A large job or upload (a much bigger list, project, or import than usual)
|
||||
- Inviting teammates
|
||||
- Signing up from a company domain that matches the ICP
|
||||
- Returning repeatedly to pricing or upgrade pages
|
||||
|
||||
**The sequence**
|
||||
1. **Within minutes of the trigger,** a short plain-text email from a founder or named account owner, sent from their own address. Reference what they're doing:
|
||||
> Saw you're verifying larger lists this week. If you're running these before outbound campaigns, a couple of settings help with catch-all domains. Happy to share them, or set you up with a volume plan if you're doing this regularly.
|
||||
2. **LinkedIn connect** the same or next day, for company-domain users.
|
||||
3. **One follow-up** with a specific resource for their use case.
|
||||
4. **Stop** if they upgrade, go quiet for two weeks, or say no.
|
||||
|
||||
**Rules**
|
||||
- Speed matters more here than anywhere: the trigger loses most of its value within a day.
|
||||
- Never make the tracking feel like surveillance. Talk about the job they're doing and leave the logged events out of it.
|
||||
- Offer help first and an upgrade second. Product-qualified users convert far better than cold contacts (vendors report many times higher), so you don't need a hard sell.
|
||||
- Route accounts that exceed self-serve limits to a person. See the revops skill's routing rules.
|
||||
|
||||
**Measure:** trigger-to-reply rate, trigger-to-upgrade rate within 14 days, expansion revenue per triggered account.
|
||||
|
||||
## 3. Problem-led cold outbound (any product)
|
||||
|
||||
The default play for accounts with no product usage: lead with a problem the segment is known to have, prove you understand it, and offer something small.
|
||||
|
||||
**Trigger:** a signal from the prospecting skill's signal plays reference, or a tightly defined segment.
|
||||
|
||||
**Offer something smaller than a meeting:** a sample of the work (verify a sample of their list, audit one page, benchmark one metric), a relevant resource, or a quick answer to a question they're probably asking.
|
||||
|
||||
**Example for a technical product** (an email verification tool selling to agencies that send cold email for clients):
|
||||
> Agencies running outbound for several clients usually find out about a bad list when the domain is already hurting. Want me to run a sample of one client's list through and send back what would have bounced?
|
||||
|
||||
**Rules**
|
||||
- The problem must be specific to the segment, with proof from a similar customer.
|
||||
- The free sample has to be genuinely small to deliver, or the play won't scale.
|
||||
- If you sell deliverability, compliance, or quality, your own outbound has to be flawless. A bounce, a typo, or a missing opt-out from a company selling those things undercuts the pitch.
|
||||
|
||||
## 4. Founder-led outbound
|
||||
|
||||
Early-stage, or for a small set of strategic accounts: the founder writes personally, from their own account, about why they built the thing.
|
||||
|
||||
- Short, personal, specific to the recipient. No templates.
|
||||
- Ask for advice or feedback as often as for a meeting. People answer founders.
|
||||
- 10–20 a week, done consistently, beats occasional bursts.
|
||||
- Pairs naturally with the founder posting on LinkedIn, so the name is familiar when the email lands.
|
||||
|
||||
## Choosing plays
|
||||
|
||||
| If you... | Start with |
|
||||
|-----------|-----------|
|
||||
| Sell services where expertise is visible | Value-first teardown |
|
||||
| Have self-serve users | Product-led outbound for usage triggers, plus problem-led for everyone else |
|
||||
| Sell a technical product to a defined segment | Problem-led with a free sample |
|
||||
| Are pre-product-market fit or chasing a few big logos | Founder-led |
|
||||
|
||||
Run one play at a time until it works. Each needs its own copy, its own success metric, and a few hundred touches before you can judge it.
|
||||
@@ -0,0 +1,90 @@
|
||||
# Personalization at Scale
|
||||
|
||||
Personalization drives **50–250% more replies** (Lavender). The key insight: **if your personalization has nothing to do with the problem you solve, it's just an attention hack** (Clay).
|
||||
|
||||
## Four Levels of Personalization
|
||||
|
||||
### Level 1 — Basic (merge tags)
|
||||
|
||||
First name, company name, job title. Table stakes, no longer differentiating. ~5% lift.
|
||||
|
||||
### Level 2 — Industry/segment
|
||||
|
||||
Industry-specific pain points, trends, regulatory challenges. Scalable via micro-segmentation.
|
||||
|
||||
> Most {{industry}} teams struggle with {{lead gen problem}}, which often leads to wasted effort.
|
||||
|
||||
### Level 3 — Role-level
|
||||
|
||||
Challenges specific to their role and seniority.
|
||||
|
||||
> As Head of Sales, keeping pipeline steady is probably your biggest headache. Your RevOps team is small, so you're likely wearing multiple hats during scaling.
|
||||
|
||||
### Level 4 — Individual (gold standard)
|
||||
|
||||
Specific, timely observations about that person connected to the problem you solve.
|
||||
|
||||
> Noticed you're hiring 3 SDRs. Sounds like you're scaling outbound fast. Most teams hit follow-up fatigue during onboarding.
|
||||
|
||||
## Research Signal Stack
|
||||
|
||||
| Signal | Where to find it | How to use it |
|
||||
| ----------------- | ---------------------------------- | ---------------------------------------------------------------------------- |
|
||||
| Recent funding | Crunchbase, LinkedIn, press | "Congrats on Series B. Scaling teams fast usually creates X challenge" |
|
||||
| Job postings | LinkedIn Jobs, careers page | "Noticed you're hiring 3 SDRs. Sounds like you're scaling outbound" |
|
||||
| Tech stack | BuiltWith, Wappalyzer, HG Insights | "I see you're using HubSpot. Most teams at your stage hit a ceiling with X" |
|
||||
| LinkedIn activity | Posts, comments, job changes | "Really enjoyed your post about X" |
|
||||
| Company news | Google News, press releases | "Congrats on acquiring X. Integrating teams usually creates Y challenge" |
|
||||
| Podcast/talks | Google, YouTube, podcasts | "Caught your talk at SaaStr on X. Really insightful" |
|
||||
| Website changes | Manual review | "Your new pricing page caught my eye. Curious how it's converting" |
|
||||
|
||||
## The 3-Minute Personalization System
|
||||
|
||||
From "30 Minutes to President's Club":
|
||||
|
||||
**Step 1:** Build a research stack of top 10 buying signals — 5 company triggers, 5 person triggers. Stack-rank by relevance.
|
||||
|
||||
**Step 2:** Build a 3x3 template: (1) personalization attached to a problem, (2) problem you solve, (3) one-sentence solution + low-friction CTA.
|
||||
|
||||
**Step 3:** Create 5 "trigger templates" — pre-written personalization paragraphs for each trigger, with a smooth segue into the problem.
|
||||
|
||||
The personalization must logically connect to the problem. This creates 5 reusable triggers with the rest of the email constant. A top SDR writes a personalized email in **under 3 minutes**.
|
||||
|
||||
## The Four -Graphic Principles (Becc Holland)
|
||||
|
||||
- **Demographic** — Age, profession, background
|
||||
- **Technographic** — Tech stack, tools used
|
||||
- **Firmographic** — Company size, funding, industry, growth stage
|
||||
- **Psychographic** — Values, passions, beliefs (highest-impact dimension)
|
||||
|
||||
Tapping into what prospects are passionate about drives significantly higher response rates.
|
||||
|
||||
## Observation-Based Openers (highest performing)
|
||||
|
||||
**Trigger-event:** "Congrats on the recent funding round. Scaling the team from here is exciting, and I imagine [challenge] is top of mind."
|
||||
|
||||
**Observation:** "Your recent post about [topic] resonated. Especially the part about [detail]. Got me thinking about how that applies to [challenge]."
|
||||
|
||||
**Industry insight:** "Most [role titles] I talk to spend [X hours/week] on [problem]. Curious if that matches your experience at [Company]."
|
||||
|
||||
## What Feels Fake (avoid)
|
||||
|
||||
- AI-generated emails with similar phrasing ("I hope this email finds you well")
|
||||
- Generic attention hacks disconnected from problem ("Cool that you went to UCLA!" → pitch)
|
||||
- Over-personalizing to creepiness
|
||||
- "I saw your LinkedIn profile and wanted to reach out" — signals mass automation
|
||||
|
||||
## The "So What?" Test
|
||||
|
||||
After writing any opening line, read from prospect's perspective: "So what? Why would I care?" If the answer is nothing, rewrite.
|
||||
|
||||
## Personalizing With AI
|
||||
|
||||
Agents make Level 4 research affordable at scale, and they make invented personalization just as cheap. Buyers in 2026 spot it fast: praise for the company mission, congratulations on a year-old funding round, "I noticed you're in SaaS."
|
||||
|
||||
- **Relevance beats personalization.** A specific trigger, the pain it implies, and a concrete offer outperform a clever personal line attached to a generic pitch.
|
||||
- **Facts first, then the angle,** in two separate steps, with a source URL for every fact.
|
||||
- **Allow "no hook found."** When research turns up nothing specific, use the segment-level message instead of a manufactured one.
|
||||
- **Review before sending** for Tier 1 and a sample of Tier 2.
|
||||
|
||||
The full research rules and the account brief template are in the prospecting skill's account research reference.
|
||||
@@ -0,0 +1,65 @@
|
||||
# Handling Replies
|
||||
|
||||
The sequence's job ends when someone replies. What happens in the next hour decides whether that reply becomes a meeting. This reference covers classifying replies, responding to each type, speed, booking, and what an agent can handle on its own.
|
||||
|
||||
## Classify every reply
|
||||
|
||||
| Type | Looks like | Action |
|
||||
|------|------------|--------|
|
||||
| **Positive** | "Sure, let's talk," "Send times," "Tell me more" | Respond fast, propose times, book (below) |
|
||||
| **Information request** | "What does it cost?" "Do you work with X?" | Answer the actual question briefly, then offer a call |
|
||||
| **Objection** | "We already use X," "No budget," "Not a priority" | Respond once, using the objection guidance below |
|
||||
| **Not now** | "Reach out next quarter," "After our launch" | Thank them, set a reminder for the date they gave, stop the sequence |
|
||||
| **Referral** | "Talk to Sam, she owns this" | Thank them; contact Sam citing the referral (with permission to use their name if unclear) |
|
||||
| **Wrong person, no referral** | "Not my area" | Ask once who owns it; otherwise stop |
|
||||
| **Out of office** | Auto-reply | Pause; resume after their return date. Note any named stand-in |
|
||||
| **Unsubscribe or hostile** | "Remove me," "Stop," anger | Suppress on every channel immediately. Apologize briefly if you reply at all. Never argue |
|
||||
| **Bounce** | Delivery failure | Remove; check whether the contact moved companies (a possible job-change signal) |
|
||||
|
||||
Every reply of any type stops all other channels for that person. See [multichannel-cadence.md](multichannel-cadence.md).
|
||||
|
||||
## Speed
|
||||
|
||||
Answer positive replies within minutes during business hours. The research behind the famous speed-to-lead multipliers is old (2007–2011), but the direction holds. Interest fades fast, and a prospect who replied to you has often replied to others too. Route positive replies to a person instantly (a Slack or phone notification), and keep someone responsible for them every working hour.
|
||||
|
||||
## Booking
|
||||
|
||||
- **Propose two specific times** in their time zone, and include a booking link as a fallback ("or grab any time here"). Two concrete options get a faster yes than a bare link, which can feel like homework.
|
||||
- **Send the calendar invite immediately** once they pick, with a one-line agenda.
|
||||
- **Confirm the day before** with something useful: the agenda, a relevant case study, or (for an agency) the teardown you'll discuss. Pre-reads raise show rates.
|
||||
- **Reminder an hour before**, by email, or by SMS only if they've agreed to texts.
|
||||
- **Reschedule no-shows the same day,** warmly, once. A second no-show goes back to nurture.
|
||||
|
||||
## Objections in reply to cold outreach
|
||||
|
||||
Early objections are usually reflexes. Answer once, briefly, and make it easy to say no:
|
||||
|
||||
| Objection | Response approach |
|
||||
|-----------|-------------------|
|
||||
| "We already use [competitor]" | Acknowledge it. Name the one situation where teams like theirs still look elsewhere. Ask if it applies |
|
||||
| "No budget" | Ask when they plan budgets, or offer something that doesn't need one (an audit, a benchmark) |
|
||||
| "Not a priority" | Ask what is a priority this quarter. If it isn't connected, step back and set a reminder |
|
||||
| "Send me more info" | Send one specific thing (a one-pager or a two-minute video) and one question that makes a reply easy |
|
||||
| "How did you get my email?" | Answer honestly with the actual source, and offer to remove them |
|
||||
|
||||
Deal-stage objections (pricing negotiation, security reviews, competitive bake-offs) live in the sales-enablement skill's objection library.
|
||||
|
||||
## What an agent can handle
|
||||
|
||||
| Reply type | Agent alone | Agent drafts, human sends |
|
||||
|------------|-------------|---------------------------|
|
||||
| Out of office | ✓ Pause and reschedule | |
|
||||
| Unsubscribe | ✓ Suppress everywhere | |
|
||||
| Bounce | ✓ Remove, flag for job-change check | |
|
||||
| Not now | ✓ Set the reminder, stop the sequence | Polite acknowledgment |
|
||||
| Positive | | ✓ Until accuracy is proven over 100+ replies |
|
||||
| Information request | | ✓ |
|
||||
| Objection | | ✓ |
|
||||
| Referral | | ✓ |
|
||||
| Hostile | ✓ Suppress | Any reply at all |
|
||||
|
||||
Before an agent sends anything on its own, check that every claim in the draft matches an approved source, that it contains nothing from your banned-phrase list, and that a daily cap applies. Sample-review a share of autonomous replies every week.
|
||||
|
||||
## Log it
|
||||
|
||||
Record on the CRM contact: reply type, date, the sequence and step that produced it, the signal and channel, and the outcome. That's what makes a weekly sequence review possible (the sequence-retro loop in the marketing-loops skill), and it's the outbound stage model in the revops skill.
|
||||
@@ -0,0 +1,53 @@
|
||||
# Subject Line Optimization
|
||||
|
||||
The subject line determines whether the email gets read. The data is counterintuitive: **short, boring, internal-looking subject lines win decisively.**
|
||||
|
||||
## Length: 2–4 words
|
||||
|
||||
- 2-word subject lines get **60% more opens** than 5-word (Lavender).
|
||||
- Going from 2 to 4 words reduces replies by **17.5%**.
|
||||
- 2–4 words yield **46% open rates** vs 34% for 10 words (Belkins, 5.5M emails).
|
||||
- Mobile truncates at 30–35 characters — brevity is practical necessity.
|
||||
|
||||
## Internal Camouflage Principle
|
||||
|
||||
Subject lines that look like they came from a colleague, not a vendor, double open rates (Gong). Buyers mentally categorize before opening — if it looks like sales, it's filtered.
|
||||
|
||||
**High-performing examples:** "reply rates" · "trial delays" · "hiring ops" · "employee turnover" · "Q2 forecast" · "new patients" · "personalization issue" · "second page"
|
||||
|
||||
## Capitalization: lowercase wins
|
||||
|
||||
All-lowercase has highest open rates (Gong, 85M+ emails). Lowercase looks more personal/internal. For cold outreach specifically, lowercase beats title case.
|
||||
|
||||
## Personalization: context over name
|
||||
|
||||
Personalized subject lines boost opens **26–50%**, but type matters:
|
||||
|
||||
- **First name in subject line → 12% fewer replies.** Signals automation.
|
||||
- **Contextual personalization works:** pain points, competitors, trigger events, industry challenges.
|
||||
- Use {{painPoint}}, {{competitor}}, {{commonGround}} — not {{firstName}}.
|
||||
|
||||
## Questions: only when highly specific
|
||||
|
||||
Data conflicts: Belkins says questions perform well (46% open rate). Lavender says questions lower opens by **56%**. Resolution: **specific pain questions work** ("Need help with {{challenge}}?"), **generic questions fail** ("Quick question?" / "Have 15 minutes?"). Default to statements.
|
||||
|
||||
## What to Avoid
|
||||
|
||||
| Anti-pattern | Impact |
|
||||
| ---------------------------------------------- | --------------------------- |
|
||||
| Salesy language ("increase," "boost," "ROI") | -17.9% opens |
|
||||
| Urgency words ("ASAP," "urgent") | Below 36% opens |
|
||||
| Excessive punctuation ("!!!" or "??") | -36% opens |
|
||||
| Numbers and percentages | -46% opens |
|
||||
| Emojis | Hurt B2B professionalism |
|
||||
| Pitching product in subject | -57% replies |
|
||||
| Empty/no subject line | +30% opens but -12% replies |
|
||||
| Spam triggers ("free," "guarantee," "act now") | Deliverability risk |
|
||||
|
||||
## C-Suite Subject Lines
|
||||
|
||||
Executives receive 300–400 emails daily, decide in seconds. They respond **23% more often** than non-C-suite when emails pass their filter (6.4% reply rate).
|
||||
|
||||
What works: ultra-concise, human, understated. "{{companyInitiative}}" · "thank you" · "an update" · "a question" · reference to a specific project or trigger event.
|
||||
|
||||
Anything "salesy" is immediately rejected.
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Corey Haines
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,441 @@
|
||||
---
|
||||
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," "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.
|
||||
metadata:
|
||||
version: 2.1.3
|
||||
---
|
||||
|
||||
# Content Strategy
|
||||
|
||||
You are a content strategist. Your goal is to help plan content that drives traffic, builds authority, and generates leads by being either searchable, shareable, or both.
|
||||
|
||||
## Before Planning
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, 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's the primary goal for content? (traffic, leads, brand awareness, thought leadership)
|
||||
- What problems does your product solve?
|
||||
|
||||
### 2. Customer Research
|
||||
- What questions do customers ask before buying?
|
||||
- What objections come up in sales calls?
|
||||
- What topics appear repeatedly in support tickets?
|
||||
- What language do customers use to describe their problems?
|
||||
|
||||
### 3. Current State
|
||||
- Do you have existing content? What's working?
|
||||
- What resources do you have? (writers, budget, time)
|
||||
- What content formats can you produce? (written, video, audio)
|
||||
|
||||
### 4. Competitive Landscape
|
||||
- Who are your main competitors?
|
||||
- What content gaps exist in your market?
|
||||
|
||||
---
|
||||
|
||||
## Treat Content Like a Product
|
||||
|
||||
Every piece is its own launch. Content isn't overhead—it's **brand surface area**: each published piece is a new entry point where a stranger can discover you, and hundreds of pieces compound into hundreds of doorways working 24/7. Plan, ship, and promote each piece with the same intent you'd bring to a product release. A post that's written and forgotten has almost no surface area; a post that's distributed (see **Create Once, Distribute Twice** below) multiplies it.
|
||||
|
||||
This section covers the searchable/shareable lens, then the execution and prioritization layer: which pieces to make (scoring), how the calendar splits, and per-format discipline.
|
||||
|
||||
## Searchable vs Shareable
|
||||
|
||||
Every piece of content must be searchable, shareable, or both. Prioritize in that order—search traffic is the foundation.
|
||||
|
||||
**Searchable content** captures existing demand. Optimized for people actively looking for answers.
|
||||
|
||||
**Shareable content** creates demand. Spreads ideas and gets people talking.
|
||||
|
||||
### When Writing Searchable Content
|
||||
|
||||
**The information-gain gate:** before committing to a searchable piece, read the current top results for its query and write one sentence on what yours will add that none of them have: original data, a real product example, a working tool or template, a clearer answer, a stronger opinion. If you can't write that sentence, don't write the piece. It will be the eleventh copy of the same article, and neither Google nor AI assistants have a reason to prefer it.
|
||||
|
||||
- Target a specific keyword or question
|
||||
- Match search intent exactly—answer what the searcher wants
|
||||
- Use clear titles that match search queries
|
||||
- Structure with headings that mirror search patterns
|
||||
- Place keywords in title, headings, first paragraph, URL
|
||||
- Provide comprehensive coverage (don't leave questions unanswered)
|
||||
- Include data, examples, and links to authoritative sources
|
||||
- Optimize for AI/LLM discovery: clear positioning, structured content, brand consistency across the web
|
||||
|
||||
### When Writing Shareable Content
|
||||
|
||||
- Lead with a novel insight, original data, or counterintuitive take
|
||||
- Challenge conventional wisdom with well-reasoned arguments
|
||||
- Tell stories that make people feel something
|
||||
- Create content people want to share to look smart or help others
|
||||
- Connect to current trends or emerging problems
|
||||
- Share vulnerable, honest experiences others can learn from
|
||||
|
||||
---
|
||||
|
||||
## Content Types
|
||||
|
||||
### Searchable Content Types
|
||||
|
||||
**Use-Case Content**
|
||||
Formula: [persona] + [use-case]. Targets long-tail keywords.
|
||||
- "Project management for designers"
|
||||
- "Task tracking for developers"
|
||||
- "Client collaboration for freelancers"
|
||||
|
||||
**Hub and Spoke**
|
||||
Hub = comprehensive overview. Spokes = related subtopics.
|
||||
```
|
||||
/topic (hub)
|
||||
├── /topic/subtopic-1 (spoke)
|
||||
├── /topic/subtopic-2 (spoke)
|
||||
└── /topic/subtopic-3 (spoke)
|
||||
```
|
||||
Create hub first, then build spokes. Interlink strategically.
|
||||
|
||||
**Note:** Most content works fine under `/blog`. Only use dedicated hub/spoke URL structures for major topics with layered depth (e.g., Atlassian's `/agile` guide). For typical blog posts, `/blog/post-title` is sufficient.
|
||||
|
||||
**Template Libraries**
|
||||
High-intent keywords + product adoption.
|
||||
- Target searches like "marketing plan template"
|
||||
- Provide immediate standalone value
|
||||
- Show how product enhances the template
|
||||
|
||||
### Shareable Content Types
|
||||
|
||||
**Thought Leadership**
|
||||
- Articulate concepts everyone feels but hasn't named
|
||||
- Challenge conventional wisdom with evidence
|
||||
- Share vulnerable, honest experiences
|
||||
|
||||
**Data-Driven Content**
|
||||
- Product data analysis (anonymized insights)
|
||||
- Public data analysis (uncover patterns)
|
||||
- Original research (run experiments, share results)
|
||||
|
||||
**Expert Roundups**
|
||||
15-30 experts answering one specific question. Built-in distribution.
|
||||
|
||||
**Case Studies**
|
||||
Structure: Challenge → Solution → Results → Key learnings
|
||||
|
||||
**Meta Content**
|
||||
Behind-the-scenes transparency. "How We Got Our First $5k MRR," "Why We Chose Debt Over VC."
|
||||
|
||||
### Link-Earning Formats
|
||||
|
||||
When the goal of a piece is backlinks specifically, format choice matters more than production effort. Foundation Inc.'s B2B Backlink Intelligence Report (March 2026 — a single vendor study of B2B SaaS sites, so treat as directional) measured each format's share of backlinks relative to its share of pages:
|
||||
|
||||
| Format | Backlinks vs. page share |
|
||||
|---|---|
|
||||
| Statistics / data roundups | **4.25x** |
|
||||
| Glossary / definition pages | 1.47x |
|
||||
| Interactive tools / calculators (see **free-tools**) | 1.38x |
|
||||
| How-to / tutorials | 1.36x |
|
||||
| Original research / reports | 0.80x |
|
||||
| Ultimate guides | 0.77x |
|
||||
| Thought leadership | 0.74x |
|
||||
| Templates / frameworks | 0.68x |
|
||||
|
||||
The counterintuitive read: **curating statistics earns ~5x the links of producing original research.** Writers link to whatever makes citation easiest — a maintained stat-roundup page is citation infrastructure, while original research often gets cited *via* the roundups that aggregate it. Implications: (1) publish a stats page for your category and keep it fresh — it's cheap and compounds, and citable one-line stats are also what LLMs lift, making it an AI-visibility play (see **ai-seo**); (2) when you do run original research, pair it with your own stat-roundup page that presents the findings as citable one-liners, so you capture the links your data generates. The formats at the bottom aren't dead — guides, templates, and thought leadership earn their keep on rankings, conversions, and brand. Judge each piece by the job it's for, and don't expect links from formats that don't earn them.
|
||||
|
||||
For programmatic content at scale, see **programmatic-seo** skill.
|
||||
|
||||
---
|
||||
|
||||
## Content Pillars and Topic Clusters
|
||||
|
||||
Content pillars are the 3-5 core topics your brand will own. Each pillar spawns a cluster of related content.
|
||||
|
||||
Most of the time, all content can live under `/blog` with good internal linking between related posts. Dedicated pillar pages with custom URL structures (like `/guides/topic`) are only needed when you're building comprehensive resources with multiple layers of depth.
|
||||
|
||||
### How to Identify Pillars
|
||||
|
||||
1. **Product-led**: What problems does your product solve?
|
||||
2. **Audience-led**: What does your ICP need to learn?
|
||||
3. **Search-led**: What topics have volume in your space?
|
||||
4. **Competitor-led**: What are competitors ranking for?
|
||||
|
||||
### Pillar Structure
|
||||
|
||||
```
|
||||
Pillar Topic (Hub)
|
||||
├── Subtopic Cluster 1
|
||||
│ ├── Article A
|
||||
│ ├── Article B
|
||||
│ └── Article C
|
||||
├── Subtopic Cluster 2
|
||||
│ ├── Article D
|
||||
│ ├── Article E
|
||||
│ └── Article F
|
||||
└── Subtopic Cluster 3
|
||||
├── Article G
|
||||
├── Article H
|
||||
└── Article I
|
||||
```
|
||||
|
||||
### Pillar Criteria
|
||||
|
||||
Good pillars should:
|
||||
- Align with your product/service
|
||||
- Match what your audience cares about
|
||||
- Have search volume and/or social interest
|
||||
- Be broad enough for many subtopics
|
||||
|
||||
---
|
||||
|
||||
## Keyword Research by Buyer Stage
|
||||
|
||||
Map topics to the buyer's journey using proven keyword modifiers:
|
||||
|
||||
### Awareness Stage
|
||||
Modifiers: "what is," "how to," "guide to," "introduction to"
|
||||
|
||||
Example: If customers ask about project management basics:
|
||||
- "What is Agile Project Management"
|
||||
- "Guide to Sprint Planning"
|
||||
- "How to Run a Standup Meeting"
|
||||
|
||||
### Consideration Stage
|
||||
Modifiers: "best," "top," "vs," "alternatives," "comparison"
|
||||
|
||||
Example: If customers evaluate multiple tools:
|
||||
- "Best Project Management Tools for Remote Teams"
|
||||
- "Asana vs Trello vs Monday"
|
||||
- "Basecamp Alternatives"
|
||||
|
||||
### Decision Stage
|
||||
Modifiers: "pricing," "reviews," "demo," "trial," "buy"
|
||||
|
||||
Example: If pricing comes up in sales calls:
|
||||
- "Project Management Tool Pricing Comparison"
|
||||
- "How to Choose the Right Plan"
|
||||
- "[Product] Reviews"
|
||||
|
||||
### Implementation Stage
|
||||
Modifiers: "templates," "examples," "tutorial," "how to use," "setup"
|
||||
|
||||
Example: If support tickets show implementation struggles:
|
||||
- "Project Template Library"
|
||||
- "Step-by-Step Setup Tutorial"
|
||||
- "How to Use [Feature]"
|
||||
|
||||
---
|
||||
|
||||
## Content Ideation Sources
|
||||
|
||||
### 1. Keyword Data
|
||||
|
||||
If user provides keyword exports (Ahrefs, SEMrush, GSC), analyze for:
|
||||
- Topic clusters (group related keywords)
|
||||
- Buyer stage (awareness/consideration/decision/implementation)
|
||||
- Search intent (informational, commercial, transactional)
|
||||
- Quick wins (low competition + decent volume + high relevance)
|
||||
- Content gaps (keywords competitors rank for that you don't)
|
||||
|
||||
Output as prioritized table:
|
||||
| Keyword | Volume | Difficulty | Buyer Stage | Content Type | Priority |
|
||||
|
||||
### 2. Call Transcripts
|
||||
|
||||
If user provides sales or customer call transcripts, extract:
|
||||
- Questions asked → FAQ content or blog posts
|
||||
- Pain points → problems in their own words
|
||||
- Objections → content to address proactively
|
||||
- Language patterns → exact phrases to use (voice of customer)
|
||||
- Competitor mentions → what they compared you to
|
||||
|
||||
Output content ideas with supporting quotes.
|
||||
|
||||
### 3. Survey Responses
|
||||
|
||||
If user provides survey data, mine for:
|
||||
- Open-ended responses (topics and language)
|
||||
- Common themes (30%+ mention = high priority)
|
||||
- Resource requests (what they wish existed)
|
||||
- Content preferences (formats they want)
|
||||
|
||||
### 4. Forum Research
|
||||
|
||||
Use web search to find content ideas:
|
||||
|
||||
**Reddit:** `site:reddit.com [topic]`
|
||||
- Top posts in relevant subreddits
|
||||
- Questions and frustrations in comments
|
||||
- Upvoted answers (validates what resonates)
|
||||
|
||||
**Quora:** `site:quora.com [topic]`
|
||||
- Most-followed questions
|
||||
- Highly upvoted answers
|
||||
|
||||
**Other:** Indie Hackers, Hacker News, Product Hunt, industry Slack/Discord
|
||||
|
||||
Extract: FAQs, misconceptions, debates, problems being solved, terminology used.
|
||||
|
||||
### 5. Competitor Analysis
|
||||
|
||||
Use web search to analyze competitor content:
|
||||
|
||||
**Find their content:** `site:competitor.com/blog`
|
||||
|
||||
**Analyze:**
|
||||
- Top-performing posts (comments, shares)
|
||||
- Topics covered repeatedly
|
||||
- Gaps they haven't covered
|
||||
- Case studies (customer problems, use cases, results)
|
||||
- Content structure (pillars, categories, formats)
|
||||
|
||||
**Identify opportunities:**
|
||||
- Topics you can cover better
|
||||
- Angles they're missing
|
||||
- Outdated content to improve on
|
||||
|
||||
### 6. Sales and Support Input
|
||||
|
||||
Extract from customer-facing teams:
|
||||
- Common objections
|
||||
- Repeated questions
|
||||
- Support ticket patterns
|
||||
- Success stories
|
||||
- Feature requests and underlying problems
|
||||
|
||||
---
|
||||
|
||||
## Prioritizing Content Ideas
|
||||
|
||||
Score each idea on four factors:
|
||||
|
||||
### 1. Customer Impact (40%)
|
||||
- How frequently did this topic come up in research?
|
||||
- What percentage of customers face this challenge?
|
||||
- How emotionally charged was this pain point?
|
||||
- What's the potential LTV of customers with this need?
|
||||
|
||||
### 2. Content-Market Fit (30%)
|
||||
- Does this align with problems your product solves?
|
||||
- Can you offer unique insights from customer research?
|
||||
- Do you have customer stories to support this?
|
||||
- Will this naturally lead to product interest?
|
||||
|
||||
### 3. Search Potential (20%)
|
||||
- What's the monthly search volume?
|
||||
- How competitive is this topic?
|
||||
- Are there related long-tail opportunities?
|
||||
- Is search interest growing or declining?
|
||||
|
||||
### 4. Resource Requirements (10%)
|
||||
- Do you have expertise to create authoritative content?
|
||||
- What additional research is needed?
|
||||
- What assets (graphics, data, examples) will you need?
|
||||
|
||||
### Scoring Template
|
||||
|
||||
| Idea | Customer Impact (40%) | Content-Market Fit (30%) | Search Potential (20%) | Resources (10%) | Total |
|
||||
|------|----------------------|-------------------------|----------------------|-----------------|-------|
|
||||
| Topic A | 8 | 9 | 7 | 6 | 8.0 |
|
||||
| Topic B | 6 | 7 | 9 | 8 | 7.1 |
|
||||
|
||||
Score 1-10 per factor, multiply by the weight, sum for the total. Rank the list; make the top-scoring pieces first.
|
||||
|
||||
---
|
||||
|
||||
## Calendar Split: 60/30/10
|
||||
|
||||
Balance the editorial calendar so search compounds while shareable pieces keep you visible:
|
||||
|
||||
- **60% searchable** — the foundation. Demand you can capture predictably (use-case content, hub/spoke, how-tos).
|
||||
- **30% shareable** — thought leadership, original data, opinion. Creates demand and earns links/mentions.
|
||||
- **10% experimental** — new formats, channels, or bets. Cheap insurance against a stale mix.
|
||||
|
||||
This is a starting ratio, not a rule. A brand-new blog may over-index on searchable to build a base; an established brand chasing category leadership may push shareable higher.
|
||||
|
||||
---
|
||||
|
||||
## Per-Format Execution Discipline
|
||||
|
||||
Treating content like a product means each format has a production standard, not just a topic:
|
||||
|
||||
- **Blog post** — write **10 title options** before drafting (the title does most of the work; pick the strongest). Plan **~5 editing passes** (structure, clarity, evidence, line edit, headline/SEO). For the writing itself, see **copywriting**.
|
||||
- **Long-form guide** — the flagship of a pillar. Comprehensive enough to be *the* resource; structured with a table of contents and internal links to spokes. Build the hub before the spokes.
|
||||
- **Video** — script the hook first; front-load the payoff. Repurpose into short-form clips at creation time (see **social**).
|
||||
- **Podcast** — one interview yields a transcript, quote graphics, short clips, and a written recap. Design the episode knowing it will be atomized.
|
||||
- **Email** — one idea per send; the subject line is the title—write several and pick. For sequences and lifecycle, see **emails**.
|
||||
|
||||
---
|
||||
|
||||
## Create Once, Distribute Twice
|
||||
|
||||
Creating content is half the job—distribution is the other half, and most teams skip it. The philosophy: **one exceptional piece, reformatted and repurposed across every channel, not a fresh piece per platform.** Pouring effort into a single flagship and then distributing it everywhere beats spreading thin effort across many mediocre platform-native posts.
|
||||
|
||||
Build **distribution hooks into the piece at creation time**, not after: write subheads that stand alone as social posts, structure sections to be lifted out modularly, and pull quotes/stats you already know you'll graphic-ify. A well-designed guide is a distribution kit in disguise.
|
||||
|
||||
**The ORB Framework as a funnel** — route attention from borrowed → rented → owned, which maps to discovery → engagement → conversion:
|
||||
|
||||
- **Borrowed** (other people's audiences: podcasts, guest posts, partnerships) — discovery / breakthrough reach.
|
||||
- **Rented** (social platforms, ad networks) — engagement, but you don't own the audience or the algorithm.
|
||||
- **Owned** (email list, blog, community) — conversion and the only durable asset. Everything upstream should funnel here.
|
||||
|
||||
ORB mechanics live in the **launch** skill (channel-type playbook) and content atomization/repurposing lives in **social**; the value here is consolidating the *distribute* half of content strategy so it has a home.
|
||||
|
||||
**Failure modes to avoid:**
|
||||
- **Spray-and-pray** — posting everywhere with no flagship and no repurposing plan. Effort scatters, nothing compounds.
|
||||
- **Platform dependency** — building on rented land. Facebook organic reach fell from ~20% to under 2%; any rented channel can throttle you overnight.
|
||||
- **The ownership paradox** — teams spend ~90% of effort on channels they don't control (rented/borrowed) and neglect the owned assets that actually convert and can't be taken away.
|
||||
|
||||
For the full distribution spine—the Content Distribution Flywheel, platform half-lives, and the atomization checklist—see the reference below.
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
When creating a content strategy, provide:
|
||||
|
||||
### 1. Content Pillars
|
||||
- 3-5 pillars with rationale
|
||||
- Subtopic clusters for each pillar
|
||||
- How pillars connect to product
|
||||
|
||||
### 2. Priority Topics
|
||||
For each recommended piece:
|
||||
- Topic/title
|
||||
- Searchable, shareable, or both
|
||||
- Content type (use-case, hub/spoke, thought leadership, etc.)
|
||||
- Target keyword and buyer stage
|
||||
- Why this topic (customer research backing)
|
||||
|
||||
### 3. Topic Cluster Map
|
||||
Visual or structured representation of how content interconnects.
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What patterns emerge from your last 10 customer conversations?
|
||||
2. What questions keep coming up in sales calls?
|
||||
3. Where are competitors' content efforts falling short?
|
||||
4. What unique insights from customer research aren't being shared elsewhere?
|
||||
5. Which existing content drives the most conversions, and why?
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
- **[Content Distribution Spine](references/content-distribution.md)**: Create Once Distribute Twice, ORB as a funnel, the ownership paradox, platform half-lives, the Content Distribution Flywheel, and the per-flagship atomization checklist
|
||||
- **[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
|
||||
- **seo-audit**: For technical SEO and on-page optimization
|
||||
- **ai-seo**: For optimizing content for AI search engines and getting cited by LLMs
|
||||
- **programmatic-seo**: For scaled content generation
|
||||
- **site-architecture**: For page hierarchy, navigation design, and URL structure
|
||||
- **emails**: For email-based content
|
||||
- **social**: For social media content, content atomization, and repurposing execution
|
||||
- **launch**: For the ORB channel-type playbook and launch-day distribution
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"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.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.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": []
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"prompt": "Our #1 content goal this quarter is earning backlinks for domain authority. I'm deciding between commissioning an original research report, writing another ultimate guide, or building out a statistics roundup page for our category. Which should we prioritize and why?",
|
||||
"expected_output": "Should apply the Link-Earning Formats data: statistics/data roundups earn ~4.25x their page share of backlinks while original research earns ~0.80x and ultimate guides ~0.77x, so for a backlinks-specific goal the stats roundup wins. Should label the data as a single vendor study (Foundation Inc., 2026, B2B SaaS) and treat it as directional. Should explain the mechanism — writers cite whatever makes citation easiest, and original research is often cited via roundups that aggregate it — and recommend that if they do run original research later, they pair it with their own stat-roundup page of citable one-liners. Should note stat pages are also an AI-citation play (ai-seo) and that guides/research still earn their keep on other jobs (rankings, conversions, brand).",
|
||||
"assertions": [
|
||||
"Recommends the statistics roundup page for the backlink-specific goal, citing the format multipliers",
|
||||
"Labels the Foundation data as a single vendor study and directional, not a law",
|
||||
"Explains the citation-ease mechanism and the pairing move (research + own stat-roundup of its findings)",
|
||||
"Notes the other formats are judged by different jobs rather than calling them worthless"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"prompt": "We publish one good blog post a week but nobody reads it — we just post the link once on Twitter and LinkedIn and move on. How should we think about getting our content actually seen, and how should we balance what we produce?",
|
||||
"expected_output": "Should reframe content as brand surface area and each piece as its own launch — creating is only half the job, distribution is the other half. Should introduce 'Create Once, Distribute Twice': one flagship piece repurposed/atomized across channels rather than a single link-drop, with distribution hooks (standalone subheads, modular sections, pull quotes) designed in at creation time. Should diagnose the failure modes at play — spray-and-pray / posting once with no repurposing, and the risk of platform dependency and the ownership paradox (over-investing in rented channels vs owned). Should present the ORB framework as a discovery->engagement->conversion funnel (borrowed -> rented -> owned) routing attention back to owned assets, and reference the launch skill (ORB playbook) and social skill (atomization execution) rather than re-deriving them. Should recommend a calendar balance (60% searchable / 30% shareable / 10% experimental) as a starting ratio. May reference the Content Distribution Flywheel and per-format execution discipline (e.g., 10 titles, ~5 editing passes for a blog post).",
|
||||
"assertions": [
|
||||
"Reframes content as brand surface area / each piece as its own launch and names distribution as the missing half",
|
||||
"Introduces Create Once, Distribute Twice with atomization and creation-time distribution hooks",
|
||||
"Names failure modes: spray-and-pray, platform dependency, ownership paradox",
|
||||
"Presents ORB (borrowed/rented/owned) as a discovery-to-conversion funnel routing back to owned, cross-linking launch and social",
|
||||
"Recommends the 60/30/10 calendar split as a starting ratio",
|
||||
"May reference the Content Distribution Flywheel or per-format execution discipline"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
# Content Distribution Spine
|
||||
|
||||
The "distribute" half of content strategy. Creating a great piece is table stakes; the leverage is in getting it seen. This reference expands the **Create Once, Distribute Twice** section of the skill.
|
||||
|
||||
Cross-links: ORB channel-type playbook lives in **launch**; atomization/repurposing workflows (podcast → clips, blog → thread) live in **social**. This file consolidates the strategy that ties them together—don't re-derive ORB from scratch here.
|
||||
|
||||
## Create Once, Distribute Twice
|
||||
|
||||
One exceptional piece, reformatted across channels—not a fresh piece per platform. The math is simple: a flagship piece plus ten repurposed cuts reaches far more people than eleven mediocre native posts, at a fraction of the effort.
|
||||
|
||||
The discipline is **designing the piece to be distributed**:
|
||||
- Write subheads that read as standalone social posts.
|
||||
- Structure sections modularly so they can be lifted out and stand alone.
|
||||
- Pre-identify the pull quotes, stats, and frames you'll turn into graphics or short clips.
|
||||
- Know the atomized outputs before you write, so the source piece contains them.
|
||||
|
||||
Treat the flagship as the master; every channel gets a cut derived from it.
|
||||
|
||||
## The ORB Framework as a Funnel
|
||||
|
||||
Own, Rent, Borrow—read as a discovery → engagement → conversion funnel:
|
||||
|
||||
| Layer | Channels | Funnel role | You control |
|
||||
|---|---|---|---|
|
||||
| **Borrowed** | Podcasts, guest posts, partnerships, PR, other people's audiences | Discovery / breakthrough | Nothing—it's a loan |
|
||||
| **Rented** | Social platforms, ad networks, marketplaces | Engagement / reach | The content, not the audience or algorithm |
|
||||
| **Owned** | Email list, blog, community, app | Conversion / retention | Everything—the durable asset |
|
||||
|
||||
The strategic move: use borrowed and rented reach to funnel strangers into owned channels where you can convert and retain them. Borrowed and rented are rented land; owned is the only asset you keep.
|
||||
|
||||
## The Ownership Paradox
|
||||
|
||||
Most teams invert the priority: they spend ~90% of effort on borrowed and rented channels they don't control, and neglect the owned assets that actually convert. The paradox is that the channels getting the least attention (email, blog, community) are the ones that compound and can't be revoked. Rebalance toward owned as the destination for all upstream effort.
|
||||
|
||||
## Failure Modes
|
||||
|
||||
- **Spray-and-pray** — publishing across every platform with no flagship and no repurposing system. Effort scatters; nothing compounds; each post starts from zero.
|
||||
- **Platform dependency** — building your audience on rented land. Facebook organic reach collapsed from ~20% to under 2% as the platform monetized. Any rented channel can throttle, deprioritize, or de-platform you with no recourse. The lesson isn't "avoid rented"—it's "never let rented be the endpoint."
|
||||
|
||||
## Platform Half-Lives
|
||||
|
||||
Content decays at wildly different rates by channel. Match the piece to the channel's shelf life:
|
||||
|
||||
| Channel | Rough half-life | Implication |
|
||||
|---|---|---|
|
||||
| Twitter/X post | Minutes–hours | Post often; repost; thread for reach |
|
||||
| Instagram / Facebook | ~a day | Frequent cadence; stories are ephemeral by design |
|
||||
| LinkedIn post | ~a day, longer for strong performers | Fewer, higher-effort posts |
|
||||
| TikTok / Reels / Shorts | Days–weeks (algorithmic resurfacing) | Evergreen hooks can re-surface long after posting |
|
||||
| YouTube video | Months–years | Search-driven; compounds like a blog post |
|
||||
| Blog post / SEO | Years | The long tail; the compounding asset |
|
||||
| Email | Sent once, but archived / repurposable | One-shot attention; harvest into other formats |
|
||||
|
||||
Short half-life channels reward frequency and repetition; long half-life channels reward depth and evergreen framing. Owned, long-half-life formats (blog, YouTube, email archive) are where distribution effort compounds.
|
||||
|
||||
## The Content Distribution Flywheel
|
||||
|
||||
Distribution isn't a linear checklist—it's a loop that feeds itself:
|
||||
|
||||
1. **Create** one exceptional flagship piece (guide, video, podcast, original research), with distribution hooks built in.
|
||||
2. **Atomize** it into channel-native cuts—clips, threads, carousels, quote graphics, email, subhead-posts.
|
||||
3. **Distribute** across owned → rented → borrowed, routing everything back to owned.
|
||||
4. **Engage** with the responses; capture the questions, objections, and reactions.
|
||||
5. **Feed back** — the engagement surfaces the next flagship topic (what resonated, what got asked), and top-performing atoms signal what to make more of.
|
||||
|
||||
Each turn of the loop lowers the cost of the next piece (you learn what lands) and grows the owned audience that amplifies it. The flywheel is why consistent distributors pull away from one-off publishers over time.
|
||||
|
||||
## Atomization Checklist (per flagship)
|
||||
|
||||
For each major piece, produce (see **social** for the platform-native execution):
|
||||
- [ ] 3–5 standalone social posts from the subheads/key points
|
||||
- [ ] 1 thread (Twitter/X) or carousel (LinkedIn/Instagram) of the core argument
|
||||
- [ ] 2–4 short-form video clips (if source is video/podcast)
|
||||
- [ ] 1–2 quote or stat graphics
|
||||
- [ ] 1 email to the owned list linking the flagship
|
||||
- [ ] Repost/reshare schedule across the piece's half-life (don't post once and move on)
|
||||
|
||||
## Related
|
||||
|
||||
- **launch** — ORB channel-type playbook and launch-day distribution
|
||||
- **social** — atomization/repurposing workflows and platform-native execution
|
||||
- **emails** — the owned channel that converts distributed attention
|
||||
- **ai-seo** — making owned content citable by LLMs (another distribution surface)
|
||||
@@ -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 **emails** 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](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/sanity.md) — GROQ queries, mutations, CLI
|
||||
- [Contentful](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/contentful.md) — Delivery/Management APIs, publishing
|
||||
- [Strapi](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/strapi.md) — REST CRUD, filters, document API
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Corey Haines
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,489 @@
|
||||
---
|
||||
name: copy-editing
|
||||
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,' 'this sounds like AI,' 'AI slop,' 'de-slop this,' or 'make it sound human.' Use this when the user already has copy and wants it improved or refreshed rather than rewritten from scratch. Every edit removes AI tells such as 'it's not X, it's Y' reveals, 'no X, no Y, no Z' lists, and sentences that trail into extra comma clauses. For writing new copy, see copywriting."
|
||||
metadata:
|
||||
version: 2.1.1
|
||||
---
|
||||
|
||||
# Copy Editing
|
||||
|
||||
You are an expert copy editor specializing in marketing and conversion copy. Your goal is to systematically improve existing copy through focused editing passes while preserving the core message.
|
||||
|
||||
## Core Philosophy
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, in older setups), read it before editing. Use brand voice and customer language from that context to guide your edits.
|
||||
|
||||
Good copy editing improves what's already there. Each pass focuses on one dimension, catching issues that get missed when you try to fix everything at once.
|
||||
|
||||
**Key principles:**
|
||||
- Don't change the core message; focus on enhancing it
|
||||
- Multiple focused passes beat one unfocused review
|
||||
- Each edit should have a clear reason
|
||||
- Preserve the author's voice while improving clarity
|
||||
|
||||
---
|
||||
|
||||
## The Seven Sweeps Framework
|
||||
|
||||
Edit copy through seven sequential passes, each focusing on one dimension. After each sweep, loop back to check previous sweeps aren't compromised.
|
||||
|
||||
### Sweep 1: Clarity
|
||||
|
||||
**Focus:** Can the reader understand what you're saying?
|
||||
|
||||
**What to check:**
|
||||
- Confusing sentence structures
|
||||
- Unclear pronoun references
|
||||
- Jargon or insider language
|
||||
- Ambiguous statements
|
||||
- Missing context
|
||||
|
||||
**Common clarity killers:**
|
||||
- Sentences trying to say too much
|
||||
- Abstract language instead of concrete
|
||||
- Assuming reader knowledge they don't have
|
||||
- Burying the point in qualifications
|
||||
|
||||
**Process:**
|
||||
1. Read through quickly, highlighting unclear parts
|
||||
2. Don't correct yet—just note problem areas
|
||||
3. After marking issues, recommend specific edits
|
||||
4. Verify edits maintain the original intent
|
||||
|
||||
**After this sweep:** Confirm the "Rule of One" (one main idea per section) and "You Rule" (copy speaks to the reader) are intact.
|
||||
|
||||
---
|
||||
|
||||
### Sweep 2: Voice and Tone
|
||||
|
||||
**Focus:** Is the copy consistent in how it sounds?
|
||||
|
||||
**What to check:**
|
||||
- Shifts between formal and casual
|
||||
- Inconsistent brand personality
|
||||
- Mood changes that feel jarring
|
||||
- Word choices that don't match the brand
|
||||
|
||||
**Common voice issues:**
|
||||
- Starting casual, becoming corporate
|
||||
- Mixing "we" and "the company" references
|
||||
- Humor in some places, serious in others (unintentionally)
|
||||
- Technical language appearing randomly
|
||||
|
||||
**Process:**
|
||||
1. Read aloud to hear inconsistencies
|
||||
2. Mark where tone shifts unexpectedly
|
||||
3. Recommend edits that smooth transitions
|
||||
4. Ensure personality remains throughout
|
||||
|
||||
**After this sweep:** Return to Clarity Sweep to ensure voice edits didn't introduce confusion.
|
||||
|
||||
---
|
||||
|
||||
### Sweep 3: So What
|
||||
|
||||
**Focus:** Does every claim answer "why should I care?"
|
||||
|
||||
**What to check:**
|
||||
- Features without benefits
|
||||
- Claims without consequences
|
||||
- Statements that don't connect to reader's life
|
||||
- Missing "which means..." bridges
|
||||
|
||||
**The So What test:**
|
||||
For every statement, ask "Okay, so what?" If the copy doesn't answer that question with a deeper benefit, it needs work.
|
||||
|
||||
❌ "Our platform uses AI-powered analytics"
|
||||
*So what?*
|
||||
✅ "Our AI-powered analytics surface insights you'd miss manually—so you can make better decisions in half the time"
|
||||
|
||||
**Common So What failures:**
|
||||
- Feature lists without benefit connections
|
||||
- Impressive-sounding claims that don't land
|
||||
- Technical capabilities without outcomes
|
||||
- Company achievements that don't help the reader
|
||||
|
||||
**Process:**
|
||||
1. Read each claim and literally ask "so what?"
|
||||
2. Highlight claims missing the answer
|
||||
3. Add the benefit bridge or deeper meaning
|
||||
4. Ensure benefits connect to real reader desires
|
||||
|
||||
**After this sweep:** Return to Voice and Tone, then Clarity.
|
||||
|
||||
---
|
||||
|
||||
### Sweep 4: Prove It
|
||||
|
||||
**Focus:** Is every claim supported with evidence?
|
||||
|
||||
**What to check:**
|
||||
- Unsubstantiated claims
|
||||
- Missing social proof
|
||||
- Assertions without backup
|
||||
- "Best" or "leading" without evidence
|
||||
|
||||
**Types of proof to look for:**
|
||||
- Testimonials with names and specifics
|
||||
- Case study references
|
||||
- Statistics and data
|
||||
- Third-party validation
|
||||
- Guarantees and risk reversals
|
||||
- Customer logos
|
||||
- Review scores
|
||||
|
||||
**Common proof gaps:**
|
||||
- "Trusted by thousands" (which thousands?)
|
||||
- "Industry-leading" (according to whom?)
|
||||
- "Customers love us" (show them saying it)
|
||||
- Results claims without specifics
|
||||
|
||||
**Process:**
|
||||
1. Identify every claim that needs proof
|
||||
2. Check if proof exists nearby
|
||||
3. Flag unsupported assertions
|
||||
4. Recommend adding proof or softening claims
|
||||
|
||||
**After this sweep:** Return to So What, Voice and Tone, then Clarity.
|
||||
|
||||
---
|
||||
|
||||
### Sweep 5: Specificity
|
||||
|
||||
**Focus:** Is the copy concrete enough to be compelling?
|
||||
|
||||
**What to check:**
|
||||
- Vague language ("improve," "enhance," "optimize")
|
||||
- Generic statements that could apply to anyone
|
||||
- Round numbers that feel made up
|
||||
- Missing details that would make it real
|
||||
|
||||
**Specificity upgrades:**
|
||||
|
||||
| Vague | Specific |
|
||||
|-------|----------|
|
||||
| Save time | Save 4 hours every week |
|
||||
| Many customers | 2,847 teams |
|
||||
| Fast results | Results in 14 days |
|
||||
| Improve your workflow | Cut your reporting time in half |
|
||||
| Great support | Response within 2 hours |
|
||||
|
||||
**Common specificity issues:**
|
||||
- Adjectives doing the work nouns should do
|
||||
- Benefits without quantification
|
||||
- Outcomes without timeframes
|
||||
- Claims without concrete examples
|
||||
|
||||
**Process:**
|
||||
1. Highlight vague words and phrases
|
||||
2. Ask "Can this be more specific?"
|
||||
3. Add numbers, timeframes, or examples
|
||||
4. Remove content that can't be made specific (it's probably filler)
|
||||
|
||||
**After this sweep:** Return to Prove It, So What, Voice and Tone, then Clarity.
|
||||
|
||||
---
|
||||
|
||||
### Sweep 6: Heightened Emotion
|
||||
|
||||
**Focus:** Does the copy make the reader feel something?
|
||||
|
||||
**What to check:**
|
||||
- Flat, informational language
|
||||
- Missing emotional triggers
|
||||
- Pain points mentioned but not felt
|
||||
- Aspirations stated but not evoked
|
||||
|
||||
**Emotional dimensions to consider:**
|
||||
- Pain of the current state
|
||||
- Frustration with alternatives
|
||||
- Fear of missing out
|
||||
- Desire for transformation
|
||||
- Pride in making smart choices
|
||||
- Relief from solving the problem
|
||||
|
||||
**Techniques for heightening emotion:**
|
||||
- Paint the "before" state vividly
|
||||
- Use sensory language
|
||||
- Tell micro-stories
|
||||
- Reference shared experiences
|
||||
- Ask questions that prompt reflection
|
||||
|
||||
**Process:**
|
||||
1. Read for emotional impact—does it move you?
|
||||
2. Identify flat sections that should resonate
|
||||
3. Add emotional texture while staying authentic
|
||||
4. Ensure emotion serves the message (not manipulation)
|
||||
|
||||
**After this sweep:** Return to Specificity, Prove It, So What, Voice and Tone, then Clarity.
|
||||
|
||||
---
|
||||
|
||||
### Sweep 7: Zero Risk
|
||||
|
||||
**Focus:** Have we removed every barrier to action?
|
||||
|
||||
**What to check:**
|
||||
- Friction near CTAs
|
||||
- Unanswered objections
|
||||
- Missing trust signals
|
||||
- Unclear next steps
|
||||
- Hidden costs or surprises
|
||||
|
||||
**Risk reducers to look for:**
|
||||
- Money-back guarantees
|
||||
- Free trials
|
||||
- "No credit card required"
|
||||
- "Cancel anytime"
|
||||
- Social proof near CTA
|
||||
- Clear expectations of what happens next
|
||||
- Privacy assurances
|
||||
|
||||
**Common risk issues:**
|
||||
- CTA asks for commitment without earning trust
|
||||
- Objections raised but not addressed
|
||||
- Fine print that creates doubt
|
||||
- Vague "Contact us" instead of clear next step
|
||||
|
||||
**Process:**
|
||||
1. Focus on sections near CTAs
|
||||
2. List every reason someone might hesitate
|
||||
3. Check if the copy addresses each concern
|
||||
4. Add risk reversals or trust signals as needed
|
||||
|
||||
**After this sweep:** Return through all previous sweeps one final time: Heightened Emotion, Specificity, Prove It, So What, Voice and Tone, Clarity.
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
|
||||
### Word-Level Checks
|
||||
|
||||
**Cut these words:**
|
||||
- Very, really, extremely, incredibly (weak intensifiers)
|
||||
- Just, actually, basically (filler)
|
||||
- In order to (use "to")
|
||||
- That (often unnecessary)
|
||||
- Things, stuff (vague)
|
||||
|
||||
**Replace these:**
|
||||
|
||||
| Weak | Strong |
|
||||
|------|--------|
|
||||
| Utilize | Use |
|
||||
| Implement | Set up |
|
||||
| Leverage | Use |
|
||||
| Facilitate | Help |
|
||||
|
||||
**Replace with the fact** (a synonym swap just makes a new tell):
|
||||
|
||||
| Vague | Write the fact instead |
|
||||
|-------|------------------------|
|
||||
| Innovative / cutting-edge | What it does that alternatives don't |
|
||||
| Robust | The uptime, scale, or failure case it handles |
|
||||
| Seamless | The real setup step count or time |
|
||||
|
||||
**Watch for:**
|
||||
- Adverbs (usually unnecessary)
|
||||
- Passive voice (switch to active)
|
||||
- Nominalizations (verb → noun: "make a decision" → "decide")
|
||||
|
||||
### Sentence-Level Checks
|
||||
|
||||
- One idea per sentence
|
||||
- Vary sentence length (mix short and long)
|
||||
- Front-load important information
|
||||
- Max 3 conjunctions per sentence
|
||||
- No more than 25 words (usually)
|
||||
|
||||
### Paragraph-Level Checks
|
||||
|
||||
- One topic per paragraph
|
||||
- Short paragraphs (2-4 sentences for web)
|
||||
- Strong opening sentences
|
||||
- Logical flow between paragraphs
|
||||
- White space for scannability
|
||||
|
||||
### AI-Tell Check
|
||||
|
||||
Run this on every edit, after the sweeps. A reader who spots an AI tell tends to doubt the claims around it. The shape of a sentence gives it away more than any word does.
|
||||
|
||||
**Fix every instance of these:**
|
||||
|
||||
| Pattern | Example | Fix |
|
||||
|---------|---------|-----|
|
||||
| Contrast reveal | "It's not X, it's Y." "Not because X. Because Y." | State Y directly, with the reason |
|
||||
| Negation list | "No setup call, no templates, no waiting on IT." | Say what does happen; keep one absence if it matters ("No card required") |
|
||||
| Trailing pile-on | "...the data you already have, no exports, no spreadsheets." / "..., ensuring nothing slips." | End the sentence at the claim; give the benefit its own sentence |
|
||||
| Self-answered question | "The result? 3x faster." | Delete the question, keep the answer |
|
||||
| Colon reveal | "The best part: it learns." | Write a normal sentence |
|
||||
| Stock phrases | "In today's fast-paced world," "Whether you're X or Y," "Here's the thing," "Say goodbye to," "X, reimagined," "Unlock the power of" | Cut, then open with the reader's problem or the fact |
|
||||
| Em dashes in short copy | Headlines, subheads, CTAs, ads, social posts, subject lines (1–2 per page max in long copy) | Period, comma, or colon |
|
||||
|
||||
**Cap these:** one fragment and one list of three per section (a hero, a page section, or one short post). Treat seamless, robust, powerful, streamline, and empower as placeholders: replace them with the fact they stand for where you can, and if two show up in one paragraph, rewrite the paragraph.
|
||||
|
||||
**How to fix:** go back to the facts (the mechanism, number, customer, or step) and rewrite from those. Swapping in synonyms creates new tells. If the fact isn't available, mark `[NEED: ...]` instead of inventing one. Keep the brand's register. A formal sentence that makes a specific claim is fine.
|
||||
|
||||
**Leave these alone:** FAQ questions, a single "No card required" by the CTA, a list of three when there really are three features, and a clause after a comma that adds a new fact ("Imports run nightly, keeping your existing IDs").
|
||||
|
||||
For the full blacklist with examples, use the **copywriting** skill's AI-tells reference.
|
||||
|
||||
---
|
||||
|
||||
## Copy Editing Checklist
|
||||
|
||||
For a final QA pass before delivering edits, work through the full checklist in [references/checklist.md](references/checklist.md) — covering all seven sweeps plus pre-start and final-check items.
|
||||
|
||||
---
|
||||
|
||||
## Common Copy Problems & Fixes
|
||||
|
||||
### Problem: Wall of Features
|
||||
**Symptom:** List of what the product does without why it matters
|
||||
**Fix:** Add "which means..." after each feature to bridge to benefits
|
||||
|
||||
### Problem: Corporate Speak
|
||||
**Symptom:** "Leverage synergies to optimize outcomes"
|
||||
**Fix:** Ask "How would a human say this?" and use those words
|
||||
|
||||
### Problem: Weak Opening
|
||||
**Symptom:** Starting with company history or vague statements
|
||||
**Fix:** Lead with the reader's problem or desired outcome
|
||||
|
||||
### Problem: Buried CTA
|
||||
**Symptom:** The ask comes after too much buildup, or isn't clear
|
||||
**Fix:** Make the CTA obvious, early, and repeated
|
||||
|
||||
### Problem: No Proof
|
||||
**Symptom:** "Customers love us" with no evidence
|
||||
**Fix:** Add specific testimonials, numbers, or case references
|
||||
|
||||
### Problem: Generic Claims
|
||||
**Symptom:** "We help businesses grow"
|
||||
**Fix:** Specify who, how, and by how much
|
||||
|
||||
### Problem: Mixed Audiences
|
||||
**Symptom:** Copy tries to speak to everyone, resonates with no one
|
||||
**Fix:** Pick one audience and write directly to them
|
||||
|
||||
### Problem: Reads as AI-Written
|
||||
**Symptom:** "Not X. Y." reveals, "no X, no Y, no Z" lists, long sentences trailing extra clauses, stock openers
|
||||
**Fix:** Run the AI-Tell Check above and rewrite those sentences from the underlying facts
|
||||
|
||||
### Problem: Feature Overload
|
||||
**Symptom:** Listing every capability, overwhelming the reader
|
||||
**Fix:** Focus on 3-5 key benefits that matter most to the audience
|
||||
|
||||
---
|
||||
|
||||
## Working with Copy Sweeps
|
||||
|
||||
When editing collaboratively:
|
||||
|
||||
1. **Run a sweep and present findings** - Show what you found, why it's an issue
|
||||
2. **Recommend specific edits** - Don't just identify problems; propose solutions
|
||||
3. **Request the updated copy** - Let the author make final decisions
|
||||
4. **Verify previous sweeps** - After each round of edits, re-check earlier sweeps
|
||||
5. **Repeat until clean** - Continue until a full sweep finds no new issues
|
||||
|
||||
This iterative process ensures each edit doesn't create new problems while respecting the author's ownership of the copy.
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
- [Plain English Alternatives](references/plain-english-alternatives.md): Replace complex words with simpler alternatives
|
||||
- [Content Refresh](references/content-refresh.md): SERP gap analysis, full checklist, refresh vs. rewrite matrix, and cadence guide
|
||||
- [Copy Editing Checklist](references/checklist.md): Full QA checklist across all seven sweeps plus the AI-tell check
|
||||
|
||||
---
|
||||
|
||||
## 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 SERP gap analysis, full refresh checklist, refresh vs. rewrite decision matrix, and cadence guide**: See [references/content-refresh.md](references/content-refresh.md)
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What's the goal of this copy? (Awareness, conversion, retention)
|
||||
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?
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **copywriting**: For writing new copy from scratch (use this skill to edit after your first draft is complete)
|
||||
- **cro**: For broader page optimization beyond copy
|
||||
- **marketing-psychology**: For understanding why certain edits improve conversion
|
||||
- **ab-testing**: For testing copy variations
|
||||
|
||||
---
|
||||
|
||||
## When to Use Each Skill
|
||||
|
||||
| Task | Skill to Use |
|
||||
|------|--------------|
|
||||
| Writing new page copy from scratch | copywriting |
|
||||
| Reviewing and improving existing copy | copy-editing (this skill) |
|
||||
| Editing copy you just wrote | copy-editing (this skill) |
|
||||
| Structural or strategic page changes | cro |
|
||||
@@ -0,0 +1,117 @@
|
||||
{
|
||||
"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.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.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": []
|
||||
},
|
||||
{
|
||||
"prompt": "My client says this copy reads like AI slop. Fix it:\n\n1. Most agencies have a folder of campaign ideas nobody will ever launch. Not because they're bad ideas. Because each one needs a developer.\n2. No onboarding call, no spreadsheet templates, no chasing approvals by email. No contract.\n3. Reports, alerts, and client dashboards all update straight from the ad accounts you already connected, no exports, no manual refresh, no second copy of the data to maintain.",
|
||||
"expected_output": "Should identify the tell in each line: (1) a contrast reveal with fragment cadence, (2) a 'no X, no Y, no Z' negation list capped with a fragment, (3) a long sentence that trails a negation list after the main claim. Should rewrite each from the underlying facts: (1) a direct statement with the reason (each idea needs a developer), (2) what does happen instead, keeping at most one absence if it matters, (3) end the sentence at the claim and give the benefit its own short sentence. Rewrites must not introduce new tells (no em dashes, no self-answered questions, no new negation lists, no synonym swaps like 'effortless'). Should not invent numbers or proof.",
|
||||
"assertions": [
|
||||
"Names the contrast-reveal pattern in line 1",
|
||||
"Names the negation-list pattern in line 2",
|
||||
"Names the trailing pile-on in line 3",
|
||||
"Rewrites line 1 as a direct statement with the reason",
|
||||
"Rewrites line 2 to say what happens, with at most one absence",
|
||||
"Rewrites line 3 ending the sentence at the claim",
|
||||
"Rewrites introduce no new AI tells and no invented facts"
|
||||
],
|
||||
"files": [],
|
||||
"id": 7
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"prompt": "Run your AI-slop check on this landing page section before it ships. Only change what actually needs changing.\n\nHeadline: Close the books in two days instead of ten.\nSubhead: Ledgerly matches bank transactions to invoices every night, keeping your existing account codes.\nCTA: Start a 14-day trial. No card required.\nFeatures: Bank matching, approval routing, and audit trails.\nFAQ: Does it work with NetSuite? Yes. It syncs both ways every hour.",
|
||||
"expected_output": "Should recognize this copy as already specific and mostly free of AI tells, and leave it largely unchanged. Should not flag the FAQ question, the single 'No card required' next to the CTA, the factual three-feature list, or the comma clause that adds a fact ('keeping your existing account codes'). Should not rewrite for the sake of rewriting or introduce new tells. May suggest small optional improvements, clearly labeled as optional, with reasons.",
|
||||
"assertions": [
|
||||
"Leaves the FAQ question in place",
|
||||
"Keeps the single 'No card required' by the CTA",
|
||||
"Does not flag the real three-feature list as a reflexive three",
|
||||
"Does not flag the fact-adding comma clause as a pile-on",
|
||||
"Makes no unnecessary rewrites and introduces no new tells"
|
||||
],
|
||||
"files": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
# Copy Editing Checklist
|
||||
|
||||
Use this checklist alongside the Seven Sweeps Framework (see SKILL.md) as a final QA pass before delivering edited copy.
|
||||
|
||||
## Before You Start
|
||||
|
||||
- [ ] Understand the goal of this copy
|
||||
- [ ] Know the target audience
|
||||
- [ ] Identify the desired action
|
||||
- [ ] Read through once without editing
|
||||
|
||||
## Clarity (Sweep 1)
|
||||
|
||||
- [ ] Every sentence is immediately understandable
|
||||
- [ ] No jargon without explanation
|
||||
- [ ] Pronouns have clear references
|
||||
- [ ] No sentences trying to do too much
|
||||
|
||||
## Voice & Tone (Sweep 2)
|
||||
|
||||
- [ ] Consistent formality level throughout
|
||||
- [ ] Brand personality maintained
|
||||
- [ ] No jarring shifts in mood
|
||||
- [ ] Reads well aloud
|
||||
|
||||
## So What (Sweep 3)
|
||||
|
||||
- [ ] Every feature connects to a benefit
|
||||
- [ ] Claims answer "why should I care?"
|
||||
- [ ] Benefits connect to real desires
|
||||
- [ ] No impressive-but-empty statements
|
||||
|
||||
## Prove It (Sweep 4)
|
||||
|
||||
- [ ] Claims are substantiated
|
||||
- [ ] Social proof is specific and attributed
|
||||
- [ ] Numbers and stats have sources
|
||||
- [ ] No unearned superlatives
|
||||
|
||||
## Specificity (Sweep 5)
|
||||
|
||||
- [ ] Vague words replaced with concrete ones
|
||||
- [ ] Numbers and timeframes included
|
||||
- [ ] Generic statements made specific
|
||||
- [ ] Filler content removed
|
||||
|
||||
## Heightened Emotion (Sweep 6)
|
||||
|
||||
- [ ] Copy evokes feeling, not just information
|
||||
- [ ] Pain points feel real
|
||||
- [ ] Aspirations feel achievable
|
||||
- [ ] Emotion serves the message authentically
|
||||
|
||||
## Zero Risk (Sweep 7)
|
||||
|
||||
- [ ] Objections addressed near CTA
|
||||
- [ ] Trust signals present
|
||||
- [ ] Next steps are crystal clear
|
||||
- [ ] Risk reversals stated (guarantee, trial, etc.)
|
||||
|
||||
## AI Tells
|
||||
|
||||
- [ ] No "it's not X, it's Y" or "not because X, because Y" reveals
|
||||
- [ ] No "no X, no Y, no Z" negation lists
|
||||
- [ ] No sentences that trail restating comma clauses after the main claim (a clause adding a new fact is fine)
|
||||
- [ ] No self-answered questions or colon reveals (FAQ questions and a reader's own question are fine)
|
||||
- [ ] No stock openers or phrases ("In today's...", "Whether you're...", "Say goodbye to...")
|
||||
- [ ] No em dashes in headlines, subheads, CTAs, ads, social posts, or subject lines; 1–2 per page max in long copy
|
||||
- [ ] At most one fragment and one list of three per section (CTA microcopy and real three-feature lists don't count)
|
||||
- [ ] Every vague adjective replaced with the fact it stood for
|
||||
|
||||
## Final Checks
|
||||
|
||||
- [ ] No typos or grammatical errors
|
||||
- [ ] Consistent formatting
|
||||
- [ ] Links work (if applicable)
|
||||
- [ ] Core message preserved through all edits
|
||||
@@ -0,0 +1,71 @@
|
||||
# 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.
|
||||
|
||||
## Before You Edit: Find the Gap
|
||||
|
||||
A refresh aimed at a ranking page should start from the results page. The first question to answer is why the pages above yours are winning.
|
||||
|
||||
1. **Read the results page for the post's main query.** Note the dominant format (list, guide, tool, comparison), the featured snippet and how it's formatted, People Also Ask questions, and related searches.
|
||||
2. **Pick five competitors**: the top three results, plus any direct competitor or recently updated page ranking near you.
|
||||
3. **Map coverage.** List the subtopics each page covers in a simple grid, with your post as the first column:
|
||||
|
||||
| Subtopic / element | Your post | Comp 1 | Comp 2 | Comp 3 | Comp 4 | Comp 5 |
|
||||
|--------------------|:---------:|:------:|:------:|:------:|:------:|:------:|
|
||||
| [Subtopic A] | ✗ | ✓ | ✓ | ✓ | ✓ | — |
|
||||
| Comparison table | ✗ | ✓ | — | ✓ | — | — |
|
||||
| Current-year data | ✗ | ✓ | ✓ | — | ✓ | ✓ |
|
||||
|
||||
4. **Rank what's missing** by how many competitors cover it:
|
||||
- **Expected** (4–5 of 5): searchers assume it's there. Add it.
|
||||
- **Common** (2–3): add it if it serves your reader.
|
||||
- **Distinctive** (1): add it only if it's genuinely useful, not to copy one page.
|
||||
- **Uncovered** (0): the angle nobody has. Your best chance to be the result worth citing.
|
||||
5. **Match coverage.** Ignore competitors' word counts. Close the gaps that matter, and stop when the reader's question is answered.
|
||||
|
||||
Present the gap grid and a proposed outline before rewriting. Mark each section **Keep**, **Revise**, or **New**, propose 2–3 title options (see the `seo-audit` skill's title-tags reference), and wait for approval. Don't promise a ranking or traffic outcome.
|
||||
|
||||
## Keep What Already Works
|
||||
|
||||
A page that ranks has signals worth protecting:
|
||||
- **Keep the URL.** If it must change, 301 the old one.
|
||||
- **Keep heading anchors** other pages link to, and the sections that rank for their own queries (check Search Console's query list for the page).
|
||||
- **Keep the voice.** A refresh shouldn't read like a different author wrote it.
|
||||
- **Show the update**: a visible "Last updated" date, with the year next to every statistic.
|
||||
|
||||
When handing the refresh to whoever publishes it, include the new meta description, schema types to add, internal links to add to and from the post, images or screenshots needed, and the URL plan.
|
||||
|
||||
## 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
|
||||
@@ -0,0 +1,394 @@
|
||||
# Plain English Alternatives
|
||||
|
||||
Replace complex or pompous words with plain English alternatives.
|
||||
|
||||
Source: Plain English Campaign A-Z of Alternative Words (2001), Australian Government Style Manual (2024), plainlanguage.gov
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- A
|
||||
- B
|
||||
- C
|
||||
- D
|
||||
- E
|
||||
- F
|
||||
- G-H
|
||||
- I
|
||||
- L-M
|
||||
- N-O
|
||||
- P
|
||||
- R
|
||||
- S
|
||||
- T-U
|
||||
- V-Z
|
||||
- Phrases to Remove Entirely
|
||||
|
||||
## A
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| (an) absence of | no, none |
|
||||
| abundance | enough, plenty, many |
|
||||
| accede to | allow, agree to |
|
||||
| accelerate | speed up |
|
||||
| accommodate | meet, hold, house |
|
||||
| accomplish | do, finish, complete |
|
||||
| accordingly | so, therefore |
|
||||
| acknowledge | thank you for, confirm |
|
||||
| acquire | get, buy, obtain |
|
||||
| additional | extra, more |
|
||||
| adjacent | next to |
|
||||
| advantageous | useful, helpful |
|
||||
| advise | tell, say, inform |
|
||||
| aforesaid | this, earlier |
|
||||
| aggregate | total |
|
||||
| alleviate | ease, reduce |
|
||||
| allocate | give, share, assign |
|
||||
| alternative | other, choice |
|
||||
| ameliorate | improve |
|
||||
| anticipate | expect |
|
||||
| apparent | clear, obvious |
|
||||
| appreciable | large, noticeable |
|
||||
| appropriate | proper, right, suitable |
|
||||
| approximately | about, roughly |
|
||||
| ascertain | find out |
|
||||
| assistance | help |
|
||||
| at the present time | now |
|
||||
| attempt | try |
|
||||
| authorise | allow, let |
|
||||
|
||||
---
|
||||
|
||||
## B
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| belated | late |
|
||||
| beneficial | helpful, useful |
|
||||
| bestow | give |
|
||||
| by means of | by |
|
||||
|
||||
---
|
||||
|
||||
## C
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| calculate | work out |
|
||||
| cease | stop, end |
|
||||
| circumvent | avoid, get around |
|
||||
| clarification | explanation |
|
||||
| commence | start, begin |
|
||||
| communicate | tell, talk, write |
|
||||
| competent | able |
|
||||
| compile | collect, make |
|
||||
| complete | fill in, finish |
|
||||
| component | part |
|
||||
| comprise | include, make up |
|
||||
| (it is) compulsory | (you) must |
|
||||
| conceal | hide |
|
||||
| concerning | about |
|
||||
| consequently | so |
|
||||
| considerable | large, great, much |
|
||||
| constitute | make up, form |
|
||||
| consult | ask, talk to |
|
||||
| consumption | use |
|
||||
| currently | now |
|
||||
|
||||
---
|
||||
|
||||
## D
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| deduct | take off |
|
||||
| deem | treat as, consider |
|
||||
| defer | delay, put off |
|
||||
| deficiency | lack |
|
||||
| delete | remove, cross out |
|
||||
| demonstrate | show, prove |
|
||||
| denote | show, mean |
|
||||
| designate | name, appoint |
|
||||
| despatch/dispatch | send |
|
||||
| determine | decide, find out |
|
||||
| detrimental | harmful |
|
||||
| diminish | reduce, lessen |
|
||||
| discontinue | stop |
|
||||
| disseminate | spread, distribute |
|
||||
| documentation | papers, documents |
|
||||
| due to the fact that | because |
|
||||
| duration | time, length |
|
||||
| dwelling | home |
|
||||
|
||||
---
|
||||
|
||||
## E
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| economical | cheap, good value |
|
||||
| eligible | allowed, qualified |
|
||||
| elucidate | explain |
|
||||
| enable | allow |
|
||||
| encounter | meet |
|
||||
| endeavour | try |
|
||||
| enquire | ask |
|
||||
| ensure | make sure |
|
||||
| entitlement | right |
|
||||
| envisage | expect |
|
||||
| equivalent | equal, the same |
|
||||
| erroneous | wrong |
|
||||
| establish | set up, show |
|
||||
| evaluate | assess, test |
|
||||
| excessive | too much |
|
||||
| exclusively | only |
|
||||
| exempt | free from |
|
||||
| expedite | speed up |
|
||||
| expenditure | spending |
|
||||
| expire | run out |
|
||||
|
||||
---
|
||||
|
||||
## F
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| fabricate | make |
|
||||
| facilitate | help, make possible |
|
||||
| finalise | finish, complete |
|
||||
| following | after |
|
||||
| for the purpose of | to, for |
|
||||
| for the reason that | because |
|
||||
| forthwith | now, at once |
|
||||
| forward | send |
|
||||
| frequently | often |
|
||||
| furnish | give, provide |
|
||||
| furthermore | also, and |
|
||||
|
||||
---
|
||||
|
||||
## G-H
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| generate | produce, create |
|
||||
| henceforth | from now on |
|
||||
| hitherto | until now |
|
||||
|
||||
---
|
||||
|
||||
## I
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| if and when | if, when |
|
||||
| illustrate | show |
|
||||
| immediately | at once, now |
|
||||
| implement | carry out, do |
|
||||
| imply | suggest |
|
||||
| in accordance with | under, following |
|
||||
| in addition to | and, also |
|
||||
| in conjunction with | with |
|
||||
| in excess of | more than |
|
||||
| in lieu of | instead of |
|
||||
| in order to | to |
|
||||
| in receipt of | receive |
|
||||
| in relation to | about |
|
||||
| in respect of | about, for |
|
||||
| in the event of | if |
|
||||
| in the majority of instances | most, usually |
|
||||
| in the near future | soon |
|
||||
| in view of the fact that | because |
|
||||
| inception | start |
|
||||
| indicate | show, suggest |
|
||||
| inform | tell |
|
||||
| initiate | start, begin |
|
||||
| insert | put in |
|
||||
| instances | cases |
|
||||
| irrespective of | despite |
|
||||
| issue | give, send |
|
||||
|
||||
---
|
||||
|
||||
## L-M
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| (a) large number of | many |
|
||||
| liaise with | work with, talk to |
|
||||
| locality | place, area |
|
||||
| locate | find |
|
||||
| magnitude | size |
|
||||
| (it is) mandatory | (you) must |
|
||||
| manner | way |
|
||||
| modification | change |
|
||||
| moreover | also, and |
|
||||
|
||||
---
|
||||
|
||||
## N-O
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| negligible | small |
|
||||
| nevertheless | but, however |
|
||||
| notify | tell |
|
||||
| notwithstanding | despite, even if |
|
||||
| numerous | many |
|
||||
| objective | aim, goal |
|
||||
| (it is) obligatory | (you) must |
|
||||
| obtain | get |
|
||||
| occasioned by | caused by |
|
||||
| on behalf of | for |
|
||||
| on numerous occasions | often |
|
||||
| on receipt of | when you get |
|
||||
| on the grounds that | because |
|
||||
| operate | work, run |
|
||||
| optimum | best |
|
||||
| option | choice |
|
||||
| otherwise | or |
|
||||
| outstanding | unpaid |
|
||||
| owing to | because |
|
||||
|
||||
---
|
||||
|
||||
## P
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| partially | partly |
|
||||
| participate | take part |
|
||||
| particulars | details |
|
||||
| per annum | a year |
|
||||
| perform | do |
|
||||
| permit | let, allow |
|
||||
| personnel | staff, people |
|
||||
| peruse | read |
|
||||
| possess | have, own |
|
||||
| practically | almost |
|
||||
| predominant | main |
|
||||
| prescribe | set |
|
||||
| preserve | keep |
|
||||
| previous | earlier, before |
|
||||
| principal | main |
|
||||
| prior to | before |
|
||||
| proceed | go ahead |
|
||||
| procure | get |
|
||||
| prohibit | ban, stop |
|
||||
| promptly | quickly |
|
||||
| provide | give |
|
||||
| provided that | if |
|
||||
| provisions | rules, terms |
|
||||
| proximity | nearness |
|
||||
| purchase | buy |
|
||||
| pursuant to | under |
|
||||
|
||||
---
|
||||
|
||||
## R
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| reconsider | think again |
|
||||
| reduction | cut |
|
||||
| referred to as | called |
|
||||
| regarding | about |
|
||||
| reimburse | repay |
|
||||
| reiterate | repeat |
|
||||
| relating to | about |
|
||||
| remain | stay |
|
||||
| remainder | rest |
|
||||
| remuneration | pay |
|
||||
| render | make, give |
|
||||
| represent | stand for |
|
||||
| request | ask |
|
||||
| require | need |
|
||||
| residence | home |
|
||||
| retain | keep |
|
||||
| revised | changed, new |
|
||||
|
||||
---
|
||||
|
||||
## S
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| scrutinise | examine, check |
|
||||
| select | choose |
|
||||
| solely | only |
|
||||
| specified | given, stated |
|
||||
| state | say |
|
||||
| statutory | legal, by law |
|
||||
| subject to | depending on |
|
||||
| submit | send, give |
|
||||
| subsequent to | after |
|
||||
| subsequently | later |
|
||||
| substantial | large, much |
|
||||
| sufficient | enough |
|
||||
| supplement | add to |
|
||||
| supplementary | extra |
|
||||
|
||||
---
|
||||
|
||||
## T-U
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| terminate | end, stop |
|
||||
| thereafter | then |
|
||||
| thereby | by this |
|
||||
| thus | so |
|
||||
| to date | so far |
|
||||
| transfer | move |
|
||||
| transmit | send |
|
||||
| ultimately | in the end |
|
||||
| undertake | agree, do |
|
||||
| uniform | same |
|
||||
| utilise | use |
|
||||
|
||||
---
|
||||
|
||||
## V-Z
|
||||
|
||||
| Complex | Plain Alternative |
|
||||
|---------|-------------------|
|
||||
| variation | change |
|
||||
| virtually | almost |
|
||||
| visualise | imagine, see |
|
||||
| ways and means | ways |
|
||||
| whatsoever | any |
|
||||
| with a view to | to |
|
||||
| with effect from | from |
|
||||
| with reference to | about |
|
||||
| with regard to | about |
|
||||
| with respect to | about |
|
||||
| zone | area |
|
||||
|
||||
---
|
||||
|
||||
## Phrases to Remove Entirely
|
||||
|
||||
These phrases often add nothing. Delete them:
|
||||
|
||||
- a total of
|
||||
- absolutely
|
||||
- actually
|
||||
- all things being equal
|
||||
- as a matter of fact
|
||||
- at the end of the day
|
||||
- at this moment in time
|
||||
- basically
|
||||
- currently (when "now" or nothing works)
|
||||
- I am of the opinion that (use: I think)
|
||||
- in due course (use: soon, or say when)
|
||||
- in the final analysis
|
||||
- it should be understood
|
||||
- last but not least
|
||||
- obviously
|
||||
- of course
|
||||
- quite
|
||||
- really
|
||||
- the fact of the matter is
|
||||
- to all intents and purposes
|
||||
- very
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Corey Haines
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,286 @@
|
||||
---
|
||||
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," "CTA copy," "value proposition," "tagline," "subheadline," "hero section copy," "above the fold," "this copy is weak," "make this more compelling," "this sounds like AI," "AI slop," "make it sound human," or "help me describe my product." Use this whenever someone is working on website text that needs to persuade or convert. Drafts never use AI tells like "it's not X, it's Y" reveals, "no X, no Y, no Z" lists, or sentences that trail into extra comma clauses. For email copy, see emails. For popup copy, see popups. For editing existing copy, see copy-editing. For the offer underneath the copy (bonuses, guarantees, value framing), see offers.
|
||||
metadata:
|
||||
version: 2.1.0
|
||||
---
|
||||
|
||||
# Copywriting
|
||||
|
||||
You are an expert conversion copywriter. Your goal is to write marketing copy that is clear, compelling, and drives action.
|
||||
|
||||
## Before Writing
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, 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. Page Purpose
|
||||
- What type of page? (homepage, landing page, pricing, feature, about)
|
||||
- What is the ONE primary action you want visitors to take?
|
||||
|
||||
### 2. Audience
|
||||
- Who is the ideal customer?
|
||||
- What problem are they trying to solve?
|
||||
- What objections or hesitations do they have?
|
||||
- What language do they use to describe their problem?
|
||||
|
||||
### 3. Product/Offer
|
||||
- What are you selling or offering?
|
||||
- What makes it different from alternatives?
|
||||
- What's the key transformation or outcome?
|
||||
- Any proof points (numbers, testimonials, case studies)?
|
||||
|
||||
### 4. Context
|
||||
- Where is traffic coming from? (ads, organic, email)
|
||||
- What do visitors already know before arriving?
|
||||
|
||||
---
|
||||
|
||||
## Copywriting Principles
|
||||
|
||||
### Clarity Over Cleverness
|
||||
If you have to choose between clear and creative, choose clear. Clarity also converts. Clearer positioning and copy is associated with +81% conversions, a 38% shorter sales cycle, 28% lower CAC, and 175% more referrals. When a reader has to decode your line, you've lost them.
|
||||
|
||||
**For message-market fit tools** (the "Now you can" test, the Human Action Model (discomfort → vision → path), the Perception Gap, and the clarity metrics): See [references/copy-frameworks.md](references/copy-frameworks.md#clarity--message-market-fit)
|
||||
|
||||
### Benefits Over Features
|
||||
Features: What it does. Benefits: What that means for the customer.
|
||||
|
||||
### Specificity Over Vagueness
|
||||
- Vague: "Save time on your workflow"
|
||||
- Specific: "Cut your weekly reporting from 4 hours to 15 minutes"
|
||||
|
||||
### Customer Language Over Company Language
|
||||
Use words your customers use. Mirror voice-of-customer from reviews, interviews, support tickets.
|
||||
|
||||
### One Idea Per Section
|
||||
Each section should advance one argument. Build a logical flow down the page.
|
||||
|
||||
---
|
||||
|
||||
## Writing Style Rules
|
||||
|
||||
### Core Principles
|
||||
|
||||
1. **Simple over complex**: "Use" not "utilize," "help" not "facilitate"
|
||||
2. **Specific over vague**: Avoid "streamline," "optimize," "innovative"
|
||||
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**: Fabricated statistics or testimonials erode trust and create legal liability
|
||||
|
||||
### Quick Quality Check
|
||||
|
||||
- Any AI tells? (see No AI Tells below)
|
||||
- Jargon that could confuse outsiders?
|
||||
- Sentences trying to do too much?
|
||||
- Passive voice constructions?
|
||||
- Exclamation points? (remove them)
|
||||
- Marketing buzzwords without substance?
|
||||
|
||||
For thorough line-by-line review, use the **copy-editing** skill after your draft.
|
||||
|
||||
---
|
||||
|
||||
## No AI Tells
|
||||
|
||||
Clients and buyers reject copy that reads as AI-written, and a reader who spots a tell tends to doubt the claims around it. Write like a senior copywriter: specific, uneven in rhythm, and built from facts rather than formulas.
|
||||
|
||||
### Never write these
|
||||
|
||||
1. **Contrast reveals.** "It's not X, it's Y." "Not because X. Because Y." "Not just X, but Y." State Y directly, with the reason.
|
||||
2. **Negation lists.** "No setup call, no templates, no waiting on IT. No contract." Say what does happen. State a real absence once, near the CTA ("No card required"), and turn the others into what happens.
|
||||
3. **Trailing pile-ons.** A full claim followed by a comma and more clauses: "...the data you already have, no exports, no spreadsheets, no second copy." End the sentence at the claim.
|
||||
4. **Self-answered questions and colon reveals.** "The result? 3x faster." "The best part: it learns." Just say it. FAQ questions and a reader's own question ("Need to share a screenshot?") are fine.
|
||||
5. **Stock openers and phrases.** "In today's fast-paced world," "Whether you're X or Y," "Here's the thing," "Say goodbye to," "X, reimagined," "Unlock the power of," "Take it to the next level."
|
||||
6. **Em dashes in short copy.** Headlines, subheads, ads, social posts, and subject lines use none.
|
||||
|
||||
### Keep these rare
|
||||
|
||||
- At most one fragment and one list of three per section (a hero, a page section, or one short post). CTA microcopy and a real three-feature list are fine.
|
||||
- Words like seamless, robust, powerful, unlock, and streamline: replace them with the fact they stand in for.
|
||||
- Swap test: if a line would work unchanged on a competitor's site, rewrite it. If you lack the differentiator to fix it, flag `[NEED: differentiator]`.
|
||||
|
||||
### Check before delivering
|
||||
|
||||
Before handing over any draft, run the self-check in [references/ai-tells.md](references/ai-tells.md#the-self-check): search for the banned patterns, read every sentence over 20 words, and read it aloud. Fix from the facts, since swapping synonyms creates new tells, and flag missing proof as `[NEED: ...]` rather than inventing it.
|
||||
|
||||
**For the full blacklist with examples and rewrites**: See [references/ai-tells.md](references/ai-tells.md)
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Be Direct
|
||||
Get to the point. Don't bury the value in qualifications.
|
||||
|
||||
❌ Slack lets you share files instantly, from documents to images, directly in your conversations
|
||||
|
||||
✅ Need to share a screenshot? Send as many documents, images, and audio files as your heart desires.
|
||||
|
||||
### Use Rhetorical Questions
|
||||
A question that names the reader's pain can open a section well.
|
||||
- "Hate returning stuff to Amazon?"
|
||||
- "Tired of chasing approvals?"
|
||||
|
||||
A question in the reader's voice followed by what to do is fine (see Be Direct). A question that labels your own claim ("The result? 3x faster.") is an AI tell.
|
||||
|
||||
### Use Analogies When Helpful
|
||||
Analogies make abstract concepts concrete and memorable.
|
||||
|
||||
### Pepper in Humor (When Appropriate)
|
||||
Puns and wit make copy memorable when they fit the brand and don't cost clarity.
|
||||
|
||||
---
|
||||
|
||||
## Page Structure Framework
|
||||
|
||||
### Above the Fold
|
||||
|
||||
**Headline**
|
||||
- Your single most important message
|
||||
- Communicate core value proposition
|
||||
- Specific > generic
|
||||
|
||||
**Example formulas:**
|
||||
- "{Achieve outcome} without {pain point}"
|
||||
- "The {category} for {audience}"
|
||||
- "Never {unpleasant event} again"
|
||||
- "{Question highlighting main pain point}"
|
||||
|
||||
**For comprehensive headline formulas**: See [references/copy-frameworks.md](references/copy-frameworks.md)
|
||||
|
||||
**Structure the hero as a transformation**: current discomfort → better vision → path to action (the Human Action Model), then run every headline through the "Now you can" test. See [references/copy-frameworks.md](references/copy-frameworks.md#clarity--message-market-fit)
|
||||
|
||||
**For natural transition phrases**: See [references/natural-transitions.md](references/natural-transitions.md)
|
||||
|
||||
**Subheadline**
|
||||
- Expands on headline
|
||||
- Adds specificity
|
||||
- 1-2 sentences max
|
||||
|
||||
**Primary CTA**
|
||||
- Action-oriented button text
|
||||
- Communicate what they get: "Start Free Trial" > "Sign Up"
|
||||
|
||||
### Core Sections
|
||||
|
||||
| Section | Purpose |
|
||||
|---------|---------|
|
||||
| Social Proof | Build credibility (logos, stats, testimonials) |
|
||||
| Problem/Pain | Show you understand their situation |
|
||||
| Solution/Benefits | Connect to outcomes (3-5 key benefits) |
|
||||
| How It Works | Reduce perceived complexity (3-4 steps) |
|
||||
| Objection Handling | FAQ, comparisons, guarantees |
|
||||
| Final CTA | Recap value, repeat CTA, risk reversal |
|
||||
|
||||
**For detailed section types and page templates**: See [references/copy-frameworks.md](references/copy-frameworks.md)
|
||||
|
||||
---
|
||||
|
||||
## CTA Copy Guidelines
|
||||
|
||||
**Weak CTAs (avoid):**
|
||||
- Submit, Sign Up, Learn More, Click Here, Get Started
|
||||
|
||||
**Strong CTAs (use):**
|
||||
- Start Free Trial
|
||||
- Get [Specific Thing]
|
||||
- See [Product] in Action
|
||||
- Create Your First [Thing]
|
||||
- Download the Guide
|
||||
|
||||
**Formula:** [Action Verb] + [What They Get] + [Qualifier if needed]
|
||||
|
||||
Examples:
|
||||
- "Start My Free Trial"
|
||||
- "Get the Complete Checklist"
|
||||
- "See Pricing for My Team"
|
||||
|
||||
---
|
||||
|
||||
## Page-Specific Guidance
|
||||
|
||||
### Homepage
|
||||
- Serve multiple audiences without being generic
|
||||
- Lead with broadest value proposition
|
||||
- Provide clear paths for different visitor intents
|
||||
|
||||
### Landing Page
|
||||
- Single message, single CTA
|
||||
- Match headline to ad/traffic source
|
||||
- Complete argument on one page
|
||||
|
||||
### Pricing Page
|
||||
- Help visitors choose the right plan
|
||||
- Address "which is right for me?" anxiety
|
||||
- Make recommended plan obvious
|
||||
|
||||
### Feature Page
|
||||
- Connect feature → benefit → outcome
|
||||
- Show use cases and examples
|
||||
- Clear path to try or buy
|
||||
|
||||
### About Page
|
||||
- Tell the story of why you exist
|
||||
- Connect mission to customer benefit
|
||||
- Still include a CTA
|
||||
|
||||
---
|
||||
|
||||
## Voice and Tone
|
||||
|
||||
Before writing, establish:
|
||||
|
||||
**Formality level:**
|
||||
- Casual/conversational
|
||||
- Professional but friendly
|
||||
- Formal/enterprise
|
||||
|
||||
**Brand personality:**
|
||||
- Playful or serious?
|
||||
- Bold or understated?
|
||||
- Technical or accessible?
|
||||
|
||||
Maintain consistency, but adjust intensity:
|
||||
- Headlines can be bolder
|
||||
- Body copy should be clearer
|
||||
- CTAs should be action-oriented
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
When writing copy, provide:
|
||||
|
||||
### Page Copy
|
||||
Organized by section:
|
||||
- Headline, Subheadline, CTA
|
||||
- Section headers and body copy
|
||||
- Secondary CTAs
|
||||
|
||||
### Annotations
|
||||
For key elements, explain:
|
||||
- Why you made this choice
|
||||
- What principle it applies
|
||||
|
||||
### Alternatives
|
||||
For headlines and CTAs, provide 2-3 options:
|
||||
- Option A: [copy]. Rationale: [why]
|
||||
- Option B: [copy]. Rationale: [why]
|
||||
|
||||
### Meta Content (if relevant)
|
||||
- Page title (for SEO)
|
||||
- Meta description
|
||||
|
||||
---
|
||||
|
||||
## Related Skills
|
||||
|
||||
- **copy-editing**: For polishing existing copy (use after your draft)
|
||||
- **cro**: If page structure/strategy needs work, not just copy
|
||||
- **emails**: For email copywriting
|
||||
- **popups**: For popup and modal copy
|
||||
- **ab-testing**: To test copy variations
|
||||
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"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.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.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 emails skill, which specifically handles email sequences, drip campaigns, and lifecycle emails. May provide brief general guidance but should make clear that emails is the right skill for this task.",
|
||||
"assertions": [
|
||||
"Recognizes this as email sequence work",
|
||||
"References or defers to emails 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": []
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"prompt": "Write above-the-fold copy for a calendar scheduling tool. Our differentiator is that the recipient gets to overlay their own calendar on the invite, so picking a time feels fair to both people instead of one-sided. Same product needs to work for indie founders AND for enterprise ops teams.",
|
||||
"expected_output": "Should structure the hero using the Human Action Model transformation spine: current discomfort (the awkwardness of sending a one-sided scheduling link), better vision (scheduling that feels considerate to both people), and path to action (the overlay mechanic + a specific CTA). Should run headline candidates through the 'Now you can' test and prefer lines that are compelling and true. Should reference or echo the SavvyCal awkward-link insight ('You shouldn't have to feel awkward sending out your scheduling link') as the message-market-fit model. Should surface the Perception Gap: the same benefit reads differently by risk tolerance, so it should provide a value-prop swap — a founder-facing framing (speed, no sales calls) and an enterprise-facing framing (security, SLAs, reliability) rather than one averaged, mushy message. Should favor clarity over cleverness and provide 2-3 headline alternatives with rationale.",
|
||||
"assertions": [
|
||||
"Structures the hero as discomfort -> vision -> path (Human Action Model)",
|
||||
"Applies the 'Now you can' test to headline candidates",
|
||||
"References the SavvyCal awkward-link message-market-fit insight",
|
||||
"Surfaces the Perception Gap between segments",
|
||||
"Provides a value-prop swap: founder framing vs enterprise framing",
|
||||
"Favors clarity over cleverness",
|
||||
"Provides 2-3 headline alternatives with rationale"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"prompt": "Write a homepage hero (headline, subhead, CTA) and a short launch post for X for our Shopify inventory app. It installs from the Shopify App Store in one click, needs no signup form or credit card, and runs low-stock alerts, reorder emails, and supplier purchase orders off the product and sales data the store already has, so there's nothing to import.",
|
||||
"expected_output": "Should write the hero and post without AI tells despite a brief that invites them. Should not use 'it's not X, it's Y' or 'not because X, because Y' reveals, 'no X, no Y, no Z' negation lists, or sentences that state the claim and then trail extra comma clauses ('..., no imports, no spreadsheets'). Should describe what happens (one-click install; alerts, reorder emails, and purchase orders run off existing Shopify data) and state a key absence at most once, plainly, near the CTA ('No card required'). Should use no em dashes in the hero or the post, no self-answered questions or colon reveals, and no stock phrases ('Say goodbye to', 'X, reimagined', 'seamless'). Should run the self-check before delivering.",
|
||||
"assertions": [
|
||||
"No contrast reveal ('not X, Y' / 'not because X, because Y')",
|
||||
"No 'no X, no Y, no Z' negation list; any absence stated once",
|
||||
"No sentence that trails extra comma clauses after the main claim",
|
||||
"No em dashes in the hero or the post",
|
||||
"No self-answered questions, colon reveals, or stock phrases",
|
||||
"Describes the mechanism concretely (one-click install, runs off existing Shopify data)"
|
||||
],
|
||||
"files": [],
|
||||
"id": 9
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
# AI Tells: The Copy Blacklist
|
||||
|
||||
Patterns that make marketing copy read as machine-written. Clients and buyers spot these fast, and a reader who decides a page was generated starts doubting its claims too.
|
||||
|
||||
Most of these are old human rhetoric. AI copy gives itself away by using them **by default**, **stacked**, and **with nothing specific behind them**. So the rules below are a mix of hard bans (for patterns that are tells even once) and frequency caps (for devices that are fine when chosen on purpose).
|
||||
|
||||
**Confidence key**
|
||||
- **Ban**: a tell even once. Don't write it.
|
||||
- **Cap**: fine once, a tell when repeated or stacked. Stay under the cap.
|
||||
|
||||
**What the scopes mean**
|
||||
- **Short copy**: headlines, subheads, the hero, CTAs, ads, social posts, email subject lines.
|
||||
- **Long copy**: body sections of a page, articles, long emails.
|
||||
- **Section**: one hero, one page section, or one whole short post.
|
||||
- CTA microcopy ("No card required") doesn't count toward the fragment cap.
|
||||
|
||||
**Still fine:** FAQ questions, a single "No card required," a list of three when there really are three features, a single "without" headline, and a formal brand voice that makes specific claims.
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- Structural Patterns (the worst offenders)
|
||||
- Openers, Closers, and Setups
|
||||
- Marketing Phrases
|
||||
- Vocabulary
|
||||
- Hedges, Puffery, and Weasels
|
||||
- Tone
|
||||
- Formatting
|
||||
- Rewrite Rules
|
||||
- The Self-Check
|
||||
- Sources
|
||||
|
||||
---
|
||||
|
||||
## Structural Patterns
|
||||
|
||||
These matter more than any word list. A draft can avoid every banned word and still read as AI because of its shape.
|
||||
|
||||
### 1. The contrast reveal: "Not X. Y." (Ban)
|
||||
|
||||
Sets up an assumption nobody stated, denies it, then gives the "real" answer.
|
||||
|
||||
Variants: "It's not X, it's Y." "Not because X. Because Y." "This isn't X. This is Y." "Not just X, but Y." "Less X, more Y." "The question isn't X, it's Y." "X? Think again."
|
||||
|
||||
- ✗ Most marketing teams have a list of campaign ideas that never launch. Not because they're bad. Because each one needs a developer.
|
||||
- ✓ Most marketing teams have a list of campaign ideas that never launch, because each one needs a developer they can't get.
|
||||
|
||||
**Why it's a tell:** It's one of the most frequently cited AI patterns. Wikipedia's AI-cleanup guide calls it "negative parallelism," and EQ-Bench's Slop Score gives "not X, but Y" patterns their own weighted category.
|
||||
|
||||
**Rewrite:** State Y directly and attach the concrete reason or cost. If the reader holds a wrong belief you need to correct, state the correct fact and the evidence; don't stage the denial.
|
||||
|
||||
### 2. The negation list: "No X, no Y, no Z." (Ban)
|
||||
|
||||
Defines the product by what's absent, usually in threes, often with a fragment tacked on.
|
||||
|
||||
Variants: "No X. No Y. Just Z." "Without X, without Y." "Zero X, zero Y."
|
||||
|
||||
- ✗ No setup call, no templates to fill in, no waiting on IT. No contract.
|
||||
- ✓ Install it from the app store and it's running on your data in five minutes.
|
||||
|
||||
**Rewrite:** Say what does happen, in the order it happens. If an absence really is a selling point (no card required, no install), state it once, plainly, next to the CTA: "Free to start. No card required." A brief with several absences doesn't need a list: turn the rest into what happens ("no signup form" becomes "Log in with your Shopify account").
|
||||
|
||||
A single "without" or "Never X again" headline is fine. Don't follow it with a negation list in the subhead.
|
||||
|
||||
### 3. The trailing pile-on (Ban)
|
||||
|
||||
A complete claim, then a comma, then a run of add-ons: a negation list, an "-ing" clause, or a string of extra benefits.
|
||||
|
||||
- ✗ Reports pull directly from the data you already have, no exports, no spreadsheets, no second copy to keep updated.
|
||||
- ✗ It syncs your calendar automatically, ensuring nothing slips through the cracks.
|
||||
- ✓ Reports pull from the data you already have. There's nothing to export.
|
||||
|
||||
**Rewrite:** End the sentence when the main claim ends. If the benefit matters, give it its own short sentence with one concrete detail. Test: after the main clause is complete, cut anything past the next comma that doesn't add a new fact. A clause that adds one ("Imports run nightly, keeping your existing IDs") can stay; a string of restatements can't.
|
||||
|
||||
### 4. Rhetorical question, then answer (Ban)
|
||||
|
||||
"The result? 3x faster onboarding." "The catch? There isn't one." "Why does this matter? Because..."
|
||||
|
||||
- ✗ The result? Onboarding that takes minutes, not weeks.
|
||||
- ✓ New hires finish onboarding on day one.
|
||||
|
||||
**Rewrite:** Delete the question and keep the answer.
|
||||
|
||||
Still fine: FAQ questions ("Does it work with Shopify?"), and a question in the reader's voice about their own need, followed by what to do ("Need to share a screenshot? Drop it in the thread."). The tell is a question that labels your own claim ("The result?" "The catch?" "Why does this matter?").
|
||||
|
||||
### 5. The colon reveal (Ban)
|
||||
|
||||
"The best part: it learns." "Here's the secret: consistency." "One word: speed."
|
||||
|
||||
**Rewrite:** Write it as a normal sentence ("It learns from every correction"). Save colons for lists, labels, and quotes.
|
||||
|
||||
### 6. Fragment drumbeat (Cap: one per section)
|
||||
|
||||
Stacked fragments or one-line paragraphs for manufactured punch. "Simple. Fast. Done." "That's it. That's the whole thing."
|
||||
|
||||
**Rewrite:** Merge them into one full sentence that carries a fact. One fragment that lands a real payoff is a copywriting device. A paragraph of them is a tic.
|
||||
|
||||
### 7. Reflexive threes (Cap: one per section)
|
||||
|
||||
Everything comes in threes: adjectives, benefits, clauses, bullets. "Fast, secure, and scalable." "Save time, cut costs, and grow revenue."
|
||||
|
||||
**Rewrite:** Use as many items as the facts support: one, two, or four. Usually the fix is the single strongest concrete claim: "Fast, secure, and scalable" → "Handles 40,000 webhooks a second on the free plan."
|
||||
|
||||
### 8. Em dashes (Ban in short copy; cap at 1–2 per page in long copy)
|
||||
|
||||
The dash as the default pause, several per paragraph, often carrying a contrast reveal ("It's not a tool — it's a teammate").
|
||||
|
||||
**Rewrite:** Use a period, a comma, a colon, or parentheses. In heroes, ads, subject lines, and social posts, use none.
|
||||
|
||||
### 9. Uniform rhythm (Cap)
|
||||
|
||||
Every sentence 12–18 words. Every paragraph is topic sentence → elaboration → wrap-up. Every section the same length. Three pros, three cons, every time.
|
||||
|
||||
**Rewrite:** Vary on purpose. A long sentence, then a short one. Let a section be two lines if that's all it needs. Put the payoff first sometimes.
|
||||
|
||||
### 10. Dodging "is" and "has" (Cap)
|
||||
|
||||
"Serves as a central hub." "Stands as a testament." "Boasts a library of 200 templates." "Represents a new approach."
|
||||
|
||||
**Rewrite:** Use "is" and "has", or better, the actual verb: "Tracks every contract, renewal date, and owner in one place."
|
||||
|
||||
### 11. Abstract subjects (Cap)
|
||||
|
||||
"The platform empowers teams to..." "Our solution enables..." Nobody does anything.
|
||||
|
||||
**Rewrite:** Make the customer the subject. "Your team ships experiments without filing a ticket."
|
||||
|
||||
### 12. False ranges (Cap)
|
||||
|
||||
"From startups to enterprises." "From onboarding to renewal." The two ends don't describe a real span.
|
||||
|
||||
**Rewrite:** Name the segment you actually serve, or the steps you actually cover.
|
||||
|
||||
### 13. Synonym cycling (Cap)
|
||||
|
||||
Calling the same thing a dashboard, an interface, a portal, and a hub in one page to avoid repeating a word.
|
||||
|
||||
**Rewrite:** Pick the word your customer uses and repeat it.
|
||||
|
||||
---
|
||||
|
||||
## Openers, Closers, and Setups (Ban)
|
||||
|
||||
| Pattern | Example | Instead |
|
||||
|---------|---------|---------|
|
||||
| Era opener | "In today's fast-paced world..." | Open with the customer's problem |
|
||||
| False-choice opener | "Whether you're a solo founder or a Fortune 500..." | Name who the page is for |
|
||||
| "Imagine..." | "Imagine never chasing an invoice again." | Show the actual before and after |
|
||||
| "When it comes to..." | "When it comes to billing, ..." | Start with the subject |
|
||||
| Throat-clearing | "Here's the thing:" "The truth is" "Let me be clear" "Here's what nobody tells you" | Cut it. If the claim can't stand alone, it needs evidence, not a drumroll |
|
||||
| Announcing | "In this guide, we'll explore..." "Let's dive in" | Start with the content |
|
||||
| Recap ending | "In conclusion" "Ultimately" "At the end of the day" | End on the last concrete point or the CTA |
|
||||
| Fake-profound kicker | "Because growth shouldn't wait." "And that changes everything." | Cut it. End on a concrete sentence |
|
||||
| Filler transitions | "It's worth noting" "Moreover" "Additionally" "Importantly" | Delete. The sentence usually works without it |
|
||||
|
||||
---
|
||||
|
||||
## Marketing Phrases (Ban)
|
||||
|
||||
| Phrase | Instead |
|
||||
|--------|---------|
|
||||
| "Say goodbye to X" / "Say hello to Y" | Show the new workflow: "Reconciliation runs nightly. You review the exceptions." |
|
||||
| "Unlock / unleash the power of X" | Name the outcome and the number |
|
||||
| "X, reimagined" / "X, redefined" | Say what's actually different: "Billing that retries on payday" |
|
||||
| "Take X to the next level" | Name the level: the metric and the target |
|
||||
| "Transform the way you work" | A before and after with numbers |
|
||||
| "The X you deserve" | The specific gap you close |
|
||||
| "The future of X is here" | What ships today |
|
||||
| "Built for teams who move fast" | The real customer and trigger: "For subscription teams past $1M ARR fighting failed payments" |
|
||||
| "Everything you need to X" / "all-in-one" | The 2–3 things buyers actually check for |
|
||||
| "Effortless" / "in just a few clicks" | The real step count or time: "3 steps, about 4 minutes" |
|
||||
| "Join thousands of happy customers" | The real count, logos, or a named quote |
|
||||
| "Game-changer" / "this changes everything" | What changes, for whom, by how much |
|
||||
|
||||
---
|
||||
|
||||
## Vocabulary
|
||||
|
||||
Swapping a banned word for a synonym just creates a new tell. Replace the word with the fact it was standing in for: "robust" → "99.99% uptime over two years"; "seamless" → "imports your Stripe data in about 90 seconds."
|
||||
|
||||
**Ban:** delve, tapestry, testament to, realm, embark, beacon, multifaceted, paradigm, synergy, myriad, plethora, meticulous, intricate, utilize, leverage (as a verb), supercharge, turbocharge, game-changer, "ever-evolving landscape," "plays a crucial role"
|
||||
|
||||
**Cap (two in a paragraph means rewrite it):** seamless, robust, streamline, empower, elevate, unlock, unleash, harness, foster, enhance, optimize, cutting-edge, innovative, revolutionary, transformative, holistic, comprehensive, pivotal, crucial, vital, powerful, next-level, world-class, best-in-class, landscape, navigate, ecosystem, journey (unless literal)
|
||||
|
||||
**Cap (empty intensifiers):** truly, genuinely, incredibly, deeply, fundamentally, significantly, simply, actually, literally, quietly
|
||||
|
||||
Favored words drift as models change ("delve" peaked in 2024; "enhance," "showcase," "foster," and "align with" rose after). Treat the lists as current examples, and lean on the structural patterns and the tests below, which don't go stale.
|
||||
|
||||
---
|
||||
|
||||
## Hedges, Puffery, and Weasels
|
||||
|
||||
- **Hedge stacks** (Cap): "can help you potentially reduce..." State what you know, or scope the claim honestly.
|
||||
- **Importance puffery** (Ban): "marks a pivotal moment," "redefines the category." State the fact; let the reader judge.
|
||||
- **Weasel sources** (Ban): "experts agree," "studies show," "trusted by industry leaders." Name the source or the customer, or cut it.
|
||||
- **Invented labels** (Cap): "the integration tax," "the growth trap." Only coin a term you'll define and use across the site.
|
||||
|
||||
---
|
||||
|
||||
## Tone
|
||||
|
||||
- **Chummy openers** (Ban in email and social): "Great question!" "Let's be honest..." "We get it."
|
||||
- **Fake vulnerability** (Ban): "I'll be honest, I was skeptical too..." with no real story behind it.
|
||||
- **Over-explaining** (Cap): "Let's break this down," "Think of it as..." Give the explanation directly.
|
||||
- **Hype punctuation** (Ban): "Ready to level up?!" Exclamation points and interrobangs in body copy.
|
||||
|
||||
---
|
||||
|
||||
## Formatting
|
||||
|
||||
- **Emoji as structure** (Ban in B2B): 🚀 ✨ ✅ leading bullets or headings.
|
||||
- **Bold label on every bullet** (Cap): "**Seamless integration:** ..." Keep it for reference tables, not every list.
|
||||
- **Parallel bullet openers** (Cap): every bullet starting "Ensures... / Provides... / Enables..." Start bullets with the customer outcome and vary the grammar.
|
||||
- **Title Case Everywhere** (Cap): use sentence case unless the brand style guide says otherwise.
|
||||
- **Unicode decoration** (Ban): arrows, ×, 𝗯𝗼𝗹𝗱 letters in body copy.
|
||||
- **Label headings** (Cap): "What / Why / How" sections. Write headings that make a claim.
|
||||
|
||||
---
|
||||
|
||||
## Rewrite Rules
|
||||
|
||||
1. **Rewrite from the facts.** Go back to what's true (the mechanism, the number, the customer, the step) and write that. Synonym swaps and "humanizer" substitutions produce new tells.
|
||||
2. **Specificity test.** Every claim sentence needs a number, a name, a mechanism, or a concrete action.
|
||||
3. **Swap test.** If the line would work unchanged on a competitor's site, rewrite it.
|
||||
4. **Stacking test.** Two or more Cap patterns in one paragraph means rewrite the whole paragraph.
|
||||
5. **Don't invent to de-slop.** Replacing "industry-leading" with a made-up stat is worse. Mark it `[NEED: proof]` and ask.
|
||||
6. **Choose devices on purpose.** A fragment you picked once, for a reason, is copywriting. The same device on every line is slop.
|
||||
7. **Keep the brand's register.** A formal sentence that makes a specific claim is fine. Don't flatten an enterprise voice into clipped startup copy, which is its own tell.
|
||||
8. **Vary the fixes.** The ✓ examples show one way out. Don't reuse them as templates. If every reveal becomes ", because..." and every negation list becomes "There's nothing to X," those are the new tics.
|
||||
9. **Flag a missing differentiator.** If no headline can pass the swap test with what you have, write the best one and mark `[NEED: differentiator vs. named competitors]`.
|
||||
|
||||
---
|
||||
|
||||
## The Self-Check
|
||||
|
||||
Run this on every draft before delivering it:
|
||||
|
||||
1. **Search for the bans.** Look for "not ", "isn't", "no ", "without", "?", ":" and "—" in headlines, subheads, and short copy, and check each hit against patterns 1–5 and 8.
|
||||
2. **Read every sentence over 20 words.** If it has more than two commas, check for a trailing pile-on (pattern 3).
|
||||
3. **Count the caps.** Fragments, threes, and Cap vocabulary per section.
|
||||
4. **Read it aloud.** Mark anywhere you'd sound like a press release or a LinkedIn post.
|
||||
5. **Apply the swap test** to the headline, subhead, and every section heading.
|
||||
|
||||
If a fix needs information you don't have (a number, a customer, a mechanism), flag it rather than writing around it.
|
||||
|
||||
---
|
||||
|
||||
## Sources
|
||||
|
||||
Patterns and evidence drawn from, and rewritten in our own words:
|
||||
|
||||
- Wikipedia, [Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) (WikiProject AI Cleanup)
|
||||
- Kobak et al., excess vocabulary in 15M+ PubMed abstracts ([arXiv 2406.07016](https://arxiv.org/abs/2406.07016))
|
||||
- Juzek & Ward, [Why Does ChatGPT "Delve" So Much?](https://aclanthology.org/2025.coling-main.426/) (COLING 2025)
|
||||
- Paech et al., Antislop ([arXiv 2510.15061](https://arxiv.org/abs/2510.15061)) and [EQ-Bench Slop Score](https://eqbench.com/slop-score.html)
|
||||
- [tropes.fyi](https://tropes.fyi/tropes-md) catalog of AI writing tropes
|
||||
- Charlie Guo, [The Field Guide to AI Slop](https://www.ignorance.ai/p/the-field-guide-to-ai-slop)
|
||||
- Blake Stockton, [Don't write like AI: negation](https://www.blakestockton.com/p/dont-write-like-ai-1-101-negation)
|
||||
- Counter-view: [A case for the defense](https://robotsatemyhomework.substack.com/p/ai-writing-patterns) (devices are fine when chosen, not defaulted)
|
||||
|
||||
For a broader word-level list used in content audits, see the seo-audit skill's `references/ai-writing-detection.md`.
|
||||
@@ -0,0 +1,432 @@
|
||||
# Copy Frameworks Reference
|
||||
|
||||
Headline formulas, page section types, and structural templates.
|
||||
|
||||
## Contents
|
||||
- Headline Formulas (outcome-focused, problem-focused, audience-focused, differentiation-focused, proof-focused, additional formulas)
|
||||
- Landing Page Section Types (core sections, supporting sections)
|
||||
- Page Structure Templates (feature-heavy page, varied engaging page, compact landing page, enterprise/B2B landing page, product launch page)
|
||||
- Section Writing Tips (problem section, benefits section, how it works section, testimonial selection)
|
||||
- Clarity & Message-Market Fit (the "Now you can" test, Human Action Model, the Perception Gap, the SavvyCal case, clarity metrics)
|
||||
|
||||
## Headline Formulas
|
||||
|
||||
These are starting points. Fill every slot with specifics, and check the result against [ai-tells.md](ai-tells.md): a "without" or "Never X again" headline is fine once, but don't follow it with a negation list.
|
||||
|
||||
### Outcome-Focused
|
||||
|
||||
**{Achieve desirable outcome} without {pain point}**
|
||||
> Understand how users are really experiencing your site without drowning in numbers
|
||||
|
||||
**{Achieve desirable outcome} by {how product makes it possible}**
|
||||
> Generate more leads by seeing which companies visit your site
|
||||
|
||||
**Turn {input} into {outcome}**
|
||||
> Turn your hard-earned sales into repeat customers
|
||||
|
||||
**[Achieve outcome] in [timeframe]**
|
||||
> Get your tax refund in 10 days
|
||||
|
||||
---
|
||||
|
||||
### Problem-Focused
|
||||
|
||||
**Never {unpleasant event} again**
|
||||
> Never miss a sales opportunity again
|
||||
|
||||
**{Question highlighting the main pain point}**
|
||||
> Hate returning stuff to Amazon?
|
||||
|
||||
**Stop [pain]. Start [pleasure].**
|
||||
> Stop chasing invoices. Start getting paid on time.
|
||||
|
||||
---
|
||||
|
||||
### Audience-Focused
|
||||
|
||||
**{Key feature/product type} for {target audience}**
|
||||
> Advanced analytics for Shopify e-commerce
|
||||
|
||||
**{Key feature/product type} for {target audience} to {what it's used for}**
|
||||
> An online whiteboard for teams to ideate and brainstorm together
|
||||
|
||||
**You don't have to {skills or resources} to {achieve desirable outcome}**
|
||||
> With Ahrefs, you don't have to be an SEO pro to rank higher and get more traffic
|
||||
|
||||
---
|
||||
|
||||
### Differentiation-Focused
|
||||
|
||||
**The {opposite of usual process} way to {achieve desirable outcome}**
|
||||
> The easiest way to turn your passion into income
|
||||
|
||||
**The [category] that [key differentiator]**
|
||||
> The CRM that updates itself
|
||||
|
||||
---
|
||||
|
||||
### Proof-Focused
|
||||
|
||||
**[Number] [people] use [product] to [outcome]**
|
||||
> 50,000 marketers use Drip to send better emails
|
||||
|
||||
**{Key benefit of your product}**
|
||||
> Sound clear in online meetings
|
||||
|
||||
---
|
||||
|
||||
### Additional Formulas
|
||||
|
||||
**The simple way to {outcome}**
|
||||
> The simple way to track your time
|
||||
|
||||
**Finally, {category} that {benefit}**
|
||||
> Finally, accounting software that doesn't suck
|
||||
|
||||
**{Outcome} without {common pain}**
|
||||
> Build your website without writing code
|
||||
|
||||
**Get {benefit} from your {thing}**
|
||||
> Get more revenue from your existing traffic
|
||||
|
||||
**{Action verb} your {thing} like {admirable example}**
|
||||
> Market your SaaS like a Fortune 500
|
||||
|
||||
**What if you could {desirable outcome}?**
|
||||
> What if you could close deals 30% faster?
|
||||
|
||||
**The {adjective} {category} built for {audience}**
|
||||
> The lightweight CRM built for startups
|
||||
|
||||
---
|
||||
|
||||
## Landing Page Section Types
|
||||
|
||||
### Core Sections
|
||||
|
||||
**Hero (Above the Fold)**
|
||||
- Headline + subheadline
|
||||
- Primary CTA
|
||||
- Supporting visual (product screenshot, hero image)
|
||||
- Optional: Social proof bar
|
||||
|
||||
**Social Proof Bar**
|
||||
- Customer logos (recognizable > many)
|
||||
- Key metric ("10,000+ teams")
|
||||
- Star rating with review count
|
||||
- Short testimonial snippet
|
||||
|
||||
**Problem/Pain Section**
|
||||
- Articulate their problem better than they can
|
||||
- Create recognition ("that's exactly my situation")
|
||||
- Hint at cost of not solving it
|
||||
|
||||
**Solution/Benefits Section**
|
||||
- Bridge from problem to your solution
|
||||
- 3-5 key benefits (not 10)
|
||||
- Each: headline + explanation + proof if available
|
||||
|
||||
**How It Works**
|
||||
- 3-4 numbered steps
|
||||
- Reduces perceived complexity
|
||||
- Each step: action + outcome
|
||||
|
||||
**Final CTA Section**
|
||||
- Recap value proposition
|
||||
- Repeat primary CTA
|
||||
- Risk reversal (guarantee, free trial)
|
||||
|
||||
---
|
||||
|
||||
### Supporting Sections
|
||||
|
||||
**Testimonials**
|
||||
- Full quotes with names, roles, companies
|
||||
- Photos when possible
|
||||
- Specific results over vague praise
|
||||
- Formats: quote cards, video, tweet embeds
|
||||
|
||||
**Case Studies**
|
||||
- Problem → Solution → Results
|
||||
- Specific metrics and outcomes
|
||||
- Customer name and context
|
||||
- Can be snippets with "Read more" links
|
||||
|
||||
**Use Cases**
|
||||
- Different ways product is used
|
||||
- Helps visitors self-identify
|
||||
- "For marketers who need X" format
|
||||
|
||||
**Personas / "Built For" Sections**
|
||||
- Explicitly call out target audience
|
||||
- "Perfect for [role]" blocks
|
||||
- Addresses "Is this for me?" question
|
||||
|
||||
**FAQ Section**
|
||||
- Address common objections
|
||||
- Good for SEO
|
||||
- Reduces support burden
|
||||
- 5-10 most common questions
|
||||
|
||||
**Comparison Section**
|
||||
- vs. competitors (name them or don't)
|
||||
- vs. status quo (spreadsheets, manual processes)
|
||||
- Tables or side-by-side format
|
||||
|
||||
**Integrations / Partners**
|
||||
- Logos of tools you connect with
|
||||
- "Works with your stack" messaging
|
||||
- Builds credibility
|
||||
|
||||
**Founder Story / Manifesto**
|
||||
- Why you built this
|
||||
- What you believe
|
||||
- Emotional connection
|
||||
- Differentiates from faceless competitors
|
||||
|
||||
**Demo / Product Tour**
|
||||
- Interactive demos
|
||||
- Video walkthroughs
|
||||
- GIF previews
|
||||
- Shows product in action
|
||||
|
||||
**Pricing Preview**
|
||||
- Teaser even on non-pricing pages
|
||||
- Starting price or "from $X/mo"
|
||||
- Moves decision-makers forward
|
||||
|
||||
**Guarantee / Risk Reversal**
|
||||
- Money-back guarantee
|
||||
- Free trial terms
|
||||
- "Cancel anytime"
|
||||
- Reduces friction
|
||||
|
||||
**Stats Section**
|
||||
- Key metrics that build credibility
|
||||
- "10,000+ customers"
|
||||
- "4.9/5 rating"
|
||||
- "$2M saved for customers"
|
||||
|
||||
---
|
||||
|
||||
## Page Structure Templates
|
||||
|
||||
### Feature-Heavy Page (Weak)
|
||||
|
||||
```
|
||||
1. Hero
|
||||
2. Feature 1
|
||||
3. Feature 2
|
||||
4. Feature 3
|
||||
5. Feature 4
|
||||
6. CTA
|
||||
```
|
||||
|
||||
This is a list, not a persuasive narrative.
|
||||
|
||||
---
|
||||
|
||||
### Varied, Engaging Page (Strong)
|
||||
|
||||
```
|
||||
1. Hero with clear value prop
|
||||
2. Social proof bar (logos or stats)
|
||||
3. Problem/pain section
|
||||
4. How it works (3 steps)
|
||||
5. Key benefits (2-3, not 10)
|
||||
6. Testimonial
|
||||
7. Use cases or personas
|
||||
8. Comparison to alternatives
|
||||
9. Case study snippet
|
||||
10. FAQ
|
||||
11. Final CTA with guarantee
|
||||
```
|
||||
|
||||
This tells a story and addresses objections.
|
||||
|
||||
---
|
||||
|
||||
### Compact Landing Page
|
||||
|
||||
```
|
||||
1. Hero (headline, subhead, CTA, image)
|
||||
2. Social proof bar
|
||||
3. 3 key benefits with icons
|
||||
4. Testimonial
|
||||
5. How it works (3 steps)
|
||||
6. Final CTA with guarantee
|
||||
```
|
||||
|
||||
Good for ad landing pages where brevity matters.
|
||||
|
||||
---
|
||||
|
||||
### Enterprise/B2B Landing Page
|
||||
|
||||
```
|
||||
1. Hero (outcome-focused headline)
|
||||
2. Logo bar (recognizable companies)
|
||||
3. Problem section (business pain)
|
||||
4. Solution overview
|
||||
5. Use cases by role/department
|
||||
6. Security/compliance section
|
||||
7. Integration logos
|
||||
8. Case study with metrics
|
||||
9. ROI/value section
|
||||
10. Contact/demo CTA
|
||||
```
|
||||
|
||||
Addresses enterprise buyer concerns.
|
||||
|
||||
---
|
||||
|
||||
### Product Launch Page
|
||||
|
||||
```
|
||||
1. Hero with launch announcement
|
||||
2. Video demo or walkthrough
|
||||
3. Feature highlights (3-5)
|
||||
4. Before/after comparison
|
||||
5. Early testimonials
|
||||
6. Launch pricing or early access offer
|
||||
7. CTA with urgency
|
||||
```
|
||||
|
||||
Good for ProductHunt, launches, or announcements.
|
||||
|
||||
---
|
||||
|
||||
## Section Writing Tips
|
||||
|
||||
### Problem Section
|
||||
|
||||
Start with phrases like:
|
||||
- "You know the feeling..."
|
||||
- "If you're like most [role]..."
|
||||
- "Every day, [audience] struggles with..."
|
||||
- "We've all been there..."
|
||||
|
||||
Then describe:
|
||||
- The specific frustration
|
||||
- The time/money wasted
|
||||
- The impact on their work/life
|
||||
|
||||
### Benefits Section
|
||||
|
||||
For each benefit, include:
|
||||
- **Headline**: The outcome they get
|
||||
- **Body**: How it works (1-2 sentences)
|
||||
- **Proof**: Number, testimonial, or example (optional)
|
||||
|
||||
### How It Works Section
|
||||
|
||||
Each step should be:
|
||||
- **Numbered**: Creates sense of progress
|
||||
- **Simple verb**: "Connect," "Set up," "Get"
|
||||
- **Outcome-oriented**: What they get from this step
|
||||
|
||||
Example:
|
||||
1. Connect your tools (takes 2 minutes)
|
||||
2. Set your preferences
|
||||
3. Get automated reports every Monday
|
||||
|
||||
### Testimonial Selection
|
||||
|
||||
Best testimonials include:
|
||||
- Specific results ("increased conversions by 32%")
|
||||
- Before/after context ("We used to spend hours...")
|
||||
- Role + company for credibility
|
||||
- Something quotable and specific
|
||||
|
||||
Avoid testimonials that just say:
|
||||
- "Great product!"
|
||||
- "Love it!"
|
||||
- "Easy to use!"
|
||||
|
||||
---
|
||||
|
||||
## Clarity & Message-Market Fit
|
||||
|
||||
Headline formulas give you the shape of a line. These tools tell you whether the line is actually *working*: whether it's clear, whether it maps to how the reader already thinks, and whether it lands with the right person. Positioning is the prologue to your novel: it sets up everything that follows. Get it clear and the rest of the page writes itself.
|
||||
|
||||
### The "Now you can" Test
|
||||
|
||||
A fast gut-check for any headline or benefit line. Mentally prefix it with **"Now you can…"**. If the result is both **compelling** and **true**, the line is doing its job. If it reads as vague, obvious, or a stretch, rewrite it.
|
||||
|
||||
The test works because "Now you can…" forces the copy into the reader's world. It has to name a concrete new ability they didn't have before. Feature-speak and buzzwords collapse under it.
|
||||
|
||||
| Original line | "Now you can…" version | Verdict |
|
||||
|---------------|------------------------|---------|
|
||||
| "Powerful analytics platform" | Now you can… have a powerful analytics platform | Fails. not a new ability, just a description |
|
||||
| "See which companies visit your site" | Now you can… see which companies visit your site | Works. compelling + true |
|
||||
| "Streamline your workflow" | Now you can… streamline your workflow | Fails. vague, unfalsifiable |
|
||||
| "Send unlimited docs, images, and audio in one place" | Now you can… send unlimited docs, images, and audio in one place | Works. concrete + true |
|
||||
|
||||
Use it as a filter, not a formula: draft with the headline formulas above, then run each candidate through "Now you can…" and keep the survivors.
|
||||
|
||||
### The Human Action Model (landing-page narrative spine)
|
||||
|
||||
Ludwig von Mises' Human Action Model explains *why* anyone acts: a person acts only when three things line up. Every above-the-fold that converts follows the same three-beat spine:
|
||||
|
||||
1. **Current discomfort**: the felt problem, named in the reader's own words. They have to recognize their situation ("that's exactly me").
|
||||
2. **Better vision**: a clearly imagined, more satisfying state. What life looks like once the discomfort is gone.
|
||||
3. **Path to action**: the belief that *this specific step* closes the gap between the two. The product is the bridge, and the CTA is how they cross it.
|
||||
|
||||
Miss any beat and the reader stalls. No discomfort = no reason to move. No vision = no destination. No path = no reason to believe *you're* the way there.
|
||||
|
||||
**Mapping it onto the hero:**
|
||||
|
||||
| Beat | Where it usually lives | Example |
|
||||
|------|------------------------|---------|
|
||||
| Current discomfort | Eyebrow, subhead, or problem-framed headline | "You shouldn't have to feel awkward sending out your scheduling link" |
|
||||
| Better vision | Headline or subhead | "Scheduling that feels considerate, not one-sided" |
|
||||
| Path to action | CTA + supporting proof | "Start scheduling free" |
|
||||
|
||||
This is the transformation spine underneath the "6 essential sections" of a landing page (hero, social proof, problem, solution, how-it-works, and final CTA). The hero states the transformation; the rest of the page substantiates each beat.
|
||||
|
||||
### The Perception Gap
|
||||
|
||||
The same benefit can read as a **selling point to one segment and a red flag to another**. The gap is between what *you* think you're saying and what a given reader hears through their own risk tolerance.
|
||||
|
||||
The fix is **matching the value prop to the reader's risk tolerance**. Segment first, then swap the framing.
|
||||
|
||||
| Benefit as written | Startup / early-adopter hears | Enterprise / risk-averse hears |
|
||||
|--------------------|-------------------------------|--------------------------------|
|
||||
| "Move fast. Ship in a weekend." | Speed, momentum (✅) | Immature, unstable (🚩) |
|
||||
| "Brand-new approach" | Innovative edge (✅) | Unproven, risky (🚩) |
|
||||
| "Enterprise-grade security & SLAs" | Bloated, slow, expensive (🚩) | Safe, trustworthy (✅) |
|
||||
| "Trusted by the Fortune 500" | Not built for me (🚩) | Proven, de-risked (✅) |
|
||||
|
||||
**Value-prop swap in practice** (same product, two audiences):
|
||||
|
||||
- *Startup landing page:* "Ship your first integration this afternoon. Pay by card and skip the sales call."
|
||||
- *Enterprise landing page:* "SOC 2 Type II, 99.99% uptime SLA, and a named implementation lead. Roll out with confidence."
|
||||
|
||||
When a page has to serve both, don't average them into mush. Segment the traffic (separate pages, or a persona split) and let each read its own version of the truth.
|
||||
|
||||
### Worked Example: SavvyCal (message-market fit)
|
||||
|
||||
SavvyCal (a scheduling tool) originally led with feature-forward copy. They rewrote the hero around a single felt discomfort:
|
||||
|
||||
> **"You shouldn't have to feel awkward sending out your scheduling link."**
|
||||
|
||||
That one line **roughly tripled (3×) conversions**. It works because it hits all three beats of the Human Action Model at once:
|
||||
|
||||
- **Discomfort:** the small social awkwardness of "here's my link, pick a time," named exactly as users feel it.
|
||||
- **Vision:** scheduling that feels considerate to *both* people.
|
||||
- **Path:** SavvyCal's overlay-your-calendar mechanic is the bridge, so the CTA feels like the obvious next step.
|
||||
|
||||
The lesson: message-market fit beats feature lists. The winning line named a real feeling the reader hadn't heard a scheduling tool acknowledge before. Run your own hero through "Now you can…" and the Human Action Model to find that line.
|
||||
|
||||
### Clarity Beats Cleverness (the metrics)
|
||||
|
||||
When teams measure it, clarity is what moves the numbers. Clearer positioning and copy is associated with:
|
||||
|
||||
- **+81% conversions**
|
||||
- **−38% sales cycle** (shorter time to close)
|
||||
- **−28% CAC** (lower customer acquisition cost)
|
||||
- **+175% referrals**
|
||||
|
||||
The mechanism: clear copy lets the *right* buyer self-qualify fast and the wrong one bounce early, so every downstream metric improves. Clever copy that requires decoding does the opposite. It adds a comprehension tax at the exact moment attention is scarcest.
|
||||
|
||||
**Practical rule:** if a reader has to pause to figure out what you mean, you've already lost. When forced to choose between a clever line and a clear one, ship the clear one, then use the tests above ("Now you can…", the Human Action Model, the Perception Gap) to make the clear line compelling too.
|
||||
@@ -0,0 +1,256 @@
|
||||
# Natural Transitions
|
||||
|
||||
Transitional phrases to guide readers through your content. Good signposting improves readability, user engagement, and helps search engines understand content structure.
|
||||
|
||||
Adapted from: University of Manchester Academic Phrasebank (2023), Plain English Campaign, web content best practices
|
||||
|
||||
---
|
||||
|
||||
## Contents
|
||||
- Previewing Content Structure
|
||||
- Introducing a New Topic
|
||||
- Referring Back
|
||||
- Moving Between Sections
|
||||
- Indicating Addition
|
||||
- Indicating Contrast
|
||||
- Indicating Similarity
|
||||
- Indicating Cause and Effect
|
||||
- Giving Examples
|
||||
- Emphasising Key Points
|
||||
- Providing Evidence (neutral attribution, expert quotes, supporting claims)
|
||||
- Summarising Sections
|
||||
- Concluding Content
|
||||
- Question-Based Transitions
|
||||
- List Introductions
|
||||
- Hedging Language
|
||||
- Best Practice Guidelines
|
||||
- Transitions to Avoid (AI Tells)
|
||||
|
||||
## Previewing Content Structure
|
||||
|
||||
Use in long guides to orient readers. On marketing pages, start with the content instead.
|
||||
|
||||
- Here's what we'll cover...
|
||||
- This guide walks you through...
|
||||
- Below, you'll find...
|
||||
- We'll start with X, then move to Y...
|
||||
- First, let's look at...
|
||||
- The sections below explain...
|
||||
|
||||
---
|
||||
|
||||
## Introducing a New Topic
|
||||
|
||||
- Regarding X,...
|
||||
- Speaking of X,...
|
||||
- Now let's talk about X.
|
||||
- Another key factor is...
|
||||
- X is worth exploring because...
|
||||
|
||||
---
|
||||
|
||||
## Referring Back
|
||||
|
||||
Use to connect ideas and reinforce key points:
|
||||
|
||||
- As mentioned earlier,...
|
||||
- As we covered above,...
|
||||
- Remember when we discussed X?
|
||||
- Building on that point,...
|
||||
- Going back to X,...
|
||||
- Earlier, we explained that...
|
||||
|
||||
---
|
||||
|
||||
## Moving Between Sections
|
||||
|
||||
- Now let's look at...
|
||||
- Next up:...
|
||||
- Moving on to...
|
||||
- With that covered, let's turn to...
|
||||
- Now that you understand X, here's Y.
|
||||
- That brings us to...
|
||||
|
||||
---
|
||||
|
||||
## Indicating Addition
|
||||
|
||||
- Also,...
|
||||
- Plus,...
|
||||
- On top of that,...
|
||||
- What's more,...
|
||||
- Another benefit is...
|
||||
- Beyond that,...
|
||||
- In addition,...
|
||||
- There's also...
|
||||
|
||||
**Note:** Avoid "moreover" and "furthermore" in marketing copy. They read as AI-generated.
|
||||
|
||||
---
|
||||
|
||||
## Indicating Contrast
|
||||
|
||||
- However,...
|
||||
- But,...
|
||||
- That said,...
|
||||
- On the flip side,...
|
||||
- In contrast,...
|
||||
- Unlike X, Y...
|
||||
- While X is true, Y...
|
||||
- Despite this,...
|
||||
|
||||
---
|
||||
|
||||
## Indicating Similarity
|
||||
|
||||
- Similarly,...
|
||||
- Likewise,...
|
||||
- In the same way,...
|
||||
- Just like X, Y also...
|
||||
- This mirrors...
|
||||
- The same applies to...
|
||||
|
||||
---
|
||||
|
||||
## Indicating Cause and Effect
|
||||
|
||||
- So,...
|
||||
- This means...
|
||||
- As a result,...
|
||||
- That's why...
|
||||
- Because of this,...
|
||||
- This leads to...
|
||||
|
||||
---
|
||||
|
||||
## Giving Examples
|
||||
|
||||
- For example,...
|
||||
- For instance,...
|
||||
- Here's an example:...
|
||||
- Take X, for instance.
|
||||
- Consider this:...
|
||||
- A good example is...
|
||||
- To illustrate,...
|
||||
- Like when...
|
||||
- Say you want to...
|
||||
|
||||
---
|
||||
|
||||
## Emphasising Key Points
|
||||
|
||||
- Here's the key takeaway:...
|
||||
- The important thing is...
|
||||
- What matters most is...
|
||||
- Pay attention to...
|
||||
|
||||
---
|
||||
|
||||
## Providing Evidence
|
||||
|
||||
Use when citing sources, data, or expert opinions:
|
||||
|
||||
### Neutral attribution
|
||||
- According to [Source],...
|
||||
- [Source] reports that...
|
||||
- Research shows that...
|
||||
- Data from [Source] indicates...
|
||||
- A study by [Source] found...
|
||||
|
||||
### Expert quotes
|
||||
- As [Expert] puts it,...
|
||||
- [Expert] explains,...
|
||||
- In the words of [Expert],...
|
||||
- [Expert] notes that...
|
||||
|
||||
### Supporting claims
|
||||
- This is backed by...
|
||||
- Evidence suggests...
|
||||
- The numbers confirm...
|
||||
- This aligns with findings from...
|
||||
|
||||
---
|
||||
|
||||
## Summarising Sections
|
||||
|
||||
- To recap,...
|
||||
- In short,...
|
||||
- Quick summary:...
|
||||
|
||||
---
|
||||
|
||||
## Concluding Content
|
||||
|
||||
- Wrapping up,...
|
||||
- The bottom line is...
|
||||
- Here's what to do next:...
|
||||
- To sum up,...
|
||||
- Final thoughts:...
|
||||
- Ready to get started?...
|
||||
- Now it's your turn.
|
||||
|
||||
**Note:** Avoid "In conclusion" at the start of a paragraph. It's overused and signals AI writing.
|
||||
|
||||
---
|
||||
|
||||
## Question-Based Transitions
|
||||
|
||||
Useful in long-form content for conversational tone and featured snippet optimization. Use them as headings or questions the reader would really ask, then answer with substance. Don't use them as a setup for your own punchline, and keep them out of landing-page copy (see [ai-tells.md](ai-tells.md)).
|
||||
|
||||
- So what does this mean for you?
|
||||
- How do you actually do this?
|
||||
- Wondering where to start?
|
||||
|
||||
---
|
||||
|
||||
## List Introductions
|
||||
|
||||
For numbered lists and step-by-step content:
|
||||
|
||||
- Here's how to do it:
|
||||
- Follow these steps:
|
||||
- The process is straightforward:
|
||||
- Here's what you need to know:
|
||||
- Key things to consider:
|
||||
- The main factors are:
|
||||
|
||||
---
|
||||
|
||||
## Hedging Language
|
||||
|
||||
For claims that need qualification or aren't absolute:
|
||||
|
||||
- may, might, could
|
||||
- tends to, generally
|
||||
- often, usually, typically
|
||||
- in most cases
|
||||
- it appears that
|
||||
- evidence suggests
|
||||
- this can help
|
||||
|
||||
---
|
||||
|
||||
## Best Practice Guidelines
|
||||
|
||||
1. **Match tone to audience**: B2B content can be slightly more formal; B2C often benefits from conversational transitions
|
||||
2. **Vary your transitions**: Repeating the same phrase gets noticed (and not in a good way)
|
||||
3. **Don't over-signpost**: Trust your reader; every sentence doesn't need a transition
|
||||
4. **Use for scannability**: Transitions at paragraph starts help skimmers navigate
|
||||
5. **Keep it natural**: Read aloud; if it sounds forced, simplify
|
||||
6. **Front-load key info**: Put the important word or phrase early in the transition
|
||||
|
||||
---
|
||||
|
||||
## Transitions to Avoid (AI Tells)
|
||||
|
||||
These phrases are overused in AI-generated content:
|
||||
|
||||
- "That being said,..."
|
||||
- "It's worth noting that..."
|
||||
- "At its core,..."
|
||||
- "In today's digital landscape,..."
|
||||
- "When it comes to the realm of..."
|
||||
- "This begs the question..."
|
||||
- "Let's delve into..."
|
||||
|
||||
See [ai-tells.md](ai-tells.md) for the full copy blacklist, including structural patterns like contrast reveals and negation lists.
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Corey Haines
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,330 @@
|
||||
---
|
||||
name: emails
|
||||
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. Emails avoid AI tells like 'it's not X, it's Y' reveals, 'no X, no Y, no Z' lists, and fake 'Re:' subject lines. For cold outreach and outbound sequences, see cold-email. For in-app onboarding, see onboarding.
|
||||
metadata:
|
||||
version: 2.1.2
|
||||
---
|
||||
|
||||
# Email Sequence Design
|
||||
|
||||
You are an expert in email marketing and automation. Your goal is to create email sequences that nurture relationships, drive action, and move people toward conversion.
|
||||
|
||||
## Initial Assessment
|
||||
|
||||
**Check for product marketing context first:**
|
||||
If `.agents/product-marketing.md` exists (or `.claude/product-marketing.md`, or the legacy `product-marketing-context.md` filename, in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
|
||||
|
||||
Before creating a sequence, understand:
|
||||
|
||||
1. **Sequence Type**
|
||||
- Welcome/onboarding sequence
|
||||
- Lead nurture sequence
|
||||
- Re-engagement sequence
|
||||
- Post-purchase sequence
|
||||
- Event-based sequence
|
||||
- Educational sequence
|
||||
- Sales sequence
|
||||
|
||||
2. **Audience Context**
|
||||
- Who are they?
|
||||
- What triggered them into this sequence?
|
||||
- What do they already know/believe?
|
||||
- What's their current relationship with you?
|
||||
|
||||
3. **Goals**
|
||||
- Primary conversion goal
|
||||
- Relationship-building goals
|
||||
- Segmentation goals
|
||||
- What defines success?
|
||||
|
||||
---
|
||||
|
||||
## Core Principles
|
||||
|
||||
### 1. One Email, One Job
|
||||
- Each email has one primary purpose
|
||||
- One main CTA per email
|
||||
- Don't try to do everything
|
||||
|
||||
### 2. Value Before Ask
|
||||
- Lead with usefulness
|
||||
- Build trust through content
|
||||
- Earn the right to sell
|
||||
|
||||
### 3. Relevance Over Volume
|
||||
- Fewer, better emails win
|
||||
- Segment for relevance
|
||||
- Quality > frequency
|
||||
|
||||
### 4. Clear Path Forward
|
||||
- Every email moves them somewhere
|
||||
- Links should do something useful
|
||||
- Make next steps obvious
|
||||
|
||||
---
|
||||
|
||||
## Email Sequence Strategy
|
||||
|
||||
### Sequence Length
|
||||
- Welcome: 3-7 emails
|
||||
- Lead nurture: 5-10 emails
|
||||
- Onboarding: 5-10 emails
|
||||
- Re-engagement: 3-5 emails
|
||||
|
||||
Depends on:
|
||||
- Sales cycle length
|
||||
- Product complexity
|
||||
- Relationship stage
|
||||
|
||||
### Timing/Delays
|
||||
- Welcome email: Immediately
|
||||
- Early sequence: 1-2 days apart
|
||||
- Nurture: 2-4 days apart
|
||||
- Long-term: Weekly or bi-weekly
|
||||
|
||||
Consider:
|
||||
- B2B: Avoid weekends
|
||||
- B2C: Test weekends
|
||||
- Time zones: Send at local time
|
||||
|
||||
### Subject Line Strategy
|
||||
- Clear > Clever
|
||||
- Specific > Vague
|
||||
- Benefit or curiosity-driven
|
||||
- 40-60 characters ideal
|
||||
- Test emoji (they're polarizing)
|
||||
|
||||
**Patterns that work:**
|
||||
- Question: "Still struggling with X?"
|
||||
- How-to: "How to [achieve outcome] in [timeframe]"
|
||||
- Number: "3 ways to [benefit]"
|
||||
- Direct: "[First name], your [thing] is ready"
|
||||
- Story tease: "The mistake I made with [topic]"
|
||||
|
||||
### Preview Text
|
||||
- Extends the subject line
|
||||
- ~90-140 characters
|
||||
- Don't repeat subject line
|
||||
- Complete the thought or add intrigue
|
||||
|
||||
---
|
||||
|
||||
## Sequence Types Overview
|
||||
|
||||
### Welcome Sequence (Post-Signup)
|
||||
**Length**: 5-7 emails over 12-14 days
|
||||
**Goal**: Activate, build trust, convert
|
||||
|
||||
Key emails:
|
||||
1. Welcome + deliver promised value (immediate)
|
||||
2. Quick win (day 1-2)
|
||||
3. Story/Why (day 3-4)
|
||||
4. Social proof (day 5-6)
|
||||
5. Overcome objection (day 7-8)
|
||||
6. Core feature highlight (day 9-11)
|
||||
7. Conversion (day 12-14)
|
||||
|
||||
### Lead Nurture Sequence (Pre-Sale)
|
||||
**Length**: 6-8 emails over 2-3 weeks
|
||||
**Goal**: Build trust, demonstrate expertise, convert
|
||||
|
||||
Key emails:
|
||||
1. Deliver lead magnet + intro (immediate)
|
||||
2. Expand on topic (day 2-3)
|
||||
3. Problem deep-dive (day 4-5)
|
||||
4. Solution framework (day 6-8)
|
||||
5. Case study (day 9-11)
|
||||
6. Differentiation (day 12-14)
|
||||
7. Objection handler (day 15-18)
|
||||
8. Direct offer (day 19-21)
|
||||
|
||||
### Re-Engagement Sequence
|
||||
**Length**: 3-4 emails over 2 weeks
|
||||
**Trigger**: 30-60 days of inactivity
|
||||
**Goal**: Win back or clean list
|
||||
|
||||
Key emails:
|
||||
1. Check-in (genuine concern)
|
||||
2. Value reminder (what's new)
|
||||
3. Incentive (special offer)
|
||||
4. Last chance (stay or unsubscribe)
|
||||
|
||||
### Onboarding Sequence (Product Users)
|
||||
**Length**: 5-7 emails over 14 days
|
||||
**Goal**: Activate, drive to aha moment, upgrade
|
||||
**Note**: Coordinate with in-app onboarding—email supports, doesn't duplicate
|
||||
|
||||
Key emails:
|
||||
1. Welcome + first step (immediate)
|
||||
2. Getting started help (day 1)
|
||||
3. Feature highlight (day 2-3)
|
||||
4. Success story (day 4-5)
|
||||
5. Check-in (day 7)
|
||||
6. Advanced tip (day 10-12)
|
||||
7. Upgrade/expand (day 14+)
|
||||
|
||||
**For detailed templates**: See [references/sequence-templates.md](references/sequence-templates.md)
|
||||
|
||||
---
|
||||
|
||||
## Email Types by Category
|
||||
|
||||
### Onboarding Emails
|
||||
- New users series
|
||||
- New customers series
|
||||
- Key onboarding step reminders
|
||||
- New user invites
|
||||
|
||||
### Retention Emails
|
||||
- Upgrade to paid
|
||||
- Upgrade to higher plan
|
||||
- Ask for review
|
||||
- Proactive support offers
|
||||
- Product usage reports
|
||||
- NPS survey
|
||||
- Referral program
|
||||
|
||||
### Billing Emails
|
||||
- Switch to annual
|
||||
- Failed payment recovery
|
||||
- Cancellation survey
|
||||
- Upcoming renewal reminders
|
||||
|
||||
### Usage Emails
|
||||
- Daily/weekly/monthly summaries
|
||||
- Key event notifications
|
||||
- Milestone celebrations
|
||||
|
||||
### Win-Back Emails
|
||||
- Expired trials
|
||||
- Cancelled customers
|
||||
|
||||
### Campaign Emails
|
||||
- Monthly roundup / newsletter
|
||||
- Seasonal promotions
|
||||
- Product updates
|
||||
- Industry news roundup
|
||||
- Pricing updates
|
||||
|
||||
**For detailed email type reference**: See [references/email-types.md](references/email-types.md)
|
||||
|
||||
---
|
||||
|
||||
## Email Copy Guidelines
|
||||
|
||||
### Structure
|
||||
1. **Hook**: First line grabs attention
|
||||
2. **Context**: Why this matters to them
|
||||
3. **Value**: The useful content
|
||||
4. **CTA**: What to do next
|
||||
5. **Sign-off**: Human, warm close
|
||||
|
||||
### Formatting
|
||||
- Short paragraphs (1-3 sentences)
|
||||
- White space between sections
|
||||
- Bullet points for scanability
|
||||
- Bold for emphasis (sparingly)
|
||||
- Mobile-first (most read on phone)
|
||||
|
||||
### Tone
|
||||
- Conversational, not formal
|
||||
- First-person (I/we) and second-person (you)
|
||||
- Active voice
|
||||
- Read it out loud. Does it sound like a person?
|
||||
|
||||
### No AI Tells
|
||||
|
||||
Subscribers learn to recognize generated email fast, and they stop reading. Write from the specific thing you want them to know or do.
|
||||
|
||||
Never write these:
|
||||
- **Contrast reveals**: "It's not X, it's Y." "Not because X. Because Y." State Y directly, with the reason.
|
||||
- **Negation lists**: "No X, no Y, no Z." Say what does happen. One plain absence ("No card required") is fine.
|
||||
- **Trailing pile-ons**: a full claim, then a comma and more restating clauses. End the sentence at the claim.
|
||||
- **Self-answered questions and colon reveals**: "The result? 3x faster." "The best part: it learns." FAQ questions and a question in the reader's own voice are fine.
|
||||
- **Stock phrases**: "Say goodbye to," "X, reimagined," "Unlock the power of," "Take it to the next level," "Here's the thing."
|
||||
- **Em dashes** in subject lines and preview text, and at most one or two in a long email.
|
||||
|
||||
Email-specific tells:
|
||||
- **Subject-line bait**: fake "Re:" or "Fwd:", "You won't believe...", "🔥 Big news." The subject should hold up if it's the only line they read.
|
||||
- **Stock openers**: "I hope this email finds you well," "Just checking in," "Great news!" Open with the reason you're writing.
|
||||
- **Sign-off filler**: "Feel free to reach out if you have any questions." Ask for one specific action, or end.
|
||||
|
||||
For the full blacklist, use the **copywriting** skill's AI-tells reference.
|
||||
|
||||
### Length
|
||||
- 50-125 words for transactional
|
||||
- 150-300 words for educational
|
||||
- 300-500 words for story-driven
|
||||
|
||||
### CTA Guidelines
|
||||
- Buttons for primary actions
|
||||
- Links for secondary actions
|
||||
- One clear primary CTA per email
|
||||
- Button text: Action + outcome
|
||||
|
||||
**For detailed copy, personalization, and testing guidelines**: See [references/copy-guidelines.md](references/copy-guidelines.md)
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
### Sequence Overview
|
||||
```
|
||||
Sequence Name: [Name]
|
||||
Trigger: [What starts the sequence]
|
||||
Goal: [Primary conversion goal]
|
||||
Length: [Number of emails]
|
||||
Timing: [Delay between emails]
|
||||
Exit Conditions: [When they leave the sequence]
|
||||
```
|
||||
|
||||
### For Each Email
|
||||
```
|
||||
Email [#]: [Name/Purpose]
|
||||
Send: [Timing]
|
||||
Subject: [Subject line]
|
||||
Preview: [Preview text]
|
||||
Body: [Full copy]
|
||||
CTA: [Button text] → [Link destination]
|
||||
Segment/Conditions: [If applicable]
|
||||
```
|
||||
|
||||
### Metrics Plan
|
||||
What to measure and benchmarks
|
||||
|
||||
---
|
||||
|
||||
## Task-Specific Questions
|
||||
|
||||
1. What triggers entry to this sequence?
|
||||
2. What's the primary goal/conversion action?
|
||||
3. What do they already know about you?
|
||||
4. What other emails are they receiving?
|
||||
5. What's your current email performance?
|
||||
|
||||
---
|
||||
|
||||
## Tool Integrations
|
||||
|
||||
For implementation, see the [tools registry](https://github.com/coreyhaines31/marketingskills/blob/main/tools/REGISTRY.md). Key email tools:
|
||||
|
||||
| Tool | Best For | MCP | Guide |
|
||||
|------|----------|:---:|-------|
|
||||
| **Customer.io** | Behavior-based automation | - | [customer-io.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/customer-io.md) |
|
||||
| **Mailchimp** | SMB email marketing | ✓ | [mailchimp.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/mailchimp.md) |
|
||||
| **Nitrosend** | AI-native email (sequences via prompts) | ✓ | [nitrosend.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/nitrosend.md) |
|
||||
| **Resend** | Developer-friendly transactional | ✓ | [resend.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/resend.md) |
|
||||
| **SendGrid** | Transactional email at scale | - | [sendgrid.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/sendgrid.md) |
|
||||
| **Kit** | Creator/newsletter focused | - | [kit.md](https://github.com/coreyhaines31/marketingskills/blob/main/tools/integrations/kit.md) |
|
||||
|
||||
---
|
||||
|
||||
## 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**: For in-app onboarding (email supports this)
|
||||
- **copywriting**: For landing pages emails link to
|
||||
- **ab-testing**: For testing email elements
|
||||
- **popups**: For email capture popups
|
||||
- **revops**: For lifecycle stages that trigger email sequences
|
||||
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"skill_name": "emails",
|
||||
"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.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.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 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 is the primary skill for this task.",
|
||||
"assertions": [
|
||||
"Recognizes this as in-app onboarding optimization",
|
||||
"References or defers to onboarding skill",
|
||||
"Does not attempt full onboarding redesign using email patterns",
|
||||
"May offer email component support"
|
||||
],
|
||||
"files": []
|
||||
},
|
||||
{
|
||||
"prompt": "Write the first email of a welcome sequence for our meal-planning app, with a subject line and preview text.",
|
||||
"expected_output": "Should write a welcome email with a specific subject line and preview text that avoid AI tells: no fake 'Re:'/'Fwd:', no curiosity bait or hype emoji, no em dashes. The body should open with the reason for writing (no 'I hope this email finds you well'), avoid contrast reveals, negation lists, and self-answered questions, and end with one specific action rather than 'feel free to reach out'.",
|
||||
"assertions": [
|
||||
"Subject line has no fake Re:/Fwd:, bait, or em dash",
|
||||
"No stock opener",
|
||||
"No contrast reveal or negation list",
|
||||
"Ends with one specific action"
|
||||
],
|
||||
"files": [],
|
||||
"id": 7
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
# Email Copy Guidelines
|
||||
|
||||
## Contents
|
||||
- Structure
|
||||
- Formatting
|
||||
- Tone
|
||||
- Length
|
||||
- CTA Buttons vs. Links
|
||||
- Personalization (merge fields, dynamic content, triggered emails)
|
||||
- Segmentation Strategies (by behavior, by stage, by profile)
|
||||
- Testing and Optimization (what to test, how to test, metrics to track)
|
||||
|
||||
## Structure
|
||||
|
||||
1. **Hook**: First line grabs attention
|
||||
2. **Context**: Why this matters to them
|
||||
3. **Value**: The useful content
|
||||
4. **CTA**: What to do next
|
||||
5. **Sign-off**: Human, warm close
|
||||
|
||||
## Formatting
|
||||
|
||||
- Short paragraphs (1-3 sentences)
|
||||
- White space between sections
|
||||
- Bullet points for scanability
|
||||
- Bold for emphasis (sparingly)
|
||||
- Mobile-first (most read on phone)
|
||||
|
||||
## Tone
|
||||
|
||||
- Conversational, not formal
|
||||
- First-person (I/we) and second-person (you)
|
||||
- Active voice
|
||||
- Match your brand but lean friendly
|
||||
- Read it out loud—does it sound human?
|
||||
|
||||
## Length
|
||||
|
||||
- Shorter is usually better
|
||||
- 50-125 words for transactional
|
||||
- 150-300 words for educational
|
||||
- 300-500 words for story-driven
|
||||
- If it's long, it better be good
|
||||
|
||||
## CTA Buttons vs. Links
|
||||
|
||||
- Buttons: Primary actions, high-visibility
|
||||
- Links: Secondary actions, in-text
|
||||
- One clear primary CTA per email
|
||||
- Button text: Action + outcome
|
||||
|
||||
---
|
||||
|
||||
## Personalization
|
||||
|
||||
### Merge Fields
|
||||
- First name (fallback to "there" or "friend")
|
||||
- Company name (B2B)
|
||||
- Relevant data (usage, plan, etc.)
|
||||
|
||||
### Dynamic Content
|
||||
- Based on segment
|
||||
- Based on behavior
|
||||
- Based on stage
|
||||
|
||||
### Triggered Emails
|
||||
- Action-based sends
|
||||
- More relevant than time-based
|
||||
- Examples: Feature used, milestone hit, inactivity
|
||||
|
||||
---
|
||||
|
||||
## Segmentation Strategies
|
||||
|
||||
### By Behavior
|
||||
- Openers vs. non-openers
|
||||
- Clickers vs. non-clickers
|
||||
- Active vs. inactive
|
||||
|
||||
### By Stage
|
||||
- Trial vs. paid
|
||||
- New vs. long-term
|
||||
- Engaged vs. at-risk
|
||||
|
||||
### By Profile
|
||||
- Industry/role (B2B)
|
||||
- Use case / goal
|
||||
- Company size
|
||||
|
||||
---
|
||||
|
||||
## Testing and Optimization
|
||||
|
||||
### What to Test
|
||||
- Subject lines (highest impact)
|
||||
- Send times
|
||||
- Email length
|
||||
- CTA placement and copy
|
||||
- Personalization level
|
||||
- Sequence timing
|
||||
|
||||
### How to Test
|
||||
- A/B test one variable at a time
|
||||
- Sufficient sample size
|
||||
- Statistical significance
|
||||
- Document learnings
|
||||
|
||||
### Metrics to Track
|
||||
- Open rate (benchmark: 20-40%)
|
||||
- Click rate (benchmark: 2-5%)
|
||||
- Unsubscribe rate (keep under 0.5%)
|
||||
- Conversion rate (specific to sequence goal)
|
||||
- Revenue per email (if applicable)
|
||||
@@ -0,0 +1,515 @@
|
||||
# Email Types Reference
|
||||
|
||||
A comprehensive guide to lifecycle and campaign emails. Use this as an audit checklist and implementation reference.
|
||||
|
||||
## Contents
|
||||
- Onboarding Emails (new users series, new customers series, key onboarding step reminder, new user invite)
|
||||
- Retention Emails (upgrade to paid, upgrade to higher plan, ask for review, offer support proactively, product usage report, NPS survey, referral program)
|
||||
- Billing Emails (switch to annual, failed payment recovery, cancellation survey, upcoming renewal reminder)
|
||||
- Usage Emails (daily/weekly/monthly summary, key event or milestone notifications)
|
||||
- Win-Back Emails (expired trials, cancelled customers)
|
||||
- Campaign Emails (monthly roundup/newsletter, seasonal promotions, product updates, industry news roundup, pricing update)
|
||||
- Email Audit Checklist (onboarding, retention, billing, usage, win-back, campaigns)
|
||||
|
||||
## Onboarding Emails
|
||||
|
||||
### New Users Series
|
||||
**Trigger**: User signs up (free or trial)
|
||||
**Goal**: Activate user, drive to aha moment
|
||||
**Typical sequence**: 5-7 emails over 14 days
|
||||
|
||||
- Email 1: Welcome + single next step (immediate)
|
||||
- Email 2: Quick win / getting started (day 1)
|
||||
- Email 3: Key feature highlight (day 3)
|
||||
- Email 4: Success story / social proof (day 5)
|
||||
- Email 5: Check-in + offer help (day 7)
|
||||
- Email 6: Advanced tip (day 10)
|
||||
- Email 7: Upgrade prompt or next milestone (day 14)
|
||||
|
||||
**Key metrics**: Activation rate, feature adoption
|
||||
|
||||
---
|
||||
|
||||
### New Customers Series
|
||||
**Trigger**: User converts to paid
|
||||
**Goal**: Reinforce purchase decision, drive adoption, reduce early churn
|
||||
**Typical sequence**: 3-5 emails over 14 days
|
||||
|
||||
- Email 1: Thank you + what's next (immediate)
|
||||
- Email 2: Getting full value — setup checklist (day 2)
|
||||
- Email 3: Pro tips for paid features (day 5)
|
||||
- Email 4: Success story from similar customer (day 7)
|
||||
- Email 5: Check-in + introduce support resources (day 14)
|
||||
|
||||
**Key point**: Different from new user series—they've committed. Focus on reinforcement and expansion, not conversion.
|
||||
|
||||
---
|
||||
|
||||
### Key Onboarding Step Reminder
|
||||
**Trigger**: User hasn't completed critical setup step after X time
|
||||
**Goal**: Nudge completion of high-value action
|
||||
**Format**: Single email or 2-3 email mini-sequence
|
||||
|
||||
**Example triggers**:
|
||||
- Hasn't connected integration after 48 hours
|
||||
- Hasn't invited team member after 3 days
|
||||
- Hasn't completed profile after 24 hours
|
||||
|
||||
**Copy approach**:
|
||||
- Remind them what they started
|
||||
- Explain why this step matters
|
||||
- Make it easy (direct link to complete)
|
||||
- Offer help if stuck
|
||||
|
||||
---
|
||||
|
||||
### New User Invite
|
||||
**Trigger**: Existing user invites teammate
|
||||
**Goal**: Activate the invited user
|
||||
**Recipient**: The person being invited
|
||||
|
||||
- Email 1: You've been invited (immediate)
|
||||
- Email 2: Reminder if not accepted (day 2)
|
||||
- Email 3: Final reminder (day 5)
|
||||
|
||||
**Copy approach**:
|
||||
- Personalize with inviter's name
|
||||
- Explain what they're joining
|
||||
- Single CTA to accept invite
|
||||
- Social proof optional
|
||||
|
||||
---
|
||||
|
||||
## Retention Emails
|
||||
|
||||
### Upgrade to Paid
|
||||
**Trigger**: Free user shows engagement, or trial ending
|
||||
**Goal**: Convert free to paid
|
||||
**Typical sequence**: 3-5 emails
|
||||
|
||||
**Trigger options**:
|
||||
- Time-based (trial day 10, 12, 14)
|
||||
- Behavior-based (hit usage limit, used premium feature)
|
||||
- Engagement-based (highly active free user)
|
||||
|
||||
**Sequence structure**:
|
||||
- Value summary: What they've accomplished
|
||||
- Feature comparison: What they're missing
|
||||
- Social proof: Who else upgraded
|
||||
- Urgency: Trial ending, limited offer
|
||||
- Final: Last chance + easy path
|
||||
|
||||
---
|
||||
|
||||
### Upgrade to Higher Plan
|
||||
**Trigger**: User approaching plan limits or using features available on higher tier
|
||||
**Goal**: Upsell to next tier
|
||||
**Format**: Single email or 2-3 email sequence
|
||||
|
||||
**Trigger examples**:
|
||||
- 80% of seat limit reached
|
||||
- 90% of storage/usage limit
|
||||
- Tried to use higher-tier feature
|
||||
- Power user behavior patterns
|
||||
|
||||
**Copy approach**:
|
||||
- Acknowledge their growth (positive framing)
|
||||
- Show what next tier unlocks
|
||||
- Quantify value vs. cost
|
||||
- Easy upgrade path
|
||||
|
||||
---
|
||||
|
||||
### Ask for Review
|
||||
**Trigger**: Customer milestone (30/60/90 days, key achievement, support resolution)
|
||||
**Goal**: Generate social proof on G2, Capterra, app stores
|
||||
**Format**: Single email
|
||||
|
||||
**Best timing**:
|
||||
- After positive support interaction
|
||||
- After achieving measurable result
|
||||
- After renewal
|
||||
- NOT after billing issues or bugs
|
||||
|
||||
**Copy approach**:
|
||||
- Thank them for being a customer
|
||||
- Mention specific value/milestone if possible
|
||||
- Explain why reviews matter (help others decide)
|
||||
- Direct link to review platform
|
||||
- Keep it short—this is an ask
|
||||
|
||||
---
|
||||
|
||||
### Offer Support Proactively
|
||||
**Trigger**: Signs of struggle (drop in usage, failed actions, error encounters)
|
||||
**Goal**: Save at-risk user, improve experience
|
||||
**Format**: Single email
|
||||
|
||||
**Trigger examples**:
|
||||
- Usage dropped significantly week-over-week
|
||||
- Multiple failed attempts at action
|
||||
- Viewed help docs repeatedly
|
||||
- Stuck at same onboarding step
|
||||
|
||||
**Copy approach**:
|
||||
- Genuine concern tone
|
||||
- Specific: "I noticed you..." (if data allows)
|
||||
- Offer direct help (not just link to docs)
|
||||
- Personal from support or CSM
|
||||
- No sales pitch—pure help
|
||||
|
||||
---
|
||||
|
||||
### Product Usage Report
|
||||
**Trigger**: Time-based (weekly, monthly, quarterly)
|
||||
**Goal**: Demonstrate value, drive engagement, reduce churn
|
||||
**Format**: Single email, recurring
|
||||
|
||||
**What to include**:
|
||||
- Key metrics/activity summary
|
||||
- Comparison to previous period
|
||||
- Achievements/milestones
|
||||
- Suggestions for improvement
|
||||
- Light CTA to explore more
|
||||
|
||||
**Examples**:
|
||||
- "You saved X hours this month"
|
||||
- "Your team completed X projects"
|
||||
- "You're in the top X% of users"
|
||||
|
||||
**Key point**: Make them feel good and remind them of value delivered.
|
||||
|
||||
---
|
||||
|
||||
### NPS Survey
|
||||
**Trigger**: Time-based (quarterly) or event-based (post-milestone)
|
||||
**Goal**: Measure satisfaction, identify promoters and detractors
|
||||
**Format**: Single email
|
||||
|
||||
**Best practices**:
|
||||
- Keep it simple: Just the NPS question initially
|
||||
- Follow-up form for "why" based on score
|
||||
- Personal sender (CEO, founder, CSM)
|
||||
- Tell them how you'll use feedback
|
||||
|
||||
**Follow-up based on score**:
|
||||
- Promoters (9-10): Thank + ask for review/referral
|
||||
- Passives (7-8): Ask what would make it a 10
|
||||
- Detractors (0-6): Personal outreach to understand issues
|
||||
|
||||
---
|
||||
|
||||
### Referral Program
|
||||
**Trigger**: Customer milestone, promoter NPS score, or campaign
|
||||
**Goal**: Generate referrals
|
||||
**Format**: Single email or periodic reminders
|
||||
|
||||
**Good timing**:
|
||||
- After positive NPS response
|
||||
- After customer achieves result
|
||||
- After renewal
|
||||
- Seasonal campaigns
|
||||
|
||||
**Copy approach**:
|
||||
- Remind them of their success
|
||||
- Explain the referral offer clearly
|
||||
- Make sharing easy (unique link)
|
||||
- Show what's in it for them AND referee
|
||||
|
||||
---
|
||||
|
||||
## Billing Emails
|
||||
|
||||
### Switch to Annual
|
||||
**Trigger**: Monthly subscriber at renewal time or campaign
|
||||
**Goal**: Convert monthly to annual (improve LTV, reduce churn)
|
||||
**Format**: Single email or 2-email sequence
|
||||
|
||||
**Value proposition**:
|
||||
- Calculate exact savings
|
||||
- Additional benefits (if any)
|
||||
- Lock in current price messaging
|
||||
- Easy one-click switch
|
||||
|
||||
**Best timing**:
|
||||
- Around monthly renewal date
|
||||
- End of year / new year
|
||||
- After 3-6 months of loyalty
|
||||
- Price increase announcement (lock in old rate)
|
||||
|
||||
---
|
||||
|
||||
### Failed Payment Recovery
|
||||
**Trigger**: Payment fails
|
||||
**Goal**: Recover revenue, retain customer
|
||||
**Typical sequence**: 3-4 emails over 7-14 days
|
||||
|
||||
**Sequence structure**:
|
||||
- Email 1 (Day 0): Friendly notice, update payment link
|
||||
- Email 2 (Day 3): Reminder, service may be interrupted
|
||||
- Email 3 (Day 7): Urgent, account will be suspended
|
||||
- Email 4 (Day 10-14): Final notice, what they'll lose
|
||||
|
||||
**Copy approach**:
|
||||
- Assume it's an accident (card expired, etc.)
|
||||
- Clear, direct, no guilt
|
||||
- Single CTA to update payment
|
||||
- Explain what happens if not resolved
|
||||
|
||||
**Key metrics**: Recovery rate, time to recovery
|
||||
|
||||
---
|
||||
|
||||
### Cancellation Survey
|
||||
**Trigger**: User cancels subscription
|
||||
**Goal**: Learn why, opportunity to save
|
||||
**Format**: Single email (immediate)
|
||||
|
||||
**Options**:
|
||||
- In-app survey at cancellation (better completion)
|
||||
- Follow-up email if they skip in-app
|
||||
- Personal outreach for high-value accounts
|
||||
|
||||
**Questions to ask**:
|
||||
- Primary reason for cancelling
|
||||
- What could we have done better
|
||||
- Would anything change your mind
|
||||
- Can we help with transition
|
||||
|
||||
**Winback opportunity**: Based on reason, offer targeted save (discount, pause, downgrade, training).
|
||||
|
||||
---
|
||||
|
||||
### Upcoming Renewal Reminder
|
||||
**Trigger**: X days before renewal (14 or 30 days typical)
|
||||
**Goal**: No surprise charges, opportunity to expand
|
||||
**Format**: Single email
|
||||
|
||||
**What to include**:
|
||||
- Renewal date and amount
|
||||
- What's included in renewal
|
||||
- How to update payment/plan
|
||||
- Changes to pricing/features (if any)
|
||||
- Optional: Upsell opportunity
|
||||
|
||||
**Required for**: Annual subscriptions, high-value contracts
|
||||
|
||||
---
|
||||
|
||||
## Usage Emails
|
||||
|
||||
### Daily/Weekly/Monthly Summary
|
||||
**Trigger**: Time-based
|
||||
**Goal**: Drive engagement, demonstrate value
|
||||
**Format**: Single email, recurring
|
||||
|
||||
**Content by frequency**:
|
||||
- **Daily**: Notifications, quick stats (for high-engagement products)
|
||||
- **Weekly**: Activity summary, highlights, suggestions
|
||||
- **Monthly**: Comprehensive report, achievements, ROI if calculable
|
||||
|
||||
**Structure**:
|
||||
- Key metrics at a glance
|
||||
- Notable achievements
|
||||
- Activity breakdown
|
||||
- Suggestions / what to try next
|
||||
- CTA to dive deeper
|
||||
|
||||
**Personalization**: Must be relevant to their actual usage. Empty reports are worse than no report.
|
||||
|
||||
---
|
||||
|
||||
### Key Event or Milestone Notifications
|
||||
**Trigger**: Specific achievement or event
|
||||
**Goal**: Celebrate, drive continued engagement
|
||||
**Format**: Single email per event
|
||||
|
||||
**Milestone examples**:
|
||||
- First [action] completed
|
||||
- 10th/100th [thing] created
|
||||
- Goal achieved
|
||||
- Team collaboration milestone
|
||||
- Usage streak
|
||||
|
||||
**Copy approach**:
|
||||
- Celebration tone
|
||||
- Specific achievement
|
||||
- Context (compared to others, compared to before)
|
||||
- What's next / next milestone
|
||||
|
||||
---
|
||||
|
||||
## Win-Back Emails
|
||||
|
||||
### Expired Trials
|
||||
**Trigger**: Trial ended without conversion
|
||||
**Goal**: Convert or re-engage
|
||||
**Typical sequence**: 3-4 emails over 30 days
|
||||
|
||||
**Sequence structure**:
|
||||
- Email 1 (Day 1 post-expiry): Trial ended, here's what you're missing
|
||||
- Email 2 (Day 7): What held you back? (gather feedback)
|
||||
- Email 3 (Day 14): Incentive offer (discount, extended trial)
|
||||
- Email 4 (Day 30): Final reach-out, door is open
|
||||
|
||||
**Segmentation**: Different approach based on trial engagement level:
|
||||
- High engagement: Focus on removing friction to convert
|
||||
- Low engagement: Offer fresh start, more onboarding help
|
||||
- No engagement: Ask what happened, offer demo/call
|
||||
|
||||
---
|
||||
|
||||
### Cancelled Customers
|
||||
**Trigger**: Time after cancellation (30, 60, 90 days)
|
||||
**Goal**: Win back churned customers
|
||||
**Typical sequence**: 2-3 emails spread over 90 days
|
||||
|
||||
**Sequence structure**:
|
||||
- Email 1 (Day 30): What's new since you left
|
||||
- Email 2 (Day 60): We've addressed [common reason]
|
||||
- Email 3 (Day 90): Special offer to return
|
||||
|
||||
**Copy approach**:
|
||||
- No guilt, no desperation
|
||||
- Genuine updates and improvements
|
||||
- Personalize based on cancellation reason if known
|
||||
- Make return easy
|
||||
|
||||
**Key point**: They're more likely to return if their reason was addressed.
|
||||
|
||||
---
|
||||
|
||||
## Campaign Emails
|
||||
|
||||
### Monthly Roundup / Newsletter
|
||||
**Trigger**: Time-based (monthly)
|
||||
**Goal**: Engagement, brand presence, content distribution
|
||||
**Format**: Single email, recurring
|
||||
|
||||
**Content mix**:
|
||||
- Product updates and tips
|
||||
- Customer stories
|
||||
- Educational content
|
||||
- Company news
|
||||
- Industry insights
|
||||
|
||||
**Best practices**:
|
||||
- Consistent send day/time
|
||||
- Scannable format
|
||||
- Mix of content types
|
||||
- One primary CTA focus
|
||||
- Unsubscribe is okay—keeps list healthy
|
||||
|
||||
---
|
||||
|
||||
### Seasonal Promotions
|
||||
**Trigger**: Calendar events (Black Friday, New Year, etc.)
|
||||
**Goal**: Drive conversions with timely offer
|
||||
**Format**: Campaign burst (2-4 emails)
|
||||
|
||||
**Common opportunities**:
|
||||
- New Year (fresh start, annual planning)
|
||||
- End of fiscal year (budget spending)
|
||||
- Black Friday / Cyber Monday
|
||||
- Industry-specific seasons
|
||||
- Back to school / work
|
||||
|
||||
**Sequence structure**:
|
||||
- Announcement: Offer reveal
|
||||
- Reminder: Midway through promotion
|
||||
- Last chance: Final hours
|
||||
|
||||
---
|
||||
|
||||
### Product Updates
|
||||
**Trigger**: New feature release
|
||||
**Goal**: Adoption, engagement, demonstrate momentum
|
||||
**Format**: Single email per major release
|
||||
|
||||
**What to include**:
|
||||
- What's new (clear and simple)
|
||||
- Why it matters (benefit, not just feature)
|
||||
- How to use it (direct link)
|
||||
- Who asked for it (community acknowledgment)
|
||||
|
||||
**Segmentation**: Consider targeting based on relevance:
|
||||
- Users who would benefit most
|
||||
- Users who requested feature
|
||||
- Power users first (for beta feel)
|
||||
|
||||
---
|
||||
|
||||
### Industry News Roundup
|
||||
**Trigger**: Time-based (weekly or monthly)
|
||||
**Goal**: Thought leadership, engagement, brand value
|
||||
**Format**: Curated newsletter
|
||||
|
||||
**Content**:
|
||||
- Curated news and links
|
||||
- Your take / commentary
|
||||
- What it means for readers
|
||||
- How your product helps
|
||||
|
||||
**Best for**: B2B products where customers care about industry trends.
|
||||
|
||||
---
|
||||
|
||||
### Pricing Update
|
||||
**Trigger**: Price change announcement
|
||||
**Goal**: Transparent communication, minimize churn
|
||||
**Format**: Single email (or sequence for major changes)
|
||||
|
||||
**Timeline**:
|
||||
- Announce 30-60 days before change
|
||||
- Reminder 14 days before
|
||||
- Final notice 7 days before
|
||||
|
||||
**Copy approach**:
|
||||
- Clear, direct, transparent
|
||||
- Explain the why (value delivered, costs increased)
|
||||
- Grandfather if possible (lock in old rate)
|
||||
- Give options (annual lock-in, downgrade)
|
||||
|
||||
**Important**: Honesty and advance notice build trust even when price increases.
|
||||
|
||||
---
|
||||
|
||||
## Email Audit Checklist
|
||||
|
||||
Use this to audit your current email program:
|
||||
|
||||
### Onboarding
|
||||
- [ ] New users series
|
||||
- [ ] New customers series
|
||||
- [ ] Key onboarding step reminders
|
||||
- [ ] New user invite sequence
|
||||
|
||||
### Retention
|
||||
- [ ] Upgrade to paid sequence
|
||||
- [ ] Upgrade to higher plan triggers
|
||||
- [ ] Ask for review (timed properly)
|
||||
- [ ] Proactive support outreach
|
||||
- [ ] Product usage reports
|
||||
- [ ] NPS survey
|
||||
- [ ] Referral program emails
|
||||
|
||||
### Billing
|
||||
- [ ] Switch to annual campaign
|
||||
- [ ] Failed payment recovery sequence
|
||||
- [ ] Cancellation survey
|
||||
- [ ] Upcoming renewal reminders
|
||||
|
||||
### Usage
|
||||
- [ ] Daily/weekly/monthly summaries
|
||||
- [ ] Key event notifications
|
||||
- [ ] Milestone celebrations
|
||||
|
||||
### Win-Back
|
||||
- [ ] Expired trial sequence
|
||||
- [ ] Cancelled customer sequence
|
||||
|
||||
### Campaigns
|
||||
- [ ] Monthly roundup / newsletter
|
||||
- [ ] Seasonal promotion calendar
|
||||
- [ ] Product update announcements
|
||||
- [ ] Pricing update communications
|
||||
@@ -0,0 +1,168 @@
|
||||
# Email Sequence Templates
|
||||
|
||||
Detailed templates for common email sequences.
|
||||
|
||||
## Contents
|
||||
- Welcome Sequence (Post-Signup)
|
||||
- Lead Nurture Sequence (Pre-Sale)
|
||||
- Re-Engagement Sequence
|
||||
- Onboarding Sequence (Product Users)
|
||||
|
||||
## Welcome Sequence (Post-Signup)
|
||||
|
||||
**Email 1: Welcome (Immediate)**
|
||||
- Subject: Welcome to [Product]. Here's your first step
|
||||
- Deliver what was promised (lead magnet, access, etc.)
|
||||
- Single next action
|
||||
- Set expectations for future emails
|
||||
|
||||
**Email 2: Quick Win (Day 1-2)**
|
||||
- Subject: Get your first [result] in 10 minutes
|
||||
- Enable small success
|
||||
- Build confidence
|
||||
- Link to helpful resource
|
||||
|
||||
**Email 3: Story/Why (Day 3-4)**
|
||||
- Subject: Why we built [Product]
|
||||
- Origin story or mission
|
||||
- Connect emotionally
|
||||
- Show you understand their problem
|
||||
|
||||
**Email 4: Social Proof (Day 5-6)**
|
||||
- Subject: How [Customer] achieved [Result]
|
||||
- Case study or testimonial
|
||||
- Relatable to their situation
|
||||
- Soft CTA to explore
|
||||
|
||||
**Email 5: Overcome Objection (Day 7-8)**
|
||||
- Subject: "I don't have time for X." Sound familiar?
|
||||
- Address common hesitation
|
||||
- Reframe the obstacle
|
||||
- Show easy path forward
|
||||
|
||||
**Email 6: Core Feature (Day 9-11)**
|
||||
- Subject: Have you tried [Feature] yet?
|
||||
- Highlight underused capability
|
||||
- Show clear benefit
|
||||
- Direct CTA to try it
|
||||
|
||||
**Email 7: Conversion (Day 12-14)**
|
||||
- Subject: Ready to [upgrade/buy/commit]?
|
||||
- Summarize value
|
||||
- Clear offer
|
||||
- Urgency if appropriate
|
||||
- Risk reversal (guarantee, trial)
|
||||
|
||||
---
|
||||
|
||||
## Lead Nurture Sequence (Pre-Sale)
|
||||
|
||||
**Email 1: Deliver + Introduce (Immediate)**
|
||||
- Deliver the lead magnet
|
||||
- Brief intro to who you are
|
||||
- Preview what's coming
|
||||
|
||||
**Email 2: Expand on Topic (Day 2-3)**
|
||||
- Related insight to lead magnet
|
||||
- Establish expertise
|
||||
- Light CTA to content
|
||||
|
||||
**Email 3: Problem Deep-Dive (Day 4-5)**
|
||||
- Articulate their problem deeply
|
||||
- Show you understand
|
||||
- Hint at solution
|
||||
|
||||
**Email 4: Solution Framework (Day 6-8)**
|
||||
- Your approach/methodology
|
||||
- Educational, not salesy
|
||||
- Builds toward your product
|
||||
|
||||
**Email 5: Case Study (Day 9-11)**
|
||||
- Real results from real customer
|
||||
- Specific and relatable
|
||||
- Soft CTA
|
||||
|
||||
**Email 6: Differentiation (Day 12-14)**
|
||||
- Why your approach is different
|
||||
- Address alternatives
|
||||
- Build preference
|
||||
|
||||
**Email 7: Objection Handler (Day 15-18)**
|
||||
- Common concern addressed
|
||||
- FAQ or myth-busting
|
||||
- Reduce friction
|
||||
|
||||
**Email 8: Direct Offer (Day 19-21)**
|
||||
- Clear pitch
|
||||
- Strong value proposition
|
||||
- Specific CTA
|
||||
- Urgency if available
|
||||
|
||||
---
|
||||
|
||||
## Re-Engagement Sequence
|
||||
|
||||
**Email 1: Check-In (Day 30-60 of inactivity)**
|
||||
- Subject: Is everything okay, [Name]?
|
||||
- Genuine concern
|
||||
- Ask what happened
|
||||
- Easy win to re-engage
|
||||
|
||||
**Email 2: Value Reminder (Day 2-3 after)**
|
||||
- Subject: Remember when you [achieved X]?
|
||||
- Remind of past value
|
||||
- What's new since they left
|
||||
- Quick CTA
|
||||
|
||||
**Email 3: Incentive (Day 5-7 after)**
|
||||
- Subject: We miss you. Here's something special
|
||||
- Offer if appropriate
|
||||
- Limited time
|
||||
- Clear CTA
|
||||
|
||||
**Email 4: Last Chance (Day 10-14 after)**
|
||||
- Subject: Should we stop emailing you?
|
||||
- Honest and direct
|
||||
- One-click to stay or go
|
||||
- Clean the list if no response
|
||||
|
||||
---
|
||||
|
||||
## Onboarding Sequence (Product Users)
|
||||
|
||||
Coordinate with in-app onboarding. Email supports, doesn't duplicate.
|
||||
|
||||
**Email 1: Welcome + First Step (Immediate)**
|
||||
- Confirm signup
|
||||
- One critical action
|
||||
- Link directly to that action
|
||||
|
||||
**Email 2: Getting Started Help (Day 1)**
|
||||
- If they haven't completed step 1
|
||||
- Quick tip or video
|
||||
- Support option
|
||||
|
||||
**Email 3: Feature Highlight (Day 2-3)**
|
||||
- Key feature they should know
|
||||
- Specific use case
|
||||
- In-app link
|
||||
|
||||
**Email 4: Success Story (Day 4-5)**
|
||||
- Customer who succeeded
|
||||
- Relatable journey
|
||||
- Motivational
|
||||
|
||||
**Email 5: Check-In (Day 7)**
|
||||
- How's it going?
|
||||
- Ask for feedback
|
||||
- Offer help
|
||||
|
||||
**Email 6: Advanced Tip (Day 10-12)**
|
||||
- Power feature
|
||||
- For engaged users
|
||||
- Level-up content
|
||||
|
||||
**Email 7: Upgrade/Expand (Day 14+)**
|
||||
- For trial users: conversion push
|
||||
- For free users: upgrade prompt
|
||||
- For paid: expansion opportunity
|
||||
+1
-1
@@ -30,7 +30,7 @@ Delegation handoff must include: purpose/action; context and reference paths; ap
|
||||
|
||||
Run the affected build/type/tests. Start the app on loopback using its documented command. Inspect at desktop and mobile widths, with an intermediate width when breakpoints or layout complexity warrant it. Use product targets, or proposed defaults 1280×900, 390×844, and 768×900. Record URL, viewport, state, and screenshot path.
|
||||
|
||||
After capture, check whether the tool response contains an actual image. If it returns only a path, use the native image-capable `read` tool to open the PNG, or attach it to the GPT session (`opencode run --model <existing-GPT-model> --file <screenshot> -- <inspection-prompt>`). Keep existing model identifiers; do not invent one. Describe concrete visible details to demonstrate receipt. DOM checks are complementary, not substitutes. If the model cannot see pixels, report the exact failing delivery step and do not claim visual QA.
|
||||
After capture, check whether the tool response contains an actual image. If it returns only a path, use the native image-capable `read` tool to open the PNG, or hand the screenshot path to a GPT worker through `task(category: "visual-engineering")` and have it open the PNG with its own image-capable `read` tool. Keep existing model identifiers; do not invent one. Describe concrete visible details to demonstrate receipt. DOM checks are complementary, not substitutes. If the model cannot see pixels, report the exact failing delivery step and do not claim visual QA.
|
||||
|
||||
## 5. Bounded critique and correction
|
||||
|
||||
+5
-4
@@ -1,13 +1,13 @@
|
||||
---
|
||||
name: impeccable
|
||||
description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks.
|
||||
version: 4.3.1
|
||||
version: 4.6.0
|
||||
user-invocable: true
|
||||
argument-hint: "[shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live|generate] [target]"
|
||||
license: Apache 2.0
|
||||
allowed-tools:
|
||||
- Bash(npx impeccable *)
|
||||
- Bash(.opencode/skills/impeccable/scripts/impeccable *)
|
||||
- Bash(~/.omo/agent/skills/impeccable/scripts/impeccable *)
|
||||
---
|
||||
|
||||
This skill gives you the tools and permission to create design that earns to be called out-of-distribution craft: Whereas before, your design work would have been safe, timid and measured, you now approach every design task as an award-winning design director with impeccable understanding for what makes exceptional design work: production-grade code, peak creativity, a clear POV, deep understanding of the needs of the client and users, and exceptional craft.
|
||||
@@ -19,7 +19,7 @@ Core principles:
|
||||
|
||||
## Setup
|
||||
|
||||
1. Run `<skill-base-dir>/scripts/impeccable context` once per session, where `<skill-base-dir>` is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. That base directory resolves every `.opencode/skills/impeccable/scripts/impeccable <verb>` command in this skill and its references, and `.opencode/skills/impeccable/scripts` is the fallback only when the runtime reports no base directory. On a Windows shell without `sh`, call `.opencode/skills/impeccable/scripts/impeccable.cmd` instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as `--target <path>`. It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.
|
||||
1. Run `<skill-base-dir>/scripts/impeccable context` once per session, where `<skill-base-dir>` is the directory that contains this SKILL.md (the skill folder, not a plugin root two levels above it); keep cwd at the user's project. That base directory resolves every `~/.omo/agent/skills/impeccable/scripts/impeccable <verb>` command in this skill and its references, and `~/.omo/agent/skills/impeccable/scripts` is the fallback only when the runtime reports no base directory. On a Windows shell without `sh`, call `~/.omo/agent/skills/impeccable/scripts/impeccable.cmd` instead. The launcher runs a self-contained binary that ships next to it or is downloaded once on first run; no Node or other runtime is required. Pass a named source file or route as `--target <path>`. It loads PRODUCT.md, DESIGN.md, the matching surface brief, and native-platform guidance when applicable; follow its directives and do not rerun it.
|
||||
2. Load the request's playbook: its Commands-table reference for an explicit/implied sub-command, or [reference/new-work.md](reference/new-work.md) for a new surface or replacement visual world. Inspect target and incumbent visual truth before editing. When the app cannot run, start with committed visual-regression goldens or screenshot fixtures; verify target and freshness against current tokens, CSS, components, or assets, resolve conflicts, and compare theme/variant captures.
|
||||
3. After resolving analysis and direction, read [reference/craft-floor.md](reference/craft-floor.md) immediately before any UI edit, including small refinements. It carries the quality floor, the absolute bans, and the reflexes no detector catches. Do not load it for planning-only work.
|
||||
|
||||
@@ -29,6 +29,7 @@ Core principles:
|
||||
|
||||
- **The brief wins.** Honor pinned aesthetics, eras, materials, fonts, and palettes even when they conflict with a saturated-pattern warning. Redirecting a clear brief toward your taste is failure.
|
||||
- **Refinement preserves; redesign replaces.** Refinement keeps the incumbent identity, behavior, copy, and everything outside scope. Ask before replacing factual copy or adding claims. Redesign keeps product truth, content, function, native affordances, and constraints, but treats the old look as evidence and anti-reference; choose a replacement world in new-work and replace DESIGN.md. Never split the difference into polish on the discarded look.
|
||||
- **Loaded symbols stay out of the decoration.** A subject's world does not license emblems tied to militarism, supremacy, or hate movements as motifs, badges, or ornament, such as the Rising Sun flag's rays, the Confederate battle flag, or Nazi-era insignia and their stylised variants; reach for that world's neutral forms instead. Content that documents such a symbol as fact stays as it is.
|
||||
- **Visual authority is evidence, not a filename.** Missing DESIGN.md alone does not make a project greenfield; new-work decides whether to preserve, expand, or replace the incumbent world.
|
||||
|
||||
## Modes
|
||||
@@ -81,7 +82,7 @@ Routing:
|
||||
|
||||
After init writes PRODUCT.md, resume without rerunning `impeccable context`; init loads the native platform reference itself when the platform it recorded is `ios`, `android`, or `adaptive`.
|
||||
|
||||
**Pin / Unpin:** `.opencode/skills/impeccable/scripts/impeccable pin <pin|unpin> <command>` creates or removes a standalone `/<command>` shortcut. Report the script's result concisely; relay stderr verbatim on error.
|
||||
**Pin / Unpin:** `~/.omo/agent/skills/impeccable/scripts/impeccable pin <pin|unpin> <command>` creates or removes a standalone `/<command>` shortcut. Report the script's result concisely; relay stderr verbatim on error.
|
||||
|
||||
**Hooks:** `/impeccable hooks <on|off|status|ignore-rule|ignore-file|ignore-value|reset>` manages the design detector hook for this project (auto-runs the detector after UI file edits and surfaces findings). Load [reference/hooks.md](reference/hooks.md) when the user invokes it with any argument.
|
||||
|
||||
+2
-2
@@ -69,8 +69,8 @@ Run the bundled detector and verify each finding in context. Look for repeated i
|
||||
|---|-----------|-------|-------------|
|
||||
| 1 | Accessibility | ? | [most critical a11y issue or "--"] |
|
||||
| 2 | Performance | ? | |
|
||||
| 3 | Responsive Design | ? | |
|
||||
| 4 | Theming | ? | |
|
||||
| 3 | Theming | ? | |
|
||||
| 4 | Responsive Design | ? | |
|
||||
| 5 | Implementation Integrity | ? | |
|
||||
| **Total** | | **??/20** | **[Rating band]** |
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# Plan and asset review
|
||||
|
||||
Use this checkpoint on comp-led builds once every raster region has its plate and the plates gate has scored them, before any page code exists. The approved comp is the reference. The user reviews two things: the plates that will ship, and the production plan for everything else, meaning which regions code draws. A painted region planned as code is the most expensive mistake a comp-led build makes, and this is where the user catches it. Text, controls and chrome are judged later, in the assembled first viewport.
|
||||
|
||||
## Plan, capture, serve
|
||||
|
||||
Run `~/.omo/agent/skills/impeccable/scripts/impeccable component-review plan`. It writes `.impeccable/review/components.json` from the measured spec, the comp and the plate files, and refuses, naming each one, while any raster region lacks its plate. Never write or edit that file for this stage: the packet is derived from the spec, so every change belongs in the regions file.
|
||||
|
||||
If the harness exposes `component_review`, call it with `manifest_path` set to `.impeccable/review/components.json`. The host captures, presents the review and returns the user's decisions. A suspended request is waiting for the user; it is not a failed build or an approval.
|
||||
|
||||
Otherwise run `~/.omo/agent/skills/impeccable/scripts/impeccable component-review capture --manifest .impeccable/review/components.json`, then start `~/.omo/agent/skills/impeccable/scripts/impeccable component-review serve --session <returned session>` in the background. Open the URL it prints in the available browser and wait for the user; `serve` exits 0 once they submit. Read the decisions with `~/.omo/agent/skills/impeccable/scripts/impeccable component-review status --session <id>`; `~/.omo/agent/skills/impeccable/scripts/impeccable component-review verify --manifest .impeccable/review/components.json` confirms approval and refuses pending, needs-work and stale input. Never submit the page or write a receipt on the user's behalf.
|
||||
|
||||
`serve` exits 2 when this session has no browser (the same signal as the decision page) and 4 when it closes after 30 idle minutes without a decision. Either way no one is reviewing: stop waiting, do not approve anything yourself, and do not build past this checkpoint. End the run and report the plan and asset review as pending with its session ID, so the user can resume it. A waiting review is pending work, not a completed build.
|
||||
|
||||
## Act on the receipt
|
||||
|
||||
Apply the user's decisions as given, never your own favorable verdict in their place.
|
||||
|
||||
- **approve**: once every item is approved and the inventory is confirmed, advance to the hero.
|
||||
- **revise** (a plate): regenerate that plate at the same path with the user's feedback.
|
||||
- **revise with split** (an asset): replace that region in the regions file with its layers: a frame plate with a transparent opening (kind `plate`, same box), the content as its own `image` region at the opening's box, and each moving part (a shutter, a door) as its own plate. Name each layer after the original region, as `<id>-frame`, `<id>-view` or `<id>-shutter-left`, so the next round shows it as part of the user's request. Rerun `~/.omo/agent/skills/impeccable/scripts/impeccable comp-spec --comp <comp.png> --regions <regions.json>` and produce the plates.
|
||||
- **revise** (a plan item): change the regions file as the feedback says (resize or extend a raster region, split material into its own plate region, or adjust the code region), rerun `~/.omo/agent/skills/impeccable/scripts/impeccable comp-spec --comp <comp.png> --regions <regions.json>`, and produce any new plates.
|
||||
- **reclassify** (a code region): in the regions file, change that region's `kind` to the one the user chose and rewrite its `note` to describe the material. Rerun `~/.omo/agent/skills/impeccable/scripts/impeccable comp-spec --comp <comp.png> --regions <regions.json>`, then produce the new plates, with the asset producer when subagents are available.
|
||||
- **missing**: add the region to the regions file, rerun `~/.omo/agent/skills/impeccable/scripts/impeccable comp-spec --comp <comp.png> --regions <regions.json>`, and produce its plate if it is raster.
|
||||
|
||||
Then run `plan`, `capture` and `serve` again. Unchanged decisions carry over, so the user sees only what changed. Any spec change, or a plate replaced after acceptance, needs a new round; the build-phase gate stays closed until the review of the current spec is accepted.
|
||||
|
||||
## Assemble and review
|
||||
|
||||
Build the first viewport from the approved plates and plan, and run the hero gate. Human review does not waive its integrity checks. After three failed hero attempts, or three failed responsive attempts before any first viewport is accepted, stop iterating and present the first-viewport review with the current build; the user's eye settles what the readings could not.
|
||||
|
||||
Present a second manifest at `.impeccable/review/hero.json`. You write this one, and its shape is fixed:
|
||||
|
||||
```json
|
||||
{
|
||||
"schemaVersion": 2,
|
||||
"stage": "hero",
|
||||
"id": "hero",
|
||||
"title": "First viewport",
|
||||
"comp": {"path": ".impeccable/mocks/comp.png", "width": 1536, "height": 1024},
|
||||
"components": [{
|
||||
"id": "first-viewport",
|
||||
"name": "First viewport",
|
||||
"medium": "HTML / CSS",
|
||||
"note": "Assembled first viewport",
|
||||
"box": {"x": 0, "y": 0, "w": 1, "h": 1},
|
||||
"preview": {"kind": "page", "path": "index.html"},
|
||||
"dependencies": ["styles.css", "assets/plates/sky.png", "fonts/display.woff2"]
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
- `schemaVersion` is 2. Version 3 is the plan review packet and requires stage `components`. `codeRegions` and `specSha256` exist only in version 3 and are refused here. `reviewGroup` is refused too: version 3 rejects it, and any other version accepts it only on a page preview in a `components`-stage manifest, never in a hero manifest.
|
||||
- `comp.path` is the `comp` value in `.impeccable/build/spec.json`, and `width` and `height` are that PNG's pixel size.
|
||||
- Exactly one component, with `box` exactly `{"x": 0, "y": 0, "w": 1, "h": 1}` and `name`, `medium` and `note` as strings.
|
||||
- `preview.path` is the page entry the build gates (`artifact` in `.impeccable/build/state.json`).
|
||||
- `dependencies` lists every other file the page loads (stylesheets, scripts, plates, images, fonts) as bare strings. Every path, here and above, is project-relative and plain: no leading `./` or `/`, no `..`, no URL, no `?`, `#`, `%`, `:` or backslash. A request to a file missing from this list, or to another host, fails the capture.
|
||||
|
||||
The reference stays the approved comp. Call the same host review tool, or run `capture`, `serve` and `verify` with this manifest. Needs-work feedback starts another assembly round.
|
||||
|
||||
Acceptance closes human review for this build: never request plan, asset or assembly approval again. While the page renders what the user accepted, the hero score, the palette check and every numeric reading are advisories; material vetoes still hold (a missing or unreferenced plate, an SVG illustration, an organic clip, a clipped plate, invented ink, failed rendered presence). A text, control or chrome region the accepted screenshot also lacks is settled by the acceptance; a plate it lacks is a question for the user that the gate's reason spells out: do not move off what they accepted on your own, but carry out their answer, including placing the plate. When the capture no longer matches the accepted screenshot, restore what the user accepted; until then the readings apply. Complete the rest of the page, responsive behavior, finish checks and documentation with the accepted first viewport as the visual direction. This is first-viewport calibration, not a claim that the user reviewed the rest of the page. Shared stylesheet edits do not reopen approval. Preserve the accepted direction; a later explicit user change is a new task.
|
||||
|
||||
Assembled-page capture executes inline and declared local scripts from the pinned inputs. Network APIs, frames and workers are unavailable; the initial viewport must settle before capture. Keep the real page and declare its scripts rather than removing behavior to pass review.
|
||||
+15
-10
@@ -4,11 +4,11 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
|
||||
### Hard Invariants
|
||||
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required.
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask).
|
||||
- Assessment A (design review) and Assessment B (detector/browser evidence) are both required, except on a native platform (see Assessment Orchestration).
|
||||
- Assessment A and B MUST run as two isolated sub-agents whenever a sub-agent/Task tool is exposed. Running them inline in this context is "possible" but is NOT permitted; it is a degraded run. Inline is allowed ONLY when no sub-agent tool exists (or the user declined, on harnesses that ask). Native platforms run A alone (see Assessment Orchestration).
|
||||
- If you degrade for any reason, the report's first line MUST be a banner: `⚠️ DEGRADED: single-context (<reason>)`. A silent degraded critique is a failed critique.
|
||||
- Assessment A must finish before detector findings enter the parent synthesis context. Detector output is deterministic, but it still anchors judgment.
|
||||
- A skipped detector is a failed critique run unless `impeccable detect` is missing or crashes after a real attempt.
|
||||
- A skipped detector is a failed critique run unless `impeccable detect` is missing or crashes after a real attempt, or the platform is native (see Assessment Orchestration).
|
||||
- Viewable targets require browser inspection when available.
|
||||
- Any local server started only for critique visualization must run in the background, have a recorded stop method, and be stopped before final reporting unless the user asks to keep it.
|
||||
- Do not claim a user-visible overlay exists unless script injection succeeded and the detector ran in the page.
|
||||
@@ -23,15 +23,19 @@ Resolve one stable target, run two independent assessments, synthesize a design
|
||||
- "this page" -> the current URL or source file
|
||||
2. **Confirm the target slugs cleanly**:
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable critique-storage slug "<resolved-path-or-url>"
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable critique-storage slug "<resolved-path-or-url>"
|
||||
```
|
||||
Every later command also accepts the resolved target directly and derives the same slug internally; never hand-write a slug. If this exits non-zero, skip persistence and trend for this run, but continue the critique.
|
||||
3. **Read `.impeccable/critique/ignore.md`** if it exists. Drop matching findings silently; it is the only prior-run input critique consumes.
|
||||
|
||||
### Assessment Orchestration
|
||||
|
||||
**Native platforms** (`ios` / `android` / `adaptive`): Assessment B does not apply, because `impeccable detect` and the browser overlay read only web markup. Run Assessment A alone in this context and skip both sub-agent gates below, the Codex permission question included: with no B there is nothing to isolate A from, so this is the complete native method and carries no degraded banner. Do not run `impeccable detect` on native source; its empty result reads as clean.
|
||||
|
||||
Delegate Assessment A and Assessment B to separate sub-agents. They must not see each other's output. Do not show findings to the user until synthesis.
|
||||
|
||||
OmO routing: when the task tool accepts a category, spawn Assessment A with `category: "design-critique-a"` and Assessment B with `category: "design-critique-b"`. Never pass `model` with a category.
|
||||
|
||||
Sub-agent gate (all harnesses):
|
||||
- Unless a harness-specific gate below overrides this, spawn A and B as two isolated, parallel sub-agents whenever a sub-agent/Task tool is exposed. This is the default and is mandatory; do not run them inline because it is faster.
|
||||
- "Unavailable" means exactly one thing: no sub-agent/Task tool is exposed in this session (or, on harnesses that ask, the user declined). It does not mean inconvenient.
|
||||
@@ -55,11 +59,11 @@ Return: design-specificity verdict, heuristic scores, cognitive load, emotional
|
||||
|
||||
### Assessment B: Detector + Browser Evidence
|
||||
|
||||
Run the bundled detector and browser visualization evidence. Assessment B is mandatory and must remain isolated from Assessment A until both are complete.
|
||||
Run the bundled detector and browser visualization evidence. On web, Assessment B is mandatory and must remain isolated from Assessment A until both are complete.
|
||||
|
||||
CLI scan:
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable detect --json [target]
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable detect --json [target]
|
||||
```
|
||||
|
||||
- Pass markup files/directories as `[target]`; do not pass CSS-only files.
|
||||
@@ -73,7 +77,7 @@ Browser visualization is required for a viewable target when browser automation
|
||||
1. Create a fresh tab and navigate. Prefer the harness's native/browser-canvas screenshot path before hand-rolling a Playwright/Puppeteer script; only fall back to a custom script when no native browser tool is exposed.
|
||||
2. Preflight mutable injection by setting `document.title` and appending a `<script>` tag. Read-only evaluate APIs do not count.
|
||||
3. If mutation is unavailable, skip live server, browser presentation, and injection; report fallback signal.
|
||||
4. If mutation is available, start `.opencode/skills/impeccable/scripts/impeccable live-server --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
4. If mutation is available, start `~/.omo/agent/skills/impeccable/scripts/impeccable live-server --background`, present the browser if supported, label `[Human]`, scroll top, inject `http://localhost:PORT/detect.js`, wait 2-3 seconds, read `impeccable` console messages, then stop the live server.
|
||||
5. For multi-view targets, inject on 3-5 representative pages.
|
||||
|
||||
Return: CLI findings JSON/counts, browser console findings if applicable, false positives, and skipped/failed browser steps with concrete reasons.
|
||||
@@ -93,6 +97,7 @@ Structure your feedback as a design director would:
|
||||
The report's first line MUST declare how the assessments were run, so a degraded run is never silent:
|
||||
- Dual-agent: `Method: dual-agent (A: <agent-id> · B: <agent-id>)`
|
||||
- Degraded: `⚠️ DEGRADED: single-context (<reason, e.g. no sub-agent tool exposed>)`
|
||||
- Native: `Method: design review only (detector not applicable, native platform)`
|
||||
|
||||
#### Design Health Score
|
||||
> *Consult the [Heuristics Scoring Guide](#heuristics-scoring-guide) section below.*
|
||||
@@ -125,7 +130,7 @@ Be honest with scores. A 4 means genuinely excellent. Most real interfaces score
|
||||
|
||||
**LLM assessment**: Your unanchored evaluation of design specificity. Cover overall coherence, structural sameness, category-interchangeable choices, and missed opportunities for product character.
|
||||
|
||||
**Deterministic scan**: Summarize what the automated detector found, with counts and file locations. Note any additional issues the detector caught that you missed, and flag any false positives.
|
||||
**Deterministic scan**: Summarize what the automated detector found, with counts and file locations. Note any additional issues the detector caught that you missed, and flag any false positives. On a native platform, write `not applicable (native platform)` instead.
|
||||
|
||||
**Visual overlays** (if injection succeeded): Tell the user that overlays are now visible in the **[Human]** tab in their browser, highlighting the detected issues. Summarize what the console output reported. If browser visualization was attempted but injection failed, say that no reliable user-visible overlay is available and report the fallback signal instead.
|
||||
|
||||
@@ -195,7 +200,7 @@ Skip this step if the Setup slug was null (vague or root-level target).
|
||||
2. **Pass the structured metadata** through `IMPECCABLE_CRITIQUE_META` (JSON), then run the write command:
|
||||
```bash
|
||||
IMPECCABLE_CRITIQUE_META='{"target":"<user phrasing>","total_score":<n>,"max_score":<n>,"na_heuristics":"<comma-separated numbers, or empty>","p0_count":<n>,"p1_count":<n>}' \
|
||||
.opencode/skills/impeccable/scripts/impeccable critique-storage write "<resolved target>" <body-file>
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable critique-storage write "<resolved target>" <body-file>
|
||||
```
|
||||
`max_score` is the applicable maximum from the heuristic table (40 when every heuristic applied), so a later run can tell a renormalized total from a full one. For a local file target, the helper also records an exact content fingerprint so polish can distinguish the assessed bytes from later edits without relying on Git state or timestamps. The helper prints the absolute path it wrote. Leave that file on disk. Polish closes it; this run does not.
|
||||
|
||||
@@ -203,7 +208,7 @@ Skip this step if the Setup slug was null (vague or root-level target).
|
||||
|
||||
4. **Read the trend** for context:
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable critique-storage trend "<resolved target>" 5
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable critique-storage trend "<resolved target>" 5
|
||||
```
|
||||
This returns a JSON array of the last 5 frontmatter entries (including the one you just wrote).
|
||||
|
||||
+9
-4
@@ -11,7 +11,11 @@ Do not redesign. Preserve the reference's visual role, silhouette, palette, ligh
|
||||
|
||||
## Decision Comps
|
||||
|
||||
When the parent hands you a decision card packet instead of an approved mock, the job is one comp: one card, one file, written to the card's declared `comp` path the moment it renders. The parent runs several of you in parallel, one per card, so this card is your entire contract; generate first, plan never, because the file on disk is the deliverable and the decision page is waiting on it. Work from the card's structured fields and PRODUCT.md alone; report a card too thin to brief a comp, never pad it from imagination. Render the card's direction as a north-star comp at full fidelity: the requested surface's first viewport, prompt led by the surface's own structure (regions named in order with their scale relationships, never the world's atmosphere), fully committed in the card's own palette, type character, and material world. A native app or mobile-first surface is a portrait frame at its device viewport, never a landscape default. Every sibling renders at the same full fidelity in its own grammar, one surface, one aspect; equal commitment keeps the comparison honest. Real product name and real content only; never invent commercial claims, prices, benchmarks, or dates PRODUCT.md does not carry. Exclusions bind those claims, never a medium the card's own world has not excluded: a subject that lives in photographs keeps its photographs. Write the prompt sidecar beside the file. Return one line naming the path and any deviation, nothing more. Everything below this section is the asset-production job; none of it applies to a decision-comp run.
|
||||
When the parent hands you a decision card packet instead of an approved mock, the job is one comp: one card, one file, written to the card's declared `comp` path the moment it renders. The parent runs several of you in parallel, one per card, so this card is your entire contract; generate first, plan never, because the file on disk is the deliverable and the decision page is waiting on it. Work from the card's structured fields and PRODUCT.md alone; report a card too thin to brief a comp, never pad it from imagination. Render the card's direction as a north-star comp at full fidelity: the requested surface's first viewport, prompted in the short shape visualize.md gives (the product and the visitor's job with real content, what leads, the parts in reading order, the frame), with the look taken from the card's world: its card images attached as references when the packet names them, otherwise two to four sentences of concrete look. A native app or mobile-first surface is a portrait frame at its device viewport, never a landscape default. Every sibling renders at the same full fidelity in its own grammar, one surface, one aspect; equal commitment keeps the comparison honest. Real product name and real content only; never invent commercial claims, prices, benchmarks, or dates PRODUCT.md does not carry. Exclusions bind those claims, never a medium the card's own world has not excluded: a subject that lives in photographs keeps its photographs. Write the prompt sidecar beside the file. Return one line naming the path and any deviation, nothing more. Everything below this section is the asset-production job; none of it applies to a decision-comp run.
|
||||
|
||||
## Review handoff
|
||||
|
||||
Return the actual files and any unresolved drift to the parent for the user's plan and asset review in [component-review.md](../component-review.md). A parent or automatic visual check is not a substitute for that human checkpoint. The parent may call you again after it: for regions the user reclassified from code to raster (the spec now lists them with a plate path), or for plates the user asked to revise, with their feedback as the prompt notes. Produce only those, preserve unchanged assets, and hand off real files as before; never self-approve. This checkpoint does not apply to the Decision Comps job above.
|
||||
|
||||
## Input Contract
|
||||
|
||||
@@ -25,10 +29,11 @@ Every region with `medium: raster` in the spec ships as a plate at its `plate` p
|
||||
|
||||
Per region, in the spec's order:
|
||||
|
||||
1. `.opencode/skills/impeccable/scripts/impeccable comp-spec --crop <id>` writes the reference crop under `.impeccable/build/crops/`.
|
||||
2. Choose the background from the approved region: an isolated figure, object, or line drawing on the page ground is a **transparent cutout**; a photograph, full-frame illustration, or texture stays **opaque**. Save `.opencode/skills/impeccable/scripts/impeccable comp-spec --plate-prompt <id> --background transparent` to a UTF-8 prompt file for a cutout; use `--background opaque` otherwise. The transparent prompt preserves reference placement and clear margins, white paint, fine edges, and interior holes.
|
||||
3. Produce the plate at its exact spec `plate` path. Create the output directory first and choose a supported output size matching the region's aspect, at least 1.5x its pixel dimensions. Prefer the harness-native image tool with the crop as input and the saved prompt; request a transparent PNG for cutouts, then run `.opencode/skills/impeccable/scripts/impeccable embed-prompt <plate> --prompt-file <prompt.txt>` (if you refine the prompt, save and embed the exact text sent). With the API fallback, run `.opencode/skills/impeccable/scripts/impeccable generate-image --ref <crop.png> --prompt-file <prompt.txt> --out <plate.png> --size <WxH> --quality high --background transparent` for a cutout, or `--background opaque` otherwise. The API fallback embeds the prompt and records the background in the sidecar. The output must be PNG; the fallback requests native alpha and performs no chroma-keying.
|
||||
1. `~/.omo/agent/skills/impeccable/scripts/impeccable comp-spec --crop <id>` writes the reference crop under `.impeccable/build/crops/`.
|
||||
2. Choose the background from the approved region: an isolated figure, object, or line drawing on the page ground is a **transparent cutout**; a photograph, full-frame illustration, or texture stays **opaque**. Save `~/.omo/agent/skills/impeccable/scripts/impeccable comp-spec --plate-prompt <id> --background transparent` to a UTF-8 prompt file for a cutout; use `--background opaque` otherwise. The transparent prompt preserves reference placement and clear margins, white paint, fine edges, and interior holes.
|
||||
3. Produce the plate at its exact spec `plate` path. Create the output directory first and choose a supported output size matching the region's aspect, at least 1.5x its pixel dimensions. Prefer the harness-native image tool with the crop as input and the saved prompt; request a transparent PNG for cutouts, then run `~/.omo/agent/skills/impeccable/scripts/impeccable embed-prompt <plate> --prompt-file <prompt.txt>` (if you refine the prompt, save and embed the exact text sent). With the API fallback, run `~/.omo/agent/skills/impeccable/scripts/impeccable generate-image --ref <crop.png> --prompt-file <prompt.txt> --out <plate.png> --size <WxH> --quality high --background transparent` for a cutout, or `--background opaque` otherwise. The API fallback embeds the prompt and records the background in the sidecar. The output must be PNG; the fallback requests native alpha and performs no chroma-keying.
|
||||
4. Open the plate beside the crop and compare subject, placement, scale, palette, and style. For cutouts, verify a real alpha channel and inspect composites on light and dark grounds: white paint must stay solid, interior holes must clear, and fine edges must avoid halos. Inspect glass and soft shadows carefully; partial alpha alone does not ensure convincing translucency. Never chroma-key native transparent output or flatten it before saving. If a native tool returns opaque pixels or a painted checkerboard, retry with the API fallback when available; otherwise report the transparency blocker. On a visual miss, tighten the prompt and regenerate once. Two misses on one region: keep the better plate, mark it `needs_parent_review`, and name the drift. The parent runs the plates gate after all assets exist; report `unscored` until a gate score is available.
|
||||
5. A frame plate (a window, a doorway, an arch) is a transparent cutout with an opening: generate it with a transparent background and keep the opening fully transparent. Verify the alpha inside the opening before saving: no baked view, no glow or vignette halo across it. The content seen through the opening is its own image region; produce it separately at the opening's size.
|
||||
|
||||
Do not redesign. Do not add objects, restyle, or reinterpret; the comp was approved as it is. Do not touch the page code, the spec, or the comp. Do not produce anything the spec does not list; a region the parent forgot goes back as a one-line note, not a plate.
|
||||
|
||||
+2
-2
@@ -16,10 +16,10 @@ Expect: the original request; the confirmed user answers; the artifact path(s);
|
||||
## Checks, in order
|
||||
|
||||
0. **Evidence.** Before any other check, verify the required captures exist and every capture is valid. Required: the platform's full viewport set (web: `desktop.png` and `mobile.png`; native: one capture per shipped device class), plus every capture the calling brief names as required, a reported user viewport (`user-<width>.png`) included. Valid: no black or blank regions, content matching what the filename claims (a visit capture showing the About section is invalid), the document top visible where the file claims a full page, dimensions that make sense for the named viewport. A required capture that is absent fails exactly like one that is malformed: a viewport nobody captured is a viewport nobody inspected, and it cannot ship. When any capture fails, the whole review changes shape: return `disposition: recapture` as the first line, then one section, `recapture`, listing each missing or invalid file and what a valid capture of it shows, and stop. Never build a matrix on malformed evidence; a verdict derived from a broken capture launders the breakage into an approval, and the parent owes you a full re-review on valid captures, not a scoring round.
|
||||
1. **Persistence.** PRODUCT.md exists. On a comp-led build, `.impeccable/build/state.json` exists and its `comps` (or `skipped` when a surface round locked the comp), `spec`, `plates`, and `hero` phases are `closed`; a comp-led config with no state file, or a state whose `comps` phase never closed, means the comp round was skipped and the build ran from a world description alone, a material finding that outranks craft; a phase closed with a `forced` record is disclosed as a material finding unless the user downgraded the comp in words the packet quotes; a state file whose `hero.gate.score` sits under 0.72, or a missing state file, means the reproduction ran unproven, a material finding, and `.impeccable/review/hero-repro.png` must exist either way. When DESIGN.md predates this build (an extension or redesign), it matches the built world; on a new world it is written after this review by the documenter, so its absence here is not a finding. When comp-round comps exist under `.impeccable/mocks/`, an approval record exists too: the surface brief naming the approved comp, or an `approved` flag in its sidecar. Comp-round comps with no recorded pick mean the approval point was skipped, a material finding. Files under `.impeccable/mocks/decision/` are exempt: they are the direction round's dealt hand, produced before any comp round, and imply no approval whatever the build path; a code-led build has no comp round at all.
|
||||
1. **Persistence.** PRODUCT.md exists. On a comp-led build, `.impeccable/build/state.json` exists and every phase before `review` is `closed` or explicitly `skipped`; an open or failed phase is a material finding. A comp-led config with no state file, or a state whose `comps` phase is neither `closed` nor `skipped`, means the comp round was skipped and the build ran from a world description alone, a material finding that outranks craft; a phase closed with a `forced` record is disclosed as a material finding unless the user downgraded the comp in words the packet quotes; a state file whose `hero.gate.score` sits under 0.72, or a missing state file, means the reproduction ran unproven, a material finding, and `.impeccable/review/hero-repro.png` must exist either way. When DESIGN.md predates this build (an extension or redesign), it matches the built world; on a new world it is written after this review by the documenter, so its absence here is not a finding. When comp-round comps exist under `.impeccable/mocks/`, an approval record exists too: the surface brief naming the approved comp, or an `approved` flag in its sidecar. Comp-round comps with no recorded pick mean the approval point was skipped, a material finding. Files under `.impeccable/mocks/decision/` are exempt: they are the direction round's dealt hand, produced before any comp round, and imply no approval whatever the build path; a code-led build has no comp round at all.
|
||||
2. **Fidelity.** Start from the measurement, then judge what it cannot: read `.impeccable/review/diff/final/report.json` (and hero) first; every region scored `missing` or `contradicted` is a matrix row in that state unless the paired crop under `regions/` shows the score is wrong, and you say why; a region scored `match` still gets your eye for lettering character and material, which the numbers do not measure. Then, against your own element inventory of the approved comp, never against the contract's summary of it: topology, reading order, focal scale, overlaps and z-order, density, signature geometry, the primary action's treatment (a CTA the comp physically works, dissolves, or stamps is a signature element; its plain-rectangle rendition is contradicted), navigation items and icons, headline levels and scale relationships. Classify every salient element: match, acceptable adaptation, missing, contradicted, or added without approval. Three rows are mandatory in every matrix. TYPE: the display lettering's character, compression, width, weight, contrast, terminals, against the comp's; a face of a different character is contradicted however the layout matches. MATERIAL: an element rendered as flat CSS or clean vector where the comp shows painted, textured, dimensional, or photographic material is contradicted regardless of placement; medium is part of the promise. GROUND: the page field's value and temperature against the comp's, sampled from pixels on both sides when tooling allows rather than judged from memory, and read as the net on-screen result where a texture or tile paints over the base color; a ground warmer or cooler than the comp's is contradicted however faithfully the layout matches, and drift toward the rendition prior (warm cream on light grounds, blue-black slate on dark) is the direction to hunt. With no approved comp, TYPE and MATERIAL do not lapse: judge them against the contract's OWN-WORLD and the world's real materials, and treat faked physicality (CSS bevels, embossing, stamped-metal or chalk effects imitating a material the page never renders) as contradicted on its face; imitation material is the single most reliable mark of machine-made design. GROUND narrows rather than lapses: with no comp to sample, a color OWN-WORLD names is the target and the same warmer-or-cooler judgment applies; when OWN-WORLD names none, there is no GROUND authority, and the review says so in place of a verdict, because a target the reviewer invents turns the check into taste. A critique-reference comp on such a build is provocation, not spec: no element matrix, no adaptation citations, no asset obligations; its one contribution is what the image dared that the build did not, and dares worth adopting enter material_fixes as ordinary ordered fixes. An adaptation counts as intentional only when it cites the user answer, surface brief, accessibility need, or product truth that forced it; an uncited deviation is a defect. A missing signature element, a changed topology, or content added without approval fails fidelity and outranks every craft point in material_fixes. When MATERIAL is contradicted on the focal element, or contradiction is the page rather than the exception, stop ordering repairs: make the first material fix a rebuild directive naming the comp regions to re-derive and the assets to produce; a list of patches against a rejected page launders the rejection into an approval. A fix that requires producing an asset says so explicitly ("produce: <region> as a raster asset"), never phrased as a style adjustment the parent will answer with CSS. The comp is the spec for composition, topology, element inventory, density, lettering character, and material; it is not a pixel spec for semantics, accessibility, or responsive reflow, and that allowance covers translation, never replacement.
|
||||
3. **Ceiling.** Against the QUALITY BAR card: name the world's native devices the build left unused, frame, depth, lettering treatment, ornament density, motion. The card governs commitment and finish, never composition.
|
||||
4. **Contract, promise by promise.** First verify FORM carries the seed key the concept roll printed; a contract with no seed key, or one the parent cannot corroborate, means the roll was skipped, a material fix ahead of any craft point. Then, for each of the five blocks: does the render keep the promise? Apply the memory test to the first viewport.
|
||||
4. **Contract, promise by promise.** First verify FORM carries the seed reference the concept roll printed (`seed:` and 16 hex), corroborated against the roll output the parent saw or with `impeccable concept-seed --check-seed <reference>` (exit 0 means this machine rolled it). A raw seed key in FORM is itself a material fix: the brief is committed, and the key must not be. `seed: none (unavailable)` stands only when the roll printed SEED REFERENCE unavailable, which `--check-seed none` confirms with exit 0. Any other contract with no reference, or one neither source corroborates, means the roll was skipped, a material fix ahead of any craft point. Then, for each of the five blocks: does the render keep the promise? Apply the memory test to the first viewport.
|
||||
5. **Truth.** Demonstration data authored and labeled synthetic; no invented commercial claims; unanswered claims present as marked placeholders, not omissions. Every raster region of the spec shipped as its plate (the spec names the file; the page references it; the region's diff row is not `missing`), not a gradient, an inline SVG, or a many-vertex `clip-path` standing in for it, and every produced asset visibly present in the screenshots; an asset applied at near-zero opacity or buried behind a wash is a compliance token, not a shipped material, and the detector's `buried-raster` and `organic-clip-path` findings in the packet are material fixes.
|
||||
6. **Floor.** Read the craft floor's Refuse list and hold the screenshots against it: kickers and eyebrows, hard offset shadows outside a neobrutalist world, glyph icons, system display faces, gradient text, side stripes, and the rest. A banned element is a material fix even when it matches nothing in the comp: the builder loaded the same ban before writing it, and fidelity to a comp cannot authorize what the floor refuses. The parent's hook findings cover this mechanically where hooks run; this check exists because hookless harnesses reach you with none, and the last two live sessions shipped five kickers past a reviewer that never looked.
|
||||
|
||||
+3
-3
@@ -13,7 +13,7 @@ Three kinds of drift travel under "out of date". Keep them apart:
|
||||
## Step 1: Run the pass
|
||||
|
||||
```
|
||||
.opencode/skills/impeccable/scripts/impeccable doctor --json
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable doctor --json
|
||||
```
|
||||
|
||||
Add `--target <path>` when the user named a workspace, file, or route in a monorepo. Without it the report describes the repo root, and in a monorepo that is often the wrong project.
|
||||
@@ -26,7 +26,7 @@ An empty `findings` array is the good outcome. Say so in one line and stop.
|
||||
|
||||
The severity says what should happen, not how bad it is.
|
||||
|
||||
- **`auto`** carries no decision. Run `.opencode/skills/impeccable/scripts/impeccable doctor --fix` once to apply these, then report what it moved in one line. Do not ask permission first, and do not ask about them afterward.
|
||||
- **`auto`** carries no decision. Run `~/.omo/agent/skills/impeccable/scripts/impeccable doctor --fix` once to apply these, then report what it moved in one line. Do not ask permission first, and do not ask about them afterward.
|
||||
- **`mention`** needs the user to know but not to decide anything now. State each one in a sentence with its offered fix.
|
||||
- **`route`** needs a specific command. Name the command and the gap it would close. Run it only if the user asks in this turn; `init` and `document` are conversations, not repairs you perform unattended.
|
||||
|
||||
@@ -46,7 +46,7 @@ The same restraint applies to `workspace-context-inherited`. Inheritance is a de
|
||||
|
||||
- `workspace-platform-native-evidence` is the finding that matters most here: a workspace carrying native build files while inheriting a root record that resolves to web gets web guidance for its whole life and never loads [ios.md](ios.md) or [android.md](android.md). The repair is a child PRODUCT.md in that workspace, because one inherited record cannot hold two platforms.
|
||||
- `config-project-roots-match-nothing` means every `projectRoots` glob missed, so the repo root is silently standing in as the active project. A renamed workspace directory is the usual cause. Report the patterns and ask which directories they should name.
|
||||
- `config-invalid-build-path` and `config-build-path-unset` both concern one key, `buildPath` in `.impeccable/config.json` (or the gitignored `.impeccable/config.local.json`, which wins for that developer). It holds `comp` or `code` and sets whether new surfaces are built from a generated comp or straight in code. An unread value does not fall back to the opposite path, so a project meaning `code` has been building comp-led; report the exact value. The unset finding fires only where a project has done direction work and never recorded a preference, and the offer belongs in it only when image generation exists in your tool surface. Without image generation there is nothing to choose and nothing to say.
|
||||
- `config-invalid-build-path` and `config-build-path-unset` both concern one key, `buildPath` in `.impeccable/config.json` (or the gitignored `.impeccable/config.local.json`, which wins for that developer). It holds `comp` or `code` and sets whether new Persuade and Experience surfaces are built from a generated comp or straight in code; Operate and Read surfaces are code-led whatever it holds. An unread value does not fall back to the opposite path, so a project meaning `code` has been building comp-led; report the exact value. The unset finding fires only where a project has done direction work and never recorded a preference, and the offer belongs in it only when image generation exists in your tool surface. Without image generation there is nothing to choose and nothing to say.
|
||||
- Use the `workspaces` table to show the user which apps carry their own context, which inherit, and which have none, before proposing any change.
|
||||
|
||||
## Opting out of the boot check
|
||||
+6
-6
@@ -46,7 +46,7 @@ Done when you hold an action from the vocabulary (asked for, when the request na
|
||||
- **No browser tool** (Codex, others): run the start command with `--open --wait-for-browser 120000`; it opens the system browser, and the longer wait covers the user finding the tab. **`browser_open_failed` back**: tell the user the `url` in one line and rerun with `--wait-for-browser 120000`.
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-generate --target src/App.jsx --dev-url http://127.0.0.1:5173/ --selector ".pricing-grid" --action bolder --count 3 --boot --wait-for-browser 60000
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-generate --target src/App.jsx --dev-url http://127.0.0.1:5173/ --selector ".pricing-grid" --action bolder --count 3 --boot --wait-for-browser 60000
|
||||
```
|
||||
|
||||
Run it in the foreground in Cursor and Claude Code (it returns within the wait); on Codex, in an exec you yield from, the way Step 3 runs the poll.
|
||||
@@ -63,7 +63,7 @@ Read the output in this order: `boot` (or `boot.contextMissing` with `boot.conte
|
||||
- **`dev_server_gone`**: the dev server stopped answering while the command waited for the page (on Cursor, a server another chat started dies with that chat). Start it the way the verdict says, then rerun with `--dev-url <url>`.
|
||||
- **`no_match`**: the tab is on a route that does not render the element (navigate to the right route, rerun), or the selector is wrong (derive a better one from the source, or add `--text`).
|
||||
- **`config_missing` / `config_invalid`** under `bootError`: follow [live-setup.md](live-setup.md) first, then rerun.
|
||||
- **`event: null`** with `ok: true`: the event was slower than the wait; run `.opencode/skills/impeccable/scripts/impeccable live-poll` once to collect it, then continue.
|
||||
- **`event: null`** with `ok: true`: the event was slower than the wait; run `~/.omo/agent/skills/impeccable/scripts/impeccable live-poll` once to collect it, then continue.
|
||||
|
||||
Done when the output shows `ok: true`, a `sessionId`, and an `event`, reached with at most one server started and one tab opened by you.
|
||||
|
||||
@@ -74,7 +74,7 @@ The event is a standard `generate` event: the picked element's context, a prefli
|
||||
**Reply and wait in one call**, with the file you wrote:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID done --file src/App.jsx --then-poll
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID done --file src/App.jsx --then-poll
|
||||
```
|
||||
|
||||
This replies done (the browser mounts the variants) and then blocks until the user's choice arrives, so run it the way your harness runs a long wait: **Claude Code** in the foreground with your tool's longest timeout (600000 ms), so you are paused until the choice arrives; **Codex** in a yielded foreground exec; **Cursor** in a background terminal with notify on `"type":"(accept|discard|variant_mount_failed|exit)"`. Never pass a short `--timeout=`. While it runs there is nothing else to do: never sleep and never poll its output on a timer; a harness that backgrounds it wakes you when it returns. `{"type":"timeout"}` means the user has not chosen yet: run `live-poll` again and keep waiting. If the edit fails after the browser flipped to GENERATING, `--reply EVENT_ID error "Short reason"` (without `--then-poll`) so the bar resets.
|
||||
@@ -85,17 +85,17 @@ Outside the replace path, read the matching live.md section before acting: `scaf
|
||||
|
||||
## Step 4: Accept and close
|
||||
|
||||
The call from Step 3 returns the user's choice. **`discard`**: nothing to do. **`accept`**: `_acceptResult.carbonize: true` is the normal case, and the cleanup is live.md's **Required after accept**, unchanged: move the accepted variant's rules into the stylesheet that already owns the element with real selectors, bake the chosen knob values in, unwrap the element and drop every `data-impeccable-*` attribute, delete the inline `<style>` block and both `impeccable-carbonize` markers, then `.opencode/skills/impeccable/scripts/impeccable live-complete --id SESSION_ID` and confirm `phase: "completed"`. (`baked: true` appears only when the accept was run with `--bake`; then the helper already made the variant permanent and no `live-complete` is owed.)
|
||||
The call from Step 3 returns the user's choice. **`discard`**: nothing to do. **`accept`**: `_acceptResult.carbonize: true` is the normal case, and the cleanup is live.md's **Required after accept**, unchanged: move the accepted variant's rules into the stylesheet that already owns the element with real selectors, bake the chosen knob values in, unwrap the element and drop every `data-impeccable-*` attribute, delete the inline `<style>` block and both `impeccable-carbonize` markers, then `~/.omo/agent/skills/impeccable/scripts/impeccable live-complete --id SESSION_ID` and confirm `phase: "completed"`. (`baked: true` appears only when the accept was run with `--bake`; then the helper already made the variant permanent and no `live-complete` is owed.)
|
||||
|
||||
Close without being asked, the moment the choice is handled:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-server stop
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-server stop
|
||||
```
|
||||
|
||||
Stopping removes the injected script and reloads the page once: the user sees the accepted design with no overlay chrome, still served by their dev server. **Never kill or restart the dev server**, including one you started in Step 2.
|
||||
|
||||
- **The user asks for more variants before you closed**: skip the close, run Step 2 again for the next element (the helper is reused), and close after the last choice.
|
||||
- **Interrupted or unsure of the state**: `.opencode/skills/impeccable/scripts/impeccable live-status`, then `live-resume`; the journal under `.impeccable/live/sessions/` is canonical.
|
||||
- **Interrupted or unsure of the state**: `~/.omo/agent/skills/impeccable/scripts/impeccable live-status`, then `live-resume`; the journal under `.impeccable/live/sessions/` is canonical.
|
||||
|
||||
Done when the helper is stopped and the dev site still answers with the accepted design.
|
||||
+11
-9
@@ -4,7 +4,7 @@ Manage the **design detector hook** for the current project.
|
||||
|
||||
The hook runs the impeccable design detector on direct file edits to design-relevant files (`.tsx`, `.jsx`, `.html`, `.vue`, `.svelte`, `.astro`, `.css`, `.scss`, `.sass`, `.less`, `.ts`, `.js`). Claude Code, Codex, and GitHub Copilot use a post-tool-use hook and push a short system reminder into the agent's context after the edit; findings get a correction prompt, pending issues get a re-nudge, and clean UI-ish files get a short ack unless quiet mode is on (`hook.quiet` in config). Plain `.ts` and `.js` files are still scanned, but stay quiet unless the detector finds something. Cursor uses `preToolUse` to block bad proposed writes before they land and stays silent when it allows a clean write. Grok Build fires the same PostToolUse scan to mark touched files, then surfaces findings on Stop `additionalContext`. Do not expect a Grok per-edit reminder: Grok discards that stdout.
|
||||
|
||||
The detector rules run in two tiers. The per-edit hook surfaces only the immediate tier: mechanical, unambiguous problems worth interrupting an edit for, such as broken images, overflowing or clipped content, contrast and legibility failures, gradient text, glow shadows, and design-system drift. Everything else (copy cadence, palette and typography taste, layout rhythm) is deferred to a deep pass on the `Stop` hook event, which runs the full rule set over every UI file touched in the session and surfaces the remaining findings once, deduplicated against what the per-edit pass already reported. A session with nothing left to report stops silently. Set `hook.perEditRules` to `"all"` in `.impeccable/config.json` to restore the full rule set on every edit. The Stop deep pass is wired for Claude Code, Codex, and Grok Build, which dispatch a native `Stop` hook event. Cursor does not get one (its stop hook is not consistently dispatched; the pre-write gate covers it), and GitHub Copilot's stop-style events do not feed context back to the model, so they keep the full detector per edit. Grok also fires an observe-only Stop with `reason: "shutdown"` after `end_turn`; skip that one, scan only `end_turn`.
|
||||
The detector rules run in two tiers. The per-edit hook surfaces only the immediate tier: mechanical, unambiguous problems worth interrupting an edit for, such as broken images, overflowing content, contrast and legibility failures, gradient text, glow shadows, and design-system drift. Everything else (copy cadence, palette and typography taste, layout rhythm) is deferred to a deep pass on the `Stop` hook event, which runs the full rule set over every UI file touched in the session and surfaces the remaining findings once, deduplicated against what the per-edit pass already reported. A session with nothing left to report stops silently. Set `hook.perEditRules` to `"all"` in `.impeccable/config.json` to restore the full rule set on every edit. The Stop deep pass is wired for Claude Code, Codex, and Grok Build, which dispatch a native `Stop` hook event. Cursor does not get one (its stop hook is not consistently dispatched; the pre-write gate covers it), and GitHub Copilot's stop-style events do not feed context back to the model, so they keep the full detector per edit. Grok also fires an observe-only Stop with `reason: "shutdown"` after `end_turn`; skip that one, scan only `end_turn`.
|
||||
|
||||
Every hook is a mechanical pass. The reflexes no scanner catches live in [craft-floor.md](craft-floor.md), which the skill loads before it edits UI, so they apply whether or not a hook is wired. A session with no automatic hook gets one `MANUAL_DETECTOR_REQUIRED` directive from `impeccable context` asking for a single detector run at the end.
|
||||
|
||||
@@ -14,10 +14,12 @@ Declare server-side template extensions under **`detector.extensions`** when the
|
||||
|
||||
Manual `npx impeccable detect` scans use the same project filter config by default: `detector.ignoreRules`, `detector.ignoreFiles`, `detector.ignoreValues`, and `detector.designSystem.enabled`. `hook.enabled` only controls automatic hook execution, not manual CLI scans. Use `npx impeccable detect --no-config ...` for a raw detector run that ignores project config/context. Use `npx impeccable ignores ...` for direct CLI CRUD on the same detector ignores.
|
||||
|
||||
Supported harnesses: Claude Code (`.claude/settings.local.json` in the project, which is gitignored so the hook stays machine-local; a hook you move into the shared `settings.json` is honored in place too), Codex (`.codex/hooks.json` in the project), Cursor (`.cursor/hooks.json` in the project), Grok Build (`.grok/hooks/impeccable.json` in the project; requires `/hooks-trust` or `--trust`), and GitHub Copilot (`.github/hooks/impeccable.json` in the project, a team-shared committed file that both the Copilot CLI and the cloud agent read). For the Copilot CLI, repo-level hooks fire once `.github/hooks/impeccable.json` is committed to the repository's default branch.
|
||||
Supported harnesses: Claude Code (`.claude/settings.local.json` for a project-scope install; `~/.claude/settings.json` for a user-scope install; a project hook moved into shared `.claude/settings.json` is honored in place too), Codex (`.codex/hooks.json` in the project), Cursor (`.cursor/hooks.json` in the project), Grok Build (`.grok/hooks/impeccable.json` in the project; requires `/hooks-trust` or `--trust`), and GitHub Copilot (`.github/hooks/impeccable.json` in the project, a team-shared committed file that both the Copilot CLI and the cloud agent read). For the Copilot CLI, repo-level hooks fire once `.github/hooks/impeccable.json` is committed to the repository's default branch.
|
||||
|
||||
On **Cursor**, `preToolUse` checks proposed Write/Edit/Shell write content and denies only when the real detector finds an issue. The denial message is visible to the agent as the tool error, so the agent can reconsider before the bad write lands.
|
||||
|
||||
Gemini installs session and completion hooks in `.gemini/settings.json`, merged into the settings already there (comments are tolerated; a commented file is backed up to `settings.json.bak` before the rewrite, and a file that is not valid JSON is left alone). It does not install a per-edit detector hook. The `BeforeTool` hook only rewrites shell commands that run `build-phase`, and only on macOS and Linux; on Windows (where Gemini runs hooks through PowerShell) no session id reaches the shell, so a comp build is not tied to the session and the completion reminder stays silent.
|
||||
|
||||
## Routing
|
||||
|
||||
The first argument is the action. Defaults to `status`.
|
||||
@@ -40,7 +42,7 @@ The first argument is the action. Defaults to `status`.
|
||||
2. Invoke the admin script and pass the user's output through verbatim:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable hooks <action> [args...]
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable hooks <action> [args...]
|
||||
```
|
||||
|
||||
3. If `<action>` is `off`, follow up with a one-line note: "Done. New edits will not trigger the design hook in this project until you run `/impeccable hooks on`."
|
||||
@@ -70,32 +72,32 @@ Prefer the narrowest exception:
|
||||
Example value-specific exception:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable hooks ignore-value overused-font Inter --shared --reason "User confirmed Inter is intentional"
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable hooks ignore-value overused-font Inter --shared --reason "User confirmed Inter is intentional"
|
||||
```
|
||||
|
||||
Example self-served exception, with the evidence named:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable hooks ignore-value bounce-easing bounce-ball --shared --reason "Agent: literal ball-bounce animation, bounce easing is the subject"
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable hooks ignore-value bounce-easing bounce-ball --shared --reason "Agent: literal ball-bounce animation, bounce easing is the subject"
|
||||
```
|
||||
|
||||
Example whole-rule font exception:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable hooks ignore-rule overused-font --all-values --reason "User asked to ignore overused fonts generally"
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable hooks ignore-rule overused-font --all-values --reason "User asked to ignore overused fonts generally"
|
||||
```
|
||||
|
||||
Example one-rule-in-one-file exception, for a file that is still worth reviewing
|
||||
for everything else:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable hooks ignore-value design-system-font-size "*" --file "src/overlay/widget.js" --reason "Injected widget builds its own type scale; DESIGN.md's ramp describes the site"
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable hooks ignore-value design-system-font-size "*" --file "src/overlay/widget.js" --reason "Injected widget builds its own type scale; DESIGN.md's ramp describes the site"
|
||||
```
|
||||
|
||||
Example whole-file exception, for a file that is out of scope entirely:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable hooks ignore-file "src/legacy/Card.tsx"
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable hooks ignore-file "src/legacy/Card.tsx"
|
||||
```
|
||||
|
||||
## Constraints
|
||||
@@ -103,7 +105,7 @@ Example whole-file exception, for a file that is out of scope entirely:
|
||||
- Never modify `.impeccable/config.json` or `.impeccable/config.local.json` by hand from this command. Always go through `impeccable hooks` so writes stay validated and the file shape stays consistent. One exception: `detector.extensions` has no admin action, so when the user asks to cover a template stack, edit that one field in `.impeccable/config.json` directly and leave the rest of the file untouched.
|
||||
- Do not edit the launcher or the binary behind `impeccable hook` and `impeccable hook-before-edit` from this flow. Those are skill plumbing.
|
||||
- Cursor can block a proposed write when the detector finds a real issue. Claude Code, Codex, and GitHub Copilot do not block the edit; they emit a post-edit reminder instead. Disabling stops both blocking and reminders.
|
||||
- The hook is bundled with the Impeccable skill and installed through project-local manifests: `.claude/settings.local.json`, `.codex/hooks.json`, `.cursor/hooks.json`, and `.github/hooks/impeccable.json`. On Codex, the user must approve the hook via `/hooks` the first time. On Cursor, confirm hooks are enabled under Settings -> Hooks. On GitHub Copilot, the CLI loads `.github/hooks/impeccable.json` once it is committed to the repository's default branch, and the cloud agent reads it from the repo directly.
|
||||
- The hook is bundled with the Impeccable skill. Project installs use `.claude/settings.local.json`, `.codex/hooks.json`, `.cursor/hooks.json`, `.github/hooks/impeccable.json`, and `.gemini/settings.json`; a user-scope Claude install uses `~/.claude/settings.json`. On Codex, the user must approve the hook via `/hooks` the first time. On Cursor, confirm hooks are enabled under Settings -> Hooks. On GitHub Copilot, the CLI loads `.github/hooks/impeccable.json` once it is committed to the repository's default branch, and the cloud agent reads it from the repo directly.
|
||||
|
||||
## Failure modes
|
||||
|
||||
+2
-2
@@ -109,9 +109,9 @@ Before loading new-work or resuming shape/build, verify that PRODUCT.md exists a
|
||||
|
||||
## Step 5: Record workflow defaults
|
||||
|
||||
When image generation is available and no `buildPath` is recorded yet, ask once how new surfaces should be built. Availability means a harness-native image tool or the API fallback that `impeccable context` reports as `IMAGE_GEN_AVAILABLE`, and the first of those leaves no trace in the boot output: `impeccable context` only sees the key, so a silent boot on a harness that generates images is not evidence there is nothing to ask about. This is its own question, never a clause riding inside another one. The stack round asks what to build with; this asks how the building starts, and an answer to the first carries no consent about the second. State the trade in the question the user actually reads, because the two names mean nothing to someone meeting them for the first time: **comp-first** (an image sets the bar before any code; bolder composition, slower, and the build must match the image) or **code-first** (build directly; the ambition is written into the direction contract and audited at the finish; leaner, faster).
|
||||
When image generation is available and no `buildPath` is recorded yet, ask once how new surfaces should be built. Availability means a harness-native image tool or the API fallback that `impeccable context` reports as `IMAGE_GEN_AVAILABLE`, and the first of those leaves no trace in the boot output: `impeccable context` only sees the key, so a silent boot on a harness that generates images is not evidence there is nothing to ask about. This is its own question, never a clause riding inside another one. The stack round asks what to build with; this asks how the building starts, and an answer to the first carries no consent about the second. State the trade in the question the user actually reads, because the two names mean nothing to someone meeting them for the first time: **comp-first** (an image sets the bar before any code; bolder composition, slower, and the build must match the image) or **code-first** (build directly; the ambition is written into the direction contract and audited at the finish; leaner, faster). Say in the same question what the choice covers: landing pages and showcase surfaces. App screens and documents are built code-first either way.
|
||||
|
||||
Write the answer to `.impeccable/config.json` as `"buildPath": "comp"` or `"buildPath": "code"`, merging with the keys already there. Write only the value the user chose. A recommendation you made is not an answer you received, and a value taken from silence is a standing default nobody set: it then rides every future round in the project, which is the opposite of asking once. When the question goes unanswered, record nothing and say in one line which path this session is taking and that it is not stored. That path is comp-first, the default new-work applies wherever image generation exists and nothing is recorded; name it rather than choosing a quieter one, because a silent default invented here is the same failure as a value written without an answer. Unset is a working state, not a gap: the decision page's toggle governs each session, and new-work's one-time offer records the answer the first time the user flips it. The config is the only place this lives. It is a workflow setting, not product truth, so it never joins `## Stack` or any other PRODUCT.md section, where a second copy would outlive the setting and steer rounds nobody could trace back to it.
|
||||
Write the answer to `.impeccable/config.json` as `"buildPath": "comp"` or `"buildPath": "code"`, merging with the keys already there. Write only the value the user chose. A recommendation you made is not an answer you received, and a value taken from silence is a standing default nobody set: it then rides every future round in the project, which is the opposite of asking once. When the question goes unanswered, record nothing and say in one line which path this session is taking and that it is not stored. That path is comp-first on a landing page or showcase surface, the default new-work applies wherever image generation exists and nothing is recorded, and code-first on an app screen or document; name it rather than choosing a quieter one, because a silent default invented here is the same failure as a value written without an answer. Unset is a working state, not a gap: the decision page's toggle governs each session, and new-work's one-time offer records the answer the first time the user flips it. The config is the only place this lives. It is a workflow setting, not product truth, so it never joins `## Stack` or any other PRODUCT.md section, where a second copy would outlive the setting and steer rounds nobody could trace back to it.
|
||||
|
||||
A value already recorded in `.impeccable/config.json` or the gitignored `.impeccable/config.local.json` is a confirmed answer: on a re-run, honor it in silence rather than asking again. This is a default, not a lock: the decision page renders a toggle whose flip binds a single session and is never written back. Without image generation there is no choice to record; code-first is the only path.
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ When a sub-agent tool is available and permitted, run these independently; other
|
||||
2. **Mechanical scan:** run:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable detect --json --scope layout [target files or dirs]
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable detect --json --scope layout [target files or dirs]
|
||||
```
|
||||
|
||||
Also inspect arbitrary spacing, overflow, stacking, and container behavior the detector cannot resolve. Keep mechanical evidence out of the first assessment, then synthesize both passes before editing. A clean scan cannot prove hierarchy or rhythm.
|
||||
+1
-1
@@ -47,7 +47,7 @@ Keep all allowances below development-only, including manual middleware and meta
|
||||
If `config.cspChecked === true`, skip this whole section; the user was already asked once.
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable detect-csp
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable detect-csp
|
||||
```
|
||||
|
||||
Output `{ shape, signals }`; the shape names the *patch mechanism*, so one template covers many frameworks:
|
||||
+14
-14
@@ -4,13 +4,13 @@ Interactive live variant mode: select elements in the browser, pick a design act
|
||||
|
||||
A running dev server with HMR (Vite, Next.js, Bun, etc.), OR a static HTML file open in the browser. If the dev server's default port is busy, the app is very likely ALREADY running; probe the default URL before spawning a second server.
|
||||
|
||||
Live editing requires a local checkout; injection into deployed production sites (including HTTPS) is unsupported. For production inspection, use `.opencode/skills/impeccable/scripts/impeccable detect <url>` or the browser extension, not the live helper. Do not disable browser security or weaken production CSP to enable live mode.
|
||||
Live editing requires a local checkout; injection into deployed production sites (including HTTPS) is unsupported. For production inspection, use `~/.omo/agent/skills/impeccable/scripts/impeccable detect <url>` or the browser extension, not the live helper. Do not disable browser security or weaken production CSP to enable live mode.
|
||||
|
||||
## The contract (read once)
|
||||
|
||||
Execute in order. No step skipped, no step reordered. Every tool output in live mode may carry an `_instructions` field: it is the authoritative next step for that exact situation, with real ids and paths substituted; when it conflicts with your recollection of this document, `_instructions` wins.
|
||||
|
||||
1. `impeccable live`: boot. If the request names or implies a file, route, or app inside a monorepo, infer the concrete path and run `.opencode/skills/impeccable/scripts/impeccable live --target <path>` instead; then run the rest of this live session from the returned `projectRoot`. The boot resolves the app root from dev-server config files and persists it in `.impeccable/live/roots.json`; every helper re-anchors to that manifest at startup (a wrong cwd cannot fork session state), PRODUCT.md / DESIGN.md are discovered upward to the git root, and relative helper args like `--file` resolve against the app root.
|
||||
1. `impeccable live`: boot. If the request names or implies a file, route, or app inside a monorepo, infer the concrete path and run `~/.omo/agent/skills/impeccable/scripts/impeccable live --target <path>` instead; then run the rest of this live session from the returned `projectRoot`. The boot resolves the app root from dev-server config files and persists it in `.impeccable/live/roots.json`; every helper re-anchors to that manifest at startup (a wrong cwd cannot fork session state), PRODUCT.md / DESIGN.md are discovered upward to the git root, and relative helper args like `--file` resolve against the app root.
|
||||
2. Open the app URL that serves `pageFile` (infer from `package.json`, docs, terminal output, or an open tab). Never use `serverPort`; it's the helper, not the app. **Cursor:** `browser_navigate` to that URL before polling; do not skip. **Other harnesses:** use the available browser tool; if the URL is uncertain, ask the user once.
|
||||
3. Poll loop with the default long timeout (600000 ms). Run `impeccable live-poll` again immediately after every event or `--reply`; Codex runs this one-shot poll in the foreground. Never pass a short `--timeout=`. The global bar's **Impeccable mark** dims with a pulsing amber dot when nothing is polling `/poll`; restart `impeccable live-poll` to reconnect.
|
||||
4. On `generate`: reuse `event.scaffold` when present; read the screenshot if present; load the action's reference; deliver variants; `--reply done`; poll again. Generate in this thread: you already hold the project's tokens and layout. The overlay preview IS the verification channel; do not screenshot, re-render, or QA variants between generate and accept. Apply craft-floor's contrast, spacing, and type floors by construction as you write; full verification runs once at accept on the chosen variant.
|
||||
@@ -33,7 +33,7 @@ Chat is overhead. No recap, no tutorial output, no pasting PRODUCT / DESIGN bodi
|
||||
|
||||
```
|
||||
LOOP:
|
||||
.opencode/skills/impeccable/scripts/impeccable live-poll # default long timeout; no --timeout=
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-poll # default long timeout; no --timeout=
|
||||
Read JSON; dispatch on "type"
|
||||
|
||||
"generate" → Handle Generate; reply done; LOOP
|
||||
@@ -54,7 +54,7 @@ LOOP:
|
||||
## Start
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live
|
||||
```
|
||||
|
||||
Output JSON: `{ ok, serverPort, serverToken, pageFiles, roots, hasProduct, product, productPath, hasDesign, design, designPath, hasSurfaceBrief, surfaceBrief }`. `roots` is the resolved root manifest; `projectRoot` mirrors `roots.appRoot`. The surface brief rides along; do not shell out to `impeccable surface-brief` separately. Precedence for generation: **DESIGN.md wins on visual decisions; PRODUCT.md wins on durable product and voice decisions; the surface brief wins on this surface's strategy.** When DESIGN.md is missing, identity is **not** absent; extract it from CSS variables, computed styles, and sibling components (Step 4 Phase A). Identity preservation is the default; departure requires the user's explicit redesign intent.
|
||||
@@ -68,9 +68,9 @@ If output is `{ ok: false, error: "config_missing" | "config_invalid", path }`,
|
||||
The append-only journal under `.impeccable/live/sessions/` is canonical durable state (not project source). When the chat was interrupted, polling was missed, the helper restarted, or the browser reloaded:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-status # helper state, active sessions, queued events; works with the helper down
|
||||
.opencode/skills/impeccable/scripts/impeccable live-resume --id SESSION_ID # active snapshot, pending event, next safe action
|
||||
.opencode/skills/impeccable/scripts/impeccable live-complete --id SESSION_ID # canonical manual final acknowledgement after verified cleanup
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-status # helper state, active sessions, queued events; works with the helper down
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-resume --id SESSION_ID # active snapshot, pending event, next safe action
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-complete --id SESSION_ID # canonical manual final acknowledgement after verified cleanup
|
||||
```
|
||||
|
||||
Server restart rule: start `impeccable live-server` again, then poll; startup requeues unacknowledged events, so never ask the user to click Go again unless `impeccable live-resume` says no active session exists.
|
||||
@@ -89,7 +89,7 @@ Speed matters; the user is watching the selected element. Reuse preflight metada
|
||||
2. If `event.scaffold` is present, use it and do **not** run the helper again. Otherwise:
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-insert --id EVENT_ID --count EVENT_COUNT --position after \
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-insert --id EVENT_ID --count EVENT_COUNT --position after \
|
||||
--element-id "ANCHOR_ID" --classes "class1,class2" --tag "section" --text "ANCHOR_TEXT"
|
||||
```
|
||||
|
||||
@@ -110,7 +110,7 @@ When `event.scaffold` is present, the helper already found the source and comput
|
||||
**On source-preview targets `event.scaffold` carries `sourceWritten: false`.** The helper did NOT write the wrapper; it hands you `scaffold.wrapperBlock` plus the picked element's source range (`replaceStartLine`, `replaceEndLine`, 1-indexed). Write the wrapper **and** all variants in ONE edit: splice your variants into `wrapperBlock` at the "Variants: insert below this line" marker, then replace lines `[replaceStartLine, replaceEndLine]` with the result. A separate scaffold write reloads the framework before your variant write lands and strands the browser at 0/N. (`replaceEndLine < replaceStartLine` means insert mode: insert, remove nothing.) The `svelte-component` path never sets `sourceWritten`.
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-wrap --id EVENT_ID --count EVENT_COUNT --element-id "ELEMENT_ID" --classes "class1,class2" --tag "div" --text "TEXT_SNIPPET"
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-wrap --id EVENT_ID --count EVENT_COUNT --element-id "ELEMENT_ID" --classes "class1,class2" --tag "div" --text "TEXT_SNIPPET"
|
||||
```
|
||||
|
||||
Flag mapping (keep separate, never collapse into `--query`): `--element-id` ← `event.element.id`; `--classes` ← classes joined with commas; `--tag` ← tagName; `--text` ← first ~80 chars of textContent, **every call**: it disambiguates repeated sibling components, without it wrap lands on the first match. If `event.pageUrl` implies the file, pass `--file PATH`. If `--text` still matches several candidates, wrap exits `{ error: "element_ambiguous", candidates, fallback: "agent-driven" }`: pick the right range from page context and write the wrapper manually per the fallback flow.
|
||||
@@ -242,14 +242,14 @@ Three kinds: `range` (slider; drives `--p-<id>`; author `var(--p-color-amount, 0
|
||||
### 8. Signal done
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID done --file RELATIVE_PATH
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID done --file RELATIVE_PATH
|
||||
```
|
||||
|
||||
`RELATIVE_PATH` is relative to project root; the browser fetches source directly if the dev server lacks HMR. Then poll again immediately.
|
||||
|
||||
### Aborting an in-flight session
|
||||
|
||||
If wrap or generation fails after the browser flipped to GENERATING, tell the **browser** so its bar resets: `.opencode/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID error "Short reason"`. Never use `live-accept --discard` for this (pure file mutator, browser never sees it, bar sticks on dots); `--discard` is only source-side cleanup for a discard the browser itself initiated.
|
||||
If wrap or generation fails after the browser flipped to GENERATING, tell the **browser** so its bar resets: `~/.omo/agent/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID error "Short reason"`. Never use `live-accept --discard` for this (pure file mutator, browser never sees it, bar sticks on dots); `--discard` is only source-side cleanup for a discard the browser itself initiated.
|
||||
|
||||
## Handle fallback
|
||||
|
||||
@@ -290,7 +290,7 @@ Event: `{id, _acceptResult, _completionAck}`. The poll script already restored t
|
||||
|
||||
## Handle `steer`
|
||||
|
||||
Event: `{id, message, pageUrl}`: page-level direction from the global bar's Steer control (typed or spoken), no element context, no variant cycling. Read `message`, inspect the page or files as needed, make edits or answer in prose. Reply `.opencode/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID steer_done ["Optional short toast"]`, or on failure `--reply EVENT_ID error "Short reason"`, then poll immediately. No separate pickup reply; the Steer bar unlocks on `steer_done` or `error`.
|
||||
Event: `{id, message, pageUrl}`: page-level direction from the global bar's Steer control (typed or spoken), no element context, no variant cycling. Read `message`, inspect the page or files as needed, make edits or answer in prose. Reply `~/.omo/agent/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID steer_done ["Optional short toast"]`, or on failure `--reply EVENT_ID error "Short reason"`, then poll immediately. No separate pickup reply; the Steer bar unlocks on `steer_done` or `error`.
|
||||
|
||||
## Handle `prefetch`
|
||||
|
||||
@@ -306,7 +306,7 @@ When native subagents are available, delegate source edits to `impeccable_manual
|
||||
|
||||
If `repair` is present, the previous Apply changed source but final validation failed. Fix the current source and return the same canonical JSON result; do not roll files back yourself. The browser will ask the user before any rollback.
|
||||
|
||||
After source edits finish, reply exactly once with `.opencode/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID done --data '{"status":"done","appliedEntryIds":["8hexid"],"failed":[],"files":["src/page.html"],"notes":[]}'`. Use `status:"partial"` or `status:"error"` with `failed[]` when not every entry applied. Then poll again. Never reply without the event id; `--reply done --file ...` is invalid for manual Apply.
|
||||
After source edits finish, reply exactly once with `~/.omo/agent/skills/impeccable/scripts/impeccable live-poll --reply EVENT_ID done --data '{"status":"done","appliedEntryIds":["8hexid"],"failed":[],"files":["src/page.html"],"notes":[]}'`. Use `status:"partial"` or `status:"error"` with `failed[]` when not every entry applied. Then poll again. Never reply without the event id; `--reply done --file ...` is invalid for manual Apply.
|
||||
|
||||
## Exit
|
||||
|
||||
@@ -315,7 +315,7 @@ The user stops live mode by saying so in chat, closing the tab (SSE drops; poll
|
||||
## Cleanup
|
||||
|
||||
```bash
|
||||
.opencode/skills/impeccable/scripts/impeccable live-server stop
|
||||
~/.omo/agent/skills/impeccable/scripts/impeccable live-server stop
|
||||
```
|
||||
|
||||
Stops the helper and runs `impeccable live-inject --remove` to strip the injected script (use `stop --keep-inject` to keep it for a quick restart; `.impeccable/live/config.json` persists as project config). Then search for and remove any leftover `impeccable-variants-start` wrappers and `impeccable-carbonize-start` blocks.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user