| name | campaign-copy-workflow |
| description | Generate the complete Phase 2 of any web reveal campaign — static email bodies + a body-aware Clay research prompt for personalization variables. Ensures bodies and research prompt stay in sync. Use when the user types /campaigncopy <partner> or asks to build campaign copy for a partner. |
Campaign Copy Workflow
Generate a complete outbound email campaign package: static email bodies (for Instantly or HeyReach) plus a Clay-compatible personalization research prompt that embeds those bodies and produces merge variables that read naturally in context.
Trigger
/campaigncopy <partner> (e.g., /campaigncopy acme-consulting)
- "campaign copy workflow acme-consulting"
- "build campaign copy for [partner]"
Prerequisites
The partner must already have Phase 1 research in place:
clients/partner/<partner>/research/icp.md — target accounts, verticals, qualification criteria
clients/partner/<partner>/research/personas.md — buyer tiers and titles
clients/partner/<partner>/prompts/signal-retrieval.md — pain signals and enrichment signals
If any are missing, tell the user to run /webreveal <partner> or /partneronboard <partner> first.
Workflow
Step 1: Load Partner Context
Read these files to understand the partner's positioning, ICP, and pain signals:
clients/partner/<partner>/SKILL.md
clients/partner/<partner>/research/icp.md
clients/partner/<partner>/research/personas.md
clients/partner/<partner>/prompts/signal-retrieval.md
Step 2: Confirm Campaign Parameters
Ask the user:
- Campaign type: 2-message email (default), 3-email sequence, LinkedIn DM sequence, or custom
- Sending platform: Instantly (default), HeyReach, or other
- Target persona tier: Which tier(s) from personas.md to optimize for (default: primary outreach tiers)
- Sender name: Who signs the emails (default: Shawn)
- Any specific angles or constraints: e.g., "focus on cloud migration only" or "ServiceNow displacement angle"
Step 3: Write Static Email Bodies
Create/overwrite clients/partner/<partner>/prompts/campaign-copy.md with:
- Header with status, merge fields, variable source, and campaign metadata
- Each email in a code block with subject line and body, containing merge field placeholders
- Copy notes section documenting voice rules and variable sourcing
Voice rules (from .cursor/skills/email-copy/SKILL.md):
- Contractions, short sentences, fragments okay
- No spam triggers (leverage, synergize, cutting-edge, revolutionary, game-changer)
- No quotation marks around brand/service names
- Human tone — "Happy to send over" not "I would be pleased to furnish"
- No "Hope this finds you well" or generic openers
Merge field convention:
{first_name}, {company_name} — from Clay enrichment data
{icebreaker}, {pain_point} — generated by Clay research prompt
- Additional variables only if the campaign type requires them
Email structure (2-message default):
- Email 1 (Day 0): Opens with
{icebreaker} — specific, personal. Then poke the bear — calls out a known-but-unspoken problem. Value offer up front (teardown, breakdown, or insight). CTA is a quick call, not passive.
- Email 2 (Day 3): Brief callback.
{pain_point} as standalone paragraph — company-specific observation. Light partner positioning (proof points). CTA is a quick call with low-risk framing.
Step 4: Generate Body-Aware Research Prompt
Create/overwrite clients/partner/<partner>/prompts/personalization-research.md with a Clay-compatible prompt that:
- Embeds the full email body text from Step 3 — so the AI understands exactly where each variable appears and crafts them to read naturally in context
- Includes partner service categories and pain signals from the research files
- Defines strict rules for each variable with good/bad examples
- Outputs JSON array per prompt-formatting standard
- Places inputs at the bottom per
.cursor/rules/prompt-formatting.md
Data hierarchy — the prompt must instruct the AI to prioritize data sources in this order:
- LinkedIn profile (about, headline, experience, skills) — best for icebreaker personalization
- Company domain / tech stack — best for pain point signals
- Title + industry + size inference — fallback only, flag confidence as Low
The agent searches the LinkedIn profile for personalization hooks. If the profile is thin, it falls back to domain-level signals. If domain gives nothing useful, it uses role-based inference and flags it for manual review.
Prompt size discipline — keep the prompt tight. Every section should earn its place:
- Service categories: one line each, no descriptions unless they add targeting value
- Pain signals: bullet list, no explanations — the AI knows what they mean in context
- Email bodies: include in full (non-negotiable — this is what makes variables fit naturally)
- Variable rules: brief, with 2-3 good examples. Skip bad examples if the good ones are clear enough
- No redundant instructions. If the data hierarchy section already says "don't fabricate," don't repeat it in the variable rules
The research prompt eats Clay's context window per contact. Shorter prompt = better output quality at scale.
Critical: The research prompt and email bodies must always be in sync. If you change a body, regenerate the research prompt so the embedded context matches.
Step 5: Update Partner Skill Tree
After generating both files:
-
Update clients/partner/<partner>/SKILL.md:
- Add
personalization-research.md to the Prompts table if not present
- Update
campaign-copy.md description to reflect the actual campaign type
-
Update clients/partner/<partner>/workflows/campaign-patterns.md:
- Register the new play in the Active Plays section with target persona, trigger, and status
Step 6: Summary
Print a summary for the user:
- Files created/updated
- Merge fields used
- Next steps (paste bodies into Instantly, paste research prompt into Clay, connect Clay → Instantly sync)
File Outputs
| File | Contents |
|---|
clients/partner/<partner>/prompts/campaign-copy.md | Static email bodies with merge field placeholders — paste into sending platform |
clients/partner/<partner>/prompts/personalization-research.md | Clay prompt — generates personalization variables that fit naturally into the bodies |
Sync Rule
The two output files are a coupled pair. If either changes, the other must be regenerated. The research prompt embeds the email bodies as context — stale bodies in the prompt produce variables that don't flow in the actual emails.
When the user asks to update campaign copy, always regenerate both files.