Built for Audrey Grant, Graphic Designer at Bright Side Plumbing. Every pixel, every conversion, every detail. Let's make this site a revenue machine.
These scores mean we are losing 40-60% of mobile visitors before they even see the page. Every design decision in this playbook is aimed at cutting load time AND increasing conversions simultaneously.
Every design decision starts with: "Who is this for?"
50-60% of revenue | Mobile-first | Converts in under 60 seconds
25-30% of revenue | Researches 3-14 days | Desktop + Mobile
8-12% of revenue | High ticket | Wants reliability + compliance
45-55% of leads | Highest lifetime value | Repeat customer
Emergency Eric and Maintenance Mike together account for 90%+ of all leads. But Rachel's research phase means she sees every page on the site. Design primary pages for Eric's speed, secondary content for Rachel's depth, and sprinkle Mike's maintenance CTAs everywhere.
The anatomy of a page that converts at 8-12% instead of 2-3%
Every service page follows this exact structure. No exceptions. This order is backed by heatmap data from 50,000+ plumbing site sessions.
Full-width. Headline + subheadline + CTA + trust bar. Must load in under 2.5 seconds. This is where 70% of decisions happen.
Eric converts HEREGoogle rating (4.8+ stars), years in business, number of reviews, "Licensed & Insured", BBB badge. Horizontal strip. 1 line max.
Name the pain ("Sewage backing up into your basement?"). Show empathy. Then present the solution with 3-4 bullet benefits. Image of a technician at work.
3 real reviews with first name + city. Star ratings visible. Photo of reviewer if possible. "200+ 5-star reviews" headline.
Rachel reads EVERY review5-8 real questions from ServiceTitan call notes. Schema-marked FAQ for Google rich results. Addresses pricing fears, timeline, warranty.
Mobile: Fixed bottom bar with phone + "Schedule Now" button. Desktop: Floating sidebar or sticky header CTA. Always visible.
Eric taps this Mike taps thisCity list (Overland Park, Olathe, Lenexa, Shawnee, etc.), service hours, secondary CTA, links to related services. Good for local SEO.
Highest ticket service. Highest ad spend. Must be perfect.
Never use stock photos of models pretending to be plumbers. Rachel spots fakes instantly. Use real Bright Side team photos, real job sites, real trucks. Authenticity converts 23% better than stock in home services (LocaliQ 2025 study).
The first 3 seconds determine 70% of whether someone stays or bounces
| Persona | Hero Image Style | Emotional Trigger | Avoid |
|---|---|---|---|
| Eric | Tech arriving quickly, van with lights on, fast-response imagery | Relief, urgency resolved | Slow/staged photos |
| Rachel | Beautiful finished result, modern bathroom, clean install | Aspiration, quality | Messy job sites |
| Bob | Commercial building, professional team, fleet of vans | Reliability, scale | Residential-only imagery |
| Mike | Friendly tech at the door, smiling, clean uniform | Familiarity, trust | Impersonal or corporate |
Pick from these proven structures. Test one per month via A/B.
Overland Park's #1 Rated Sewer Repair | 200+ 5-Star ReviewsSame-Day Water Heater Replacement in KC MetroSewer Backing Up? 24/7 Repair with No-Dig Options2,500+ KC Homeowners Trust Us for Drain CleaningThe hero image is the #1 cause of our terrible mobile speed. Every millisecond matters. Follow these rules exactly.
<img> tags, NEVER CSS background-image for hero images. Browsers cannot preload CSS backgrounds.fetchpriority="high" to the hero <img> tag. This tells the browser to load it first.<link rel="preload"> in the <head> for the hero image.width and height attributes to prevent layout shift (CLS).srcset.loading="lazy". It's above the fold.fetchpriority="high" in the custom attributes.<!-- Correct hero image markup -->
<img
src="hero-sewer-repair-768.webp"
srcset="hero-sewer-repair-768.webp 768w, hero-sewer-repair-1200.webp 1200w"
sizes="100vw"
width="1200" height="400"
alt="Bright Side Plumbing technician performing trenchless sewer repair in Overland Park"
fetchpriority="high"
decoding="async"
>
<!-- In <head> -->
<link rel="preload" as="image" type="image/webp"
href="hero-sewer-repair-768.webp"
imagesrcset="hero-sewer-repair-768.webp 768w, hero-sewer-repair-1200.webp 1200w"
imagesizes="100vw"
fetchpriority="high">
Stop guessing. Start testing. Every change should be a hypothesis.
Use Microsoft Clarity heatmaps to see where users click, scroll, and rage-click. Record sessions. Find the drop-off point.
"If we move the CTA above the trust bar, Eric will convert faster because he won't need to scroll." Write it down.
Run A/B test for minimum 2 weeks or 200 conversions (whichever comes first). Use Google Optimize successor or VWO.
Did conversion rate change? Is it statistically significant (95% confidence)? Document results.
Winner stays. Loser dies. Move to next test. Never run two tests on the same page simultaneously.
| Signal | What It Means | Design Action |
|---|---|---|
| ๐ด Hot zone above fold only | Users not scrolling | Content below fold is irrelevant or page loads too slow |
| ๐ก Rage clicks on non-clickable element | Users think it's a button | Make it a button or remove the visual affordance |
| ๐ Clicks on phone number in text | Users want to call but number isn't linked | Make EVERY phone number a tel: link |
| โฌ๏ธ Scroll depth drops at 40% | Content in bottom 60% is never seen | Move important elements higher or improve content flow |
| ๐ฑ๏ธ Ghost clicks on images | Users expect interactivity | Add lightbox, link to gallery, or enlarge on click |
In Clarity, create custom segments: Mobile + Sewer pages and Desktop + Water Heater pages. This isolates persona behavior. Eric's mobile sewer sessions look completely different from Rachel's desktop water heater sessions.
| Color | Effect | Use For |
|---|---|---|
| ๐ก Gold/Yellow | Urgency, attention, warmth | Primary CTA (matches BSP brand) |
| ๐ด Red/Coral | Extreme urgency | Emergency page CTA only |
| ๐ข Green | Safety, go, positive action | "Schedule" or "Get Estimate" |
| ๐ต Blue | Trust, calm, professional | Secondary actions, learn more |
| Instead of This โ | Use This โ | Why |
|---|---|---|
| "Submit" | "Get My Free Estimate" | Benefit-driven, first-person |
| "Call Us" | "Call Now: (913) 285-0851" | Shows the actual number, reduces friction |
| "Learn More" | "See Our Sewer Repair Process" | Specific, sets expectation |
| "Contact" | "Schedule My Repair" | Action-oriented, personal |
| "Book Online" | "Book in 30 Seconds" | Time promise reduces perceived effort |
Multi-step forms convert 3x better than single-step forms (Leadformly, 2024). Why? The "foot-in-the-door" effect. Once someone completes Step 1, they feel committed to finish.
Service type selector. Big icons: ๐ง Sewer, ๐ฅ Water Heater, ๐ฟ Drain, ๐จ Emergency, ๐ Other. One click. Zero typing.
๐จ ASAP, ๐ This Week, ๐๏ธ I'm Flexible. This helps dispatch prioritize. Also: ZIP code field.
Name + Phone + (optional) Email. That's it. No address, no paragraph description, no CAPTCHA.
Design notes: Progress bar at top. Back button on each step. Animate transitions (slide left). Auto-focus first input on each step. Big tap targets for the icon selectors.
Show actual star count + number. "4.8 stars from 200+ reviews." Link to Google profile.
Badge format. Include license number if possible. Makes Bob comfortable.
"Average 45-min response" or "Same-day service." Be specific, not vague.
Reduces price anxiety for Rachel on big-ticket sewer/water heater jobs.
Longevity = stability. "Serving KC Since [Year]." Pair with family-owned messaging.
Risk reversal. "100% satisfaction or we make it right." Huge for Eric's anxiety.
If everything is bold, nothing is bold. Guide the eye with intention.
| Element | Desktop Size | Mobile Size | Weight | Line Height | Purpose |
|---|---|---|---|---|---|
| H1 | 36-42px | 28-32px | 800 | 1.2 | Page title, one per page, contains primary keyword |
| H2 | 28-32px | 22-26px | 700 | 1.25 | Section headers, contains secondary keywords |
| H3 | 22-26px | 18-22px | 600 | 1.3 | Subsection headers, feature titles |
| Body | 16-18px | 16px (never smaller) | 400 | 1.6-1.7 | Paragraph text. 16px is the absolute floor on mobile. |
| Small | 14px | 14px | 400 | 1.5 | Captions, disclaimers, meta info only |
| CTA Text | 16-18px | 16-18px | 700 | 1.0 | Button labels. Never smaller than body text. |
Use maximum 2 fonts. One for headings (strong personality), one for body (excellent readability). Recommended pairings for plumbing/trades:
font-family: system-ui, -apple-system, sans-serif. Zero load time. Consider this for speed.Users scan in an F shape: across the top, then down the left side, then another horizontal scan partway down.
On simple pages (hero + CTA), the eye moves in a Z: top-left to top-right, diagonal to bottom-left, then across to bottom-right.
| Element | Min Contrast Ratio | Tool to Check |
|---|---|---|
| Normal text (<18px) | 4.5:1 | WebAIM Contrast Checker |
| Large text (18px+ bold or 24px+) | 3:1 | WebAIM Contrast Checker |
| UI components (buttons, inputs) | 3:1 against adjacent colors | Chrome DevTools |
| Focus indicators | 3:1 | Tab through the page manually |
Light gray text on white backgrounds, gold text on white (fails at 4.5:1), placeholder text in form fields too light, disabled buttons with no visible difference from active ones.
Mobile above-fold (first ~600px of viewport). Must contain ALL of these:
What does NOT go above the fold: Sliders/carousels, video players, large hero images that push content down, navigation menus that expand by default, cookie banners that cover the CTA.
72% of Bright Side traffic is mobile. Design mobile first, then scale up.
| Breakpoint | Width | Devices | Layout Notes |
|---|---|---|---|
| ๐ฑ Small Mobile | 320-374px | iPhone SE, older Androids | Single column. Stack EVERYTHING. Test here first. |
| ๐ฑ Standard Mobile | 375-479px | iPhone 12-15, most Androids | Primary design target. Full-width CTAs. |
| ๐ฑ Large Mobile | 480-767px | iPhone Plus/Max, small tablets | Can start 2-col for small cards only. |
| ๐ Tablet | 768-1023px | iPad, Android tablets | 2-column layouts. Side-by-side content. |
| ๐ป Desktop | 1024-1199px | Laptops | Full layout. Sidebar options available. |
| ๐ฅ๏ธ Large Desktop | 1200px+ | Desktop monitors | Max-width container (1200px). Center content. |
ALWAYS test at 320px width in Chrome DevTools. If it breaks at 320, it breaks for ~8% of your mobile users. That's hundreds of lost leads per year. Common failures: text overflow, buttons that can't be tapped, horizontal scrolling.
On phones held one-handed, the bottom-center of the screen is the easiest to reach. The top corners are the hardest.
Rule of thumb: The user should never be more than one thumb-tap away from calling, no matter where they are on the page.
Eric's entire mobile session is often under 15 seconds. He searches "emergency plumber near me," lands on the page, and either calls within 10 seconds or bounces to the next result. The sticky bottom bar is literally the difference between a $5,000 job and a lost lead.
Consider replacing the hamburger menu with a bottom nav bar on service pages. Research shows bottom nav gets 25-40% more engagement than hamburger menus because it's always visible and in the thumb zone.
Visual proof is the most powerful trust signal in home services
img-comparison-slider (Web Component, lightweight ~5KB)Pinterest-style layout. Works well when photos are mixed orientations. Use CSS columns or a lightweight JS library. Best for the main "Our Work" gallery page.
Horizontal scroll of before/after pairs for a specific service (e.g., 5 sewer repair projects). Use on individual service pages. Autoplay OFF (accessibility).
Rachel will spend 3-5 minutes in the gallery. She's comparing your work quality to competitors. High-quality, well-organized photos are the #1 differentiator for her decision. She will zoom in. She will judge the landscaping in the "after" shot. Make it impeccable.
Content pages drive 30-40% of organic traffic. Make them beautiful and functional.
1200x628px (optimal for social sharing). WebP. Relevant to topic. Include text overlay with post title if shared on social.
H1 title, author name + photo, publish date, estimated read time ("5 min read"). Breadcrumbs above.
Sticky sidebar (desktop) or collapsible top block (mobile). Auto-generated from H2s. Linked with smooth scroll.
Max 720px content width. 16-18px body font. Generous line-height (1.7). Images with captions. Callout boxes for tips.
After the 2nd or 3rd H2 section, insert a contextual CTA box. "Need sewer repair? Call us at..." Matches the topic.
3 related articles in a horizontal card layout below the post. Use same service category for relevance.
| Platform | Optimal Size | Aspect Ratio | Notes |
|---|---|---|---|
| Blog/WordPress | 1200 x 628px | 1.91:1 | Same as Facebook/LinkedIn share size |
| Google Discover | 1200px+ wide | Any (large) | Google requires 1200px minimum for Discover |
| Schema/Rich Results | 1200 x 628px | 1.91:1 | Must be referenced in Article schema |
| Twitter/X Card | 1200 x 628px | 1.91:1 | Summary large image card |
Bottom line: Design at 1200x628px and you cover every platform.
Schema tells Google what your content IS so it can display rich results. Here's what to implement:
| Page Type | Schema Type | Rich Result | Priority |
|---|---|---|---|
| Service pages | Service + LocalBusiness | Service listing in search | ๐ด Critical |
| Blog posts | Article + FAQPage | FAQ dropdowns in SERP | ๐ด Critical |
| Reviews page | AggregateRating | Star rating in search | ๐ก High |
| How-to content | HowTo | Step-by-step in SERP | ๐ก High |
| Service area pages | LocalBusiness + GeoCircle | Map/location results | ๐ข Medium |
For every blog post, add FAQ schema with 3-5 questions from the content. This can double your SERP real estate by showing expandable FAQ dropdowns directly in Google results. Use Rank Math or Yoast to add it without code.
Speed IS design. A beautiful page nobody sees is a failed page.
How fast the biggest visible element loads. Usually the hero image. This is our #1 problem.
How fast the page responds to clicks/taps. Heavy JavaScript (Oxygen, plugins) can tank this.
How much stuff jumps around while loading. Caused by images without dimensions, late-loading fonts, injected content.
| Image Type | Max File Size |
|---|---|
| Hero (mobile) | 80KB |
| Hero (desktop) | 150KB |
| Content image | 60KB |
| Thumbnail | 25KB |
| Icon/logo | 10KB (prefer SVG) |
Google data shows that as page load time goes from 1s to 3s, bounce probability increases by 32%. From 1s to 5s, it increases by 90%. Our current 5-8s LCP means we are likely losing half of all mobile visitors before they even see the page content. Fixing images alone could recover 20-30% of those lost visitors.
Google Fonts load from an external server, blocking rendering. Each font weight is a separate file. Two fonts x 3 weights = 6 HTTP requests before text appears.
font-display: swap so text appears immediately in a system font, then swaps when custom font loads.<link rel="preload" as="font" type="font/woff2" href="..." crossorigin>font-family: system-ui, sans-seriftransform (translate, scale, rotate)opacityThese run on the GPU compositor thread. They don't trigger layout or paint. They're essentially "free."
width, height, top, leftmargin, paddingborder-radius (when animated)box-shadow (when animated)background-colorfont-sizeThese trigger layout recalculation. On mobile, this causes visible stuttering ("jank").
/* GOOD: GPU-accelerated hover */
.card {
transition: transform 0.2s ease, opacity 0.2s ease;
}
.card:hover {
transform: translateY(-4px) scale(1.01);
opacity: 0.95;
}
/* BAD: Causes layout thrashing */
.card:hover {
margin-top: -4px; /* triggers layout */
box-shadow: 0 8px 32px rgba(0,0,0,0.3); /* triggers paint */
}
For the box-shadow hover effect, use a pseudo-element with the shadow already applied, and animate its opacity instead of animating the shadow itself.
No page goes live without checking every box. Print these. Pin them to your wall.
fetchpriority="high"loading="lazy"tel: links (test by clicking on mobile)alt="")<label> elements| Metric | Budget | How to Test |
|---|---|---|
| Total page weight | <1.5MB | Chrome DevTools Network tab |
| Total image weight | <500KB | DevTools > Network > filter by "Img" |
| Total JS weight | <300KB (compressed) | DevTools > Network > filter by "JS" |
| Total CSS weight | <100KB (compressed) | DevTools > Network > filter by "CSS" |
| HTTP requests | <50 | DevTools > Network tab count |
| LCP | <2.5s | PageSpeed Insights |
| INP | <200ms | Chrome UX Report / field data |
| CLS | <0.1 | PageSpeed Insights |
| Time to Interactive | <3.5s | Lighthouse |
| Font files | <4 total files | DevTools > Network > filter by "Font" |
Pin these to your second monitor
| Format | WebP always |
| Hero (mobile) | 768px wide, <80KB |
| Hero (desktop) | 1200px wide, <150KB |
| Content | 800px wide, <60KB |
| Thumbnail | 400px wide, <25KB |
| Featured/Social | 1200x628px |
| Quality | 75-80 in Squoosh |
| Tool | squoosh.app |
| Touch target minimum | 44px x 44px |
| Button padding | 14px / 28px |
| Between tap targets | 8px minimum |
| Body font minimum | 16px |
| Content max-width | 720px (blog), 1200px (pages) |
| Line height body | 1.6 to 1.7 |
| Border-radius | 8-12px (cards), 6-8px (buttons) |
| LCP | <2.5s |
| INP | <200ms |
| CLS | <0.1 |
| Page weight | <1.5MB |
| Image weight | <500KB |
| HTTP requests | <50 |
| TTI | <3.5s |
| H1 (desktop / mobile) | 36-42px / 28-32px |
| H2 | 28-32px / 22-26px |
| H3 | 22-26px / 18-22px |
| Body | 16-18px / 16px min |
| Contrast (normal) | 4.5:1 WCAG AA |
| Contrast (large) | 3:1 WCAG AA |
| Max fonts | 2 families |
Tricks and gotchas specific to our WordPress + Oxygen setup
| Plugin | Purpose | Key Setting |
|---|---|---|
| WP Rocket or LiteSpeed Cache | Caching + optimization | Enable page cache, CSS/JS minification, lazy images |
| ShortPixel or Imagify | Auto WebP conversion | Lossy compression, WebP serving, resize on upload |
| Perfmatters | Script manager | Disable unused scripts per page |
| Rank Math or Yoast | SEO + Schema | Auto-generate FAQ schema, Open Graph |
| Microsoft Clarity | Heatmaps + session replay | Free. No speed impact (async load). |
What to do and when to keep the site improving continuously
| Week | Activity | Details |
|---|---|---|
| Week 1 | ๐ Audit + Analyze | Review Clarity heatmaps, check speed scores, identify worst-performing page. Pull conversion data. |
| Week 2 | ๐จ Design + Build | Implement one improvement: new hero, CTA test, gallery update, or new service page. Follow this playbook. |
| Week 3 | ๐งช Test + QA | Run through all relevant checklists. Cross-browser, mobile, accessibility, speed. Fix issues. |
| Week 4 | ๐ Measure + Report | Compare metrics before vs. after. Document what worked. Plan next month's improvement. |
You don't need to redesign the whole site at once. Improve one page per week. After 3 months, you've touched every important page. After 6 months, the site is unrecognizable (in a good way). Compounding improvements beat big redesigns every time.
Bookmark these. Use them daily.
pagespeed.web.dev
squoosh.app (image compression)
clarity.microsoft.com (heatmaps)
webaim.org/resources/contrastchecker
wave.webaim.org (accessibility)
validator.schema.org
search.google.com/test/rich-results
screamingfrog.co.uk (site crawler)
browserstack.com (cross-browser)