Systems Lab

Agent skill

outbound-framework

A table-driven framework for B2B cold email campaigns.

activeSelf-containedInstructions only3,729 words

Filed under Outbound email.

From lbarberis/gtm-skills · 7 skill entries · 0 · pushed 2026-09-26

What it does when it runs

A table-driven framework for B2B cold email campaigns. Forces structured thinking through a fixed chain of tables (brief intake, ICP matrix, relevance test, proof inventory, subject check, email build, follow-up sequence, pre-send QA, weekly review) before any copy is written. Use this skill whenever anyone on the team asks to write, plan, review, fix, score or improve cold emails, outbound campaigns, email sequences, follow-ups, subject lines, ICPs, personas or segmentation for outreach, or mentions Instantly, Smartlead, Lemlist, Apollo, Lusha or Hunter in an outreach context, even if they don't say "framework" or "table". Do NOT use for newsletters, transactional emails or lifecycle marketing flows (Klaviyo, Mailchimp).

Automated analysis of the skill and the 1 file 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-tools in the frontmatter. It only issues instructions, so there is nothing to bound.
Actions present in the files
None. Instructions only.

Ask about outbound-framework

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/lbarberis/gtm-skills.git /tmp/gtm-skills
git -C /tmp/gtm-skills sparse-checkout set "skills/outbound-framework"
mkdir -p ~/.claude/skills/outbound-framework
cp -R "/tmp/gtm-skills/skills/outbound-framework/." ~/.claude/skills/outbound-framework/

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 ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 7 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add lbarberis/gtm-skills
/plugin

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.

Reproduced in full from lbarberis/gtm-skills/blob/aba514c75be2102fa8c91074bb978ee36cfa050b/skills/outbound-framework/SKILL.md, which is licensed MIT (repository). 3,729 words, 18 headings.

Outbound framework

This skill turns a brief into cold emails through a fixed chain of tables. Every stage outputs a table before any copy gets written. The tables are the thinking: they force one industry, one title, one pain, one proof set and one free asset per email.

That's what makes an email relevant, and relevance is the only criterion. A cold email gets a positive reply when the reader thinks it was written for their job, in their industry, this quarter. Copy quality matters less than people think. The CTA matters more than anything.

A full worked example (hypothetical company, 10 ICPs, every table filled) lives in references/worked-example.md. Read it when unsure about the expected depth or format.


Table rules (apply to every table you output)

  1. State rows and columns. Put one line above each table: Rows: ... Columns: .... The reader should never guess what a row is.
  2. Fill every cell. If a value is unknown, write MISSING. Never guess a name, a number or a client. Every MISSING becomes a question for the user.
  3. Use PASS / FAIL words in check columns, not symbols. They survive every renderer and copy-paste into sheets.
  4. Tables first, prose second. Prose is one or two connecting lines between tables, never a paragraph restating a table.
  5. Don't skip stages the routing table says to run. A skipped table is where irrelevant emails come from.
  6. Emails go in fenced text blocks so they paste into Instantly or Smartlead without formatting damage.
  7. No em dashes anywhere, in tables or copy. Use commas, periods or colons.

Stage 0: Route the request

Rows: request types. Columns: which stages to run, and what the final output is.

RequestStages to runFinal output
Full campaign from a brief1, 2 (if a list is involved), 3, 4, 5, 6, 7, 8ICP matrix, Variant A + B per ICP, sequence, QA table
One email for one ICP1, 3 (single row), 4, 5, 6, 8Variant A + B
Subject lines only1, 3, 5Subject check table with winners marked
Follow-ups for an existing opener1, 5 (new-thread subjects), 7, 8Sequence table + full copy
Review or fix an existing email8 on their draft, then 5 and 6 to rewriteAudit table + rewritten email
List building or segmentation2, 3Filter spec table + ICP matrix
Weekly stats review9Decision table + new hooks table

Stage 1: Brief intake

Rows: the inputs every campaign needs. Columns: the input, what the brief says, status, and why it matters.

InputValue from briefStatusWhy it matters
Product in one sentenceHave / MISSINGFeeds the How it works
How it works, 3 to 4 stepsHave / MISSINGThe default way to explain the product
Sender name and titleHave / MISSINGSelf-intro line
Named customers, by industryHave / MISSINGAuthority and subject name-drops
Exact numbers (volumes, results, ratings, counts)Have / MISSINGAuthority and subject numbers
Backers, certifications, partnersHave / MISSINGExtra authority
Free assets the client can actually deliverHave / MISSINGThe CTA, the most important element
Target industries and titles (if given)Have / MISSINGSeeds the ICP matrix
Language and register (e.g. Italian Lei)Have / MISSINGTone and structure
Size split rules (if any)Have / MISSINGOnly case where a meeting CTA is allowed on touch 1

