← Vault Index
Source: frameworks/kit-opt-in-page/04-opt-in-page-quality.md

04 — QUALITY: Opt-In Page

Pass threshold: 90 / 100 When to run: After every new opt-in page build (Mode 1) and after every update (Mode 2). Run before presenting to Kathryn.

External QC dependencies:


Page Structure (20 points)

#CheckPoints
1All 6 required sections present in correct order: Header, Hero (two-column with sticky form), What's Inside (with second CTA), Built By, Footer4
2Hero uses two-column grid: copy on left, sticky form panel on right. Grid div has class="hero-grid". Copy div has class="hero-copy". Grid declaration: grid-template-columns: 1fr 400px3
3Form panel has position: sticky; top: 100px and collapses to static at 968px breakpoint3
4Header is sticky (position: sticky; top: 0; z-index: 100) with gold bottom border2
5Three responsive breakpoints present: 968px (grid collapse via .hero-grid class selector + form unstick + order: -1 on .form-panel + display: none on .copy-details), 840px (font/padding reduction), 640px (further reduction + header wrap)4
6Page uses max-width: 1400px for hero grid and max-width: 700px for centered content sections2
7No var() CSS anywhere. No class-based CSS in body content except allowed classes: .form-panel, .cta-btn, .hero-grid, .hero-copy, .copy-details, and MailerLite form classes. Style tag contains only resets, scrollbar, sticky form, placeholders, and responsive rules2

Form & Conversion (20 points)

#CheckPoints
8MailerLite universal script present in with correct account ID2
9Form contains exactly two fields: first name (fields[name]) and email (fields[email]) — no additional fields3
10Form action URL points to a real MailerLite endpoint (not a placeholder)2
11Form submit button uses specific CTA text (not generic "Submit" or "Sign Up") — e.g., "Send Me the Brief"3
12Form redirect JavaScript function present with correct form ID and real thank-you URL3
13Trust line present below form: "Free. No credit card. No sales call." (or equivalent friction-removing language)2
14Permission line present below trust line: explains what happens after opt-in + unsubscribe mention2
15Second CTA present in What's Inside section — links to #get-it (the form panel anchor)3

Copy Quality (20 points)

#CheckPoints
16Hero follows problem-bridge-mechanism structure: problem statement (concrete pain), gold bridge line (names the solution), mechanism description (how to use it + bullet list)4
17Zero LLM brand names anywhere on the page. Uses "any large language model" or equivalent neutral phrasing4
18Zero internal acronyms in customer-facing copy (no CIB, PB, AOS, CPM)3
19"What's Inside" section lists every section of the lead magnet with numbered items and descriptions3
20Copy passes brand voice check: direct, concrete, no hype language, no corporate speak, no "transformation/journey/leverage/synergy"3
21Passes Copy QC (copy-qc.md): no twinning, no mirror reversals, no three-beat parallel lists, no rhetorical hand-holding3

Compliance (20 points)

#CheckPoints
22Meta platform disclaimer present in footer: "This site is not a part of the Meta website or Meta Platforms, Inc..." (exact required language)4
23Results disclaimer present in footer: names the specific lead magnet, states results vary, states no guarantee of specific outcome4
24Entity line present: "[Brand] is a brand of Creating Your Plan" with year and rights reserved3
25Contact email present and linked: kathryn@creatingyourplan.com2
26Three legal links present: Privacy Policy, Terms of Service, Disclaimer — all pointing to creatingyourplan.com/[page]4
27No outcome promises, no income claims, no "guaranteed" or "proven results" language anywhere on page3

Brand & Visual Consistency (10 points)

#CheckPoints
28Correct font pairing loaded: Fraunces + Montserrat (CYP) or Cormorant Garamond + Inter (AOS)2
29Color palette is internally consistent — no mixed-variant colors. All hex values match the specified brand variant.3
30Gold text on light backgrounds uses #6b5d3e (WCAG-safe), never #b79d64 directly on cream/white2
31Header matches brand: correct logo, brand name in serif font, "Kathryn Brown" subline in gold uppercase, CTA button1
32Scrollbar styling matches brand: gold thumb on primary-background track1
33No scroll-reveal animations. No var(). No external CSS files.1

