Build Engine: Claude Code → GitHub → Cloudflare Pages v3.0 · March 2026
INTERNAL OPERATIONS DOCUMENT — v3.0

Website Operations Playbook

The complete 20-step linear workflow for how we build, QA, launch, and hand off every client website at Dotcom Design. Every step must be completed in order. No step may be skipped.

Version: 3.0 Updated: March 2026 Steps: 20 Build Engine: Claude Code Status: Active
v3.0 Changes from v2.0: All Manus references replaced with Claude Code. About page SOP added. Contact page SOP added. Slider translation guide added. Error recovery appendix added. Asset handoff protocol defined. Image sourcing protocol added. Logo fallback SOP added. Client approval gate added to Step 4. Content Inventory added back to Step 5 completion gate. Section count corrected to 10 throughout.

How This Playbook Works

This is a linear workflow. Each step has an Entry Condition (what must be true before you start) and a Completion Gate (the exact deliverables that must exist before you move forward). You cannot enter a step until its Entry Condition is met. You cannot leave a step until its Completion Gate is satisfied.

The 20-Step Workflow

#StepPhaseTime
1Kickoff CallIntake45 min
2Content ScrapingIntake30 min
3Domain & Hosting IntakeIntake15 min
4SEO StrategyIntake15 min
5Brief PreparationBuild30 min
6Site BuildBuild2–4 hrs
7Visual QAQA30 min
8Technical QAQA20 min
9SEO Readiness AuditQA20 min
10Performance OptimizationQA30 min
11AI Friendliness AuditQA15 min
12Content QAReview20 min
13Deploy to PreviewReview15 min
13.5Internal ReviewReview1–2 hrs
14Client ReviewReview48 hr window
15RevisionsLaunch1–2 hrs
16Go LiveLaunch30 min
17Post-Launch MonitoringLaunch30 min
18GBP SyncHandoff20 min
19Quarterback HandoffHandoff15 min
20Ongoing MaintenanceHandoffOngoing
Entry Condition — Before starting this step
  • Signed contract received from the client
  • Client contact name, phone, and email confirmed
  • Kickoff call scheduled and confirmed with client
1
Phase 1: Intake
Kickoff Call

The kickoff call is the foundation of every build. Everything that follows — the brief, the build, the SEO strategy — depends on the quality of information gathered here. The call should run 45 minutes. Do not rush it. A thorough kickoff prevents revision loops later.

Before the Call

Look up the client's existing website (if they have one) and spend 10 minutes reviewing it. Note the services they list, the cities they mention, and any obvious gaps or outdated content. This preparation allows you to ask better questions and catch inconsistencies during the call.

Call Structure (45 Minutes)

TimeTopicWhat to Capture
0–5 minIntroductions & overviewConfirm contact info, confirm timeline expectations. Tell client: "Your site will be live within 10 business days of this call."
5–15 minBusiness overviewExact business name, years in business, number of employees, license numbers, service area, HQ city
15–25 minServicesComplete list of every service offered, primary vs. secondary services, services they want to emphasize
25–35 minDesign directionDesign slider scores (see below), reference sites they like, colors or fonts they prefer, logo files
35–45 minContent & logisticsPhotos available, testimonials/reviews, team bios, special offers, any content they want to keep from old site. Confirm SEO plan level.

Design Sliders

Ask the client to score each slider from 1 to 10. Record all six scores. See the Design Standards appendix for how these scores translate into specific font, color, and layout decisions during the build.

Slider1 (Left)10 (Right)
StyleClassic / TraditionalModern / Contemporary
ToneLight & AiryDark & Bold
ComplexitySimple & CleanRich & Layered
VoiceFriendly & ApproachableAuthoritative & Expert
Market PositionEconomical & AccessiblePremium & Exclusive
AestheticPolished & RefinedGritty & Industrial

Logo — What to Do If Not Available

Ask for PNG or SVG. If the client does not have a logo file ready, follow this decision tree:

SituationAction
Client has a logo but can't find the fileNote "TBD — follow up within 48 hrs." Schedule a follow-up. Do not start Step 5 until received.
Client has never had a logoBuild a wordmark using the display font from the design system. Use the business name in the heading font at bold weight. Document this in Section 5 of the brief as "Wordmark — no logo file, typography-based."
Client has a low-quality JPG onlyAccept it for now. Note in Section 5 to use it at reduced size to minimize pixelation. Flag to client that a vector version is recommended.

Client Brief Fields

Every field in the client brief must be filled before leaving this step. Do not leave any field blank. If the client does not know the answer, note "TBD — follow up" and schedule a follow-up before Step 5.

FieldNotes
Business name (exact)As it appears on their license and Google Business Profile
Phone numberPrimary contact number for the website
AddressFull street address including ZIP
Business hoursDay-by-day, including holiday exceptions if known
Service areaCities, counties, or radius served
Services listComplete list, ordered by importance
Years in businessUsed in trust signals and schema
Jobs/projects completedSpecific number — ask directly. Used in AI Friendliness stats.
License numbersContractor license, bonding, insurance — whatever applies
Warranty lengthIf applicable — used in AI Friendliness stats
Response timee.g., "same-day estimates" — used in AI Friendliness stats
Design slider scoresAll six sliders, 1–10
Reference site URLA site they like the look of (optional but valuable)
Logo filesRequest PNG or SVG; document fallback if unavailable (see Logo section above)
Photos availableYes/No and approximate count
Testimonials/reviewsCount and source (Google, Yelp, etc.)
BBB profile URLSearch BBB.org — note if not listed
Google Business Profile URLSearch Google Maps for the business
Industry associationNARI, NAHB, AGC, etc. — ask directly
SEO plan levelSEO Booster / Plan A / B / C / D / E — determines page count
Project timelineConfirm: "Your site will be live within 10 business days."
Completion Gate — Required before moving to Step 2
  • Client brief fully populated — all fields filled or marked TBD with follow-up scheduled
  • All six design slider scores recorded
  • Reference site URL noted (or confirmed not applicable)
  • Logo status confirmed — file received, follow-up scheduled, or wordmark fallback documented
  • Photos status confirmed (available count or "client will send")
  • SEO plan level confirmed
  • Client has been told the 10 business day timeline
Next Step
Step 2: Content Scraping & Site Inventory
Entry Condition
  • Step 1 Completion Gate satisfied
  • Client's existing website URL confirmed (if they have one)
2
Phase 1: Intake
Content Scraping & Site Inventory

If the client has an existing website, extract all usable content before it is replaced. This step ensures no copy, imagery, or data is lost during the transition. Even a poorly designed old site often contains accurate business information that would take hours to re-gather.

Do not skip this step for clients with existing sites. The old site is the single most complete source of business information available. Skipping it forces you to reconstruct content from scratch during the build, which introduces errors and delays.

Asset Handoff Protocol — How Files Move Forward

All scraped assets must be saved in a defined location before Step 5 begins. This is the asset handoff — the link between content scraping and the build. Use this protocol exactly so there is never ambiguity about where files are.

Asset TypeWhere to SaveFormat
All page copy/assets/copy/[page-name].mdMarkdown text files
Images/assets/images/WebP preferred; JPG/PNG acceptable if conversion needed later
Logo files/assets/logo/PNG and SVG if available
Business info (NAP)/assets/brief.mdStructured markdown with all business data
Testimonials/assets/testimonials.mdOne per section with reviewer name and source

These files live in the client's project folder on the build machine. When Claude Code starts the build in Step 6, the assets are already in place at known paths.

Scraping Method

Use Claude Code to run the scraper. Open the client project repo in Claude Code and run the following command:

CLAUDE CODE — CONTENT SCRAPE
Please scrape the following website and extract all content for a rebuild:
[CLIENT WEBSITE URL]

Save all assets to the /assets/ folder using this structure:
- /assets/copy/[page-name].md — all page copy as markdown
- /assets/images/ — all images, converted to WebP where possible
- /assets/logo/ — logo files as PNG and SVG if available
- /assets/brief.md — business name, phone, address, hours, service area
- /assets/testimonials.md — all testimonials with reviewer names and sources

Also provide a /assets/inventory.md summary of what was found and
what was missing or inaccessible (blocked pages, JS-rendered content, etc.).

Cross-reference the business info against this client brief and flag
any discrepancies: [PASTE CLIENT BRIEF FROM STEP 1]

Image Sourcing — Clients Without Photos

When a client has no photos or the existing site has unusable images, use stock photography from these approved sources in this priority order:

SourceLicenseUse For
Client's own photosClient-ownedAlways preferred — real work photos for service and hero images
Unsplash (unsplash.com)Free commercial useHigh-quality stock for hero images when no client photos available
Pexels (pexels.com)Free commercial useTrade-specific stock photography
Pixabay (pixabay.com)Free commercial useBackup when Unsplash/Pexels don't have suitable options
Never use Google Image Search results as stock photography. Images found via Google are almost always copyrighted. Only use the three approved sources above.

If the Client Has No Existing Website

Skip the scrape. Use the client brief from Step 1 as the sole content source. Create the /assets/brief.md file manually from the KO call notes. Note in the inventory that no existing site was available. Proceed to Step 3.

Site Inventory Checklist

ItemFound?Notes
All page copyYes / No / PartialNote any pages that were blocked or inaccessible
ImagesYes / No / PartialNote count and quality. Flag any that need stock replacements.
Logo filesYes / NoNote format (PNG, SVG, JPG)
Business info (NAP)Yes / NoCross-reference against client brief — brief takes precedence on conflicts
Services listYes / No / PartialNote any services on old site not in brief
TestimonialsYes / NoNote count
Team infoYes / NoNames, titles, bios
License/cert numbersYes / NoVerify against brief
Existing integrationsYes / NoNote any to replicate (chat widgets, booking tools, etc.)
All existing pages listedYes / NoFull page list for Content Inventory in Step 5
Completion Gate — Required before moving to Step 3
  • All extractable content saved to /assets/ folder using the defined structure
  • /assets/inventory.md created with what was found and what was missing
  • Site inventory checklist completed
  • Discrepancies between old site and client brief identified and flagged
  • Image plan documented — client photos available OR approved stock sources identified
Next Step
Step 3: Domain & Hosting Intake
Entry Condition
  • Step 2 Completion Gate satisfied
  • Client contact available to provide or look up credentials
3
Phase 1: Intake
Domain & Hosting Intake

Before any build work begins, you need access to the client's domain registrar. DNS changes are required at launch (Step 16), and discovering access problems on launch day creates delays and client frustration. Resolve access now.

Domain Registrar Access

Ask the client: "Who manages your domain — where did you originally register it?" Common registrars include GoDaddy, Namecheap, Google Domains (now Squarespace), Network Solutions, and Bluehost.

"I don't know my password" is the most common response. Walk the client through the password reset process on the call if possible. Do not leave this step with unresolved access. A client who cannot access their registrar today will not be able to on launch day.

What to Document

ItemWhere to Find ItWhy It Matters
Domain registrar nameClient provides; or run whois clientdomain.comTells you where to make DNS changes at launch
Registrar login credentialsClient providesRequired to add DNS records at launch
Current nameserversRegistrar DNS settingsDetermines if DNS is managed at registrar or elsewhere (e.g., Cloudflare)
Current DNS recordsRegistrar DNS settingsScreenshot or copy ALL existing A, CNAME, MX, TXT records before making any changes
Domain expiration dateRegistrar dashboardAlert client if domain expires within 90 days
Current hosting providerClient provides or DNS lookupNeeded to understand what will be replaced

GitHub Repo Setup

Create the client's GitHub repo now so it's ready when the build starts. All client sites live under the dotcomdesigniowa GitHub organization.

