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.
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
| # | Step | Phase | Time |
|---|---|---|---|
| 1 | Kickoff Call | Intake | 45 min |
| 2 | Content Scraping | Intake | 30 min |
| 3 | Domain & Hosting Intake | Intake | 15 min |
| 4 | SEO Strategy | Intake | 15 min |
| 5 | Brief Preparation | Build | 30 min |
| 6 | Site Build | Build | 2–4 hrs |
| 7 | Visual QA | QA | 30 min |
| 8 | Technical QA | QA | 20 min |
| 9 | SEO Readiness Audit | QA | 20 min |
| 10 | Performance Optimization | QA | 30 min |
| 11 | AI Friendliness Audit | QA | 15 min |
| 12 | Content QA | Review | 20 min |
| 13 | Deploy to Preview | Review | 15 min |
| 13.5 | Internal Review | Review | 1–2 hrs |
| 14 | Client Review | Review | 48 hr window |
| 15 | Revisions | Launch | 1–2 hrs |
| 16 | Go Live | Launch | 30 min |
| 17 | Post-Launch Monitoring | Launch | 30 min |
| 18 | GBP Sync | Handoff | 20 min |
| 19 | Quarterback Handoff | Handoff | 15 min |
| 20 | Ongoing Maintenance | Handoff | Ongoing |
Step 1: Kickoff Call
- Signed contract received from the client
- Client contact name, phone, and email confirmed
- Kickoff call scheduled and confirmed with client
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)
| Time | Topic | What to Capture |
|---|---|---|
| 0–5 min | Introductions & overview | Confirm contact info, confirm timeline expectations. Tell client: "Your site will be live within 10 business days of this call." |
| 5–15 min | Business overview | Exact business name, years in business, number of employees, license numbers, service area, HQ city |
| 15–25 min | Services | Complete list of every service offered, primary vs. secondary services, services they want to emphasize |
| 25–35 min | Design direction | Design slider scores (see below), reference sites they like, colors or fonts they prefer, logo files |
| 35–45 min | Content & logistics | Photos 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.
| Slider | 1 (Left) | 10 (Right) |
|---|---|---|
| Style | Classic / Traditional | Modern / Contemporary |
| Tone | Light & Airy | Dark & Bold |
| Complexity | Simple & Clean | Rich & Layered |
| Voice | Friendly & Approachable | Authoritative & Expert |
| Market Position | Economical & Accessible | Premium & Exclusive |
| Aesthetic | Polished & Refined | Gritty & 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:
| Situation | Action |
|---|---|
| Client has a logo but can't find the file | Note "TBD — follow up within 48 hrs." Schedule a follow-up. Do not start Step 5 until received. |
| Client has never had a logo | Build 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 only | Accept 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.
| Field | Notes |
|---|---|
| Business name (exact) | As it appears on their license and Google Business Profile |
| Phone number | Primary contact number for the website |
| Address | Full street address including ZIP |
| Business hours | Day-by-day, including holiday exceptions if known |
| Service area | Cities, counties, or radius served |
| Services list | Complete list, ordered by importance |
| Years in business | Used in trust signals and schema |
| Jobs/projects completed | Specific number — ask directly. Used in AI Friendliness stats. |
| License numbers | Contractor license, bonding, insurance — whatever applies |
| Warranty length | If applicable — used in AI Friendliness stats |
| Response time | e.g., "same-day estimates" — used in AI Friendliness stats |
| Design slider scores | All six sliders, 1–10 |
| Reference site URL | A site they like the look of (optional but valuable) |
| Logo files | Request PNG or SVG; document fallback if unavailable (see Logo section above) |
| Photos available | Yes/No and approximate count |
| Testimonials/reviews | Count and source (Google, Yelp, etc.) |
| BBB profile URL | Search BBB.org — note if not listed |
| Google Business Profile URL | Search Google Maps for the business |
| Industry association | NARI, NAHB, AGC, etc. — ask directly |
| SEO plan level | SEO Booster / Plan A / B / C / D / E — determines page count |
| Project timeline | Confirm: "Your site will be live within 10 business days." |
- 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
Step 2: Content Scraping & Site Inventory
- Step 1 Completion Gate satisfied
- Client's existing website URL confirmed (if they have one)
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.
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 Type | Where to Save | Format |
|---|---|---|
| All page copy | /assets/copy/[page-name].md | Markdown 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.md | Structured markdown with all business data |
| Testimonials | /assets/testimonials.md | One 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:
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:
| Source | License | Use For |
|---|---|---|
| Client's own photos | Client-owned | Always preferred — real work photos for service and hero images |
| Unsplash (unsplash.com) | Free commercial use | High-quality stock for hero images when no client photos available |
| Pexels (pexels.com) | Free commercial use | Trade-specific stock photography |
| Pixabay (pixabay.com) | Free commercial use | Backup when Unsplash/Pexels don't have suitable options |
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
| Item | Found? | Notes |
|---|---|---|
| All page copy | Yes / No / Partial | Note any pages that were blocked or inaccessible |
| Images | Yes / No / Partial | Note count and quality. Flag any that need stock replacements. |
| Logo files | Yes / No | Note format (PNG, SVG, JPG) |
| Business info (NAP) | Yes / No | Cross-reference against client brief — brief takes precedence on conflicts |
| Services list | Yes / No / Partial | Note any services on old site not in brief |
| Testimonials | Yes / No | Note count |
| Team info | Yes / No | Names, titles, bios |
| License/cert numbers | Yes / No | Verify against brief |
| Existing integrations | Yes / No | Note any to replicate (chat widgets, booking tools, etc.) |
| All existing pages listed | Yes / No | Full page list for Content Inventory in Step 5 |
- All extractable content saved to
/assets/folder using the defined structure /assets/inventory.mdcreated 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
Step 3: Domain & Hosting Intake
- Step 2 Completion Gate satisfied
- Client contact available to provide or look up credentials
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.
What to Document
| Item | Where to Find It | Why It Matters |
|---|---|---|
| Domain registrar name | Client provides; or run whois clientdomain.com | Tells you where to make DNS changes at launch |
| Registrar login credentials | Client provides | Required to add DNS records at launch |
| Current nameservers | Registrar DNS settings | Determines if DNS is managed at registrar or elsewhere (e.g., Cloudflare) |
| Current DNS records | Registrar DNS settings | Screenshot or copy ALL existing A, CNAME, MX, TXT records before making any changes |
| Domain expiration date | Registrar dashboard | Alert client if domain expires within 90 days |
| Current hosting provider | Client provides or DNS lookup | Needed 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.
| Item | Standard |
|---|---|
| Organization | dotcomdesigniowa |
| Repo naming convention | [client-slug]-website — e.g., markuson-construction-website. Use lowercase, hyphens only, no spaces. |
| Visibility | Private |
| Initial commit | Add 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.
| Setting | Value |
|---|---|
| Project name | Same as repo slug: [client-slug]-website |
| Build command | (leave blank — no build step for static HTML sites) |
| Output directory | / (root) |
| Branch | main |
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.
- 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
dotcomdesigniowawith correct naming convention - Cloudflare Pages project created and connected to GitHub repo
- Cloudflare Pages preview URL saved to project record
Step 4: SEO Strategy
- Step 3 Completion Gate satisfied
- Client website URL available (existing site or confirmed new domain)
- Client's plan level confirmed from Step 1
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
| Output | What It Is | How It's Used |
|---|---|---|
| Keyword-city matrix | A grid of selected keywords × selected markets | Pasted directly into Section 7 of the build prompt in Step 5 |
| Live strategy site URL | Branded client-facing site at seo-strategy.dotcomdesign.com/{domain} | Sent to client for approval before Step 5 begins |
| Selected keywords | The 1–5 keywords chosen for this client | Used to name service pages and write meta titles |
| Selected markets | The cities targeted in the strategy | Used to name location pages and write meta titles |
Client Approval — Required Before Step 5
Send the client the live strategy site URL with this message:
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
| Plan | Price | Combinations | Approx. Pages |
|---|---|---|---|
| SEO Booster | $399/mo | 10 | ~14 total |
| Plan A | $600/mo | 20 | ~24 total |
| Plan B | $900/mo | 30 | ~34 total |
| Plan C | $1,200/mo | 40 | ~44 total |
| Plan D | $1,600/mo | 50 | ~54 total |
| Plan E | $2,000/mo | 60 | ~64 total |
- 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
Step 5: Brief Preparation
- 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
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
| # | Section | What Goes Here |
|---|---|---|
| 1 | Client & Project Identity | Business name, domain, plan level, GitHub repo URL, Cloudflare Pages preview URL |
| 2 | Business Overview | Exact business name, phone, address, hours, years in business, license numbers, jobs completed |
| 3 | Services | Complete ordered list of all services; note primary vs. secondary |
| 4 | Design Direction | All six slider scores + design translation (see slider guide below), reference site URL, color/font preferences |
| 5 | Features & Functionality | Contact form fields, any special integrations (booking, chat, etc.), gallery requirement (Y/N), photo count |
| 6 | Content Assets | Logo file path (/assets/logo/), photo paths (/assets/images/), testimonials path (/assets/testimonials.md), team info |
| 7 | SEO & Local Strategy | Full keyword-city matrix from Step 4, primary city, all cities/counties served |
| 8 | AI Friendliness Data | All 12 data points required for 32/32 AI audit score (see table below) |
| 9 | Audit Standards | The four audit pass requirements — copy from System Standards. Do not abbreviate. |
| 10 | Build Instructions | Content 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.
| Slider | Score 1–3 | Score 4–6 | Score 7–10 |
|---|---|---|---|
| Style | Serif 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. |
| Tone | White/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. |
| Complexity | Max 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. |
| Voice | First-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 Position | Emphasize 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. |
| Aesthetic | Rounded 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.
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 Point | Used For | Where to Collect |
|---|---|---|
| Years in business | Statistics Presence (Factor 10) | KO call or existing website |
| Jobs/projects completed | Statistics 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 URL | Citation Presence (Factor 23) | Search BBB.org for the business |
| Google Business Profile URL | Citation Presence (Factor 23) | Google Maps search |
| License number(s) | Citation Presence + Trust | KO call or state licensing board |
| Industry association membership | Citation Presence (Factor 23) | KO call |
| Full NAP (Name, Address, Phone) | Schema + NAP Consistency (Factors 20, 26) | KO form — must match GBP exactly |
| Business hours | Schema (Factor 20) | KO form |
| Geo coordinates | Schema (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 |
- 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
Step 6: Site Build
- 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
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
| Layer | Technology | Notes |
|---|---|---|
| Markup | HTML5 (semantic) | Proper heading hierarchy, landmark elements, ARIA labels |
| Styling | CSS3 — no frameworks | No Bootstrap, no Tailwind — hand-written CSS only. Use CSS variables. |
| Interactivity | Vanilla JavaScript | No jQuery, no React — plain JS only |
| Images | WebP format | All images converted to WebP before deployment. Explicit width/height on all img tags. |
| Fonts | Google Fonts CDN | Use display=swap + preconnect. No Adobe Fonts. |
| Hosting | Cloudflare Pages | All sites deploy to Cloudflare Pages via GitHub repo (set up in Step 3) |
| DNS | Cloudflare DNS | All domains use Cloudflare for DNS management |
| Forms | Formspree | One Formspree form per client. Notification email = client's primary email. |
Formspree Setup
| Setting | Value |
|---|---|
| Account | Create one Formspree project per client. Do not mix clients on one account. |
| Form endpoint format | https://formspree.io/f/[form-id] |
| Notification email | Client's primary contact email from the brief |
| Required form fields | Name, Phone, Email, Message, "How did you find us?" dropdown (required for AI Factor 32) |
| "How did you find us?" options | Google Search, Google Maps, Facebook, Instagram, AI Assistant / Chatbot, Referral, Other |
| Success behavior | Show inline success message — do not redirect to a blank confirmation page |
Required Pages
| Page | Required? | Notes |
|---|---|---|
Home (/) | Always | Full homepage with hero, services overview, trust signals, CTA |
About (/about) | Always | See About Page SOP below |
Contact (/contact) | Always | See Contact Page SOP below |
| Service pages | Per matrix | One page per keyword in the SEO matrix (e.g., /roofing) |
| Location pages | Per matrix | One page per city in the SEO matrix (e.g., /roofing-omaha-ne) |
Gallery (/gallery) | If 6+ photos | Required if client has 6 or more photos; skip if fewer |
AI Info (/ai) | Always | AI disclosure page — required for AI Factor 29. Link in footer as "AI Info". |
Homepage SOP — 10 Required Sections in Order
- Navigation bar — Logo, all main nav links, phone number as CTA button. Sticky on scroll. Max 5 nav items.
- Hero section — H1 with primary keyword, subheadline, primary CTA button (phone), secondary CTA (contact form). Full-width background image with dark overlay.
- Trust bar — Years in business, license number, service area, key differentiators. Icon + stat pairs. Quick Facts / At a Glance format (AI Factor 15).
- Services overview — Grid of service cards. Each card links to the corresponding service page.
- 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).
- Gallery teaser — 3–6 photos in a grid. Link to full Gallery page. Skip if no photos available.
- Testimonials — 3–5 testimonials. Star ratings. Source attribution (Google, etc.). Swipe carousel on mobile.
- Service area map or list — Embedded Google Map or list of all cities served in plain HTML text (required for AI Factor 19).
- Contact CTA section — Brand-color background. Phone number in large type. Button linking to contact form. Never a plain paragraph.
- 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.
- 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.
- 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.
- Our story — How the business was founded, what the mission is, what makes them different. 2–3 paragraphs. Must include the specific founding year.
- 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.
- 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
- Page hero — H1: "Contact [Business Name]" or "Get a Free Estimate." Subheadline with response time (e.g., "We respond within 24 hours").
- 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.
- Contact details column — Phone (tap-to-call link), full address (links to Google Maps), business hours (day-by-day), email address.
- Map embed — Google Maps iframe showing the business location. Responsive width.
Interior Page SOP — 9 Required Sections
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.
- Page hero — H1 with exact keyword + city. Subheadline. CTA button. Relevant, high-quality image. See Hero Image Standards below.
- 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.
- Services list — Styled cards or icon+text pairs. Minimum 3 items. Each with title and 1–2 sentence description.
- Why choose us — 3–4 differentiators in a layout visually distinct from the services list.
- Gallery or photo — At least one relevant image with descriptive alt text including keyword.
- Testimonial — At least one styled card with star rating, reviewer name, and source. Never plain text.
- Contact CTA — Brand-color background section. Phone in large type. Button to contact form.
- FAQ section — Minimum 5 FAQs in a styled accordion. Each question is a clickable toggle. FAQPage JSON-LD schema required.
- 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 Element | How to Generate It |
|---|---|
| Local neighborhood or district reference | Search "[city name] neighborhoods" — mention one or two in the intro |
| Local landmark reference | Search "[city name] landmarks" — briefly reference the area's identity |
| Local weather/climate fact | For roofing, masonry, concrete — mention local weather patterns that make the service important |
| Local testimonial | Use a testimonial from a client in or near that city if available |
Hero Image Standards
| Criterion | Pass | Fail |
|---|---|---|
| Subject relevance | The image shows the specific type of work for this page | Generic construction worker, hard hat on a desk, handshake |
| Image quality | Sharp, well-lit, professional-looking. Work clearly visible. | Blurry, dark, low-resolution |
| Real work preferred | Client's actual completed work is always preferred | Stock when client has provided real photos |
| Mobile composition | Subject visible and centered at 375px. Use object-position: center top. | Wide landscape that crops to sky or background on mobile |
| Contrast for text | Dark overlay ensures H1 and subheadline are legible | White text over light image area |
Mobile SOP — Minimum Requirements
| Requirement | Standard |
|---|---|
| Breakpoints | Mobile: 375px, Tablet: 768px, Desktop: 1200px. Test at all three. |
| Navigation | Hamburger menu. Opens as full overlay or slide-in drawer. All links tappable (min 44px). Closes on link tap. |
| Sticky call bar | Fixed bottom bar on mobile. Phone number as tap-to-call. Brand primary color. 56px height minimum. padding-bottom: 72px on body. |
| Font sizes | Body min 16px. No text below 13px. Use font-size: 16px on inputs to prevent iOS auto-zoom. |
| Images | width: 100%, height: auto. No horizontal overflow. |
| Forms | Single-column on mobile. Inputs min 44px height. Labels above inputs. Submit button full-width. |
| Touch targets | All interactive elements minimum 44×44px touch target. |
| No horizontal scroll | Page must not scroll horizontally at any mobile viewport. |
| Testimonials | CSS scroll-snap horizontal carousel on mobile. One at a time. Dot indicators. |
| Stats bar | Reflows 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.
| Check | Pass Condition |
|---|---|
| No horizontal scroll | Page does not scroll sideways at 375px |
| H1 above the fold | Headline visible without scrolling on 375×667px viewport (iPhone SE) |
| Sticky call bar visible | Call bar at bottom on every page. Does not overlap content. |
| Hamburger menu works | Opens, all links tappable, closes on link tap |
| Hero image composition | Subject centered and visible at 375px |
| Testimonials carousel | Horizontal swipe — one at a time — not a vertical stack |
| Service cards single column | No two-column card grids on mobile |
| Form usability | All inputs 44px tall. Labels above. Submit button full-width. |
| Stats reflow | 2×2 grid on mobile, not horizontal scroll |
| Touch targets | All nav links, buttons, card links: min 44×44px |
| Font sizes | Body text min 16px. Nothing below 13px. |
| Section visual rhythm | Sections 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:
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
- 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
Step 7: Visual QA
- Step 6 Completion Gate satisfied — all 29 items checked
- Site accessible in Claude Code preview
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
| Check | Pass Criteria |
|---|---|
| No horizontal scroll | Page does not overflow horizontally at 375px, 768px, or 1200px |
| Navigation renders correctly | Desktop nav shows full links; mobile shows hamburger that opens correctly |
| Sticky call bar visible on mobile | Fixed bottom bar with phone number visible on all mobile pages; does not overlap content |
| All images load | No broken image icons; all images display correctly |
| All images are WebP | Inspect → check src attribute ends in .webp |
| Text is readable | No invisible text; all body text min 16px on mobile |
| Buttons are tappable | All buttons min 44×44px touch target |
| Links work | All navigation links, CTA buttons, and internal links correct destination |
| Phone numbers tap-to-call | All phone numbers wrapped in <a href="tel:..."> |
| Address links to Google Maps | Address wrapped in Google Maps link |
| Footer complete | Logo, nav, phone, full address, hours, copyright year, license number, AI Info link |
| No placeholder content | No "Lorem ipsum", "Your Business Name", or "[INSERT]" text anywhere |
| Logo displays correctly | Crisp, correct size, not stretched or pixelated |
| Two-font system | Display font on headings, body font on paragraphs. Never one font for both. |
| Beautiful Checklist | See Design Standards appendix — all 14 items pass |
Homepage-Specific Checks
| Check | Pass Criteria |
|---|---|
| Hero H1 contains primary keyword | H1 includes the main service keyword |
| Trust bar / Quick Facts present | Years in business, license, service area, stats displayed |
| All 10 homepage sections present | Cross-reference against Homepage SOP in Step 6 |
| Counter animations work | Number counters animate when scrolled into view |
| Testimonials carousel | At least 3 testimonials; swipe carousel on mobile |
| About section has owner name + quote | Owner identified by name; blockquote present |
| Service area cities in plain text | All cities listed in HTML text — not just a map |
- 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
Step 8: Technical QA
- Step 7 Completion Gate satisfied
- Site accessible at live Cloudflare Pages preview URL
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.
| Check | Tool | Pass Criteria |
|---|---|---|
| No broken links | Browser console | Zero 404 errors in the console on any page |
| No JavaScript errors | Browser console | Zero JS errors on any page |
| Contact form submits | Manual test | Submit a test entry; confirm receipt in Formspree dashboard |
| robots.txt present | Navigate to /robots.txt | File exists with exact AI bot allow-listing from Step 6 |
| sitemap.xml present | Navigate to /sitemap.xml | File exists and lists all pages |
| llms.txt present | Navigate to /llms.txt | File exists with complete business summary |
| /ai page present | Navigate to /ai | Page exists and is linked in footer |
| Canonical tags present | View source | Every page has <link rel="canonical"> |
| Meta descriptions present | View source | Every page has unique <meta name="description"> |
| Open Graph tags present | View source | og:title, og:description, og:image, og:url on every page |
| Favicon present | Browser tab | Favicon displays in browser tab |
| HTTPS enforced | Browser address bar | Site loads over HTTPS; no mixed content warnings |
| Custom 404 page | Navigate to /nonexistent-page | Custom 404 page displays |
| www redirect configured | Navigate to www.[domain].pages.dev | Redirects correctly — no hanging or error |
| Images have alt text | View source | Every img tag has non-empty alt attribute |
| Schema present | View source | JSON-LD blocks visible for LocalBusiness, FAQPage, BreadcrumbList, Person |
- 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
Step 9: SEO Readiness Audit
- Step 8 Completion Gate satisfied
- SEO matrix from Step 4 on hand for reference
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.
| Check | Pass Criteria |
|---|---|
| H1 contains primary keyword | Every page H1 includes the target keyword for that page |
| Meta title format | [Keyword] in [City] | [Business Name] — max 60 characters |
| Meta description format | Includes keyword, city, phone number — 150–160 characters. Unique per page. |
| URL slugs match keywords | Service pages: /roofing. Location pages: /roofing-omaha-ne. No nested paths. |
| LocalBusiness schema complete | JSON-LD on every page with name, address, phone, geo lat/lng, openingHours, priceRange, areaServed, datePublished, dateModified |
| FAQ schema present | FAQPage JSON-LD on every service and location page. Min 5 Q&A pairs. |
| Internal linking pattern | Every service page links to 2+ location pages; every location page links to 2+ service pages |
| NAP consistency | Business name, address, phone identical on every page and in GBP exactly |
| Image alt text includes keywords | Hero and key images include primary keyword in alt text |
| Page titles are unique | No two pages share the same meta title |
| Image file names descriptive | e.g., brick-retaining-wall-omaha.webp not IMG_1234.webp |
| Page count matches SEO matrix | Count 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.
- 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
Step 10: Performance Optimization
- Step 9 Completion Gate satisfied
- Site accessible at live Cloudflare Pages preview URL
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
| Audit | Tool | Pass Standard | Exception |
|---|---|---|---|
| W3C HTML | validator.w3.org | 0 errors (warnings acceptable) | None |
| WAVE Accessibility | wave.webaim.org | 0 errors, 0 contrast errors | None |
| PageSpeed — Mobile | pagespeed.web.dev | Performance ≥ 90, Accessibility ≥ 95, Best Practices ≥ 90, SEO ≥ 95 | None |
| PageSpeed — Desktop | pagespeed.web.dev | Performance ≥ 95, all others ≥ 90 | None |
| DD AI Audit | ai-audit.dotcomdesignops.com | 32/32 factors | Readability (Flesch-Kincaid) — trade terminology acceptable |
Common Performance Fixes
| Issue | Fix |
|---|---|
| Images not in WebP | Convert all images to WebP using Claude Code: cwebp -q 85 input.jpg -o output.webp |
| Images missing width/height attributes | Add explicit width and height to every <img> tag to prevent layout shift (CLS) |
| Hero image lazy-loaded | Hero image (the LCP element) must use fetchpriority="high" loading="eager" — never lazy |
| Render-blocking scripts | Move all scripts to bottom of body with defer or async |
| No lazy loading on below-fold images | Add loading="lazy" to all images except the hero |
| Google Fonts blocking | Add <link rel="preconnect"> to fonts.googleapis.com and use display=swap |
| Large CSS file | Inline critical above-fold CSS in <style> in head; load rest with <link rel="preload"> |
| Low contrast | Use a contrast checker — minimum 4.5:1 for body text, 3:1 for large text (>18px bold or >24px regular) |
- 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
Step 11: AI Friendliness Audit
- Step 10 Completion Gate satisfied (all four audits passing)
- Site accessible at live Cloudflare Pages preview URL
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).
| Result | Action |
|---|---|
| 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
# [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]
- 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
Step 12: Content QA
- Step 11 Completion Gate satisfied
- Client brief on hand for reference
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.
| Check | Pass Criteria |
|---|---|
| Business name spelled correctly | Exact match to the signed contract and Google Business Profile |
| Phone number correct | Matches client brief; tap-to-call link uses correct digits |
| Address correct | Full address including ZIP matches client brief |
| Business hours correct | Day-by-day hours match client brief exactly |
| Services list accurate | All services from the brief are present; no unlisted services |
| Service area accurate | All cities from the brief and SEO matrix are represented |
| License numbers correct | Match client brief exactly |
| Years in business correct | Math is correct (founded year to current year) |
| Testimonials accurate | Text matches source; reviewer names correct |
| No unverifiable claims | Remove "#1 in the city" or "best in the state" unless client can verify |
| Tone matches slider scores | Copy tone aligns with the design slider scores from Step 1 |
| No generic filler copy | No "We are committed to excellence" — all copy specific to this business |
| Owner name and story accurate | About page owner details match KO call notes |
| FAQ answers are accurate | FAQ answers reflect actual business practices — not generic AI filler |
- 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
Step 13: Deploy to Preview
- 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)
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
- Confirm the latest Git push has deployed: check the Cloudflare Pages dashboard for a green "Success" build
- Test the preview URL in an incognito window to confirm it loads correctly with no cache
- Test the preview URL on a real mobile device (not just browser dev tools)
- Submit a test contact form from the preview URL and confirm receipt in Formspree
- Copy and save the Cloudflare Pages preview URL — this is what goes in the client review email
Process Flags — Automated Hub Registration
After confirming the Cloudflare Pages build is live, call the In Flight /api/deploy-preview endpoint to register the project:
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.
- 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
Step 13.5: Internal Review
- Step 13 Completion Gate satisfied
- Preview URL confirmed working in incognito window and on real mobile device
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
- Hero section: headline, subheadline, CTA button, and image all look correct on desktop and mobile
- Two-font system applied: display font on headings, body font on paragraphs
- All section backgrounds alternate correctly (white, light gray, dark/brand color)
- No broken images, missing icons, or placeholder text remaining
- Typography is consistent across all pages
- All buttons have correct labels and correct destinations
- The Beautiful Checklist (Design Standards appendix) — all 14 items pass
Content Accuracy
- Business name spelled correctly on every page
- Phone number correct and clickable (tel: link)
- Address correct on contact page and in footer
- Business hours correct and day-by-day
- All service names and descriptions match client brief
- No lorem ipsum or placeholder copy remaining anywhere
- Owner name, title, and bio correct on About page
- All testimonials are real and attributed correctly
Functional Review
- Navigation works on desktop and mobile — all links correct
- Mobile hamburger menu opens and closes correctly
- Contact form submits successfully (test with a real submission)
- All phone number links open the dialer on mobile
- All external links open in a new tab
- Gallery lightbox works correctly (if applicable)
- FAQ accordions open and close correctly
- No JavaScript console errors
Mobile Review (on a real device)
- All text is readable without zooming
- All buttons and tap targets are large enough to tap comfortably
- No horizontal scrolling on any page
- Sticky call bar displays correctly and does not overlap content
- Images load quickly and look sharp
- Testimonials swipe correctly in carousel
- 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"
Step 14: Client Review
- 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
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
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.
- 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
Step 15: Revisions
- Step 14 Completion Gate satisfied
- Client revision list compiled
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
- Work through the revision list item by item in Claude Code
- Push changes to GitHub and confirm Cloudflare Pages preview updates (60–90 seconds)
- Re-run QA on all changed pages based on change type (see table below)
- Send the updated preview URL to the client with a note that revisions are complete
- Request final written approval: "Please reply 'Approved' to proceed to launch"
Re-QA Requirements After Revisions
| Type of Change | Re-run These QA Steps |
|---|---|
| Text/copy changes only | Content QA (Step 12) on changed pages. Visual QA quick check. |
| Photo/image swaps | Visual QA on changed pages. Confirm WebP format. Check alt text. |
| HTML structure changes | Visual QA + W3C validation + WAVE accessibility check on changed pages. |
| CSS/layout changes | Full Visual QA at all three viewports. Check mobile checklist. |
| New page added | Full QA on new page: Visual QA, W3C, WAVE, SEO checklist, schema. Update sitemap.xml. |
- 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)
Step 16: Go Live
- 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
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
- In Cloudflare Pages, add the client's custom domain: Settings → Custom Domains → Add custom domain
- Also add the www version:
www.[clientdomain.com]— Cloudflare will redirect it automatically - Cloudflare will provide DNS records needed (CNAME pointing to
pages.dev) - Log into the client's domain registrar (Step 3 credentials)
- Add the CNAME record provided by Cloudflare Pages
- If domain uses Cloudflare DNS already, the record is added automatically — confirm in Cloudflare
- Wait 5–30 minutes for DNS propagation
- Test the live domain in incognito: site loads, HTTPS active, no redirect loops, www redirects correctly
- Submit sitemap to Google Search Console: search.google.com/search-console
- Request indexing for the homepage in Google Search Console
- Send "You're live!" email to client (see template below)
Go Live Email Template
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
| Check | Pass Criteria |
|---|---|
| Site loads on custom domain | https://clientdomain.com loads the site correctly |
| HTTPS active | Padlock icon in browser; no "Not Secure" warning |
| www redirect works | www.clientdomain.com redirects to non-www (or vice versa) without error |
| Old site is gone | The new site is displayed, not the old site |
| Contact form works on live domain | Submit a test form entry from live domain; confirm receipt in Formspree |
| Sitemap submitted | Sitemap URL submitted in Google Search Console |
Hub API Call (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"
}
- 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
Step 17: Post-Launch Monitoring
- Step 16 Completion Gate satisfied
- Site confirmed live at custom domain
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
| Tool | Setup | Alert Owner |
|---|---|---|
| UptimeRobot | Add 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 Console | Confirm property is verified; check Coverage report for indexing errors. Add quarterback as a user with "Full" access. | Quarterback |
| Cloudflare Analytics | Confirm traffic is being recorded in Cloudflare Pages analytics. Share dashboard access with quarterback. | Quarterback |
48-Hour Check
Return 48 hours after launch and verify:
- Homepage loads correctly — no errors
- Contact form still submits correctly from live domain
- Google Search Console shows no new coverage errors
- UptimeRobot shows 100% uptime since launch
- Quick Google search for business name — confirm new site appears or indexing is in progress
- 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
Step 18: Google Business Profile Sync
- Step 17 Completion Gate satisfied
- Client's Google Business Profile access confirmed
- New website URL live and confirmed
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.
GBP Update Checklist
| Field | Action |
|---|---|
| Website URL | Update to the new live domain |
| Business name | Verify exact match to website and client brief |
| Phone number | Verify exact match to website |
| Address | Verify exact match to website footer |
| Business hours | Verify exact match to website contact page |
| Services list | Update to match the services on the new website |
| Business description | Update to reflect the new website's About copy (150–750 characters) |
| Photos | Upload at least 3 new photos from the website gallery if available |
- 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)
Step 19: Quarterback Handoff
- Step 18 Completion Gate satisfied
- Quarterback assigned for this client
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
| Item | Details |
|---|---|
| Client brief | Completed brief from Step 1, updated with any build changes |
| Live site URL | The final live domain |
| GitHub repo URL | The repo under dotcomdesigniowa for future updates |
| Cloudflare Pages project name | For future deployments |
| SEO strategy URL | The live strategy site from Step 4 |
| Keyword-city matrix | Full matrix for reporting reference |
| Domain registrar credentials | From Step 3 — transfer securely (not via email) |
| Google Search Console access | Confirm quarterback already has "Full" access (set up in Step 17) |
| UptimeRobot monitor | Confirm alert email is set to quarterback (set up in Step 17) |
| Formspree account details | Confirm form submissions are going to the right email |
| Client personality notes | Communication style, preferences, sensitivities noted during the build |
- 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
Step 20: Ongoing Maintenance
- Step 19 Completion Gate satisfied
- Quarterback has confirmed receipt of full handoff package
- Client is active on a monthly plan
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
| Task | Frequency | Notes |
|---|---|---|
| Uptime review | Monthly | Review UptimeRobot report; investigate any downtime events |
| Google Search Console review | Monthly | Check for coverage errors, manual actions, or performance drops |
| Contact form test | Monthly | Submit a test entry from the live site; confirm receipt in Formspree |
| Domain expiration check | Quarterly | Alert client 90 days before expiration |
| SEO performance report | Monthly | Pull keyword rankings and traffic data; send to client |
| GBP review | Monthly | Check for new reviews; flag any Q&A that needs response |
| Content updates | As requested | New photos, updated hours, new services — implement in Claude Code, push to GitHub |
| dateModified schema refresh | Every 6 months | Update the dateModified field in LocalBusiness schema on all pages to current date (AI Factor 25) |
| Annual visual QA | Annually | Full 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
| Stage | Who | Action |
|---|---|---|
| 1. Flag submitted | Build team or reviewer | Submit 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 review | Build lead | Every Monday, review all open Process Flags in the In Flight hub. Group related flags by theme. |
| 3. Triage decision | Build lead | For each flag: (a) Update the Playbook, (b) Update CLAUDE.md, (c) Update Build Prompt, or (d) No action needed. Document the decision. |
| 4. Playbook update | Build lead + Claude Code | Open the playbook repo in Claude Code. Make the specific update. Push to GitHub — Cloudflare Pages auto-deploys the updated playbook. |
| 5. Close the loop | Build lead | Mark 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 Item | What to Ask |
|---|---|
| Flag pattern review | Are the same types of issues recurring on multiple builds? If yes, the Playbook fix isn't working — revisit it. |
| Build Score trend | Is 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 audit | Is the CLAUDE.md file in the playbook repo accurate? If any Playbook step was updated, verify CLAUDE.md reflects it. |
| Build Prompt review | Are there instructions in the Build Prompt that are being missed or misinterpreted? Update the prompt language if needed. |
| New knowledge capture | What did the team learn this month that is not yet in the Playbook? Capture it now before it's forgotten. |
| Playbook version bump | If any changes were made, update the version badge in the Playbook topbar and push to GitHub. |
- Client is live, monitored, and in active account management
- All 20 steps completed and documented
- Quarterback is the primary point of contact going forward
DD System Standards
1. The Four Audit Standards
| Audit | Tool | Pass Standard | Exception |
|---|---|---|---|
| W3C HTML Validation | validator.w3.org | 0 errors (warnings acceptable) | None |
| WAVE Accessibility | wave.webaim.org | 0 errors, 0 contrast errors | None |
| PageSpeed Insights | pagespeed.web.dev | Mobile ≥ 90 Performance; Desktop ≥ 95 Performance; all categories ≥ 90 | None |
| DD AI Audit | ai-audit.dotcomdesignops.com | 32/32 factors | Readability (Flesch-Kincaid) — trade terminology acceptable |
2. The 32-Factor AI Friendliness Framework
🔧 Pillar 1: Technical Infrastructure (7 Factors)
| # | Factor | Build Requirement |
|---|---|---|
| 1 | AI Crawler Allow-listing | robots.txt must explicitly Allow: / for GPTBot, ClaudeBot, GoogleOther, Anthropic-AI, PerplexityBot. Never use Disallow for these agents. |
| 2 | Server-Side Rendering | All HTML/CSS static builds pass automatically. No JavaScript-only content rendering. Critical text in the initial HTML payload. |
| 3 | Mobile Page Speed | 90+ PageSpeed mobile. WebP images with width/height attributes, inline critical CSS, self-hosted or preconnect fonts, no render-blocking scripts. |
| 4 | HTTPS Security | Cloudflare Pages provides HTTPS automatically. Verify SSL is active before final delivery. |
| 5 | Clean XML Sitemap | sitemap.xml at /sitemap.xml listing all pages. Referenced in robots.txt with Sitemap: directive. |
| 6 | Zero Render-Blocking Resources | All scripts use defer or async. CSS inlined for critical above-fold styles. No synchronous third-party scripts in head. |
| 7 | Clean Internal Linking | All 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)
| # | Factor | Build Requirement |
|---|---|---|
| 8 | Answer-First Structure | Every section opens with a direct declarative statement. "We build brick, block, and concrete structures" — not "Are you looking for a contractor?" |
| 9 | Granular Heading Hierarchy | Exactly one H1 per page. H2 for main sections. H3 for sub-items. Never skip levels. |
| 10 | Data-Driven Statistics | Every page: years in business, projects completed, response time, service area radius. Never vague ("years of experience") — always specific numbers. |
| 11 | Numbered Lists for Processes | All "How It Works" and step-by-step content must use ol/li tags. Never plain paragraph text for sequential steps. |
| 12 | Bullet Points for Features | All feature lists and service benefits use ul/li tags. Minimum 2 lists per page with 4+ items each. |
| 13 | Comparison Tables | At least one HTML table per site. Use proper thead/tbody/th/td markup. |
| 14 | Short Paragraphs | All paragraphs 2–4 sentences maximum. One idea per paragraph. Subheadings break up long sections. |
| 15 | Executive Summaries | Homepage and service pages include a "Quick Facts" or "At a Glance" section: who, what, where, why — in 3–5 bullet points. |
| 16 | FAQ Sections | Every page: FAQ section with minimum 5 questions as H2/H3 headings with direct answers. FAQPage JSON-LD schema required. |
| 17 | Active Voice | Write "We install" not "Installation is provided." Write "Call us" not "We can be reached by calling." |
| 18 | Clear Definitions | First paragraph of every service page defines the service in plain language: "Tuckpointing is the process of removing deteriorated mortar..." |
| 19 | Comprehensive Service Details | All services, specialties, service area (every city/county), and credentials in plain HTML text — not images or JavaScript. |
🏆 Pillar 3: Entity & Authority Signals (8 Factors)
| # | Factor | Build Requirement |
|---|---|---|
| 20 | Comprehensive Schema Markup | LocalBusiness/Contractor (all fields including geo, hours, areaServed, datePublished, dateModified), FAQPage on every FAQ section, BreadcrumbList on interior pages, Person for owner. |
| 21 | Author Profiles | About page: owner name, photo, years of experience, credentials, personal story. Required for E-E-A-T. |
| 22 | Author Schema (Person) | Person JSON-LD: name, job title, description, sameAs (social profiles). Add to About page and homepage schema. |
| 23 | Citation of Primary Sources | Every page: 2+ external links to authoritative sources (BBB, GBP, licensing board, industry association, or manufacturer specs). |
| 24 | Text-Based Trust Signals | All trust signals as explicit HTML text — not badge images only. "Licensed & Insured", "BBB Accredited", "25 Years in Business". |
| 25 | Content Freshness | Schema includes datePublished and dateModified. Footer copyright year auto-updates via JS. dateModified refreshed every 6 months. |
| 26 | Consistent NAP | Business name, full street address, city/state/ZIP, phone in plain HTML text in footer of every page. Must match GBP exactly. |
| 27 | First-Party Expert Quotes | At 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)
| # | Factor | Build Requirement |
|---|---|---|
| 28 | The llms.txt File | Create /llms.txt with plain markdown: business name, description, all services, full service area, contact info, hours, FAQs. |
| 29 | AI Disclosure Page | Create /ai page: all services with descriptions, full service area list, team bios, FAQs, brand voice. Link in footer as "AI Info". |
| 30 | Competitor Comparison | "Why Choose Us" on homepage: years of experience, warranty, response time, local ownership, specific techniques. Required differentiators, not generic claims. |
| 31 | Video Transcript Integration | If videos exist on the site, all key information must also appear as text on the page. N/A if no videos. |
| 32 | AI Attribution in Forms | Contact 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
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
| Tool | URL | Purpose |
|---|---|---|
| Command Center | dotcomdesignops.com | Home base — all tools launch from here |
| Website Playbook | website-playbook.dotcomdesignops.com | This playbook — full 20-step build SOP |
| AI Audit Tool | ai-audit.dotcomdesignops.com | DD's 32-factor AI Friendliness Auditor |
| SEO Portal | seo.dotcomdesignops.com | SEO strategy generation |
| In Flight Hub | hub.dotcomdesignops.com | Active project tracking (under development) |
| GitHub Organization | github.com/dotcomdesigniowa | All client site repos |
| Cloudflare | dash.cloudflare.com | DNS, 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.
- Update this page first (System Standards — the source of truth)
- Update the relevant Playbook step page
- Update the Build Prompt Template page if the standard affects what gets built
- Update the Claude Code Workflow page if the standard affects how a build starts
- Update CLAUDE.md in the playbook repo
- Commit all changes to git and confirm Cloudflare Pages deploys the update
- Verify the live production URL reflects the change
Design Standards: What "Beautiful" Means
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.
| Slider | Score 1–3 → Design | Score 4–6 → Design | Score 7–10 → Design |
|---|---|---|---|
| Style | Serif 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. |
| Tone | White/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. |
| Complexity | 3–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. |
| Voice | First-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 Position | Emphasize 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. |
| Aesthetic | Border-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.
| Role | Approved Google Fonts Pairings | Weight Rules |
|---|---|---|
| Display (headings) | Oswald + Source Serif 4 • Montserrat + Lora • Bebas Neue + Open Sans • Playfair Display + Inter | H1/H2: 700 or 800 always. Never thin or light for headings. |
| Body (paragraphs) | Source Serif 4 • Lora • Inter • Open Sans • Nunito | Body: 400 regular. Emphasis: 600 semibold. Line height: 1.65–1.8. |
| Rule | Standard |
|---|---|
| Letter spacing — headings | Display fonts: letter-spacing: 0.02em to 0.08em for headings. Body text: default or -0.01em. |
| Line height — headings | 1.1–1.2 for H1/H2. Body: 1.65–1.8. Never below 1.5 for any paragraph text. |
| Font loading | Always use font-display: swap. Load only weights actually used (typically 400, 600, 700/800). Preconnect to fonts.googleapis.com. |
| Hierarchy | H1 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
| Token | Value | Use |
|---|---|---|
--space-xs | 8px | Icon gaps, tight inline spacing, badge padding |
--space-sm | 16px | Card padding, list item gaps, between label and content |
--space-md | 24px | Component internal padding, between sub-sections |
--space-lg | 40px | Section padding (mobile), between-component gaps |
--space-xl | 64px | Section padding (desktop) |
--space-2xl | 96px | Hero padding, major section separators |
Color Application Rules
| Rule | Standard |
|---|---|
| Primary color usage | Primary 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 variety | Minimum 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. |
| Contrast | WCAG 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 states | Hover: darken 10–15%. Focus: visible ring (for keyboard accessibility). Active/pressed: scale(0.97). |
| Link color | In-body links must be visually distinct from surrounding text. Use brand color + optional underline. |
Component Quality Benchmarks
| Component | Quality Benchmark |
|---|---|
| Hero section | Full-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 cards | Consistent 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 cards | Star 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 sections | Brand primary color as background. Phone number in large type (28px+ desktop). Contrasting button color. Never a plain paragraph with a link. |
| FAQ accordions | Full-width clickable row with visible expand/collapse indicator (+ / - or chevron). Answer indented or padded. Smooth CSS transition. Use details/summary or CSS-only toggle. |
| Navigation | Logo 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. |
| Footer | Dark background. Logo, nav links, phone, full address, hours, copyright (auto-year), license number, AI Info link. Three-column desktop, stacked mobile. |
| Stats/counters | Large 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.
- 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
Tokens & Credentials
Cloudflare
| Item | Location |
|---|---|
| Cloudflare Account | dotcomdesign.com Cloudflare account (dash.cloudflare.com) |
| API Token | Stored in Claude Code project secrets — never in repo files |
| Account ID | Cloudflare dashboard → top right → account ID |
GitHub
| Item | Standard |
|---|---|
| Organization | dotcomdesigniowa |
| Repo naming convention | [client-slug]-website — e.g., markuson-construction-website. Lowercase, hyphens only, no spaces. |
| Visibility | Private for all client repos |
| Default branch | main |
Formspree
| Item | Standard |
|---|---|
| Account | One Formspree project per client. Do not share a form endpoint across clients. |
| Form endpoint format | https://formspree.io/f/[form-id] |
| Notification email | Client's primary contact email from the brief. Not the agency email. |
| Required fields | Name, Phone, Email, Service Needed (dropdown), Message, "How did you find us?" (dropdown) |
| "How did you find us?" options | Google Search, Google Maps, Facebook, Instagram, AI Assistant / Chatbot, Referral, Other |
Marker.io Webhook — In Flight Process Flags
| Item | Value / Notes |
|---|---|
| Webhook Name | In Flight - Process Flags |
| Webhook ID | 69c433808e1933ea9ffdc234 |
| Webhook URL | https://hub.dotcomdesignops.com/api/marker-webhook |
| Webhook Secret | c90cc854acf3f8e9fe210a6f222f5bd4 |
| Event | issueCreated only |
| Issue type filter | Server-side: only Bug type issues processed. All other types silently ignored. |
| Scope | New-process sites only. Do NOT enable "Apply to all websites." |
| Secret stored in | Claude Code project secrets as MARKER_WEBHOOK_SECRET |
Claude Code Build Workflow
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
- Confirm the client's GitHub repo exists under
dotcomdesigniowa(created in Step 3) - Confirm the Cloudflare Pages project is connected to the repo (Step 3)
- Confirm the complete 10-section brief is finalized (Step 5)
- Confirm all assets are in the
/assets/folder (Step 2) - 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 — [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.
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
| Situation | What 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:
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
Build Prompt Template
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
### 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
Error Recovery
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 slow | The 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 fixes | Run 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 Type | Fix |
|---|---|
| Missing alt text | Add 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 label | Add <label for="[input-id]"> above every input, select, and textarea. Never rely on placeholder text as the label. |
| Low contrast error | Use 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 button | Add descriptive text or aria-label to every <button> and icon-only link. Example: <button aria-label="Open navigation menu"> |
| Skipped heading level | Find 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 Type | Fix |
|---|---|
| Duplicate ID | Find all uses of the duplicate id attribute. Make each id unique. Common cause: copy-pasting sections without updating ids. |
| Element not allowed as child | A block-level element (div, p, h2) inside an inline element (span, a). Move the block element outside the inline element. |
| Stray end tag | A closing tag with no matching opening tag. Find and remove it. |
| Attribute not allowed on element | Example: using <a href> on a <div> (not valid). Convert to <a> wrapping the div, or use a <button> with onclick. |
| Bad value for attribute | Check 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
| Factor | Most Common Cause | Fix |
|---|---|---|
| AI Crawler Allow-listing | robots.txt is missing or blocks AI bots | Replace robots.txt with the exact content from Step 6 / System Standards. Verify at /robots.txt after deploy. |
| FAQ Sections | Fewer than 5 FAQs, or FAQs as plain text instead of accordion | Add FAQs to reach minimum 5 per page. Convert to styled accordion with <details>/<summary> or JS toggle. Add FAQPage JSON-LD. |
| Consistent NAP | Phone or address in footer doesn't match GBP exactly | Copy the exact NAP from the GBP listing. Update all footer instances. The exact format must match character-for-character. |
| Author Profiles | About page is missing or doesn't include owner name, photo, and bio | Build the About page owner profile section per the About Page SOP in Step 6. |
| llms.txt / AI Disclosure Page | File doesn't exist or is incomplete | Create /llms.txt and /ai using the templates in Step 11 and Step 6. Link /ai in the footer. |
| Comparison Tables | No HTML table element on the site | Add 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:
- 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?"
- If the issue is a specific element (colors, font, hero image), treat it as a standard revision — fix the specific element.
- 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.
- 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).
- 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)
| Situation | Action |
|---|---|
| Site not loading after 30 minutes | Check 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 content | The 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 domain | Cloudflare 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 working | Confirm 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 downtime | Reassure 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
| Situation | Action |
|---|---|
| Form submits but no email received | Check 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 submission | Check 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 domain | Formspree 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:
- Document the specific issue — what was tried, what the current state is, what error messages appear
- Escalate to the build lead with the full documentation
- 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.
- Document the resolution in a Process Flag via Marker.io so it can be reviewed for Playbook updates