If named customers, exact numbers or deliverable assets are MISSING, ask for them in one message before writing copy. An email without real names and numbers, or without an asset the client can deliver, fails the two elements that drive replies.


Stage 2: Data reality check (Apollo, Lusha, Hunter)

Treat all three as big LinkedIn scrapers with an email guesser bolted on. Their data comes largely from LinkedIn profiles and the public web, plus contributor networks. The who-does-what is there and it's good enough to segment on. The email is a guess: the tool applies the company's naming pattern (first.last@, f.last@, first@) and pings the mail server. On catch-all domains the server accepts everything, so the check proves nothing.

Rows: the fields these tools return. Columns: where the field really comes from, how far to trust it, what to do.

FieldReal sourceTrustAction
Name, title, companyLinkedIn profilesHigh, lags job changesSegment on it. Check LinkedIn for top accounts before sending
Seniority, departmentDerived from title textMediumFilter on title keywords too
IndustryCompany's LinkedIn categoryMedium, broad bucketsCombine with keywords, spot-check 20 rows
HeadcountLinkedIn employee countMediumUse ranges
EmailPattern guess + server ping, or public pagesLow until verifiedSend only to verified. Catch-alls in small batches
PhoneContributor networksVariableNot used in email outbound

When building a list, output a filter spec. Rows: filters. Columns: filter, value, why, trust note.

FilterValueWhyTrust note

Stage 3: ICP matrix and relevance test

One ICP is one industry plus one title, and it gets one campaign and its own email. Two titles in the same company never share a row, because they don't share a pain. For a full campaign aim for 8 to 12 ICPs unless the brief sets a number: enough to learn fast, few enough to review weekly.

Rows: one ICP each. Columns: the fields that make the email relevant.

#IndustryTitlePain point (internal)Peer proof namesWeighted How it works stepFree assetCampaign name

Column rules:

  • Pain point is something this title owns and gets measured on. It's internal: it shapes the email, it never appears as "you struggle with X".
  • Peer proof names come from the same industry as the row. A hotel group wants to see hotel groups.
  • Weighted step is the How it works step that answers this row's pain.
  • Free asset is what the CTA offers this specific ICP (see Stage 6).
  • Campaign name format: [client]-[industry]-[title]-[hook]-[yyww], e.g. NWAP-3PL-HeadFin-Overbilling-2639.

Then run the relevance test. Rows: one ICP each. Columns: the five layer tests, then the verdict.

#Peer names recognizable to this titlePain owned by this titleAsset answers the painProof from same industryVocabulary specific to this industryVerdict

Any FAIL: fix the ICP row before moving on. Don't carry a failing row into copy.


Stage 4: Proof inventory

Generic authority reads as no authority. Every claim carries a recognizable name or an exact figure, ideally both. Prefer non-round numbers where the real figure is non-round: 2,066% reads as true because it is.

Rows: one proof point each. Columns: what it is, where it fits, and whether it can be used.

Proof pointTypeFits which ICPsExact figureSourceStatus

Type is one of: named customer, volume, result, rating, backer, partner. Status is one of: Verified, Needs client confirmation, MISSING.

Banned versus required. Rows: claim types. Columns: the vague version, the required version.

Claim typeBannedRequired
Customer base"trusted by thousands""10,000+ Amazon and Shopify sellers"
Rating"top-rated app""rated 4.9 on the Xero App Store"
Named customers"used by leading studios""[named studio], [named studio] and 4,000+ architects in 135 countries"
Volume"processing significant volumes""over €500M a year on [regulator] infrastructure, with [bank] and [bank]"
Results"great results for clients""[named brand] moved 2,066% more units off a single feature"
Backers"backed by top investors""backed by [named fund]"

Never invent a name or a number for a real campaign. If an ICP needs proof that doesn't exist, mark it MISSING and ask. If the user explicitly wants a draft anyway, insert a visible slot such as [PROOF: named 3PL customer + monthly invoice volume]. Never a made-up name.


Stage 5: Subject lines

Every subject is an impersonal BuzzFeed-style trade headline about the prospect's peers. Two elements are mandatory on top of the style: a number and a recognizable name. The number makes it concrete. The name makes it relevant, because it's a company the prospect benchmarks against.

Rows: subject patterns. Columns: the pattern and an example.

PatternExample
How [Name] and [N] other [peers] [behavior]How GXO and 37 other 3PLs catch carrier overbilling before it gets paid
Why [N] [peers] like [Name] stopped [old behavior]Why 22 auto parts makers like Brembo stopped matching partial deliveries by hand
How [Name] went from [X] to [Y]How Philips and 6 shared service centers pushed touchless invoices from 38% to 81%
Why [Name] does [X] instead of [Y]Why DHL Supply Chain audits 100% of fuel surcharges instead of a 5% sample
[N] things [Name]'s [team] stopped doing [when]4 things Kuehne+Nagel's finance team stopped doing at month-end
Come [peers] [behavior] (Italian)Come i concessionari auto spediscono in tutta Italia senza rischio sul pagamento

