Skip to content
Sales
Skill

/playbook-google-site-search

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",

BOOST
From plugin
coldoutboundskills
76452 skills
Install
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-google-site-search --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-google-site-search

Context 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",

SKILL.md

playbook-google-site-search.SKILL.md
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.

Playbook: Google `site:` Keyword Filter

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

1. Trigger and scope

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

The rule that defines this playbook: one keyword, one query

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

2. Output contract

Inputs required per row

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

Output fields

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

⚠️ `site_keyword_line` is emitted ONLY when `campaign_usable` is true

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.

Coverage expectation

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

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.