ItemStandard
Organizationdotcomdesigniowa
Repo naming convention[client-slug]-website — e.g., markuson-construction-website. Use lowercase, hyphens only, no spaces.
VisibilityPrivate
Initial commitAdd a README.md with the client name and live domain. Claude Code will populate the rest during Step 6.

Cloudflare Pages Setup

Create the Cloudflare Pages project now. Connect it to the GitHub repo and configure it for the static site.

SettingValue
Project nameSame as repo slug: [client-slug]-website
Build command(leave blank — no build step for static HTML sites)
Output directory/ (root)
Branchmain

The preview URL will be https://[project-name].pages.dev — save this for Step 13.

New Domains

If the client does not have a domain yet, register one through Namecheap or Cloudflare Registrar. Use the client's business name as the basis. Confirm the domain with the client before purchasing. Document the registrar credentials immediately after registration.

Completion Gate — Required before moving to Step 4
  • Domain registrar identified and documented
  • Registrar login credentials confirmed and accessible
  • Current DNS records documented (screenshot or text copy) — ALL records, not just A records
  • Domain expiration date noted; client alerted if within 90 days
  • GitHub repo created under dotcomdesigniowa with correct naming convention
  • Cloudflare Pages project created and connected to GitHub repo
  • Cloudflare Pages preview URL saved to project record
Next Step
Step 4: SEO Strategy
Entry Condition
  • Step 3 Completion Gate satisfied
  • Client website URL available (existing site or confirmed new domain)
  • Client's plan level confirmed from Step 1
4
Phase 1: Intake
SEO Strategy

The SEO strategy produces the keyword-city matrix that drives the entire site architecture. Every service page and location page built in Step 6 corresponds to a row in this matrix. The strategy must be completed and approved by the client before the brief is locked.

How to Run the SEO Strategy

Navigate to the SEO Portal at seo.dotcomdesignops.com and click "Build New Strategy." Enter the client's website URL and plan level. The system will run automatically and produce a live strategy site within 5 minutes.

What the Strategy Produces

OutputWhat It IsHow It's Used
Keyword-city matrixA grid of selected keywords × selected marketsPasted directly into Section 7 of the build prompt in Step 5
Live strategy site URLBranded client-facing site at seo-strategy.dotcomdesign.com/{domain}Sent to client for approval before Step 5 begins
Selected keywordsThe 1–5 keywords chosen for this clientUsed to name service pages and write meta titles
Selected marketsThe cities targeted in the strategyUsed to name location pages and write meta titles

Client Approval — Required Before Step 5

Do not proceed to Step 5 without client approval of the keyword-city matrix. Building 30 pages targeting the wrong keywords or wrong cities is a catastrophic waste that cannot be fixed without rebuilding. This approval takes 10 minutes and prevents hours of rework.

Send the client the live strategy site URL with this message:

SEO STRATEGY APPROVAL EMAIL
Subject: Please Approve Your SEO Strategy — [Business Name]

Hi [Client Name],

Before we begin building your website, we need your approval on the
SEO strategy. This determines which pages get built and which keywords
and cities your site will target.

Please review your strategy here:
[STRATEGY SITE URL]

Check that:
- The services listed match what you offer
- The cities listed are the markets you want to target
- The combination count matches your plan level

Reply "Approved" to move forward, or let us know any changes needed.
We need your approval before we can start building.

[Your name]

Plan Levels Reference

PlanPriceCombinationsApprox. Pages
SEO Booster$399/mo10~14 total
Plan A$600/mo20~24 total
Plan B$900/mo30~34 total
Plan C$1,200/mo40~44 total
Plan D$1,600/mo50~54 total
Plan E$2,000/mo60~64 total
Completion Gate — Required before moving to Step 5
  • Keyword-city matrix generated with correct combination count for the plan level
  • Live strategy site URL saved to the project record
  • Strategy site URL sent to client with approval email
  • Written client approval received ("Approved" via email or text)
  • Matrix copied and ready to paste into Section 7 of the build prompt
Next Step
Step 5: Brief Preparation
Entry Condition
  • Steps 1–4 Completion Gates all satisfied
  • Written client approval of SEO matrix received (Step 4 gate)
  • Client brief fully populated
  • Keyword-city matrix ready to paste
  • Logo file or fallback documented
  • Assets in /assets/ folder from Step 2
5
Phase 2: Build
Brief Preparation

The build brief is the single document that drives the entire Claude Code build session. A well-written brief produces a site that needs minimal revision. A vague or incomplete brief produces a site that requires multiple revision loops. Invest the time here.

Brief Anatomy — 10 Required Sections

The brief has 10 sections — not 8. All 10 must be completed before the build begins. The Claude Code opening prompt references "all ten sections." Do not start the build with a partial brief.
#SectionWhat Goes Here
1Client & Project IdentityBusiness name, domain, plan level, GitHub repo URL, Cloudflare Pages preview URL
2Business OverviewExact business name, phone, address, hours, years in business, license numbers, jobs completed
3ServicesComplete ordered list of all services; note primary vs. secondary
4Design DirectionAll six slider scores + design translation (see slider guide below), reference site URL, color/font preferences
5Features & FunctionalityContact form fields, any special integrations (booking, chat, etc.), gallery requirement (Y/N), photo count
6Content AssetsLogo file path (/assets/logo/), photo paths (/assets/images/), testimonials path (/assets/testimonials.md), team info
7SEO & Local StrategyFull keyword-city matrix from Step 4, primary city, all cities/counties served
8AI Friendliness DataAll 12 data points required for 32/32 AI audit score (see table below)
9Audit StandardsThe four audit pass requirements — copy from System Standards. Do not abbreviate.
10Build InstructionsContent Inventory (pages to include/exclude), any special pages requested, content to preserve

Slider Score Translation Guide

In Section 4, translate each slider score into specific design decisions. Do not leave this as raw numbers — give Claude Code explicit instructions derived from the scores.

SliderScore 1–3Score 4–6Score 7–10
StyleSerif display font. Warm tones. Traditional layouts. No heavy drop shadows.Mixed — one sans display, one serif body. Neutral palette.Bold geometric sans font. High contrast. Asymmetric layouts acceptable.
ToneWhite/cream backgrounds dominant. Light photography. Airy spacing.Mix of light and one dark section. Medium photography contrast.Dark hero. Dark footer. Bold color sections. High-contrast everything.
ComplexityMax 3 sections per page. Minimal icons. Lots of white space. Simple nav.Standard 5–6 sections. Icon grids. Medium detail level.6+ sections. Layered backgrounds. Counter animations. Rich icon sets. Parallax acceptable.
VoiceFirst-person plural ("we're here to help"). Short sentences. Warm CTA language.Balanced professional and approachable. Moderate authority signals.Expert language. Years/stats front-loaded. "Industry leaders." Credentials prominent.
Market PositionEmphasize value, accessibility, no job too small. Transparent pricing language.Balanced — quality + reasonable price. Trusted local contractor framing.Premium framing. Emphasize craftsmanship, warranty, guarantees. Avoid price language.
AestheticRounded corners. Soft shadows. Photography with clean backgrounds.Standard border-radius (8px). Clean drop shadows. Professional photography.Sharp corners. Bold borders. Texture backgrounds. Dramatic photography. Industrial imagery.

Content Inventory — Pages on the Existing Site

Before finalizing Section 10 of the brief, review the page list from the /assets/inventory.md file created in Step 2. For each page found on the old site, decide: Include (carry into the new build) or Archive (intentionally drop). Document this decision in Section 10.

The most common post-launch complaint is a missing page that existed on the old site. Do not leave any page unmarked. If unsure whether a page should be included, default to Include and flag it in Section 10.

AI Friendliness Data Requirements

All 12 items below must be populated in Section 8 of the brief. If any are missing, the brief is incomplete. These data points feed the AI audit at Step 11 — missing them requires rework.

Data PointUsed ForWhere to Collect
Years in businessStatistics Presence (Factor 10)KO call or existing website
Jobs/projects completedStatistics Presence (Factor 10)KO call — ask directly
Warranty length (if applicable)Statistics Presence (Factor 10)KO call or service documentation
Response time (e.g., "same-day estimates")Statistics Presence (Factor 10)KO call
BBB profile URLCitation Presence (Factor 23)Search BBB.org for the business
Google Business Profile URLCitation Presence (Factor 23)Google Maps search
License number(s)Citation Presence + TrustKO call or state licensing board
Industry association membershipCitation Presence (Factor 23)KO call
Full NAP (Name, Address, Phone)Schema + NAP Consistency (Factors 20, 26)KO form — must match GBP exactly
Business hoursSchema (Factor 20)KO form
Geo coordinatesSchema (Factor 20)Google Maps — look up the address, copy lat/lng
FAQ questions (5+ per page)FAQ Structure (Factor 16)Generate from service type if client can't provide
Completion Gate — Required before moving to Step 6
  • Content Inventory reviewed from /assets/inventory.md — every page marked Include or Archive
  • Included pages listed in Section 10 (Build Instructions) of the brief
  • All 10 brief sections completed — no blank fields
  • Slider scores translated into specific design instructions in Section 4
  • SEO matrix pasted into Section 7
  • All 12 AI Friendliness data points populated in Section 8
  • All asset paths confirmed in Section 6 (logo, photos, testimonials)
  • Build prompt template filled and ready to submit to Claude Code
Next Step
Step 6: Site Build
Entry Condition
  • Step 5 Completion Gate satisfied — all 10 brief sections complete
  • Build prompt template filled and ready to submit
  • All assets confirmed in /assets/ folder
  • CLAUDE.md present in the project repo root
6
Phase 2: Build
Site Build

The site build is executed in Claude Code using the static HTML/CSS/JS stack. Claude Code builds the full site based on the brief. Your role during the build is to review output as it comes in, catch issues early, and provide corrections before the full site is assembled.

Build Stack — Non-Negotiable

LayerTechnologyNotes
MarkupHTML5 (semantic)Proper heading hierarchy, landmark elements, ARIA labels
StylingCSS3 — no frameworksNo Bootstrap, no Tailwind — hand-written CSS only. Use CSS variables.
InteractivityVanilla JavaScriptNo jQuery, no React — plain JS only
ImagesWebP formatAll images converted to WebP before deployment. Explicit width/height on all img tags.
FontsGoogle Fonts CDNUse display=swap + preconnect. No Adobe Fonts.
HostingCloudflare PagesAll sites deploy to Cloudflare Pages via GitHub repo (set up in Step 3)
DNSCloudflare DNSAll domains use Cloudflare for DNS management
FormsFormspreeOne Formspree form per client. Notification email = client's primary email.

Formspree Setup

SettingValue
AccountCreate one Formspree project per client. Do not mix clients on one account.
Form endpoint formathttps://formspree.io/f/[form-id]
Notification emailClient's primary contact email from the brief
Required form fieldsName, Phone, Email, Message, "How did you find us?" dropdown (required for AI Factor 32)
"How did you find us?" optionsGoogle Search, Google Maps, Facebook, Instagram, AI Assistant / Chatbot, Referral, Other
Success behaviorShow inline success message — do not redirect to a blank confirmation page

Required Pages

PageRequired?Notes
Home (/)AlwaysFull homepage with hero, services overview, trust signals, CTA
About (/about)AlwaysSee About Page SOP below
Contact (/contact)AlwaysSee Contact Page SOP below
Service pagesPer matrixOne page per keyword in the SEO matrix (e.g., /roofing)
Location pagesPer matrixOne page per city in the SEO matrix (e.g., /roofing-omaha-ne)
Gallery (/gallery)If 6+ photosRequired if client has 6 or more photos; skip if fewer
AI Info (/ai)AlwaysAI disclosure page — required for AI Factor 29. Link in footer as "AI Info".

