auto-research-public
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Decides whether a company publishes public self-serve pricing and extracts its plan tiers, price points and feature axis. Triggers on "do they have a pricing page", "is their pricing public", "filter out enterprise quote-only companies", "what do they charge", "find their
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-pricing-page --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/playbook-pricing-pageContext preview
The summary Claude sees to decide when to auto-load this skill.
Decides whether a company publishes public self-serve pricing and extracts its plan tiers, price points and feature axis. Triggers on "do they have a pricing page", "is their pricing public", "filter out enterprise quote-only companies", "what do they charge", "find their
name: playbook-pricing-page description: Decides whether a company publishes public self-serve pricing and extracts its plan tiers, price points and feature axis. Triggers on "do they have a pricing page", "is their pricing public", "filter out enterprise quote-only companies", "what do they charge", "find their plans", "self-serve vs sales-led". Outputs a structured pricing record per domain. The copy-ready pricing clause is OFF by default and runs only when a campaign brief asks for it.
> 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 campaign needs to separate self-serve companies from sales-led ones, or needs a real price point to anchor an offer against.
**Do not use when:** you want technology installed on the site (`playbook-tech-on-website`).
**One-line output:** `pricing_public = true` with `plans = [{"name":"Basic","price":"$10","period":"month"}, ...]` and `lowest_paid_price = "$10"`.
Does this business publish real prices on its own website, and if so what are the tiers?
**It is used for filtering first and copy second.** The most common job is splitting a list into product-led companies (public price list, card checkout, low ACV) and sales-led companies (every tier says Contact Sales) — because those two groups need completely different offers and completely different copy.
The deliverable is the structured record: `pricing_public`, `pricing_model`, `plans`, `lowest_paid_price`, `has_free_tier`, `enterprise_quote_only`, `feature_diff_axis`.
The one-clause string `pricing_line` is an **opt-in extra, it is the weakest part of the output**, and it should be stripped at the output boundary unless explicitly requested. **A price in a stranger's inbox is a claim you have to be right about, and most campaigns using this playbook only ever wanted the filter.**
It does **not** cover: what a prospect actually pays after negotiation, private rate cards, marketplace listings, or ecommerce SKU prices.
**If every tier says Contact Sales, the correct answer is `pricing_public: false` — a real and useful signal, not a failure.**
| Field | Type | Required? | |---|---|---| | `domain` (bare, lowercase, no scheme, no `www`) | string | yes | | `company_name` | string | no, improves the copy line only |
| Field | Type | Example | Null? | |---|---|---|---| | `pricing_public` | boolean | `true` | no, defaults false | | `pricing_url` | string | `https://www.notion.com/pricing` | yes, `""` | | `pricing_model` | `per_seat` / `usage` / `flat` / `credits` / `quote_only` / `unknown` | `per_seat` | no | | `plans` | array of `{name, price, period}`, max 6 | see above | yes, `[]` | | `lowest_paid_price` | string | `$10` | yes, `""` | | `has_free_tier` | boolean | `true` | no | | `enterprise_quote_only` | boolean | `true` | no | | `feature_diff_axis` | ≤6 words | `seats and automation limits` | yes, `""` | | `confidence` | `high` / `low` | `high` | no | | `pricing_line` | **OPT-IN, off by default** | `your Basic plan is $10 per user per month` | absent on a default run |
can filter on.**
not be filtered out on your say-so.**
Collapsing these two is how a campaign silently deletes real prospects because of a network error.
**8/10 rows produced a usable filtering record.** The existence check alone was **10/10**. That is the number to plan on, because the filtering record is the whole default deliverable.
The optional copy string was usable on 9/10 in the clean regrade but **6/10 once corrected on an earlier run** — so treat it as a **70-to-90% field**: spintax-optional, never mandatory. That spread is part of why it is off by default.
**Whether a pricing value removes a row is decided per campaign brief.** This playbook produces the bones; the brief says what to do with them. Ask once, up front:
sense for self-serve companies, or only for sales-led ones.
list are sellable, which is the common case.
⚠️ **Either way, `pricing_model: "unknown"` never removes a row.** Only act on `confidence: "high"` findings.
**If the brief is silent, route rather than delete**, and say so in the handoff. Deleting rows is a client-facing, money-adjacent decision, and **it is cheap to reverse a routing choice and expensive to reverse a deletion.**
| # | Source | Cost | Call | Result | |---|---|---|---|---| | 1 | **URL-guess existence check** | FREE | `HEAD https://{domain}/pricing`, then `/pricing/`, `/plans`, `/pricing-plans`, `/price`, then the same on `www.`. Browser UA, follow redirects, and **accept only when the final status is 2xx AND the final resolved path still matches `/pricing\|plans\|price/`** | **10/10 correct.** 15/16 pages found on the first candidate — **but the candidate walk is not optional:** one company only resolves via `/pricing → /plans/`, and two needed all 7 | | 2 | Plain GET of the found URL | FREE | same browser UA, strip script/style/svg/comments to visible text, then take the **price-dense window** (not the first N chars), capped at 14,000 characters | 15/16 pages readable | | 3 | Rendering proxy | METERED | JS render with a wait | **0/1 rescued.** Only when step 2 produced under 800 characters of visible text OR fewer than 2 currency amounts. **
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…