📁 SEO
Programmatic SEO Page Brief from Template and Data Rows (Unique Copy, No Thin Pages)
Turn a template plus real data rows into per-page briefs with unique copy, no fabricated facts
0Reviews
Prompt
Act as a programmatic SEO strategist who writes page briefs from a template and real data rows. You never invent a statistic, a price, a review count, a citation, a business name, or a ranking claim that is not in [Rows]. You refuse to produce thin pages: if a row cannot support a unique block, the brief says what data is missing instead of padding. You work only from Inputs. Do not invent stats, citations, quotes, URLs, names, IDs, or records that are not in Inputs. Inputs: - Page template type (city+service, product+attribute, comparison, glossary): [Template] - Data rows, one per page, verbatim: [Rows] - Fields available per row: [Fields] - The target query pattern: [QueryPattern] - Facts I can support for every page: [Facts] - Internal links I can offer: [Links] - Minimum unique-word target: [MinWords] - Words or claims I must not use: [Banned] - Output format: [Format] - Language: [Lang] Generate: 1. Row ledger: every row listed with the fields present and the fields missing. Print the row count. Forbidden: invented fields, invented rows. 2. Feasibility check: for each row, can it reach [MinWords] with unique supported content? Mark PASS, THIN, or MISSING DATA. A THIN row gets no page until the missing field exists. 3. Per-row brief: title under 60 characters, H1, meta description under 155 characters, the unique blocks (what this row says that no other row says), the shared blocks that stay identical across pages, and the internal links from [Links]. 4. Uniqueness ledger: per page, which sentences come only from that row. Print the count. If it is below the minimum the brief demands, mark the page THIN and name the missing field. 5. Cannibalization check: pages that would compete for the same query from [QueryPattern], and the distinguishing angle for each. If two rows cannot be distinguished, one of them is merged. 6. Schema and markup notes: what structured data the page can honestly carry from [Fields], with no invented ratings or prices. 7. Publish order: ranked by search demand signal in [Rows] times feasibility. No demand number is invented. 8. Gaps: what the rows do not show and what I still owe you. Constraints: - Every claim, number, and name traces to a quoted field in [Rows] or [Facts]. Quote or drop. - No invented statistics, no invented review counts, no fabricated scarcity, no padding paragraphs. - Honor [Template], [MinWords], [Format], and [Lang]. - Missing-data policy: if a field was blank, write NOT IN INPUTS. - End with a five-bullet list of what the user still owe you.
Instructions
Paste the data rows exactly as exported, one row per page, and keep the field order identical. Replace every [bracket] before running. Works on ChatGPT, Claude, and Gemini. Blank fields become NOT IN INPUTS, and thin rows are reported rather than padded.
Examples
Example Input
Template: city + service Rows: Row1: city=Austin, service=bookkeeping, median_practice_size=4, local_licence_body=Texas State Board of Public Accountancy, state=Texas, price_range=NOT IN INPUTS Row2: city=Round Rock, service=bookkeeping, median_practice_size=2, local_licence_body=Texas State Board of Public Accountancy, state=Texas, price_range=NOT IN INPUTS Row3: city=Austin, service=bookkeeping, median_practice_size=4, local_licence_body=NOT IN INPUTS, state=NOT IN INPUTS, price_range=NOT IN INPUTS Row4: city=Plano, service=bookkeeping, median_practice_size=6, local_licence_body=Texas State Board of Public Accountancy, state=Texas, price_range=NOT IN INPUTS Fields: city, service, median_practice_size, local_licence_body, state, price_range QueryPattern: bookkeeping [city] Facts: I am a bookkeeping service operating in all four cities, staffed by licensed accountants, without stating pricing. Links: /blog/texas-bookkeeping-rules, /services/quickbooks-cleanup, /services/month-end-close MinWords: 400 Banned: best, cheapest, guaranteed, #1, award-winning Format: per-row brief table + feasibility Lang: English
Example Output
1. Row ledger.
Row count: 4. Fields present on all rows: city, service, median_practice_size. Missing: price_range on all four rows. local_licence_body and state missing on Row3 only.
2. Feasibility check.
Row1 Austin: unique fields city + median_practice_size 4 + licence body + state. PASS, can reach 400 words.
Row2 Round Rock: PASS, median_practice_size 2 is distinct from Austin.
Row3 Austin: FAIL. It repeats city and practice size of Row1 and lacks licence body and state, so it has no unique blocks. THIN. Do not publish; merge into Row1 or add the missing fields.
Row4 Plano: PASS, median_practice_size 6 is distinct.
3. Per-row brief.
Row1: Title "Bookkeeping in Austin for 4-Person Practices" (43 chars). H1 "Bookkeeping in Austin: what a four-person practice actually needs". Meta: "Austin bookkeeping built around four-person firms: local licensing, month-end close, and who does what. No pricing claims." (139 chars). Unique blocks: the four-person practice profile, Texas State Board of Public Accountancy reference, the fact that I serve Austin. Shared blocks: what bookkeeping covers, how engagement starts. Links: /blog/texas-bookkeeping-rules, /services/month-end-close.
Row2: Title "Bookkeeping in Round Rock for 2-Person Firms" (43 chars). H1 "Bookkeeping in Round Rock: a two-person firm is a different job". Meta: "Round Rock bookkeeping for two-person firms, with the same Texas licensing frame and a lighter month-end close. No pricing claims." (140 chars). Unique blocks: two-person practice profile, same licence body so the distinction is the profile, not the city alone. Links: /blog/texas-bookkeeping-rules, /services/quickbooks-cleanup.
Row4: Title "Bookkeeping in Plano for 6-Person Practices" (44 chars). H1 "Bookkeeping in Plano: what a six-person practice needs". Meta: "Plano bookkeeping for six-person firms, with Texas licensing and a month-end close sized for a bigger team. No pricing claims." (132 chars). Unique blocks: six-person practice profile, the largest of the three, which is the page's only differentiator against Austin. Links: /services/month-end-close, /blog/texas-bookkeeping-rules.
4. Uniqueness ledger.
Row1: 3 unique sentences from this row (practice size 4, licence body, city) plus the shared blocks. Meets 400.
Row2: 3 unique sentences. Meets 400.
Row3: 0 unique sentences. Does not meet 400. THIN.
Row4: 3 unique sentences. Meets 400.
5. Cannibalization check.
Row1 and Row3 both target "bookkeeping Austin" and cannot be distinguished, because Row3 has no unique field. Merge Row3 into Row1.
Row2 and Row4 target distinct queries ("bookkeeping Round Rock", "bookkeeping Plano") and have distinct practice sizes, so both stay.
6. Schema and markup notes.
LocalBusiness or Service markup per row, carrying city, state, and licence body from [Fields]. No AggregateRating and no price markup, because no rating or price field exists in [Rows].
7. Publish order.
1. Row1 Austin, 2. Row4 Plano, 3. Row2 Round Rock. The order follows row order in the export, which is the only demand signal in [Rows]; no volume number is claimed.
8. Gaps.
No price range exists on any row, so no pricing content is written anywhere.
What you still owe me:
- A demand signal you trust, since the export order is all that exists
- Whether Row3 should be merged or given the missing fields
- A real rating or review field if you want star markup, which is currently absent
- Confirmation that all four cities are genuinely served, since [Facts] asserts it
- The internal link targets that exist today, not planned ones