Homepage SOP — 10 Required Sections in Order

  1. Navigation bar — Logo, all main nav links, phone number as CTA button. Sticky on scroll. Max 5 nav items.
  2. Hero section — H1 with primary keyword, subheadline, primary CTA button (phone), secondary CTA (contact form). Full-width background image with dark overlay.
  3. Trust bar — Years in business, license number, service area, key differentiators. Icon + stat pairs. Quick Facts / At a Glance format (AI Factor 15).
  4. Services overview — Grid of service cards. Each card links to the corresponding service page.
  5. About teaser — 2–3 sentences about the company, photo of owner or team, link to full About page. Must include owner name and one expert quote (AI Factor 27).
  6. Gallery teaser — 3–6 photos in a grid. Link to full Gallery page. Skip if no photos available.
  7. Testimonials — 3–5 testimonials. Star ratings. Source attribution (Google, etc.). Swipe carousel on mobile.
  8. Service area map or list — Embedded Google Map or list of all cities served in plain HTML text (required for AI Factor 19).
  9. Contact CTA section — Brand-color background. Phone number in large type. Button linking to contact form. Never a plain paragraph.
  10. Footer — Logo, nav links, phone, full address, hours, copyright year (auto-updating JS), license number, "AI Info" link. Dark background. Three-column desktop, stacked mobile.

About Page SOP — Required Sections

The About page carries the most E-E-A-T weight of any page on the site. It must contain all five sections below in this order.

  1. Page hero — H1: "About [Business Name]" or "[Business Name] — [City]'s Trusted [Trade] Contractor." Subheadline with years in business. Real photo of owner or team as the hero background.
  2. Owner profile — Owner name, title, years of experience, credentials (license, certifications), and a personal story paragraph (3–5 sentences minimum). Photo of the owner. This section is required for AI Factor 21 (Author Profiles) and E-E-A-T.
  3. Our story — How the business was founded, what the mission is, what makes them different. 2–3 paragraphs. Must include the specific founding year.
  4. Why choose us — 3–4 differentiators in a visually distinct layout (icon grid, numbered list with large numbers). Must be substantively different from the homepage trust bar.
  5. Contact CTA — Same visually distinct CTA section as interior pages. Phone number in large type. Button to contact form.

Person JSON-LD schema for the business owner is required on this page. See AI Factor 22 in Step 6's completion gate.

Contact Page SOP — Required Elements

  1. Page hero — H1: "Contact [Business Name]" or "Get a Free Estimate." Subheadline with response time (e.g., "We respond within 24 hours").
  2. Contact form — Fields: Name (required), Phone (required), Email (required), Service Needed (select dropdown with all services), Message (textarea), "How did you find us?" (select dropdown — required for AI Factor 32). Submit button full-width on mobile, uses brand primary color.
  3. Contact details column — Phone (tap-to-call link), full address (links to Google Maps), business hours (day-by-day), email address.
  4. Map embed — Google Maps iframe showing the business location. Responsive width.

Interior Page SOP — 9 Required Sections

Non-Negotiable: One Service Per Page

Every service in the SEO matrix gets its own dedicated page. Never combine two or more services onto a single page. If the client has 8 services, the site has 8 service pages. No exceptions.

  1. Page hero — H1 with exact keyword + city. Subheadline. CTA button. Relevant, high-quality image. See Hero Image Standards below.
  2. Intro section — 2–3 paragraphs of unique copy. First paragraph must define the service in plain language (AI Factor 18). No walls of text. No copy from other pages.
  3. Services list — Styled cards or icon+text pairs. Minimum 3 items. Each with title and 1–2 sentence description.
  4. Why choose us — 3–4 differentiators in a layout visually distinct from the services list.
  5. Gallery or photo — At least one relevant image with descriptive alt text including keyword.
  6. Testimonial — At least one styled card with star rating, reviewer name, and source. Never plain text.
  7. Contact CTA — Brand-color background section. Phone in large type. Button to contact form.
  8. FAQ section — Minimum 5 FAQs in a styled accordion. Each question is a clickable toggle. FAQPage JSON-LD schema required.
  9. Internal links — At least 2 links to related service pages or location pages.

Location Page Uniqueness Requirement

Location pages are the most likely to be penalized for near-duplicate content. Each location page must have at least one unique element generated through this research process:

Unique ElementHow to Generate It
Local neighborhood or district referenceSearch "[city name] neighborhoods" — mention one or two in the intro
Local landmark referenceSearch "[city name] landmarks" — briefly reference the area's identity
Local weather/climate factFor roofing, masonry, concrete — mention local weather patterns that make the service important
Local testimonialUse a testimonial from a client in or near that city if available

Hero Image Standards

CriterionPassFail
Subject relevanceThe image shows the specific type of work for this pageGeneric construction worker, hard hat on a desk, handshake
Image qualitySharp, well-lit, professional-looking. Work clearly visible.Blurry, dark, low-resolution
Real work preferredClient's actual completed work is always preferredStock when client has provided real photos
Mobile compositionSubject visible and centered at 375px. Use object-position: center top.Wide landscape that crops to sky or background on mobile
Contrast for textDark overlay ensures H1 and subheadline are legibleWhite text over light image area

Mobile SOP — Minimum Requirements

RequirementStandard
BreakpointsMobile: 375px, Tablet: 768px, Desktop: 1200px. Test at all three.
NavigationHamburger menu. Opens as full overlay or slide-in drawer. All links tappable (min 44px). Closes on link tap.
Sticky call barFixed bottom bar on mobile. Phone number as tap-to-call. Brand primary color. 56px height minimum. padding-bottom: 72px on body.
Font sizesBody min 16px. No text below 13px. Use font-size: 16px on inputs to prevent iOS auto-zoom.
Imageswidth: 100%, height: auto. No horizontal overflow.
FormsSingle-column on mobile. Inputs min 44px height. Labels above inputs. Submit button full-width.
Touch targetsAll interactive elements minimum 44×44px touch target.
No horizontal scrollPage must not scroll horizontally at any mobile viewport.
TestimonialsCSS scroll-snap horizontal carousel on mobile. One at a time. Dot indicators.
Stats barReflows to 2×2 grid on mobile. Numbers min 28px.

Mobile Self-Review Checklist — Before Marking Step 6 Complete

Claude Code must complete this checklist at 375px viewport width before the build is considered done.

CheckPass Condition
No horizontal scrollPage does not scroll sideways at 375px
H1 above the foldHeadline visible without scrolling on 375×667px viewport (iPhone SE)
Sticky call bar visibleCall bar at bottom on every page. Does not overlap content.
Hamburger menu worksOpens, all links tappable, closes on link tap
Hero image compositionSubject centered and visible at 375px
Testimonials carouselHorizontal swipe — one at a time — not a vertical stack
Service cards single columnNo two-column card grids on mobile
Form usabilityAll inputs 44px tall. Labels above. Submit button full-width.
Stats reflow2×2 grid on mobile, not horizontal scroll
Touch targetsAll nav links, buttons, card links: min 44×44px
Font sizesBody text min 16px. Nothing below 13px.
Section visual rhythmSections alternate backgrounds. No two consecutive identical styling.

AI Friendliness & Audit Build Requirements

Build to pass all four audits from line one. See the System Standards appendix for the complete 32-factor AI Friendliness framework and all four audit standards. The Build Prompt Template contains the full AI Friendliness instruction block to paste into Claude Code.

robots.txt — required exact content:

robots.txt — EXACT CONTENT REQUIRED
User-agent: *
Allow: /

User-agent: GPTBot
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: GoogleOther
Allow: /

User-agent: Anthropic-AI
Allow: /

Sitemap: https://[DOMAIN]/sitemap.xml
Completion Gate — Required before moving to Step 7
  • All required pages built and accessible in Claude Code preview
  • Homepage contains all 10 required sections in correct order
  • About page contains all 5 required sections including owner profile with name, photo, credentials
  • Contact page has all 4 required elements including "How did you find us?" dropdown
  • All service pages and location pages from the SEO matrix are built
  • Each location page has at least one unique local element
  • All images in WebP format with explicit width/height attributes
  • Sticky mobile call bar present on all pages; body has padding-bottom: 72px on mobile
  • No horizontal scroll on mobile viewports — verified at 375px
  • Contact form connected to Formspree and tested (submission received)
  • robots.txt present with exact AI bot allow-listing as specified above
  • sitemap.xml exists at /sitemap.xml and referenced in robots.txt
  • llms.txt exists at /llms.txt with complete business summary
  • /ai disclosure page exists and linked in footer as "AI Info"
  • LocalBusiness JSON-LD schema on every page (name, address, phone, geo lat/lng, hours, priceRange, areaServed, datePublished, dateModified)
  • FAQPage schema on every page with a FAQ section (min 5 questions per page)
  • Person schema for business owner on About page and homepage
  • BreadcrumbList schema on all interior pages
  • At least 2 external citation links per page (BBB, GBP, licensing board, or industry association)
  • NAP in plain HTML text in footer of every page — matches GBP exactly
  • At least one expert blockquote on key pages (owner name + title)
  • At least one HTML comparison table on the site
  • All pages: one H1, correct H2/H3 hierarchy, no skipped levels
  • Every img has descriptive alt attribute; every form input has associated label
  • Semantic landmarks: header, main, footer, nav aria-label on every page
  • Skip navigation link as first body element on every page
  • All meta titles, meta descriptions, canonical tags, Open Graph tags in place
  • Custom 404 page exists
  • Favicon present
  • Footer copyright year uses JS to auto-update
  • Mobile self-review checklist completed — all items pass
Next Step
Step 7: Visual QA
Entry Condition
  • Step 6 Completion Gate satisfied — all 29 items checked
  • Site accessible in Claude Code preview
7
Phase 3: QA
Visual QA

Visual QA is a systematic page-by-page review at three viewports: mobile (375px), tablet (768px), and desktop (1200px). Every page is checked. No page is skipped. Issues found here are fixed before moving to Technical QA. For the full visual quality benchmark, see the Design Standards appendix and the Beautiful Checklist.

Visual QA Checklist — Every Page

CheckPass Criteria
No horizontal scrollPage does not overflow horizontally at 375px, 768px, or 1200px
Navigation renders correctlyDesktop nav shows full links; mobile shows hamburger that opens correctly
Sticky call bar visible on mobileFixed bottom bar with phone number visible on all mobile pages; does not overlap content
All images loadNo broken image icons; all images display correctly
All images are WebPInspect → check src attribute ends in .webp
Text is readableNo invisible text; all body text min 16px on mobile
Buttons are tappableAll buttons min 44×44px touch target
Links workAll navigation links, CTA buttons, and internal links correct destination
Phone numbers tap-to-callAll phone numbers wrapped in <a href="tel:...">
Address links to Google MapsAddress wrapped in Google Maps link
Footer completeLogo, nav, phone, full address, hours, copyright year, license number, AI Info link
No placeholder contentNo "Lorem ipsum", "Your Business Name", or "[INSERT]" text anywhere
Logo displays correctlyCrisp, correct size, not stretched or pixelated
Two-font systemDisplay font on headings, body font on paragraphs. Never one font for both.
Beautiful ChecklistSee Design Standards appendix — all 14 items pass

Homepage-Specific Checks

CheckPass Criteria
Hero H1 contains primary keywordH1 includes the main service keyword
Trust bar / Quick Facts presentYears in business, license, service area, stats displayed
All 10 homepage sections presentCross-reference against Homepage SOP in Step 6
Counter animations workNumber counters animate when scrolled into view
Testimonials carouselAt least 3 testimonials; swipe carousel on mobile
About section has owner name + quoteOwner identified by name; blockquote present
Service area cities in plain textAll cities listed in HTML text — not just a map
If any QA issue requires a fix: Make the fix in Claude Code, push to GitHub, wait for Cloudflare Pages to rebuild (typically 60–90 seconds), then re-verify the specific item. Do not proceed to Step 8 with any unresolved Visual QA items.
Completion Gate — Required before moving to Step 8
  • All pages reviewed at 375px, 768px, and 1200px
  • All Visual QA checklist items pass on all pages
  • Beautiful Checklist (Design Standards appendix) — all 14 items pass
  • All issues found fixed and re-verified on the live preview URL
  • No placeholder content remaining anywhere
