Blog Launch Workflow

Robert + Audrey + Nexus | The Official Process
Bright Side Plumbing

The Blog Launch System

Every blog post follows this exact workflow. No shortcuts. No skeleton content. Every step has an owner, a deliverable, and a quality gate. If it doesn't pass, it doesn't publish.

Live Example: EPA Fix a Leak Week (March 17, 2026)
1
Topic Selection + Brief
Owner: Robert + Nexus
1

🔍 Identify the topic from keyword research, seasonality, or Kalen field intel

Check SEMRush, Google Trends, upcoming events (EPA Fix a Leak Week, National Sewer month, KC weather patterns), or a recurring question from customers.

EPA Example

EPA Fix a Leak Week runs March 17-23. Keyword: "fix a leak week" + "leak detection overland park." Seasonal timing, educational angle, ties to our leak repair service page.

2

🎯 Assign target persona(s)

Every blog must target at least 1 persona. Use the persona signal words and mindset from bsp_persona_analysis.json.

Emergency Eric: panic, same-day, sewage, burst | Renovation Rachel: research, trust, options, explain | Maintenance Mike: routine, prevent, peace of mind | Business Bob: commercial, no disruption
EPA Example

Primary: Maintenance Mike/Maria (routine homeowner, prevention mindset). Secondary: Emergency Eric (discovers a leak mid-article).

3

📋 Create the content brief

Nexus generates the brief JSON with: title, slug, target persona, keyword, competitive angle, meta description, design brief for Audrey, and social distribution copy (short/medium/long).

File: blog_draft_{slug}.json in /opt/nexus/nexus/scripts/output/
2
Content Writing + Data Integration
Owner: Robert + Nexus
4

✍️ Write full content (1,500+ words minimum)

Not a skeleton. Not an outline. Full paragraphs with depth. Every section must be 80+ words. The blog quality gate will reject anything thinner.

5

📊 Pull real data from our systems

Every blog must include verifiable data, not generic filler. Sources:

Review Intelligence DB: 2,941 review aspects, real customer quotes matched by topic
Persona Analysis: signal words, mindset, search behavior per persona
ServiceTitan: job data, avg tickets, common issues by service type
Local data: WaterOne rates, Johnson County home ages, KC climate patterns
EPA/industry: official statistics with source attribution
EPA Example

Pulled: 4 EPA stat cards, WaterOne cost calculator (5 leak types), leak severity table (7 types with repair vs. ignore cost), 4 real customer review cards, KC seasonality data (freeze-thaw cycles, spring rain, home ages).

6

🔧 Include Kalen field notes / tech quotes

At least 1 quote from Kalen or a tech. Real field observations, not marketing language. Send to Kalen for approval if fabricated.

EPA Example

"By the time most homeowners notice a leak, the damage has already been building for weeks or months. A $200 repair turns into a $5,000 problem.", Kalen Barker

7

❓ Add FAQ section (3-5 questions, FAQPage schema)

Every blog must include a FAQ section with itemscope itemtype="https://schema.org/FAQPage" markup. These show as rich results in Google and capture "People Also Ask" traffic.

8

🔗 Add internal links (3+ service pages)

