Programmatic SEO
SKILL.md
HOW_TO_USE.md
sample_input.json
expected_output.json
skillsmarketingSKILL.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# Programmatic SEO
Programmatic SEO is one page template filled from a dataset, one page per value of a variable: "{trade} invoice template", "coworking in {city}", "{tool} alternatives". It works when three things are true: people search the pattern, each page carries data the others don't, and the site can beat what already ranks. This skill measures all three on live data before anyone builds a page, then writes the template.
Most programmatic projects fail in one of two ways: pages for searches nobody makes, or pages that differ only by the swapped word. Google's spam policies call the second one scaled content abuse, and many near-identical pages aimed at slightly different queries count as doorway pages. Every check below exists to catch one of these two.
## Before you start
You need the InsightfulPipe MCP with DataForSEO connected. Search Console is optional and adds step 5.
1. Call `query_contexts` with `request="accounts"` for `platform="dataforseo"` and, if the user has a site, `platform="google-search-console"`. Note `workspace_id`, `brand_id` and the Search Console `site_url`. If several properties are listed, ask which site the pages will live on.
2. Call `query_contexts` with `request="actions_details"` for the actions below and follow the body shapes it returns:
- dataforseo: `labs_keyword_suggestions`, `kw_google_ads_search_volume`, `serp_google_organic`, `labs_ranked_keywords`, `onpage_instant_pages`, `onpage_content_parsing`
- google-search-console: `search_analytics`, `batch_url_inspection`
3. Ask the user, and use the defaults when they don't know:
- **The head term** (what every page is about, e.g. "invoice template") and **the variable list** (every trade, city or tool they could make a page for). Default: no list; step 1 finds the variables people search.
- **The data they own per variable.** This decides whether the pages can be different (see "The data ladder"). There is no default: ask until you have an answer.
- **The business goal:** what a visitor should do on the page, and the conversion rate for that goal if they know it (for the success metrics). Default: no rate; the conversion target is left to them.
- **Country and language.** Default `location_code` 2840 (United States), `language_code` "en".
DataForSEO bills per call. One run is about 11 calls (1 + 1 + 3 + 2 + 4). Tell the user before going past 15.
## How to run the calls
Every call goes through `query_data` with the `platform` and `action` named in the step. Rules the API enforces:
- Send `location_code` or `location_name`, never both; the same for `language_code` and `language_name`.
- `labs_keyword_suggestions` takes one `keyword` string. `kw_google_ads_search_volume` takes a `keywords` array of up to 700.
- `filters` are arrays like `[["keyword_info.search_volume", ">", 0]]`. The `like` operator takes `%` wildcards.
- `serp_google_organic` returns a flat list of SERP items. Read the `organic` items for rankings, and `people_also_ask` and `related_searches` for questions and sub-modifiers.
- Search Console `ctr` comes back as a percentage (1.56 means 1.56%).
If a call fails, keep going: mark that check **unknown**, say which call failed, and never fill the gap with a guess.
## The steps
### 1. Find the pattern
```json
{"platform": "dataforseo", "action": "labs_keyword_suggestions", "keyword": "invoice template",
"location_code": 2840, "language_code": "en", "limit": 1000,
"filters": [["keyword_info.search_volume", ">", 0]], "order_by": ["keyword_info.search_volume,desc"]}
```
- **Count each search once.** Google groups close variants ("template for invoice", "invoice template", "invoice billing template") under one volume, and the rows repeat it. Group rows by `keyword_properties.core_keyword` and keep one volume per group. Never add up rows that share a core keyword.
- **Sort the modifiers into classes:** remove the head term and filler words (for, a, of, free, sample, template) and look at what is left. Typical classes: a format (word, excel, pdf), a segment (a trade, an industry, a city), a brand (a competitor or a tool), a document type. Each class is a possible pattern. For each class give the number of values found and the volume of its biggest value.
- **Keep the limit at 1000.** The list is sorted by volume, so segment modifiers sit lower down. In testing, the first 200 rows of a broad head term held almost only format modifiers; the industry modifiers began further down.
- Pick the class that matches what the business can fill with real data. Mention a bigger class you're not building, so the user can decide.
### 2. Test every permutation
Build one keyword per variable in the main word order, plus the other order when people use both. Run them in one call:
```json
{"platform": "dataforseo", "action": "kw_google_ads_search_volume",
"keywords": ["plumbing invoice template", "invoice template for plumbing", "tutoring invoice template"],
"location_code": 2840, "language_code": "en"}
```
- **Two word orders are one page.** The other order usually comes back with the same volume (grouped) or with none: in testing, 20 of 40 came back the same, 19 empty and 1 lower. Use the higher of the two per variable, never the sum.
- **Demand:** the total monthly volume across variables, and the share of variables with any measured volume.
- **Spread:** the share of total demand held by the top 10 variables. A head-heavy pattern needs only a few pages.
- **Phases:** phase 1 is the smallest set of variables, highest volume first, that reaches 80% of the total. Phase 2 is the rest with at least 50 searches a month. Below 50, don't build a standalone page: fold the variable into a parent page, or wait until your own Search Console shows impressions for it.
- **Commercial value:** report the CPC range across variables. A high CPC means advertisers pay for these visitors, which is evidence the traffic converts.
### 3. Read the SERPs
Run `serp_google_organic` for 3 variables you would build: the biggest, one from the lower half of phase 1, and one from phase 2. Don't sample the hold list: those variables get no page, so their SERPs can't change what you build.
```json
{"platform": "dataforseo", "action": "serp_google_organic", "keyword": "plumbing invoice template",
"location_code": 2840, "language_code": "en", "depth": 10}
```
Sort each organic result into one type:
- **Template page:** a page about this one variable, with the variable in its URL slug (`/invoice-templates/plumbing`, `/plumbing-invoice-template`). These are your direct rivals.
- **Platform or user content:** social, video, document-sharing and marketplace sites (Pinterest, YouTube, Scribd, Reddit, marketplaces). These rank on weak SERPs and are the easiest to pass.
- **Article:** a blog post, guide or resource page (a `/blog/`, `/resources/`, `/resource/`, `/stories/` or `/guides/` path), even when the variable is in its slug.
- **General page:** a page about the head term with no variable (a generic template gallery).
Then report:
- **Openness:** whether one rival domain (a template page or an article, not a platform) sits in the top 3 of several sampled SERPs. If one sits in all of them, the pattern is held: you need better data than theirs, not just more pages. A platform result in the top 3 is a weak result, so it makes a SERP more open, not less.
- **Weak results:** the number of platform or user-content results in each top 10. More of them on the phase 2 SERP means the smaller pages are easier.
- **Intent drift:** results whose titles answer a different need than the user's pages ("independent contractor" for a page about building contractors). Say which variables have it.
- **Sub-modifiers:** the `related_searches` items show what people add to each variable (formats, "free", "example"). These belong on the one page as sections or downloads, not as extra pages.
- **Questions:** the `people_also_ask` items are candidate FAQ entries and show which data a page needs (for example rate questions on a tutoring page call for rate data).
Do not use `labs_bulk_keyword_difficulty` to judge these patterns: on 40 long-tail permutations it returned 0 for 34 and nothing for 1, while the SERPs for the same keywords were full of established sites, so it says little here. Read the SERPs instead.
### 4. Tear down the incumbent
Pick the best-ranked template page on each of the first two SERPs. Their domains are the incumbents. For each, see how big its template folder is:
```json
{"platform": "dataforseo", "action": "labs_ranked_keywords", "target": "invoicefly.com",
"location_code": 2840, "language_code": "en", "limit": 300,
"filters": [["ranked_serp_element.serp_item.relative_url", "like", "/free-resources/free-templates/free-invoice-templates/%"]],
"order_by": ["ranked_serp_element.serp_item.etv,desc"]}
```
- Report `total_count` (keywords the folder ranks for), the number of distinct URLs in the rows, and the estimated monthly traffic (`etv`) per page type: the hub, segment pages and any other class (format pages, for example). Say that `etv` is an estimate and that it covers only the rows returned.
- This sets expectations: if the incumbent's segment pages earn a few visits each while another page type earns hundreds, say so plainly.
Then open two sibling pages from the main incumbent's folder, for different variables:
```json
{"platform": "dataforseo", "action": "onpage_instant_pages",
"url": "https://invoicefly.com/free-resources/free-templates/free-invoice-templates/plumbing-invoice-template/"}
```
```json
{"platform": "dataforseo", "action": "onpage_content_parsing",
"url": "https://invoicefly.com/free-resources/free-templates/free-invoice-templates/plumbing-invoice-template/"}
```
- From `onpage_instant_pages` (`meta`): the title and description formulas, the H1 and H2 list (`htags`), word count (`content.plain_text_word_count`, navigation included), internal links, canonical, and whether there is any structured data (`checks.has_micromarkup`).
- From `onpage_content_parsing` (`page_content.main_topic` and `secondary_topic`, headings plus `primary_content` text): the shared text between the two pages. Lowercase both, replace the variable and its obvious forms ("plumbing", "plumber", "plumbers") with one placeholder, split into words, and compare 5-word sequences. **Shared text** is the share of the shorter page's sequences that also appear on the other page.
- A shared H2 skeleton is normal for a template. Shared body text is what makes pages thin. The incumbent's shared-text figure is the bar your pages have to meet.
### 5. Your site (if Search Console is connected)
Check whether the site already has pages or demand for the pattern. Use the last 28 complete days.
```json
{"platform": "google-search-console", "action": "search_analytics", "site_url": "https://example.com/",
"dimensions": ["page"], "start_date": "2026-09-06", "end_date": "2026-10-03", "row_limit": 1000,
"dimension_filter_groups": [{"filters": [{"dimension": "page", "operator": "contains", "expression": "/invoice-templates/"}]}]}
```
```json
{"platform": "google-search-console", "action": "search_analytics", "site_url": "https://example.com/",
"dimensions": ["query", "page"], "start_date": "2026-09-06", "end_date": "2026-10-03", "row_limit": 1000,
"dimension_filter_groups": [{"filters": [{"dimension": "query", "operator": "includingRegex", "expression": "invoice template"}]}]}
```
- Existing pages in the folder: impressions, clicks and position per page. A variable that already earns impressions moves into phase 1 whatever its volume.
- Queries for the pattern that land on a non-template page: the new page must take over that query, so link the old page to it.
- **Indexing of pages that already exist:** inspect up to 50 of them in one call.
```json
{"platform": "google-search-console", "action": "batch_url_inspection", "site_url": "https://example.com/",
"urls": ["https://example.com/invoice-templates/plumbing", "https://example.com/invoice-templates/roofing"],
"language_code": "en"}
```
Count `coverage_state` = "Submitted and indexed" against the total. Don't read the indexed count from `sitemaps_list`: in testing it returned `indexed: 0` for a sitemap whose pages were indexed. The daily quota is 2,000 inspections per property.
Without Search Console, mark step 5 **not run** and say what it would have added.
## The verdict
Score each check **pass**, **warn**, **fail** or **unknown**. The thresholds are starting points; say so when the business makes one wrong.
| Check | Pass | Warn | Fail |
|---|---|---|---|
| Demand (step 2) | 60% or more of variables have measured volume, and the total is 1,000 a month or more | 30–60% have volume, or the total is under 1,000 | under 30% have volume: the demand is imagined |
| SERP openness (step 3) | no rival domain in the top 3 of 2 or more sampled SERPs | one rival domain in the top 3 of 2 of the 3 | one rival domain in the top 3 of all 3 |
| Data per page (user input) | a proprietary, product or user-generated field changes per page | only licensed or combined public data | only the variable's name and public facts change |
| Template uniqueness (step 4, then your draft) | shared text 30% or less | 30–50% | over 50%: a name swap |
| Business fit (steps 2 and 3, user input) | the visitor's need matches what the business sells, and the CPC shows paid demand | the need is near the offer | the page would attract people who can't buy |
Apply the decisions in this order; the first that matches wins:
- **Don't build** when Demand, Data per page or Business fit fails. No template change fixes missing searches, missing data or the wrong audience.
- **Fix first** when SERP openness or Template uniqueness fails (find data the incumbent can't match, or rewrite the template until the shared text is under the bar), or when two or more checks warn.
- **Build** when nothing fails and at most one check warns.
- An **unknown** check doesn't change the decision. Name it as a condition of the build (for example, Template uniqueness before any draft exists).
- Template uniqueness is checked twice: the bar from the incumbent, then your own draft once two pages exist (run `onpage_content_parsing` on both, or compare the drafts directly).
- Kill the idea outright when the pages could only swap the name, when the demand comes from guesses, when it takes thousands of pages to reach meaningful traffic, or when no person would be helped by landing on the page.
## The page template
Write the template as a spec the user's developer or CMS can fill:
1. **URL:** a subfolder, `/{folder}/{variable-slug}/`, lowercase with hyphens, no parameters, no IDs. Use a subfolder by default so the pages sit inside the site's existing structure.
2. **Title, meta description and H1 formulas,** each with the variable slot and the modifiers the SERP showed (formats, "free", "example"). Each must read naturally for the lowest-volume variable too.
3. **Sections, in order, each naming the data field that fills it.** At least 3 sections must come from fields that change per page. Add a condition to any section whose field can be empty (show the licence block only for trades that need a licence; show averages only when the sample behind them is big enough to be meaningful and to protect individual customers).
4. **Sub-modifiers on the page, not as pages.** Formats and variants from `related_searches` become download buttons or sections. A {variable} × {format} grid of pages is near-duplicate content.
5. **FAQ:** from `people_also_ask`, answered with the page's own data where possible.
6. **Internal links:** a hub page that links to every page; each page links to the hub and to 4–6 siblings in the same group; breadcrumbs. No orphan pages.
7. **Structured data:** BreadcrumbList on every page, plus the type that fits the playbook (see the table). FAQPage markup is valid, but Google now shows FAQ rich results only for a few authoritative government and health sites, so don't promise one.
8. **Indexing plan:** publish phase 1 only, in its own sitemap. After 4 weeks, inspect the phase 1 URLs (step 5). Publish phase 2 when 80% or more of phase 1 pages are indexed and earning impressions. Never publish a page you would have to noindex for being thin; don't build it.
9. **Uniqueness target:** shared text at or under 30% between any two pages, measured as in step 4, next to the incumbent's figure.
10. **Data refresh plan:** for each data field, where it comes from and how often it changes, and how the pages pick up the change (regenerate on that schedule and show a "data updated" date on the page). Pages built once and never refreshed drift out of date while their rivals update; this is the set-and-forget mistake.
## Before you publish
Check the first drafted pages on their final URLs, before they go into the sitemap or get linked. Run `onpage_instant_pages` on each (the same body as step 4; each call is billed) and compare:
- **Titles and meta descriptions are unique:** `meta.title` and `meta.description` differ on every page and read naturally for the smallest variable.
- **One H1:** `meta.htags.h1` holds exactly one heading, with the variable in it.
- **The canonical points to the page itself:** `meta.canonical` equals the page's own URL. A canonical to the hub or a sibling asks Google to index that page instead.
- **Structured data is present:** `checks.has_micromarkup` is true.
- **No empty sections:** no blank blocks, placeholders or "{field}" text where a data field was empty. The section's condition should have hidden it.
- **Shared text** is under the uniqueness target (`onpage_content_parsing` on two pages, as in step 4).
- **Robots.txt** doesn't disallow the folder: open `/robots.txt` and read its Disallow lines.
- **The phase sitemap** lists every phase 1 URL.
Once Google has crawled the pages, `batch_url_inspection` (step 5) confirms the rest per URL: `robots_txt_state` is "ALLOWED", `indexing_state` is "INDEXING_ALLOWED" (a noindex tag shows as "BLOCKED_BY_META_TAG"), `page_fetch_state` is "SUCCESSFUL", and `google_canonical` matches `user_canonical`.
## The 15 playbooks
Pick the one that fits the pattern from step 1. Each needs the data in its row, or it becomes a name swap.
| Playbook | Pattern | Each page needs | Schema |
|---|---|---|---|
| Location | {service} in {city} | local providers, local prices or rules, reviews, a map | LocalBusiness, Place |
| Comparison | {A} vs {B} | a real feature-by-feature table, pros and cons, who each fits | Product, Review |
| Alternatives | {competitor} alternatives | real alternatives including yours, why people switch, who each fits | ItemList |
| Integration | {your product} + {tool} | the integration must exist; setup steps and use cases | SoftwareApplication |
| Template | {type} template | a usable download in several formats, variations | CreativeWork |
| Calculator | {type} calculator | a working tool, the method explained | WebApplication |
| Statistics | {topic} statistics | sourced or original data, dated and updated | Dataset |
| How-to | how to {task} with {tool} | current steps, screenshots, common errors | HowTo is no longer shown as a rich result; use Article |
| Glossary | what is {term} | a clear definition, an example, related terms linked | DefinedTerm |
| Use case | {product} for {segment} | features and examples specific to that segment | Article |
| Pricing | {product} pricing | every tier, hidden costs, the date checked | Product, Offer |
| Roundup | best {category} | stated criteria, real testing, a visible date | ItemList, Review |
| Job and salary | {job} salary | sourced pay data by region and level | Occupation |
| Product feed | one page per product | unique descriptions, images, stock and price | Product, Offer |
| API reference | {endpoint} reference | tested examples, parameters, errors, version | TechArticle |
## The data ladder
What makes each page different, from hardest to copy to easiest:
1. **Proprietary data** you create (your own research, benchmarks).
2. **Product data** from your users, aggregated ("median days to get paid, by trade").
3. **User content** (reviews, questions, submissions).
4. **Licensed data** others can't easily get.
5. **Public data combined** and analysed in a new way.
6. **Raw public data** anyone can copy: the easiest to compete against and the hardest to rank with.
Pages built only on level 6 fail the "Data per page" check.
## After launch
- **Weekly:** the step 5 `search_analytics` call filtered on the folder: impressions, clicks and position per page, and the share of pages with any impressions.
- **Weekly crawl errors:** `batch_url_inspection` on up to 50 URLs per template, rotating through the folder. Any `page_fetch_state` other than "SUCCESSFUL" (not found, server error, soft 404) or a `robots_txt_state` of "DISALLOWED" is a crawl error to fix.
- **Weekly Core Web Vitals by template:** pages built from one template share their speed problems, so check one or two URLs per template rather than every page. The Search Console API doesn't return the Core Web Vitals report: read it in Search Console, where it groups similar URLs, or use the **core-web-vitals-fixer** skill, if installed.
- **At 4 weeks and after every phase:** `batch_url_inspection` on the new URLs; report the indexed share and the most common `coverage_state` for the rest ("Crawled - currently not indexed" on many pages is the classic thin-content signal).
- **Refresh:** regenerate each field on the schedule in the data refresh plan, and re-run step 3 on the sampled SERPs every few months for new questions and sub-modifiers.
- **Prune:** a page with no impressions after 3 months gets better data, gets merged into a sibling, or is removed with a redirect.
## Programmatic pages and paid search
- The CPCs from step 2 show which variables advertisers pay for. Pages for high-CPC variables are good landing pages for search ads too; match the ad headline to the page H1.
- Before sending ad traffic, make sure the page's call to action records a conversion (**conversion-tracking-auditor**, if installed, checks this). Then A/B test where the call to action sits: paid visitors arrive with one intent, so test a version with the call to action above the fold.
- Paid keywords that convert are good candidates for new variables. Organic pages ranking 4–10 for a valuable variable are worth supporting with ads while they climb.
## Report format
1. **Header:** the head term, the pattern, the country, the date and the number of paid calls.
2. **Verdict:** build, fix first or don't build, with the five checks in a table (result, key number, one sentence).
3. **Demand:** total, share of variables with volume, top-10 share, CPC range, and the phase list (variable, keyword, volume, CPC).
4. **The SERPs:** per sampled keyword, the result types, openness, weak results, intent drift, sub-modifiers and questions.
5. **The incumbent:** folder size, traffic by page type, the page skeleton, and the shared-text bar.
6. **Your site:** step 5 results, or "not run" and why.
7. **The template:** the spec from "The page template", with its data refresh plan and the "Before you publish" checks.
8. **Success metrics:**
- **Indexed pages:** 80% or more of each published phase indexed 4 weeks after it goes live. This is also the gate for the next phase.
- **Traffic at 6 months:** the main incumbent's estimated traffic per page of the same type (step 4), times the pages you plan to have live by month 6. Call it a benchmark built on an estimate, not a forecast.
- **Conversions:** the traffic benchmark times the user's own conversion rate for the page's goal. If the user has no rate, leave this target for them to set; never assume one.
9. **Risks and how the plan handles them:** thin content (the uniqueness target and when it's measured), quality control (the "Before you publish" checks), intent drift from step 3, data too thin for small variables (the section conditions), stale data (the refresh plan), and the monitoring plan from "After launch".
10. **What's not known,** and why.
## Fixes this skill can run
Only after the user confirms the exact change:
- **Save the page matrix to Google Sheets** (one row per variable: keyword, volume, CPC, phase, URL, title, H1). Create a tab with `create_sheet` (`spreadsheet_id`, `title`), then write the rows with `update_cells` (`spreadsheet_id`, `sheet_id` from the first call, `range`, `values` as a list of rows). Both need a Read & Write connection, and an owner, admin or operator can switch them off.
It never publishes pages and never changes the site.
## If a platform isn't connected
- **No DataForSEO:** ask the user to export, from any keyword tool, the volume for every permutation and the top 10 results for 3 of them. Run steps 2 to 4 on the export, and mark the incumbent teardown as manual.
- **No Search Console:** skip step 5 and say so.
## Go deeper
If installed: **keyword-research-clustering** for the wider topic around the pattern, **content-brief-writer** for the hub page, **internal-linking-planner** for the link map, **schema-markup-generator** for the markup, and **seo-audit** to audit the pages after launch.
## Rules
- Every number in the report comes from a call in this run. Name the call next to it.
- Count a close-variant group once. Never add up volumes of word-order variants.
- Never call a pattern viable because a keyword tool scored it easy; read the SERPs.
- Never build a page for a {variable} × {sub-modifier} grid; put sub-modifiers on the page.
- Never write a section whose only difference between pages is the variable's name.
- Name businesses in SERP findings, never private individuals.
- Say where the data is thin, and mark checks you couldn't run as unknown.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# How to Use This Skill
Hey Claude, I just added the "programmatic-seo" skill. We make an invoicing app for small service businesses. Should we build "[trade] invoice template" pages for our 40 trades, which ones first, and what should the template look like?
## What you need
- **The InsightfulPipe MCP connected to Claude, with DataForSEO added.** The skill pulls keyword volumes, SERPs, competitor folders and competitor pages itself; you don't need to export anything.
- **Search Console for your site** (optional), so the skill can see pages and queries you already have for the pattern, and check whether launched pages are indexed.
- **The head term and your list of variables** (cities, trades, tools, competitors). No list? The skill finds the variables people search.
- **What data you own per variable.** This decides whether the pages can be different from each other, so the skill will ask.
## Example requests
**Validate a pattern before building**
Hey Claude, I just added the "programmatic-seo" skill. We run a coworking marketplace. Is "coworking space in [city]" worth building for our 60 cities?
**Find the pattern**
Hey Claude, I just added the "programmatic-seo" skill. Our head term is "employee onboarding checklist". Which modifiers do people search, and which one should become a set of pages?
**Comparison or alternatives pages**
Hey Claude, I just added the "programmatic-seo" skill. Should we build "[competitor] alternatives" pages for the 12 tools we compete with? Show me who ranks now.
**Pages that don't rank or index**
Hey Claude, I just added the "programmatic-seo" skill. Our /integrations/ pages get almost no impressions. Check them in Search Console and tell me what's wrong with the template.
## What you get
1. **A verdict:** build, fix first or don't build, with five checks (demand, SERP openness, data per page, template uniqueness, business fit) and the number behind each.
2. **The pattern:** the modifier classes people search around your head term, and which one fits your data.
3. **Demand for every permutation:** total volume, the share of variables anyone searches, the CPC range, and phase 1, phase 2 and hold lists.
4. **The SERPs:** who ranks for the biggest variable, one from the lower half of phase 1 and one from phase 2, how many results are weak, where intent drifts, and the sub-modifiers and questions to cover.
5. **The incumbent teardown:** how many keywords its template folder ranks for, estimated traffic by page type, its page skeleton, and how much text its sibling pages share, which is the bar for yours.
6. **The page template:** URL, title, meta and H1 formulas, sections each tied to a data field, conditions, FAQ, internal links, structured data, a uniqueness target, an indexing plan, a data refresh plan, and the checks to run before you publish (unique titles and metas, one H1, self canonicals, robots.txt, noindex, sitemap).
7. **Your site** (with Search Console): existing pages and queries for the pattern, and the indexed share.
8. **Success metrics and risks:** an indexed-pages target, a 6-month traffic benchmark from the incumbent's pages, a conversion target if you give your conversion rate, and how the plan handles each risk.
## What it can change for you
With your yes, it can save the page matrix (one row per variable: keyword, volume, CPC, phase, URL, title) to a new tab in a connected Google Sheet. It never publishes pages or changes your site.
## Tips
- One run uses about 11 DataForSEO calls. The skill asks before going past 15.
- Give it your full variable list: the long tail is where you learn which pages not to build.
- After launch, ask it to check the folder in Search Console every week (impressions and crawl errors) and inspect the new URLs after 4 weeks.
- Running the pages as ad landing pages? Check that the call to action records a conversion, then A/B test where it sits.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{
"note": "Real run on 2026-10-06 through the InsightfulPipe MCP on public DataForSEO data (US, English). The business is hypothetical; the keywords, volumes, CPCs, SERPs and competitor pages are real. Search Console was not used: the example business has no site, so step 5 is marked not run.",
"request": "Hey Claude, I just added the \"programmatic-seo\" skill. We make an invoicing app for small service businesses. Should we build \"[trade] invoice template\" pages for the 40 trades we serve, which ones first, and what should the page template look like?",
"head_term": "invoice template",
"variables": [
"contractor",
"construction",
"cleaning",
"auto repair",
"mechanic",
"plumbing",
"electrician",
"hvac",
"handyman",
"landscaping",
"lawn care",
"roofing",
"painting",
"photography",
"graphic design",
"freelance",
"consulting",
"catering",
"bakery",
"trucking",
"towing",
"pest control",
"pool service",
"moving",
"carpet cleaning",
"pressure washing",
"tutoring",
"personal trainer",
"massage therapist",
"hair salon",
"dog grooming",
"daycare",
"real estate",
"property management",
"rental",
"interior design",
"web design",
"video production",
"dj",
"wedding planner"
],
"data_owned_per_variable": [
"a ready-made invoice preset per trade in the app (fields and line items)",
"aggregated, anonymised invoice data by trade: common line items, typical invoice value, payment terms, days to get paid"
],
"goal": "start a free account with the trade preset loaded",
"country_language": "United States (2840), en",
"run_date": "2026-10-06",
"paid_calls": {
"count": 11,
"calls": [
"labs_keyword_suggestions",
"kw_google_ads_search_volume",
"serp_google_organic x3",
"labs_ranked_keywords x2",
"onpage_instant_pages x2",
"onpage_content_parsing x2"
]
},
"classification_inputs": {
"platform_domains": [
"etsy.com",
"pinterest.com",
"quora.com",
"reddit.com",
"scribd.com",
"teacherspayteachers.com",
"youtube.com"
],
"article_folders": [
"blog",
"guides",
"resource",
"resources",
"stories"
],
"variant_forms": {
"contractor": "contractors?",
"plumbing": "plumbing|plumbers?",
"tutoring": "tutoring|tutors?"
},
"intent_drift_term": {
"contractor invoice template": "independent"
}
},
"data_pulled": [
"labs_keyword_suggestions: 1000 rows, 277 close-variant groups",
"kw_google_ads_search_volume: 80 permutations",
"serp_google_organic: contractor, plumbing and tutoring invoice template",
"labs_ranked_keywords: invoicefly.com folder (300 of 1261 rows), tofu.com folder (77 rows)",
"onpage_instant_pages and onpage_content_parsing: two invoicefly.com trade pages"
],
"not_used": [
"google-search-console (no site for the example business)",
"labs_bulk_keyword_difficulty (see SKILL.md step 3)"
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
{
"header": {
"head_term": "invoice template",
"pattern": "[trade] invoice template",
"country": "United States, English",
"run_date": "2026-10-06",
"paid_calls": 11
},
"verdict": {
"decision": "build",
"conditions": [
"Template uniqueness is unknown: No drafts exist yet. Measure the first two drafted pages the same way; the target is 30% or less."
],
"checks": [
{
"check": "Demand",
"result": "pass",
"key_number": "40 of 40 trades searched; 13,700 searches a month",
"why": "Every trade has measured volume; the top 10 hold 66% of demand, so the tail is real but small."
},
{
"check": "SERP openness",
"result": "pass",
"key_number": "no rival in the top 3 of more than 1 sampled SERP",
"why": "Each SERP has a different top 3, and 9 of 27 organic results across the three are platform or user-content pages."
},
{
"check": "Data per page",
"result": "pass",
"key_number": "product data (ladder level 2)",
"why": "A preset and aggregated invoice data per trade change on every page; competitors can't copy them."
},
{
"check": "Template uniqueness",
"result": "unknown",
"key_number": "incumbent bar 9% shared text",
"why": "No drafts exist yet. Measure the first two drafted pages the same way; the target is 30% or less."
},
{
"check": "Business fit",
"result": "pass",
"key_number": "CPC $0.95 to $23.55",
"why": "People searching for a trade invoice template are the app's buyers, and 32 of 39 trades with a CPC cost $5 or more a click. \"contractor\" drifts toward independent contractors."
}
],
"summary": "Build 15 trade pages first (81% of the demand), then 16 more; hold 9. Measure the first two drafts against the 30% shared-text target (the incumbent measured 9%) before publishing the rest. Expect modest traffic per page: the incumbent's 19 trade pages earn about 128 estimated visits a month between them, while its hub and 4 format pages earn about 1,762. Plan the hub and the format downloads with the trade pages, and treat the trade pages as long-tail pages that convert."
},
"pattern": {
"call": "labs_keyword_suggestions \"invoice template\", limit 1000, volume > 0, by volume",
"rows": 1000,
"total_count": 6719,
"close_variant_groups": 277,
"classes": [
{
"class": "file format",
"values_found": 5,
"biggest_value": "google docs",
"biggest_volume": 12100,
"biggest_keyword": "invoice template on google docs",
"note": "Bigger single searches, but only a handful of pages; a different pattern from the one asked about."
},
{
"class": "trade (your list)",
"values_found": 21,
"biggest_value": "contractor",
"biggest_volume": 1900,
"biggest_keyword": "template for contractor invoice",
"note": "21 of your 40 trades appear in the 1,000 rows; the permutation test in step 2 covers all 40."
},
{
"class": "brand or tool",
"values_found": 9,
"biggest_value": "canva",
"biggest_volume": 22200,
"biggest_keyword": "invoice template canva",
"note": "Competitor and tool names (invoicing apps, design tools): an alternatives or integration playbook, not this one."
},
{
"class": "document type",
"values_found": 8,
"biggest_value": "commercial",
"biggest_volume": 2400,
"biggest_keyword": "template of commercial invoice",
"note": "Other document types (proforma, commercial, receipt): a separate pattern."
}
],
"limit_check": "Only 1 of the first 200 rows names one of your trades; the rest are formats and wording variants.",
"chosen_pattern": "[trade] invoice template",
"why": "It is the class the business can fill with its own data (a preset and invoice data per trade). Formats are handled on each trade page instead."
},
"demand": {
"call": "kw_google_ads_search_volume, 80 keywords (40 trades x 2 word orders), one call",
"total_monthly_searches": 13700,
"trades_with_volume": "40 of 40",
"top_10_share_pct": 66,
"cpc_range_usd": [
0.95,
23.55
],
"word_order": "\"invoice template for [trade]\" returned the same volume as \"[trade] invoice template\" for 20 trades, no volume for 19 and a different volume for 1; the higher one is used and the two are never added.",
"phase_1": {
"rule": "highest volume first until 80% of total demand",
"pages": 15,
"share_of_demand_pct": 81,
"trades": [
{
"trade": "contractor",
"keyword": "contractor invoice template",
"volume": 1900,
"cpc": 8.79
},
{
"trade": "freelance",
"keyword": "freelance invoice template",
"volume": 1300,
"cpc": 7.71
},
{
"trade": "construction",
"keyword": "construction invoice template",
"volume": 1000,
"cpc": 15.2
},
{
"trade": "auto repair",
"keyword": "auto repair invoice template",
"volume": 880,
"cpc": 10.13
},
{
"trade": "consulting",
"keyword": "consulting invoice template",
"volume": 880,
"cpc": 8.83
},
{
"trade": "rental",
"keyword": "rental invoice template",
"volume": 880,
"cpc": 8.95
},
{
"trade": "cleaning",
"keyword": "cleaning invoice template",
"volume": 590,
"cpc": 5.04
},
{
"trade": "mechanic",
"keyword": "mechanic invoice template",
"volume": 590,
"cpc": 13.25
},
{
"trade": "photography",
"keyword": "photography invoice template",
"volume": 590,
"cpc": 8.2
},
{
"trade": "plumbing",
"keyword": "plumbing invoice template",
"volume": 480,
"cpc": 10.86
},
{
"trade": "electrician",
"keyword": "electrician invoice template",
"volume": 480,
"cpc": 8.42
},
{
"trade": "handyman",
"keyword": "handyman invoice template",
"volume": 480,
"cpc": 7.57
},
{
"trade": "hvac",
"keyword": "hvac invoice template",
"volume": 390,
"cpc": 12.44
},
{
"trade": "catering",
"keyword": "catering invoice template",
"volume": 390,
"cpc": 8.53
},
{
"trade": "landscaping",
"keyword": "landscaping invoice template",
"volume": 320,
"cpc": 9.53
}
]
},
"phase_2": {
"rule": "the rest with 50+ searches a month",
"pages": 16,
"trades": [
{
"trade": "roofing",
"keyword": "roofing invoice template",
"volume": 260,
"cpc": 8.43
},
{
"trade": "graphic design",
"keyword": "graphic design invoice template",
"volume": 260,
"cpc": 3.4
},
{
"trade": "trucking",
"keyword": "trucking invoice template",
"volume": 260,
"cpc": 10.27
},
{
"trade": "dj",
"keyword": "dj invoice template",
"volume": 260,
"cpc": 7.87
},
{
"trade": "lawn care",
"keyword": "lawn care invoice template",
"volume": 170,
"cpc": 8.3
},
{
"trade": "painting",
"keyword": "painting invoice template",
"volume": 170,
"cpc": 5.86
},
{
"trade": "towing",
"keyword": "towing invoice template",
"volume": 170,
"cpc": 4.7
},
{
"trade": "moving",
"keyword": "moving invoice template",
"volume": 140,
"cpc": 6.48
},
{
"trade": "daycare",
"keyword": "daycare invoice template",
"volume": 140,
"cpc": 8.33
},
{
"trade": "bakery",
"keyword": "bakery invoice template",
"volume": 90,
"cpc": 7.97
},
{
"trade": "tutoring",
"keyword": "tutoring invoice template",
"volume": 90,
"cpc": 2.69
},
{
"trade": "interior design",
"keyword": "interior design invoice template",
"volume": 90,
"cpc": 0.95
},
{
"trade": "pest control",
"keyword": "pest control invoice template",
"volume": 70,
"cpc": 6.1
},
{
"trade": "carpet cleaning",
"keyword": "carpet cleaning invoice template",
"volume": 70,
"cpc": 9.55
},
{
"trade": "pressure washing",
"keyword": "pressure washing invoice template",
"volume": 50,
"cpc": 4.36
},
{
"trade": "massage therapist",
"keyword": "massage therapist invoice template",
"volume": 50,
"cpc": 6.41
}
]
},
"hold": {
"rule": "under 50 a month: fold into a parent page or wait for impressions",
"trades": [
{
"trade": "property management",
"keyword": "property management invoice template",
"volume": 40,
"cpc": 4.13
},
{
"trade": "web design",
"keyword": "web design invoice template",
"volume": 40,
"cpc": 13.92
},
{
"trade": "real estate",
"keyword": "real estate invoice template",
"volume": 30,
"cpc": 2.19
},
{
"trade": "video production",
"keyword": "video production invoice template",
"volume": 30,
"cpc": 6.66
},
{
"trade": "pool service",
"keyword": "pool service invoice template",
"volume": 20,
"cpc": null
},
{
"trade": "hair salon",
"keyword": "hair salon invoice template",
"volume": 20,
"cpc": 10.68
},
{
"trade": "personal trainer",
"keyword": "personal trainer invoice template",
"volume": 10,
"cpc": 7.18
},
{
"trade": "dog grooming",
"keyword": "dog grooming invoice template",
"volume": 10,
"cpc": 9.27
},
{
"trade": "wedding planner",
"keyword": "wedding planner invoice template",
"volume": 10,
"cpc": 23.55
}
]
}
},
"serps": {
"call": "serp_google_organic x3 (the biggest trade, one from the lower half of phase 1, one from phase 2; the hold list is not sampled), depth 10",
"sampled": [
{
"keyword": "contractor invoice template",
"volume": 1900,
"picked_as": "the biggest trade (1 of 40 by volume)",
"features": [
"images",
"people_also_ask",
"related_searches"
],
"organic": [
{
"rank": 1,
"domain": "joist.com",
"path": "/templates/free-invoice-templates/",
"type": "general page",
"title": "Free Invoice Templates for Contractors | Edit, Print, Send"
},
{
"rank": 2,
"domain": "pinterest.com",
"path": "/pin/independent-contractor-invoice-templates--448811919109580440/",
"type": "platform or user content",
"title": "Independent Contractor Invoice Templates"
},
{
"rank": 3,
"domain": "shoeboxed.com",
"path": "/blog/independent-contractor-invoice-template",
"type": "article",
"title": "Independent Contractor Invoice Template [2026]"
},
{
"rank": 4,
"domain": "invoicefly.com",
"path": "/free-resources/free-templates/free-invoice-templates/contractor-invoice-template/",
"type": "template page",
"title": "Free Contractor Invoice Templates"
},
{
"rank": 5,
"domain": "simplybusiness.com",
"path": "/contractor-invoice-template/",
"type": "template page",
"title": "FREE Contractor Invoice Template - Simply Business"
},
{
"rank": 6,
"domain": "invoicer.ai",
"path": "/stories/contractor-invoice-templates",
"type": "article",
"title": "Contractor Invoice Templates"
},
{
"rank": 7,
"domain": "freshbooks.com",
"path": "/invoice-templates/contractor",
"type": "template page",
"title": "Free Contractor Invoice Templates: Download in PDF & Word"
},
{
"rank": 8,
"domain": "pinterest.com",
"path": "/pin/simple-invoice-template-for-construction-business--43628690132976192/",
"type": "platform or user content",
"title": "Construction Invoice Template"
},
{
"rank": 9,
"domain": "youtube.com",
"path": "/watch",
"type": "platform or user content",
"title": "Free Contractor Invoice Template On Excel Video How It Works ..."
}
],
"weak_results": 3,
"template_pages": 3,
"intent_drift": "2 of 9 organic results (ranks 2, 3) are about independent (1099) contractors, not building trades.",
"related_searches": [
"Contractor invoice template word",
"Contractor invoice template excel",
"Contractor invoice template pdf",
"Free contractor invoice template",
"Free contractor invoice template Word",
"Invoice fly template",
"Invoice template for Google Sheets",
"Free download invoice"
],
"people_also_ask": [
"What is a contractor bill?",
"Can Chatgpt generate an invoice?",
"How to make an invoice as an independent contractor?",
"How do I write a proforma invoice?"
]
},
{
"keyword": "plumbing invoice template",
"volume": 480,
"picked_as": "lower half of phase 1 (10 of 40 by volume)",
"features": [
"images",
"related_searches"
],
"organic": [
{
"rank": 1,
"domain": "housecallpro.com",
"path": "/resources/plumbing-invoice-template-examples/",
"type": "article",
"title": "Plumbing Invoice Template: Free Download & How To ..."
},
{
"rank": 2,
"domain": "tofu.com",
"path": "/free-templates/plumbing-invoice-templates",
"type": "template page",
"title": "Free Plumbing Invoice Templates | Tofu Field Service"
},
{
"rank": 3,
"domain": "pinterest.com",
"path": "/pin/get-our-image-of-plumbing-service-invoice-template--668292032197565455/",
"type": "platform or user content",
"title": "Get Our Image of Plumbing Service Invoice Template"
},
{
"rank": 4,
"domain": "ilove-invoice.com",
"path": "/plumbing-invoice-template",
"type": "template page",
"title": "Plumbing Invoice Templates"
},
{
"rank": 5,
"domain": "zentrades.pro",
"path": "/zenplumbing/templates/plumbing-invoice-template",
"type": "template page",
"title": "Plumbing Invoice Template"
},
{
"rank": 6,
"domain": "pinterest.com",
"path": "/pin/free-plumbing-invoice-templates--448811919093026927/",
"type": "platform or user content",
"title": "free plumbing invoice template 10"
},
{
"rank": 7,
"domain": "pinterest.com",
"path": "/pin/download-a-free-work-invoice-template--892627588619439705/",
"type": "platform or user content",
"title": "Plumbing Invoice | Templates at allbusinesstemplates.com"
},
{
"rank": 8,
"domain": "mooninvoice.com",
"path": "/free-invoice-template/plumbing",
"type": "template page",
"title": "Download Free Plumbing Invoice Template"
},
{
"rank": 9,
"domain": "apollostemplates.com",
"path": "/invoices/plumbing/",
"type": "template page",
"title": "Plumbing Invoice Template — Free Excel, Word & PDF"
}
],
"weak_results": 3,
"template_pages": 5,
"intent_drift": null,
"related_searches": [
"Plumbing invoice template pdf",
"Plumbing invoice template word",
"Plumbing invoice template free",
"Plumbing invoice template excel"
],
"people_also_ask": []
},
{
"keyword": "tutoring invoice template",
"volume": 90,
"picked_as": "phase 2 (26 of 40 by volume)",
"features": [
"images",
"people_also_ask",
"related_searches"
],
"organic": [
{
"rank": 1,
"domain": "invoiceg.com",
"path": "/tutoring-invoice-template",
"type": "template page",
"title": "Free Tutoring Invoice Template"
},
{
"rank": 2,
"domain": "teacherspayteachers.com",
"path": "/browse",
"type": "platform or user content",
"title": "Invoice Template"
},
{
"rank": 3,
"domain": "scribd.com",
"path": "/document/486776479/Tutor-invoice-4-xlsx",
"type": "platform or user content",
"title": "Tutoring Invoice Template for Tutors | PDF"
},
{
"rank": 4,
"domain": "invoicequickly.com",
"path": "/blog/tutoring-invoice-example",
"type": "article",
"title": "Tutoring Invoice Example: Annotated Template with Line Items"
},
{
"rank": 5,
"domain": "invoicezap.app",
"path": "/blog/tutoring-invoice-template-education-services-billing/",
"type": "article",
"title": "Tutoring Invoice Template: Education Services Billing Guide"
},
{
"rank": 6,
"domain": "twinkl.com.pr",
"path": "/resource/private-tutoring-receipt-template-t-cpd-1696848133",
"type": "article",
"title": "Private Tutoring Receipt Template - Twinkl"
},
{
"rank": 7,
"domain": "topnotepad.com",
"path": "/tutoring-invoice-template",
"type": "template page",
"title": "Tutoring Invoice Template - TopNotepad"
},
{
"rank": 8,
"domain": "pinterest.com",
"path": "/pin/428756826999926395/",
"type": "platform or user content",
"title": "Tuition Invoice Template"
},
{
"rank": 9,
"domain": "twinkl.pl",
"path": "/resource/private-tutoring-invoice-template-t-par-607",
"type": "article",
"title": "Private Tutoring Invoice Template - Twinkl"
}
],
"weak_results": 3,
"template_pages": 2,
"intent_drift": null,
"related_searches": [
"Tutoring invoice template word",
"Tutoring invoice template free",
"Tutoring invoice template excel",
"Professional tutoring invoice template"
],
"people_also_ask": [
"Is $50 an hour too much for tutoring?",
"Can Chatgpt generate an invoice?",
"Can I download a free invoice template in Word?",
"Is $25 dollars an hour good for tutoring?"
]
}
],
"openness": {
"rival_domains_in_top_3": {
"housecallpro.com": [
"plumbing invoice template"
],
"invoiceg.com": [
"tutoring invoice template"
],
"shoeboxed.com": [
"contractor invoice template"
],
"tofu.com": [
"plumbing invoice template"
]
},
"most_sampled_serps_held_by_one_rival": 1,
"platform_domains_in_top_3": [
"pinterest.com",
"scribd.com",
"teacherspayteachers.com"
]
}
},
"incumbent": {
"calls": [
"labs_ranked_keywords (invoicefly.com folder, limit 300, by traffic)",
"labs_ranked_keywords (tofu.com folder)",
"onpage_instant_pages x2 (contractor and plumbing pages)",
"onpage_content_parsing x2 (same pages)"
],
"incumbent_1": {
"domain": "invoicefly.com",
"found_on": "\"contractor invoice template\" rank 4",
"folder": "/free-resources/free-templates/free-invoice-templates/",
"ranked_keywords_total": 1261,
"rows_returned": 300,
"distinct_pages_in_rows": 26,
"by_page_type": {
"format pages": {
"pages": 4,
"keywords": 131,
"est_monthly_traffic": 1175
},
"hub": {
"pages": 1,
"keywords": 69,
"est_monthly_traffic": 587
},
"trade pages": {
"pages": 19,
"keywords": 95,
"est_monthly_traffic": 128
},
"style pages": {
"pages": 2,
"keywords": 5,
"est_monthly_traffic": 15
}
},
"top_trade_pages": [
{
"path": "/free-resources/free-templates/free-invoice-templates/auto-repair-invoice-template/",
"keywords": 37,
"est_monthly_traffic": 70
},
{
"path": "/free-resources/free-templates/free-invoice-templates/construction-invoice-template/",
"keywords": 4,
"est_monthly_traffic": 9
},
{
"path": "/free-resources/free-templates/free-invoice-templates/contractor-invoice-template/",
"keywords": 7,
"est_monthly_traffic": 9
},
{
"path": "/free-resources/free-templates/free-invoice-templates/plumbing-invoice-template/",
"keywords": 9,
"est_monthly_traffic": 9
},
{
"path": "/free-resources/free-templates/free-invoice-templates/landscaping-invoice-template/",
"keywords": 7,
"est_monthly_traffic": 6
}
],
"last_row_traffic": 0.3,
"note": "Traffic is an estimate (etv) over the top 300 of 1261 ranked keywords by traffic; the rows left out add at most 0.3 each."
},
"incumbent_2": {
"domain": "tofu.com",
"found_on": "\"plumbing invoice template\" rank 2",
"folder": "/free-templates/",
"ranked_keywords_total": 77,
"rows_returned": 77,
"distinct_pages_in_rows": 6,
"by_page_type": {
"trade pages": {
"pages": 5,
"keywords": 76,
"est_monthly_traffic": 12
},
"hub": {
"pages": 1,
"keywords": 1,
"est_monthly_traffic": 0
}
},
"top_trade_pages": [
{
"path": "/free-templates/auto-repair-invoice-templates",
"keywords": 44,
"est_monthly_traffic": 5
},
{
"path": "/free-templates/electrical-invoice-templates",
"keywords": 14,
"est_monthly_traffic": 4
},
{
"path": "/free-templates/plumbing-invoice-templates",
"keywords": 13,
"est_monthly_traffic": 3
},
{
"path": "/free-templates/hvac-invoice-templates",
"keywords": 4,
"est_monthly_traffic": 1
},
{
"path": "/free-templates/construction-invoice-templates",
"keywords": 1,
"est_monthly_traffic": 0
}
],
"last_row_traffic": 0,
"note": "Traffic is an estimate (etv); all 77 ranked keywords in the folder were returned."
},
"sibling_pages": {
"contractor": {
"url_path": "/free-resources/free-templates/free-invoice-templates/contractor-invoice-template/",
"title": "Free Contractor Invoice Templates | Docs, Sheets, Excel, PDF & Word",
"meta_description": "Create professional contractor invoices with our customizable template. Download in multiple formats to suit your needs.",
"h1": [
"Contractor Invoice Template"
],
"h2": [
"Browse by format",
"Browse by industry",
"Other Invoice Templates",
"Benefits of using Contractor Invoice Templates",
"What's Included In Our Contractor Invoice Template?",
"Contractor Invoice Template FAQs",
"Other Free Resources",
"Start for free"
],
"word_count_incl_navigation": 1610,
"internal_links": 128,
"canonical_to_self": true,
"structured_data": false
},
"plumbing": {
"url_path": "/free-resources/free-templates/free-invoice-templates/plumbing-invoice-template/",
"title": "Free Plumbing Invoice Template | Invoice Fly",
"meta_description": "Professional invoice template for plumbers and plumbing companies. Document parts, labor, and emergency services with detailed line items for clear billing.",
"h1": [
"Plumbing Invoice Template"
],
"h2": [
"Browse by format",
"Browse by industry",
"Other Invoice Templates",
"Benefits of using Plumbing Invoice Templates",
"What's Included In Our Plumbing Invoice Template?",
"Plumbing Invoice Template FAQs",
"Other Free Resources",
"Start for free"
],
"word_count_incl_navigation": 1171,
"internal_links": 126,
"canonical_to_self": true,
"structured_data": false
}
},
"same_h2_skeleton": true,
"shared_text": {
"pct_of_shorter_page": 9,
"method": "main and secondary content from onpage_content_parsing, trade name and its forms replaced by one placeholder, 5-word sequences compared",
"words_compared": {
"contractor": 963,
"plumbing": 535
}
},
"reading": "Same 8-H2 skeleton on both pages, but the body text is written per trade (trade-specific fields, pricing and FAQs), so only a small share of text repeats. That is the bar."
},
"your_site": {
"result": "not run",
"why": "No Search Console property for the example business. With one, step 5 shows existing pages, queries already landing on other pages, and the indexed share."
},
"template": {
"url": "/invoice-templates/{trade-slug}/ (hub: /invoice-templates/)",
"title": "{Trade} Invoice Template: Free Download (Word, Excel, PDF, Google Docs)",
"meta_description": "A {trade} invoice template with {top_line_items} already filled in. Download it, or send it from {App} with your logo in two minutes.",
"h1": "{Trade} Invoice Template",
"sections": [
{
"section": "Download block",
"data_field": "template files per format",
"per_page": true,
"why": "Word, Excel, PDF and Google Docs appear in the related searches of all three SERPs; formats live here, not as pages."
},
{
"section": "What a {trade} invoice must include",
"data_field": "preset.fields (licence number, permit, job site, materials, labour)",
"per_page": true,
"condition": "show the licence and permit fields only when preset.requires_licence is true"
},
{
"section": "A filled-in example",
"data_field": "invoice_data.top_line_items for the trade",
"per_page": true,
"condition": "only when the trade has enough invoices to be representative and to keep customers anonymous"
},
{
"section": "Typical amounts and how fast {trade} invoices get paid",
"data_field": "invoice_data.median_value, median_days_to_paid, common_terms",
"per_page": true,
"condition": "same sample-size rule; otherwise hide the section"
},
{
"section": "FAQ",
"data_field": "people_also_ask for the trade, answered with the trade's own data",
"per_page": true
},
{
"section": "Other trades and formats",
"data_field": "hub link, 4-6 siblings in the same trade group, format pages",
"per_page": false
},
{
"section": "Call to action",
"data_field": "the app's trade preset link",
"per_page": true
}
],
"structured_data": "BreadcrumbList on every page, CreativeWork for the template. FAQPage markup is optional: Google shows FAQ rich results only for a few government and health sites.",
"internal_links": "Hub lists every live trade page; each page links to the hub, 4-6 siblings and the format pages; breadcrumbs Home > Invoice templates > {Trade}.",
"uniqueness_target": "30% or less shared text between any two trade pages (the incumbent measured 9%).",
"indexing_plan": "Publish the 15 phase 1 pages in their own sitemap; inspect them after 4 weeks with batch_url_inspection; add the 16 phase 2 pages once most phase 1 pages are indexed and earning impressions. The 9 hold trades get no page for now.",
"data_refresh": [
{
"field": "preset.fields",
"source": "the app's trade presets",
"update_frequency": "whenever a preset changes",
"how": "regenerate that trade's page from the preset on publish"
},
{
"field": "invoice_data (median_value, median_days_to_paid, common_terms, top_line_items)",
"source": "aggregated, anonymised invoices in the app",
"update_frequency": "monthly",
"how": "recompute per trade, re-apply the sample-size rule, show a \"data updated\" month on the page"
},
{
"field": "FAQ questions",
"source": "people_also_ask (step 3)",
"update_frequency": "quarterly",
"how": "re-run the sampled SERPs and add new questions answered with the trade's data"
}
],
"before_you_publish": [
"onpage_instant_pages on the first drafted pages: unique meta.title and meta.description, exactly one H1, meta.canonical equal to the page URL, checks.has_micromarkup true, no empty sections",
"onpage_content_parsing on two drafts: shared text at or under 30% (the incumbent measured 9%)",
"/robots.txt does not disallow /invoice-templates/; the phase 1 sitemap lists all phase 1 URLs",
"after the first crawl, batch_url_inspection: robots_txt_state ALLOWED, indexing_state INDEXING_ALLOWED, page_fetch_state SUCCESSFUL, google_canonical = user_canonical"
],
"intent_note": "The contractor page should serve both building contractors and independent contractors, or link clearly to a freelance page, because the SERP mixes them."
},
"success_metrics": {
"indexed_pages": "80% or more of each phase indexed 4 weeks after it goes live: at least 12 of the 15 phase 1 pages before phase 2 is published, then the same for phase 2.",
"traffic_at_6_months": {
"benchmark_monthly_visits": 210,
"method": "invoicefly.com trade pages: about 128 estimated visits a month across 19 pages (about 6.7 each), times the 31 phase 1 and phase 2 pages planned to be live by month 6, rounded to the nearest 10.",
"caveat": "A benchmark built on DataForSEO traffic estimates for one competitor, not a forecast. The estimate covers only the rows returned."
},
"conversions": {
"target": null,
"why": "Not set: no conversion rate for the goal was given. Multiply the traffic benchmark by your own sign-up rate from template or landing pages."
}
},
"risks": [
{
"risk": "Thin, name-swapped pages",
"handled_by": "the 30% shared-text target (the incumbent measured 9%), measured on the first two drafts before the rest are built"
},
{
"risk": "Technical mistakes at scale",
"handled_by": "the \"Before you publish\" checks on the first drafts, then batch_url_inspection after the first crawl"
},
{
"risk": "Intent drift",
"handled_by": "contractor invoice template: 2 of 9 organic results (ranks 2, 3) are about independent (1099) contractors, not building trades. The page covers both meanings or links clearly to a freelance page."
},
{
"risk": "Too little data for small trades",
"handled_by": "the example and amounts sections show only when the trade has enough invoices; otherwise they are hidden"
},
{
"risk": "Stale data",
"handled_by": "the data refresh plan (monthly invoice data, quarterly FAQ check)"
},
{
"risk": "Pages that never earn impressions",
"handled_by": "weekly Search Console check of the folder, inspection at 4 weeks, and pruning after 3 months with no impressions"
}
],
"not_known": [
"Template uniqueness of your own pages: no drafts yet.",
"Traffic per page: the incumbent figures are DataForSEO estimates, not measured clicks.",
"The conversion target: no conversion rate for the goal was given."
],
"offered_changes": [
{
"action": "google-sheets create_sheet + update_cells",
"what": "save the 40-row page matrix (trade, keyword, volume, CPC, phase, URL, title, H1) to a new tab",
"status": "not run: needs your yes"
}
]
}
ReadyProgrammatic SEO
MarkdownUTF-8