Next Step
Step 8: Technical QA
Entry Condition
  • Step 7 Completion Gate satisfied
  • Site accessible at live Cloudflare Pages preview URL
8
Phase 3: QA
Technical QA

Technical QA checks the underlying code and infrastructure — things invisible in a visual review but affecting performance, accessibility, and indexing. Run these checks against the live Cloudflare Pages preview URL.

CheckToolPass Criteria
No broken linksBrowser consoleZero 404 errors in the console on any page
No JavaScript errorsBrowser consoleZero JS errors on any page
Contact form submitsManual testSubmit a test entry; confirm receipt in Formspree dashboard
robots.txt presentNavigate to /robots.txtFile exists with exact AI bot allow-listing from Step 6
sitemap.xml presentNavigate to /sitemap.xmlFile exists and lists all pages
llms.txt presentNavigate to /llms.txtFile exists with complete business summary
/ai page presentNavigate to /aiPage exists and is linked in footer
Canonical tags presentView sourceEvery page has <link rel="canonical">
Meta descriptions presentView sourceEvery page has unique <meta name="description">
Open Graph tags presentView sourceog:title, og:description, og:image, og:url on every page
Favicon presentBrowser tabFavicon displays in browser tab
HTTPS enforcedBrowser address barSite loads over HTTPS; no mixed content warnings
Custom 404 pageNavigate to /nonexistent-pageCustom 404 page displays
www redirect configuredNavigate to www.[domain].pages.devRedirects correctly — no hanging or error
Images have alt textView sourceEvery img tag has non-empty alt attribute
Schema presentView sourceJSON-LD blocks visible for LocalBusiness, FAQPage, BreadcrumbList, Person
Completion Gate — Required before moving to Step 9
  • All Technical QA checklist items pass
  • Zero console errors on all pages
  • Contact form test submission confirmed in Formspree
  • robots.txt, sitemap.xml, llms.txt, and /ai page all confirmed present
Next Step
Step 9: SEO Readiness Audit
Entry Condition
  • Step 8 Completion Gate satisfied
  • SEO matrix from Step 4 on hand for reference
9
Phase 3: QA
SEO Readiness Audit

The SEO readiness audit verifies every on-page SEO element is correctly implemented. This is a confirmation pass — all items should already be in place from Step 6. Cross-reference against the SEO matrix from Step 4.

CheckPass Criteria
H1 contains primary keywordEvery page H1 includes the target keyword for that page
Meta title format[Keyword] in [City] | [Business Name] — max 60 characters
Meta description formatIncludes keyword, city, phone number — 150–160 characters. Unique per page.
URL slugs match keywordsService pages: /roofing. Location pages: /roofing-omaha-ne. No nested paths.
LocalBusiness schema completeJSON-LD on every page with name, address, phone, geo lat/lng, openingHours, priceRange, areaServed, datePublished, dateModified
FAQ schema presentFAQPage JSON-LD on every service and location page. Min 5 Q&A pairs.
Internal linking patternEvery service page links to 2+ location pages; every location page links to 2+ service pages
NAP consistencyBusiness name, address, phone identical on every page and in GBP exactly
Image alt text includes keywordsHero and key images include primary keyword in alt text
Page titles are uniqueNo two pages share the same meta title
Image file names descriptivee.g., brick-retaining-wall-omaha.webp not IMG_1234.webp
Page count matches SEO matrixCount built service pages + location pages against the matrix row count

Schema Validation

Validate schema using Google's Rich Results Test at search.google.com/test/rich-results. Paste the preview URL. Confirm zero errors for LocalBusiness and FAQ schema on the homepage and at least two interior pages.

Completion Gate — Required before moving to Step 10
  • All on-page SEO checklist items pass on all pages
  • LocalBusiness schema validates without errors in Rich Results Test
  • FAQ schema validates without errors on all service and location pages
  • NAP is consistent across all pages and matches Google Business Profile exactly
  • Page count verified against SEO matrix — no pages missing
Next Step
Step 10: Performance Optimization
Entry Condition
  • Step 9 Completion Gate satisfied
  • Site accessible at live Cloudflare Pages preview URL
10
Phase 3: QA
Performance Optimization

Run all four audits — PageSpeed Insights, W3C HTML Validation, WAVE Accessibility, and DD AI Audit. Test the homepage, one service page, and one location page. Record all scores. Fix all failures before proceeding.

Score Targets

AuditToolPass StandardException
W3C HTMLvalidator.w3.org0 errors (warnings acceptable)None
WAVE Accessibilitywave.webaim.org0 errors, 0 contrast errorsNone
PageSpeed — Mobilepagespeed.web.devPerformance ≥ 90, Accessibility ≥ 95, Best Practices ≥ 90, SEO ≥ 95None
PageSpeed — Desktoppagespeed.web.devPerformance ≥ 95, all others ≥ 90None
DD AI Auditai-audit.dotcomdesignops.com32/32 factorsReadability (Flesch-Kincaid) — trade terminology acceptable

Common Performance Fixes

IssueFix
Images not in WebPConvert all images to WebP using Claude Code: cwebp -q 85 input.jpg -o output.webp
Images missing width/height attributesAdd explicit width and height to every <img> tag to prevent layout shift (CLS)
Hero image lazy-loadedHero image (the LCP element) must use fetchpriority="high" loading="eager" — never lazy
Render-blocking scriptsMove all scripts to bottom of body with defer or async
No lazy loading on below-fold imagesAdd loading="lazy" to all images except the hero
Google Fonts blockingAdd <link rel="preconnect"> to fonts.googleapis.com and use display=swap
Large CSS fileInline critical above-fold CSS in <style> in head; load rest with <link rel="preload">
Low contrastUse a contrast checker — minimum 4.5:1 for body text, 3:1 for large text (>18px bold or >24px regular)
If PageSpeed mobile score is below 90: Do not proceed to Step 11. Use PageSpeed's "Opportunities" section to identify the specific failing items. Fix the top 2–3 items, re-run, and repeat until the target is met. See the Error Recovery appendix for a systematic PageSpeed fix workflow.
Completion Gate — Required before moving to Step 11
  • W3C HTML Validator: 0 errors on homepage and all interior pages
  • WAVE: 0 errors and 0 contrast errors on homepage and all interior pages
  • PageSpeed — homepage mobile: Performance ≥ 90; all other categories ≥ 90
  • PageSpeed — at least two interior pages tested and meeting targets
  • All PageSpeed scores recorded for the project record
Next Step
Step 11: AI Friendliness Audit
Entry Condition
  • Step 10 Completion Gate satisfied (all four audits passing)
  • Site accessible at live Cloudflare Pages preview URL
11
Phase 3: QA
AI Friendliness Audit

Run the DD AI Audit tool to confirm all 32 factors pass. Sites built following the full 32-factor requirements in Step 6 should arrive at this audit already passing. This is a confirmation pass, not a discovery pass.

How to Run

Navigate to ai-audit.dotcomdesignops.com, enter the live Cloudflare Pages preview URL, and click "Audit Site." Also run aifriendliness.com as a secondary technical validator (live PageSpeed, schema validation, Flesch-Kincaid, Core Web Vitals).

ResultAction
32/32 PASS (all green)Proceed to Step 12.
FAIL (any red factor)Fix before proceeding. Do not advance to Step 12 with any red factors.
NEEDS WORK (yellow factors)Resolve where possible. Document any intentional yellow items with a reason in project notes.
Readability factor (Flesch-Kincaid yellow)Acceptable exception. Trade terminology is expected. Document and proceed.

llms.txt Template

llms.txt — CREATE AT /llms.txt
# [Business Name]

[Business Name] is a licensed [trade] contractor based in [City, State].
We serve [primary service area] and surrounding communities.

## Services
[List all services, one per line]

## Service Area
[List all cities served, one per line]

## Contact
Phone: [phone number]
Address: [full address]
Hours: [business hours]
Website: [domain]

## About
[2-3 sentences: years in business, owner name, mission]

## License & Insurance
[License number, bonding status, insurance status]

## FAQ
Q: [common question]
A: [direct answer]
[repeat for 4+ FAQs]
Completion Gate — Required before moving to Step 12
  • DD AI Audit shows 32/32 (readability exception documented if applicable)
  • No red FAIL factors remaining
  • llms.txt confirmed present and fully populated at /llms.txt
  • robots.txt confirmed to not block any AI crawlers
  • aifriendliness.com secondary validation completed
Next Step
Step 12: Content QA
Entry Condition
  • Step 11 Completion Gate satisfied
  • Client brief on hand for reference
12
Phase 4: Review
Content QA

Content QA is a final human review of all copy on the site before the client sees it. You are reading every page — not skimming. This step catches factual errors, generic AI copy, and inaccurate business information.

CheckPass Criteria
Business name spelled correctlyExact match to the signed contract and Google Business Profile
Phone number correctMatches client brief; tap-to-call link uses correct digits
Address correctFull address including ZIP matches client brief
Business hours correctDay-by-day hours match client brief exactly
Services list accurateAll services from the brief are present; no unlisted services
Service area accurateAll cities from the brief and SEO matrix are represented
License numbers correctMatch client brief exactly
Years in business correctMath is correct (founded year to current year)
Testimonials accurateText matches source; reviewer names correct
No unverifiable claimsRemove "#1 in the city" or "best in the state" unless client can verify
Tone matches slider scoresCopy tone aligns with the design slider scores from Step 1
No generic filler copyNo "We are committed to excellence" — all copy specific to this business
Owner name and story accurateAbout page owner details match KO call notes
FAQ answers are accurateFAQ answers reflect actual business practices — not generic AI filler
Completion Gate — Required before moving to Step 13
  • All Content QA checklist items pass
  • All factual information verified against client brief
  • All corrections made in Claude Code, pushed to GitHub, verified on live preview
Next Step
Step 13: Deploy to Preview
Entry Condition
  • Step 12 Completion Gate satisfied
  • GitHub repo exists under dotcomdesigniowa (created in Step 3)
  • Cloudflare Pages project connected to GitHub repo (set up in Step 3)
13
Phase 4: Review
Deploy to Preview

