Example output: examples/seo-ads-hostinger-com-20260514/ADS.md
Paid-Search Intelligence (Ads)
Map the competitive paid-search landscape around a domain's or keyword's target terms, reconstructed keyword-by-keyword from the live SERP ad block. Output: a brief on who is bidding (and on what copy), who else bids on the same terms, ad-copy patterns the leading advertisers use, CPC/competition signals, SERP ad+shopping presence per keyword, and a recommended bid-keyword shortlist.
Limitation — read this first. Domain-level "all keywords a competitor bids on" requires a paid-keyword database. This skill reconstructs the paid footprint keyword-by-keyword from live SERP ad blocks — narrower than a paid-keyword database, but needs no extra subscription. In domain mode, you supply (or the skill seeds) the keyword set to probe; the skill cannot enumerate every term a competitor secretly bids on, only what surfaces as ads for the keywords probed.
Prerequisites
- DataForSEO MCP server connected. (Provides the live SERP ad blocks and Google Ads CPC/competition data the paid landscape is reconstructed from.)
- GA4 already connected (
mcp__google-analytics__*) for own paid-traffic performance (Paid Search channel).
- User provides: (a) a target domain OR a target keyword (skill detects which), (b) a seed keyword set when in domain mode (the terms to probe — derive from the brand's category/products if the user gives none), (c) target country (default
us).
Process
Validate input & preflight
- Determine: domain mode (probe a seed keyword set and isolate the target brand's ads) or keyword mode (analyse the bidding landscape for one keyword).
- In domain mode, assemble the seed keyword set: use the user's list if provided, otherwise derive ~10–20 head terms from the brand's category, products, and homepage. State the seed set explicitly — it defines the footprint this run can see.
- DataForSEO bills per call; this run issues ~10–25 calls (one SERP call per seed keyword + one volume/CPC batch). Use the documented
limit/ceiling params to cap.
Domain mode — reconstruct paid footprint mcp__dataforseo__serp_organic_live_advanced (per seed keyword) + mcp__dataforseo__kw_data_google_ads_search_volume
- For each seed keyword, call
serp_organic_live_advanced and read the paid/ad block (tads/bads) plus the shopping pack (sads). Keep only the rows where the target domain is the advertiser.
- For each such keyword: keyword, ad position, ad copy (title + description), display/destination URL.
- Enrich every seed keyword with
kw_data_google_ads_search_volume for search volume, CPC, competition, and competition_index (the bidding landscape).
- Sort by traffic-weighted score (
volume × CTR-by-paid-position × bid-share).
- This is the reconstructed footprint — it covers only the seed keywords probed, not every term the domain bids on (see limitation above).
Keyword mode mcp__dataforseo__serp_organic_live_advanced (read the live paid/ad block) + mcp__dataforseo__kw_data_google_ads_search_volume
- Call
serp_organic_live_advanced on the target keyword and read every advertiser in the ad block.
- For each: domain, ad position, ad copy, URL.
- Surface the top 10 advertisers + their copy patterns. Pull CPC, competition, and competition_index for the keyword with
kw_data_google_ads_search_volume to quantify the bidding landscape.
Intent enrichment mcp__dataforseo__dataforseo_labs_google_keyword_ideas (filter interrogatives: who/what/why/how/can/does…)
- For the keyword(s) in scope, mine question-phrased variants.
- Identifies question-phrased intent variants worth bidding on (often cheaper, higher conversion). Pull their CPC/competition with
kw_data_google_ads_search_volume.
SERP ad/shopping presence mcp__dataforseo__serp_organic_live_advanced
- For top 5 keywords (domain mode) or the target keyword (keyword mode):
- Use SERP-feature filters to detect ad-pack composition:
tads (top ads above organic), bads (bottom ads below organic), sads (shopping ads / Google Shopping pack), mads (mobile/map-pack ads).
- Top SERP ad slots (positions 1-4 above organic, 1-3 below).
- Shopping pack presence (carousel of product cards).
- Image pack, local pack — these displace ad inventory.
- Capture which advertisers occupy those slots.
Ad copy pattern analysis
- Cluster ad headlines + descriptions by recurring patterns.
- Identify: USP language used by leaders, pricing/discount mentions, audience segmentation, CTA verbs.
- Highlight outliers (advertisers doing something different).
Competitor footprint gap (domain mode) mcp__dataforseo__serp_organic_live_advanced (per seed keyword)
- From the per-keyword ad blocks already collected in step 2, build the advertiser-by-keyword matrix: for each seed keyword, list every advertiser holding an ad slot.
- Identify the top recurring competitor advertisers (those appearing across the most seed keywords).
- Diff: seed keywords where competitors hold ad slots but the target domain does not.
- This becomes the highest-leverage portion of the bid-keyword shortlist (step 8). Note it is scoped to the seed set, not the competitor's full paid footprint.
- Skip in keyword mode (no domain to gap against).
Own paid performance (own domain only) mcp__google-analytics__run_report
- When the target domain is the user's own GA4-connected property, pull paid performance from GA4 filtered to the Paid Search channel: sessions, conversions, and (where available) revenue by landing page / campaign. Use
run_conversions_report for conversion-goal detail.
- This grounds the bid-keyword shortlist in first-party outcomes (which paid landing pages actually convert), not just SERP-observed competition.
- Skip when analysing a third-party domain (no GA4 access to it).
Recommended bid-keyword shortlist
- For domain mode: footprint gap from step 7 + adjacent question-intent variants, weighted by own paid performance (step 8) where available.
- For keyword mode: question-intent and long-tail variants that are likely cheaper than the head term.
- Each row: keyword, est. CPC, est. volume, who else bids, why-recommended.
Synthesise ADS.md
Output format
Create a folder seo-ads-{target-slug}-{YYYYMMDD}/ with:
seo-ads-{target-slug}-{YYYYMMDD}/
├── ADS.md (synthesised brief — primary deliverable; inlines paid footprint, bidding landscape, SERP ad/shopping pack, ad copy patterns, competitor footprint gap)
├── recommended-keywords.csv (bid-keyword shortlist — load-bearing CSV the PPC team pastes into bid tooling)
└── evidence/
├── 01-paid-footprint.md (domain mode: target's reconstructed paid footprint across seed keywords — raw step output)
├── 02-bidding-landscape.md (keyword mode: advertisers on the keyword — raw step output)
├── 03-question-variants.md (keyword-ideas interrogative enrichment + CPC/competition)
├── 04-serp-ad-shopping-pack.md (SERP feature inventory per keyword)
├── 05-ad-copy-patterns.md (clustered headline/description patterns)
└── 06-competitor-footprint-gap.md (domain mode: advertiser-by-keyword matrix + gap vs target across seed set)
Step files 01, 02, 04, 05, 06 are inlined as sections in ADS.md; the copies in evidence/ preserve the raw step outputs for reproducibility.
ADS.md follows this shape:
# Paid-Search Intelligence: {target}
> Snapshot dated {YYYY-MM-DD} · Country: {country} · Mode: {domain | keyword}
## Footprint summary
- Paid keywords: {n}
- Estimated paid traffic: {n}/mo
- Average CPC: ${n}
- SERP slots covered: {n} of top-4 above organic across {n} target keywords
## Top 10 paid keywords (domain mode)
| Keyword | Volume | CPC | Position | Ad copy excerpt |
|---|---|---|---|---|
| {kw} | {n} | ${n} | {pos} | "{headline} — {snippet}" |
| ...
## Bidding landscape (keyword mode — for "{keyword}")
| Advertiser | Position | Ad copy excerpt | URL |
|---|---|---|---|
| {domain} | {pos} | "{headline} — {snippet}" | {url} |
| ...
## Ad copy patterns (top patterns observed)
1. **Pricing-led:** "{N}% off — start at ${X}/mo" — used by {n} advertisers.
2. **Outcome-led:** "Get {specific outcome} in {time}" — used by {n}.
3. **Trust-led:** "Trusted by {n} {audience}" — used by {n}.
4. ...
## SERP feature inventory
| Keyword | Top ads | Shopping pack | PAA | Image pack |
|---|---|---|---|---|
| {kw} | {advertiser list} | {✓/✗} | {✓/✗} | {✓/✗} |
| ...
## Recommended bid-keyword shortlist
See `recommended-keywords.csv`. Top 10:
| Keyword | Volume | Est. CPC | Why |
|---|---|---|---|
| {kw} | {n} | ${n} | Question-intent variant; competitor X bids on head term but not this. |
| ...
## Constraints / caveats
- CPC and volume estimates are directional. Actual costs depend on Quality Score, time of day, audience, etc.
- {Note any ad-copy that's clearly seasonal / promotional and may not represent steady-state.}
## Recommended next step
Cross-reference these paid keywords with `seo-keyword-cluster` output to find under-served paid clusters. For organic content opportunities corresponding to these paid keywords, run `seo-keyword-niche`.
recommended-keywords.csv columns: keyword,volume,cpc_estimate,position_target,intent,competitor_count,why_recommended
Tips
- DataForSEO allows up to 2,000 calls/min, 30 concurrent; pace sequentially. Domain mode: one SERP call per seed keyword plus a volume/CPC batch. Keyword mode: ~3 calls.
- Cost: DataForSEO bills per call; ~10–25 calls typical for domain mode (scales with seed-keyword count), ~5–10 for keyword mode. Cap large lists with
limit/ceiling.
- CPC estimates lag.
kw_data_google_ads_search_volume CPC is Google Ads aggregate data, not real-time auction data; treat as ±30% directional.
- Ad copy often reveals competitor positioning before product launches do — periodic review (quarterly) catches strategic shifts.
- Question-intent variants often have lower CPC and higher conversion than head terms. The shortlist in step 8 prioritises these.
- Pair with
seo-keyword-niche for organic content opportunities derived from paid keyword research.
- Pair with
seo-competitor-pages if the bidding landscape reveals "X vs Y" / "alternatives" intent — those keywords convert best as comparison pages, not paid ads.
- The paid landscape is reconstructed from the live SERP, keyword by keyword. There is no domain-level "all keywords a competitor bids on" tool here; the footprint is only as complete as the seed keyword set you probe. Widen the seed set to widen coverage. The mechanics:
mcp__dataforseo__serp_organic_live_advanced reads the paid/ad and shopping blocks (top ads, bottom ads, shopping carousel) per keyword, and mcp__dataforseo__kw_data_google_ads_search_volume supplies CPC/competition/competition_index for the bidding landscape. Optional accelerator: a user who already has a paid-keyword database MCP can substitute it for the seed-set enumeration in domain mode — not required.
- Don't recommend paid keywords without context. The shortlist is a starting point for the PPC team, not an autopilot.
1---2name: seo-ads3description: Paid-search competitive landscape for a domain or keyword. Reconstructs the paid footprint keyword-by-keyword from live SERP ad blocks — advertisers, ad copy patterns, who else bids on the same keywords, CPC/competition signals, SERP shopping/ad-pack visibility — and produces a competitive ads brief plus a recommended bid-keyword shortlist. Use when the user asks "paid search analysis", "competitor ads", "PPC competitive", "ad copy intelligence", "shopping pack", "who bids on this keyword", or "paid keyword footprint".4---5> Example output: [examples/seo-ads-hostinger-com-20260514/ADS.md](../../examples/seo-ads-hostinger-com-20260514/ADS.md)67# Paid-Search Intelligence (Ads)89Map the competitive paid-search landscape around a domain's or keyword's target terms, reconstructed keyword-by-keyword from the live SERP ad block. Output: a brief on who is bidding (and on what copy), who else bids on the same terms, ad-copy patterns the leading advertisers use, CPC/competition signals, SERP ad+shopping presence per keyword, and a recommended bid-keyword shortlist.1011> **Limitation — read this first.** Domain-level "all keywords a competitor bids on" requires a paid-keyword database. This skill reconstructs the paid footprint keyword-by-keyword from live SERP ad blocks — narrower than a paid-keyword database, but needs no extra subscription. In **domain mode**, you supply (or the skill seeds) the keyword set to probe; the skill cannot enumerate every term a competitor secretly bids on, only what surfaces as ads for the keywords probed.1213## Prerequisites1415- DataForSEO MCP server connected. (Provides the live SERP ad blocks and Google Ads CPC/competition data the paid landscape is reconstructed from.)16- GA4 already connected (`mcp__google-analytics__*`) for own paid-traffic performance (Paid Search channel).17- User provides: (a) a target domain OR a target keyword (skill detects which), (b) a seed keyword set when in domain mode (the terms to probe — derive from the brand's category/products if the user gives none), (c) target country (default `us`).1819## Process20211. **Validate input & preflight**22 - Determine: domain mode (probe a seed keyword set and isolate the target brand's ads) or keyword mode (analyse the bidding landscape for one keyword).23 - In domain mode, assemble the seed keyword set: use the user's list if provided, otherwise derive ~10–20 head terms from the brand's category, products, and homepage. State the seed set explicitly — it defines the footprint this run can see.24 - DataForSEO bills per call; this run issues ~10–25 calls (one SERP call per seed keyword + one volume/CPC batch). Use the documented `limit`/`ceiling` params to cap.25262. **Domain mode — reconstruct paid footprint** `mcp__dataforseo__serp_organic_live_advanced` (per seed keyword) + `mcp__dataforseo__kw_data_google_ads_search_volume`27 - For each seed keyword, call `serp_organic_live_advanced` and read the paid/ad block (`tads`/`bads`) plus the shopping pack (`sads`). Keep only the rows where the target domain is the advertiser.28 - For each such keyword: keyword, ad position, ad copy (title + description), display/destination URL.29 - Enrich every seed keyword with `kw_data_google_ads_search_volume` for search volume, CPC, competition, and competition_index (the bidding landscape).30 - Sort by traffic-weighted score (`volume × CTR-by-paid-position × bid-share`).31 - This is the reconstructed footprint — it covers only the seed keywords probed, not every term the domain bids on (see limitation above).32333. **Keyword mode** `mcp__dataforseo__serp_organic_live_advanced` (read the live paid/ad block) + `mcp__dataforseo__kw_data_google_ads_search_volume`34 - Call `serp_organic_live_advanced` on the target keyword and read every advertiser in the ad block.35 - For each: domain, ad position, ad copy, URL.36 - Surface the top 10 advertisers + their copy patterns. Pull CPC, competition, and competition_index for the keyword with `kw_data_google_ads_search_volume` to quantify the bidding landscape.37384. **Intent enrichment** `mcp__dataforseo__dataforseo_labs_google_keyword_ideas` (filter interrogatives: who/what/why/how/can/does…)39 - For the keyword(s) in scope, mine question-phrased variants.40 - Identifies question-phrased intent variants worth bidding on (often cheaper, higher conversion). Pull their CPC/competition with `kw_data_google_ads_search_volume`.41425. **SERP ad/shopping presence** `mcp__dataforseo__serp_organic_live_advanced`43 - For top 5 keywords (domain mode) or the target keyword (keyword mode):44 - Use SERP-feature filters to detect ad-pack composition: `tads` (top ads above organic), `bads` (bottom ads below organic), `sads` (shopping ads / Google Shopping pack), `mads` (mobile/map-pack ads).45 - Top SERP ad slots (positions 1-4 above organic, 1-3 below).46 - Shopping pack presence (carousel of product cards).47 - Image pack, local pack — these displace ad inventory.48 - Capture which advertisers occupy those slots.49506. **Ad copy pattern analysis**51 - Cluster ad headlines + descriptions by recurring patterns.52 - Identify: USP language used by leaders, pricing/discount mentions, audience segmentation, CTA verbs.53 - Highlight outliers (advertisers doing something different).54557. **Competitor footprint gap (domain mode)** `mcp__dataforseo__serp_organic_live_advanced` (per seed keyword)56 - From the per-keyword ad blocks already collected in step 2, build the advertiser-by-keyword matrix: for each seed keyword, list every advertiser holding an ad slot.57 - Identify the top recurring competitor advertisers (those appearing across the most seed keywords).58 - Diff: seed keywords where competitors hold ad slots but the target domain does not.59 - This becomes the highest-leverage portion of the bid-keyword shortlist (step 8). Note it is scoped to the seed set, not the competitor's full paid footprint.60 - Skip in keyword mode (no domain to gap against).61628. **Own paid performance (own domain only)** `mcp__google-analytics__run_report`63 - When the target domain is the user's own GA4-connected property, pull paid performance from GA4 filtered to the Paid Search channel: sessions, conversions, and (where available) revenue by landing page / campaign. Use `run_conversions_report` for conversion-goal detail.64 - This grounds the bid-keyword shortlist in first-party outcomes (which paid landing pages actually convert), not just SERP-observed competition.65 - Skip when analysing a third-party domain (no GA4 access to it).66679. **Recommended bid-keyword shortlist**68 - For domain mode: footprint gap from step 7 + adjacent question-intent variants, weighted by own paid performance (step 8) where available.69 - For keyword mode: question-intent and long-tail variants that are likely cheaper than the head term.70 - Each row: keyword, est. CPC, est. volume, who else bids, why-recommended.717210. **Synthesise** `ADS.md`7374## Output format7576Create a folder `seo-ads-{target-slug}-{YYYYMMDD}/` with:7778```79seo-ads-{target-slug}-{YYYYMMDD}/80├── ADS.md (synthesised brief — primary deliverable; inlines paid footprint, bidding landscape, SERP ad/shopping pack, ad copy patterns, competitor footprint gap)81├── recommended-keywords.csv (bid-keyword shortlist — load-bearing CSV the PPC team pastes into bid tooling)82└── evidence/83 ├── 01-paid-footprint.md (domain mode: target's reconstructed paid footprint across seed keywords — raw step output)84 ├── 02-bidding-landscape.md (keyword mode: advertisers on the keyword — raw step output)85 ├── 03-question-variants.md (keyword-ideas interrogative enrichment + CPC/competition)86 ├── 04-serp-ad-shopping-pack.md (SERP feature inventory per keyword)87 ├── 05-ad-copy-patterns.md (clustered headline/description patterns)88 └── 06-competitor-footprint-gap.md (domain mode: advertiser-by-keyword matrix + gap vs target across seed set)89```9091Step files 01, 02, 04, 05, 06 are inlined as sections in `ADS.md`; the copies in `evidence/` preserve the raw step outputs for reproducibility.9293`ADS.md` follows this shape:9495```markdown96# Paid-Search Intelligence: {target}9798> Snapshot dated {YYYY-MM-DD} · Country: {country} · Mode: {domain | keyword}99100## Footprint summary101- Paid keywords: {n}102- Estimated paid traffic: {n}/mo103- Average CPC: ${n}104- SERP slots covered: {n} of top-4 above organic across {n} target keywords105106## Top 10 paid keywords (domain mode)107108| Keyword | Volume | CPC | Position | Ad copy excerpt |109|---|---|---|---|---|110| {kw} | {n} | ${n} | {pos} | "{headline} — {snippet}" |111| ...112113## Bidding landscape (keyword mode — for "{keyword}")114115| Advertiser | Position | Ad copy excerpt | URL |116|---|---|---|---|117| {domain} | {pos} | "{headline} — {snippet}" | {url} |118| ...119120## Ad copy patterns (top patterns observed)1211221. **Pricing-led:** "{N}% off — start at ${X}/mo" — used by {n} advertisers.1232. **Outcome-led:** "Get {specific outcome} in {time}" — used by {n}.1243. **Trust-led:** "Trusted by {n} {audience}" — used by {n}.1254. ...126127## SERP feature inventory128129| Keyword | Top ads | Shopping pack | PAA | Image pack |130|---|---|---|---|---|131| {kw} | {advertiser list} | {✓/✗} | {✓/✗} | {✓/✗} |132| ...133134## Recommended bid-keyword shortlist135136See `recommended-keywords.csv`. Top 10:137138| Keyword | Volume | Est. CPC | Why |139|---|---|---|---|140| {kw} | {n} | ${n} | Question-intent variant; competitor X bids on head term but not this. |141| ...142143## Constraints / caveats144- CPC and volume estimates are directional. Actual costs depend on Quality Score, time of day, audience, etc.145- {Note any ad-copy that's clearly seasonal / promotional and may not represent steady-state.}146147## Recommended next step148Cross-reference these paid keywords with `seo-keyword-cluster` output to find under-served paid clusters. For organic content opportunities corresponding to these paid keywords, run `seo-keyword-niche`.149```150151`recommended-keywords.csv` columns: `keyword,volume,cpc_estimate,position_target,intent,competitor_count,why_recommended`152153## Tips154155- DataForSEO allows up to 2,000 calls/min, 30 concurrent; pace sequentially. Domain mode: one SERP call per seed keyword plus a volume/CPC batch. Keyword mode: ~3 calls.156- Cost: DataForSEO bills per call; ~10–25 calls typical for domain mode (scales with seed-keyword count), ~5–10 for keyword mode. Cap large lists with `limit`/`ceiling`.157- **CPC estimates lag.** `kw_data_google_ads_search_volume` CPC is Google Ads aggregate data, not real-time auction data; treat as ±30% directional.158- Ad copy often reveals competitor positioning before product launches do — periodic review (quarterly) catches strategic shifts.159- Question-intent variants often have lower CPC and higher conversion than head terms. The shortlist in step 8 prioritises these.160- Pair with `seo-keyword-niche` for organic content opportunities derived from paid keyword research.161- Pair with `seo-competitor-pages` if the bidding landscape reveals "X vs Y" / "alternatives" intent — those keywords convert best as comparison pages, not paid ads.162- **The paid landscape is reconstructed from the live SERP, keyword by keyword.** There is no domain-level "all keywords a competitor bids on" tool here; the footprint is only as complete as the seed keyword set you probe. Widen the seed set to widen coverage. The mechanics: `mcp__dataforseo__serp_organic_live_advanced` reads the paid/ad and shopping blocks (top ads, bottom ads, shopping carousel) per keyword, and `mcp__dataforseo__kw_data_google_ads_search_volume` supplies CPC/competition/competition_index for the bidding landscape. *Optional accelerator:* a user who already has a paid-keyword database MCP can substitute it for the seed-set enumeration in domain mode — not required.163- Don't recommend paid keywords without context. The shortlist is a starting point for the PPC team, not an autopilot.