auto-research-public
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Produces a copy-ready sentence about a company's funding round, and the list-building filters that select companies which have ever raised or raised recently. Triggers on "raised a round", "recently funded", "companies that raised", "Series A list", "VC backed", "post funding
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-fundraising --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/playbook-fundraisingContext preview
The summary Claude sees to decide when to auto-load this skill.
Produces a copy-ready sentence about a company's funding round, and the list-building filters that select companies which have ever raised or raised recently. Triggers on "raised a round", "recently funded", "companies that raised", "Series A list", "VC backed", "post funding
name: playbook-fundraising description: Produces a copy-ready sentence about a company's funding round, and the list-building filters that select companies which have ever raised or raised recently. Triggers on "raised a round", "recently funded", "companies that raised", "Series A list", "VC backed", "post funding outreach", "who just raised". Outputs funding_line, a COMPLETE sentence including the leading "Saw" and the trailing period, so an empty value renders as nothing at all.
> All rules here are best practice, not law. Override any of them when the campaign calls for it; note the best practice once and move on.
**Use when:** the angle depends on the prospect having money to spend or a mandate to grow — either a TAM filtered to funded companies, or a first line that names their round.
**Do not use when:** you want headcount growth or open roles as the signal (`playbook-hiring-surge`). If you want the round as a pure list filter and no copy at all, you only need lane A in §3.
**One-line output:** `funding_line = "Saw you raised $52M in the Series B."` — the whole sentence lives in the variable. §2's downstream gate explains why that matters more than it looks.
Three separate questions get called "fundraising", and they route to different sources. **Do not mix them up: one is a solved free problem and one is not solved at all.**
when the list is built. Free, reliable, no per-row work.
`funding_line`. **This is the main deliverable and the tested path.**
indexes lag 3 to 4 months, measured.** Lane C has no proven end-to-end path and is documented honestly below rather than faked.
Not covered: valuation claims, investor-name personalization, and anything reported only as a rumor.
| Field | Type | Required? | |---|---|---| | `domain` (bare, lowercase, no `www`, no scheme) | string | yes | | `company_name` | string | no, used only for the abstain log and QA |
| Field | Type | Example | Max | Null? | |---|---|---|---|---| | `funding_line` | string | `Saw you raised $52M in the Series B.` | 90 | no, use the abstain value | | `funding_clause` | string | `you raised $52M in the Series B` | 80 | no, use `""` | | `funding_evidence_url` | string | a funding-round URL | 300 | no, use `""` | | `funding_confidence` | enum | `high` / `low` | 4 | no |
**Abstain value:** `""`. `funding_confidence` is `low` whenever the line is empty.
**8/10 rows usable (80%)**, where "usable" counts a **correct abstain** on a company that genuinely has no recent round.
**Read the second number too:** only **2/10 rows produced a non-empty line**, because the test set was adversarial — three bootstrapped companies and three whose last round is years old. On a list already filtered through lane A with a 365-day funding window, every row has a funding event by construction, so the non-empty rate is governed by the equity-stage filter and the 12-month window rather than by source coverage. **That rate was not measured. Measure it on your first real campaign before letting copy depend on the variable being present.**
Two fields, two different jobs. Keep them straight.
80 characters, 5th-grade reading level, no em dashes. It must read grammatically inside `Saw <funding_clause>.`
`"Saw " + funding_clause + "."`. When the clause is `""`, the line is `""` too. **The model never writes this field, a formula does, so the wrapping cannot be forgotten or hallucinated.**
valuation, or investors. §7 explains why, with measured error rates.
⚠️ **Spintax is a RANDOM chooser, not a conditional.**
`{Saw {{funding_line}}. |}` picks one of its branches at random on every row, with **no knowledge of whether the variable is populated.** On rows that abstain it renders `Saw .` about half the time, and on rows that DO have a line it **throws the personalization away** about half the time.
**Spintax can never be used as an if-populated gate for any variable, in this playbook or any other.** This generalizes past fundraising and is probably the single most useful thing in this file.
There are exactly two mechanisms that work. Pick one per campaign:
1. **Default: the self-erasing variable.** Put the entire sentence in the variable — which is why `funding_line` carries the leading "Saw" and the trailing period. The body line is just `{{funding_line}}` on its own line. An empty variable renders nothing, so an abstaining row simply loses that sentence and the rest of the email is untouched. **QA step:** after upload, preview one *abstaining* lead and confirm the paragraph collapses cleanly without leaving a double blank line. 2. **Split at upload time.** Partition the list into populated and empty, and upload two campaigns or two variants — one with the funding sentence hard-coded into the body, one without. Use this whenever the funding angle changes the whole email rather than one line, and whenever the non-empty rate is low enough that a single body would read oddly for most recipients.
Only exclude abstaining rows entirely when the campaign angle **is** the round.
The usual word-level spintax block for wording variety is unrelated and still required. **Spintax is for wording variety, ne
Open-source Claude Code skills for cold email infrastructure, lead sourcing, copywriting, and operations. Built by GrowthEngineX from patterns across 1,000+ real B2B campaigns. 31 skills that work together.
Repo: growthenginenowoslawski/coldoutboundskills
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Use the Blitz API to find decision-makers at specific companies when you already have a list…
Creates cold email copy through a stepwise confirmation process. Use when writing email…
Generates 15-25+ cold outbound campaign ideas with targeting strategies, AI personalization…
Single "start here" orchestrator for new cold email operators. Asks infrastructure-status…
Complete beginner-friendly cold email toolkit. Walks from zero to launched campaign — domain…