Before sending the site to the client for review, confirm the Cloudflare Pages preview URL is live and tested. The Cloudflare Pages URL (https://[project].pages.dev) is what you send in the client review email. Do not send the client a localhost link or a screenshot.

Deployment Confirmation Steps

  1. Confirm the latest Git push has deployed: check the Cloudflare Pages dashboard for a green "Success" build
  2. Test the preview URL in an incognito window to confirm it loads correctly with no cache
  3. Test the preview URL on a real mobile device (not just browser dev tools)
  4. Submit a test contact form from the preview URL and confirm receipt in Formspree
  5. Copy and save the Cloudflare Pages preview URL — this is what goes in the client review email

Process Flags — Automated Hub Registration

⚠️ Hub integration is under development. The /api/deploy-preview endpoint below is the target automation. Until the Hub is confirmed working, complete the manual fallback steps listed after the API call.

After confirming the Cloudflare Pages build is live, call the In Flight /api/deploy-preview endpoint to register the project:

API CALL — Step 13 Automation
POST https://hub.dotcomdesignops.com/api/deploy-preview
Content-Type: application/json

{
  "projectSlug": "[in-flight-project-slug]",
  "previewUrl": "https://[cloudflare-project-name].pages.dev",
  "apiKey": "dd-ko-2024"
}

Manual fallback (if Hub is not available): Log the preview URL in the project record manually. Create the Marker.io website project manually using the preview URL. Register the Marker.io project on the Process Flags webhook manually.

Completion Gate — Required before moving to Step 13.5
  • Cloudflare Pages build shows "Success" in dashboard
  • Preview URL tested in incognito window — loads correctly
  • Preview URL tested on a real mobile device
  • Contact form test submission confirmed from preview URL
  • Preview URL saved to project record
Next Step
Step 13.5: Internal Review
Entry Condition
  • Step 13 Completion Gate satisfied
  • Preview URL confirmed working in incognito window and on real mobile device
13.5
Phase 4: Review
Internal Review

Before the client ever sees the site, the Dotcom Design team completes a full internal review. This is a non-negotiable quality gate. The reviewer should be someone who did not build the site — fresh eyes catch issues builders miss. If the team is small, step away from the project for at least one hour before reviewing your own work.

Internal Review Checklist

Visual Quality

Content Accuracy

Functional Review

Mobile Review (on a real device)

All internal review issues must be resolved before proceeding to Step 14. Fix each issue in Claude Code, push to GitHub, and verify the fix on the live preview URL. Do not send the preview URL to the client with any unresolved issues.
Completion Gate — Required before moving to Step 14
  • All internal review checklist items confirmed
  • All issues resolved and verified on live preview URL
  • Reviewer sign-off: "This site is ready for the client to see"
Next Step
Step 14: Client Review
Entry Condition
  • Step 13.5 Completion Gate satisfied — internal review complete and signed off
  • All internal review issues resolved and verified on live preview URL
  • Client contact email confirmed
14
Phase 4: Review
Client Review

Send the preview URL to the client with clear instructions and a 48-hour response window. If no response within 48 hours, follow up once. If no response after 72 hours, proceed to Step 15 with zero revisions.

Client Review Email Template

CLIENT REVIEW EMAIL
Subject: Your New Website Is Ready for Review — [Business Name]

Hi [Client Name],

Your new website is ready for your review! Please take a look at the
preview link below and let us know if you have any changes.

Preview Link: [CLOUDFLARE PAGES URL]

How to review:
- Check all pages using the navigation menu
- Review on both your phone and your computer
- Check that all your services, contact info, and hours are correct
- Note any text changes, photo swaps, or additions you'd like

Please send all feedback by [DATE — 48 hours from now]. We'll make
your requested changes and then schedule the launch.

If everything looks great and you're ready to go live, just reply
"Approved" and we'll schedule the launch.

[Your name]
Dotcom Design

Scope of Revisions

The client is entitled to one round of revisions as part of the build. In-scope revisions include text corrections, photo swaps, and minor layout adjustments. Out-of-scope (separate project) includes: adding new pages, changing the design direction, rebuilding sections from scratch, or adding new integrations.

Completion Gate — Required before moving to Step 15
  • Client review email sent with preview URL and 48-hour deadline
  • Client feedback received (or 72-hour window elapsed with no response)
  • Revision list compiled and categorized: in-scope vs. out-of-scope
  • Out-of-scope items noted as a separate project opportunity
Next Step
Step 15: Revisions
Entry Condition
  • Step 14 Completion Gate satisfied
  • Client revision list compiled
15
Phase 5: Launch
Revisions

Implement all in-scope client revisions in Claude Code. After implementing, re-run QA on any pages that were changed based on the type of change made.

Revision Process

  1. Work through the revision list item by item in Claude Code
  2. Push changes to GitHub and confirm Cloudflare Pages preview updates (60–90 seconds)
  3. Re-run QA on all changed pages based on change type (see table below)
  4. Send the updated preview URL to the client with a note that revisions are complete
  5. Request final written approval: "Please reply 'Approved' to proceed to launch"

Re-QA Requirements After Revisions

Type of ChangeRe-run These QA Steps
Text/copy changes onlyContent QA (Step 12) on changed pages. Visual QA quick check.
Photo/image swapsVisual QA on changed pages. Confirm WebP format. Check alt text.
HTML structure changesVisual QA + W3C validation + WAVE accessibility check on changed pages.
CSS/layout changesFull Visual QA at all three viewports. Check mobile checklist.
New page addedFull QA on new page: Visual QA, W3C, WAVE, SEO checklist, schema. Update sitemap.xml.
Do not proceed to launch without written client approval. "Approved" in an email or text message is sufficient. A verbal approval on a call is not — follow up with an email summary that confirms approval.
Completion Gate — Required before moving to Step 16
  • All in-scope revisions implemented in Claude Code and pushed to GitHub
  • Re-QA completed on all changed pages — all checks pass
  • Updated preview URL sent to client
  • Written client approval received ("Approved" via email or text)
Next Step
Step 16: Go Live
Entry Condition
  • Step 15 Completion Gate satisfied — written client approval received
  • Domain registrar credentials accessible (from Step 3)
  • Do not launch on Friday afternoon or before a holiday weekend
16
Phase 5: Launch
Go Live

Go Live connects the client's domain to the Cloudflare Pages deployment. DNS propagation typically takes 5–30 minutes but can take up to 48 hours in rare cases.

Launch Sequence

  1. In Cloudflare Pages, add the client's custom domain: Settings → Custom Domains → Add custom domain
  2. Also add the www version: www.[clientdomain.com] — Cloudflare will redirect it automatically
  3. Cloudflare will provide DNS records needed (CNAME pointing to pages.dev)
  4. Log into the client's domain registrar (Step 3 credentials)
  5. Add the CNAME record provided by Cloudflare Pages
  6. If domain uses Cloudflare DNS already, the record is added automatically — confirm in Cloudflare
  7. Wait 5–30 minutes for DNS propagation
  8. Test the live domain in incognito: site loads, HTTPS active, no redirect loops, www redirects correctly
  9. Submit sitemap to Google Search Console: search.google.com/search-console
  10. Request indexing for the homepage in Google Search Console
  11. Send "You're live!" email to client (see template below)

Go Live Email Template

GO LIVE EMAIL
Subject: Your New Website Is Live! — [Business Name]

Hi [Client Name],

Great news — your new website is officially live!

Your website: https://[clientdomain.com]

Your site has been submitted to Google for indexing and should
start appearing in search results within 1–4 weeks.

A few things to know:
- Your contact form is active and submissions will go to [email]
- We've set up monitoring so we'll know immediately if the site
  ever goes down
- Your next monthly SEO report will arrive on [date]

If you notice anything that needs adjusting, just reply to this
email and we'll take care of it.

[Your name]
Dotcom Design

Post-DNS Checks

CheckPass Criteria
Site loads on custom domainhttps://clientdomain.com loads the site correctly
HTTPS activePadlock icon in browser; no "Not Secure" warning
www redirect workswww.clientdomain.com redirects to non-www (or vice versa) without error
Old site is goneThe new site is displayed, not the old site
Contact form works on live domainSubmit a test form entry from live domain; confirm receipt in Formspree
Sitemap submittedSitemap URL submitted in Google Search Console

Hub API Call (Go Live)

⚠️ Hub integration under development. Call the API below when available. Manual fallback: update the project record manually with the live domain.
API CALL — Step 16 Go Live
POST https://hub.dotcomdesignops.com/api/go-live
Content-Type: application/json

{
  "projectSlug": "[in-flight-project-slug]",
  "liveUrl": "https://clientdomain.com",
  "apiKey": "dd-ko-2024"
}
Completion Gate — Required before moving to Step 17
  • Site live at client's custom domain with HTTPS
  • Both www and non-www resolve correctly
  • All post-DNS checks pass
  • Sitemap submitted to Google Search Console
  • Client notified that site is live (go live email sent)
  • Contact form test submission confirmed from live domain
Next Step
Step 17: Post-Launch Monitoring
Entry Condition
  • Step 16 Completion Gate satisfied
  • Site confirmed live at custom domain
17
Phase 5: Launch
Post-Launch Monitoring

Within 24 hours of launch, set up uptime monitoring and verify Google has begun crawling the site. These steps take 30 minutes and provide ongoing protection.

Monitoring Setup

ToolSetupAlert Owner
UptimeRobotAdd monitor for homepage URL; check interval: 5 minutes. Set alert email to the quarterback's email (not the builder's).Quarterback (from Step 19)
Google Search ConsoleConfirm property is verified; check Coverage report for indexing errors. Add quarterback as a user with "Full" access.Quarterback
Cloudflare AnalyticsConfirm traffic is being recorded in Cloudflare Pages analytics. Share dashboard access with quarterback.Quarterback

48-Hour Check

Return 48 hours after launch and verify:

  1. Homepage loads correctly — no errors
  2. Contact form still submits correctly from live domain
  3. Google Search Console shows no new coverage errors
  4. UptimeRobot shows 100% uptime since launch
  5. Quick Google search for business name — confirm new site appears or indexing is in progress
Completion Gate — Required before moving to Step 18
  • UptimeRobot monitor active and showing green — alert email set to quarterback
  • Google Search Console verified — quarterback has full access
  • Cloudflare Analytics confirmed — quarterback has dashboard access
  • 48-hour check completed — no issues found
Next Step
Step 18: GBP Sync
Entry Condition
  • Step 17 Completion Gate satisfied
  • Client's Google Business Profile access confirmed
  • New website URL live and confirmed
18
Phase 6: Handoff
Google Business Profile Sync

The GBP must be updated to reflect the new website. NAP consistency between the website and GBP is a critical local SEO signal. This step is not optional.

If the client does not have a GBP or it is unclaimed, this is a critical SEO liability. Escalate immediately — assist the client in claiming their profile before proceeding.

GBP Update Checklist

FieldAction
Website URLUpdate to the new live domain
Business nameVerify exact match to website and client brief
Phone numberVerify exact match to website
AddressVerify exact match to website footer
Business hoursVerify exact match to website contact page
Services listUpdate to match the services on the new website
Business descriptionUpdate to reflect the new website's About copy (150–750 characters)
PhotosUpload at least 3 new photos from the website gallery if available
Completion Gate — Required before moving to Step 19
  • GBP website URL updated to new live domain
  • All GBP fields verified for NAP consistency with the website
  • GBP services list updated to match website
  • At least 3 new photos uploaded to GBP (if available)
Next Step
Step 19: Quarterback Handoff
Entry Condition
  • Step 18 Completion Gate satisfied
  • Quarterback assigned for this client
19
Phase 6: Handoff
Quarterback Handoff

The Quarterback Handoff transfers ownership of the client relationship from the build team to the ongoing account management team. The quarterback is responsible for the client's ongoing SEO, reporting, and relationship. A complete handoff ensures nothing falls through the cracks.

Handoff Package

ItemDetails
Client briefCompleted brief from Step 1, updated with any build changes
Live site URLThe final live domain
GitHub repo URLThe repo under dotcomdesigniowa for future updates
Cloudflare Pages project nameFor future deployments
SEO strategy URLThe live strategy site from Step 4
Keyword-city matrixFull matrix for reporting reference
Domain registrar credentialsFrom Step 3 — transfer securely (not via email)
Google Search Console accessConfirm quarterback already has "Full" access (set up in Step 17)
UptimeRobot monitorConfirm alert email is set to quarterback (set up in Step 17)
Formspree account detailsConfirm form submissions are going to the right email
Client personality notesCommunication style, preferences, sensitivities noted during the build
Completion Gate — Required before moving to Step 20
  • Full handoff package delivered to quarterback
  • Quarterback confirms receipt and has access to all tools and credentials
  • Client added to ongoing reporting and account management workflow
  • Build team is no longer the primary client contact
Next Step
Step 20: Ongoing Maintenance
Entry Condition
  • Step 19 Completion Gate satisfied
  • Quarterback has confirmed receipt of full handoff package
  • Client is active on a monthly plan
20
Phase 6: Handoff
Ongoing Maintenance

