# Planner brief

You plan every post of the blog at **SITE** (**PITCH**). You write no posts
and no code. You produce three files in this repository:

- docs/blog-plan/CATEGORIES.md
- docs/blog-plan/categories.json
- docs/blog-keywords.md

## Read first

- ai/seo/keywords/keywords.md: Google Ads Keyword Planner data for this site
  (avg monthly searches, competition, bids, trends). Your keyword source.
- The product facts, the only source for what the product does:
  src/app/page.tsx, src/components/*.tsx, src/lib/site.ts. Note what the
  product does today, what it costs, and that it may be in early access.

## The categories

Exactly **NCATS** categories, with these post counts: **COUNTS**.
Give the larger counts to the subjects with the most distinct questions.
Each category is a reader-facing subject this site's reader browses (a job
the product does, a kind of document or file, a situation the reader is in,
a decision before buying, a trust question). Never "Other" or "Misc".
Categories must not overlap: write what each covers and what it leaves to
its neighbour.

## Sibling sites: stay in your lane

Six sibling sites share one engine. Each owns its niche's keywords so the
blogs do not compete:

- autobankconvert: automation, bulk/batch conversion, bookkeeping workflows, client work for bookkeepers
- cheapbankconvert: price, free vs paid, pay-per-use, budget tooling, cost of manual data entry
- fastbankconvert: PDF/scanned statement to Excel/CSV, speed, online conversion, OCR, extracting tables
- precisebankflow: bank reconciliation, audits, accuracy checks, forensic review, fraud and altered statements
- simplebankconvert: QuickBooks and Xero imports, QBO/OFX/QFX/CSV import formats, bank feeds
- truebankflow: bank statement analysis for lenders, underwriting, cash-flow analysis, income verification, MCA

You are **KEY**. Choose primary keywords inside your lane. A generic keyword
that sits in another site's lane may only be a secondary keyword, and only
when your post genuinely covers it from your own angle.

## Choose the keywords

- Exactly **TOTAL** primary keywords. Prefer phrases a reader would type
  (3+ words, from the long-tail table), then search volume, then a mix of
  intent across the blog: learn, compare, do (step-by-step), buy.
  High-traffic head terms are good primaries only when a post can truly
  answer them for this site's reader.
- One keyword per post. Near-duplicates go on one post: one primary, the
  rest secondary (0 to 4 secondary keywords per post, from the data).
- Length "short" only when one narrow question is settled in under 1,500
  words (floor 800). Everything else "full" (floor 1,500). At most 1 short
  post per category.
- No keyword that names a competitor product or asks for a comparison with
  one (docuclipper, moneythumb, ocrolus, smallpdf, adobe, pdf2qbo, tally...).
  Brand names of accounting systems (QuickBooks, Xero) are fine.
- Every keyword in the plan must come from ai/seo/keywords/keywords.md,
  except you may add a handful (mark them "(derived)" in the Secondary
  column header note) when the data lacks an obvious reader question.

## docs/blog-keywords.md

First a table, one row per post, grouped by category in category order:

| Keyword | Intent | Length | Category | Post title | Slug | Description | Secondary keywords | Volume | Status |

- Title: at most 60 characters, contains the exact keyword phrase (case-insensitive).
- Slug: lowercase, hyphenated, contains the keyword's words in order
  (the keyword lowercased with spaces turned to hyphens must be a substring).
  Never recent, category, feed.xml, llms.txt, md, og. Unique.
- Description: 120 to 160 characters, uses every main word of the keyword
  (stop words aside), says what the reader gets.
- Secondary keywords: comma separated.
- Volume: the keyword's avg monthly searches from the data.
- Status: planned.

Then "## Section plan" with one block per post, in table order:

### <slug>

Answers: <the question behind the keyword, as a reader would ask it>

- <second-level heading> (answers: <the follow-up question>)
- ... 4 to 8 headings
  Concrete element: <the worked example, table, checklist or step list it must contain>
  Links to: <slug>, <slug>, <slug>
  Linked, not repeated:
- <subtopic> -> /blog/<other slug>#<heading anchor>

Heading rules: 4 to 8 per post, at least 2 end with "?", one names a
mistake, edge case or "when not to". Every heading contains a noun specific
to the post's keyword, so no two posts anywhere in the blog share a
heading. Banned: "How it works", "Common mistakes", "Conclusion", "FAQ",
"Introduction", "Summary". Heading anchors are the heading lowercased,
apostrophes dropped, other punctuation removed, spaces as hyphens.

One subtopic, one owner: where two posts would explain the same thing,
give it to one and list it under "Linked, not repeated" in the other.

Links to: within a category, treat the slugs as a ring in table order, so
each post links to the next two in its category; plus one slug from another
category. Every post is then linked from at least one other.

## docs/blog-plan/CATEGORIES.md and categories.json

CATEGORIES.md: a table | Slug | Name | Posts | Covers | Does not cover |.

categories.json: a JSON array in category order:
[{ "slug": "...", "name": "...", "description": "under 160 characters",
"intro": "60 to 100 words: what the category covers and which post to read first (name it)",
"count": 9 }]

## Verify before you report

Write a throwaway script (node, in /tmp) that parses your files and checks:
row count = **TOTAL**, per-category counts = the assignment, unique slugs and
keywords, slug contains the hyphenated keyword, titles <= 60 chars and
contain the keyword, descriptions 120-160 chars and contain every main
word, every block has 4-8 headings with >= 2 questions, no heading repeated
anywhere (compared lowercased without punctuation), every "Links to" slug
exists, every post is linked to by at least one other, categories.json
parses and counts match. Fix until it passes.

## Report

Under 200 words: PASS or ISSUES, the categories with counts, how many
keywords came from the data vs derived, total planned search volume.
