---
name: local-service-flyer-system
description: Build Rob's print-ready, per-shop-tailored sales flyers for local-service walk-ins (bail bonds proven; HVAC/plumbing/etc. inherit). Covers the locked copy+design system (The Premium Line, One Town One Agency offer block, dual signatures), per-prospect brand scraping (logo/colors from their site), HTML→PDF rendering via weasyprint with single-page discipline, and Drive delivery. Trigger when producing, editing, or iterating walk-in flyers/leave-behinds for any local-service vertical. For the bail sales layer itself load bail-bonds-vertical-playbook; for GHL builds load ghl-voice-agent-build.
---

# Local-Service Flyer System

Rob's walk-in flyers are **tailored per prospect shop, printed in the prospect's own brand colors with their logo**, and double as the claim stub (signature lines on the page). First produced for the Brighton bail-bonds walk 2026-08. The system generalizes to any local-service vertical.

## Master assets (VPS)

| Path | What |
|---|---|
| `/root/.hermes/work/ghl/flyers/html/flyer-adan.html` | The LOCKED master (ADAN v15). Clone + pour for new shops |
| `/root/.hermes/work/ghl/flyers/html/flyer-{303,rapid,lucky,maryellen,mm}.html` | The other five Brighton pours |
| `/root/.hermes/work/ghl/flyers/brand/` | Scraped logos + the per-shop brand colors |
| `/root/.hermes/work/ghl/FLYER-REBUILD-PUNCHLIST.md` | Decision log (18 items) behind every line on the page |

## The locked page anatomy (don't re-litigate without Rob)

1. **Header:** prospect logo top-left (2x size) · center strip = their proof ("Serving Adams County since 1996" / "★ 4.6 · 559 Google reviews") · right = **THE PREMIUM LINE** masthead + "CALL IT RIGHT NOW: 1-877-526-3948" in their brand blue + "Built by Real Results Ready" (no LLC, no "system").
2. **"Prepared Specifically For:"** kicker in their blue, shop name in navy, title case.
3. **First-name/team hook** — leads with witnessed field intel when available ("I called the Brighton number at 5 a.m. on 8/8/2026…").
4. **The Problem + FIELD REPORT sidebar** (two columns; sidebar tinted their color).
5. **What It Does** — 4 beats, ends "Texts you the Intake Info."
6. **Payoff box** (bordered their blue, NOT filled): navy intro line spanning full width; blue numbered steps left-aligned; "They put their phone down!" bold+italic+RED underline.
7. **What You Get After Each Call: The Intake Info. & Call Data.**
8. **What It Will NEVER Do** — 2-column bullets.
9. **ONE TOWN. ONE AGENCY.** offer block: $497 Charter rate, small pen-check box + UNCLAIMED, 5 disc bullets in 2 columns (every "Free" in their blue, title case, values parenthesized), **dual signature rows** (shop + RRR, each with date) with a clear vertical gap, caption "Claims the town of [Town] for as long as the service runs." No exit line.
10. **Footer:** one-line "big dogs" bio + rob.blake@realresultsready.com + (720) 383-6868.

## Hard vocabulary rules (Rob's corrections — apply to ALL local-service copy)

- **"agency" / "office" — never "shop."** Bail bondsmen don't call their business a shop; the word marks you as an outsider.
- **No behavior claims you can't verify.** "The call goes to voicemail" was retired — callers hang up mid-ring and dial the next listing. Evidence beats adjectives; witnessed test calls ("field report") beat both.
- **Never teach the prospect his own math.** The Math section collapsed to two lines ("You know this number better than I do: 15% of the bond…"). Respect > lecture.
- **Product/offer naming:** THE PREMIUM LINE (product) · Charter (rate) · First-In (offer, verbal) · One Town. One Agency. (exclusivity). Internal SKU names ("Missed Call Only Agent") never appear on print.

## Field-report discipline (the witnessed-intel sidebar)