Ongoing maintenance is the quarterback's responsibility from this point forward. The build team is no longer the primary contact. This page documents recurring maintenance tasks for every active client site.

Monthly Maintenance Tasks

TaskFrequencyNotes
Uptime reviewMonthlyReview UptimeRobot report; investigate any downtime events
Google Search Console reviewMonthlyCheck for coverage errors, manual actions, or performance drops
Contact form testMonthlySubmit a test entry from the live site; confirm receipt in Formspree
Domain expiration checkQuarterlyAlert client 90 days before expiration
SEO performance reportMonthlyPull keyword rankings and traffic data; send to client
GBP reviewMonthlyCheck for new reviews; flag any Q&A that needs response
Content updatesAs requestedNew photos, updated hours, new services — implement in Claude Code, push to GitHub
dateModified schema refreshEvery 6 monthsUpdate the dateModified field in LocalBusiness schema on all pages to current date (AI Factor 25)
Annual visual QAAnnuallyFull visual QA pass to catch any display issues that have developed

Handling Update Requests

When a client requests a content update, the quarterback opens the client repo in Claude Code, implements the specific change, and pushes to GitHub. Cloudflare Pages auto-deploys within 90 seconds. The client is notified when the update is live.

Process Flags — Closed-Loop Improvement Workflow

StageWhoAction
1. Flag submittedBuild team or reviewerSubmit a Bug-type issue via the Marker.io widget on the live preview. The In Flight hub receives it via webhook and displays it on the Process Flags tab.
2. Weekly reviewBuild leadEvery Monday, review all open Process Flags in the In Flight hub. Group related flags by theme.
3. Triage decisionBuild leadFor each flag: (a) Update the Playbook, (b) Update CLAUDE.md, (c) Update Build Prompt, or (d) No action needed. Document the decision.
4. Playbook updateBuild lead + Claude CodeOpen the playbook repo in Claude Code. Make the specific update. Push to GitHub — Cloudflare Pages auto-deploys the updated playbook.
5. Close the loopBuild leadMark the flag as resolved. Add a note referencing the specific Playbook section updated.

Monthly Playbook Review

On the first Monday of every month, the build lead conducts a 30-minute system review:

Agenda ItemWhat to Ask
Flag pattern reviewAre the same types of issues recurring on multiple builds? If yes, the Playbook fix isn't working — revisit it.
Build Score trendIs the average audit score trending up, flat, or down? A flat or declining trend means Playbook changes aren't translating to better builds.
CLAUDE.md auditIs the CLAUDE.md file in the playbook repo accurate? If any Playbook step was updated, verify CLAUDE.md reflects it.
Build Prompt reviewAre there instructions in the Build Prompt that are being missed or misinterpreted? Update the prompt language if needed.
New knowledge captureWhat did the team learn this month that is not yet in the Playbook? Capture it now before it's forgotten.
Playbook version bumpIf any changes were made, update the version badge in the Playbook topbar and push to GitHub.
The goal of the monthly review is not to find problems — it is to confirm the system is self-correcting. A healthy system has: (a) zero flags older than 30 days, (b) stable or improving audit scores, (c) a CLAUDE.md that matches the Playbook, and (d) a Build Prompt that produces consistent results without manual correction.
This is the final step. The build is complete.
  • Client is live, monitored, and in active account management
  • All 20 steps completed and documented
  • Quarterback is the primary point of contact going forward
Build Complete
Return to Command Center
⚠️ This is the authoritative reference for all DD standards. When a standard changes, update it here first. Then update the relevant Playbook step, Build Prompt Template, CLAUDE.md, and the Opening Prompt. This page is the source — everything else references it.

1. The Four Audit Standards

AuditToolPass StandardException
W3C HTML Validationvalidator.w3.org0 errors (warnings acceptable)None
WAVE Accessibilitywave.webaim.org0 errors, 0 contrast errorsNone
PageSpeed Insightspagespeed.web.devMobile ≥ 90 Performance; Desktop ≥ 95 Performance; all categories ≥ 90None
DD AI Auditai-audit.dotcomdesignops.com32/32 factorsReadability (Flesch-Kincaid) — trade terminology acceptable

2. The 32-Factor AI Friendliness Framework

🔧 Pillar 1: Technical Infrastructure (7 Factors)

#FactorBuild Requirement
1AI Crawler Allow-listingrobots.txt must explicitly Allow: / for GPTBot, ClaudeBot, GoogleOther, Anthropic-AI, PerplexityBot. Never use Disallow for these agents.
2Server-Side RenderingAll HTML/CSS static builds pass automatically. No JavaScript-only content rendering. Critical text in the initial HTML payload.
3Mobile Page Speed90+ PageSpeed mobile. WebP images with width/height attributes, inline critical CSS, self-hosted or preconnect fonts, no render-blocking scripts.
4HTTPS SecurityCloudflare Pages provides HTTPS automatically. Verify SSL is active before final delivery.
5Clean XML Sitemapsitemap.xml at /sitemap.xml listing all pages. Referenced in robots.txt with Sitemap: directive.
6Zero Render-Blocking ResourcesAll scripts use defer or async. CSS inlined for critical above-fold styles. No synchronous third-party scripts in head.
7Clean Internal LinkingAll links use proper href URLs. No javascript:void() links. Use button for JS actions, a href for navigation only.

📝 Pillar 2: Content Structure & Extractability (12 Factors)

#FactorBuild Requirement
8Answer-First StructureEvery section opens with a direct declarative statement. "We build brick, block, and concrete structures" — not "Are you looking for a contractor?"
9Granular Heading HierarchyExactly one H1 per page. H2 for main sections. H3 for sub-items. Never skip levels.
10Data-Driven StatisticsEvery page: years in business, projects completed, response time, service area radius. Never vague ("years of experience") — always specific numbers.
11Numbered Lists for ProcessesAll "How It Works" and step-by-step content must use ol/li tags. Never plain paragraph text for sequential steps.
12Bullet Points for FeaturesAll feature lists and service benefits use ul/li tags. Minimum 2 lists per page with 4+ items each.
13Comparison TablesAt least one HTML table per site. Use proper thead/tbody/th/td markup.
14Short ParagraphsAll paragraphs 2–4 sentences maximum. One idea per paragraph. Subheadings break up long sections.
15Executive SummariesHomepage and service pages include a "Quick Facts" or "At a Glance" section: who, what, where, why — in 3–5 bullet points.
16FAQ SectionsEvery page: FAQ section with minimum 5 questions as H2/H3 headings with direct answers. FAQPage JSON-LD schema required.
17Active VoiceWrite "We install" not "Installation is provided." Write "Call us" not "We can be reached by calling."
18Clear DefinitionsFirst paragraph of every service page defines the service in plain language: "Tuckpointing is the process of removing deteriorated mortar..."
19Comprehensive Service DetailsAll services, specialties, service area (every city/county), and credentials in plain HTML text — not images or JavaScript.

🏆 Pillar 3: Entity & Authority Signals (8 Factors)

#FactorBuild Requirement
20Comprehensive Schema MarkupLocalBusiness/Contractor (all fields including geo, hours, areaServed, datePublished, dateModified), FAQPage on every FAQ section, BreadcrumbList on interior pages, Person for owner.
21Author ProfilesAbout page: owner name, photo, years of experience, credentials, personal story. Required for E-E-A-T.
22Author Schema (Person)Person JSON-LD: name, job title, description, sameAs (social profiles). Add to About page and homepage schema.
23Citation of Primary SourcesEvery page: 2+ external links to authoritative sources (BBB, GBP, licensing board, industry association, or manufacturer specs).
24Text-Based Trust SignalsAll trust signals as explicit HTML text — not badge images only. "Licensed & Insured", "BBB Accredited", "25 Years in Business".
25Content FreshnessSchema includes datePublished and dateModified. Footer copyright year auto-updates via JS. dateModified refreshed every 6 months.
26Consistent NAPBusiness name, full street address, city/state/ZIP, phone in plain HTML text in footer of every page. Must match GBP exactly.
27First-Party Expert QuotesAt least one direct quote from owner or lead craftsman on key pages. Attribute with name and title. Use blockquote markup.

🤖 Pillar 4: Strategic AI Assets (5 Factors)

#FactorBuild Requirement
28The llms.txt FileCreate /llms.txt with plain markdown: business name, description, all services, full service area, contact info, hours, FAQs.
29AI Disclosure PageCreate /ai page: all services with descriptions, full service area list, team bios, FAQs, brand voice. Link in footer as "AI Info".
30Competitor Comparison"Why Choose Us" on homepage: years of experience, warranty, response time, local ownership, specific techniques. Required differentiators, not generic claims.
31Video Transcript IntegrationIf videos exist on the site, all key information must also appear as text on the page. N/A if no videos.
32AI Attribution in FormsContact form includes "How did you find us?" dropdown with "AI Assistant / Chatbot" as an option. Tracks AI-driven leads.

3. robots.txt — Required Exact Content

robots.txt — AUTHORITATIVE EXACT CONTENT
User-agent: *
Allow: /

User-agent: GPTBot
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: GoogleOther
Allow: /

User-agent: Anthropic-AI
Allow: /

Sitemap: https://[DOMAIN]/sitemap.xml

4. Tool Ecosystem & URLs

ToolURLPurpose
Command Centerdotcomdesignops.comHome base — all tools launch from here
Website Playbookwebsite-playbook.dotcomdesignops.comThis playbook — full 20-step build SOP
AI Audit Toolai-audit.dotcomdesignops.comDD's 32-factor AI Friendliness Auditor
SEO Portalseo.dotcomdesignops.comSEO strategy generation
In Flight Hubhub.dotcomdesignops.comActive project tracking (under development)
GitHub Organizationgithub.com/dotcomdesigniowaAll client site repos
Cloudflaredash.cloudflare.comDNS, Pages, Analytics for all client sites

5. Change Protocol — Keeping Standards in Sync

When any standard changes, follow this protocol exactly. Never update one place and leave others stale.

  1. Update this page first (System Standards — the source of truth)
  2. Update the relevant Playbook step page
  3. Update the Build Prompt Template page if the standard affects what gets built
  4. Update the Claude Code Workflow page if the standard affects how a build starts
  5. Update CLAUDE.md in the playbook repo
  6. Commit all changes to git and confirm Cloudflare Pages deploys the update
  7. Verify the live production URL reflects the change

Every site we build must be beautiful. This is a defined, measurable standard — not a subjective aspiration. A site that passes all four audits but looks generic or amateur does not meet the Dotcom Design standard. This page defines exactly what beautiful means so Claude Code can apply it consistently without being asked.

Slider Score → Design Decision Translation

The six slider scores from Step 1 translate directly into the following design decisions. Claude Code reads these from Section 4 of the brief and applies them throughout the build.

SliderScore 1–3 → DesignScore 4–6 → DesignScore 7–10 → Design
StyleSerif display (Playfair Display, Lora). Warm beige/cream backgrounds. Traditional layouts, centered text.Mixed — one geometric sans, one serif. Neutral palette. Standard grid layouts.Bold geometric sans (Oswald, Bebas Neue, Montserrat). High contrast. Dark sections. Asymmetric layouts.
ToneWhite/cream dominant. Light hero photography. Generous white space. Soft shadows.Mix of light sections and one dark section. Medium photography. Standard depth.Dark hero section. Dark footer. Bold brand-color CTA section. Sharp shadows or no shadows.
Complexity3–4 sections per page max. Minimal icons. Large white space. Simple single-column nav.5–6 sections. Icon grids. Standard component library. Medium detail level.6+ sections. Layered backgrounds. Counter animations. Rich icon sets. Parallax effects acceptable.
VoiceFirst-person plural. Short sentences. Warm CTA ("Let's talk"). Conversational FAQ language.Professional but approachable. Balanced authority signals. Standard CTA ("Get a Free Estimate").Expert language. Stats front-loaded. "Industry leaders." "Our craftsmen." Credentials and certifications prominent.
Market PositionEmphasize value, no job too small, flexible scheduling. Avoid price language that implies premium.Quality + fair price framing. "Trusted local contractor." No specific pricing language.Premium framing — "craftsmanship," "warranty," "guaranteed quality." Never mention price on the site.
AestheticBorder-radius 12px+. Soft drop shadows (box-shadow: 0 4px 16px rgba(0,0,0,0.08)). Clean photography with light backgrounds.Standard border-radius 8px. Clean drop shadows. Professional photography.Border-radius 4px or 0. Bold 1-2px borders. Texture backgrounds acceptable. Dramatic high-contrast photography.

