Systems Lab

Agent skill

message-generator

Multi-channel personalized message generation with 3 tiers of personalization

dormantSelf-containedInstructions only1,328 words

Filed under Outbound email.

From ekatasingh1107/b2b-gtm-skills · 99 skills · 2 · pushed 2026-04-11

What it does when it runs

Multi-channel personalized message generation with 3 tiers of personalization

Read from the skill and the 5 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about message-generator

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/ekatasingh1107/b2b-gtm-skills.git /tmp/b2b-gtm-skills
git -C /tmp/b2b-gtm-skills sparse-checkout set "skills/capabilities/message-generator"
mkdir -p ~/.claude/skills/message-generator
cp -R "/tmp/b2b-gtm-skills/skills/capabilities/message-generator/." ~/.claude/skills/message-generator/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from ekatasingh1107/b2b-gtm-skills/blob/eae8dd0bb98da1c8e84abd297066a87015dd860f/skills/capabilities/message-generator/SKILL.md, which is licensed MIT (repository). 1,328 words, 15 headings.

Message Generator

Generates personalized outreach messages across all channels. Supports 3 tiers of personalization, from basic merge fields to fully individualized messages referencing specific signals and research. All tone, rules, and constraints are read from agency.config.json.

Prerequisites

  • agency.config.json at repo root with outreach, services, case_studies, and agency sections
  • Lead data with at minimum: name, company
  • For Tier 2+: ICP segment data (industry, company size)
  • For Tier 3: Output from company-researcher, person-researcher, cro-auditor, or signal-scanner

Phase 0: Intake

  1. Read agency.config.json from the project root.
  2. Extract:
    • agency.name -- the agency name for sign-offs and references
    • agency.domain -- for email domain
    • agency.founder -- for personal sign-offs
    • outreach.tone -- voice/style guide for all messages
    • outreach.banned_phrases -- phrases that must NEVER appear in any message
    • outreach.sign_off -- default sign-off line
    • outreach.cadence -- which message types to send on which day
    • outreach.daily_caps -- per-channel daily limits
    • services[] -- agency's service offerings for value prop
    • case_studies[] -- proof points to reference
  3. Accept parameters:
    • message_type -- one of: cold-email, gig-proposal, community-reply, linkedin-note, instagram-dm, call-script, follow-up-email, breakup-email
    • personalization_tier -- 1, 2, or 3
    • lead -- the lead data object
    • research -- (Tier 3 only) output from researcher skills
    • framework -- (optional) override: PAS, BAB, AIDA, Signal-Proof-Ask
    • cadence_day -- (optional) which day in the cadence sequence

Phase 1: Framework Selection

If no framework is specified, auto-select based on message type and tier:

Message TypeDefault FrameworkNotes
cold-emailSignal-Proof-Ask (Tier 3), PAS (Tier 2), BAB (Tier 1)Lead with signal reference when available
gig-proposalSignal-Proof-AskAlways lead with their specific need
community-replyNone (conversational)Help first, pitch subtly
linkedin-noteBABShort, personal
instagram-dmNone (casual)Ultra-short, visual reference
call-scriptAIDAStructured for verbal delivery
follow-up-emailPASReference previous touchpoint
breakup-emailBABCreate urgency without pressure

Framework definitions:

PAS (Problem-Agitate-Solve):

  1. Name the problem the lead is facing
  2. Amplify the cost of not solving it
  3. Present the agency's service as the solution

BAB (Before-After-Bridge):

  1. Describe their current state
  2. Paint the better future state
  3. Bridge: how the agency gets them there

AIDA (Attention-Interest-Desire-Action):

  1. Hook with a bold statement or stat
  2. Build interest with relevance
  3. Create desire with proof/results
  4. Clear CTA

Signal-Proof-Ask:

  1. Reference the specific signal (their post, job listing, funding, etc.)
  2. Prove credibility with a relevant case study result
  3. Ask one clear question or propose one action

Phase 2: Personalization

Tier 1: Merge Fields Only

For bulk outreach. Replace placeholders with lead data:

  • {{first_name}} -- lead's first name
  • {{company}} -- company name
  • {{agency.name}} -- agency name
  • {{agency.founder}} -- founder name
  • {{sign_off}} -- from config
  • {{case_study.name}} -- case study client name
  • {{case_study.result}} -- case study result line

The message body uses generic industry angles. No lead-specific research.

Tier 2: Segment-Based

Group leads by ICP segment and customize messaging:

  • Industry angle: Reference industry-specific pain points
    • D2C fashion: "Product pages with size guides and lifestyle imagery convert 2x better"
    • Sports/fitness: "Sports brands need trust signals, athlete endorsements front and center"
    • Beauty/skincare: "Skincare brands live or die by before/after proof and ingredient transparency"
  • Company size angle:
    • Early stage (<50): "You're growing fast, your store needs to keep up"
    • Mid-market (50-200): "Your team is stretched thin, outsourcing Shopify work frees your ecomm lead to focus on strategy"
  • Market angle:
    • India: Reference local market dynamics, pricing in INR
    • US/UK/AU: Reference remote team benefits, timezone overlap, cost advantage

