Best-practice rulebook for a marketing site's pages, organized by page class — campaign landers, product pages, programmatic SEO trees, editorial. Use when writing or updating a landing/marketing page, wiring a campaign lander to an attribution identifier, changing site-wide nav/footer links, touching sitemap/robots/agent-readable surfaces, or auditing a public site's indexing, reachability, and conversion setup.
npx skills add https://github.com/dzhng/skills --skill marketing-pages
A rulebook, not a workflow: every rule below is simultaneously a constraint to
build against and a check to audit against. Classify the page first — every
public page belongs to exactly one page class, and the class decides its
indexing, linking, chrome, and wiring.
| Class | Indexing | Reachability | Chrome |
|---|---|---|---|
| Campaign lander | noindex, follow; never in a sitemap | never linked from nav/footer | minimal: logo + ONE CTA, legal-only footer, no site nav |
| Product page | indexed | nav Product section and/or footer | full chrome |
| SEO tree page (programmatic: per-persona, per-industry, per-competitor) | indexed | footer link grid + hub pages | full chrome |
| Editorial (blog/guides) | indexed | header + footer | full chrome |
| Legal/utility | indexed | footer | full chrome |
linked, indexed class or make it a campaign lander. Never leave the halfway
state.
/l/<slug>): onestartsWith covers blanket noindex and "never nav-linked" checks, and slug
collisions with real pages become impossible.
Campaign landers are alternate main landers — one audience, one promise, paid
traffic. They trade SEO for message-match freedom; indexed near-duplicates
split authority and freeze copy that should be A/B-able daily.
unbroken promise. Where the product supports it, the campaign identifier
flows through signup into onboarding and analytics, so the first-run
experience continues the promise and conversions attribute per lander.
microcopy ("no credit card"); capture only what qualifies later (usually
just email).
LCP is a conversion input on paid traffic.
(lead → signup → purchase) must be readable somewhere before ads spend.
Search Console afterward are the intended signal, not a defect.
Each of these has one owner in the codebase — find the current owner rather
than trusting remembered paths:
check against.
sitemap is a contradictory signal, as is an indexed page missing from it.
lastmod is honest (content date, not build time).
render from the same copy source the page renders from — never from built
HTML, never hand-drifted duplicates.
campaign landers and internal surfaces. robots, meta robots, and the
sitemap must agree on every URL.
grid is the crawl rail. Pages discoverable only via the sitemap sit in
"Discovered — not indexed" for weeks and receive no internal authority.
the product code owns — restated numbers drift silently and nothing turns
red.
verify every authored target resolves.
(redirect to the canonical locale, not 404) — sitewide chrome prefetches
every link from every page.
registry, sitemap, agent-readable twin, links from kept pages, visual
baselines, and e2e/journey anchors (grep the test suites — a rename that
keeps local gates green can break a live journey hours later).
than footer anchors — add them where content genuinely relates.
refreshed on a real cadence — a stale dated page is worse than an undated
one.
thin templated pages are doorway-page bait.
its hub, and the hub from the site chrome.
(playground/storybook entry) that owns their visual coverage; the fixture
menu doubles as the component catalog new pages are composed from.
Routes churn; fixtures are the stable oracle. New template → one new
representative route; new section → a fixture, not more route shots.
primed by the change pass defects fresh eyes catch.
Auditing a site = evaluating every rule above, plus these cross-cutting
sweeps; each must come back empty or explained:
Take dzhng/marketing-pages from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.