Typography Pairing Rules

Every site must use a two-font system. Never use a single font for both headings and body text. Never use more than two font families on a single site.

RoleApproved Google Fonts PairingsWeight Rules
Display (headings)Oswald + Source Serif 4 • Montserrat + Lora • Bebas Neue + Open Sans • Playfair Display + InterH1/H2: 700 or 800 always. Never thin or light for headings.
Body (paragraphs)Source Serif 4 • Lora • Inter • Open Sans • NunitoBody: 400 regular. Emphasis: 600 semibold. Line height: 1.65–1.8.
RuleStandard
Letter spacing — headingsDisplay fonts: letter-spacing: 0.02em to 0.08em for headings. Body text: default or -0.01em.
Line height — headings1.1–1.2 for H1/H2. Body: 1.65–1.8. Never below 1.5 for any paragraph text.
Font loadingAlways use font-display: swap. Load only weights actually used (typically 400, 600, 700/800). Preconnect to fonts.googleapis.com.
HierarchyH1 must be visually dominant. H2 clearly subordinate to H1. Body clearly smaller than any heading. Obvious at a glance.

Spacing Scale — Use ONLY These Values

TokenValueUse
--space-xs8pxIcon gaps, tight inline spacing, badge padding
--space-sm16pxCard padding, list item gaps, between label and content
--space-md24pxComponent internal padding, between sub-sections
--space-lg40pxSection padding (mobile), between-component gaps
--space-xl64pxSection padding (desktop)
--space-2xl96pxHero padding, major section separators

Color Application Rules

