Loading...
Loading...
Execute personalized outreach sequences across channels - email, LinkedIn, multi-touch campaigns with AI-assisted messaging
npx skill4agent add manojbajaj95/gtm-skills gtm-outbound/gtm-prospecting/gtm-icpdata/gtm/prospects/enriched//gtm-prospectingdata/gtm/messaging_framework.json/gtm-icpdata/gtm/project_context.jsondata/gtm/outbound/sequences/data/gtm/response_templates.jsonCLAUDE.md/gtm-lead-capture## Sequence Architecture
### Sequence Types
| Sequence | Target | Channels | Touches | Duration |
|----------|--------|----------|---------|----------|
| **Tier A (Hot)** | Score 70+ | Email + LinkedIn + Call | 6-8 | 21 days |
| **Tier B (Warm)** | Score 50-69 | Email + LinkedIn | 5-6 | 28 days |
| **Tier C (Nurture)** | Score 30-49 | Email only (light) | 3-4 | 45 days |
| **Signal-triggered** | New trigger event | Email + LinkedIn | 4-5 | 14 days |
| **Referral intro** | Warm introduction | Email + LinkedIn | 3-4 | 14 days |
### Touch Timing
| Touch | Day | Channel | Purpose |
|-------|-----|---------|---------|
| 1 | 0 | Email | Intro + hook |
| 2 | 1 | LinkedIn | Connection request + note |
| 3 | 3 | Email | Value-add (content, insight) |
| 4 | 7 | Email | Different angle / case study |
| 5 | 10 | LinkedIn | Engage with their content or DM |
| 6 | 14 | Email | Breakup / final value |
| 7 | 21 | Email | "Saw [trigger]" — only if new signal |
### Channel-Specific Rules
**Email:**
- Keep under 100 words for first touch
- One clear CTA per email
- Personalization in first line (not just {first_name})
- No attachments on first touch
- Plain text performs better than HTML
**LinkedIn:**
- Connection request with note (<300 chars)
- Engage with their content before DMing
- DM only after connected (don't use InMail)
- Reference mutual connections if available
- Don't pitch in connection request
**Phone (Tier A only):**
- Call after 2-3 email opens with no reply
- Have specific reason to call (not just "following up")
- Leave voicemail only once## Message Generation Process
### Step 1: Load Prospect Context
From `/gtm-prospecting` enriched data:
- Company: {companyName}, {industry}, {employees}, {fundingStage}
- Contact: {name}, {title}, {tenure}
- Signals: {recentFunding}, {hiringActivity}, {expansionNews}
- Personalization hooks: {linkedinPost}, {mutualConnection}, {techStack}
- Pain hypothesis: {likelyPain}
- Recommended angle: {messagingAngle}
### Step 2: Select Messaging Framework Elements
From `/gtm-icp` messaging_framework.json:
- Positioning statement for segment
- Relevant value prop
- Risk-based headline
- Proof point / social proof
- Likely objection + preemptive handling
### Step 3: Generate Message Variants
For each touch, generate 2-3 variants:
**Email 1 — Intro (Variant A: Signal hook)**
Subject: {signal} at {companyName}
{First name},
Saw {companyName} {specific signal — funding, expansion, hire}. When {segment} companies hit this stage, {pain statement}.
{1-sentence value prop with proof point}.
Worth a 15-min call to see if this is relevant?
Best,
{sender}
**Email 1 — Intro (Variant B: Pain hook)**
Subject: {pain-related question}
{First name},
{Pain question based on their profile — e.g., "How's your team handling cash visibility across 20+ accounts?"}
{1-sentence value prop with proof point}.
If this resonates, happy to share how {customer name} solved it.
{sender}
### Step 4: Personalization Injection
Before sending, inject:
- Specific company reference (not just name)
- Role-specific pain point
- Personalization hook from enrichment
- Relevant proof point for their segment
### Step 5: Review Queue
All messages go to review queue before sending:
- AI drafts based on template + context
- Founder reviews and approves/edits
- Approved messages queued for send
- Track edits to improve future drafts## Response Classification
| Response Type | Example | SLA | Action |
|---------------|---------|-----|--------|
| **Positive interest** | "Yes, let's talk" | 5 min | Book meeting immediately |
| **Curious but hesitant** | "Tell me more" | 1 hr | Send relevant proof point, soft CTA |
| **Objection** | "We're too small" | Same day | Handle with framework, offer value |
| **Timing objection** | "Not now, try Q3" | Same day | Acknowledge, set reminder, add to nurture |
| **Referral to someone else** | "Talk to our CFO" | 1 hr | Thank them, reach out to referral |
| **Hard no** | "Not interested" | 24 hr | Polite close, preserve relationship |
| **Auto-reply / OOO** | "I'm out until..." | Per timing | Adjust sequence timing |
| **Negative / hostile** | "Stop emailing me" | Immediate | Remove from all sequences, apologize |
## Objection Handling
Map common objections to messaging framework responses:
| Objection | Response Framework |
|-----------|-------------------|
| "We're too small" | Size objection response from messaging_framework.json |
| "Already using [competitor]" | Competitive positioning for that competitor |
| "No budget" | ROI angle, start with free assessment |
| "Not the right person" | Ask for referral, offer relevant content |
| "Send more info" | Send specific resource, add to nurture |
## Handoff to Lead-Capture
When response indicates qualification:
1. Stop outbound sequence
2. Create record in `data/gtm/leads/qualified/`
3. Route to `/gtm-lead-capture` for full qualification
4. Include: all message history, response content, enrichment data## A/B Testing Framework
### What to Test
| Element | Test Approach | Sample Size |
|---------|---------------|-------------|
| Subject lines | 2-3 variants per sequence | 50+ per variant |
| First line (personalization) | Hook types: signal vs. pain vs. question | 50+ per variant |
| CTA | Direct ask vs. soft ask vs. value offer | 50+ per variant |
| Timing | Day of week, time of day | 100+ per variant |
| Sequence length | 5 vs. 7 touches | Full sequence completion |
### Metrics to Track
| Metric | Good | Great | Target Action |
|--------|------|-------|---------------|
| Open rate | 40%+ | 60%+ | Test subject lines |
| Reply rate | 5%+ | 10%+ | Test messaging, personalization |
| Positive reply rate | 2%+ | 5%+ | Test value prop, targeting |
| Meeting booked rate | 1%+ | 3%+ | Test CTA, follow-up speed |
| Bounce rate | <5% | <2% | Verify emails, clean list |
| Unsubscribe rate | <1% | <0.5% | Review messaging, targeting |
### Weekly Optimization Cycle
1. Pull performance data from email tool
2. Identify top and bottom performers
3. Analyze: what's different about winners?
4. Generate new variants based on insights
5. Retire underperformers
6. Document learnings in `data/gtm/outbound/learnings.json`data/gtm/outbound/sequences/data/gtm/outbound/activity/data/gtm/outbound/templates//gtm-lead-capture/gtm-analyticsdata/gtm/outbound/[project]/
└── data/
└── gtm/
├── icp_profiles.json # ICP segments (from /gtm-icp)
├── messaging_framework.json # Positioning (from /gtm-icp) — REQUIRED
├── project_context.json # Business context (from /cmo)
├── response_templates.json # Response handling (from /gtm-lead-capture)
├── prospects/
│ └── enriched/ # From /gtm-prospecting — REQUIRED
└── outbound/
├── sequences/ # Sequence definitions
│ └── {sequence_name}.json
├── templates/ # Message templates
│ └── {template_name}.json
├── activity/ # Send/open/reply logs
│ └── activity_{date}.json
├── review_queue/ # Messages pending approval
│ └── pending_{date}.json
├── learnings.json # A/B test results and insights
└── performance.json # Aggregate metrics{
"sequenceId": "seq_{name}_{version}",
"name": "",
"version": "1.0",
"createdAt": "YYYY-MM-DDTHH:MM:SSZ",
"updatedAt": "YYYY-MM-DDTHH:MM:SSZ",
"targetTier": "A | B | C | signal | referral",
"targetSegment": "segment_slug",
"channels": ["email", "linkedin", "phone"],
"totalTouches": 0,
"durationDays": 0,
"status": "draft | active | paused | retired",
"touches": [
{
"touchNumber": 1,
"day": 0,
"channel": "email | linkedin | phone",
"purpose": "",
"templateId": "",
"variants": ["template_a", "template_b"],
"conditions": {
"skipIf": "replied | opened_3x | connected",
"onlyIf": ""
}
}
],
"exitConditions": {
"positiveReply": "handoff_to_lead_capture",
"negativeReply": "remove_and_log",
"noResponse": "move_to_nurture",
"bounced": "remove_and_flag"
},
"metrics": {
"prospectsEnrolled": 0,
"completed": 0,
"replies": 0,
"positiveReplies": 0,
"meetingsBooked": 0
}
}{
"templateId": "tpl_{name}_{variant}",
"name": "",
"variant": "A | B | C",
"channel": "email | linkedin_connection | linkedin_dm",
"sequenceId": "",
"touchNumber": 0,
"targetSegment": "",
"messagingAngle": "",
"subject": "",
"body": "",
"callToAction": "",
"personalizationFields": [
"{companyName}",
"{firstName}",
"{signal}",
"{painHypothesis}"
],
"status": "draft | review | approved | active | retired",
"performance": {
"sent": 0,
"opened": 0,
"replied": 0,
"positiveReplies": 0,
"openRate": 0,
"replyRate": 0
},
"createdAt": "YYYY-MM-DDTHH:MM:SSZ",
"approvedBy": "",
"approvedAt": ""
}{
"activityDate": "YYYY-MM-DD",
"activities": [
{
"activityId": "",
"timestamp": "YYYY-MM-DDTHH:MM:SSZ",
"prospectId": "",
"accountId": "",
"sequenceId": "",
"touchNumber": 0,
"channel": "email | linkedin | phone",
"action": "sent | opened | clicked | replied | bounced | unsubscribed",
"templateId": "",
"subject": "",
"responseType": "positive | curious | objection | timing | referral | negative | none",
"responseContent": "",
"nextAction": ""
}
],
"dailySummary": {
"sent": 0,
"opened": 0,
"clicked": 0,
"replied": 0,
"positiveReplies": 0,
"meetingsBooked": 0,
"bounced": 0,
"unsubscribed": 0
}
}/gtm-prospecting/gtm-icp/gtm-analytics/gtm-outbounddata/gtm/prospects/enriched//gtm-prospectingmessaging_framework.json/gtm-icpdata/gtm/outbound/sequences//gtm-lead-capture