For each ICP, write 3 candidates and run the check. Rows: candidate subjects. Columns: the five mandatory checks, then the verdict.

CandidateNumberRecognizable peer namePeer groupNo "you" / "your"No target, sender, product or offerVerdict

Pick one candidate with five PASS. Rules behind the checks:

  • The peer name is never the prospect's own employer and never the sender. At send time, if the prospect works at the name-dropped company, swap the name.
  • The subject never states the offer or the benefit as a pitch. It reads like industry news, not marketing.
  • Name and number in the subject must match the authority line. "GXO and 37 other 3PLs" in the subject means the body adds up to 38.
  • Specific beats clever: name the concrete behavior, not "working smarter".
  • Only deviate from this style if the user explicitly asks for a different format.

Stage 6: Email build

The four elements, always in this order

Rows: the four elements. Columns: job and rules.

ElementJobRules
1. Kairos (opener)Why this person, why now"I'm contacting you as you [run/lead X] at {{companyName}}..." or "Reaching out as I saw you're [title] at {{companyName}}...". Always first. No greeting, no congrats, no flattery
2. AuthorityWhy believe it"I'm [Sender], [Title] at [Company]." then 1 to 2 sentences of names from their industry and exact numbers
3. How it worksWhat it is and why it's better3 to 4 steps, then one value line with a number, strongest word last
4. CTAThe reply"Would you mind if I share..." plus a free asset built for this ICP

Never open with the pitch and never open with authority. In campaigns sent from a company alias with a full signature (e.g. formal Italian Lei), the self-intro can fold into the authority line. The authority itself is never optional.

How it works is the default explanation

In most situations, How it works step by step is the best way to explain a product. A prospect can picture four steps inside their own workflow. They can't picture "AI-powered automation". A mechanism they can follow reads as true, a claim reads as marketing.

  • 3 to 4 steps, one action each, under 12 words, in their vocabulary (rate card, goods receipt, cost center, site sign-off).
  • Describe their workflow with the product, not the product's features.
  • Put the weight on the step from the ICP matrix that answers this ICP's pain.
  • Close with one value line carrying a number.
  • In Variant A, compress to one inline flow: "you set a CPC budget, publishers pitch you story ideas, you approve, they publish, you pay only for the clicks".

The CTA decides the campaign

Syntax: "Would you mind if I share..." / "Would you mind if I sent you..." / Italian: "Le dispiace se le mando...". A yes must unlock a mini action that creates real value for this prospect. The closer to their own material, the better.

Rows: asset types, strongest first. Columns: what the prospect gets, when it fits.

AssetWhat they getWhen it fits
Audit of their dataTheir real data run through the product, with the resultHighest intent. Needs them to share a sample
Sample from their materialOutput built from what's public: their site, their projectZero effort for them, strongest first impression
BenchmarkHow their peer group performs, in numbersSenior titles who manage by KPI
Template or caseThe document peers use, ready to adaptOps roles and follow-ups
  • Never on touch 1: a call, a calendar link, "15 minutes", a free trial of an expensive service, a physical sample.
  • Banned on any touch: "Worth a quick chat?", "Worth a call to discuss?", "Got 20 mins this week?", "Open to a call?", and any "[value summary] + worth a call?" construction.
  • Sanctioned exception: when the user defines a size split, the over-threshold segment may get a meeting CTA paired with a free trial account. Only when the user sets it up.

Build table, then render

For each ICP, fill the build table first. Rows: the parts of the email. Columns: the content, and the rule check.

PartContentRule check
Kairos openerPASS / FAIL
Self-intro + authorityPASS / FAIL
How it works stepsPASS / FAIL
Value linePASS / FAIL
CTAPASS / FAIL
Sign-offBest, [Sender]PASS / FAIL

Then render two variants:

  • Variant A, super short: 5 to 10 rows, under 80 words, inline How it works.
  • Variant B, mid size: 10 to 20 rows, 100 to 150 words, numbered How it works.

Variant B skeleton:

Subject: [Stage 5 winner]

Hi {{firstName}},

I'm contacting you as you [run/lead X] at {{companyName}}, [one clause of context from their world].

I'm [Sender], [Title] at [Company]. [Named peers from their industry] and [N others] [do X at exact volume] with us.

How it works:

