# Marketing Optimization Punch List

**Filed:** 2026-05-04 (S83-H165-D1) by CC
**Source:** H165 Phase-1 marketing audit (78 Master Contacts, $0 captured revenue, 7 brand surfaces)
**Audience:** Brady — for next-session prioritization

Brady's May 4 voice-note framing was the diagnosis: *"the operating reality is fragmentation."* Events, content, and product run on independent cadences with no weekly coordination surface. The 5 opportunities below are ranked by **revenue impact × ease of build**. Three are pure-code (CC can ship); two require a Brady decision before they're productive.

---

## #1 — Unify the weekly pipeline (events → content → offers)

**Problem.** Fuega May 1, ShareCraft, May 15, webinar — each event has its own email cadence, social post drafts, and offer placements. They don't coordinate. Brady wakes Monday with no single answer to *"what's anchoring this week?"* and decides ad-hoc all week.

**Fix.** A `Weekly_Campaigns` Airtable table in Holdings, one row per week. Fields: anchor event, content theme, primary offer, secondary offer, social post drafts (linked Records), email drip schedule. Build a `/admin/brady/` widget that surfaces the current week + lets Brady set next week's row in 5 minutes Monday morning. Wire n8n to read this row and align: `RC: Event T-7 Reminder`, `Content Publisher`, social auto-publish all pull theme + offer from the row.

**Why this wins.** Single decision point per week instead of 4–6 separate cadence triggers. Reduces Brady's "what should I post today?" cognitive load. Aligns drumbeat across surfaces — when an event is the anchor, every channel reinforces it. Expected uplift: 15–25% conversion (from cohort-anchored funnel studies).

**Effort.** 4–6h build (table + widget + 3 n8n integrations).

**Brady decision required:** ✅ direction. Does Brady want a weekly anchor at all (vs. continuing ad-hoc)? If yes, what's the cadence anchor — events (every event becomes the week) or themes (4 themed weeks per month)?

**Pointers:** `~/docs/ecosystem/audits/marketing_campaigns_state_2026-04-30.md` H128 inventory. `Content_Calendar` table already exists (Mirror Mirror base). `~/builders/build_rig_admin_brady.py` Campaign Hub section is the surface.

---

## #2 — Post-conversion upsell ladder (3 drips: RC / DS / WHG)

**Problem.** Post-Fuega thank-you fires. Post-DS-course-completion drip is skeleton. Post-Solshine-purchase: nothing. Customers convert once and go quiet. ARPU is single-purchase only.

**Fix.** Three parallel 7–14 day drip arcs:
- **RoseCard upsell after event** — attendees of any RC event get T+3 day "did you grab a RoseCard?" offer ($10 activation + $10/yr renewal).
- **DS course → Membership offer** — Day 30 post-completion: "you've built it; here's how to keep building" (MM Membership $33/mo or $297/yr).
- **Solshine reorder + bundled product** — Day 30 post-WHG-day: "ready to take more home?" (Solshine refill + Sirens Call companion product).

**Why this wins.** ARPU lift 30–40% on existing cohorts. RoseCard ($10/yr) + DS repeat ($297/yr) + Solshine ($15–50/order) = $322/contact ceiling if upsell ladder works. Even 10% capture on 78 contacts = ~$2,500/yr recurring.

**Effort.** 6–8h build (3 drip workflows + 3–6 email templates per arc).

**Brady decision required:** ✅ which brand first. RC has the most active cohort (Fuega May 1 + 15) and the cheapest test ($10 RoseCard). DS has the highest LTV but smallest active cohort. Recommend: **RoseCard upsell first** (lowest risk, fastest signal).

**Pointers:** `Email_Send_Log` already tracks transactional sends. `Confirmation_Email_Templates` (Holdings `tblFbDyE2vTKBWd6A`) is the template store. n8n `MM: DS Conversion Sequence` (`CXvpxWFhvHLCFeRi`) is the existing skeleton model.

---

## #3 — Prospect upsert wiring (3 missing intake workflows)

**Problem.** `Prospects` table is the central pipeline view but only ~30% populated. GH and LH intakes upsert to it; DS Webinar Registration, RC Contact, GH Consultation all bypass. Brady can't see his pipeline accurately.

**Fix.** Add `SYS: Prospect Upsert` calls to 3 missing workflows: `MM: DS Webinar Registration` (`3XDPeotCujvYOGdo`), `RC: Contact Intake` (`dsGMLgYjWF0Ylv1e`), `GH: Consultation Intake` (`yYEO4v1yLAHkhmc4`). Each adds: extract email + name + intake source → upsert to Prospects → tag with intake channel + UTM source.

