Service Page Copy Mining SystemReusable

The build playbook for all 10 BSP service pages. Real data in โ†’ Audrey-ready copy + Figma-sourced structure โ†’ shipped Bricks page. Parametric, 30โ€“60 min per page once this pipeline is warm. Generated 2026-04-21 16:46 CDT.

๐Ÿ“Š What the mining pipeline actually pulls

On run, the pipeline extracts real BSP data across every viable source. No fabrication โ€” every line lands with provenance. These are the totals from the emergency-plumbing run (page #12):

27,665
customer phrases (review_aspects)
2,080
emergency-flagged phrases
374
reviews processed
762
aspects extracted
1,478
playbook emergency hits (46 files)
1,923
field/office notes flagged
49
keyword matches (by search volume)
17
Daniel transcript items
The promise. Point this pipeline at a service (drain-cleaning, water-heater-repair, sewer-cleanout, gas-line-repair, sump-pump, sewer-replacement, water-quality, or any future build) and it returns a full copy deck: H1 candidates backed by real search volume, hero-description options from BSP playbooks, 6 section card bodies sourced from field notes + customer phrases per scenario, FAQ Q&A from Daniel transcripts + office notes, and 6 reviews sorted by emergency-adjacency. No making it up.

๐Ÿ—๏ธ The 4-Zone build pipeline

Zone A โ€” Claude Code prep work

  1. Receive tuple: (target_post_id, figma_file_key, figma_desktop_node, copy_brief_path)
  2. Pull Figma desktop + mobile via /v1/files/:key. No approximation.
  3. Pull per-section Figma assets via /v1/images/:key?ids=... โ†’ upload to WP media via /wp/v2/media.
  4. Run comprehensive mining script against service keyword set โ†’ emit copy deck (Markdown + HTML).
  5. Hand-off to Zone B.

Zone B โ€” Structural clone + content swap

  1. Read _bricks_page_content_2 from page 8 (sewer-camera-inspection) via /bsp/v2/db/meta-full.
  2. POST same element tree to target post_id via /bsp/v2/bricks/native-save. Same IDs โ€” structural clone.
  3. Deploy CSS mirror snippet: page-id-8 rules re-scoped to page-id-N. Gated on is_page(N).
  4. Deploy FAQ accordion snippet (JS same, gate on is_page(N)).
  5. Swap text + image fields from copy deck: H1, subtitle, trust bar, 6 scenario cards, 3-4 process steps, FAQ, CTA.
  6. native-save + purge LS + purge CF.

Zone C โ€” Verification (Rule 1 independent reader)

  1. GET /bsp/v2/db/meta-full?post_id=N โ€” confirm element count + key text IDs persisted.
  2. curl https://bricks.callbrightside.com/<slug>/ โ€” HTTP 200 + section markers present in DOM.
  3. Playwright screenshot desktop 1440 + mobile 390 โ†’ C:\Users\dovew\page_N_verify\.
  4. DOM probe: footer column widths match sewer (d02d13=260, row1 gap=72, col4 flex-direction=column).
  5. Visual diff vs Figma node via /v1/images export.

Zone D โ€” Promote + log

  1. Only on Robert approval: apply-v2 export from staging to prod /services/<slug>/.
  2. Cloudflare purge all paths matching /services/<slug>*.
  3. Rank Math sitemap regenerate + ping Google.
  4. MH log bsp-apr<DD>-<slug>-shipped with receipts.
  5. Slack WIN to Ashton.

๐Ÿง  Source inventory (per-page mining)

SourcePathWhat it delivers
review_intelligence.db/opt/nexus/nexus/scripts/output/review_aspects (27,665 customer_language phrases). Filter by keyword โ†’ per-scenario quotes.
review_intelligence_latest.jsonsame diraspect_summary, persona_matrix, generated_ad_copy, competitor_intelligence.
Playbook HTMLs/opt/nexus/nexus/scripts/output/playbooks/46 files. Hero copy, Kalen quotes, stellar descriptions, trust-bar language.
Keyword DBsseo_keywords.db, keyword_north_star.db, keyword_research.dbSearch volume per H1 candidate. Real intent, not guessed.
Daniel transcriptsdaniel_lost_calls_*.json + titan DBReal caller Q&A โ†’ FAQ content.
Field notes intelligencefield_notes_intelligence.jsonTech job notes. Per-scenario plumber language.
Classified notesclassified_notes_YYYYMMDD.json ร—47ST office + tech note classifications. Daily.
Google PlacesAPI with GOOGLE_PLACE_ID5 newest reviews per call. Average rating + total count.

๐Ÿท๏ธ Per-service tuple spec

To build any of the 9 remaining service pages, Robert hands over one tuple. Pipeline does the rest.

emergency-plumbing (DONE, page #12):
  figma_file_key:    6Hs3YviSaG5uCzc90XKU7Q
  figma_desktop:     1:3    (frame "Desktop - 1")
  figma_mobile:      2:209  (frame "iPhone 13 & 14")
  copy_brief_path:   /opt/nexus/nexus/scripts/output/playbooks/BSP_Emergency_Plumber_Landing_Page_Brief.html
  target_slug:       /emergency-plumbing/
  keywords:          emergency, burst, flood, frozen, gas leak, water heater, 24/7

remaining_service_pages:
  drain-cleaning        โ†’ figma_key=?  post_id=?  brief=BSP_Drain_Cleaning_Landing_Page_Brief.html
  water-heater-repair   โ†’ figma_key=?  post_id=?  brief=BSP_Water_Heater_Repair_and_Replacement_Landing_Page_Brief.html
  water-quality         โ†’ figma_key=?  post_id=?  brief=BSP_Water_Quality_...
  sewer-cleanout        โ†’ figma_key=?  post_id=?  brief=BSP_Sewer_Cleanout_Landing_Page_Brief.html
  gas-line-repair       โ†’ figma_key=?  post_id=?  brief=BSP_Gas_Line_Repair_Landing_Page_Brief.html
  sewer-replacement     โ†’ figma_key=?  post_id=?  brief=BSP_Sewer_Replacement_...
  sump-pump             โ†’ figma_key=?  post_id=?  brief=BSP_Sump_Pump_Repair_Installation_Landing_Page_Brief.html

๐Ÿ› ๏ธ Bandaid state (pre-refactor)

This system works today via three additive Code Snippets per service page, not a clean refactor. Apr 21 decision (Option X): ship bandaids, refactor after 2-3 pages prove the reusable pattern. Do not refactor blind.
SnippetPurposeDeploy at
BSP Footer GlobalUnscopes footer v7 CSS from is_page(8)Once, site-wide โœ… #68
BSP Page N CSS MirrorRe-scopes body.page-id-8 rules to body.page-id-NPer service page โœ… #70 (page 12)
BSP Page N FAQ AccordionAccordion JS for page N (same IDs as page 8 since cloned)Per service page โœ… #71 (page 12)
BSP Page N Image TweaksPer-page image sizing + services-grid-to-infographic togglePer service page โœ… #72 (page 12)

Total snippets per service page: 3 (mirror, FAQ, image tweaks). Post-refactor target: 0 (absorbed into structural classes on functions.php).

๐Ÿ“– Emergency run โ€” full copy deck (proof of output)

What a single run produces. Below is the raw markdown dump from the emergency-plumbing mining. Used as the source for 6 card bodies, 6 FAQ Q&A, hero subtitle, reviewer picks, and trust-bar stats on page #12.

# Emergency Plumbing Copy Deck v3 (Comprehensive)

**Sources (real BSP data, no fabrication):**
- review_intelligence.db: 374 reviews, 762 aspects extracted
- Emergency-flagged customer phrases (aspects): **2080**
- Pre-generated ad copy from reviews: **0** DB rows + **1** JSON
- Competitor weaknesses: **0** DB + **1** JSON
- Keyword hits (ranked by volume): **49**
- Playbook emergency hits across 567 files: **1478**
- Daniel transcript items: **17**
- Field notes + classified: **1923**

## 1. H1 Candidates (real keyword-backed)

- `emergency sewer repair`
- `emergency sewer repair Kansas City`
- `pipe bursting sewer line`
- `pipe bursting cost`
- `water heater repair`
- `water heater repair Kansas City`
- `water heater repair Overland Park`
- `water heater repair near me`
- `water heater not working`
- `water heater pilot light out`
- `water heater leaking`
- `water heater leaking from bottom`

## 2. Pre-generated Ad Copy from Review Analysis (already AI-distilled)

## 3. Competitor Weaknesses (counter-position BSP against)


## 4. Top Review Aspects (what customers actually praise)


## 5. 6 Emergency Card Bodies โ€” per-scenario real BSP data

### Burst Pipes
- [field note] Customer has a pipe burst in basement , its an unfinished basement and see dried water on the floor. It is at two different places , they see dried water on wall. Never seen this before , may have happened while they were away Happened while she was gone, there is a water stain d
- [field note] Customer has a pipe burst in basement , its an unfinished basement and see dried water on the floor. It is at two different places , they see dried water on wall. Never seen this before , may have happened while they were away Happened while she was gone, there is a water stain d
- [field note] Customer has a pipe burst in basement , its an unfinished basement and see dried water on the floor. It is at two different places , they see dried water on wall. Never seen this before , may have happened while they were away Happened while she was gone, there is a water stain d

### Gas Leaks
- [field note] Eddie stated that they are having a gas leak at 9515. The gas was turned off by Spire. They would like for us to check it out, while we are on site doing sold work.
- [field note] Customer has a natural gas leak, and they called spire out and they shut off the valve to the oven, but they said it was a leak on the CSST line before the reducer. They couldnโ€™t do anything about it, and recommended a plumber. &nbsp; $49 special, no special instructions, no pets
- [field note] Customer has a natural gas leak, and they called spire out and they shut off the valve to the oven, but they said it was a leak on the CSST line before the reducer. They couldnโ€™t do anything about it, and recommended a plumber. &nbsp; $49 special, no special instructions, no pets

### Sewer Backups
- [customer-phrase, professionalism, 5โญ] ["Dalton was amazing friendly got the job done and got us back up and running will us them again if I ever have plumbing issues again"]
- [customer-phrase, professionalism, 5โญ] ["Dalton was amazing friendly got the job done and got us back up and running will us them again if I ever have plumbing issues again"]
- [customer-phrase, professionalism, 5โญ] ["Dalton was amazing friendly got the job done and got us back up and running will us them again if I ever have plumbing issues again"]
- [customer-phrase, professionalism, 5โญ] ["Dalton was amazing friendly got the job done and got us back up and running will us them again if I ever have plumbing issues again"]
- [field note] Customer states that he has a clog down in the bathtub. Customer knows that the main sewer line is clay and has some tree roots in it, but it was cleaned out in 2024. They are not having any back ups in the house, except for the bathtub. Customer thinks it has been draining slow 
- [field note] Customer has a couple floor drains that back up about every 2 months. Customer is looking to get a sewer line replacement estimate. Customer has a bunch of big trees in the area, and have to get their sewer cleaned out every couple months. The utilities don't back up in the house
- [field note] Customer is looking for a floor drain in the basement. She got a new washer and dryer and it is backing up. There is also a pipe in the basement that is leaking and has been for a couple years that she would like to get replaced. Customer looked us up on the internet, plumber nea

### Frozen Pipes
- [customer-phrase, communication, 5โญ] ["His clear expectations, transparent communication, and exceptional customer service made all the difference"]
- [customer-phrase, communication, 5โญ] ["His clear expectations, transparent communication, and exceptional customer service made all the difference"]
- [customer-phrase, communication, 5โญ] ["His clear expectations, transparent communication, and exceptional customer service made all the difference"]
- [customer-phrase, communication, 5โญ] ["His clear expectations, transparent communication, and exceptional customer service made all the difference"]
- [field note] Customer thinks there is something wrong with a water heater. They just noticed it a couple of days ago, but they don't want to wait until the hot water company goes away. The customer is noticing it when they take a shower, they can get warm water at a specific angle on the hand
- [field note] Customer is having a leak in the upstairs bathroom which is leaking down into the downstairs ceiling. Customer noticed it a couple days ago.NO special instructions, no pets.
- [field note] Water is on. Curb stop valve is frozen. Looking for estimate. Estimated repair date: April 13th.

### Water Heater Failure
- [customer-phrase, pricing, 5โญ] ["After Eric answered all my questions, it was obvious he was guiding me away from this very expensive type of water heater that I wanted but did not need"]
- [customer-phrase, response_time, 5โญ] ["They came out, confirmed the same, and then that same day they replaced the water heater", "They were punctual, knowledgeable, polite, and professional"]
- [customer-phrase, response_time, 5โญ] ["Our water heater broke on Christmas Eve morning, we called for help and Bright Side sent two technicians out within 20 minutes"]
- [customer-phrase, professionalism, 5โญ] ["Trevor did a wonderful on both our jobs including replacing an old hot water heater / very professional and knowledgeable"]
- [field note] Customer says hot water hasn't been working right and they had been living with warm water for quite awhile. Now the hot water heater isn't producing any hot water at all and customer would like to know her options.
- [field note] Customer has a 21yo bradford white 48g hot water heater and he says it is leaking water most likely from the bottom. Would probably just need to be replaced.
- [field note] One of the water heaters in the basement was installed incorrectly. The expansion tank popped. Customer is with a newer property management company in the area, and they are looking for contractors to help assist with issues that might arise.

### Flooding
- [customer-phrase, response_time, 5โญ] ["We just moved into a new house and went to connect our new washer only for water to flood everywhere - Eric was able to come out and assess that same day and then returned the next business day to do the needed repairs"]
- [customer-phrase, response_time, 5โญ] ["We just moved into a new house and went to connect our new washer only for water to flood everywhere - Eric was able to come out and assess that same day and then returned the next business day to do the needed repairs"]
- [customer-phrase, response_time, 5โญ] ["We just moved into a new house and went to connect our new washer only for water to flood everywhere - Eric was able to come out and assess that same day and then returned the next business day to do the needed repairs"]
- [customer-phrase, above_and_beyond, 5โญ] ["Shout out to Nick and Dave who went above and beyond with my sump pump issues", "I\u2019m beyond grateful for their willingness to go above and beyond because they knew I was stressed about having a broken pump with the rain"]
- [field note] We would like to get an estimate for a sump pump replacement. We are considering either 1/3 hp or 1/2 hp with a battery backup. Thank you. Rose Beltramo
- [field note] Customer has been out of town for about 11 days and when he arrived home the sump pump backup battery had kicked on and the primary pump was running. Customer got the backup battery turned off but the primary pump is still running and he doesn't know how long.
- [field note] Customer is interested in getting a battery backup sump pump combo before it starts to rain heavy. Text customer when you arrive. Call 30 min prior. If he doesnt answer customer will be there. rgarren81@gmail.com

## 6. FAQ Q&A โ€” Daniel transcripts + office/tech notes

- [daniel_lost:summary] Barbara Boyle called Bright Side Plumbing to schedule a repair for multiple toilets at her address, 9407 West 119th Terrace, Overland Park, Kansas. An appointment was set for Tuesday afternoon, with a note that she won't be home until 1 PM, and Ashton will call within 15 minutes to confirm the exact time.
- [daniel_lost:summary] A user called Bright Side Plumbing seeking a repairman for their dishwasher. Daniel from Bright Side Plumbing clarified that they do not handle appliance repairs, but could assist if the issue was plumbing-related, such as a leak or drainage problem. The call ended before the user could respond to this clarification.
- [daniel_lost:summary] Rahul called Bright Side Plumbing regarding a clogged drain pipe connected to his GE dishwasher. While the company confirmed they could assist with the plumbing issue, they ultimately could not provide service as Rahul's San Diego address was outside their Kansas City service area. The call ended with the company unable to help.
- [daniel_lost:summary] Kate called Bright Side Plumbing to request a second quote for a sewer line replacement at her Prairie Village address. She provided her contact information and address for scheduling. Due to system issues, the AI agent could not book the appointment immediately but assured Kate that a team member would call her back within 15 minutes to schedule the free estimate.
- [daniel_lost:summary] **Customer Name:** Not provided
**Phone:** Not provided
**Issue:** The customer called to confirm they had the correct phone number for Bright Side Plumbing. No plumbing issue was discussed.
**Emergency:** No
**Appointment Requested:** No, the customer stated they would call back in the morning.
- [daniel_lost:summary] **Customer Name:** Not provided
**Phone:** Not provided
**Issue:** The caller, a buyer's agent, inquired if Bright Side Plumbing provides sewer inspection services for buyer's agents.
**Emergency:** No
**Appointment Requested:** No
- [daniel_lost:summary] **Customer Name:** Greg (from McDonald's)
**Phone:** 660-349-9035
**Issue:** Hot water heater is not working at their location (3860 95th Street, Leawood, Kansas).
**Emergency:** Not explicitly stated as an emergency, but the AI acknowledged the importance of hot water for a business and offered same-day service, implying urgency.
**Appointment Requested:** Yes, a morning appointment was requested
- [daniel_lost:summary] **Customer Name:** Victoria (from Shamrock Property Means)
**Phone:** Not provided by the customer.
**Issue:** Victoria is calling on behalf of Shamrock Property Means to inquire about a potential partnership with Bright Side Plumbing for residential maintenance services, as they are expanding their contract network.
**Emergency:** No.
**Appointment Requested:** No.
- [daniel_lost:summary] This was an automated promotional call, not a customer seeking plumbing services.

*   **Customer Name:** Not applicable (automated message).
*   **Phone:** 561-375-2212 (callback number provided in the automated message).
*   **Issue:** Not a plumbing issue. The call was a promotional offer for "Points plus 2,000,000 gold coins" for $5.97.
*   **Emergency:** No.
*   **Appointment Requested:** No.
- [daniel_lost:summary] Here's a summary of the call:

*   **Customer Name:** Jeff Elmer
*   **Phone:** 816-365-4365
*   **Issue:** A shower is dripping fast, and the main water shutoff valve for the house is not working correctly (it slows water but doesn't completely shut it off).
*   **Emergency:** Yes, the issue is treated as urgent, especially with the non-functional main shutoff valve. The customer requested servic
- [daniel_lost:summary] **Customer Name:** Adairu (homeowner, relayed by Kim from American Home Protection)
**Phone:** 913-244-0386
**Issue:** Leak under the kitchen sink at 812 North Pine Street, Olathe.
**Emergency:** No, not indicated as an emergency.
**Appointment Requested:** Yes, an appointment was requested. The caller (Kim) did not specify a time, so Bright Side Plumbing will contact the homeowner directly to sch
- [daniel_lost:summary] **Customer Name:** AT&T (automated alert to Bright Side Plumbing)
**Phone:** Not provided in the transcript.
**Issue:** An automated alert from AT&T regarding a recent 811 request (ticket number 26169651) for 4146 Adams Street, Kansas. The alert warns that digging may impact high-priority AT&T facilities, potentially causing service disruptions and affecting 911 services, and advises extreme cauti
- [daniel_lost:summary] Here's a summary of the call:

*   **Customer Name:** Not provided
*   **Phone:** Not provided
*   **Issue:** The customer inquired about pricing structure ("price by quantity") and then asked about services offered, but did not specify a particular plumbing issue.
*   **Emergency:** No
*   **Appointment Requested:** No
- [daniel_lost:summary] **Customer Name:** Anthony
**Phone:** 913-954-2846
**Issue:** Anthony has an approved estimate for a bathroom hookup, kitchen hookup, and washer/dryer water line. He needs Bright Side Plumbing to coordinate with the city of Grandview to pull a permit for the work, as he has a permit number ready.
**Emergency:** No
**Appointment Requested:** An appointment was offered for the same day, but Anthony 
- [daniel_lost:summary] Here's a summary of the call:

*   **Customer Name:** Liz (calling on behalf of her customer)
*   **Phone:** Not provided by Liz.
*   **Issue:** Two dripping faucets, a shower issue, and a loose toilet (for Liz's customer).
*   **Emergency:** No.
*   **Appointment Requested:** Yes, Liz attempted to schedule an appointment for her customer, but Bright Side Plumbing does not handle third-party claim

## 7. Reviews for Page Display (top emergency-adjacent)

### response_time | 5โญ | Emergency Eric/Erica
"["They arrived promptly with an exceptional work ethic and worked tirelessly throughout the day to ensure the job was complete"]"

### expertise | 5โญ | Emergency Eric/Erica
"["Chris, Bradley, and Trevor were exceptional in their knowledge and skill and always kept us informed throughout the process to make sure we knew exactly what was going on"]"

### communication | 5โญ | Emergency Eric/Erica
"["Chris, Bradley, and Trevor were exceptional in their knowledge and skill and always kept us informed throughout the process to make sure we knew exactly what was going on"]"

### expertise | 5โญ | Renovation Rachel/Ryan
"["My first major home damage experience was daunting, but Nick from Bright Side Plumbing transformed the restoration process into an stress-free journey"]"

### communication | 5โญ | Renovation Rachel/Ryan
"["His clear expectations, transparent communication, and exceptional customer service made all the difference"]"

### response_time | 5โญ | Emergency Eric/Erica
"["They arrived promptly with an exceptional work ethic and worked tirelessly throughout the day to ensure the job was complete"]"

## 8. Gaps to fill

๐Ÿšง Known gaps + next-session work

๐Ÿ“Œ Quick reference

Endpoints used

GET    /wp-json/bsp/v2/db/meta-full?post_id=N          # read element tree (Basic auth: BRICKS_WP_USER)
POST   /wp-json/bsp/v2/bricks/native-save              # write element tree (post_id + elements[])
POST   /wp-json/bsp/v2/cache/purge                     # LiteSpeed + WP cache flush
POST   /wp-json/wp/v2/media                            # upload to WP media (Content-Type: image/png)
POST   /wp-json/code-snippets/v1/snippets              # create snippet (PUT does not persist)
DELETE /wp-json/code-snippets/v1/snippets/{id}        # remove one-shot snippets
GET    /wp-json/bricks-ai-studio/v1/                   # Bricks AI Studio (for future Zone B1 programmatic path)

Figma endpoints

GET    https://api.figma.com/v1/files/:key             # element tree + text + sizes
GET    https://api.figma.com/v1/images/:key?ids=&scale=2  # PNG export URLs (batched)

โšก Run log โ€” what shipped today (Apr 21, 2026)

Built 2026-04-21 16:46 CDT ยท Living document ยท Update after each service-page ship ยท MH ref bsp-apr21-service-page-mining-system