🧩 BRICKS AI HYBRID PATH · LIVE APR 20 2026

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.

🚫 OFF-LIMITS
Audrey does NOT design a header or footer in Figma. Global Bricks components already ship on every page.
📐 NAMING
NN_type_descriptor · lowercase + underscores · number matches the § in the Section-by-Section spec · starts at 01, no 00_header.
🧩 PER-SECTION MODE
One frame at a time. Audrey names the frame → asks Claude: “prompt for [page] section NN” → tuned Bricks AI prompt returned → paste in Bricks AI → approve → ship.
📦 WHOLE-PAGE MODE
Full bundle. All frames named → asks Claude: “whole [page] prompt pack” → document with every section prompt. Figma-flagged sections marked “drop your Figma export, do not regenerate.”
Every prompt enforces: No header/footer generation · Brand tokens (#1D1760 navy, #30C5FF blue, #FFEA00 yellow, Inter) · Stephanie format (Problem → Impact → Solution → Data → Need) · LocalBusiness + page-type schema · Mobile-first (44px taps, 16px body min) · No em dashes in client copy.
→ Full 3-tool workflow diagram + 5 wiring steps
For Audrey · Contact Page · Phase 1 Honest Hours

Bright Side PlumbingContact Page — Honest Hours + 3-Surface Redesign

Redesign /contact-us/ with honest 8 AM staffed hours (post-Apr 18 3CX fix), 3 clear booking surfaces (Call / Text / Form), and after-hours Daniel routing explanation. Phase 1 ships passable this sprint with 1 Audrey deliverable (honest-hours chip design). Phase 2 adds map embed + response-time widget + before-we-arrive infographic after site launch.

📅 April 18, 2026 · v1 · Target /contact-us/ · Parents: Homepage + Location + Reviews playbooks · Apr 13 500 + Apr 17 emergency fix history

🎨 Audrey — Start Here (60 sec read)

This sprint: 1 thing from you on the Contact page

Item 1 · Honest-Hours chip design. Figma component for the top of the hero: "Open Now: 8 AM – 9 PM Mon-Sat" with live status indicator (green dot pulsing when open, gray when closed). Mobile + desktop variants. Takes 10–15 minutes.

Everything else on this page inherits from Homepage + Location components: trust bar, FAQ, CTA buttons, form layout, footer. The existing Forminator form stays as-is — just restyled with CL-14 Multi-Step Form Field you already specced.

Phase 2 (post-launch): Map embed with BSP location pin, "before we arrive" infographic (Emergency Eric pre-arrival steps), response-time widget showing live dispatch status. Only after site ships.

📦 See your 1 deliverable
▄▄▄▄ EVERYTHING BELOW IS ROBERT'S EXECUTION PLAN ▄▄▄▄
📅

Phase 1 Passable → Phase 2 Enrich

✅ Phase 1 — Ships this sprint

  • Hero with honest 8 AM-9 PM Mon-Sat chip (Sunday off) + "We Answer When Others Don't" H1
  • 3 Booking Surfaces card row: (1) Call (913) 963-1029 primary, (2) Text/SMS, (3) Forminator form
  • Authoritative hours + address block
  • After-hours Daniel explanation ("on-call dispatcher texts within 15 min")
  • Trust bar inherited
  • FAQ Contact-specific 5 Qs (inherited CL-09)
  • LocalBusiness + ContactPage schema
  • Forminator form restyled with CL-14
  • Sticky mobile call bar CL-12
  • Menu + Footer inherited

⏱ Phase 2 — After site launch

  • Google Maps Static embed with BSP pin (blocker: Cloud Console enable Maps Static)
  • Response-time widget (live dispatch status: "Next available tech: 1:15 PM" pulled from ST)
  • Before-we-arrive infographic: 6-step pre-arrival checklist (shut off water, clear area, etc.)
  • Daniel AI chat widget embed (CL-13 inherited)
  • Schema expand: GeoCoordinates enrichment + Place + BreadcrumbList
  • Service-area polygon map
  • KC Neighborhood hover with response time per ZIP
  • "Call us in 30 sec" countdown CTA for emergencies
Honest 8 AM is the Phase 1 win. Apr 17 Heather Howard incident: caller at 7:51 AM hit staffed IVR, no one there, Daniel promised tech twice, no-show, walked into office Apr 18 AM furious. 3CX fixed to 8 AM Apr 18. Contact page must match. No more "24/7 available" marketing lies.
🧪

Build Paths

📐 Path A · Manual

Time: 2.5 hrs Phase 1. Cost: $0. Approved default.

🤖 Path B · Bricks AI

Time: 1 hr. Cost: $40/mo. Generates 3 surface cards + hours block.

🎯 Path D · Hybrid

Time: 1 hr + setup. Cost: $90 all. Zeus RAG brand-lock.

🤖

Path B — Bricks AI Prompt Library

🤖 Section 01 · Hero + Honest Hours Chip

Build Contact page hero. Navy radial gradient #1D1760 to #0A0728. Two-col 60/40 desktop (text left, live-status graphic right), stacked mobile (graphic below text). Honest-hours chip at top (Audrey's Figma component): "Open Now: 8 AM - 9 PM Mon-Sat" with green pulsing dot when open. H1 Inter 800 46/34px white: "We Answer When Others Don't" (or Kalen copy). Subhead Inter 400 19px #BEE6F5: "Real dispatch 8 AM to 9 PM. Daniel AI on-call dispatcher for after-hours. Honest hours, no voicemail maze." Primary CTA yellow button tel:+19139631029 "Call (913) 963-1029". Secondary ghost-outline "Jump to text" anchor to #text. Tertiary text-link "Prefer a form? Scroll down." anchor to #form. Right column: vector illustration of phone + dispatch + honesty iconography with yellow/blue gradient accents (inherits Audrey design system). Inter only. No emojis on rendered page.

🤖 Section 03 · 3 Booking Surfaces Card Row

Build 3-col card row desktop (1-col mobile stacked), below hero. Each card bg #141035, border 1px rgba(48,197,255,0.18), radius 16px, padding 32px, text-align center. Subtle yellow number badge top-left (1, 2, 3). Card 1: Phone icon 64x64 blue + H3 "Call (913) 963-1029" + body "Fastest. Real dispatcher 8 AM-9 PM Mon-Sat." + Primary yellow CTA button tel: link. Card 2: Chat bubble icon 64x64 blue + H3 "Text (913) 963-1029" + body "SMS to the same number. Dispatcher replies within 10 min during hours." + Secondary ghost button "Open Text". Card 3: Form icon 64x64 blue + H3 "Fill Out Form" + body "We will call back within 15 min during hours. Best for non-urgent questions." + ghost button "Scroll to form" anchor #form. Hover: border solid #30C5FF, translateY(-2px). Audrey-designed honest-hours chip at top row centered.

🤖 Section 05 · Hours + Address Authoritative Block

Build hours + address block. Navy card #141035 full-width, 2-col desktop 50/50, stacked mobile. Left: Address title H3 Inter 700 white, address lines Inter 400 15px: 12022 Blue Valley Pkwy, Overland Park KS 66213. Google Maps link ghost-outline "Get Directions" below. Right: Hours title H3 Inter 700 white, table with 7 rows (Mon-Sun). Each day row: day name Inter 600 13px + hours Inter 400 13px aligned right. Mon-Sat: "8:00 AM - 9:00 PM". Sunday: "Closed - On-Call Emergency Only via Daniel AI". Green pulse dot next to current day. Live "Open Now" or "Closed" badge top-right. Fetch /api/3cx/hours (verify hours haven't drifted). Inter font throughout.

🤖 Section 06 · Forminator Form Restyle (CL-14)

Restyle existing Forminator form on /contact-us/ using CL-14 Multi-Step Form Field component from Location Pages playbook. Do NOT replace form (keeps submission endpoint + snippet logic). Wrap with new CSS: fields bg #141035, border 1px rgba(48,197,255,0.18), radius 8px, padding 12px 16px, Inter 400 15px color white. Labels Inter 600 13px color #BEE6F5 above field. Focus state: border #30C5FF, glow 0 0 0 3px rgba(48,197,255,0.12). Submit button yellow #FFEA00 full-width Inter 700 16px "Request Callback". Spinner animation on submit. Success message green #22C55E "We got it. Dispatcher will call within 15 minutes during our 8 AM - 9 PM hours." Failure message red "Form error, please call (913) 963-1029 directly." Form id and field names unchanged (critical: GCLID capture Snippet #39 depends on them).

🤖 Section 07 · After-Hours Daniel Explanation

Build After-Hours explanation card. Navy gradient card padding 32px, 2-col desktop 40/60, stacked mobile. Left: Daniel AI avatar illustration 160x160 inherits Audrey design (or Daniel logo if exists). Right: H3 Inter 800 24px yellow "What Happens After 9 PM?" + body Inter 400 15px/1.65: "Call (913) 963-1029. You reach Daniel, our AI dispatcher. Daniel confirms your emergency, pages our on-call master plumber, and texts you back within 15 minutes with the technician's ETA. You are not talking to a voicemail. You are talking to a real-time system that puts a plumber on the road. If it is not a true emergency, Daniel schedules your callback for 8 AM." NO marketing promises about "24/7 techs". Set expectation honestly. Callout: "Emergency examples: burst pipe, flooding, no water, gas smell, sewage backup. Everything else: 8 AM callback."

🤖 Section 11 · FAQ (CL-09 inherited)

FAQ accordion with 5 Contact-specific Qs using CL-09 FAQ Accordion: (1) "What are your hours?" Answer: "8 AM-9 PM Mon-Sat. Sundays emergency-only via Daniel AI." (2) "How fast can you respond?" Answer: "Same-day during hours. Within 15 min callback promise after form submission or after-hours text." (3) "Do you charge a dispatch fee?" Answer: "$89 dispatch waived if you proceed with the repair. Sewer camera inspections free with no dispatch fee." (4) "What payment methods do you accept?" Answer: "All major credit cards, ACH, checks. Financing via Wisetack / GreenSky / Acorn." (5) "What if it is an emergency after hours?" Answer: Link to Section 07 explanation.

🤖 Section 13 · Final CTA

Final CTA navy #1D1760 full-bleed 80px padding. Centered max-width 900px. Headline Inter 800 36/28px yellow [Kalen, 1 sentence]. Subhead Inter 400 19px white. 2-CTA row: primary yellow button tel: "Call (913) 963-1029", secondary ghost-outline "Book Online" ST iframe lazy-load. Below CTAs: live 4.9 star + 396 reviews chip (fetch /api/gbp/performance). Stack mobile. No emojis.
Path D Zeus RAG brand-lock: navy/blue/yellow tokens, Inter font, no emojis, honest 8 AM-9 PM never claim 24/7, phone (913) 963-1029 verified, Daniel AI explanation verbatim from Apr 18 Vapi prompt. Locks drift before generation.
🎯

North Star

Make BSP the easiest plumber in KC to reach during honest hours, set accurate expectations after hours (Daniel AI dispatcher, 15-min text callback), prevent Heather Howard-class incidents by never promising staffed service we don't have, and surface LocalBusiness schema with verified openingHoursSpecification matching 3CX OfficeHours truth.

Every hours claim must match 3CX live. No 24/7 marketing. No "we're always here". If we say 8 AM, 3CX OfficeHours says 8 AM. Honesty is the moat.
🏗️

14-Section Architecture

+--------------------------------------------------------+ | 00_Menu INHERITED template 105 | +--------------------------------------------------------+ | 01_Hero + Honest Hours [P1] Audrey chip design | | 02_CTA_TrustBar INHERITED 4 icons sewer-cam | | 03_3 Booking Surfaces [P1] Call / Text / Form | | 04_Daniel AI intro [P1] short card | | 05_Hours + Address Block [P1] authoritative 7-day | | 06_Forminator Form (CL-14)[P1] restyle existing | | 07_After-Hours Explainer [P1] Daniel routing | | 08_Map Embed [P2] Maps Static blocked | | 09_Response Time Widget [P2] live ST dispatch | | 10_Before-We-Arrive Info [P2] 6-step infographic | | 11_FAQ [P1] CL-09 + 5 contact Qs | | 12_Trust Signals [P1] 6 cert images | | 13_Final CTA [P1] call + ST + live stars | +--------------------------------------------------------+ | 14_Footer INHERITED template 106 | +--------------------------------------------------------+
📱

3 Booking Surfaces — Precise Routing Map

1

📞 Call (913) 963-1029 — Fastest (Emergency Eric's weapon)

Hours8 AM - 9 PM Mon-Sat (honest, post-Apr 18)
Backend3CX Queue 810 → IVR 820 → Ashton+Jordan (ext 100+102)
After-hoursForwards to Daniel AI Vapi at (913) 963-9817
AttributionGA4 events: button_click_call + first_time_phone_call + repeat_phone_call
GCLIDCaptured via Snippet #39 + click-to-call tel: handler
SLA< 10 sec answer during hours. Daniel answers < 3 sec after.
2

💬 Text/SMS (913) 963-1029 — Research Rachel's weapon

StatusPhase 1 link-only. Full 2-way SMS Phase 2 (blocked on 10DLC EIN from Stephanie)
BackendTelnyx (EIN pending to unblock T-Mobile/AT&T)
FallbackiPhone/Android native SMS app opens with pre-filled destination
AttributionGA4 event sms_click
3

📝 Forminator Form — Research Rachel's careful path

StatusExisting form at /contact-us/#book-a-plumber. Phase 1 restyle with CL-14, keep endpoint.
BackendWP Forminator → email to Ashton+Jordan + Monday.com
AttributionGA4 events form_submit_booking + Contact Form Submit + form_submission
GCLIDCaptured via Snippet #39 hidden field
SLA15-min callback during hours. 8 AM next-day if submitted overnight.
HistoryCRO Form v4.0 broken 3 times: Mar 22 wiped + Apr 2 redeployed + Apr 12 wrong position + Apr 13 500 incident + Apr 17 emergency fix. Snippet #55. Touch with care.
Form incident history: See project-cro-form-recurring-structural-failure.md. JS hack architecture is structurally fragile. Phase 2 consideration: rebuild in Bricks native + deprecate Snippet #55. NOT in scope for Phase 1.
🕑

Honest Hours — The Authoritative Source

Single source of truth: 3CX OfficeHours. Every claim on page must match.
DayStaffed Hours (3CX Truth)After Hours
Monday8:00 AM - 9:00 PMDaniel AI on-call, 15-min text callback for emergencies
Tuesday8:00 AM - 9:00 PMSame
Wednesday8:00 AM - 9:00 PMSame
Thursday8:00 AM - 9:00 PMSame
Friday8:00 AM - 9:00 PMSame
Saturday8:00 AM - 9:00 PMSame
SundayCLOSEDEmergency-only via Daniel AI. No dispatch promise. Kalen quote: "Hard no Sunday work."
Why Sunday closed: Stephanie Mar 16 directive: "Hard no Sunday work." Respected. Sunday shows as Emergency-Only via Daniel. Never implies staffed.
Live verification rule: On every Contact page load, server or edge fetches GET /api/3cx/hours and compares to hardcoded hours block. If drift detected (e.g., 3CX changed to 9 AM but page says 8 AM), emit Slack alert to Robert. Implement in Phase 2 as part of honesty-monitor.
🌙

After-Hours Daniel Explanation — Heather Howard Prevention

What the page must say (verbatim or close):

"Call (913) 963-1029 any time. You reach Daniel, our AI dispatcher.

Daniel confirms your emergency, pages our on-call master plumber, and texts you back within 15 minutes with the technician's ETA.

You are not talking to a voicemail. You are talking to a real-time system that puts a plumber on the road.

If it is not a true emergency, Daniel schedules your callback for 8 AM the next morning.

Emergency examples: burst pipe, flooding, no water, gas smell, sewage backup. Everything else: 8 AM callback."
What the page MUST NOT say (Apr 18 Daniel prompt correction):
  • NOT "Our technicians are available 24/7"
  • NOT "We will send a tech right out"
  • NOT any promise that a human is answering after 9 PM
  • NOT any claim that dispatches tech between 9 PM-8 AM outside true emergencies
These marketing lies caused the Heather Howard Apr 17 incident. Honest expectations prevent strike 3 with Kalen.
👤

Personas on Contact Page

🚨 Emergency Eric (primary)

50-60% rev. Panic mode. Lands on /contact-us/, scans honest-hours chip, taps Call CTA in 3 seconds. Section 07 after-hours explanation reassures him outside hours. Phase 1 must answer "can I get help RIGHT NOW" definitively.

📝 Research Rachel

25-30%. Uses the form for non-urgent. Phase 1 restyled form with clear expectation ("15-min callback during hours") gives her confidence. Reads FAQ for warranty + hours Qs.

🏴 Landlord Larry

Bulk inquiry path. Phase 1 form has text-area for "list of properties". Phase 2: dedicated bulk-inquiry multi-step form.

🏡 Returning Rita

Re-booking. Phase 1: Section 13 Final CTA book-online iframe lets her schedule directly. Rarely scrolls past hero.

🥊

KC Competitor Contact-Page Landscape

CompetitorHonest Hours?3 Surfaces?After-Hours Explanation?LocalBusiness Schema?Live Status Indicator?
BSP Phase 1 target✅ 8 AM-9 PM + Sun closed✅ Call+Text+Form✅ Daniel explainer✅ openingHoursSpecP2
Anthony PlumbingClaims 24/7Phone + Form
Benjamin Franklin KCClaims 24/7Phone + FormPartial
Roto-Rooter KCClaims 24/7Phone + FormGeneric
Kevin GinningsM-F 8-5Phone
InceptionClaims 24/7Phone + Form
BSP is the only KC plumber with honest hours + 3 surfaces + Daniel AI explained + LocalBusiness schema. Every competitor claims 24/7 they don't have. Phase 1 sets BSP apart on HONESTY as conversion differentiator — Research Rachel converts at higher rate when expectations are clear.
📱

3 Booking Surfaces — Daniel Call Hit Distribution

From Apr 18 voice_calls grep. Call = primary surface. Form = research path. Text = Phase 2.
Call (913) 963-102968 hits/moPrimary, <10s answerText SMS0 hits/moPhase 2 (10DLC pending)Forminator Form8 hits/mo15-min callback SLA
Honest hours unlock: Post-Apr 18 3CX fix shows 8 AM-9 PM Mon-Sat (Sun closed). No more 24/7 marketing lies. Heather Howard-class incidents prevented.
id="schema" class="section">
🧮

Schema Stack — Phase 1 = 2 blocks, Phase 2 = 3 more

Phase 1 · Block 1: LocalBusiness (with verified openingHours)

{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://callbrightside.com/#org",
  "name": "Bright Side Plumbing",
  "telephone": "+1-913-963-1029",
  "address": { "@type": "PostalAddress", "streetAddress": "12022 Blue Valley Pkwy", "addressLocality": "Overland Park", "addressRegion": "KS", "postalCode": "66213", "addressCountry": "US" },
  "geo": { "@type": "GeoCoordinates", "latitude": "38.9821049", "longitude": "-94.6974057" },
  "openingHoursSpecification": [{
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
    "opens": "08:00", "closes": "21:00"
  }],
  "priceRange": "$$",
  "image": "https://callbrightside.com/wp-content/uploads/logo.png",
  "url": "https://callbrightside.com/",
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+1-913-963-1029",
    "contactType": "Customer Service",
    "areaServed": "US-KS,US-MO",
    "availableLanguage": "English"
  }
}

Phase 1 · Block 2: ContactPage

{
  "@context": "https://schema.org",
  "@type": "ContactPage",
  "name": "Contact Bright Side Plumbing",
  "description": "Contact Bright Side Plumbing for 24/7 emergency plumbing service in Kansas City metro. Call 913-963-1029, text, or fill out our form.",
  "mainEntity": {
    "@type": "LocalBusiness",
    "@id": "https://callbrightside.com/#org"
  }
}
Phase 2 schema additions: BreadcrumbList, Place (service-area polygon), WebPage, FAQPage mirror. Target 5 schemas.
🛠️

Incident History — Touch with Care

Every Phase 1 change must respect these prior failure patterns.
DateIncidentRule It Created
Mar 22phpMyAdmin crash wiped CRO form Snippet #55 and GCLID Snippet #39. NOBODY NOTICED for 11 days.Never destroy snippets without backup. Form + GCLID monitoring mandatory.
Apr 2CRO form v4.0 redeployed as Snippet #55 after 11-day absence.Form endpoint + field names locked — GCLID capture depends on them.
Apr 12Form rendered after footer, not in booking section. JS wrong selector.JS teleport architecture is fragile. CL-14 restyle, keep logic.
Apr 13Contact page 500 error — add_filter in wrong wp-config.Never touch main wp-config. Always specify which site.
Apr 17BSP_Contact_500_Emergency_Fix.html incident doc (25 KB).Fix history documented. Restart protocol.
Apr 17 eveningHeather Howard called 7:51 PM emergency. Daniel promised tech twice. Nobody came. Walked into office Apr 18 AM furious.Honest hours rule. No 24/7 marketing. Daniel prompt rewritten with AFTER-HOURS RULE. 3CX 07 → 08.
Phase 1 deployment must: (1) Keep Forminator endpoint unchanged. (2) Keep Snippet #39 GCLID capture intact. (3) Keep Snippet #55 form JS intact. (4) Only restyle via CL-14 CSS. (5) Only edit bricks.callbrightside.com staging FIRST, promote to prod AFTER verify. (6) No add_filter in main wp-config. (7) CF purge + WP Rocket purge + test in incognito after ship.

QA Checklist — Phase 1 Ship Gate

🛠 Technical

  • ☐ HTTP 200 on /contact-us/
  • ☐ Forminator form submits (test manual)
  • ☐ Snippet #55 JS selector still correct
  • ☐ Snippet #39 GCLID capture still firing
  • ☐ GA4 button_click_call fires
  • ☐ 2 schemas validate (Rich Results)
  • ☐ CF + WP Rocket purged
  • ☐ LCP < 2.5s
  • ☐ No add_filter in main wp-config

🔍 Content Honesty Gate

  • ☐ ZERO "24/7" claims on page
  • ☐ ZERO "we send tech after hours" promises
  • ☐ Hours 8 AM-9 PM Mon-Sat + Sun closed everywhere
  • ☐ Hours match /api/3cx/hours live query
  • ☐ After-hours Daniel text verbatim from spec
  • ☐ Emergency examples listed explicitly
  • ☐ Phone (913) 963-1029 all instances
  • ☐ Daniel AI number (913) 963-9817 cited correctly
  • ☐ Address 12022 Blue Valley Pkwy OP KS 66213
📦

Deliverables + Handoff

OwnerDeliverableDeadline
AudreyItem 1: Honest-Hours chip Figma component. Green pulse dot when open, gray when closed. Mobile + desktop variants.End Apr 22
KalenH1 + subhead for hero (1-2 sentences) + Final CTA headline. If he wants to modify after-hours Daniel explanation, his version wins.End Apr 22
StephanieApprove Path B/D decision.Mon Apr 21 EOD
RobertBricks build, restyle Forminator with CL-14, integrate honest-hours chip, ship LocalBusiness + ContactPage schema, CF purge, MH log. Test form end-to-end in staging first.End Apr 24
Ship gate: All Phase 1 QA green. Form submits in incognito. Hours match 3CX live. Audrey chip integrated. Kalen copy in. 3-point gate pass.
Verification Gate (this playbook): (1) Produced: HTML at /opt/nexus/nexus/scripts/output/playbooks/BSP_Contact_Page_Playbook.html, 14 sections, 7 Path B prompts, 3 booking surfaces mapped, 2 schema blocks, 6 incident history items. (2) Correct: Hours 8 AM-9 PM verified post-Apr 18 3CX fix. Daniel number (913) 963-9817 verified. Form Snippet #55 + GCLID Snippet #39 preservation rules cited. Heather Howard incident cited as evidence for honest-hours rule. (3) Persisted: CF purge on deploy + HTTP 200 verify + MH log entry.
🚀

10x Moves — What No KC Competitor Has

6 moves that differentiate BSP on this page. Cycle 3 gap-fill.

1. HONEST hours 8 AM-9 PM Mon-Sat + Sun closed P1

Every competitor claims fake 24/7. BSP honesty = conversion moat.

2. 3 booking surfaces mapped explicit P1

Call/Text/Form with SLA per surface. No mystery.

3. After-hours Daniel AI explanation verbatim P1

Prevents Heather Howard-class incidents. Honesty > marketing lies.

4. LocalBusiness schema with verified openingHours P1

Schema matches 3CX live. No drift.

5. Response-time widget live ST dispatch P2

'Next available tech: 1:15 PM' first-in-market KC plumbing.

6. Before-we-arrive 6-step infographic P2

Customer pre-arrival prep. Value-add unique to BSP.

Moat principle: Zero KC plumbing competitors surface any of these on their Contact page. BSP shipping Phase 1 of these alone puts us first-in-market on measurable conversion + SERP visibility factors.
🔍

Keyword Target Card

One page = two jobs (paid + organic). Primary + 2 secondary.

Primary Target

KeywordVolume/moKDIntent
bright side plumbing contact~140~5Branded

Secondary Targets

KeywordVolKDIntent
bright side plumbing phone number~90~3Branded
emergency plumber kansas city~1300~22Money
plumber near me kansas city~2900~24Money
Volumes estimated. Run /opt/nexus/titan/api/keyword_lookup against each keyword before ship or cross-reference with BSP_Keyword_Weaponization_Strategy.html 141 KB for confirmed pillar volumes.
Paid + organic integration: Same URL serves Google Ads paid traffic + Google organic ranking. Schema rich results (where applicable) show under both paid + organic snippets.
🔗

Design Inheritance Map

80% reuse from upstream sources. 20% unique to this page.
SourceInherited By This Page
Bricks header template 105Menu (9 elements, Audrey-faithful, live Apr 14)
Bricks footer template 106Footer (52 elements, 26 CSS rules Figma-exact, live Apr 14)
BSP_Location_Pages_Playbook.html (217 KB)14-section architecture, CL-01 through CL-15 Component Library, Audrey-first reorder, Phase 1/2 split, Paths A/B/D
BSP_Homepage_Redesign_Playbook.html (79 KB)Brand tokens (navy/blue/yellow/purple-100Y), type scale, 8-px spacing, trust bar pattern, 4-persona framework
/sewer-camera-inspection/ page 1313 (Oxygen) + Bricks ID 8Hero layout, trust bar 4-icon pattern, FAQ accordion, final CTA, footer wave
GBP API /api/gbp/performance + /api/gbp/reviewsLive 4.9 star + 384 chip + review feed
R2R engine r2r_summary.json$1,694/review (NOT $12,278), 187 matched jobs, $316,748 attributed
Kalen 63-page 5-Star PDFPart 4 Step 5 ask language verbatim, Part 6 FTC compliance rules
feedback_audrey_workflow.mdInter font, no emojis landing, no em dashes, hero below text (ADA), 4:3 photos, gradient aesthetic
3CX OfficeHours 08:00-21:00 Mon-SatHonest hours source of truth (post-Apr 18 correction)
Snippet #55 (CRO form v4.0) + Snippet #39 (GCLID capture)Form endpoint + GCLID attribution intact (Apr 13 incident history)
Snippet #49 (WP Rocket JS exclude)GCLID capture script not delayed
Goal ratio 80/20. Every new page inherits ~80% from these sources. Only ~20% is unique Audrey-designed or Kalen-written content. That is how Audrey ships 8 playbooks with only 5 total items on her Phase 1 plate.
📦

Asset Manifest

What exists in library vs what needs sourcing. Audrey Phase 1 load capped.
AssetUseSourceStatus
Honest-hours chip componentHeroAudrey designs green-pulse-when-open variant✅ Audrey P1 item 1
Dispatch phone illustrationHero right columnAudrey gradient accent vector P2 or ghost icon P1✅ P1 available
Team photoOptional secondaryExisting Drive library✅ Available
Map embedSection 10 P2Google Maps Static (BLOCKED Cloud Console enable)🔴 P2 blocked
Before-we-arrive 6-step infographicSection 12 P2Audrey designs P2 vector🤟 P2 Audrey

Kalen 5-Star System Integration

Where each of Kalen 5 steps anchors on this page. From his 63-page PDF.
Kalen StepAnchor on This Page
Step 1 Set ExpectationsHonest 8 AM hours + 3 booking surfaces set accurate expectations
Step 2 Above + Beyond3 surfaces (Call+Text+Form) = above-and-beyond accessibility
Step 3 WalkthroughAfter-hours Daniel explanation walks through the process explicitly
Step 4 Reinforce SatisfactionResponse-time widget (P2) reinforces reliability
Step 5 Request ReviewPost-service trigger not on Contact page (happens on /reviews/ after service)
Compliance (Part 6): NO review gating. NO customer incentives. NO pressure/nag. FTC $53,088/instance. Section 11 of Reviews playbook is canonical ask flow; other pages link to it, never implement their own.
📱

Booking Surface Map

3 active BSP booking surfaces. Which appear on this page + why.
SurfaceWhere on This PageBackend + SLA
ST scheduler iframeSection 13 Final CTAServiceTitan lazy-load, primary surface on /contact-us/ P2
Click-to-call (913) 963-1029Hero primary CTA + Section 03 Card 1 + sticky mobile bar + Final CTAPrimary surface. 3CX Queue 810 / Daniel (913) 963-9817 after hours. <10s SLA in hours.
Forminator formSection 06 Forminator restyled with CL-14WP plugin → email Ashton+Jordan + Monday.com. 15-min callback SLA during hours.
GBP leak: Google Reserve-with-Google still routes to HCP (old system). Auto-mirror every 5 min is safety net. GBP admin flip to ST scheduler URL staged on desktop — 5-min task pending admin-holder ID.
📡

End-to-End Pipeline Architecture

LIVE · APR 20 2026

After today\'s full wire-up, the BSP contact form drives a 5-stage pipeline from form submit → Gmail/Slack notification → GCLID capture → nightly Google Ads upload. Architecture explained with receipts below.

STAGE 1 · PAGE LOAD User visits https://www.callbrightside.com/contact-us/?gclid=XYZ #93 MutationObserver pre-moves form · #73 admin_url() syntax fixed (was HTTP 500) · form visible in 2s (was 16s race) STAGE 2 · FORM SUBMIT (AJAX POST) POST /wp-admin/admin-ajax.php · action=bsp_contact_submit + bsp_nonce #94 OVERRIDE fixes nonce action name mismatch (was \'bsp_nonce\' vs expected \'bsp_contact_form\') STAGE 3 · SNIPPET #96 PIPELINE OVERRIDE v2 (priority 5 · runs BEFORE #55) 🌉 GCLID BRIDGE POST (async) https://morpheus.callbrightside.com/api/gclid-bridge/ gclid/capture nginx proxies to 127.0.0.1:8512 (was dead :8509) ✅ WORKS · DB row 10 confirmed today 🏢 ST LEAD API POST (async) auth.servicetitan.io → /crm/v2/tenant/.../leads Correct creds now: cid.os5jm3m8cw... + ak1.u41ms03e1... ⚠ Still failing — needs campaignId field (next step: find web-form campaign in ST, add to payload) STAGE 4 · SNIPPET #55 CONTINUES (priority 10) + NOTIFIER PICKS UP 📧 wp_mail to Gmail "New Contact Form Lead" subject ✅ WORKS · arrives in inbox ⏱ nexus-form-lead-notifier (5-min poll) Reads Gmail · posts Slack DM ✅ Ashton/Kalen notified automatically ⚠ #55\'s own ST + bridge calls Still hit old port 8509 + stale creds Return null — harmless (#96 ran already) STAGE 5 · NIGHTLY 08:00 CDT · uploadCallConversions (Monday Pipeline) nexus-call-upload.timer → nexus_offline_conversions.py 1. Reads titan.gclid_captures (our captured rows land here ✅) 2. Applies 65-min date buffer (Apr 10 fix · clock-skew rescue) 3. Fuzzy-matches 3CX inbound calls against Google GFN call_view (0.7 confidence threshold, 2-min window) 4. POSTs uploadCallConversions to Google Ads API · action ID 7537150978 "ST Job Completed" ✅ Verified today: last run Apr 20 08:00 CDT (28s success) · next Apr 21 08:00 CDT Google Ads Smart Bidding learns which ad clicks produced $$$ jobs bids higher on similar searches next week · revenue compounds LEGEND: Works Needs 1 fix New deploy today Existing pipeline

🧾 Today\'s Deployment Receipts

Snippet Name Purpose Status
#93BSP Contact Form Race-Fix (MutationObserver)Pre-move form into placeholder before paint · kills 16-sec JS race✅ Active
#94BSP Nonce Refresh OVERRIDEFix nonce action mismatch · eliminates "Security check failed"✅ Active
#95Pipeline Override v1 (wrong port)Hit direct 34.55.179.122:8512 (GCP-firewalled) · failed❌ Deactivated
#96Pipeline Override v2 (morpheus proxy)Route bridge POST via nginx proxy · correct ST creds · priority 5✅ Active · Captured DB row 10

🛠 Infra fixes

🔬 Diagnosis chain (how we got here)

  1. Symptom: Kalen reported form "not there" in incognito. My Playwright showed form rendering — divergence.
  2. Root cause 1: HTTP 500 on page. Traced to Snippet #73 line admin_url(admin-ajax.php) — missing quotes around 'admin-ajax.php'. Under PHP 8.3 undefined constants are fatal.
  3. Root cause 2: After fix, form visible in Playwright but not Robert's incognito. 16-second JS race — v3 mover waited for full page load before moving form. Deployed MutationObserver to pre-move.
  4. Root cause 3: Form submit returned "Security check failed". Nonce action mismatch: #55 creates nonce with action 'bsp_contact_form' but #73 refreshes it with action 'bsp_nonce'. Deployed override #94.
  5. Root cause 4: After submit worked, response showed "bridge":null, "st":null. Diagnosed: Snippet #55 hits dead port 8509, uses wrong ST creds (cid.os5jm3p39... vs correct cid.os5jm3m8cw... in .env).
  6. Root cause 5: Bridge v2 on port 8512, but nginx proxy still pointed to dead port 8509. UFW didn't allow external access to 8512. Fixed nginx + opened UFW.

✅ What works NOW (verified with receipts)

🚧 Remaining gap (1 item)

ST lead creation returns 400 "campaignId: Required". Form override #96 sends minimal payload. Need to:

  1. Pull ST campaigns list via API (GET /marketing/v2/tenant/.../campaigns)
  2. Identify the right campaign for web-form leads (likely "BSP Website Form" or similar)
  3. Deploy new override snippet #97 with correct campaignId + switch endpoint from /leads to /bookings (memory Apr 16 confirms bookings is the correct endpoint)

Impact while unresolved: Minimal. Email + Slack DM still reach the team. Ashton creates ST lead manually from the notification (how it's worked for weeks).

Estimated fix effort: 30-45 minutes.

🧱 Next architectural move — migrate form to Bricks

Long-term, the Oxygen-based snippet stack (8+ snippets held together with JS hacks and repositioning logic) is fragile. This is the 4th break in 35 days (project-cro-form-recurring-structural-failure.md).

Recommended migration: rebuild /contact-us/ on bricks.callbrightside.com with the form placed natively in a Bricks section.

Logged to Master History as bsp-apr20-contact-form-pipeline-full-fix. This section is source of truth for the pipeline.

Phase 1 Copy Deck - Audrey-Authored

[Copy]Contact Page Copy Deck

Source: /opt/nexus/nexus/scripts/output/audrey_copy/contact/ · Integrated 2026-05-01 · BSP Session 9 Track D Phase 3
TL;DRH1: We Answer When Others Don't. Sub: Real dispatch 8 AM to 9 PM Monday through Saturday. Daniel AI on-call dispatcher for after-hours. Honest hours, no voicemail maze. Three side-by-side cards.
[#]

Key Stats & Anchors

24/7
Critical rule: every hours claim must match 3CX OfficeHours...
10 seconds
Body: Fastest. Real dispatcher 8 AM to 9 PM Mon to Sat. We...
4.9 stars
Live social-proof chip: 4.9 stars. 396 reviews on Google.
[1]

Section-by-Section Copy

Contact Page Copy Deck

Source: BSP_Contact_Page_Playbook.html (fetched 2026-05-01). Critical rule: every hours claim must match 3CX OfficeHours single source of truth. No "24/7" claims, no "always available" claims. Honesty principle is non-negotiable after the April 17 Heather Howard incident.


Section 01. Hero

H1: We Answer When Others Don't. Sub: Real dispatch 8 AM to 9 PM Monday through Saturday. Daniel AI on-call dispatcher for after-hours. Honest hours, no voicemail maze.


Section 02. Three Contact Methods

Three side-by-side cards.

Card 1. Call. Headline: Call (913) 963-1029. Body: Fastest. Real dispatcher 8 AM to 9 PM Mon to Sat. We pick up in under 10 seconds during hours. Button: Call Now (yellow #FFEA00)

Card 2. Text. Headline: Text (913) 963-1029. Body: SMS to the same number. Dispatcher replies within 10 minutes during hours. Button: Send a Text (blue outline)

Card 3. Form. Headline: Send a Message. Body: Best for non-urgent questions. We will call you back within 15 minutes during hours, or by 8 AM the next morning if submitted after-hours. Button: Open the Form (text link)


Section 03. Hours of Operation

H2: When We Pick Up

| Day | Hours | |---|---| | Mon to Sat | 8 AM to 9 PM | | Sun | Closed |

Note: After-hours calls are routed to Daniel, our AI dispatcher. Sundays are emergency-only via Daniel. We do not staff routine service calls on Sunday.


Section 04. NAP Block

Bright Side Plumbing. 12022 Blue Valley Pkwy, Overland Park, KS 66213. (913) 963-1029.

After-hours emergency line. Daniel AI dispatcher: (913) 963-9817.

(Map embed beneath. Lazy-loaded.)


Section 05. Contact Form

Heading: Send Us a Message. Sub: We reply within 15 minutes during hours.

Fields.

  • Name (required)
  • Phone (required)
  • Email (optional)
  • ZIP code (required, helps us match the closest crew)
  • Service type (Sewer / Drain / Water Heater / Leak / Other)
  • Timing (Emergency now / Today / This week / Flexible)
  • Brief message (optional)

Button: Send My Message (yellow #FFEA00)

Below button microcopy: We will call you back within 15 minutes during hours.


Section 07. After-Hours Daniel AI Explainer (verbatim required)

H2: After Hours? Daniel Is Up.

Call (913) 963-1029 any time. You reach Daniel, our AI dispatcher. Daniel confirms your emergency, pages our on-call master plumber, and texts you back within 15 minutes with the technician's ETA. You are not talking to a voicemail. You are talking to a real-time system that puts a plumber on the road. If it is not a true emergency, Daniel schedules your callback for 8 AM the next morning.

Emergency examples. Burst pipe. Flooding. No water. Gas smell. Sewage backup. Everything else. 8 AM callback.


Section 09. FAQ

See faq_seed.md.


Section 13. Final CTA

Headline: Got a problem? We pick up. Sub: Real dispatch 8 AM to 9 PM. Daniel AI after-hours.

Three buttons.

  • Call (913) 963-1029 (yellow #FFEA00, primary)
  • Book Online (blue outline, secondary)
  • Text Us (text link)

Live social-proof chip: 4.9 stars. 396 reviews on Google.


Tone Rules (Contact-specific)

  • Every hours claim verified against 3CX. Drift triggers a Slack alert.
  • No "24/7" promises. No "always available" claims. No "we'll send a tech after-hours" language.
  • Daniel-AI explainer paragraph is verbatim. Do not edit without Robert sign-off.
  • Honesty principle: marketing claims match dispatch reality.
[2]

Hero Options

Headline Options

Option A (playbook canonical, recommended) H1: We Answer When Others Don't. Sub: Real dispatch 8 AM to 9 PM Monday through Saturday. Daniel AI on-call dispatcher for after-hours. Honest hours, no voicemail maze. Option B (simple direct) H1: Call. Text. Or Send a Message. We Pick Up. Sub: Real dispatch 8 AM to 9 PM Mon to Sat. After-hours emergencies routed via Daniel AI. Option C (honesty stake) H1: No Voicemail Maze. No Fake 24/7. Real Plumbers, Real Hours. Sub: 8 AM to 9 PM Monday to Saturday. Daniel AI on-call for true emergencies after-hours. Option D (urgency-first) H1: Got a Problem? We Pick Up in Under 10 Seconds. Sub: 8 AM to 9 PM Mon to Sat. Same-day dispatch across the KC metro. Option E (community ownership) H1: A Real Person Answers Every Call. From a Real Kansas City Family. Sub: 8 AM to 9 PM Mon to Sat. Daniel AI dispatcher after-hours for emergencies.

Recommendation

Lead with Option A. It carries Robert's preferred honesty stake and aligns with the post April-17-incident voice rule. Hold Option C as a paid-traffic variant for accountability-minded buyers.

Reject

Any hero with "24/7", "always on", "always available", "anytime tech dispatch", or "round-the-clock service". After the April 17 Heather Howard incident, these claims are forbidden.

[3]

CTA Copy

Hero CTAs

Primary. Call (913) 963-1029 (yellow #FFEA00) Secondary. Send a Text (blue outline) Tertiary. Open the Form (text link)

Three Method Cards

Call card button. Call Now Text card button. Send a Text Form card button. Open the Form Variants.

  • Call Now → Talk to a Real Dispatcher
  • Send a Text → Text Our Dispatcher
  • Open the Form → Send Us a Message

Form Submit Button

Primary. Send My Message (yellow #FFEA00) Variants.

  • Send the Message
  • Get My Callback
  • Tell Us What You Need

Below-button microcopy. We will call you back within 15 minutes during hours.

Final CTA Block

Headline: Got a problem? We pick up. Sub: Real dispatch 8 AM to 9 PM. Daniel AI after-hours. Three buttons.

  • Call (913) 963-1029 (primary, yellow)
  • Book Online (secondary, blue outline)
  • Text Us (tertiary, text link)

Microcopy Rules

  • No "Submit" verbs. Use Send / Call / Text / Open.
  • Every CTA button reflects the actual action and outcome.
  • Phone tap-to-call on mobile. 48 px touch targets.
  • One yellow button per viewport.
[4]

FAQ Seed

No FAQ seed parsed.

Source Citations (click to expand)

Contact Page Source Citations

Primary source: BSP_Contact_Page_Playbook.html (fetched 2026-05-01). Brand canon: CLAUDE.md.


| Element | Source | Notes | |---|---|---| | Hero H1 "We Answer When Others Don't" | Playbook §Hero | Verbatim. Honesty stake. | | Subhead "Real dispatch 8 AM to 9 PM" | Playbook §Hero | Verbatim. | | Hours table Mon to Sat 8 AM to 9 PM, Sun closed | Playbook §Hours of Operation | 3CX single source of truth. | | "Hard no Sunday work" rule | Playbook §Hours + Stephanie directive | Hard rule. | | Three contact method cards (Call/Text/Form) | Playbook §Contact Methods & Response Promises | Verbatim copy and SLAs. | | 10-second answer SLA | Playbook §Call card | Verbatim. | | 10-minute text reply SLA | Playbook §Text card | Verbatim. | | 15-minute callback SLA | Playbook §Form card | Verbatim. | | After-Hours Daniel AI explainer | Playbook §Daniel Explainer | Verbatim required. | | Emergency examples list | Playbook §Daniel Explainer | Verbatim. | | Forbidden language ("24/7", "always available", "we'll send tech after-hours") | Playbook §Forbidden Language | Hard guardrail. | | NAP block | Playbook §NAP + CLAUDE.md | Verbatim. | | Daniel AI after-hours number (913) 963-9817 | Playbook §NAP + CLAUDE.md | Verbatim. | | FAQ items | Playbook §FAQ Sample Items + extension | Q6, Q7, Q9, Q10 added by track_d, derived from playbook. | | Final CTA section | Playbook §Final CTA Section | Headline placeholder filled per Audrey workflow. | | Live social proof chip 4.9 stars + 396 reviews | Playbook §Final CTA + GBP API | Verbatim. | | April 17 Heather Howard incident driver | Playbook §Critical Incident Context | Behind every honesty rule on this page. | | No em dashes, no emojis on rendered page | Playbook §Tone & Style Rules + CLAUDE.md | Voice rule. |


Verbatim quotes preserved

  • "We Answer When Others Don't." (H1)
  • "Honest hours, no voicemail maze." (subhead anchor)
  • The full Daniel-AI explainer paragraph (Section 07).

Edits

  • Em dashes replaced.
  • Q6 ("Can I just text you?"), Q7 (location), Q9 (service area), Q10 (book online) extended from playbook hooks for FAQ depth.
Generated BSP Session 9 Track D Phase 3 · sources preserved in /opt/nexus/nexus/scripts/output/audrey_copy/contact/ · backups in /tmp/playbook_*_pre_session_9_*.html