Skip to content
Sales
Skill

/playbook-job-posting-language

Produces a copy-ready clause about a role a company is currently hiring for, filtered by language the client cares about (for example "cold call", "outbound prospecting", "Salesforce"). Triggers on "they're hiring", "job posting language", "who is hiring SDRs", "companies hiring

BOOST
From plugin
coldoutboundskills
76452 skills
Install
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-job-posting-language --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-job-posting-language

Context preview

The summary Claude sees to decide when to auto-load this skill.

Produces a copy-ready clause about a role a company is currently hiring for, filtered by language the client cares about (for example "cold call", "outbound prospecting", "Salesforce"). Triggers on "they're hiring", "job posting language", "who is hiring SDRs", "companies hiring

SKILL.md

playbook-job-posting-language.SKILL.md
name: playbook-job-posting-language
description: Produces a copy-ready clause about a role a company is currently hiring for, filtered by language the client cares about (for example "cold call", "outbound prospecting", "Salesforce"). Triggers on "they're hiring", "job posting language", "who is hiring SDRs", "companies hiring for X", "find the hiring signal", "what roles are they hiring for", "job description mentions". Outputs job_posting_line_safe, one lowercase clause that slots into "Saw {{job_posting_line_safe}}."

Playbook: Job Posting Language

> 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 is "you are hiring for this, and that is exactly what we help with". The client names the roles or the description language that signals a fit, and every row needs a specific, current opening to reference.

**Do not use when:** you want *how many* people they hired or headcount growth over time (`playbook-hiring-surge`). If you want to **find** companies hiring a role rather than enrich a list you already have, that is discovery mode — see note E.

**One-line output:** `job_posting_line_safe = "you're hiring an account executive for private equity"`

⚠️ **Never bind copy to the ungated `job_posting_line`.** The `_safe` field is the same value blanked whenever the posting is older than 30 days. §6 explains why that gate is not optional.

1. Trigger and scope

A company posts jobs. Those postings say what the company is **about to spend money on** and what problems it is trying to staff around. If a client sells to sales teams, "this company posted an SDR job three weeks ago and the description talks about cold calling" is a better opening line than anything you could invent.

This takes a list of domains you already have and puts one sentence fragment on each row. It covers **job-board-sourced postings only**. It does not scrape career pages by default, does not count hires over time, and does not find new companies.

It also carries a decision people get wrong constantly: **filter with keywords first, and only add an AI classifier if a measurement proves keywords are not enough.** Note C is that measurement, already run.

2. Output contract

Inputs required per row

| Field | Type | Required? | |---|---|---| | `company_domain` (bare, lowercase) | string | yes | | `company_name` | string | yes — used by the mandatory name-match gate in §7 | | `keyword_set` | string[] | yes, **set once per campaign, not per row** | | `role_titles` | string[] | no, see note C | | `window_days` | number | no. **Default 60 to detect, 30 for claims in copy** |

Output fields

| Field | Type | Example | Null? | |---|---|---|---| | `job_posting_line_safe` | string, ≤90 chars | `you're hiring an account executive for private equity` | no, use `""` | | `job_posting_line` | string | same | **ungated. Audit and debugging only, never in a send** | | `job_role_named` | string | `account executive for private equity` | no, `""` | | `job_evidence_url` | string | the posting URL | no, `""` | | `job_posted_date` | date | `2026-07-30` | no, `""` | | `job_confidence` | `high` / `low` | `high` | no |

Coverage expectation

**7/8 rows usable (87.5%).** Broken down honestly, because campaign setup needs the real shape: 5 of 8 produced a written line, 3 abstained, **all 3 abstains were correct.**

Expect roughly **60% of a healthy B2B software TAM to produce a line before the freshness gate.**

⚠️ **After the mandatory 30-day gate, plan on 35 to 40%.** Any row whose only posting is 31 to 60 days old blanks by design. On the live-test set that was **2 of the 5 generating rows** — one at 53 days (correctly killed, the role is gone from the company's live board) and one at 49 days that was **verified genuinely open** and the gate kills anyway.

**That second row is the cost of a blunt proxy: a real open role, killed by its age.** A source with a true "is this still open" boolean would keep it. The age proxy is what you have unless your source exposes live status.

So `job_posting_line_safe` **cannot be a mandatory variable in copy.**

Copy-fit rules

  • Slots into `Saw {{job_posting_line_safe}}.` and nothing else. **Test every generated value in that

exact frame.**

  • Starts with the word "you", lowercase, no trailing period.
  • 12 words or fewer, 5th-grade reading level, no em dashes.
  • **Raw job titles are not copy.** `Partner Development Representative | Advisory and Services` has to

become `a partner development representative`. **That rewrite is the only thing the AI step exists for.**

Downstream gate

If empty: drop the clause through spintax and keep the row. Do not exclude the row unless the client asked for a hiring-only segment — in which case exclude **at list build time, not at send time.**

3. Source chain (cost-tagged)

| # | Source | Cost | Call | Result | |---|---|---|---|---| | 1 | **A jobs API keyed on the company's job-board profile** | often FREE / unlimited | resolve `domain → company profile`, then query postings with `date_posted.last_days: 60` and `description.include: [keywords]` | 5/8 companies returned a matched posting; **7/8 rows produced a correct final value** | | 2 | A second jobs provider, queried by bare domain | FREE on some plans | skips the profile-resolution step that step 1 can get wrong | run on every row step 1 could not answer, **or whose company name failed the name-match gate** | | 3 | A company-search API's open-jobs filters | FREE on some plans | company-level "are they hiring for this title" | **it gates and sizes, it does not quote** — it cannot produce an evidence URL | | 4 | A search API over the company's own careers page | METERED | one search per row | ⛔ **only when the operator explicitly asks. Never by default.** Career-page scraping is a different job with a different failure surface, and steps 1 to 3 are free | | 5 | The li

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.