- **A shop's own flyer leads with THEIR OWN call result, named** ("All Day All Night (your line) — 5:03 a.m.…"). The whole credibility play is "I called YOU."
- **Every OTHER entry is anonymized** — "Another Brighton agency" / "A second Brighton agency." Never print a named competitor's failure on a flyer that sits in someone else's office (slander exposure + "what's he saying about me down the street?"). Names can be used VERBALLY in the room, never in print.
- **Anonymous entries carry a FOMO kicker** (Rob 2026-08-08): the italic stinger — *"They're losing callers every night — and don't even know it."* / *"Their callers hung up and kept dialing."* — so the reader thinks "another agency in town could grab this before me," not just "someone else is sloppy."
- **Guarantee is per-bucket by estimated call volume, not flat:** high-volume 30 · mid 20 · small/solo 10 (flat-30 was poured once and corrected — at a 2–10 calls/mo shop, 30 is an automatic free month and reads absurd in the room).
- Rob collects intel live (5 a.m. test calls morning-of-walk-in); each new result goes to the TOP of that shop's field report (named) and others rotate down.

## Brand scraping per prospect

- Pull homepage HTML, count hex colors (`grep -oP '#[0-9a-fA-F]{6}' | sort | uniq -c | sort -rn`), grab `*logo*` image URLs. Use their dominant brand color as `--their-blue`, a 6-8% tint of it for the sidebar.
- **Googlebot UA bypasses most bot-blocks** when plain curl 403s: `User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)`.
- Hotlink-protected images: send `-e <site>` referer; expired SSL: tolerate with `-k`/CERT_NONE (note it — it's pitch intel).
- **White-on-transparent logos are invisible on white paper** — check opaque-pixel average RGB with PIL before using; crop transparent padding (favicons often sit in a square canvas).
- **No usable logo → styled-text mark** in their brand color (Liberation Serif bold, two lines). Don't paste irrelevant art (Mary Ellen's "logo" was a Statue of Liberty photo).
- A **suspended website is intel, not a blocker** — it goes in the hook ("your website is down — worth checking today" = credibility moment).

## Rendering: weasyprint single-page discipline

- Binary: `/root/.hermes/venv/bin/weasyprint in.html out.pdf`. System fonts only: Liberation Sans (body) + Liberation Serif (display).
- **Single page is a hard requirement.** Iterate: `pymupdf` page count + `get_text('blocks')` bottom-y vs 792pt page. Compress in order: @page margin → section margins → font-size (floor ~9.4pt) → flatten bullet lists to inline (· separators) → shorten footer copy. Keep the offer block atomic: `page-break-inside: avoid`.
- weasyprint ignores `padding-bottom` on table cells — use an explicit spacer row (`<tr><td colspan=2 style="height:22px"></td></tr>`) for the signature gap.
- Multi-column bullet lists: `column-count: 2; column-gap: 26px; break-inside: avoid` on `li`.
- **Verify visually with the vision tool** on a 100-120dpi PNG of page 1 before delivering — and distrust vision-OCR for fine spacing judgments; measure with pymupdf coordinates when it disagrees with the CSS.

## Delivery

nginx /stage/ block + GOOGLEDRIVE_UPLOAD_FROM_URL per `composio-mcp-ops`. Verify bytes match, remove the stage block, confirm 404. Zip via python `zipfile` (no `zip` binary on the VPS).

## Pitfalls

1. **Copy drift from outside generators.** Cowork-Claude produced the visual shell well but invented copy that violated locked decisions (voicemail claims, AI asking bond amounts, unbuilt features). External generators get the STRUCTURE brief; our locked copy gets poured in afterward. Audit any outside copy against the punch list before it prints.
2. **Every iteration goes to Drive as a new versioned file** (flyer-ADAN-v{N}-...) — Rob reviews on his terms; never overwrite.
3. **Print TWO copies per shop** — prospect signs both, box checked on both; his shows ☑ CLAIMED, Rob's is the dated territory record.

## References

- `references/capture-report-design.md` — the monthly Capture Report (retention artifact promised on the flyer): agreed principles, structure sketch, open questions. Build before first client month-end.
