@opendirectory.dev/skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/claude-md-generator/.env.example +7 -0
- package/.claude/skills/claude-md-generator/README.md +78 -0
- package/.claude/skills/claude-md-generator/SKILL.md +248 -0
- package/.claude/skills/claude-md-generator/evals/evals.json +35 -0
- package/.claude/skills/claude-md-generator/references/section-guide.md +175 -0
- package/dist/e2e.test.d.ts +1 -0
- package/dist/e2e.test.js +62 -0
- package/dist/fs-adapters.d.ts +4 -0
- package/dist/fs-adapters.js +101 -0
- package/dist/fs-adapters.test.d.ts +1 -0
- package/dist/fs-adapters.test.js +108 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +211 -0
- package/dist/transformers.d.ts +6 -0
- package/dist/transformers.js +2 -0
- package/package.json +25 -0
- package/registry.json +226 -0
- package/skills/blog-cover-image-cli/.github/workflows/publish.yml +19 -0
- package/skills/blog-cover-image-cli/LICENSE +15 -0
- package/skills/blog-cover-image-cli/README.md +126 -0
- package/skills/blog-cover-image-cli/SKILL.md +7 -0
- package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/README.md +30 -0
- package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/SKILL.md +72 -0
- package/skills/blog-cover-image-cli/bin/cli.js +226 -0
- package/skills/blog-cover-image-cli/examples/100x_UX_Research_AI_Agent.png +0 -0
- package/skills/blog-cover-image-cli/examples/Firecrawl-supabase-bolt.png +0 -0
- package/skills/blog-cover-image-cli/examples/Git-City_Case_study_Cover_Image.jpg +0 -0
- package/skills/blog-cover-image-cli/examples/THE DISTRIBUTION LAYER (2).png +0 -0
- package/skills/blog-cover-image-cli/examples/canva-perplexity-duolingo-cover-image.png +0 -0
- package/skills/blog-cover-image-cli/examples/gamma-mistral-veed.png +0 -0
- package/skills/blog-cover-image-cli/examples/server-survival-case-study-cover-image(1).png +0 -0
- package/skills/blog-cover-image-cli/examples/viral-meme-automation.png +0 -0
- package/skills/blog-cover-image-cli/index.js +2 -0
- package/skills/blog-cover-image-cli/package-lock.json +2238 -0
- package/skills/blog-cover-image-cli/package.json +37 -0
- package/skills/blog-cover-image-cli/src/geminiGenerator.js +126 -0
- package/skills/blog-cover-image-cli/src/imageValidator.js +54 -0
- package/skills/blog-cover-image-cli/src/logoFetcher.js +86 -0
- package/skills/claude-md-generator/.env.example +7 -0
- package/skills/claude-md-generator/README.md +78 -0
- package/skills/claude-md-generator/SKILL.md +254 -0
- package/skills/claude-md-generator/evals/evals.json +35 -0
- package/skills/claude-md-generator/references/section-guide.md +175 -0
- package/skills/cook-the-blog/README.md +86 -0
- package/skills/cook-the-blog/SKILL.md +130 -0
- package/skills/dependency-update-bot/.env.example +13 -0
- package/skills/dependency-update-bot/README.md +101 -0
- package/skills/dependency-update-bot/SKILL.md +376 -0
- package/skills/dependency-update-bot/evals/evals.json +45 -0
- package/skills/dependency-update-bot/references/changelog-patterns.md +201 -0
- package/skills/docs-from-code/.env.example +13 -0
- package/skills/docs-from-code/README.md +97 -0
- package/skills/docs-from-code/SKILL.md +160 -0
- package/skills/docs-from-code/evals/evals.json +29 -0
- package/skills/docs-from-code/references/extraction-guide.md +174 -0
- package/skills/docs-from-code/references/output-template.md +135 -0
- package/skills/docs-from-code/scripts/extract_py.py +238 -0
- package/skills/docs-from-code/scripts/extract_ts.ts +284 -0
- package/skills/docs-from-code/scripts/package.json +18 -0
- package/skills/explain-this-pr/README.md +74 -0
- package/skills/explain-this-pr/SKILL.md +130 -0
- package/skills/explain-this-pr/evals/evals.json +35 -0
- package/skills/google-trends-api-skills/README.md +78 -0
- package/skills/google-trends-api-skills/SKILL.md +7 -0
- package/skills/google-trends-api-skills/google-trends-api/SKILL.md +163 -0
- package/skills/google-trends-api-skills/google-trends-api/references/api-responses.md +188 -0
- package/skills/google-trends-api-skills/google-trends-api/scripts/discover_keywords.py +344 -0
- package/skills/google-trends-api-skills/seo-keyword-research/SKILL.md +205 -0
- package/skills/google-trends-api-skills/seo-keyword-research/references/keyword-placement-guide.md +89 -0
- package/skills/google-trends-api-skills/seo-keyword-research/references/tech-blog-examples.md +207 -0
- package/skills/google-trends-api-skills/seo-keyword-research/scripts/blog_seo_research.py +373 -0
- package/skills/hackernews-intel/.env.example +33 -0
- package/skills/hackernews-intel/README.md +161 -0
- package/skills/hackernews-intel/SKILL.md +156 -0
- package/skills/hackernews-intel/evals/evals.json +35 -0
- package/skills/hackernews-intel/package.json +15 -0
- package/skills/hackernews-intel/scripts/monitor-hn.js +258 -0
- package/skills/kill-the-standup/.env.example +22 -0
- package/skills/kill-the-standup/README.md +84 -0
- package/skills/kill-the-standup/SKILL.md +169 -0
- package/skills/kill-the-standup/evals/evals.json +35 -0
- package/skills/kill-the-standup/references/standup-format.md +102 -0
- package/skills/linkedin-post-generator/.env.example +14 -0
- package/skills/linkedin-post-generator/README.md +107 -0
- package/skills/linkedin-post-generator/SKILL.md +228 -0
- package/skills/linkedin-post-generator/evals/evals.json +35 -0
- package/skills/linkedin-post-generator/references/linkedin-format.md +216 -0
- package/skills/linkedin-post-generator/references/output-template.md +154 -0
- package/skills/llms-txt-generator/.env.example +18 -0
- package/skills/llms-txt-generator/README.md +142 -0
- package/skills/llms-txt-generator/SKILL.md +176 -0
- package/skills/llms-txt-generator/evals/evals.json +35 -0
- package/skills/llms-txt-generator/references/llms-txt-spec.md +88 -0
- package/skills/llms-txt-generator/references/output-template.md +76 -0
- package/skills/llms-txt-generator/test-output/genzcareer.in/llms.txt +31 -0
- package/skills/luma-attendees-scraper/README.md +170 -0
- package/skills/luma-attendees-scraper/SKILL.md +7 -0
- package/skills/luma-attendees-scraper/luma_attendees_export.js +223 -0
- package/skills/meeting-brief-generator/.env.example +21 -0
- package/skills/meeting-brief-generator/README.md +90 -0
- package/skills/meeting-brief-generator/SKILL.md +275 -0
- package/skills/meeting-brief-generator/evals/evals.json +35 -0
- package/skills/meeting-brief-generator/references/brief-format.md +114 -0
- package/skills/meeting-brief-generator/references/output-template.md +150 -0
- package/skills/meta-ads-skill/README.md +100 -0
- package/skills/meta-ads-skill/SKILL.md +7 -0
- package/skills/meta-ads-skill/meta-ads-skill/SKILL.md +41 -0
- package/skills/meta-ads-skill/meta-ads-skill/references/report_templates.md +47 -0
- package/skills/meta-ads-skill/meta-ads-skill/references/workflows.md +51 -0
- package/skills/meta-ads-skill/meta-ads-skill/scripts/auth_check.py +22 -0
- package/skills/meta-ads-skill/meta-ads-skill/scripts/formatters.py +46 -0
- package/skills/newsletter-digest/.env.example +20 -0
- package/skills/newsletter-digest/README.md +147 -0
- package/skills/newsletter-digest/SKILL.md +221 -0
- package/skills/newsletter-digest/evals/evals.json +35 -0
- package/skills/newsletter-digest/feeds.json +7 -0
- package/skills/newsletter-digest/package.json +15 -0
- package/skills/newsletter-digest/references/digest-format.md +123 -0
- package/skills/newsletter-digest/references/output-template.md +136 -0
- package/skills/newsletter-digest/scripts/fetch-feeds.js +141 -0
- package/skills/newsletter-digest/scripts/ghost-publish.js +147 -0
- package/skills/noise2blog/.env.example +16 -0
- package/skills/noise2blog/README.md +107 -0
- package/skills/noise2blog/SKILL.md +229 -0
- package/skills/noise2blog/evals/evals.json +35 -0
- package/skills/noise2blog/references/blog-format.md +188 -0
- package/skills/noise2blog/references/output-template.md +184 -0
- package/skills/outreach-sequence-builder/.env.example +12 -0
- package/skills/outreach-sequence-builder/README.md +108 -0
- package/skills/outreach-sequence-builder/SKILL.md +248 -0
- package/skills/outreach-sequence-builder/evals/evals.json +36 -0
- package/skills/outreach-sequence-builder/references/output-template.md +171 -0
- package/skills/outreach-sequence-builder/references/sequence-format.md +167 -0
- package/skills/outreach-sequence-builder/references/signal-playbook.md +117 -0
- package/skills/position-me/README.md +71 -0
- package/skills/position-me/SKILL.md +7 -0
- package/skills/position-me/position-me/SKILL.md +50 -0
- package/skills/position-me/position-me/references/EVALUATION_SOP.md +40 -0
- package/skills/position-me/position-me/references/REPORT_TEMPLATE.md +58 -0
- package/skills/position-me/position-me/scripts/extract_links.py +49 -0
- package/skills/pr-description-writer/README.md +81 -0
- package/skills/pr-description-writer/SKILL.md +141 -0
- package/skills/pr-description-writer/evals/evals.json +35 -0
- package/skills/pr-description-writer/references/pr-format-guide.md +145 -0
- package/skills/producthunt-launch-kit/.env.example +7 -0
- package/skills/producthunt-launch-kit/README.md +95 -0
- package/skills/producthunt-launch-kit/SKILL.md +380 -0
- package/skills/producthunt-launch-kit/evals/evals.json +35 -0
- package/skills/producthunt-launch-kit/references/copy-rules.md +124 -0
- package/skills/reddit-icp-monitor/.env.example +16 -0
- package/skills/reddit-icp-monitor/README.md +117 -0
- package/skills/reddit-icp-monitor/SKILL.md +271 -0
- package/skills/reddit-icp-monitor/evals/evals.json +40 -0
- package/skills/reddit-icp-monitor/references/icp-format.md +131 -0
- package/skills/reddit-icp-monitor/references/reply-rules.md +110 -0
- package/skills/reddit-post-engine/.env.example +13 -0
- package/skills/reddit-post-engine/README.md +103 -0
- package/skills/reddit-post-engine/SKILL.md +303 -0
- package/skills/reddit-post-engine/evals/evals.json +35 -0
- package/skills/reddit-post-engine/references/subreddit-playbook.md +156 -0
- package/skills/schema-markup-generator/.env.example +19 -0
- package/skills/schema-markup-generator/README.md +114 -0
- package/skills/schema-markup-generator/SKILL.md +192 -0
- package/skills/schema-markup-generator/evals/evals.json +35 -0
- package/skills/schema-markup-generator/references/json-ld-spec.md +263 -0
- package/skills/schema-markup-generator/references/output-template.md +556 -0
- package/skills/show-hn-writer/.env.example +14 -0
- package/skills/show-hn-writer/README.md +88 -0
- package/skills/show-hn-writer/SKILL.md +303 -0
- package/skills/show-hn-writer/evals/evals.json +35 -0
- package/skills/show-hn-writer/references/hn-rules.md +74 -0
- package/skills/show-hn-writer/references/title-formulas.md +93 -0
- package/skills/stargazer/README.md +79 -0
- package/skills/stargazer/SKILL.md +7 -0
- package/skills/stargazer/stargazer-skill/SKILL.md +58 -0
- package/skills/stargazer/stargazer-skill/assets/.env.example +18 -0
- package/skills/stargazer/stargazer-skill/scripts/convert_to_csv.py +63 -0
- package/skills/stargazer/stargazer-skill/scripts/count_emails.py +52 -0
- package/skills/stargazer/stargazer-skill/scripts/stargazer_deep_extractor.py +450 -0
- package/skills/tweet-thread-from-blog/.env.example +14 -0
- package/skills/tweet-thread-from-blog/README.md +109 -0
- package/skills/tweet-thread-from-blog/SKILL.md +177 -0
- package/skills/tweet-thread-from-blog/evals/evals.json +35 -0
- package/skills/tweet-thread-from-blog/references/output-template.md +193 -0
- package/skills/tweet-thread-from-blog/references/thread-format.md +107 -0
- package/skills/twitter-GTM-find-skill/README.md +43 -0
- package/skills/twitter-GTM-find-skill/SKILL.md +7 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/SKILL.md +37 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/references/icp-checklist.md +35 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/package.json +23 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/run_pipeline.sh +8 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/debug.ts +23 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/extractor.ts +79 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/icp-filter.ts +87 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/index.ts +94 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/scraper.ts +41 -0
- package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/tsconfig.json +13 -0
- package/skills/yc-intent-radar-skill/README.md +39 -0
- package/skills/yc-intent-radar-skill/SKILL.md +7 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/SKILL.md +59 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/auth.js +29 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/db.js +62 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/export_radar_candidates.js +40 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package-lock.json +1525 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package.json +12 -0
- package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/scraper.js +217 -0
- package/src/e2e.test.ts +35 -0
- package/src/fs-adapters.test.ts +91 -0
- package/src/fs-adapters.ts +65 -0
- package/src/index.ts +182 -0
- package/src/transformers.ts +6 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# outreach-sequence-builder
|
|
2
|
+
|
|
3
|
+
<img width="1280" height="640" alt="outreach-sequence-builder" src="https://github.com/user-attachments/assets/3d73358a-52ca-48e7-b34e-b1ba33246d6e" />
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Turn a buying signal into a ready-to-send multi-channel outreach sequence. Give the skill a signal and it generates 4-6 personalized touchpoints across email, LinkedIn, and phone, with objection pre-emption built in.
|
|
7
|
+
|
|
8
|
+
## What It Does
|
|
9
|
+
|
|
10
|
+
- Identifies the signal type from 7 categories: Post-Fundraise, Hiring Signal, Competitor Displacement, Product Launch, Content Engagement, Event Follow-up, Job Change
|
|
11
|
+
- Loads your ICP from docs/icp.md or asks 4 questions to define target persona and pain points
|
|
12
|
+
- Develops the Insight, Bridge, Opener, and Ask for the specific signal
|
|
13
|
+
- Plans a 4-6 touchpoint channel sequence over 10-14 days
|
|
14
|
+
- Generates all messages with Gemini, enforcing hard limits (100-word emails, 300-character LinkedIn notes, 20-word phone openers)
|
|
15
|
+
- Pre-empts 2-4 objections woven into existing touchpoints
|
|
16
|
+
- Runs a 13-point QA pass before presenting the sequence
|
|
17
|
+
- Saves the sequence to docs/sequences/ and optionally drafts emails in Gmail via Composio
|
|
18
|
+
|
|
19
|
+
## Requirements
|
|
20
|
+
|
|
21
|
+
| Requirement | Purpose | How to Set Up |
|
|
22
|
+
|------------|---------|--------------|
|
|
23
|
+
| Gemini API key | Sequence generation | aistudio.google.com, Get API key |
|
|
24
|
+
| Composio API key (optional) | Gmail draft creation | app.composio.dev, API Keys |
|
|
25
|
+
|
|
26
|
+
## Setup
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
cp .env.example .env
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Fill in:
|
|
33
|
+
- `GEMINI_API_KEY` (required)
|
|
34
|
+
- `COMPOSIO_API_KEY` (optional, for Gmail draft creation)
|
|
35
|
+
|
|
36
|
+
Optional: create `docs/icp.md` with your target personas, company profile, pain points, and differentiators. If the file does not exist, the skill asks 4 questions before generating.
|
|
37
|
+
|
|
38
|
+
## How to Use
|
|
39
|
+
|
|
40
|
+
Basic sequence from a signal:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
"Build an outreach sequence for a prospect who just raised a Series B"
|
|
44
|
+
"They're hiring 8 engineers — write me a sequence"
|
|
45
|
+
"Create outreach based on this signal: they just launched a new product"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
With contact context:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
"Build an outreach sequence for Sarah Chen, VP Sales at Momentum CRM — they just raised $22M Series B"
|
|
52
|
+
"They switched from Salesforce and posted a frustrated LinkedIn comment. Write a competitor displacement sequence."
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
With Gmail drafting:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
"Build a post-fundraise sequence and draft the emails in Gmail"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Signal Types
|
|
62
|
+
|
|
63
|
+
| Signal | Definition | Window |
|
|
64
|
+
|--------|-----------|--------|
|
|
65
|
+
| Post-Fundraise | Company raised a round in the last 30 days | 48 hours from announcement |
|
|
66
|
+
| Hiring Signal | Company posted 5 or more roles in a function you serve | Within the week posts appear |
|
|
67
|
+
| Competitor Displacement | Contact is using a competitor and showing frustration | Within 24 hours |
|
|
68
|
+
| Product Launch | Company launched a new product or major feature | 2-4 weeks after launch |
|
|
69
|
+
| Content Engagement | Contact liked, commented, or shared your content | Start on LinkedIn first |
|
|
70
|
+
| Event Follow-up | You met at a conference or webinar | Within 48 hours of event |
|
|
71
|
+
| Job Change | Contact moved to a new company in the last 60 days | Within 2 weeks of announcement |
|
|
72
|
+
|
|
73
|
+
## Message Rules
|
|
74
|
+
|
|
75
|
+
- Only `{{first_name}}` is allowed as a variable. All other details must be filled in from context.
|
|
76
|
+
- Email bodies: 100 words maximum.
|
|
77
|
+
- LinkedIn notes: 300 characters maximum.
|
|
78
|
+
- Phone openers: 20 words maximum.
|
|
79
|
+
- No placeholders like `[Company Name]` or `[INSERT PAIN POINT]`. If the information is not available, the skill asks before writing.
|
|
80
|
+
|
|
81
|
+
## Output
|
|
82
|
+
|
|
83
|
+
The sequence is saved to `docs/sequences/{signal-type}.md`. Each touchpoint includes:
|
|
84
|
+
|
|
85
|
+
- Channel and day number
|
|
86
|
+
- Two subject line variants (email)
|
|
87
|
+
- Message body
|
|
88
|
+
- Word count (email) or character count (LinkedIn)
|
|
89
|
+
- Phone talk track with voicemail script
|
|
90
|
+
|
|
91
|
+
## Project Structure
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
outreach-sequence-builder/
|
|
95
|
+
├── SKILL.md
|
|
96
|
+
├── README.md
|
|
97
|
+
├── .env.example
|
|
98
|
+
├── evals/
|
|
99
|
+
│ └── evals.json
|
|
100
|
+
└── references/
|
|
101
|
+
├── signal-playbook.md
|
|
102
|
+
├── sequence-format.md
|
|
103
|
+
└── output-template.md
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## License
|
|
107
|
+
|
|
108
|
+
MIT
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: outreach-sequence-builder
|
|
3
|
+
description: Takes a buying signal and generates a personalized multi-channel outreach sequence across email, LinkedIn, and phone. Outputs 4-6 ready-to-send touchpoints over 10-14 days. Optionally drafts email touchpoints via Composio Gmail. Use when asked to write an outreach sequence, build a sales cadence, create a follow-up sequence, personalize outreach for a signal, or generate cold outreach messages. Trigger when a user says "build an outreach sequence for", "write a sales cadence for", "create outreach based on this signal", "they just raised a round write me a sequence", or "generate personalized outreach for".
|
|
4
|
+
compatibility: [claude-code, gemini-cli, github-copilot]
|
|
5
|
+
author: OpenDirectory
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Outreach Sequence Builder
|
|
10
|
+
|
|
11
|
+
Take a buying signal. Generate a personalized multi-channel outreach sequence. Output ready-to-send messages across email, LinkedIn, and phone.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
**Critical rule:** Every message must be filled in completely from the context you load. Only `{{first_name}}` is allowed as a variable. No `[Company Name]` brackets, no `[INSERT PAIN POINT]` placeholders. If you do not have the information to fill something in, ask before writing. Never send a message with an unfilled placeholder.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Step 1: Setup Check
|
|
20
|
+
|
|
21
|
+
Confirm required env vars:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
|
|
25
|
+
echo "COMPOSIO_API_KEY: ${COMPOSIO_API_KEY:-not set, Gmail drafting will be skipped}"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**If GEMINI_API_KEY is missing:**
|
|
29
|
+
Stop. Tell the user: "GEMINI_API_KEY is required. Get it at aistudio.google.com. Add it to your .env file."
|
|
30
|
+
|
|
31
|
+
**If COMPOSIO_API_KEY is missing:**
|
|
32
|
+
Continue. Sequences will be output as formatted text for copy-paste. Gmail draft creation is skipped.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Step 2: Load Context
|
|
37
|
+
|
|
38
|
+
Check for an existing ICP file and account files:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
ls docs/icp.md 2>/dev/null && echo "icp found" || echo "icp missing"
|
|
42
|
+
ls docs/accounts/ 2>/dev/null && echo "accounts found" || echo "accounts missing"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**If docs/icp.md exists:** Read it. Extract:
|
|
46
|
+
- Target personas (job titles, seniority, department)
|
|
47
|
+
- Company profile (size, industry, funding stage)
|
|
48
|
+
- Core pain points (use the buyer's exact language)
|
|
49
|
+
- Key differentiators (why your product over alternatives)
|
|
50
|
+
|
|
51
|
+
**If docs/accounts/{company}.md exists:** Read the relevant file. Extract:
|
|
52
|
+
- Company name, size, recent context
|
|
53
|
+
- Known tech stack or pain points
|
|
54
|
+
- Any existing relationship or prior contact
|
|
55
|
+
|
|
56
|
+
**If neither exists:** Ask the user these 4 questions. Do not proceed until all 4 are answered:
|
|
57
|
+
1. What does your product do? (one or two sentences)
|
|
58
|
+
2. Who are you targeting? (job title, company size, industry)
|
|
59
|
+
3. What is the main problem you solve? (from the buyer's perspective, not yours)
|
|
60
|
+
4. What is your key differentiator? (why you over the alternative they use today)
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Step 3: Identify the Signal
|
|
65
|
+
|
|
66
|
+
Determine which of the 7 signal types applies. Read `references/signal-playbook.md` for the full Insight, Bridge, Opener, and Ask for each signal type.
|
|
67
|
+
|
|
68
|
+
**7 signal types:**
|
|
69
|
+
|
|
70
|
+
| Signal | Definition |
|
|
71
|
+
|--------|-----------|
|
|
72
|
+
| Post-Fundraise | Company raised a funding round in the last 30 days |
|
|
73
|
+
| Hiring Signal | Company posted 5 or more roles in a function you serve |
|
|
74
|
+
| Competitor Displacement | Contact is using a competitor and showing frustration |
|
|
75
|
+
| Product Launch | Company launched a new product or major feature |
|
|
76
|
+
| Content Engagement | Contact liked, commented, or shared your content |
|
|
77
|
+
| Event Follow-up | You met or were in the same session at a conference or webinar |
|
|
78
|
+
| Job Change | Contact moved to a new company in the last 60 days |
|
|
79
|
+
|
|
80
|
+
**If the user provided a signal in their prompt:** Confirm the type and extract the specific details (round size, role titles, product name, event name, etc.).
|
|
81
|
+
|
|
82
|
+
**If no signal is clear:** Ask: "What triggered this outreach? (e.g. they raised a round, they're hiring engineers, you met at an event)"
|
|
83
|
+
|
|
84
|
+
State the detected signal type and the specific detail before proceeding.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Step 4: Develop the Angle
|
|
89
|
+
|
|
90
|
+
Using the signal type and context loaded in Steps 2-3, define the four angle elements. Read `references/signal-playbook.md` for the formula for this signal type.
|
|
91
|
+
|
|
92
|
+
Write out explicitly before generating any messages:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Signal: [specific signal + concrete detail]
|
|
96
|
+
Insight: [what this signal reveals about their situation]
|
|
97
|
+
Bridge: [how your product connects to what the signal reveals]
|
|
98
|
+
Opener: [one sentence referencing the specific signal detail]
|
|
99
|
+
Ask: [minimum viable CTA, under 10 words]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The opener must name the specific trigger. Vague openers are rejected.
|
|
103
|
+
|
|
104
|
+
Good: "Congrats on the $18M Series B — scaling the sales team fast usually creates an onboarding gap."
|
|
105
|
+
Bad: "I saw your company recently raised funding."
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Step 5: Plan the Channel Sequence
|
|
110
|
+
|
|
111
|
+
Design 4-6 touchpoints across email, LinkedIn, and phone. Rules:
|
|
112
|
+
|
|
113
|
+
- Total duration: 10-14 days
|
|
114
|
+
- Minimum gap: 2 days between any two touches
|
|
115
|
+
- Never use the same channel twice in a row
|
|
116
|
+
- Each follow-up must add new value (new resource, new angle, new proof point). Never "just following up".
|
|
117
|
+
- The final touchpoint is a short breakup message
|
|
118
|
+
|
|
119
|
+
Default cadence for most signals:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
Day 1: Email (first touch, signal-led opener)
|
|
123
|
+
Day 3: LinkedIn (connection note or short DM)
|
|
124
|
+
Day 7: Email (new angle or case study)
|
|
125
|
+
Day 9: Phone (talk track + voicemail script)
|
|
126
|
+
Day 12: Email (different framing or objection addressed)
|
|
127
|
+
Day 14: Email (short breakup message)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Adjust for signal type:
|
|
131
|
+
- Post-Fundraise: move faster (Day 1, 2, 4, 7, 10). Act within 48 hours of announcement.
|
|
132
|
+
- Event Follow-up: start with LinkedIn, not email (warmer channel first)
|
|
133
|
+
- Content Engagement: start with LinkedIn reply or comment before email
|
|
134
|
+
|
|
135
|
+
State the planned day and channel for each touchpoint before writing messages.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Step 6: Generate the Sequence
|
|
140
|
+
|
|
141
|
+
Read `references/sequence-format.md` in full. Read `references/output-template.md` and select the template for this signal type.
|
|
142
|
+
|
|
143
|
+
Write the Gemini request to a temp file:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
cat > /tmp/outreach-sequence-request.json << 'ENDJSON'
|
|
147
|
+
{
|
|
148
|
+
"system_instruction": {
|
|
149
|
+
"parts": [{
|
|
150
|
+
"text": "You are a B2B sales copywriter who writes cold outreach that gets replies. Rules: The first sentence of every message is about THEM, not your company. Reference the specific buying signal by name and detail in the opening message. Use contractions naturally. Short sentences. No corporate jargon. No banned words: synergy, leverage, touch base, circle back, ping, loop in, alignment, innovative, cutting-edge, best-in-class, world-class, game-changing, disruptive, bandwidth, deep dive, low-hanging fruit, move the needle. No pleasantries: no 'I hope this email finds you well', no 'Happy Monday', no 'Just wanted to'. Each follow-up adds new value — never 'just following up'. Hard limits: email body under 100 words, LinkedIn note under 300 characters, phone opener under 20 words. Only {{first_name}} is allowed as a variable — fill in all other details from the context provided. The breakup message is short (3-4 sentences), friendly, and leaves the door open."
|
|
151
|
+
}]
|
|
152
|
+
},
|
|
153
|
+
"contents": [{
|
|
154
|
+
"parts": [{
|
|
155
|
+
"text": "CONTEXT_AND_INSTRUCTIONS_HERE"
|
|
156
|
+
}]
|
|
157
|
+
}],
|
|
158
|
+
"generationConfig": {
|
|
159
|
+
"temperature": 0.7,
|
|
160
|
+
"maxOutputTokens": 4096
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
ENDJSON
|
|
164
|
+
curl -s -X POST \
|
|
165
|
+
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
|
|
166
|
+
-H "Content-Type: application/json" \
|
|
167
|
+
-d @/tmp/outreach-sequence-request.json \
|
|
168
|
+
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Replace `CONTEXT_AND_INSTRUCTIONS_HERE` with:
|
|
172
|
+
- The product description, target persona, pain points, and differentiators from Step 2
|
|
173
|
+
- The signal type, specific detail, and the four angle elements from Step 4
|
|
174
|
+
- The channel plan from Step 5
|
|
175
|
+
- Instructions to write each touchpoint with its subject line (email), character count (LinkedIn), and talk track (phone)
|
|
176
|
+
|
|
177
|
+
For each email touchpoint, require two subject line variants (A/B test).
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Step 7: Map Objections
|
|
182
|
+
|
|
183
|
+
After generating the sequence, identify the 2-4 most likely objections for this signal type. Pre-empt each one naturally within an existing touchpoint. Do not add separate objection-handling messages. Weave the pre-emption into the sequence.
|
|
184
|
+
|
|
185
|
+
Read the objection playbook in `references/sequence-format.md`. Map which touchpoint handles each objection.
|
|
186
|
+
|
|
187
|
+
**4 standard objections to pre-empt:**
|
|
188
|
+
|
|
189
|
+
| Objection | Pre-emption approach |
|
|
190
|
+
|-----------|---------------------|
|
|
191
|
+
| "We already have a solution" | Acknowledge their current tool, position yours as complementary or next step |
|
|
192
|
+
| "Not the right time" | Tie the signal directly to why now is the right time |
|
|
193
|
+
| "Too expensive" | Frame ROI, anchor to a number they care about |
|
|
194
|
+
| "Need to involve more people" | Offer a shareable resource (one-pager, recorded walkthrough) |
|
|
195
|
+
|
|
196
|
+
State which touchpoint handles each objection before presenting the final sequence.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Step 8: Self-QA
|
|
201
|
+
|
|
202
|
+
Run every check and fix violations before presenting:
|
|
203
|
+
|
|
204
|
+
- [ ] Every message starts with a sentence about THEM
|
|
205
|
+
- [ ] The specific signal detail is named in at least the first touchpoint
|
|
206
|
+
- [ ] No unfilled placeholders except `{{first_name}}`
|
|
207
|
+
- [ ] Email bodies are under 100 words (count and state the word count for each)
|
|
208
|
+
- [ ] LinkedIn notes are under 300 characters (count and state for each)
|
|
209
|
+
- [ ] Phone opener is under 20 words
|
|
210
|
+
- [ ] No banned words in any message
|
|
211
|
+
- [ ] No "just following up" in any follow-up
|
|
212
|
+
- [ ] Each follow-up adds a new angle or value
|
|
213
|
+
- [ ] No same channel used twice in a row
|
|
214
|
+
- [ ] At least 2 objections pre-empted across the sequence
|
|
215
|
+
- [ ] Breakup message is 3-4 sentences, friendly, no guilt
|
|
216
|
+
|
|
217
|
+
Fix any violation before presenting.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Step 9: Output and Save
|
|
222
|
+
|
|
223
|
+
Present the full sequence in a code block.
|
|
224
|
+
|
|
225
|
+
**Save to file:**
|
|
226
|
+
```bash
|
|
227
|
+
mkdir -p docs/sequences
|
|
228
|
+
cat > docs/sequences/SIGNAL-TYPE.md << 'EOF'
|
|
229
|
+
SEQUENCE_CONTENT_HERE
|
|
230
|
+
EOF
|
|
231
|
+
echo "Sequence saved to docs/sequences/SIGNAL-TYPE.md"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**If COMPOSIO_API_KEY is set:** Ask: "Draft the email touchpoints in Gmail via Composio?"
|
|
235
|
+
|
|
236
|
+
On confirmation, for each email touchpoint:
|
|
237
|
+
```bash
|
|
238
|
+
# The agent calls the GMAIL_CREATE_EMAIL_DRAFT Composio action
|
|
239
|
+
# with subject = [subject line], body = [email body], recipient = [contact email if known]
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
After drafting: "Email drafts created in Gmail. Check your Drafts folder."
|
|
243
|
+
|
|
244
|
+
**LinkedIn notes:** Present as separate copy-paste blocks with a clear label per touchpoint. LinkedIn does not support programmatic messaging.
|
|
245
|
+
|
|
246
|
+
**Phone scripts:** Present as a formatted talk track with bullet points, not a rigid script.
|
|
247
|
+
|
|
248
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "outreach-sequence-builder",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Build an outreach sequence for Sarah Chen, VP of Sales at Momentum CRM. They just raised a $22M Series B. My product is Ramp, a sales onboarding platform. I help B2B SaaS VP Sales scale ramp time when they grow past 20 reps. Pain point: new reps take too long to hit their first deal. Differentiator: structured playbooks plus live deal coaching, not just content libraries.",
|
|
7
|
+
"expected_output": "Agent checks GEMINI_API_KEY — set. No docs/icp.md found; uses the context provided in the prompt. Identifies signal type as Post-Fundraise with specific detail '$22M Series B at Momentum CRM.' Writes out all four angle elements: Insight (funding means hiring pressure and ramp bottleneck), Bridge (Ramp shortens time-to-first-deal), Opener (names $22M Series B), Ask (15 minutes to see if we can shorten ramp). Plans 5-touchpoint sequence on Day 1 (Email), Day 2 (LinkedIn), Day 4 (Email), Day 7 (Phone), Day 10 (Email), Day 14 (Email — breakup). Generates all messages with Gemini using the research context. QA pass: all emails under 100 words with word count stated, LinkedIn under 300 characters with count stated, phone opener under 20 words, no banned words, no unfilled placeholders except {{first_name}}, at least 2 objections pre-empted. Saves to docs/sequences/post-fundraise.md. Asks if user wants Gmail drafts created.",
|
|
8
|
+
"files": []
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": 2,
|
|
12
|
+
"prompt": "Write a sales cadence for a prospect who left a frustrated comment about HubSpot's reporting. Their name is Marcus Webb, RevOps Lead at DataStream. My product is Visible, a pipeline analytics platform. Pain point: CRM reporting requires too much manual work. Differentiator: auto-syncs with HubSpot and Salesforce, no manual cleanup needed.",
|
|
13
|
+
"expected_output": "Agent identifies signal type as Competitor Displacement (HubSpot frustration). Notes that this signal requires a fast first touch (within 24 hours). Opener references the specific frustration (HubSpot reporting requiring manual work). Plans a 5-touchpoint sequence starting with LinkedIn (not email) since the signal came from LinkedIn. Sequence: Day 1 (LinkedIn — reply or comment on the post first, then DM), Day 3 (Email), Day 6 (Phone), Day 9 (Email), Day 12 (Email — breakup). All LinkedIn messages under 300 characters. All emails under 100 words. Touch 3 pre-empts 'we already have a solution' by acknowledging HubSpot and positioning Visible as complementary. No 'just following up' in any message. No banned words. Sequence saved to docs/sequences/competitor-displacement.md.",
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 3,
|
|
18
|
+
"prompt": "Build an outreach sequence for a job change signal. Alex Rivera just became Head of Growth at Finova. I know from LinkedIn they led PLG growth at their previous company. My product is June.so, a product analytics platform for PLG teams. Pain point: growth teams at Series A companies can't see activation drop-off without a data engineer. Differentiator: self-serve setup, no data engineer needed.",
|
|
19
|
+
"expected_output": "Agent identifies signal type as Job Change. Notes the 60-day window and that first touch should happen within 2 weeks of the announcement. Opener references the move to Finova and Alex's PLG background specifically. Angle: Insight is that new Head of Growth has a mandate to prove PLG motion works at Finova. Bridge is that June.so lets them instrument activation without waiting for engineering. Plans standard 6-touchpoint sequence. Touch 1 Email: congrats on the move, references their PLG background and Finova's stage. Touch 2 LinkedIn: connection note under 300 characters. All QA checks pass. Sequence saved to docs/sequences/job-change.md. Composio not configured. Sequences output as formatted text only.",
|
|
20
|
+
"files": []
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": 4,
|
|
24
|
+
"prompt": "Generate cold outreach messages for a post-fundraise signal but do not include the email drafting step.",
|
|
25
|
+
"expected_output": "Agent detects GEMINI_API_KEY is missing from environment. Stops at Step 1. Tells the user: 'GEMINI_API_KEY is required. Get it at aistudio.google.com. Add it to your .env file.' Does not proceed to generate any messages.",
|
|
26
|
+
"files": [],
|
|
27
|
+
"setup": "GEMINI_API_KEY not set in environment"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": 5,
|
|
31
|
+
"prompt": "Create a sequence for Priya Nair, Director of Marketing at GrowthLoop. They posted a case study about their new AI segmentation feature. My product is Copy.ai, an AI writing assistant for marketing teams. We help marketing teams turn campaign briefs into copy 10x faster. Pain point: content production can't keep up with campaign volume. Differentiator: trained on brand voice from past campaigns, not generic prompts.",
|
|
32
|
+
"expected_output": "Agent identifies signal type as Product Launch (new AI segmentation feature). Opener references the GrowthLoop AI segmentation case study specifically by name. Angle: Insight is that a major feature launch requires marketing content across channels to drive awareness and adoption. Bridge is that Copy.ai removes the bottleneck between the campaign idea and copy going live. Plans standard 5-6 touchpoint sequence. Gemini generates all messages with no unfilled placeholders — all company, product, and contact details are filled in. QA pass confirms: each email under 100 words, word count stated for each, LinkedIn note under 300 characters, character count stated, phone opener under 20 words, no banned words (including 'innovative' and 'game-changing'), at least 2 objections pre-empted, breakup is 3-4 sentences and leaves the door open. Sequence saved to docs/sequences/product-launch.md.",
|
|
33
|
+
"files": []
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Output Template
|
|
2
|
+
|
|
3
|
+
One template for all signal types. The structure is fixed. Fill in all brackets from context. No brackets should appear in the final output.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Sequence Header
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
# Outreach Sequence: [Signal Type] — [Company Name]
|
|
11
|
+
|
|
12
|
+
**Contact:** [First name, last name, title. Write "Not specified" if unknown.]
|
|
13
|
+
**Signal:** [Specific signal detail. Example: "Raised $18M Series B on April 3, 2026"]
|
|
14
|
+
**Product:** [Your product, one sentence]
|
|
15
|
+
**Target persona:** [Job title, company size, industry]
|
|
16
|
+
|
|
17
|
+
**Angle:**
|
|
18
|
+
- Insight: [What the signal reveals about their situation]
|
|
19
|
+
- Bridge: [How your product connects to that situation]
|
|
20
|
+
- Opener: [One sentence naming the specific signal trigger]
|
|
21
|
+
- Ask: [CTA under 10 words]
|
|
22
|
+
|
|
23
|
+
**Objection mapping:**
|
|
24
|
+
- Touch X handles: [objection 1]
|
|
25
|
+
- Touch Y handles: [objection 2]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Touchpoint Template
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
### Day [N] — [Channel: Email / LinkedIn / Phone]
|
|
34
|
+
|
|
35
|
+
**Subject A:** [subject line variant A, under 8 words]
|
|
36
|
+
**Subject B:** [subject line variant B, under 8 words]
|
|
37
|
+
[subject lines for email only; omit for LinkedIn and Phone]
|
|
38
|
+
|
|
39
|
+
[Message body]
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
[Word count: X words] [for email]
|
|
43
|
+
[Character count: X characters] [for LinkedIn]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Worked Example
|
|
49
|
+
|
|
50
|
+
**Signal type:** Post-Fundraise
|
|
51
|
+
**Company:** Momentum CRM
|
|
52
|
+
**Contact:** Sarah Chen, VP of Sales
|
|
53
|
+
**Signal:** Raised $22M Series B on April 1, 2026
|
|
54
|
+
**Product:** Ramp, sales onboarding and enablement platform
|
|
55
|
+
**Target:** VP Sales, 50-500 employees, B2B SaaS
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
# Outreach Sequence: Post-Fundraise — Momentum CRM
|
|
61
|
+
|
|
62
|
+
**Contact:** Sarah Chen, VP of Sales
|
|
63
|
+
**Signal:** Raised $22M Series B on April 1, 2026
|
|
64
|
+
**Product:** Ramp, sales onboarding and enablement platform for B2B SaaS teams scaling past 20 reps
|
|
65
|
+
**Target persona:** VP Sales, 50-500 employees, B2B SaaS
|
|
66
|
+
|
|
67
|
+
**Angle:**
|
|
68
|
+
- Insight: A $22M Series B means Momentum is hiring. New reps need to ramp fast or the round's growth targets slip.
|
|
69
|
+
- Bridge: Ramp cuts new hire time-to-first-deal by shortening the onboarding cycle with structured playbooks and live deal coaching.
|
|
70
|
+
- Opener: "Congrats on the $22M Series B — fast-growing sales teams usually hit a ramp problem before the new hires hit their number."
|
|
71
|
+
- Ask: "Worth 15 minutes to see if we can shorten ramp?"
|
|
72
|
+
|
|
73
|
+
**Objection mapping:**
|
|
74
|
+
- Touch 3 handles: "We already have a solution" (acknowledges their current LMS, positions Ramp as complementary)
|
|
75
|
+
- Touch 4 handles: "Need to involve more people" (offers shareable one-pager before they ask)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### Day 1 — Email
|
|
81
|
+
|
|
82
|
+
**Subject A:** Series B congrats — one question on ramp
|
|
83
|
+
**Subject B:** $22M and hiring fast — seen this problem before
|
|
84
|
+
|
|
85
|
+
{{first_name}}, congrats on the $22M Series B.
|
|
86
|
+
|
|
87
|
+
Momentum is clearly in a hiring phase now. Most VP Sales I talk to at this stage say the same thing: the reps are hired, but 90-day ramp is the bottleneck that kills the year's number.
|
|
88
|
+
|
|
89
|
+
We help B2B SaaS sales teams cut ramp time by 30% with structured playbooks and live deal coaching.
|
|
90
|
+
|
|
91
|
+
Worth 15 minutes to see if it fits where you are now?
|
|
92
|
+
|
|
93
|
+
[Name]
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
Word count: 72 words
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
### Day 2 — LinkedIn
|
|
101
|
+
|
|
102
|
+
Hi Sarah, congrats on the Series B. I work with VP Sales teams scaling past 20 reps — ramp time is usually the first thing that breaks. Built something that might be relevant. Mind if I send a quick note?
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
Character count: 232 characters
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Day 4 — Email
|
|
110
|
+
|
|
111
|
+
**Subject A:** How Lattice cut new rep ramp by 5 weeks
|
|
112
|
+
**Subject B:** One thing that changes at 20+ reps
|
|
113
|
+
|
|
114
|
+
{{first_name}}, most teams scaling past 20 reps run onboarding off slide decks and Notion docs. Works until it doesn't.
|
|
115
|
+
|
|
116
|
+
Lattice was in the same spot at Series B. They moved to structured playbooks and live deal coaching. New reps hit their first deal 5 weeks faster in the first quarter after rollout.
|
|
117
|
+
|
|
118
|
+
Happy to share the breakdown if it's useful.
|
|
119
|
+
|
|
120
|
+
[Name]
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
Word count: 68 words
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### Day 7 — Phone
|
|
128
|
+
|
|
129
|
+
**Opening line:** Sarah, calling because Momentum just raised a round and ramp time usually becomes the first bottleneck.
|
|
130
|
+
|
|
131
|
+
**Talk track:**
|
|
132
|
+
- Context: We help VP Sales teams scale onboarding when they go from 10 to 30 reps — structured playbooks and live deal coaching replace the "follow a senior rep" approach that breaks at scale.
|
|
133
|
+
- Value: Lattice cut new hire time-to-first-deal by 5 weeks after switching from Notion-based onboarding.
|
|
134
|
+
- Ask: Is ramp on your radar for the next 90 days, or is headcount the bigger focus right now?
|
|
135
|
+
|
|
136
|
+
**Voicemail script:**
|
|
137
|
+
"Sarah, it's [Name] from Ramp. I'm calling because Momentum just closed the Series B and fast-growing sales teams usually hit a ramp problem before they hit their targets. We helped Lattice cut time-to-first-deal by 5 weeks — happy to show you how. [Phone number]. No pressure."
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### Day 10 — Email
|
|
142
|
+
|
|
143
|
+
**Subject A:** Not sure if this is a fit — honest question
|
|
144
|
+
**Subject B:** Sales team running off Notion docs still?
|
|
145
|
+
|
|
146
|
+
{{first_name}}, I want to be straight with you.
|
|
147
|
+
|
|
148
|
+
If Momentum already has a structured onboarding program built out, we are probably not the right fit right now. Most teams at your stage are using a mix of Highspot or Seismic for content and nothing purpose-built for ramp.
|
|
149
|
+
|
|
150
|
+
If that sounds familiar, I'd love 20 minutes. I can send a one-pager you can share with your ops or RevOps lead before we talk.
|
|
151
|
+
|
|
152
|
+
[Name]
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
Word count: 81 words
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### Day 14 — Email (Breakup)
|
|
160
|
+
|
|
161
|
+
**Subject A:** Closing the loop
|
|
162
|
+
**Subject B:** Leaving it with you
|
|
163
|
+
|
|
164
|
+
{{first_name}}, I'll stop reaching out so I'm not cluttering your inbox.
|
|
165
|
+
|
|
166
|
+
If ramp becomes a priority as you scale the team post-Series B, I'd love to reconnect. The door is open whenever the timing works.
|
|
167
|
+
|
|
168
|
+
[Name]
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
Word count: 41 words
|