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.Page Strategy + Menu Restructure
Paid traffic and organic traffic land on the same URL. Every service page we build does double duty: it converts Google Ads clicks AND ranks for free search traffic.
Landing pages ARE service pages. One URL. One page. Two jobs.
Everything else in this playbook is Robert's execution plan. You don't need to read past this section unless you want to.
Section 2
This is the only section you need to read. Everything below it is Robert's execution plan.
You design ONE template. That's it.
One page, your vision, your baby. Every service page on the site will use this template. Sewer, drains, water heaters, emergency -- all of them. You design it once. That's the job.
Once your template is live, Robert copies it for every new page.
You don't design 6 pages. Robert handles duplicating the template, swapping out content, and adding pages to the menu. You build the foundation, he builds the house on top of it.
When we need a hero image for a new page, we'll ask you ONE at a time.
No rush. Each service page needs a hero image. We'll send you a brief for each one individually, with the service name and any specific direction. No batch requests. One at a time, at a comfortable pace.
Your design specs (confirmed):
Your mockup is already in the Drive.
Kalen loved the direction. The initial mockup you put together got a thumbs up. The direction is right. Now it just needs to become a real Oxygen template.
Everything below this section is Robert's execution plan. You don't need to read it unless you're curious.
Playbook Rule
If Audrey is involved in a playbook or implementation doc, her section goes at the TOP, clearly separated, with a note that everything else is for Robert. This applies to every future playbook.
Section 3
The existing flat menu is missing entire service categories. Customers searching for these services never find Bright Side.
Section 5
These search terms have massive national volume. Without pages targeting them, Bright Side does not exist for these searches.
Section 6
Exact WordPress REST API calls. The site used Oxygen Builder pre-cutover; now on Bricks Builder 2.3.2 (May 2026) with a standard WP nav menu (menu-main_top).
| Action | Method | Endpoint | Status |
|---|---|---|---|
| Remove Septic from menu | DELETE |
/wp-json/wp/v2/menu-items/{septic_id} |
Ready |
| Create parent menu items (Sewer, Drains, Water Heaters, Emergency, Other) | POST |
/wp-json/wp/v2/menu-items |
Ready |
| Move existing pages under parents | PATCH |
/wp-json/wp/v2/menu-items/{id} with parent: {parent_id} |
Ready |
| Add "FREE Camera Inspection" CTA to nav | POST |
/wp-json/wp/v2/menu-items with classes: ['cta-yellow'] |
After page exists |
| Action | Method | Endpoint | Status |
|---|---|---|---|
| Create new page (e.g., /sewer-camera-inspection/) | POST |
/wp-json/wp/v2/pages |
Need Content |
| Apply Bricks template (POST /wp-json/bsp/v2/db/native-save with _bricks_page_content_2 elements) | POST |
/wp-json/wp/v2/pages/{id} + meta |
Need Template |
| Add page as menu item under parent | POST |
/wp-json/wp/v2/menu-items |
API Call |
| Add FAQPage + PlumbingService schema | POST |
Rank Math or inline <script type="application/ld+json"> |
API Call |
| Assign blog category for related posts | POST |
/wp-json/wp/v2/categories |
API Call |
menu-main_top (standard WP menu, not Oxygen custom)ukueq_Section 7
One page per week. Menu grows as pages go live. Audrey works project-by-project, never dump multiple pages on her.
Audrey design finalized. Template ported to Bricks (PID 8 sewer-camera as canonical shell). One template, reused for all service pages.
/sewer-camera-inspection/ goes live. Added to menu under Sewer. Google Ads pointed here. 190K/mo search volume.
/sewer-line-replacement/ + /sewer-cleanout/ go live. Both added to Sewer menu category. 184K combined searches.
/emergency-plumbing/ + /water-heater-replacement/ go live. New Emergency and Water Heater categories created in menu. 411K combined searches.
Hydro Jetting, Clogged Drain, Tankless Water Heaters, Burst Pipe Repair, Fixture Repair. Each one builds out the menu and captures more searches.
Section 8
Blog posts appear at the bottom of matching service pages. Internal linking strengthens both the service page (authority) and the blog post (traffic). One Code Snippet. No plugin needed.
| Category | Posts | Service Pages |
|---|---|---|
| Sewer | 7 | 6 pages |
| Drains | 8 | 3 pages |
| Emergency | 3 | 3 pages |
| Water Heaters | 4 | 3 pages |
| General Plumbing | 5+ | Other pages |
Section 9
Clear ownership. No overlap. No ambiguity.
Designer
Master Plumber / Copy
Developer / SEO / Ads
Section 10
This playbook covers WHAT pages to build and WHERE they go in the menu. These three playbooks cover HOW to build them, WHAT goes on them, and HOW they look.
This Playbook = WHAT + WHERE | CRO = HOW IT CONVERTS | Sewer Brief = CONTENT | Template Brief = DESIGN
Section 11
Conservative estimates based on 1% KC metro share of national search volume, 3% click-through rate, 15% booking rate from BSP historical data.
| Missing Page | National Vol | Est. KC Searches | Est. Monthly Clicks | Est. Monthly Bookings | Avg Ticket | Monthly Revenue |
|---|---|---|---|---|---|---|
| Water Heater Replacement | 246K | 2,460 | 74 | 11 | $2,800 | $30,800 |
| Sewer Camera Inspection | 190K | 1,900 | 57 | 9 | $299 | $2,691 |
| Camera leads convert to $5K-$15K sewer jobs at ~35% close rate | + $15,750* | |||||
| Sewer Cleanout | 184K | 1,840 | 55 | 8 | $450 | $3,600 |
| Emergency Plumbing | 165K | 1,650 | 50 | 7 | $650 | $4,550 |
| Sewer Smell / Gas | 126K | 1,260 | 38 | 6 | $350 | $2,100 |
| TOTAL POTENTIAL | 911K | 9,110 | 274 | 41 | $59,491/mo | |
Methodology: National search volume from SEMRush. KC metro estimated at 1% of national (conservative for a metro of 2.2M). Click-through rate at 3% for organic position 5-10 (first 6 months). Booking rate at 15% (BSP historical). Average ticket from ServiceTitan job data. Camera inspection upsell at 35% close rate (Kalen's reported close rate for sewer jobs). These are conservative floor estimates, not projections.
Source: BSP_Menu_Page_Strategy_Playbook.html (fetched 2026-05-01).
Important note. The Menu Page Strategy playbook is primarily a nav/menu and service-page architecture doc, not a price-menu copy spec. Detailed price display rules live in the Sewer Brief and Landing Page CRO Playbook (cited but not in scope here). Track_d shipped a service-menu landing page deck below as a reasonable interpretation of "menu page": the index page that lists all our plumbing services with transparent pricing for each. Audrey can confirm interpretation.
H1: Plumbing Services with a Price Menu You Can Actually See. Sub: Sewer, drain, water heater, leak repair. Flat-rate prices, posted publicly. Family-owned since 1940.
CTAs.
4.9 Google (384+) Β· BBB A+ Β· 5 Generations Β· Same-Day Β· Licensed and Insured Β· Free Estimates
H2: Why We Post Our Prices.
Most KC plumbers hide their prices behind a dispatch fee and a sales pitch. We do not. We publish flat-rate pricing for every common service so you walk into the conversation knowing the number.
A free sewer camera inspection is free. A drain unclog starts at $99. A water heater swap has three real numbers depending on the tank you need. We will tell you the price before we touch a tool.
Service category cards in priority order. Each card lists service, starting price, what's included, and "Learn More" link to the dedicated service page.
Starting at: $3,500 (trenchless spot repair). What's included: Free camera inspection. Flat-rate written quote. Two-year workmanship warranty. Link: Learn More about Sewer Repair
Price: Free with any sewer repair $500 or over. $189 standalone. What's included: HD camera footage. On-the-spot diagnosis. Written report. Link: Learn More about Sewer Camera Inspections
Starting at: $99 (single drain). What's included: Snake or hydro-jet, depending on the clog. Unclog or it's free. Link: Learn More about Drain Cleaning
Starting at: $1,895 (40-gallon tank install). What's included: Removal of old unit. New unit install. Disposal. Manufacturer warranty plus our 2-year workmanship. Link: Learn More about Water Heaters
Starting at: $295 (basic supply-line repair). What's included: Detection, repair, and verification in one visit. Link: Learn More about Leak Repair
Starting at: $895 (basic replacement). What's included: Removal, install, and basement protection check. Link: Learn More about Sump Pumps
Starting at: $395 (diagnostic + simple fix). What's included: Leak detection, repair, and city-required pressure test. Link: Learn More about Gas Line Repair
H2: Flat-Rate Pricing. Approved Before We Start.
You see the price before we pick up a tool. No hourly billing. No surprise add-ons. If the job changes, we stop, talk through the change, and quote it.
(Playbook strategy note for Audrey, not customer-facing copy.)
Paid traffic and organic traffic land on the same URL. Every service page does double duty: it converts Google Ads clicks AND ranks for free search traffic. Means: hero copy works for ads, body copy works for SEO. No paid/organic split.
See faq_seed.md.
Headline: Real prices. Real plumbers. Same-day service. Sub: Five generations of Kansas City plumbing. Family-owned since 1940.
Buttons.
Option A (recommended, transparency stake) H1: Plumbing Services with a Price Menu You Can Actually See. Sub: Sewer, drain, water heater, leak repair. Flat-rate prices, posted publicly. Family-owned since 1940. Option B (simple service-list lead) H1: All the Plumbing Services Bright Side Offers, in One Place. Sub: Sewer, drain, water heater, leak repair, sump pumps, gas line. Flat-rate pricing on every job. Option C (anti-hidden-pricing stake) H1: No Hidden Pricing. No Hourly Billing. No Surprise Add-Ons. Sub: Flat-rate prices on every plumbing service. Family-owned KC plumber since 1940. Option D (urgency hook) H1: Same-Day Plumbing Across the KC Metro. Pick Your Service. Sub: Sewer, drain, water heater, leak repair. Real prices, real plumbers, real family. Option E (problem-first) H1: What Do You Need Fixed Today? Sub: Pick the service. See the starting price. Book online or call (913) 963-1029.
Option A is canonical. Aligns with the "transparent pricing" moat from the Homepage playbook and the "flat-rate approved before we start" guarantee. Option E for paid traffic if conversion rate on the menu page beats the homepage.
Any hero with "lowest price" or "guaranteed cheapest". Honesty stake.
Primary. Call (913) 963-1029 (yellow #FFEA00) Secondary. Book Online (blue outline) Tertiary. Free Camera Inspection (text link, navigates to /sewer-camera-inspection/)
Each service card. Learn More about {Service} (Inter 600, 14px, #30C5FF text link) Plus a secondary action button. Book This Service (yellow #FFEA00) Variants.
"FREE Camera Inspection" yellow-highlighted in the top nav bar. Always visible.
Headline: Real prices. Real plumbers. Same-day service. Sub: Five generations of Kansas City plumbing. Family-owned since 1940. Buttons.
No FAQ seed parsed.
Primary source: BSP_Menu_Page_Strategy_Playbook.html (fetched 2026-05-01). Brand canon: CLAUDE.md.
The Menu Page Strategy playbook is primarily a nav/menu and service-page-architecture doc, not a price-menu copy spec. Track_d shipped a "services menu" landing page deck below as a reasonable interpretation. Final pricing and detail copy await Kalen approval per playbook ownership rule ("Kalen writes ALL service page copy").
| Element | Source | Notes | |---|---|---| | One-URL-two-audiences strategy | Playbook Β§Service Page Value Prop | Verbatim quote: "Paid traffic and organic traffic land on the same URL... double duty." | | FREE Camera Inspection nav CTA yellow | Playbook Β§CTA Guidance | Verbatim. | | Stephanie format enforcement | Playbook Β§Primary Copy Framework | Applied to body sections. | | Kalen reviews every service page before publish | Playbook Β§Copy Ownership | Hard rule, flagged in deck. | | Brand tokens (#1D1760 / #30C5FF / #FFEA00, Inter) | Playbook Β§Copy Rules + CLAUDE.md | Verbatim. | | 16 px body min, 44 px tap targets | Playbook Β§Copy Rules | Mobile-first rule. | | No em dashes / no emojis on landing pages | Playbook Β§Copy Rules + CLAUDE.md | Verbatim. | | 6-service grid + gas line | Cross-referenced Homepage Playbook Β§04 + Remaining Pages Playbook | Pulled forward. | | "Starting at" pricing pattern | Track_d draft, derived from existing service pages | Pending Kalen sign-off per playbook ownership rule. | | Service categories priority order | Homepage Playbook Β§04 (sewer leads) | Applied. | | Trust bar reused chips | Homepage Playbook Β§02 | Verbatim. |
This playbook was authored when the site was on Oxygen Builder. After the May 2026 cutover to Bricks Builder 2.3.2 on bricks.callbrightside.com, the following corrections apply:
| Original (stale) | Corrected (current) |
|---|---|
| Oxygen Builder + ct_builder_shortcodes | Bricks Builder 2.3.2 + _bricks_page_content_2 postmeta |
| WordPress nav menu (menu-main_top) | Bricks header template (currently PID 105 via functions.php force-render; swap pending) |
| Sewer Camera Inspection — NEW | LIVE PID 8 (already built) |
| Emergency Plumbing — NEW | LIVE PID 12 (already built) |
| Sewer Line Replacement — LIVE needs content | NEEDS BUILD on Bricks (was on Oxygen, not yet ported) |
| Service Areas dropdown proves Oxygen supports nesting | Bricks 2.3.2 supports nested Dropdown element natively in Nav (Nestable) per Perplexity research, May 2026 — see codebase doc §50 |
LIVE service pages (11): Sewer Camera Inspection (PID 8), Sewer Repair (286), Trenchless (291), Sewer Cleaning (287), Drain Cleaning (288), Water Heater Repair (292), Sump Pump (289), Emergency Plumbing (12), Leak Repair (290), Gas Line Repair (468), Water Softeners & Filtration.
NEEDS BUILD (7): Sewer Line Replacement, Sewer Cleanout, Hydro Jetting, Clogged Drain Service, Water Heater Replacement, Tankless Water Heaters, Burst Pipe Repair, Fixture Repair.
LIVE locations (15): Overland Park (258), Lenexa (285), Olathe (294), Leawood (293), Shawnee (295), Merriam (296), Mission (297), Prairie Village (298), Kansas City (299), Spring Hill (300), Edgerton (301), Gardner (302), De Soto (303), Bonner Springs (304), Stilwell (305).
Authoritative guide for actually building the menu in Bricks 2.3.2. Born from 3 failed API attempts on May 2 2026 where Claude shipped broken headers based on wrong assumptions about Bricks element types. Documents the REAL element type catalog + the UI-build path Robert uses + the verification ladder for any future API rebuild.
May 2 2026: Claude attempted to programmatically build new header (PID 551) with dropdowns for Services + Locations. Build shipped to live, broke homepage visually. Robert called it out with screenshots. Root cause:
dropdown meant the type was valid β FALSE. Postmeta is a JSON blob; Bricks frontend only renders elements with registered PHP classes.dropdown element β either hallucinated or Pro-only. This install has NO dropdown class registered.Inventoried via meta-full across 17 production PIDs (8/12/105/106/157/286-292/533/535/539/542/545):
[LOGO] [Services βΌ] [Locations βΌ] [About Us] [π· FREE Camera Inspection] [Call (913) 963-1029] Services dropdown (5 sub-categories, only LIVE pages): Sewer: Sewer Camera Inspection / Sewer Repair / Trenchless / Sewer Cleaning Drains: Drain Cleaning Water Heaters: Water Heater Repair Emergency: Emergency Plumbing / Sump Pump Emergency Other Services: Leak Repair / Gas Line Repair Locations dropdown (15 cities, 2 columns): Col 1: Overland Park / Lenexa / Leawood / Olathe / Shawnee / Merriam / Mission / Prairie Village Col 2: Kansas City / Spring Hill / Edgerton / Gardner / De Soto / Bonner Springs / Stilwell Mobile (under 991px): hamburger toggle β menu overlay full-screen, dropdowns become accordion (tap to expand inline).
Since dropdown doesn't exist, dropdowns must be built another way.
Nested nav-nested as a child of a parent text-link. Bricks docs suggest this for sub-menus. Risk: may not toggle without custom JS β probe with Playwright FIRST.
block + heading + JS toggle (modeled on Snippet 71 FAQ accordion). Custom JS toggles .is-open class on click; CSS controls visibility. Pro: proven works. Con: another custom JS layer.
Manual UI build in Bricks builder. Robert drags real Bricks elements via the visual UI. Eliminates element-type guessing entirely.
https://bricks.callbrightside.com/wp-admin/.edit.php?post_type=bricks_template in browser bar).619.section in the search bar at the top of the Elements panel.#FFFFFF.100%, Max-Width = 1280px.0, right=auto, bottom=0, left=auto (centers the container).28). Click it. Click "Select"./ (homepage).280px150pxnav menu (with space) or just menu.Inter (per playbook brand)#1D1760 (navy)#30C5FF (cyan blue accent)go 619 for the PHP hook swap.nav.mobile_landscape (collapse below 991px).Services, Link empty (parent).Locations, Link empty./about-us/ (PID 535).#FFEA00, color #1D1760, padding 8/14/8/14, border-radius 6px, link to /sewer-camera-inspection/.toggle.ion-md-menu (hamburger lines).ion-md-close (X).button.Call (913) 963-1029.tel:+19139631029.#30C5FF (cyan blue, BSP secondary).#1D1760 (navy).8px.Draft to Publish. Click Save again.
/water-heater-repair/ in another tab).go 619.style.css fresh (preserves all 25 Inter cluster ships)install_child_safe with modified functions.php (line 136: 105 β 619)106) untouched/tmp/bricks-child/functions_pre_swap_105.php. Claude can restore in ~10 sec via install_child_safe + cache purge. Just say revert 619.
Layers 4 + 5 are non-negotiable for header/nav/dropdown work. Skipping them is what burned May 2 session.
# 1. Edit /tmp/bricks-child/functions.php line 136: # bsp_render_bricks_template(551, 'header'); β bsp_render_bricks_template(105, 'header'); # 2. Deploy via Snippet 67 BSP Theme Installer (POST /bsp/v2/theme/install-child) # 3. Purge: /bsp/v2/cache/purge + Cloudflare API purge_cache # 4. Verify: live homepage shows brxe-f5a4a5 (PID 105 root) within 10s
Working revert script: C:\Users\dovew\session_9_header_revert.py (used May 2 2026 at 14:27 to restore live site after broken PID 551 ship).
bsp-may01-task4-phase0-archaeology β PID 105 vs 521 correctionbsp-may02-pplx-header-research-deployed β pure-native template-condition is broken on Bricks 2.3.2bsp-may02-bricks-menu-build-playbook-v1 β this section (original sloppy ship)bsp-may02-section11-rewrite-clean β this rewrite (proper styling matches playbook)