auto-research-public
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Checks whether a company's own website mentions a specific keyword, using one simple Google site: query per keyword through a SERP API, and turns the hit into a copy-ready line. Triggers on "does their site mention X", "site: search", "find companies whose website says X",
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-google-site-search --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/playbook-google-site-searchContext preview
The summary Claude sees to decide when to auto-load this skill.
Checks whether a company's own website mentions a specific keyword, using one simple Google site: query per keyword through a SERP API, and turns the hit into a copy-ready line. Triggers on "does their site mention X", "site: search", "find companies whose website says X",
name: playbook-google-site-search description: Checks whether a company's own website mentions a specific keyword, using one simple Google site: query per keyword through a SERP API, and turns the hit into a copy-ready line. Triggers on "does their site mention X", "site: search", "find companies whose website says X", "filter this list by a keyword on their site", "check if they talk about X", "google search enrichment". Outputs site_keyword_hit plus a one-clause personalization line with an evidence URL.
> 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:** a campaign needs to know whether each company's own website talks about a specific thing — a certification, a technology, a service line, a location, a program name — and no structured API sells that field.
**Do not use when:** you need to *find* companies you do not have yet; when the thing you want is a **page** rather than a phrase (`playbook-pricing-page`, `playbook-case-study-page`); or when a real filterable field already exists (funding stage, headcount, technology installed) — filter at the source and skip this entirely.
**One-line output:** `site_keyword_line = "you hold SOC 2 Type II certification"`, rendering as `Noticed you hold SOC 2 Type II certification.`
You have a list of domains. Someone asks "which of these mention X on their website?"
**It does two jobs at once, and you should know which one you are buying.** As a **filter** it tells you which rows to keep — that half is reliable. As a **personalization signal** it gives you an evidence URL and a line — that half needs the confidence gate in §2, **because a page can contain your keyword for reasons that have nothing to do with the company.**
**It does not prove a company lacks something.** The index is incomplete and its results are **not even stable between two identical calls a minute apart** (measured). An empty result means "not found in the index today", never "this company does not do X".
`site:acme.com "chess"`. **Never** `site:acme.com ("chess" OR "checkers" OR "board games")`.
Measured:
| Query | Precision | |---|---| | `site:n8n.io "SOC 2"` | **10/10 results contained the phrase** | | the same domain with a 7-term OR chain | **4/10** | | `site:uschess.org "Brooklyn"` | 8/10 on target | | the same with an OR chain | **2/10**, and it drifted to a chess house in New Orleans |
The chain also **destroys attribution**: one response for seven keywords means you cannot tell which one matched.
| Field | Type | Required? | |---|---|---| | `domain` (bare, lowercase, no scheme, no `www`) | string | yes | | `keyword` | string, the exact phrase | yes | | `company_name` | string | no, improves readability |
**The keyword is a campaign-level constant, not a per-row value.** One campaign, one keyword. Three keywords means three columns and three queries per row, each with its own answerable yes or no.
| Field | Type | Example | Null? | |---|---|---|---| | `site_keyword_hit` | `"yes"` or `""` | `yes` | yes | | `site_keyword_line` | string | `you hold SOC 2 Type II certification` | yes | | `site_keyword_url` | URL | `https://linear.app/security` | yes | | `site_keyword_status` | `has` / `planned` / `discusses` / `none` | `has` | no | | `confidence` | `high` / `low` | `high` | no | | `campaign_usable` | boolean | `true` | no | | `site_keyword_sentence` | the **whole pre-rendered sentence** with its period and one trailing space | `Noticed you hold SOC 2 Type II certification. ` | yes |
**`campaign_usable` is the gate, and it is deliberately stricter than `site_keyword_hit`.** True only when `status == "has"` AND `confidence == "high"`.
It is `""` otherwise — **including on rows where `site_keyword_hit == "yes"`.** This is not a downstream convention an operator is trusted to remember. It must be computed that way, and `campaign_usable` must be computed **first**.
**Why this is written this hard.** In the graded test the judge returned, for one domain:
{"mentions": true, "status": "discusses", "confidence": "low",
"line": "you passed your SOC 2 audit on the first try"}The evidence URL was a **prompt-template marketing page on that company's own site** — the sentence had been scraped out of an *example cold email printed inside their own content*. **That company had passed no such audit.** `site_keyword_hit` was `yes`, so any pipeline that ships the line whenever there is a hit **sends a fabricated compliance claim about the prospect's own company, to that company.**
A row that is a hit but not usable is still a perfectly good **filter** answer. Keep the hit flag for segmentation. Just never let it drive copy.
9/10 rows usable (90%) in the graded test: six genuine hits, four abstains (three correct).
**Read that carefully before making the variable mandatory.** On a real list roughly **half to two thirds of rows will abstain**, because most companies do not mention most keywords. **The 90% is the accuracy of the answer, not the fill rate.**
**And the 90% is retrieval accuracy, not copy quality.** Among rows that **cleared** the gate, roughly **1 in 6 carried a grammar or brand-casing defect** a human would have to fix by hand. Measured: one row shipped `campaign_usable=true` with "you have SOC 2 Type 2 attestation" — missing an article. Another shipped "linear undergoes regular SOC 2 audits" with the brand lowercased, because **the model itself wrote it lowercase, and a sanitizer's brand guard only prevents the sanitizer from lowercasing — it does not re-capitalize what arrived lowercase.**
**Neither defect is caught by anything down
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…