**Why this wins.** Restores pipeline visibility. Enables churn-risk scoring (60+ days quiet → re-engagement email). Unblocks the Lifecycle Funnel widget on `/admin/brady/` from being mostly empty.

**Effort.** 1.5h build (~30 min × 3 workflows).

**Brady decision required:** ❌ pure code. CC can ship.

**Pointers:** Existing pattern in `GH: Consultation Intake` (`yYEO4v1yLAHkhmc4`) — the call structure to copy. `Prospects` table fields documented in `shared/cross_brand.py`.

---

## #4 — Stripe Payment Log → Master Contacts join

**Problem.** Master Contacts shows "$0 total revenue captured" because `Stripe Payment Log` table (Mirror Mirror base `tblzKpgcv5lGbieZb`) isn't joined to Master Contacts. The H132 audit flagged this as the biggest visibility gap. Brady literally cannot see who has paid him via the dashboard.

**Fix.** Extend `~/builders/shared/cross_brand.py` to read `Stripe Payment Log` and aggregate per-email: total revenue, count of charges, first charge date, last charge date, lifetime products bought. Persist to Master Contacts via `bin/sync_master_contacts.py`. Update Lifecycle Funnel widget to show "Paid" tier.

**Why this wins.** Unlocks paid-customer segmentation. Enables the post-conversion upsell ladder (#2). Reveals which products convert (currently invisible). Closes the $0-captured-revenue diagnostic loop.

**Effort.** 2–3h build (read + aggregate + upsert + widget update).

**Brady decision required:** ❌ pure code. CC can ship.

**Pointers:** H132 handoff doc has the design sketch. `Stripe Payment Log` schema: `Recipient Email`, `Amount`, `Currency`, `Status`, `Created At`, `Product ID`, `Offer ID`. `shared/cross_brand.py` has the existing 7-table stitch — just add this as the 8th source.

---

## #5 — Cross-brand offer bundling (segment by webinar-only / event-only)

**Problem.** Each brand offers independently. A webinar attendee never sees RoseCourt event invites. An RC event attendee never sees DS webinar. Cross-brand LTV is leaky.

**Fix.** Segment Master Contacts by:
- **Webinar-only** (attended MM, no RC/RoseCard) → email: "you build systems; come build community at the next RoseCourt event. Free RoseCard included."
- **Event-only** (attended RC, no MM/DS) → email: "you came for the music; the systems behind it are open-source. Free webinar Friday."
- **Power user** (2+ brands) → exclusive Brady-personal touch (call/Slack/text).

**Why this wins.** Cross-brand LTV rises 25–40%; reduces churn by demonstrating ecosystem value. Friday-tango ↔ Friday-DS-webinar combo specifically would seat-fill both simultaneously.

**Effort.** 4–5h build (segment query + 3 email templates + 1 manual touch protocol for power users).

**Brady decision required:** ✅ strategy. What's the right cross-brand voice? Brady-personal (signed with first name) or brand-house (signed by brand)? Different segments may need different voices.

**Pointers:** `shared/cross_brand.py` already has `unified_brands` field per contact. Power Users widget on dashboard already surfaces 2+ brand contacts. Add 3 segment views in Master Contacts.

---

## Summary table

| # | Opportunity | Effort | Brady decision? | First step |
|---|---|---|---|---|
| 1 | Unify weekly pipeline | 4–6h | ✅ direction | Brady picks anchor cadence (event-led or theme-led) |
| 2 | Post-conversion upsell ladder | 6–8h | ✅ which brand first | Brady picks RoseCard / DS / Solshine — recommend RoseCard |
| 3 | Prospect upsert wiring | 1.5h | ❌ code-only | CC schedules next session |
| 4 | Stripe Payment Log join | 2–3h | ❌ code-only | CC schedules next session |
| 5 | Cross-brand offer bundling | 4–5h | ✅ voice strategy | Brady picks Brady-personal vs brand-house tone |

**Recommended next-session sequence:** #3 + #4 in one session (~4.5h, both pure-code, both unlock visibility). #1 + #2 in a separate strategy-first session after Brady's directional picks. #5 last after segmentation data is solid.

---

## What this list does NOT include (intentionally)

- More marketing channels (LinkedIn auto-post, Instagram, paid ads). Brady's bottleneck is unification, not reach.
- More products (Stripe SKU additions). 24 active products is plenty until conversion paths are wired.
- Drip refactor backlog. Already on Unified Projects (`reccXa6jZ7XKuTzps`); not blocking these 5.
- Retroactive content library cleanup. Productivity comes from forward-cadence, not back-cleanup.

The 5 above are revenue-relevant. Stop the bleeding ($0 visible revenue), align the cadence, then expand.