Tier 3: Per-Lead (Hyper-Personalized)

Requires research data from company-researcher, person-researcher, cro-auditor, or signal-scanner.

Personalization sources (use all that are available):

  • Signal reference: "I saw your post on Reddit looking for a Shopify developer..."
  • CRO finding: "I checked {{company}}'s product pages, noticed {{specific_issue}}..."
  • Personal interest: "Your recent LinkedIn post about {{topic}} resonated..."
  • Company news: "Congrats on the Series A, perfect time to invest in your storefront..."
  • Tech stack note: "I see you're on {{theme}}, we've migrated several stores from that to..."

Build the opening line from the strongest personalization hook available.

Phase 3: Message Generation

Channel-specific rules:

cold-email:

  • Subject line: max 50 characters, no spam trigger words, personalized when possible
  • Body: max 150 words for Tier 1-2, max 200 words for Tier 3
  • One CTA only (book a call, reply, or view case study)
  • No attachments or links in first email (deliverability)
  • P.S. line optional for Tier 3 (add a personal touch)

gig-proposal:

  • Open with their specific requirement (mirror their language)
  • Show relevant experience in 2-3 bullet points
  • Include timeline and availability
  • Max 250 words
  • End with a question that invites dialogue

community-reply:

  • Help first: answer their question genuinely
  • Subtly mention experience: "We did something similar for a sports brand..."
  • No hard pitch, no links in first reply
  • Match the community's tone (casual for Reddit, professional for Shopify Community)
  • Max 150 words

linkedin-note:

  • Max 300 characters (LinkedIn connection note limit)
  • One personalization point
  • One reason to connect
  • No pitch in the connect note

instagram-dm:

  • Max 100 words
  • Reference something specific from their feed (a product, a post, their aesthetic)
  • Casual, conversational tone
  • No links in first DM

call-script:

  • Opening hook (15 seconds)
  • Qualification questions (3 max)
  • Value prop with case study reference
  • Objection handling notes
  • Close with meeting ask
  • Total talk track: 2-3 minutes

follow-up-email:

  • Reference the previous touchpoint (email, call, LinkedIn)
  • Add new value (a relevant insight, article, or finding)
  • Max 100 words
  • Different CTA than the first email

breakup-email:

  • Acknowledge they're busy
  • Summarize value in one line
  • "If timing isn't right, no worries"
  • Leave the door open
  • Max 75 words

Phase 4: Quality Check

Before returning, verify every generated message:

  1. Banned phrase scan: Check against outreach.banned_phrases. If any match, rewrite the offending sentence.
  2. Word count: Verify within channel limits.
  3. CTA count: Exactly one CTA per message (except call scripts).
  4. Tone check: Re-read against outreach.tone description. Rewrite if it sounds generic, desperate, or salesy.
  5. Spam word check: No "free", "guaranteed", "act now", "limited time", "click here" in emails.

Phase 5: Output

Return structured JSON:

{
  "message_type": "cold-email",
  "personalization_tier": 3,
  "framework": "Signal-Proof-Ask",
  "subject_line": "Your product pages are leaving money on the table",
  "body": "The full message text...",
  "personalization_points": [
    "Referenced their Reddit post about needing Shopify help",
    "Mentioned their missing product reviews (from CRO audit)",
    "Used Kibi Sports case study (same industry)"
  ],
  "cta": "Reply to grab 15 min this week?",
  "word_count": 142,
  "channel_rules_met": true,
  "banned_phrases_clear": true,
  "sign_off": "Ekata | Plasho (plasho.com)",
  "cadence_day": 1,
  "cadence_next": "Day 2: LinkedIn connect"
}

For batch generation, return an array of message objects.

Phase 6: Log

If writing to CRM, use crm-writer to log: lead name, company, channel, message type, tier, subject line, cadence day, generated_at timestamp.

Example Usage

Trigger phrases:

  • "Draft a cold email for this lead"
  • "Write a LinkedIn note for [name]"
  • "Generate outreach messages for these leads"
  • "Write a gig proposal for this Freelancer post"
  • "Create a follow-up email for [company]"
  • "Generate Tier 3 messages using this research"
User: Write a cold email for the founder of BrandX, they just raised a seed round
Assistant: [reads config, selects Signal-Proof-Ask framework, generates Tier 3 email referencing funding news, includes case study, returns structured JSON]
User: Generate Tier 1 cold emails for these 10 leads
Assistant: [reads config, uses BAB framework, applies merge fields only, returns 10 message objects]

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what message-generator does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.