1. [Step in their vocabulary]
2. [Step, weighted for this ICP's pain]
3. [Step]
4. [Step]

[Value line with an exact number, strongest word last].

Would you mind if I [share the free asset built for this ICP]?

Best,
[Sender]

Tone rules

  • Decisive, professional, friendly. A human operator, not a marketing bot.
  • Sentences under 20 words. Contractions. Lead with the point.
  • Max two merge tags: {{firstName}}, {{companyName}}. Heavy templating reads fake.
  • No greetings or congrats ("Hope you're well", "Congrats on the raise").
  • Never lecture the prospect about their industry or describe their problem to them.
  • Banned words: synergy, leverage, unlock, game-changer, revolutionary, delve, streamline, empower.
  • No em dashes or double dashes. Sign off "Best,".
  • If a voice-profile skill for the sender is available, apply it. If ai-tells is available, run a light pass.

Stage 7: Follow-up sequence

The opener is followed by 5 follow-ups. They alternate: same subject as a reply in the thread, then a new subject in a new thread, then the same subject again. Same-subject touches keep the offer alive. New-subject touches are a second first impression for someone who ignored the first: new subject, new named proof, new asset.

Rows: the 6 touches. Columns: send day, subject, thread, job, length, CTA.

TouchDaySubjectThreadJobLengthCTA
Opener1ANew thread AFull email: Kairos, authority, How it works, CTA100 to 150 wordsAsset 1
FU13Re: AReply in ABump with one new detail on asset 1Under 50Asset 1
FU27BNew thread BNew angle, new named proof, short How it works60 to 100Asset 2
FU310Re: BReply in BOne number from asset 2Under 40Asset 2
FU415CNew thread CListicle or case. First touch where a call may appear, as an alternative60 to 100Asset 3 or a 15-minute walkthrough on their data
FU521Re: CReply in CClose the loop, ask for the right person, keep asset 1 openUnder 50Referral + asset 1
  • Subjects B and C pass the full Stage 5 check: number, peer name, peer group, no "you", no target, sender or pitch.
  • Never "just checking in", "bumping this" or "did you see my email". Every bump adds one new fact.
  • A call never appears before touch 3, and always as an alternative to the asset, never instead of it.
  • Stop on any reply. Out-of-office with a return date: pause and resume after it.

Output the sequence table filled for the ICP, then the full copy of all 6 touches in text blocks.


Stage 8: Pre-send QA

Run on every email, every variant, every follow-up. Rows: the checks. Columns: result, and the fix if it failed. Deliver only emails where every row is PASS.

CheckResultFix if FAIL
Opener says why this person: what they do or run
2+ recognizable names from their industry in the authority line
At least 1 exact figure, non-round where the real one is
How it works in 3 to 4 steps, in their vocabulary
One value line with a number
CTA is "Would you mind if I..." + a free asset built for this ICP
No call, calendar link or "15 minutes" on touch 1
Subject has a number and a recognizable peer name
Subject never names the target, the sender or the offer, never says "you"
Subject name and number match the authority line
Max 2 merge tags
No em dashes, no buzzwords, no greeting or congrats
Under 80 words (A) or 150 words (B)
Every name and number is Verified in the Stage 4 inventory

When reviewing someone else's draft, run this table on their draft first, then rewrite through Stages 5 and 6.


Stage 9: Weekly review

Every campaign is an experiment. Measure on delivered emails, never opens: Apple Mail Privacy Protection preloads images, so open rates don't mean much.

Rows: one campaign each. Columns: the ICP, the metrics, and the decision.

CampaignIndustryTitleSubject hookCTA assetDeliveredBounceReplyPositiveSignalAction

Decision rules. Rows: signals. Columns: starting threshold (calibrate after 4 weeks of real data), usual meaning, action.

SignalStarting thresholdUsually meansAction
BouncesAbove 2%Guessed emails, catch-all domainsPause. Re-verify, drop or batch catch-alls
Few replies of any kindUnder 1.5% after 300 deliveredSubject or opener not landingNew subject with a different peer name and number. Keep the body
Replies, few positiveUnder 1% positive after 300 deliveredRelevance holds, offer is weakChange the CTA asset. Move it closer to their data
"Not me" repliesMore than a third of repliesWrong title for this painMove the title filter one level up or down
"Send more info" repliesRecurringAsset too vagueMake the asset personal: their data, their site
Strong positivesAbove 3% positiveICP and hook both workClone the hook to the adjacent industry, same title

Change one variable at a time, otherwise nothing is learned. Close every review with a new hooks table. Rows: ICPs getting a new hook. Columns: new peer name, new number, new asset, what it replaces.

ICPNew peer nameNew numberNew assetReplaces

Output order for a full campaign

  1. Stage 1 intake table (and questions, if anything is MISSING)
  2. Stage 3 ICP matrix, then the relevance test
  3. Stage 4 proof inventory
  4. Per ICP: Stage 5 subject check, Stage 6 build table, Variant A and Variant B
  5. Stage 7 sequence table and full copy (for each ICP, or for the first ICP as the pattern when the user asks for a sample)
  6. Stage 8 QA table

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.

Need help setting it up?

This page tells you what outbound-framework 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.