This playbook is built under the 3-tool workflow: Figma for the 20% that carries the brand (hero + MOAT sections), Bricks AI Studio for the 80% that repeats (grids, rows, accordions, chip bars), Claude/Nexus to orchestrate briefs.
NN_type_descriptor · lowercase + underscores · number matches the § in the Section-by-Section spec · starts at 01, no 00_header.Bright Side Plumbing | callbrightside.com | March 2026
⚠️ Core Insight: Bright Side does NOT have separate landing pages.
The existing service pages on callbrightside.com ARE the landing pages.
Every optimization in this playbook applies directly to those service pages.
Run this checklist against every service page before and after optimization. Each item has a pass/fail status showing the current state of callbrightside.com as of March 2026.
| Check | Requirement | Status |
|---|---|---|
| Unique H1 | Every service page must have exactly one H1 tag | VERIFY |
| Keyword in H1 | Primary keyword appears naturally in the H1 | VERIFY |
| H1 length | Between 30 and 65 characters for optimal display | VERIFY |
| No duplicate H1s | No two pages share the same H1 text | FAIL |
| City + Service | Format: "[Service] in Overland Park, KS" or "[City] [Service]" | VERIFY |
Problem: Two different addresses appear across the site and business listings:
| Address | Status | Action |
|---|---|---|
| 12022 Blue Valley Pkwy, Overland Park, KS | CORRECT | Use this everywhere |
| 12022 Blue Valley Pkwy | WRONG | Find and remove/replace on every page, footer, schema, listing |
wp search-replace '12022 Blue Valley Pkwy' '12022 Blue Valley Pkwy' --dry-run| Placement | CTA Type | Target |
|---|---|---|
| Above the fold | Primary CTA button (click-to-call on mobile, form on desktop) | Within 600px viewport height |
| After problem description | Inline CTA with urgency language | After first 2-3 paragraphs |
| After social proof section | CTA with review count reinforcement | Below testimonial block |
| After FAQ section | CTA with "Still have questions?" framing | Bottom of FAQ accordion |
| Page bottom | Full-width CTA banner with phone + form | Final element before footer |
| Sticky mobile bar | Fixed bottom bar with click-to-call | NOT IMPLEMENTED |
Current site has known LCP issues due to hero image loaded via CSS background with JavaScript injection. See Section 9 for full speed fixes.
| Schema Type | Required On | Current Status |
|---|---|---|
| LocalBusiness | Every page (via site-wide template) | NEEDS AUDIT |
| Service | Every service page | NEEDS AUDIT |
| FAQPage | /faqs/ page + any page with FAQ accordion | MISSING on /faqs/ |
| AggregateRating | Every service page | NEEDS AUDIT |
| Review | Pages with testimonials | NEEDS AUDIT |
| BreadcrumbList | Every interior page | NEEDS AUDIT |
Sewer repair is the highest-revenue service page. Every 1% conversion improvement here has an outsized impact on revenue. This page deserves the most aggressive optimization.
| Keyword | Intent | Priority |
|---|---|---|
| sewer repair Overland Park | High commercial | CRITICAL |
| sewer repair Kansas City | High commercial | CRITICAL |
| sewer line repair near me | High commercial + local | CRITICAL |
| sewer repair cost Overland Park | Commercial + informational | HIGH |
| broken sewer pipe repair | High commercial | HIGH |
| trenchless sewer repair Overland Park | High commercial | HIGH |
| sewer camera inspection | Commercial | MEDIUM |
| signs of sewer line damage | Informational (top of funnel) | MEDIUM |
Sewer replacement is the highest-ticket service. Average job value is significantly higher than sewer repair. The page must convey expertise, transparency, and reduce fear about the scope of work.
| Keyword | Intent | Priority |
|---|---|---|
| sewer replacement Overland Park | High commercial | CRITICAL |
| sewer line replacement cost | Commercial + informational | CRITICAL |
| sewer replacement Kansas City | High commercial | HIGH |
| trenchless sewer replacement | High commercial | HIGH |
| sewer pipe replacement near me | High commercial + local | HIGH |
| how long does sewer replacement take | Informational | MEDIUM |
| sewer replacement vs repair | Informational / comparison | MEDIUM |
Problem: Three URLs are competing for water heater keywords, splitting authority and confusing Google about which page to rank.
| URL Pattern | Recommended Action |
|---|---|
| Main water heater service page | KEEP as the canonical page. Consolidate all ranking signals here. |
| Secondary water heater page | 301 REDIRECT to main page. Transfer all internal links. |
| Third water heater page | 301 REDIRECT to main page. Transfer all internal links. |
| Keyword | Intent | Priority |
|---|---|---|
| water heater repair Overland Park | High commercial | CRITICAL |
| water heater replacement Overland Park | High commercial | CRITICAL |
| water heater installation near me | High commercial + local | HIGH |
| tankless water heater Overland Park | High commercial | HIGH |
| water heater leaking | Emergency / commercial | HIGH |
| hot water heater cost | Commercial + informational | HIGH |
| water heater not working | Emergency / informational | MEDIUM |
| tankless vs tank water heater | Informational / comparison | MEDIUM |
Users form an opinion about a page in under 3 seconds. The above-the-fold content must immediately communicate: what you do, why you are trustworthy, and what the user should do next.
[HERO IMAGE / VIDEO BACKGROUND]
[Service] in Overland Park, KS
Fifth-generation master plumber. 4.9 stars from 384+ homeowners. Same-day service available.
| Formula | Example | Best For |
|---|---|---|
| [Service] in [City], [State] | "Sewer Repair in Overland Park, KS" | SEO-focused, primary service pages |
| [Benefit] + [Service] by [Credential] | "Expert Sewer Repair by a Fifth-Gen Master Plumber" | Trust-focused, high-ticket services |
| [Problem]? [Solution]. | "Broken Sewer Line? We Fix It Today." | Emergency/urgent services |
| [Differentiator] + [Service] in [City] | "Trenchless Sewer Repair in Overland Park" | Specific method/approach pages |
| [Social Proof] + [Service] | "Overland Park's Top-Rated Sewer Repair | 384+ 5-Star Reviews" | Competitive differentiation |
The trust bar sits directly below the hero CTA buttons. It must be visible without scrolling on both desktop and mobile.
Additional trust bar elements: "5th-Gen Master Plumber" | "Licensed & Insured" | "Financing Available" | "Locally Owned"
With 60%+ mobile traffic and no sticky CTA, Bright Side is losing calls every day. This is one of the highest-impact, lowest-effort fixes available.
/* Add to Oxygen > Stylesheets > Global CSS */
.sticky-mobile-cta {
display: none;
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 9999;
background: linear-gradient(135deg, #1a6bc4, #0d4f8b);
padding: 12px 20px;
box-shadow: 0 -4px 20px rgba(0,0,0,0.3);
text-align: center;
}
.sticky-mobile-cta a {
display:flex;
align-items: center;
justify-content: center;
gap: 10px;
color: #fff;
font-size: 1.2rem;
font-weight: 700;
text-decoration: none;
}
.sticky-mobile-cta .pulse-dot {
width: 10px;
height: 10px;
background: #4ade80;
border-radius: 50%;
animation: pulse 1.5s infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1);opacity: 1; }
50% { transform: scale(1.5); opacity: 0.7; }
}
@media (max-width: 767px) {
.sticky-mobile-cta { display: block; }
body { padding-bottom: 60px; }
}
/* Hide sticky CTA when user scrolls to footer to avoid overlap */
.sticky-mobile-cta.hidden { display: none !important; }
<div class="sticky-mobile-cta" id="stickyCTA">
<a href="tel:+19135551234">
<span class="pulse-dot"></span>
<span>📞 Call Bright Side Now</span>
</a>
</div>
<script>
// Hide sticky CTA when footer is visible
const footer = document.querySelector('footer');
const stickyCTA = document.getElementById('stickyCTA');
if (footer && stickyCTA) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
stickyCTA.classList.toggle('hidden', entry.isIntersecting);
});
}, { threshold: 0.1 });
observer.observe(footer);
}
</script>
| Location | Phone Format | Notes |
|---|---|---|
| Header (desktop) | Visible number, non-linked | Users on desktop rarely click-to-call |
| Header (mobile) | Click-to-call link | Use tel: link, track with GA4 event |
| Hero CTA button | Click-to-call link | Primary conversion point |
| Mid-page inline CTA | Click-to-call link on mobile, visible number on desktop | After problem/agitation section |
| Sticky mobile bar | Click-to-call link | Always visible on mobile |
| Footer | Click-to-call link | Last resort CTA |
// GA4 phone click tracking (add via GTM or inline)
document.querySelectorAll('a[href^="tel:"]').forEach(link => {
link.addEventListener('click', () => {
gtag('event', 'phone_click', {
event_category: 'engagement',
event_label: link.href,
page_location: window.location.pathname
});
});
});
Based on industry heatmap data for home services pages, these are the optimal form placements:
| Zone | Position | Conversion Impact |
|---|---|---|
| Zone A (highest) | Right sidebar, aligned with hero section (desktop) / Below hero CTA (mobile) | HIGHEST |
| Zone B | After social proof section, full-width | HIGH |
| Zone C | After FAQ section | MEDIUM |
| Zone D | Page bottom, above footer | MEDIUM |
Key insight: Do NOT bury the form below the fold. On desktop, use a sticky sidebar form that scrolls with the user. On mobile, place the primary CTA (phone call) above form, but have a "Schedule Online" option that scrolls to the form.
The current single-step contact form is costing conversions. Industry data shows multi-step forms convert up to 86% better than single-step forms for home services. The psychology: micro-commitments build momentum and reduce perceived effort.
Two recommended approaches:
<!-- Multi-step form structure -->
<div class="bsp-multistep-form" id="bspForm">
<div class="form-progress">
<div class="progress-bar" id="progressBar" style="width:33%"></div>
</div>
<!-- Step 1 -->
<div class="form-step active" data-step="1">
<h3>What do you need help with?</h3>
<div class="service-buttons">
<button class="service-btn" data-value="sewer-repair">
🚧 Sewer Repair
</button>
<button class="service-btn" data-value="sewer-replacement">
🚦 Sewer Replacement
</button>
<button class="service-btn" data-value="water-heater">
🔥 Water Heater
</button>
<button class="service-btn" data-value="drain-cleaning">
🚿 Drain Cleaning
</button>
<button class="service-btn" data-value="other">
🔧 Other Plumbing
</button>
</div>
</div>
<!-- Step 2 -->
<div class="form-step" data-step="2">
<h3>How soon do you need service?</h3>
<div class="urgency-buttons">
<button class="urgency-btn" data-value="emergency">
🚨 Emergency (Today)
</button>
<button class="urgency-btn" data-value="this-week">
📅 This Week
</button>
<button class="urgency-btn" data-value="quotes">
📈 Getting Quotes
</button>
<button class="urgency-btn" data-value="not-sure">
🤔 Not Sure
</button>
</div>
</div>
<!-- Step 3 -->
<div class="form-step" data-step="3">
<h3>Almost done! Where should we reach you?</h3>
<input type="text" name="name" placeholder="Your Name" required>
<input type="tel" name="phone" placeholder="Phone Number" required>
<input type="email" name="email" placeholder="Email (optional)">
<div class="contact-pref">
<label><input type="radio" name="contact" value="call"> Call Me</label>
<label><input type="radio" name="contact" value="text"> Text Me</label>
</div>
<button type="submit" class="submit-btn">Get My Free Quote</button>
</div>
</div>
⭐⭐⭐⭐⭐
4.9 out of 5 Stars
Based on 384+ verified reviews
Google | BBB | Yelp
| Option | Pros | Cons |
|---|---|---|
| Google Reviews widget | Auto-updates, pulls real reviews | External script, potential speed hit |
| Google Places Reviews API | Always current, Google trust | API setup required, rate limits |
| Static HTML widget (manual update) | Zero speed impact, full design control | Must update manually when count changes |
| WP plugin (e.g., Site Reviews) | Easy to manage | Another plugin, potential conflicts |
Recommendation: Use a static HTML widget for speed, update the review count monthly. The 4.9 rating and 384+ count are the key numbers. Exact reviews can be displayed as manually curated testimonials.
<!-- Lite YouTube embed - loads iframe only on click -->
<div class="lite-youtube" data-id="VIDEO_ID_HERE"
style="background:url(https://i.ytimg.com/vi/VIDEO_ID_HERE/hqdefault.jpg) center/cover;
aspect-ratio:16/9;max-width:640px;cursor:pointer;border-radius:10px;position:relative">
<div style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center">
<svg width="68" height="48" viewBox="0 0 68 48">
<path d="M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55C3.97 2.33 2.27 4.81 1.48 7.74.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z" fill="red"/>
<path d="M45 24L27 14v20" fill="white"/>
</svg>
</div>
</div>
<script>
document.querySelectorAll('.lite-youtube').forEach(el => {
el.addEventListener('click', () => {
const iframe = document.createElement('iframe');
iframe.src = 'https://www.youtube.com/embed/' + el.dataset.id + '?autoplay=1';
iframe.allow = 'autoplay;encrypted-media';
iframe.allowFullscreen = true;
iframe.style.cssText = 'width:100%;aspect-ratio:16/9;border:0;border-radius:10px';
el.replaceWith(iframe);
});
});
</script>
Page speed is a direct ranking factor AND a conversion factor. Every 1-second delay in load time reduces conversions by ~7%. Bright Side has several known speed issues that are actively hurting both rankings and leads.
Problem: The hero image is loaded via CSS background-image with JavaScript injection. This is one of the worst patterns for Largest Contentful Paint (LCP) because:
<link rel="preload"> effectively<!-- BEFORE (bad): CSS background with JS injection -->
<div class="hero-section" style="background-image: url('...')">...</div>
<!-- AFTER (good): Standard img tag with fetchpriority -->
<div class="hero-section">
<img
src="hero-image-1200.webp"
srcset="hero-image-640.webp 640w,
hero-image-960.webp 960w,
hero-image-1200.webp 1200w,
hero-image-1920.webp 1920w"
sizes="100vw"
alt="Bright Side Plumbing team in Overland Park KS"
width="1920" height="800"
fetchpriority="high"
decoding="async"
style="width:100%;height:100%;object-fit:cover;position:absolute;inset:0"
>
<!-- Overlay and content on top -->
<div class="hero-content" style="position:relative;z-index:2">...</div>
</div>
<!-- Add to <head> for hero image preload -->
<link rel="preload" as="image" href="hero-image-1200.webp"
imagesrcset="hero-image-640.webp 640w, hero-image-960.webp 960w,
hero-image-1200.webp 1200w, hero-image-1920.webp 1920w"
imagesizes="100vw"
fetchpriority="high">
In Oxygen Builder: Edit the hero section, remove the background image CSS property, and add an Image element inside the section with the attributes above. Use Oxygen's "Custom Attributes" panel to add fetchpriority="high".
Problem: Oxygen Builder generates multiple CSS files that all load in the <head> as render-blocking resources. Until all CSS files are downloaded and parsed, the browser shows a white screen.
<!-- Load non-critical CSS without blocking render -->
<link rel="preload" href="oxygen-styles.css" as="style"
onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="oxygen-styles.css"></noscript>
| Setting | Recommended Value | Notes |
|---|---|---|
| Cache > Enable caching for mobile | ON | Critical for 60%+ mobile traffic |
| Cache > Separate cache for mobile | ON | Required if mobile layout differs |
| File Optimization > Minify CSS | ON | Reduces CSS file sizes |
| File Optimization > Combine CSS | ON | Reduces HTTP requests |
| File Optimization > Optimize CSS delivery | ON (Remove Unused CSS) | Biggest speed win for Oxygen sites |
| File Optimization > Minify JS | ON | Reduces JS file sizes |
| File Optimization > Delay JS execution | ON | Defers non-essential JS |
| Media > LazyLoad images | ON | Except hero image (exclude via class) |
| Media > LazyLoad iframes/videos | ON | Critical for YouTube embeds |
| Media > Add missing dimensions | ON | Prevents CLS |
| Media > WebP Compatibility | ON | Serve WebP if available |
| Preload > Preload links | ON | Preloads pages on hover |
| Preload > Prefetch DNS | Add: fonts.googleapis.com, www.googletagmanager.com | Reduces DNS lookup time |
| CDN | Enable if using LiteSpeed CDN or Cloudflare | Check if LiteSpeed handles this |
no-lazyloadSince the server runs LiteSpeed, there is potential overlap with WP Rocket. Decide on one primary caching solution to avoid conflicts.
Do not run both WP Rocket and LiteSpeed Cache simultaneously for page caching. This causes double-caching issues, stale content, and debugging nightmares.
Schema markup helps Google understand the business, services, reviews, and FAQs. It enables rich results (star ratings, FAQ dropdowns, business info) in search results, which increases click-through rates.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Bright Side Plumbing",
"image": "https://callbrightside.com/wp-content/uploads/bright-side-logo.png",
"url": "https://callbrightside.com",
"telephone": "+1-913-XXX-XXXX",
"address": {
"@type": "PostalAddress",
"streetAddress": "12022 Blue Valley Pkwy",
"addressLocality": "Overland Park",
"addressRegion": "KS",
"postalCode": "66204",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 38.8814,
"longitude": -94.6689
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
}
],
"priceRange": "$$",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "384",
"bestRating": "5",
"worstRating": "1"
},
"sameAs": [
"https://www.facebook.com/callbrightside",
"https://www.google.com/maps?cid=GOOGLE_CID_HERE",
"https://www.bbb.org/us/ks/overland-park/profile/plumber/bright-side-plumbing-0644-XXXXXXX"
],
"areaServed": [
{"@type": "City", "name": "Overland Park"},
{"@type": "City", "name": "Olathe"},
{"@type": "City", "name": "Lenexa"},
{"@type": "City", "name": "Shawnee"},
{"@type": "City", "name": "Leawood"},
{"@type": "City", "name": "Prairie Village"},
{"@type": "City", "name": "Kansas City"}
]
}
</script>
Placement: Add to Oxygen Builder > Settings > Global Settings > Custom Code > Header, or via a code block in the site-wide template. This schema goes on every page.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"name": "Sewer Repair",
"description": "Professional sewer repair services in Overland Park, KS. Camera inspection, trenchless repair, and emergency sewer service by a fifth-generation master plumber.",
"provider": {
"@type": "Plumber",
"name": "Bright Side Plumbing",
"url": "https://callbrightside.com"
},
"areaServed": {
"@type": "City",
"name": "Overland Park",
"addressRegion": "KS"
},
"serviceType": "Sewer Repair",
"offers": {
"@type": "Offer",
"availability": "https://schema.org/InStock",
"priceSpecification": {
"@type": "PriceSpecification",
"priceCurrency": "USD"
}
}
}
</script>
Create a version of this for each service page, changing name, description, and serviceType accordingly.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does sewer repair cost in Overland Park?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Sewer repair costs in Overland Park typically range from $X to $Y depending on the type of repair, pipe depth, and accessibility. Bright Side Plumbing offers free camera inspections and upfront pricing before any work begins."
}
},
{
"@type": "Question",
"name": "How do I know if my sewer line needs repair?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Common signs include slow drains throughout the home, sewage odors, gurgling sounds from drains, wet spots in the yard, and sewage backups. If you notice any of these signs, call Bright Side for a free sewer camera inspection."
}
},
{
"@type": "Question",
"name": "Do you offer trenchless sewer repair?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Bright Side Plumbing offers trenchless sewer repair methods including pipe lining (CIPP) that can fix your sewer line without digging up your yard. Our fifth-generation master plumber will recommend the best method for your situation."
}
}
]
}
</script>
Action items:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"name": "Bright Side Plumbing",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "384",
"bestRating": "5",
"worstRating": "1"
},
"review": [
{
"@type": "Review",
"author": {
"@type": "Person",
"name": "Customer Name"
},
"datePublished": "2026-01-15",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"reviewBody": "Bright Side was amazing. Kalen came out the same day and fixed our sewer line. Honest, fair pricing, and outstanding work."
}
]
}
</script>
Note: The AggregateRating is already included in the LocalBusiness schema above. Only add individual Review schemas on pages that display those specific reviews visibly on the page. Google requires the review content to be visible, not hidden.
Microsoft Clarity is a free heatmap and session recording tool. It shows exactly where users click, how far they scroll, and where they rage-click or abandon. This is essential for data-driven optimization of the service pages.
callbrightside.com as the website URL.
<script type="text/javascript">
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window,document,"clarity","script","YOUR_PROJECT_ID");
</script>
| Filter Name | Configuration | Purpose |
|---|---|---|
| Service Pages Only | URL contains: /services/ OR specific service page URLs | Focus analysis on conversion pages |
| Mobile Sessions | Device: Mobile | Analyze 60%+ of traffic separately |
| High-Intent Pages | URL contains: sewer-repair, sewer-replacement, water-heater | Focus on revenue pages |
| Rage Clicks | Smart Events: Rage Click = true | Find UX frustration points |
| Quick Backs | Smart Events: Quick Back = true | Find pages that don't meet user expectations |
| Behavior | What It Means | Fix |
|---|---|---|
| User scrolls past CTA without clicking | CTA not compelling or not visible enough | Redesign CTA, increase contrast, add urgency |
| User rage-clicks phone number | Phone number is not a clickable link | Make all phone numbers tel: links |
| User scrolls to bottom and leaves | Didn't find what they needed OR no final CTA | Add strong CTA above footer |
| User fills form partially then abandons | Form too long or confusing | Implement multi-step form (Section 7) |
| User clicks navigation repeatedly | Navigation labels unclear | Simplify nav labels, add service-specific links |
| # | Test | Expected Impact | Effort |
|---|---|---|---|
| 1 | Multi-step form vs. single-step form | VERY HIGH | MEDIUM |
| 2 | Sticky mobile CTA vs. no sticky CTA | VERY HIGH | LOW |
| 3 | Hero headline variations (3 versions) | HIGH | LOW |
| 4 | CTA button text ("Call Now" vs. "Get Free Quote" vs. "Schedule Service") | HIGH | LOW |
| 5 | Social proof in hero (with stars vs. without) | MEDIUM | LOW |
| 6 | Form placement (sidebar vs. below hero vs. inline) | MEDIUM | MEDIUM |
| 7 | Trust bar elements (which badges convert best) | MEDIUM | LOW |
| 8 | Before/after photos vs. no photos | MEDIUM | MEDIUM |
| Current Conversion Rate | Minimum Detectable Effect | Visitors Needed Per Variant | At ~100 visits/day |
|---|---|---|---|
| 3% | 50% lift (3% to 4.5%) | ~1,030 | ~21 days |
| 3% | 30% lift (3% to 3.9%) | ~2,900 | ~58 days |
| 5% | 30% lift (5% to 6.5%) | ~1,700 | ~34 days |
| 5% | 20% lift (5% to 6%) | ~3,800 | ~76 days |
All calculations assume 95% confidence level and 80% power. Use Evan Miller's calculator for exact numbers based on current traffic.
Since Google Optimize has been sunset, use one of these free/low-cost alternatives:
// Place in Oxygen > Settings > Global > Scripts > Header
(function() {
var variant = document.cookie.match(/bsp_test=([AB])/);
if (!variant) {
variant = Math.random() < 0.5 ? 'A' : 'B';
document.cookie = 'bsp_test=' + variant + ';path=/;max-age=2592000';
} else {
variant = variant[1];
}
document.documentElement.setAttribute('data-variant', variant);
// Fire GA4 event
if (typeof gtag === 'function') {
gtag('event', 'ab_test_variant', { variant: variant });
}
})();
/* In Oxygen CSS, show/hide based on variant */
[data-variant="A"] .hero-variant-b { display: none !important; }
[data-variant="B"] .hero-variant-a { display: none !important; }
Over 60% of Bright Side's traffic comes from mobile devices. A homeowner with a sewer backup at 9pm is searching on their phone. Every mobile UX failure is a lost customer calling a competitor instead.
| Element | Minimum Size | Spacing | Current Status |
|---|---|---|---|
| CTA buttons | 48px x 48px minimum (Google recommendation) | 8px between adjacent targets | AUDIT |
| Phone number links | Full-width on mobile, 48px height minimum | Isolated (no adjacent links) | AUDIT |
| Navigation menu items | 48px height per item | 8px between items | AUDIT |
| Form fields | 48px height, 16px font-size minimum | 12px between fields | AUDIT |
| FAQ accordion toggles | 48px tap zone | Clear separation between questions | AUDIT |
<!-- Must be in <head> - verify this exists and is correct -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
overflow-x: auto container)max-width: 100%/* Add to Oxygen > Stylesheets > Global */
@media (max-width: 767px) {
/* Prevent horizontal overflow */
body { overflow-x: hidden; }
/* Make all images responsive */
img { max-width: 100%; height: auto; }
/* Ensure tables scroll */
table { display: block; overflow-x: auto;}
/* Minimum font size to prevent zoom on input focus */
input, select, textarea { font-size: 16px !important; }
/* Full-width CTAs on mobile */
.cta-button { width: 100%; text-align: center; padding: 16px; }
}
| Element | Desktop | Mobile | Notes |
|---|---|---|---|
| H1 | 36-42px | 28-32px | Must be readable without zooming |
| H2 | 28-32px | 22-26px | Section headers |
| Body text | 16-18px | 16px minimum | Never below 16px on mobile |
| CTA button text | 16-18px | 16-18px bold | Must be legible at a glance |
| Form labels | 14-16px | 16px | 16px prevents iOS zoom on focus |
| Footer text | 14px | 14px | Acceptable to go smaller in footer |
Critical: iOS Safari will auto-zoom the page when a user taps an input field with font-size below 16px. This is jarring and confusing. Set all form inputs to 16px minimum on mobile.
Users hold their phone with one hand. The "thumb zone" is the area easily reachable by the thumb. On a standard phone:
Home services is a trust-dependent industry. Homeowners are letting a stranger into their home to do expensive work they cannot evaluate. Every trust signal reduces friction and increases conversion.
Display the BBB badge on every page. Link to the BBB profile.
Kalen Barker is a fifth-generation master plumber. This is a massive differentiator.
Display license number. "Fully licensed and insured" on every page.
If BSP offers a satisfaction guarantee, display it prominently.
High-ticket services (sewer replacement, water heater installation) create price shock. Financing options reduce sticker shock and increase conversion on expensive services.
Every high-value service page should have a brief Kalen Barker bio. Homeowners want to know WHO is coming to their home. A named, credentialed person is far more trustworthy than a faceless company.
Meet Kalen Barker
Fifth-generation master plumber. Kansas licensed. A+ rated with the BBB. Kalen brings decades of family plumbing expertise to every job. When Bright Side shows up, Kalen is personally involved in your project from diagnosis to completion.
⭐ 4.9 stars from 394+ reviews
Placement: After the process/how-it-works section on each service page. Always include a real photo of Kalen (professional headshot or on-the-job photo).
| Signal | Homepage | Service Pages | Contact Page | About Page |
|---|---|---|---|---|
| 4.9 stars / 394+ reviews | ✅ | ✅ | ✅ | ✅ |
| BBB A+ badge | ✅ | ✅ | ✅ | ✅ |
| Fifth-generation reference | ✅ | ✅ | ❌ | ✅ |
| Licensed & insured | ✅ | ✅ | ✅ | ✅ |
| Kalen bio block | ❌ | ✅ | ❌ | ✅ |
| Financing available | ✅ | ✅ (high-ticket) | ❌ | ❌ |
| Guarantee / warranty | ✅ | ✅ | ❌ | ✅ |
| Service area | ✅ | ✅ | ✅ | ❌ |
You cannot optimize what you do not measure. These benchmarks give Bright Side a target to aim for and a way to evaluate whether optimizations are working.
| Metric | Poor | Average | Good | Excellent |
|---|---|---|---|---|
| Overall website conversion rate | < 1% | 1-3% | 3-5% | 8%+ |
| Service page conversion rate | < 2% | 2-4% | 4-7% | 10%+ |
| Mobile conversion rate | < 1% | 1-2% | 2-4% | 5%+ |
| Form completion rate | < 10% | 10-20% | 20-40% | 40%+ |
| Click-to-call rate (mobile) | < 2% | 2-4% | 4-7% | 8%+ |
| Bounce rate (service pages) | > 70% | 50-70% | 35-50% | < 35% |
| Avg. time on page | < 30s | 30-60s | 1-2 min | 2+ min |
Sources: WordStream, Unbounce Conversion Benchmark Report, HubSpot, Ruler Analytics (home services vertical)
| Page | Current (Est.) | Target (6 mo) | Stretch (12 mo) | Key Lever |
|---|---|---|---|---|
| Sewer Repair | ~2-3% | 5% | 8% | Multi-step form + sticky CTA + hero optimization |
| Sewer Replacement | ~1-2% | 4% | 6% | Fear reduction copy + financing prominence + CTA frequency |
| Water Heater | ~2-3% | 5% | 8% | Fix cannibalization + emergency CTA + same-day messaging |
| Drain Cleaning | ~3-4% | 6% | 9% | Lower-anxiety service, optimize for speed and ease |
| Homepage | ~1-2% | 3% | 5% | Route users to service pages faster + clear CTAs |
| Contact Page | ~10-15% | 20% | 30% | Multi-step form + reduce fields + add phone option |
| Event Name | Trigger | Weight |
|---|---|---|
phone_click | Click on any tel: link | Primary conversion |
form_submit | Contact form submission (thank you page or form event) | Primary conversion |
form_step_1 | Multi-step form: Step 1 completed | Micro conversion |
form_step_2 | Multi-step form: Step 2 completed | Micro conversion |
chat_started | Live chat initiated (if applicable) | Secondary conversion |
scroll_50 | User scrolls 50% of page | Engagement signal |
scroll_90 | User scrolls 90% of page | Engagement signal |
Ranked by estimated impact and effort. Do these in order:
| # | Action | Impact | Effort | Timeline |
|---|---|---|---|---|
| 1 | Fix NAP inconsistency (12022 Blue Valley Pkwy everywhere) | CRITICAL | LOW | Week 1 |
| 2 | Fix "fourth generation" to "fifth-generation" site-wide | HIGH | LOW | Week 1 |
| 3 | Add sticky mobile CTA (click-to-call) | CRITICAL | LOW | Week 1 |
| 4 | Add FAQPage schema to /faqs/ page | HIGH | LOW | Week 1 |
| 5 | Fix hero image: switch from CSS background to <img> tag with preload | CRITICAL | MEDIUM | Week 2 |
| 6 | Install Microsoft Clarity via GTM | HIGH | LOW | Week 2 |
| 7 | Configure WP Rocket: Remove Unused CSS, Delay JS | HIGH | MEDIUM | Week 2 |
| 8 | 301 redirect duplicate water heater pages | HIGH | LOW | Week 2 |
| 9 | Implement multi-step form on sewer repair page (test) | CRITICAL | MEDIUM | Weeks 3-4 |
| 10 | Optimize sewer repair page (full rebuild per Section 2) | CRITICAL | HIGH | Weeks 3-5 |
| 11 | Add LocalBusiness + Service schema to all service pages | HIGH | MEDIUM | Weeks 3-4 |
| 12 | Optimize sewer replacement page per Section 3 | HIGH | HIGH | Weeks 5-6 |
| 13 | Optimize water heater page per Section 4 | HIGH | HIGH | Weeks 6-7 |
| 14 | Revive blog (dead since Nov 2023) | MEDIUM | MEDIUM | Ongoing |
| 15 | Begin A/B testing on sewer repair page | HIGH | MEDIUM | Week 8+ |
| Issue | Status | Fix Location |
|---|---|---|
| NAP inconsistency: 12022 Blue Valley Pkwy appears (should be 12022 Blue Valley Pkwy) | OPEN | Section 1 |
| Generation claim: "fourth generation" appears (should be "fifth-generation") | OPEN | Section 1 |
| No FAQPage schema on /faqs/ page | OPEN | Section 10 |
| Water heater keyword cannibalization (3 URLs competing) | OPEN | Section 4 |
| Hero image via CSS background + JS injection (hurts LCP) | OPEN | Section 9 |
| 8+ render-blocking CSS files from Oxygen Builder | OPEN | Section 9 |
| No sticky mobile CTA | OPEN | Section 6 |
| Single-step contact form (86% lower conversion than multi-step) | OPEN | Section 7 |
| Blog dead since November 2023 | OPEN | Section 15 Roadmap |
Bright Side Plumbing | Landing Page Optimization Playbook
Prepared by Dove Web Consulting | March 2026
callbrightside.com | 12022 Blue Valley Pkwy, Overland Park, KS
40,847 keywords analyzed. Updated April 2, 2026.
These keywords have high purchase intent but no dedicated page to capture them. Each represents a landing page that should be built.
| Keyword | Cluster | Monthly Volume | Intent | Priority |
|---|---|---|---|---|
| sewer line replacement cost | Sewer | 12,100 | Transactional | P1 |
| emergency plumber near me | Emergency | 33,100 | Transactional | P1 |
| tankless water heater installation | Water Heater | 18,100 | Transactional | P1 |
| drain cleaning service near me | Drain | 14,800 | Transactional | P1 |
| sewer camera inspection cost | Sewer | 8,100 | Transactional | P1 |
| water heater replacement cost | Water Heater | 22,200 | Transactional | P2 |
| clogged main sewer line | Sewer | 6,600 | Transactional | P2 |
| 24 hour plumber | Emergency | 27,100 | Transactional | P2 |
| hydro jetting sewer line | Sewer | 4,400 | Transactional | P2 |
| gas water heater installation | Water Heater | 9,900 | Transactional | P2 |
Organic search represents only 8.3% of traffic. With 40,847 keywords available and blog inactive since November 2023, landing pages with proper keyword targeting will capture dramatically more organic traffic. Every new optimized page adds a net to the funnel.
Customer Intelligence Dashboard contains neighborhood-level data for hyper-local landing page targeting. Use this data to create geo-specific pages (e.g., "sewer repair in Leawood" or "emergency plumber Olathe").
Open Customer Intelligence Dashboard