RuleStandard
Primary color usagePrimary CTA buttons, sticky call bar, active nav state, section accent borders. Not used as full-page background except one "dark CTA" section per page.
Background varietyMinimum 3 distinct background zones per page: light (white or off-white), dark/colored (brand or dark navy), and mid (light gray #f8f8f8). A page that is entirely white looks unfinished.
ContrastWCAG AA: 4.5:1 for body text, 3:1 for large text (18px+ bold or 24px+ regular). White text on dark, dark text on light. Never gray-on-white below 4.5:1.
Button statesHover: darken 10–15%. Focus: visible ring (for keyboard accessibility). Active/pressed: scale(0.97).
Link colorIn-body links must be visually distinct from surrounding text. Use brand color + optional underline.

Component Quality Benchmarks

ComponentQuality Benchmark
Hero sectionFull-width background image, dark overlay. H1 in display font at 48px+ desktop / 32px+ mobile. Subheadline in body font. At least one CTA button. 80–100vh height on desktop.
Service cardsConsistent height within a row. Icon or image at top. Title bold. 1–2 sentence description. Visible hover state (shadow lift or border color change). Border radius min 8px.
Testimonial cardsStar rating visible. Reviewer name and source (Google, Yelp, etc.). Card has subtle background or border distinguishing it from page. Mobile: swipe carousel, one at a time, dot indicators.
CTA sectionsBrand primary color as background. Phone number in large type (28px+ desktop). Contrasting button color. Never a plain paragraph with a link.
FAQ accordionsFull-width clickable row with visible expand/collapse indicator (+ / - or chevron). Answer indented or padded. Smooth CSS transition. Use details/summary or CSS-only toggle.
NavigationLogo left, links center or right. On scroll: nav background becomes opaque if initially transparent. Active page link highlighted. Mobile: hamburger opens full-screen overlay or slide-in drawer.
FooterDark background. Logo, nav links, phone, full address, hours, copyright (auto-year), license number, AI Info link. Three-column desktop, stacked mobile.
Stats/countersLarge number (40px+ desktop) in display font. Short label in body font. Counter animates from 0 on scroll via IntersectionObserver. 3–4 stats desktop row, 2×2 grid mobile.

The "Beautiful" Checklist — 14 Items

This checklist is used in Step 7 (Visual QA). Every item must pass before Visual QA is marked complete. These 14 items are the definition of "beautiful" for a Dotcom Design site.

Beautiful Checklist — All 14 Required for Visual QA Pass
  • Two-font system in use (display + body). Zero single-font sites.
  • Typography hierarchy is visually obvious: H1 dominates, H2 subordinate, body clearly smaller
  • All spacing comes from the 8/16/24/40/64/96px scale — no arbitrary values
  • Page has at least 3 distinct background zones (light, dark/colored, white)
  • All buttons have visible hover, focus, and active states
  • Hero section is full-width, photography-forward, with a clear H1 and CTA
  • Service cards are consistent in height, have hover states, and use border-radius
  • Testimonials use a swipe carousel on mobile (one at a time, dot indicators)
  • CTA section uses brand primary color background — never a plain paragraph
  • FAQ section uses a styled accordion — never a plain list
  • Footer is dark-background, three-column on desktop, stacked on mobile
  • Stats counter animates on scroll
  • No section feels cramped or has inconsistent vertical rhythm
  • No walls of text — all body copy broken into 2–3 sentence paragraphs
This page is for internal reference only. Never share these credentials externally or commit them to a public GitHub repository. Never paste credentials into a client email.

Cloudflare

ItemLocation
Cloudflare Accountdotcomdesign.com Cloudflare account (dash.cloudflare.com)
API TokenStored in Claude Code project secrets — never in repo files
Account IDCloudflare dashboard → top right → account ID

GitHub

ItemStandard
Organizationdotcomdesigniowa
Repo naming convention[client-slug]-website — e.g., markuson-construction-website. Lowercase, hyphens only, no spaces.
VisibilityPrivate for all client repos
Default branchmain

Formspree

ItemStandard
AccountOne Formspree project per client. Do not share a form endpoint across clients.
Form endpoint formathttps://formspree.io/f/[form-id]
Notification emailClient's primary contact email from the brief. Not the agency email.
Required fieldsName, Phone, Email, Service Needed (dropdown), Message, "How did you find us?" (dropdown)
"How did you find us?" optionsGoogle Search, Google Maps, Facebook, Instagram, AI Assistant / Chatbot, Referral, Other

Marker.io Webhook — In Flight Process Flags

ItemValue / Notes
Webhook NameIn Flight - Process Flags
Webhook ID69c433808e1933ea9ffdc234
Webhook URLhttps://hub.dotcomdesignops.com/api/marker-webhook
Webhook Secretc90cc854acf3f8e9fe210a6f222f5bd4
EventissueCreated only
Issue type filterServer-side: only Bug type issues processed. All other types silently ignored.
ScopeNew-process sites only. Do NOT enable "Apply to all websites."
Secret stored inClaude Code project secrets as MARKER_WEBHOOK_SECRET

Every new website build is executed in Claude Code. This page defines the exact opening workflow to use at the start of every build session. Using the correct opening ensures Claude Code loads the right context and produces consistent, audit-ready output from line one.

Before Opening Claude Code

  1. Confirm the client's GitHub repo exists under dotcomdesigniowa (created in Step 3)
  2. Confirm the Cloudflare Pages project is connected to the repo (Step 3)
  3. Confirm the complete 10-section brief is finalized (Step 5)
  4. Confirm all assets are in the /assets/ folder (Step 2)
  5. Confirm CLAUDE.md exists in the repo root (see below)

CLAUDE.md — Required in Every Client Repo

Every client repo must have a CLAUDE.md file in the root. This file tells Claude Code the project context, build standards, and audit requirements before it touches any code. Create this file before the first Claude Code session.

CLAUDE.md — CLIENT REPO TEMPLATE
# CLAUDE.md — [Business Name] Website

## Project
- Client: [Business Name]
- Domain: [clientdomain.com]
- GitHub: dotcomdesigniowa/[client-slug]-website
- Cloudflare Pages: [project-name].pages.dev
- Plan Level: [SEO Booster / Plan A / B / C / D / E]

## Stack (NON-NEGOTIABLE)
- Pure HTML5, CSS3, vanilla JavaScript — no frameworks
- No Bootstrap, no Tailwind, no React, no jQuery
- All images: WebP format with explicit width/height attributes
- Fonts: Google Fonts CDN with preconnect + display=swap
- Forms: Formspree at https://formspree.io/f/[form-id]
- Hosting: Cloudflare Pages via GitHub push

## Audit Standards (build to pass from line one)
- W3C HTML Validator: 0 errors
- WAVE Accessibility: 0 errors, 0 contrast errors
- PageSpeed Insights: 90+ mobile performance, 95+ desktop
- DD AI Audit: 32/32 factors at ai-audit.dotcomdesignops.com

## Key Build Rules
- See the full Dotcom Design Playbook at [playbook URL] for all SOPs
- One H1 per page. H2/H3 in sequential order, never skipped.
- Every img has descriptive alt text
- Every form input has an associated label
- hero image: fetchpriority="high" loading="eager"
- All other images: loading="lazy"
- All scripts: defer or async
- robots.txt must allow GPTBot, ClaudeBot, PerplexityBot, GoogleOther, Anthropic-AI
- llms.txt must exist at /llms.txt
- /ai disclosure page must exist and be linked in footer

## Asset Locations
- Logo: /assets/logo/
- Images: /assets/images/
- Copy: /assets/copy/[page-name].md
- Business info: /assets/brief.md
- Testimonials: /assets/testimonials.md

Opening Prompt — Use at the Start of Every Build Session

Open the client repo in Claude Code. This is the first message to send every time you start a build session. Replace the bracketed fields with the actual client info.

CLAUDE CODE OPENING PROMPT — COPY THIS EXACTLY
You are building a client website for Dotcom Design.

Start by reading:
1. CLAUDE.md in this repo root — the project-specific build context
2. /assets/brief.md — the complete client brief
3. /assets/inventory.md — the content inventory from the old site

After reading all three files, confirm you have read them and summarize:
- Client name and domain
- Plan level and approximate page count
- Any questions or ambiguities before we start building

Do not write any code yet. Confirm you understand the project first.

Build stack: Pure HTML5, CSS3, vanilla JS — no frameworks, no CMS.

AUDIT STANDARDS — build to pass all four from the first line of code:
- W3C HTML Validator: 0 errors (validator.w3.org)
- WAVE Accessibility: 0 errors, 0 contrast errors (wave.webaim.org)
- PageSpeed Insights: 90+ mobile performance (pagespeed.web.dev)
- DD AI Audit: 32/32 factors (ai-audit.dotcomdesignops.com)

These are build requirements. Never build first and fix later.
Build clean code once, not broken code that gets patched.

After the Opening Prompt

Wait for Claude Code to confirm it has read all three files and summarized the project. Then submit the full client brief from the Build Prompt Template. Do not submit the brief in the same message as the opening prompt.

During the Build

Stay engaged. Review output as it arrives. Catch issues early — a correction at page 2 is far cheaper than a correction after all 30 pages are built. All four audits are build requirements. Claude Code builds to pass them from line one.

Useful Mid-Build Commands

SituationWhat to Say
Page doesn't match brief"The [page] hero doesn't match the brief. The H1 should be '[correct headline]'. Please fix and show me the updated section."
Missing section"The homepage is missing the trust bar. Please add it between the hero and services grid using these stats from the brief: [list them]."
Wrong tone"The About page copy is too generic. Based on the slider scores (Voice: 8/10), please rewrite it to sound more authoritative and expert."
Image issues"Please convert all images in /assets/images/ to WebP format and confirm they all have explicit width and height attributes."
Mobile issue"At 375px the testimonials are stacking vertically. Please convert them to a CSS scroll-snap carousel with one testimonial visible at a time."
Push to GitHub"The homepage looks good. Please commit all current files to the main branch with the message 'feat: homepage complete'."

Updating Existing Client Sites

For post-launch content updates, open the client repo in Claude Code and say:

UPDATE PROMPT
Please read CLAUDE.md and the current index.html for context.

I need to make the following update to [Business Name]'s website:
[DESCRIBE THE SPECIFIC CHANGE]

After making the change:
1. Confirm the change looks correct
2. Verify it does not break any adjacent content
3. Commit to main with message: "update: [brief description]"
4. Confirm the Cloudflare Pages build completes successfully
Skills must be loaded first. Submit this brief as the second message in the Claude Code session — after the Opening Prompt has been acknowledged and Claude Code has confirmed it has read CLAUDE.md, brief.md, and inventory.md. Do not paste this as the first message.

This is the full 10-section client brief template. Fill in every field. Do not leave any field blank. Submit this as one complete message after the opening prompt confirmation.

CLIENT BRIEF TEMPLATE — ALL 10 SECTIONS
## CLIENT BRIEF

### SECTION 1: CLIENT & PROJECT IDENTITY
Business Name (exact): 
Domain: 
Plan Level: [SEO Booster / Plan A / B / C / D / E]
GitHub Repo: dotcomdesigniowa/[client-slug]-website
Cloudflare Pages Preview URL: https://[project-name].pages.dev
Formspree Form ID: [form-id from Formspree dashboard]

### SECTION 2: BUSINESS OVERVIEW
Business Name (exact, for NAP): 
Phone Number: 
Address (full, with ZIP): 
Business Hours:
  Monday: 
  Tuesday: 
  Wednesday: 
  Thursday: 
  Friday: 
  Saturday: 
  Sunday: 
Years in Business: 
Jobs/Projects Completed: 
License Number(s): 
Bonded: Yes / No
Insured: Yes / No
Warranty Length (if applicable): 
Response Time (e.g., "same-day estimates"): 

### SECTION 3: SERVICES
Primary Services (most important first):
1. 
2. 
3. 
4. 
5. 
Secondary Services:
1. 
2. 
3. 

### SECTION 4: DESIGN DIRECTION
Design Sliders (1-10):
  Style (Classic → Modern): 
  Tone (Light → Dark): 
  Complexity (Simple → Rich): 
  Voice (Friendly → Authoritative): 
  Market Position (Economical → Premium): 
  Aesthetic (Polished → Gritty): 

Design Translation (derived from slider scores above):
  Font pairing: 
  Color scheme: 
  Section complexity: 
  Copy voice: 
  Layout approach: 
  Component style: 

Reference Site URL (a site they like): 
Color Preferences (if any): 
Font Preferences (if any): 

### SECTION 5: FEATURES & FUNCTIONALITY
Contact form fields: Name, Phone, Email, Service Needed (dropdown), Message, How did you find us? (dropdown)
Gallery required: Yes / No
  If Yes, photo count: 
Special integrations (booking, chat, etc.): 
Special pages requested (beyond standard): 

### SECTION 6: CONTENT ASSETS
Logo: /assets/logo/ (format: [PNG/SVG/wordmark fallback])
Photos: /assets/images/ (count: [N])
Copy: /assets/copy/ 
Business info: /assets/brief.md
Testimonials: /assets/testimonials.md (count: [N])
Team members: [Name, Title, Bio summary]
Owner name and title (for Person schema and About page): 

### SECTION 7: SEO & LOCAL STRATEGY
Primary City: 
Service Area (all cities/counties): 
[PASTE FULL KEYWORD-CITY MATRIX FROM SEO PORTAL HERE]

### SECTION 8: AI FRIENDLINESS DATA
Statistics (use these exact numbers on every page):
  Years in business: 
  Jobs/projects completed: 
  Warranty length: 
  Response time: 
  Service count: 
  Other notable stats: 

Citations (include as external links on every page):
  BBB Profile URL: 
  Google Business Profile URL: 
  License Verification URL: 
  Industry Association URL: 

Schema — required for LocalBusiness:
  Geo Latitude: 
  Geo Longitude: 
  Price Range (e.g., "$$"): 
  Area Served (all cities): 

FAQ Questions — provide 5+ per major page:
Homepage FAQs:
  Q: 
  Q: 
  Q: 
  Q: 
  Q: 
Primary Service Page FAQs:
  Q: 
  Q: 
  Q: 
  Q: 
  Q: 

### SECTION 9: AUDIT STANDARDS
Build this site to pass all four audits at Steps 10-11 with zero rework.
These are build requirements — implement them during the initial build.

W3C HTML (0 errors):
- Every page: 
- Every img: descriptive alt (never empty, never "image")
- Every input/select/textarea: associated 
,
,
,

Something goes wrong on every build. This appendix documents the failure paths for the most common problems and exactly what to do. The goal is never to improvise — consult this page first, follow the steps, and resolve the issue before advancing.

PageSpeed Score Below 90 (Mobile)

The most common failure. Do not guess — use PageSpeed's Opportunities section to identify the specific failing items.

Issue (as shown in PageSpeed)Fix
"Largest Contentful Paint" too slowThe hero image is the LCP element. Add fetchpriority="high" loading="eager" to the hero img tag. Resize the image to max 1920px wide. Convert to WebP.
"Eliminate render-blocking resources"Move all <script> tags to bottom of body with defer attribute. Move non-critical CSS to <link rel="preload">.
"Properly size images"Add explicit width and height attributes to every img tag. Resize images to their display dimensions before deployment.
"Serve images in next-gen formats"Convert all remaining JPG/PNG to WebP using cwebp -q 85 input.jpg -o output.webp
"Reduce unused CSS"Inline critical CSS in <head>. Move the full stylesheet to <link rel="preload" as="style"> with onload handler.
"Reduce unused JavaScript"Remove any JS libraries not actively used. Split scripts by page if one page has heavy JS.
Still below 90 after fixesRun PageSpeed again. If score is 85-89, check Diagnostics for Cumulative Layout Shift (CLS) — often caused by images without explicit dimensions or font loading flash.

WAVE Accessibility Errors

Error TypeFix
Missing alt textAdd descriptive alt attribute to every <img>. For decorative images: alt="". For content images: describe what's in the image including any relevant keywords.
Missing form labelAdd <label for="[input-id]"> above every input, select, and textarea. Never rely on placeholder text as the label.
Low contrast errorUse a contrast checker (webaim.org/resources/contrastchecker). Increase font weight or darken text color until the ratio reaches 4.5:1 for body text, 3:1 for large text.
Empty buttonAdd descriptive text or aria-label to every <button> and icon-only link. Example: <button aria-label="Open navigation menu">
Skipped heading levelFind the H1, H2, H3 order — you cannot go from H1 to H3 without an H2. Fix the heading structure in the HTML, not just the visual styling.

W3C HTML Validation Errors

Error TypeFix
Duplicate IDFind all uses of the duplicate id attribute. Make each id unique. Common cause: copy-pasting sections without updating ids.
Element not allowed as childA block-level element (div, p, h2) inside an inline element (span, a). Move the block element outside the inline element.
Stray end tagA closing tag with no matching opening tag. Find and remove it.
Attribute not allowed on elementExample: using <a href> on a <div> (not valid). Convert to <a> wrapping the div, or use a <button> with onclick.
Bad value for attributeCheck the specific attribute — often a malformed URL in href, an invalid character in an id, or a wrong value for a type attribute.

DD AI Audit — Red FAIL Factors

FactorMost Common CauseFix
AI Crawler Allow-listingrobots.txt is missing or blocks AI botsReplace robots.txt with the exact content from Step 6 / System Standards. Verify at /robots.txt after deploy.
FAQ SectionsFewer than 5 FAQs, or FAQs as plain text instead of accordionAdd FAQs to reach minimum 5 per page. Convert to styled accordion with <details>/<summary> or JS toggle. Add FAQPage JSON-LD.
Consistent NAPPhone or address in footer doesn't match GBP exactlyCopy the exact NAP from the GBP listing. Update all footer instances. The exact format must match character-for-character.
Author ProfilesAbout page is missing or doesn't include owner name, photo, and bioBuild the About page owner profile section per the About Page SOP in Step 6.
llms.txt / AI Disclosure PageFile doesn't exist or is incompleteCreate /llms.txt and /ai using the templates in Step 11 and Step 6. Link /ai in the footer.
Comparison TablesNo HTML table element on the siteAdd a comparison or features table to the homepage or a primary service page. Use proper thead/tbody/th/td markup.

Client Rejects the Entire Design Direction (Step 14)

This is rare but it happens. If a client says "I don't like the look of this at all" rather than providing specific changes, follow this process:

  1. Do not make any changes yet. First, get specifics: "Can you help me understand what you were expecting that's different from what you see?"
  2. If the issue is a specific element (colors, font, hero image), treat it as a standard revision — fix the specific element.
  3. If the issue is the overall design direction, review the slider scores from Step 1. Ask: "Do the slider scores we agreed on still represent what you want?" If they've changed, update them and rebuild the brief Section 4 with the new slider translation.
  4. A full design direction change is out-of-scope for the included revision round — document it as such, and either scope it as additional paid work or rebuild with updated slider scores as a goodwill gesture (your call based on the client relationship).
  5. Never rebuild the entire site without a written revised brief. Make the client confirm the new direction in writing before rebuilding.

DNS Doesn't Propagate (Step 16)

SituationAction
Site not loading after 30 minutesCheck DNS propagation at dnschecker.org. If records show in some locations but not others, wait — this is normal. Full propagation can take up to 48 hours.
CNAME record shows in registrar but site still loads old contentThe old host may still have a DNS record pointing to the old site. Check for conflicting A records in the registrar DNS panel. Remove any A records pointing to the old hosting IP.
SSL certificate error on the new domainCloudflare Pages issues SSL certificates automatically but it can take 10–15 minutes after DNS propagates. Wait and refresh. If still failing after 1 hour, check the Cloudflare Pages custom domain status in the dashboard.
www subdomain not workingConfirm the www subdomain was added as a separate custom domain in Cloudflare Pages (Settings → Custom Domains). Both the apex domain and www must be added separately.
Client is panicking about downtimeReassure them: "DNS changes are propagating globally — this is a normal part of every website launch. The site will be fully live within [30 minutes / a few hours]. Your old site is still accessible in the meantime."

Formspree Form Not Receiving Submissions

SituationAction
Form submits but no email receivedCheck Formspree dashboard → Submissions tab. If the submission is there, the issue is email delivery — check spam folders. Update the notification email in Formspree settings.
Form shows error on submissionCheck the form's action attribute — must be the exact Formspree endpoint URL. Check the browser console for the error message. Confirm the Formspree account is active and not over the free tier limit.
Form submits on localhost but not on live domainFormspree blocks submissions from localhost by default. This is expected behavior — the live domain submission is what matters.

Escalation Protocol

If any issue cannot be resolved within 2 hours using this appendix:

  1. Document the specific issue — what was tried, what the current state is, what error messages appear
  2. Escalate to the build lead with the full documentation
  3. If the issue is blocking launch, notify the client: "We've encountered a technical issue and are resolving it. Your site will be live by [specific time]." Never leave a client in silence.
  4. Document the resolution in a Process Flag via Marker.io so it can be reviewed for Playbook updates