Agent skill
message-generator
Multi-channel personalized message generation with 3 tiers of personalization
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-toolsin the frontmatter. It only issues instructions, so there is nothing to bound. - Actions present in the files
- None. Instructions only.
Install it
View source on GitHub ↗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.
The skill
Source on GitHub ↗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.jsonat repo root withoutreach,services,case_studies, andagencysections- 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, orsignal-scanner
Phase 0: Intake
- Read
agency.config.jsonfrom the project root. - Extract:
agency.name-- the agency name for sign-offs and referencesagency.domain-- for email domainagency.founder-- for personal sign-offsoutreach.tone-- voice/style guide for all messagesoutreach.banned_phrases-- phrases that must NEVER appear in any messageoutreach.sign_off-- default sign-off lineoutreach.cadence-- which message types to send on which dayoutreach.daily_caps-- per-channel daily limitsservices[]-- agency's service offerings for value propcase_studies[]-- proof points to reference
- Accept parameters:
message_type-- one of:cold-email,gig-proposal,community-reply,linkedin-note,instagram-dm,call-script,follow-up-email,breakup-emailpersonalization_tier-- 1, 2, or 3lead-- the lead data objectresearch-- (Tier 3 only) output from researcher skillsframework-- (optional) override:PAS,BAB,AIDA,Signal-Proof-Askcadence_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 Type | Default Framework | Notes |
|---|---|---|
| cold-email | Signal-Proof-Ask (Tier 3), PAS (Tier 2), BAB (Tier 1) | Lead with signal reference when available |
| gig-proposal | Signal-Proof-Ask | Always lead with their specific need |
| community-reply | None (conversational) | Help first, pitch subtly |
| linkedin-note | BAB | Short, personal |
| instagram-dm | None (casual) | Ultra-short, visual reference |
| call-script | AIDA | Structured for verbal delivery |
| follow-up-email | PAS | Reference previous touchpoint |
| breakup-email | BAB | Create urgency without pressure |
Framework definitions:
PAS (Problem-Agitate-Solve):
- Name the problem the lead is facing
- Amplify the cost of not solving it
- Present the agency's service as the solution
BAB (Before-After-Bridge):
- Describe their current state
- Paint the better future state
- Bridge: how the agency gets them there
AIDA (Attention-Interest-Desire-Action):
- Hook with a bold statement or stat
- Build interest with relevance
- Create desire with proof/results
- Clear CTA
Signal-Proof-Ask:
- Reference the specific signal (their post, job listing, funding, etc.)
- Prove credibility with a relevant case study result
- 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:
- Banned phrase scan: Check against
outreach.banned_phrases. If any match, rewrite the offending sentence. - Word count: Verify within channel limits.
- CTA count: Exactly one CTA per message (except call scripts).
- Tone check: Re-read against
outreach.tonedescription. Rewrite if it sounds generic, desperate, or salesy. - 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.
- personalize-message by Othmane-Khadri · 290
- ab-message-testing by louisblythe · 143
- message-deliverability-optimization by louisblythe · 143
- atomic-message by extruct-ai · 107
- message-consistency-check by pmalliance · 64
- positioning-message-house by esmefong · 0
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.