Every blog must link to at least 3 BSP service pages. Primary: the service hub page. Secondary: related services. Always include /sewer-line-repair/ (our #1 revenue driver).

⚠ Quality Gate: Content Validation

Run python3 nexus_blog_quality_gate.py --file blog_draft_{slug}.json before proceeding. ALL blockers must pass.

1,500+ words total
7+ substantive sections
80+ words per section
3+ data points with sources
2+ real customer reviews
1+ field note / Kalen quote
3+ FAQ questions with schema
3+ internal links to service pages
1+ persona explicitly targeted
2+ CTAs (phone + book online)
3+ KC-specific references
Meta description (120-160 chars)
3
HTML Build + BSP Branding
Owner: Robert
9

🏗️ Build the branded HTML preview

Wrap the content in the BSP site template: navy/yellow branding, header with nav, breadcrumbs, trust bar, footer. This is what it will look like on callbrightside.com. Navy and yellow only. No off-brand colors.

Colors: Navy #1c1860, Yellow #fdfe36, White, Grays
Font: Inter (or system sans-serif)
Layout: 800px max-width content, single column, no sidebar
CTA buttons: Yellow background, navy text, font-weight 800
10

🚀 Deploy to morpheus for preview

Upload to /opt/nexus/nexus/scripts/output/playbooks/ on the VM. Preview URL: morpheus.callbrightside.com/documents/{filename}.html

4
Kalen Review
Owner: Kalen (via Slack)
11

💬 Send Slack review version to Kalen

Create a plain-text version broken into labeled sections with "Your call:" prompts under each one. Include the morpheus preview link at the top so he can see the visual version too.

Kalen reviews: pricing accuracy, field note quotes, service descriptions, technical accuracy, FAQ answers. He marks each section as approved, changed, or flagged.
12

✏️ Apply Kalen's feedback

Update the HTML and JSON draft with any changes. Re-run quality gate. Re-deploy to morpheus.

Checkpoint: Kalen has approved all sections. Do NOT proceed to Audrey until Kalen signs off on content accuracy.
5
Design Brief to Audrey
Owner: Audrey
13

🎨 Send Audrey the design brief

Audrey gets: the morpheus preview link (so she sees the content in context), the design brief from the JSON, and specific requests for graphics.

Audrey deliverables per blog:
- Hero image/graphic (1200x628 for OG, 1200x1200 for social)
- Any custom illustrations or icons referenced in the brief
- Infographic versions of data tables (if applicable)
- Social media graphic variants (story, post, carousel)
Brand rules: Navy #1c1860, Yellow #fdfe36. No green, no orange. BSP logo. Clean, modern, trust-building.
EPA Example

Hero: water/pipe theme with EPA branding tie-in. Stat cards as shareable graphics. Cost calculator infographic. Two-tier pricing cards (if approved). Social: "5 leak checks you can do right now" carousel for Instagram.

14

🎨 Audrey delivers assets

Audrey uploads completed graphics to the shared Google Drive folder. Robert downloads, integrates into the HTML, and re-deploys to morpheus for final visual check.

📁 Upload location: Google Drive > Bright Side Plumbing > Blog Assets > [blog-slug]

📂 Folder structure per blog:
Blog Assets/epa-fix-a-leak-week/
  ├── hero-1200x628.png (OG image / WordPress featured image)
  ├── hero-1200x1200.png (social square)
  ├── hero-1080x1920.png (Instagram/Facebook story)
  ├── infographic-cost-calculator.png (if applicable)
  ├── social-carousel-01.png through -05.png (if applicable)
  └── source-files/ (Figma exports, PSDs, or Canva links)

📐 File specs:
  - All PNGs, 72 DPI, RGB, sRGB color profile
  - Max file size: 500KB per image (compress before uploading)
  - Hero must have transparent-safe version (no text that gets cut off in crops)
  - Brand colors only: Navy #1c1860, Yellow #fdfe36, White, Grays

✅ When done: Audrey pings Robert in Slack with "assets uploaded for [blog-slug]" and the Drive folder link. Robert downloads, drops into the HTML, re-deploys to morpheus, and replies with the updated preview link for final sign-off.
6
WordPress Publish
Owner: Robert
15

📝 Create the WordPress post

1. Log into callbrightside.com/wp-admin
2. Posts > Add New
3. Set title (H1 from the blog)
4. Switch to Oxygen editor or Code view
5. Paste the full HTML content (everything inside the <main> tags from the branded template)
6. Set slug: /epa-fix-a-leak-week/
7. Set category: Learning Center
8. Set featured image (Audrey's hero graphic)
9. Set meta description via RankMath
10. Set OG image in RankMath Social tab
11. Add FAQPage schema in RankMath Schema tab (or verify it's in the HTML)
12. Preview in new tab. Check mobile and desktop.
13. Publish

16

✅ Post-publish verification

1. Visit the live URL. Check desktop + mobile.
2. Test all internal links (click each one).
3. Test phone number links (tap on mobile).
4. Run Google Rich Results Test on the URL (check FAQPage schema).
5. Submit URL in Google Search Console for indexing.
6. Check GTM is firing on the new page (GCLID capture, GA4, conversion tags).
7. Verify RankMath SEO score is green.

7
📷

📷 Image naming convention for SEO + organization

Every image Audrey delivers MUST follow this naming convention. Google reads file names for image SEO. A file named "IMG_3847.jpg" tells Google nothing. A file named "sewer-line-replacement-overland-park-bright-side-plumbing.jpg" tells Google exactly what it is.

Format: [service]-[description]-[location]-bright-side-plumbing.[ext]

Rules:
• All lowercase
• Hyphens between words (NOT underscores, NOT spaces)
• No special characters, no apostrophes, no ampersands
• Include the service type (sewer, drain, water-heater, leak, gas-line)
• Include a descriptor (repair, replacement, before-after, damage, camera-inspection)
• Include location when relevant (overland-park, kansas-city, lenexa, olathe)
• End with "bright-side-plumbing" for brand SEO
• Keep under 60 characters total
• Use .jpg for photos, .png for graphics/infographics, .webp when possible

Examples:
TypeGood NameBad Name
Hero imagesewer-repair-hero-kansas-city-bright-side-plumbing.jpghero-1200x628.jpg
Before/aftersewer-line-damage-before-repair-overland-park.jpgIMG_3847.jpg
Infographicepa-fix-a-leak-week-infographic-water-waste-costs.pnginfographic-v2-final.png
Social graphicdrain-cleaning-tips-instagram-carousel-01.pngsocial-post.png
Team photokalen-barker-master-plumber-bright-side-plumbing.jpgkalen.jpg
Camera footagesewer-camera-inspection-root-intrusion-lenexa.jpgcamera-screenshot.jpg
📁 Where Audrey puts images:
Google Drive: Marketing Shared Drive > 2026 > Blog Posts > [blog-slug] folder
Example: 2026/Blog Posts/epa-fix-a-leak-week/

Folder structure per blog post:
  epa-fix-a-leak-week/
  ├── epa-fix-a-leak-week-hero-bright-side-plumbing.jpg (1200x628, OG/blog hero)
  ├── epa-fix-a-leak-week-hero-square.jpg (1200x1200, social square)
  ├── epa-fix-a-leak-week-hero-story.jpg (1080x1920, IG/FB story)
  ├── epa-fix-a-leak-week-infographic-water-waste-costs.png
  ├── epa-fix-a-leak-week-carousel-01-meter-test.png
  ├── epa-fix-a-leak-week-carousel-02-toilet-test.png
  ├── epa-fix-a-leak-week-carousel-03-under-sink.png
  └── epa-fix-a-leak-week-cost-table-waterone-rates.png

When Robert uploads to WordPress:
• Alt text = same as file name but with spaces and title case: "Sewer Line Replacement Overland Park Bright Side Plumbing"
• Title = same as alt text
• Caption = descriptive sentence for accessibility: "Bright Side Plumbing technician inspecting a damaged sewer line in Overland Park, Kansas"
• Use Imagify to auto-compress on upload (already installed + active)
• WP Rocket lazy-loads below-fold images automatically

🔍 Why this matters for SEO:
Google Image Search drives 20-30% of discovery traffic for home services. When someone searches "sewer line damage Kansas City," images with proper file names, alt text, and captions rank in Google Images. Each image ranking is a free lead source that compounds over time.
Distribution
Owner: Robert + Audrey
17

📱 Social media distribution with UTM tracking

NEVER post a naked link. Every link to callbrightside.com on social media MUST use UTM parameters. This is how we track which channels produce leads.

🔧 Step 1: Generate UTM links
Robert runs on VM: python3 nexus_utm_generator.py
Output: output/social_distribution_links.json with tracked links for every channel.

🔗 Step 2: Use the correct link for each platform
PlatformUTM SourceUTM MediumExample
Facebook Postfacebooksocialcallbrightside.com/page/?utm_source=facebook&utm_medium=social&utm_campaign=campaign_name
Instagram Postinstagramsocialcallbrightside.com/page/?utm_source=instagram&utm_medium=social
Instagram Storyinstagramsocial_storycallbrightside.com/page/?utm_source=instagram&utm_medium=social_story
Google Businessgbpsocialcallbrightside.com/page/?utm_source=gbp&utm_medium=social
LinkedInlinkedinsocialcallbrightside.com/page/?utm_source=linkedin&utm_medium=social
Nextdoornextdoorsocialcallbrightside.com/page/?utm_source=nextdoor&utm_medium=social
Email Newsletteremailnewslettercallbrightside.com/page/?utm_source=email&utm_medium=newsletter
QR Code (leave-behind)duck / magnet / doorhangerqrcallbrightside.com/page/?utm_source=duck&utm_medium=qr
🎯 Step 3: Pretty Links (clean short URLs)
Pretty Links plugin is installed on WordPress. Create short URLs for print/verbal:
Format: callbrightside.com/go/[page]-[channel]
Example: callbrightside.com/go/epa-leak-facebook redirects to the full UTM URL.

📅 Step 4: Schedule via Metricool
Metricool is installed (connected to FB, IG, TikTok, LinkedIn, YouTube, GBP).
When scheduling posts in Metricool, paste the UTM link, not the naked URL.

📊 Why this matters: Without UTM params, all social traffic shows as "direct" in GA4. With UTM, we know: "15 leads came from duck QR codes" or "Instagram stories drove 23 visits." This is Experiment #23 (currently tracking 71% of traffic as attributed).
18

🔗 Internal link from existing pages

Add a link to the new blog from the relevant service page(s). Example: /leak-repair/ should link to the EPA Fix a Leak Week post. This passes SEO authority.

19

📧 Email to customer list (if applicable)

For seasonal/timely content, draft an email in HubSpot with the short social copy + link. Only if Kalen/Stephanie approve sending.

Typical Timeline: Topic to Published

Day 1
Topic + Brief
Robert + Nexus
Day 1-2
Full Content + Data
Robert + Nexus
Day 2
HTML Build + Preview
Robert
Day 2-3
Kalen Review
Kalen (Slack)
Day 3-4
Audrey Design
Audrey
Day 4-5
Publish + Distribute
Robert

Deliverables Per Blog Post

Content Package

JSON brief, 1,500+ word draft, meta description, social copy (3 versions), FAQ schema

Visual Package

Branded HTML preview, hero image, social graphics (story + post + carousel), infographics

Distribution Package

WordPress post, Facebook/Instagram/GBP/LinkedIn posts, internal links, email draft (if applicable)