Technical Quality (10 points)

#CheckPoints
34Valid HTML5: , , charset UTF-8, viewport meta tag2
35OG meta tags present: og:title, og:description, og:type, og:image1
35aMeta Pixel code present in : fbq('init', ...) + fbq('track', 'PageView') + noscript fallback. Required on every page running Meta ads1
36MailerLite form CSS present and correctly scoped to the form ID (not conflicting with page styles)2
37MailerLite webforms.min.js loaded at bottom of page1
38Loading spinner CSS present (.ml-form-embedSubmitLoad) with animation keyframes1
39Form success state styled (.ml-form-successBody) but hidden by default (display: none)1
40No dead links, no broken image references, no console errors when served locally1

Common Failure Modes

FailureWhat HappensHow to Fix
LLM brand name slipCopy says "ChatGPT" or "Claude" instead of neutral languageSearch entire page for LLM brand names. Replace with "any large language model" or "any AI assistant."
Internal acronym leakPage says "the CIB" or "join PB"Spell out every instance. Use natural shorthand ("the brief," "the skill") if the full name is too long for repeated use.
var() CSSA CSS custom property slips into inline stylesReplace with the hardcoded hex/rgba value. Grep the file for var( to catch all instances.
Class-based body CSSA class="..." attribute appears in body content with stylingMove the styles to the element's style="" attribute. The only classes allowed in body content are MailerLite form classes (required by MailerLite's embed code).
Missing form redirectForm submits but stays on page instead of redirectingVerify the mlwebformsuccess[FORMID]() function exists and the form ID matches the MailerLite embed.
Gold on cream WCAG failGold text #b79d64 used on cream #f1ede6 or white background — fails contrastUse #6b5d3e for any gold-colored text on light backgrounds. #b79d64 is only for dark backgrounds.
Missing Meta disclaimerFooter omits the Meta platform disclaimer — ad account riskAdd the exact disclaimer language. This is non-negotiable for any page running Meta ads.
Results disclaimer too genericFooter disclaimer says "results may vary" without naming the specific lead magnetRewrite to name the lead magnet: "The [Lead Magnet Name] is a free skill file for use with AI assistants. Your results will vary..."
Attribute selector in responsive breakpoint968px breakpoint uses div[style*="grid-template-columns"] instead of .hero-grid — breaks in Facebook in-app browser where all Meta ad traffic landsUse .hero-grid class selector. Never target grid via attribute selectors on inline styles.
Form buried on mobileForm falls below multiple scrolls of content on mobile — visitor never sees itAdd order: -1 on .hero-grid .form-panel at 968px so form renders first. Add display: none on .hero-copy .copy-details to hide bullets/credential that push form below fold.
Missing Meta PixelPage runs Meta ads but has no pixel code — no conversion tracking, no optimization signalAdd Meta Pixel fbq('init', ...) + fbq('track', 'PageView') in with noscript fallback.
Form panel lost on mobileTwo-column grid doesn't collapse on small screensVerify 968px breakpoint changes grid to single column and form panel to position: static.
Sticky form overlapForm panel overlaps the header on scrollVerify top: 100px on the sticky form (must clear the sticky header height).
Outcome promise in copyA sentence implies guaranteed results ("you will" / "guaranteed to")Rewrite to describe the mechanism, not the outcome. "Surfaces commitments that have gone quiet" (mechanism) vs. "You'll never miss a follow-up again" (promise).
Mixed brand variantsPage uses CYP colors but AOS fonts, or vice versaPick one variant and verify every color, font, entity name, and domain matches that variant's spec.
Scroll-reveal animation addedCSS animations on scroll intersection added to sectionsRemove all scroll-reveal / fade-in animations. Opt-in pages use static content only.