Skip to content
Sales
Skill

/playbook-fundraising

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

BOOST
From plugin
coldoutboundskills
76452 skills
Install
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-fundraising --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/playbook-fundraising

Context 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

SKILL.md

playbook-fundraising.SKILL.md
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.

Playbook: Fundraising

> 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.

1. Trigger and scope

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.**

  • **Lane A, ever raised.** "Only show me companies with venture backing." A search filter applied

when the list is built. Free, reliable, no per-row work.

  • **Lane B, the copy line.** "Write a first line about their round." A per-row lookup producing

`funding_line`. **This is the main deliverable and the tested path.**

  • **Lane C, raised in the last 30 days.** "Who closed this month?" **The people-database funding

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.

2. Output contract

Inputs required per row

| Field | Type | Required? | |---|---|---| | `domain` (bare, lowercase, no `www`, no scheme) | string | yes | | `company_name` | string | no, used only for the abstain log and QA |

Output fields

| 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.

Coverage expectation

**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.**

Copy-fit rules

Two fields, two different jobs. Keep them straight.

  • **`funding_clause` is what the model writes:** lowercase first letter, no trailing period, under

80 characters, 5th-grade reading level, no em dashes. It must read grammatically inside `Saw <funding_clause>.`

  • **`funding_line` is what gets pushed:** deterministic **code** wraps the clause into

`"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.**

  • Neither field ever names a month, a season, a year, or a date, and neither names total funding,

valuation, or investors. §7 explains why, with measured error rates.

Downstream gate — read this before wiring the email body

⚠️ **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

Read more
Ships withcoldoutboundskills

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.

Get the whole plugin
Stats
766
Stars
269
Forks
Active
Maintenance
TypeScript
Language
MIT
License
9d ago
Last commit
7mo ago
Created
5h ago
Added

Repo: growthenginenowoslawski/coldoutboundskills

Other skills on coldoutboundskills.