The scientific system that transforms Audrey's photos into revenue-generating Google Ads assets. Seven automated phases. Zero guesswork. Every image measured, optimized, and evolved by real performance data.
nexus_creative_asset_pipeline.py — Fully automated. Science-driven. Revenue-tied.
Most plumbing companies throw photos at Google Ads and pray. We do not pray. We apply the scientific method to every single image. This is the unfair advantage that lets a $3M company market like a $30M one.
| Phase | What Happens | Example |
|---|---|---|
| Observe | Review current ad performance data. Which images get clicks? Which get conversions? | "Technician portrait ads have 2.3% CTR vs. 0.8% for vehicle shots." |
| Hypothesize | Form a testable prediction about what will perform better. | "Technician photos with the customer visible will outperform solo portraits by 20%." |
| Experiment | Deploy competing assets in the same ad group. Control variables (same copy, same audience). | Upload 3 solo portraits + 3 customer interaction shots to the same RSA. |
| Measure | Pull performance data after 500+ impressions per asset. | Pipeline Phase 6 auto-pulls CTR, conversions, cost per asset. |
| Conclude | Determine statistical significance. Did the hypothesis hold? | "Customer interaction photos: 3.1% CTR. Solo portraits: 2.3%. Hypothesis confirmed." |
| Evolve | Auto-adjust suitability scores. Winners get priority. Losers get demoted. | Pipeline Phase 7 promotes customer interaction photos to S-tier. |
| Setting | 🖼️ Landscape (1.91:1) | 🟦 Square (1:1) | 📱 Portrait (4:5) |
|---|---|---|---|
| Orientation | Horizontal | Horizontal (crop later) | Vertical |
| Resolution | Shoot wide; min 1200x628 output | 1200x1200 output | 960x1200 output |
| Aperture | f/2.8 to f/4 (subject isolation) | f/4 to f/5.6 (balanced) | f/2.8 (bokeh for mobile) |
| Shutter | 1/125s min (freeze motion) | 1/125s min | 1/125s min |
| ISO | 100-400 outdoors, up to 1600 indoors | Same | Same |
| White Balance | Daylight or Auto (consistent warmth) | Same | Same |
| Format | RAW + JPEG (RAW for editing, JPEG for quick use) | Same | Same |
| Category | Target Shots | Priority | Notes |
|---|---|---|---|
| 👷 Technicians | Solo portrait, action shot (working), customer handshake | Critical | Every tech needs 3 poses minimum. Clean uniform, visible logo. |
| 🚚 Vehicles | 3/4 angle branded side, parked in neighborhood, at job site | High | Clean vehicle. Shoot in residential neighborhoods. Show the brand. |
| 🛠️ Service Work | Sewer camera, pipe repair, water heater install, drain cleaning | Critical | Hands-on action. Show the expertise. Sewer work = #1 revenue. |
| 🔄 Before/After | Same angle, same framing. Problem visible then solved. | Critical | Pair naming: bsp_photo_before-after-sewer-repair_20260315.jpg |
| 🙏 Customers | Happy customer with technician, thumbs up, relieved expression | High | GET SIGNED RELEASE. Genuine emotion beats posed. |
| 🔧 Equipment | Sewer camera, jetters, pipe relining gear, water heaters | Medium | Clean backgrounds. Show scale (hand or person nearby). |
| 🚨 Emergency | Night call, flooded basement, burst pipe, emergency vehicle | High | Dramatic lighting OK. Show urgency and response speed. |
| 🤝 Team/Office | Team group, office front, dispatch area, training sessions | Medium | Show culture, professionalism, and the 5th-generation heritage. |
The pipeline has processed 16 photos and generated 78 variants. But we're running ads with only 2 out of 8 critical categories covered. The categories below are what actually DRIVE clicks and conversions. Fill these gaps = more leads = more revenue.
| Category | Count | Status | Examples in System |
|---|---|---|---|
| 👷 Technician Portraits | 6 | Covered | Matthew, Anthony, Dan, Ricardo, Izac, Scott |
| 🚚 Vehicle/Branding | 4 | Covered | Van neighborhood, upscale home, driveway, open door |
| 🛠️ Service Work (Sewer) | 4 | Covered | Sewer camera, excavation, pipe fusing (x2) |
| 🤝 Team/Group | 1 | Needs More | Team van LSA |
| 🏢 Office/Staff | 1 | Needs More | Office staff shot |
These categories have ZERO photos in the pipeline. Each one directly impacts ad performance and lead generation.
| Category | Why It Matters | Revenue Impact | Quantity Needed | Priority |
|---|---|---|---|---|
| 📸 Before/After Sewer Work | The MONEY SHOTS. Shows transformation. Proves expertise. Highest CTR of any photo type in home services ads. | Sewer = #1 revenue ($3K-$15K/job, 30-40% close rate). These photos directly sell the highest-ticket service. | 5-10 pairs minimum | 🔥 #1 PRIORITY |
| 🚨 Emergency Response | Creates URGENCY. Night calls, water damage, burst pipes. Emergency Eric is 50-60% of revenue. | Emergency persona drives majority of revenue. Urgency-based ads with real emergency photos convert 2-3x higher. | 3-5 shots | 🔥 Critical |
| 😊 Happy Customer Interactions | Social proof. Handshakes, thumbs up, relieved faces. People trust people, not logos. | Customer photos in Display/PMax ads increase conversion rates 25-40%. Trust = bookings. | 3-5 shots | High |
| 🔧 Equipment Close-Ups | Shows expertise and investment. Sewer cameras, jetters, pipe relining gear. "These guys have serious tools." | Equipment photos score 85+ suitability for Display and PMax. Builds trust with Renovation Rachel persona. | 3-5 shots | High |
| 🏠 Exterior at Customer Homes | BSP van parked at nice homes, techs walking to door. "They serve MY neighborhood." | Local trust photos boost LSA performance. Homeowners searching for plumbers want to see service in their type of neighborhood. | 3-5 shots | High |
| 🔥 Water Heater Work | #3 revenue service. Installs, repairs, old vs new units side by side. ZERO representation currently. | Water heater is a core service with dedicated ad campaigns. Having zero photos means we're running text-only or generic stock for this service. | 2-3 shots | Medium-High |
| 🚿 Drain Cleaning in Action | Techs using drain equipment, clogged vs clear drains. High-volume search category. | Drain cleaning is the gateway service (Maintenance Mike, highest LTV $5K-$25K lifetime). Photos of real work outsell stock 3:1. | 2-3 shots | Medium |
| 💨 Gas Line Work | Gas line repair/install. Safety-focused imagery. Smaller volume but high ticket and zero competition on visuals. | Niche service with high margins. Most competitors have zero gas line photos in their ads. | 1-2 shots | Medium |
The pipeline scores every photo for ad suitability across 4 channels: RSA (search), Display, PMax, and LSA. Here's what the data shows across the home services industry:
| Photo Type | Avg CTR Lift | Conversion Impact | Pipeline Suitability Score |
|---|---|---|---|
| Before/After pairs | +45-65% | +30-50% conversion rate | 95-100 across all channels |
| Emergency/urgency shots | +25-40% | +20-35% for emergency keywords | 90+ for urgency campaigns |
| Customer interactions | +20-30% | +25-40% (social proof) | 85-95 for Display/PMax |
| Equipment close-ups | +10-20% | +15-25% for research-phase queries | 85+ for Display/PMax |
| Solo technician portraits | baseline | baseline | 70-85 (good but limited) |
| Vehicle/brand shots | baseline | baseline | 80-90 (strong for LSA) |
Right now we're running ads with mostly portraits and vehicle shots (baseline performance). Adding before/after and emergency photos alone could increase ad CTR by 30-50%. That's the difference between $383 spent with zero leads and $383 spent with 3-5 booked jobs.
If you can only do ONE photo shoot this week, focus on these 5 shots:
These 5 photos unlock 5 new ad categories and fill every critical gap. Upload them to Google Drive using the naming convention below and the pipeline handles everything else automatically.
bsp_photo_[category]-[subject]_[YYYYMMDD].jpg Examples: bsp_photo_technician-anthony-portrait_20260315.jpg bsp_photo_vehicle-van-neighborhood_20260315.jpg bsp_photo_sewer-repair-camera-inspect_20260315.jpg bsp_photo_before-after-sewer-line_20260315.jpg bsp_photo_customer-happy-handshake_20260315.jpg bsp_photo_equipment-sewer-camera_20260315.jpg bsp_photo_emergency-night-call_20260315.jpg bsp_photo_team-group-office_20260315.jpg
Bright Side Plumbing/Photos/2026/[Month]/nexus_drive_intelligence.py --pull syncs to VM, then nexus_creative_asset_pipeline.py --full runs Phases 1 through 4 automatically| Rule | Requirement |
|---|---|
| Color Mode | sRGB (not CMYK, not Adobe RGB). Export as sRGB from editing software. |
| File Types | JPEG preferred (smaller files, better compression). PNG only for logos/transparency. |
| Text in Images | Google penalizes images with >20% text. Keep text overlays minimal or zero for ad images. |
| Borders/Watermarks | Never. Google will reject or suppress images with watermarks, borders, or frames. |
| Aspect Ratio Tolerance | Google allows slight deviation, but the pipeline crops to exact ratios for best results. |
| Animation | Static images only for all placements except Display (which can use GIF, but we focus on static). |
nexus_drive_intelligence.py --pull syncs new photos from Google Drive to output/drive_imports/photos_2026/plumber- = technician_portrait)output/asset_pipeline.db)Upload photos to Google Drive using the naming convention. Ping Robert on Slack.
Run python nexus_creative_asset_pipeline.py --ingest (or --full for all phases). Review console output for new asset count.
Database records in asset_pipeline.db with status = PENDING. Log file updated at output/asset_pipeline_log.txt.
$ python nexus_creative_asset_pipeline.py --ingest 09:15:02 | INFO | [INGEST] Scanning output/drive_imports/photos_2026/... 09:15:02 | INFO | [INGEST] Found 12 new images (3 duplicates skipped) 09:15:03 | INFO | [INGEST] bsp_photo_technician-anthony-portrait_20260315.jpg -> 3024x4032, JPEG, technician_portrait 09:15:03 | INFO | [INGEST] bsp_photo_sewer-repair-camera-inspect_20260315.jpg -> 4032x3024, JPEG, service_work 09:15:04 | INFO | [INGEST] Phase complete: 12 assets cataloged
| Score | Meaning | Action |
|---|---|---|
| 90-100 | Excellent. Meets all requirements, high resolution, proper aspect ratio. | Auto-approve candidate |
| 70-89 | Good. Meets minimum, may need cropping or compression. | Optimize and review |
| 50-69 | Marginal. Meets some formats, may fail others. | Optimize, flag for Robert |
| Below 50 | Poor. Resolution too low or format issues. | Flag for re-shoot |
output/creative_assets/variants/output/creative_assets/
optimized/ # Compressed originals
variants/
bsp_photo_technician-anthony-portrait_20260315/
landscape_1200x628.jpg # RSA / PMax landscape
square_1200x1200.jpg # Display / PMax square
portrait_960x1200.jpg # PMax mobile portrait
compressed_display.jpg # Under 150KB for Display Network
optimized.webp # WebP for modern placements
output/creative_asset_review.html)Open creative_asset_review.html. For each asset: check framing, brand alignment, quality. Approve the winners. Reject anything that does not represent Bright Side at its best.
--deploy alone only simulates the upload and logs what would happen. To actually upload to Google Ads, you must run --deploy --execute. This is a safety mechanism.
$ python nexus_creative_asset_pipeline.py --deploy 09:30:01 | INFO | [DEPLOY] DRY RUN mode (use --execute for live upload) 09:30:01 | INFO | [DEPLOY] Would upload: landscape_1200x628.jpg (234 KB) -> RSA asset 09:30:01 | INFO | [DEPLOY] Would upload: square_1200x1200.jpg (312 KB) -> PMax asset 09:30:01 | INFO | [DEPLOY] DRY RUN complete: 8 assets would be uploaded $ python nexus_creative_asset_pipeline.py --deploy --execute 09:31:01 | INFO | [DEPLOY] LIVE MODE - uploading to Google Ads account 7269555791 09:31:03 | INFO | [DEPLOY] Uploaded landscape_1200x628.jpg -> asset ID: 12345678 09:31:05 | INFO | [DEPLOY] Uploaded square_1200x1200.jpg -> asset ID: 12345679 09:31:07 | INFO | [DEPLOY] LIVE deploy complete: 8 assets uploaded
| Tier | CTR Range | Action |
|---|---|---|
| S-Tier | 3.0%+ | Keep running. Use as template for future shoots. |
| A-Tier | 2.0 to 2.99% | Keep running. Monitor for fatigue. |
| B-Tier | 1.5 to 1.99% | Keep but test replacements. |
| C-Tier | 1.0 to 1.49% | Schedule for replacement. |
| D-Tier | 0.5 to 0.99% | Pause. Analyze what went wrong. |
| F-Tier | Below 0.5% | Remove immediately. Do not re-use. |
The pipeline learns from every deployed image. Over time, it builds a statistical model of what works for Bright Side's specific audience in the KC metro. This is the compounding advantage that competitors cannot replicate, because they are not measuring at this granularity.
What makes great photos: Clean, branded uniform with visible logo. Genuine smile. Confident posture. Clean background (not cluttered garage). Well-lit face with no harsh shadows.
Composition tips: Head and shoulders for square crops. Waist-up with environment for landscape. Full body with truck for wide establishing shots.
Persona alignment: Emergency Eric needs to see a trustworthy face at the door. Maintenance Mike needs to see a professional he would invite back. The technician portrait is often the first visual impression.
What makes great photos: Clean, washed vehicle. 3/4 angle showing brand wrap. Parked in an attractive residential neighborhood (shows "we serve your area"). Golden hour light for warmth.
Composition tips: Low angle for heroic feel. Include house/neighborhood context. Ensure full brand text is readable. No clutter in background.
Persona alignment: Emergency Eric sees "they are on the way." Renovation Rachel sees "established, professional fleet." Business Bob sees "real company with real assets."
What makes great photos: Action shots. Technician operating the sewer camera. Excavation in progress with safety measures visible. Camera screen showing pipe interior. Clean, organized job site.
Composition tips: Show scale (person next to equipment). Include the problem being solved. Wide shots for context, tight shots for expertise. Lead with sewer content (it is the #1 revenue driver).
Persona alignment: Emergency Eric sees "they know what they are doing." Renovation Rachel sees "modern equipment, professional process." This category should be the largest in the library.
What makes great photos: EXACT same camera angle and distance for both shots. Clear problem visible in "before" (cracked pipe, flooded area, corroded fitting). Clean result in "after." Good lighting in both.
Composition tips: Mark camera position with tape on first visit. Use same lens and focal length. Include a reference object for scale. Shoot "after" at the same time of day for matching light.
Persona alignment: The most powerful conversion driver. Every persona responds to visible proof of transformation. Before/after pairs outperform single images in ad testing consistently.
What makes great photos: Genuine moments. Technician explaining findings to homeowner. Customer smiling after job completion. Handshake at the door. Natural expressions beat posed shots.
Composition tips: Shoot from slightly to the side (not dead-on). Include both faces. Ensure good light on the customer's face. Background should show residential setting.
Persona alignment: Emergency Eric sees "they care." Maintenance Mike sees "I could be that happy customer." This category builds trust faster than any other.
What makes great photos: Clean equipment on neutral background. Show scale with a hand or person nearby. Detailed texture and build quality visible. Good lighting with no harsh reflections.
Composition tips: 45-degree angle for 3D depth. Include identifying text/brand if relevant. Macro lens for small parts. Wide enough to show full equipment in context.
Persona alignment: Renovation Rachel sees "state-of-the-art tools." Business Bob sees "they invest in the right equipment." Establishes technical credibility.
What makes great photos: Dramatic but not chaotic. Technician arriving on scene (headlights, work lights). Flooded space being resolved. Urgency balanced with professionalism. Night and adverse conditions add authenticity.
Composition tips: LED work light creates dramatic key light. Silhouette of technician against lit van = powerful. Show response speed (dark sky + bright work lights). Avoid photos that look unsafe.
Persona alignment: Emergency Eric sees "they come at 2 AM." This category directly targets the highest-revenue persona. Worth scheduling a mock emergency photo shoot.
What makes great photos: Full team group shot (uniforms, branded backdrop). Office front exterior. Dispatch area. Training in progress. Holiday/event moments. Show culture and heritage.
Composition tips: Group photos: stagger heights (some standing, some kneeling). Office exterior: clean, well-lit, signage visible. Action shots of team meetings are more engaging than posed lineups.
Persona alignment: All personas. Team photos build trust and show "real people." Particularly effective for the "5th-generation master plumber" heritage story that differentiates Bright Side.
| Setting | Direction | Why |
|---|---|---|
| Exposure | Slightly bright, well-lit | Conveys positivity, professionalism, "bright side" |
| White Balance | Slightly warm (5500 to 6500K) | Warm = trustworthy, friendly, approachable |
| Saturation | +5 to +15% (subtle boost) | Colors pop without looking artificial |
| Contrast | Medium-high | Professional, crisp. Avoid flat/washed-out look. |
| Shadows | Open slightly (+10 to +20) | Show detail in dark areas. No crushed blacks. |
| Highlights | Pull back slightly (-5 to -15) | Recover detail in bright areas (sky, white vans). |
| Sharpening | Light (40 to 60, radius 1.0) | Crisp without halos or artifacts. |
| Vignette | None or very subtle (-5) | Heavy vignette looks amateur. |
| Filters/Presets | None | Consistency requires manual adjustment, not presets that drift. |
Reject immediately if any of these are present:
| ❌ Red Flag | Why It Fails |
|---|---|
| Blurry or out of focus | Looks unprofessional. Signals "we do not care about quality." |
| Dirty uniform or messy vehicle | Directly undermines trust. Customers expect clean = competent. |
| Visible competitor logos/brands | Legal risk and brand confusion. |
| Customer faces without release | Legal liability. Privacy violation. |
| Safety violations visible | No hard hat at excavation, no gloves at sewer work = liability magnet. |
| Cluttered, messy backgrounds | Distracts from subject. Makes the company look disorganized. |
| Watermarks from stock photo sites | Copyright infringement. Google will reject. |
| Over-filtered or heavy HDR | Looks fake. Erodes trust immediately. |
| Wrong address or phone number visible | NAP inconsistency kills local SEO. Only 12022 Blue Valley Pkwy. |
| Text covering more than 20% of image | Google will suppress the ad or reject the asset entirely. |
Photo priorities shift with the seasons because customer needs shift. This calendar ensures we always have fresh, relevant imagery ready BEFORE the seasonal demand spike hits.
Priority: Frozen pipe emergencies, water heater failures, indoor repair work
Shoot: Emergency response at night, burst pipe repair, water heater installs. Cold weather = high emergency volume.
Priority: Sewer backups (freeze/thaw cycle), indoor plumbing maintenance
Shoot: Sewer camera inspections, drain cleaning. Slow season = invest in studio-quality technician portraits.
Priority: Spring thaw sewer damage, sump pump installs, outdoor plumbing prep
Shoot: Excavation work begins. Sewer line replacement. Before/after pairs for spring repairs.
Priority: Sewer line inspections, outdoor faucet repairs, spring renovation projects
Shoot: Green lawns + branded vans = beautiful fleet photos. Customer interactions in nice weather.
Priority: Water heater maintenance, gas line work, renovation season begins
Shoot: Long golden hours. Team group photos outdoors. Equipment in use on large projects.
Priority: Sewer replacements (ground is soft), bathroom/kitchen renovations
Shoot: Major excavation projects. Before/after transformations. Happy customers with completed renovations.
Priority: Peak renovation, commercial projects, water line work
Shoot: Large-scale projects. Commercial work for Business Bob persona. Action shots in summer light.
Priority: Back-to-school plumbing prep, water heater season approaching
Shoot: Begin stockpiling fall/winter imagery. Water heater installations. Preventive maintenance visits.
Priority: Fall maintenance push, furnace + water heater combos, drain cleaning
Shoot: Fall colors + branded van = seasonal fleet photos. Maintenance Mike persona content.
Priority: Winterization, heating system prep, sewer inspections before freeze
Shoot: Technicians doing inspections. Before/after of winterization work. Last good outdoor light.
Priority: Emergency preparedness content, frozen pipe prevention, heating
Shoot: Holiday-themed team photo. Emergency response staging. Indoor work documentation.
Priority: Emergency services, holiday plumbing disasters, frozen pipes
Shoot: Night emergency responses (dramatic). Holiday team photos. Year-in-review compilation imagery.
| RSA Landscape | 1200x628 | 1.91:1 |
| RSA/PMax Square | 1200x1200 | 1:1 |
| PMax Portrait | 960x1200 | 4:5 |
| Logo Square | 1200x1200 | 1:1 |
| Logo Wide | 1200x300 | 4:1 |
| LSA Min | 720px min side | Any |
| YouTube Thumb | 1280x720 | 16:9 |
| Display Max | 150 KB | Varies |
| Ads Max | 5,120 KB | Varies |
bsp_photo_[cat]-[subject]_[date].jpg
Photos/2026/[Month]/| Command | Phase | Description |
|---|---|---|
python nexus_creative_asset_pipeline.py --ingest |
Phase 1 | Scan Drive imports, extract metadata, catalog to SQLite |
python nexus_creative_asset_pipeline.py --validate |
Phase 2 | Check specs, score suitability, flag quality issues |
python nexus_creative_asset_pipeline.py --optimize |
Phase 3 | Auto-crop variants, compress, convert to WebP |
python nexus_creative_asset_pipeline.py --review |
Phase 4 | Generate HTML review gallery for Robert |
python nexus_creative_asset_pipeline.py --deploy |
Phase 5 | DRY RUN: simulate Google Ads upload |
python nexus_creative_asset_pipeline.py --deploy --execute |
Phase 5 LIVE | LIVE upload approved assets to Google Ads |
python nexus_creative_asset_pipeline.py --measure |
Phase 6 | Pull performance data from Google Ads API |
python nexus_creative_asset_pipeline.py --evolve |
Phase 7 | Analyze patterns, adjust scores, generate recommendations |
python nexus_creative_asset_pipeline.py --full |
Phases 1-4 | Run ingest through review in one pass |
python nexus_creative_asset_pipeline.py --status |
Report | Show pipeline status summary |
python nexus_creative_asset_pipeline.py --slack |
Notify | Send pipeline summary to Slack |
| Command | Purpose |
|---|---|
python nexus_drive_intelligence.py --pull |
Sync photos from Google Drive to VM (runs before --ingest) |
gcloud compute ssh nexus-vm |
SSH into the Nexus VM (34.55.179.122, us-central1-a) |