SEO + AEO Standards

This is the single source of truth for what “compliant” means on growthmaxinc.com. Every published page must pass scripts/seo_aeo_audit.py (CI enforces this on every push to main).

If you’re a contributor, a subagent, or future-me — read this before editing or generating any page.


What “AEO” means here

Answer Engine Optimization is what makes a page citable by ChatGPT, Perplexity, Google AI Overviews, and Featured Snippets. The mechanism is simple: those engines preferentially quote short, declarative chunks that directly answer a search-shaped question. If your chunk is too long, you either get truncated mid-sentence or get skipped in favor of a competitor’s tighter answer.

The whole AEO discipline reduces to one rule: every question H2 must be followed by a 40–60 word direct answer.


Hard rules (CI fails the build if any of these are violated)

1. AEO answer length

Every H2 phrased as a question (ends with ?) must be immediately followed by a paragraph of 40–60 words. The first sentence resolves the question; the remaining 1–2 sentences add color or specificity. Any further elaboration goes in the second paragraph of that section.

This applies to:

CTA-style H2s (“Ready to…?”) are exempt.

2. H2 hygiene

H2 headings never end with a period. Question H2s end with ?; topical H2s end with no terminal punctuation. Sentence-style H2s (“The path forward.”) are not allowed.

3. Meta description length

Front-matter description: field must be ≤ 160 characters. Google truncates SERP descriptions around 155–160 chars; longer descriptions render with mid-word.

4. TLDR length

Front-matter tldr: field must be ≤ 220 characters. The TLDR renders in a callout box at the top of every post; longer TLDRs visually overwhelm the hero.

5. Posts: required front-matter fields

Every file in _posts/ must have these fields:

6. Pillar/HTML pages: required front-matter fields

Every Jekyll-processed HTML page must have:

</nav> `

7. No <h1> in post bodies

The post layout (_layouts/post.html) emits <h1>SEO + AEO Standards</h1>. A second H1 in the markdown body creates a duplicate-H1 SEO problem. Use ## and below in post markdown.

Every internal link of the form /blog/<slug>/, /resources/<page>/, /solutions/<page>/, /partnership/, or /ai-agents-for-business/ must resolve to a real file in the repo. Broken internal links waste crawl budget and frustrate users.

9. FAQPage JSON-LD validity

Any <script type="application/ld+json"> containing "@type": "FAQPage" must parse as valid JSON.


Soft rules (warnings, not failures)


Workflow

When you (or a subagent) write or edit a page

  1. Before starting, read this doc.
  2. While writing, count words on each question-H2 paragraph as you go. Aim for 50 words (middle of the 40–60 range = safety margin).
  3. Before declaring done, run:
    python scripts/seo_aeo_audit.py
    
  4. If the script reports any errors, fix them. Do not ship until it’s clean.

When the auto-generation pipeline runs

scripts/generate-post.py runs the same audit logic on its own output before saving. If the generated post fails AEO validation, the script regenerates (up to 3 attempts) with feedback like “previous attempt had paragraph X at 87 words; tighten to 40–60.” If 3 attempts all fail, the script exits non-zero, the GitHub Action fails, and the Calendar row stays Not started — the bad post never gets committed.

When CI runs on a PR or push to main

The .github/workflows/seo-audit.yml workflow runs python scripts/seo_aeo_audit.py and fails the check if exit code is non-zero. Required-status-check on main blocks merges that introduce regressions.


Anti-patterns (don’t do these)


Why this exists

In May 2026 we shipped 20 blog posts with question-format H2s but 92% of the answer paragraphs were too long (~100 words instead of 40–60). The mistake wasn’t bad writing — it was the absence of a binding test. Every check in this doc has a corresponding line in scripts/seo_aeo_audit.py. If a check isn’t enforced by the script, it isn’t really a standard.