Who are you reading this as?
This document is dense by design — it's a full system spec, not a summary. Pick your reader type below and get a suggested reading path so you're not starting from scratch.
The ↺ Reflection notes scattered throughout each module show how I'd approach things differently now — that's the honest layer. The Email Campaign section has the actual performance numbers.
The ↺ Reflection notes flag where I made a deliberate tradeoff vs the cleaner alternative. The Appendix has honest 2026 tool landscape notes including where AI is changing the stack.
The system was built to be mostly hands-off once running — M15 documents how it monitors itself and alerts when something breaks.
Dual Wing Rental
Marketing Engine
A complete marketing and CRM system for rental businesses that need to generate both landlord supply and renter demand — simultaneously. Not two campaigns. One flywheel.
This project documents a marketing system I built for a property management company operating in the UK. The core challenge: the business needed landlords (supply) and renters (demand) at the same time — most marketing systems are built for one audience, not two. This Grimoire is the blueprint for how both were grown simultaneously, with each side feeding the other.
↓ /* n8n: new listing → Claude API → social posts auto-generated */
Renter inquiries → Tagged by city in GHL → Demand proof report
↓ /* weekly: "X renter inquiries in [city] this week" → warm landlord leads */
More landlords convert → More listings → LOOP
"The wings are not independent. They are a flywheel."
Landlord — Supply Acquisition
Property owners list with you. Offer: revenue optimization, fast tenant placement, hands-off management.
Renter — Demand Generation
Tenants inquire and book. Offer: verified listings, fast approval, easy booking.
Landlord Outreach Sequence — Performance Summary
7-day automated sequence targeting property owners. List size: ~340 contacts. Segment: verified landlords in the Liverpool / Merseyside area, sourced via platform scraping and organic form submissions. Sent via GoHighLevel across a 6-week active period.
(industry avg: 21–28%)
(industry avg: 3–5%)
This wasn't a straightforward B2C list. Several factors made landlord email outreach in this market genuinely difficult: social stigma around openly identifying as a landlord meant many contacts were guarded in how they engaged. Geographic displacement was real — through platform data scraping, a portion of the list had billing addresses outside the UK entirely, including contacts in the Middle East managing properties remotely. Loyalty barriers were also significant: many landlords had long-standing relationships with existing letting agents and were not actively looking to switch. The copy strategy had to acknowledge these realities rather than ignore them.
Copy strategy — what worked for this audience
| Subject Line Approach | Avg Open Rate | Notes |
|---|---|---|
| "Your Liverpool property could be earning more" | 41.3% | City-specific + income frame. Best performer. |
| "Is your agent actually optimising your rental?" | 38.7% | Competitive framing without naming rivals. |
| "A quick question about your property" | 29.2% | Curiosity-led. Good for cold contacts. |
| "Free income projection — your [city] property" | 26.8% | Offer-led. Better for warm re-engagement. |
| "Property management services in Liverpool" | 17.4% | Service-forward. Avoided after Week 1. |
Deliverability setup
Segmentation approach
The 340-contact list was split into three working segments before any send. This prevented a one-size-fits-all sequence from going to contacts who needed very different messaging.
| Segment | Size | Sequence variant | Key difference |
|---|---|---|---|
| Local active landlords | ~180 | Standard 7-day | Income optimisation frame. Assumed existing agent relationship. |
| Remote / displaced owners | ~90 | Hands-off management variant | Copy emphasised remote management, reporting, and peace of mind over income. |
| Dormant / no prior engagement | ~70 | Re-engagement variant | Softer tone. No pitch until Day 3. D0 email was informational only. |
GHL was the right tool for the CRM-to-email connection — behavioural triggers like "reply → pause sequence" work natively and that saved a lot of custom logic. But GHL's email deliverability infrastructure is shared and you can't fully control your sending reputation the way you can with a dedicated ESP like Instantly or Smartlead.
Email Campaign Engine — Landlord Wing
The sections below document the operational layer behind the campaign results above: how campaigns are typed, sequenced, executed, measured, tested, and connected back to the CRM. This is the execution architecture, not just the outcome.
Sequences do not run linearly for all contacts. Reply to any email → pause sequence immediately, move to CRM HOT pipeline. Click link without reply → tag [High Intent], accelerate to Day 5 email within 24h. Unsubscribe → suppress all sends, update GHL suppression list in real time.
Testing in this campaign was intentionally limited to one variable per send. Running multiple variables simultaneously makes it impossible to attribute performance changes. Each test ran for a full send cycle before conclusions were drawn.
Email does not end at the inbox. Every meaningful action a contact takes in the sequence triggers a GHL tag or pipeline move. This is where the system outclasses a standalone email tool — behaviour data from email feeds directly into the CRM and changes what happens next.
This is what operating the campaign system looks like day-to-day. The system is automated but not autonomous — it requires consistent human oversight to catch failures and adapt based on performance signals.
| Cadence | Task | Tool | Purpose |
|---|---|---|---|
| Daily AM | Review new leads entered overnight. Confirm Day 0 sequences fired. Check for any HOT lead replies requiring same-day response. | GHL dashboard | Catch automation failures before they compound. 5-minute rule for HOT leads. |
| Daily | Monitor campaign open rate for any live sends. If rate falls below 15% in first 2 hours, pause and audit deliverability before remaining sends go out. | GHL Email Stats | Deliverability protection. One bad send can damage domain reputation. |
| 2–3x / week | Build and schedule next campaign batch. Write subject line variants for A/B test. QA check on new templates before scheduling. | GHL + Sheets | Keep pipeline of content ahead of send calendar. Prevents rushed sends. |
| Weekly | Pull open/click/reply rates per sequence and per day. Update test log. Identify lowest-performing email in active sequence for replacement. | GHL + Looker Studio | Performance optimisation loop. Stale sequences decay — review prevents plateau. |
| Weekly | Adjust segments based on new tag data. Move contacts between segments as engagement changes. Remove hard bounces and update suppression list. | GHL Smart Lists | List hygiene. Sending to bad addresses degrades deliverability over time. |
| Monthly | Full sequence audit — review every email against current copy strategy. Replace underperformers. Update city references if expanding to new markets. | GHL templates | Prevents sequence decay from market shift or copy staleness. |
| Regulation | What it requires | Where it applies |
|---|---|---|
| GDPR | Lawful basis for processing. Explicit consent for marketing. Right to erasure on request. | All contacts, emails, SMS |
| PECR | Opt-in required for all electronic marketing to individuals. | Email + SMS sequences |
| ICO Registration | Required if processing personal data for business purposes. £40–60/yr. | Your entire CRM operation |
| Regulation | What it requires | Where it applies |
|---|---|---|
| CAN-SPAM | Unsubscribe in every email. Physical address in footer. Honour opt-outs within 10 days. | All email sequences |
| TCPA | Prior written consent before marketing SMS. Do not text numbers on DNC list. | All SMS automations |
| CCPA + State Laws | Right to know, right to delete, opt-out of sale. (CA, VA, CO) | Any contact from these states |
GHL Minimum Setup
// Non-negotiable. Do this first. EMAIL FOOTER (every template): [Company Name] | [Physical Address] [Unsubscribe] → GHL suppression list sync "You received this because you submitted a form on [site]." SMS FOOTER: "Reply STOP to unsubscribe." GHL SETUP CHECKLIST: ☑ Unsubscribe link active in all email templates ☑ STOP keyword handling enabled for all SMS workflows ☑ Suppression list configured — sync in real time ☑ Consent checkbox on all forms (not pre-ticked) ☑ Privacy policy linked on all forms n8n: ☑ Before any outreach: check GHL suppression status ☑ If suppressed = true → skip all send actions → log only
| Layer | Tool | Role | Est. Cost | Status |
|---|---|---|---|---|
| CRM Core | GoHighLevel | Pipelines, SMS, email, funnels, calendar | $97–297/mo | Essential |
| Complex Workflows | Make.com | Multi-step ops, data routing, scheduled tasks | $9–20/mo | Essential |
| AI Orchestration | n8n (self-hosted) | AI agents, Claude API connector, lead scoring | $6/mo VPS | Essential |
| AI Engine | Claude API (Sonnet) | Content gen, lead scoring logic, follow-up copy | ~$10–60/mo | Essential |
| Simple Connectors | Zapier | Fast mainstream app connections | $20/mo | Optional |
| Listing Sync | Pabbly | Listing platform bulk sync | $19/mo | Essential |
| SEO Research | Semrush | Keywords, audits, competitive analysis | $140/mo | Defer to M3+ |
| Content Optimization | Surfer SEO | On-page optimization | $89/mo | Defer to M3+ |
| Video Editing | CapCut | Short-form content editing | Free | Essential |
| Distribution | Repurpose.io + Buffer | Cross-platform scheduling | $21/mo | Essential |
| Design | Canva Pro | Graphics, thumbnails, creatives | $15/mo | Essential |
| Analytics | GA4 + Looker Studio | Traffic, conversions, dashboards | Free | Essential |
| Call Attribution | CallRail | Phone lead tracking | $45/mo | Optional |
Bootstrapped Budget — First 90 Days
// Get to first conversion. Everything else deferred. GHL $97/mo (Starter) Make $9/mo (Core baseline) n8n VPS $6/mo (Hetzner CX11) Claude API ~$15/mo (weekly content cadence) Canva Pro $15/mo Buffer $6/mo GA4 + Looker Free UptimeRobot Free ────────────────────────────── BASE TOTAL ~$148/mo RANGE ~$143–204/mo depending on Make tier + Claude API usage // Defer until Month 3+: Semrush, Surfer, OpusClip, Submagic, Repurpose.io, CallRail
n8n self-hosted was the right call for cost control — $6/mo vs $50+ for equivalent cloud workflows. But the maintenance overhead is real and doesn't appear in the budget line. Every VPS update, every n8n version upgrade, every SSL renewal is time. If I were starting this today I'd evaluate whether Make's newer AI-native steps close the capability gap enough to justify the simpler ops.
SEO M1.1 — SEO Acquisition Subsystem
The hyper-local cluster strategy was the right call — targeting "/rent-out-property-liverpool" over "property management" was the only realistic path for a new business against established national competitors. The typed input model and priority scoring were also genuinely useful; they prevented chasing high-volume terms that would never rank.
M1.2 — Social Content Engine
Content Multiplication System
INPUT : 1 content idea (row in Google Sheet) OUTPUT : 1 long-form blog post (800–1200 words, SEO optimised) 3 short-form video scripts (TikTok / Reels / Shorts) 2 carousel posts (Instagram / Facebook) 1 email (nurture list) 1 retargeting ad angle 3 caption variants (short / medium / long with hashtags) WORKFLOW (n8n + Claude API): TRIGGER : New row added to "Content Ideas" Google Sheet STEP 1 : n8n reads row → [Topic / Wing / Keyword / Priority] STEP 2 : n8n sends to Claude API with full prompt (see M11.1) STEP 3 : Claude returns structured content JSON STEP 4 : n8n saves outputs to Google Drive STEP 5 : Make sends notification with Drive link STEP 6 : Human review gate — MANDATORY before any publish STEP 7 : Approved → Buffer scheduled STEP 8 : Approved video → Repurpose.io queued
Hook Bank — Landlord
1. "Your [city] property could earn £/$/X more per month" 2. "3 mistakes landlords make that cost them tenants" 3. "How we filled a property in [city] in 4 days" 4. "What Airbnb doesn't tell you about your rental income" 5. "Empty property = losing £/$/X every single day" 6. "Why your property isn't getting inquiries (honest answer)" 7. "Guaranteed rent vs Airbnb: which actually pays more?"
Hook Bank — Renter
1. "Affordable apartments in [city] that are actually verified" 2. "How to get approved for a rental in [city] fast" 3. "This studio in [city] had 11 inquiries in 24 hours" 4. "Move-in ready apartments in [city] — no hidden fees" 5. "The honest guide to renting in [city] in 2026"
Posting Schedule
| Frequency | Content Type | Notes |
|---|---|---|
| Daily | 1 short-form video (rotate wings) | Batch record weekly |
| Daily | 1 social post (carousel or image) | Schedule via Buffer |
| Weekly | 1 blog post (SEO-targeted) | Human edit required |
| Weekly | 1 email send (segmented list) | Review open rates |
| Weekly | 2 Reddit answers (rental subs) | Manual — no automation |
| Monthly | 1 landlord case study | Real numbers only |
| Monthly | 1 local market report | SEO + authority play |
M1.3 — Listing Platform Layer
UK PRIORITY ORDER: Tier 1 (launch): Airbnb, Booking.com, Facebook Marketplace Tier 2 (Month 3+): SpareRoom, Gumtree, Zoopla/Rightmove* // *Rightmove/Zoopla API: 4–8 weeks minimum, gatekept. Plan for manual CSV first. US PRIORITY ORDER: Tier 1 (launch): Airbnb, Booking.com, Facebook Marketplace, Craigslist Tier 2 (Month 3+): Zillow Rental Manager, Apartments.com, Zumper ⚠ KNOWN GAP: Two-way sync is not fully solved. A booking on Airbnb will NOT update GHL automatically without Hospitable ($40/mo) or Guesty (enterprise). First 90 days: external platform calendars = source of truth for availability. GHL = source of truth for leads and contacts. Document this clearly.
M1.4 — Paid Traffic (Optional Accelerator)
FACEBOOK / INSTAGRAM STRUCTURE (1 campaign per wing): Ad Set 1 — COLD (40% budget) Audience: Lookalike or interest-based CTA: Learn More → landing page Ad Set 2 — WARM (30% budget) Audience: Page visitors last 30 days Creative: proof (case study, earnings, reviews) CTA: Get Projection / Book Viewing Ad Set 3 — HOT (30% budget) Audience: Form starters who didn't submit / 75%+ video viewers Creative: urgency / scarcity CTA: Direct form or WhatsApp // 2026: Enable Meta CAPI + TikTok Events API via GHL native integration. // Without server-side events, you're working with 30–50% of signal.
LANDLORD PAGE FLOW: URL: /rent-out-property-[city] Form → GHL pipeline "Landlord - New Lead" Thank you: /landlord-next-steps (what happens next + calendar embed) RENTER PAGE FLOW: URL: /rentals-[city] Form → GHL pipeline "Renter - New Inquiry" Thank you: /renter-next-steps (available listings + WhatsApp CTA) MICRO-FORM (reduce abandonment 30–50%): Above fold: email + city only (2 fields) Step 2: full form reveals after submission Use for cold traffic. Full form for warm/retargeting. SUBMISSION TRIGGER (GHL Workflow): ACTION 1: Create contact record → Check for duplicate by phone number FIRST → If duplicate: merge or flag — do NOT create second record ACTION 2: Apply tag [Wing: Landlord] or [Wing: Renter] ACTION 3: Apply tag [Source: {{utm_source}}] ACTION 4: Create opportunity in correct pipeline ACTION 5: Check suppression list — if suppressed, stop ACTION 6: Fire automation sequence (Module 5) ⚠ GHL OUTAGE SAFETY NET (5 min setup, zero cost): Configure backup email notification to personal inbox on form submit. Fires independently of GHL automation. Catches leads during GHL downtime.
Score Buckets
Landlord Scoring Matrix
| Condition | Points | Rationale |
|---|---|---|
| Property type = HMO or multi-unit | +20 | Higher revenue potential |
| City = target market | +15 | Within service area |
| Currently vacant | +15 | Immediate urgency |
| Realistic income expectation | +10 | Saves wasted consultation time |
| Phone number provided | +10 | Reachable for high-value outreach |
| Source = SEO | +5 | Higher intent than social |
| Outside service area | -10 | Geographic mismatch |
| Unrealistic income expectation | -10 | High churn risk post-close |
Lead Score Decay (n8n — runs nightly)
// A static score is lying to you. // A lead scored 70 on Day 0 is not a 70 lead on Day 7 with no engagement. TRIGGER: n8n scheduled — midnight, every night STEP 1: Pull contacts with lead_score > 0 AND tag [Sequence Active] STEP 2: For each contact: IF days_since_last_engagement > 7: lead_score = lead_score - 15 Apply tag [Engagement: Cooling] IF days_since_last_engagement > 14: lead_score = lead_score - 20 additional Apply tag [Engagement: Cold] Move to COLD sequence if currently WARM STEP 3: Write updated score → GHL custom field STEP 4: Log adjustment in GHL contact notes ENGAGEMENT EVENTS THAT RESET DECAY CLOCK: Email open → +5 (mild interest) Email click → +10 (strong interest) SMS reply → +15 (active engagement) Page visit → +10 (return intent) Form partial → +15 (high intent, incomplete)
Landlord Pipeline Stages
| Stage | Entry Trigger | Auto-Action |
|---|---|---|
| 1. New Lead | Form submitted | Fire Landlord Sequence |
| 2. Contacted | Replied to any message | Create consultation task |
| 3. Consultation Booked | Calendar booking confirmed | Send confirmation + reminders |
| 4. Evaluated | Call completed (manual move) | Send revenue projection |
| 5. Agreement Sent | Manual post-evaluation | Follow-up in 48h if unsigned |
| 6. Closed - Won | Contract signed | Fire onboarding workflow |
| 7. Closed - Lost | Manual | Tag reason + 90-day re-engage |
Renter Pipeline Stages
| Stage | Entry Trigger | Auto-Action |
|---|---|---|
| 1. New Inquiry | Form submitted | Fire Renter Sequence |
| 2. Listings Sent | Auto after Day 0 | Wait for response |
| 3. Viewing Booked | Booking confirmed | Confirmation + reminders |
| 4. Viewed | Manual after viewing | Same-day follow-up |
| 5. Offer / Booking | Intent confirmed | Send booking form + payment link |
| 6. Closed - Won | Payment received | Fire fulfillment workflow |
| 7. Closed - Lost | Manual | Tag reason + 30-day re-engage |
GHL Custom Fields
LANDLORD FIELDS: property_type, property_city, property_bedrooms, currently_occupied current_monthly_income, expected_income lead_score // written by n8n lead_temperature // HOT/WARM/COLD — written by n8n utm_source, utm_medium, utm_campaign // hidden form fields sequence_day, last_contacted_date, last_engagement_date days_since_engagement // calculated nightly by n8n contract_signed_date, property_listed_date referred_by // contact ID human_review_required // Y/N — set for HOT leads RENTER FIELDS: budget_min, budget_max, move_in_date, property_type_wanted city_preference, num_occupants lead_score, lead_temperature listings_sent, listings_matched_count // written by n8n inventory check viewing_date, booking_date saved_search_criteria // for Notify Me / waitlist feature referred_by
Landlord Sequence — Days 0–7
HOT 60+ → Slack/email alert to owner: "Call within 2 hours"
Copy framing: curiosity-led. No hard service pitch. Reference their city specifically.
IF no reply → SMS + Email with case study / earnings preview
SMS (6–7pm local): reference the case study earnings
Best-performing day in sequence by open rate. Subject line personalised to city.
⚠ Honest urgency only. "2 slots left this month" must be true. Do not invent scarcity.
SMS: final message, leave door open
Consistently recovered dormant contacts. 31.8% open rate — second highest in sequence.
Sequence: Completed → 90-day re-engage list
Renter Sequence — Days 0–7
IF 0 matches → send [Empty Inventory] variant + Waitlist: No Match
IF matches → SMS + Email with dynamic listing block (3 properties)
SMS: "found a couple more options — sent to your email"
Email: "Still looking?" + stay updated CTA
Sequence: Completed → monthly listings update list
Behavioral Triggers (Interrupt Any Sequence)
Contact replies to any message: → Pause sequence immediately → Task: "Reply received — manual follow up now" → Tag [Replied] · Move stage → Contacted Contact clicks booking link but doesn't complete: → SMS within 30 min: "Looks like you started booking — anything I can help with?" Contact opens email 3+ times without responding: → Tag [High Interest - No Action] → Task: "High email engagement — call now" → Trigger AI personalized follow-up (M11.2) Contact sends keyword "EMERGENCY", "ASAP", "urgent", "call me now": → Tag [Emergency: Urgent Contact] → Immediate Slack alert to owner → SMS from owner number within 15 min New listing added matching renter's saved search criteria: → SMS: "We found it — a [property type] in [city] just became available" → Email with property details
LANDLORD CONSULTATION BOOKING (GHL calendar triggered): Email (immediate): confirmation + what to expect + calendar links SMS (immediate): confirmed + reschedule option SMS (24h before): reminder SMS (1h before): reminder POST-CONSULTATION (stage moved to Evaluated): Email (within 2h of call): personalised revenue projection ┌──────────────────────────────────────────────┐ │ Estimated monthly income : £/$/[X]–[X] │ │ Management fee : [X]% │ │ Net to you monthly : £/$/[X]–[X] │ └──────────────────────────────────────────────┘ CTA: [VIEW AGREEMENT] AGREEMENT FOLLOW-UP (48h no signature): Email + SMS: "Any questions about the agreement?" AGREEMENT SIGNED (DocuSign/PandaDoc webhook → GHL): → Move stage: Closed - Won → Fire onboarding workflow (M7) → Create property onboarding task list RENTER — INTENT TO BOOK CONFIRMED: Email: Step 1 application form + Step 2 holding deposit payment link SMS: "I've reserved [property] for 24 hours. Complete your application: [link]" PAYMENT RECEIVED (Stripe webhook → GHL): → Move stage: Closed - Won → Fire fulfillment workflow (M7)
LANDLORD ONBOARDING (triggered: Stage = Closed - Won): STEP 1: GHL task list created ☐ Request property photos + access ☐ Collect docs: EPC (UK) / Inspection (US), gas cert, insurance ☐ Management agreement signed ☐ Property set up in system ☐ Listing assets created STEP 2: Welcome email → secure upload link + photo guidelines STEP 3: Make workflow polls for document uploads → team notified on completion STEP 4: Listing live confirmation (Email + SMS) STEP 5: 7-day check-in: views / inquiries / bookings report RENTER STAY MANAGEMENT (booking confirmed + payment): Day 0: Full booking confirmation email (check-in date, key instructions) Day -3: SMS: "Your stay starts in 3 days!" Day 0 AM: SMS + Email: check-in instructions (key code, WiFi, parking) Day 0 +2h: SMS: "Hope you're settled in — anything needed?" Day -1: Checkout reminder (time + key return) Day +1: Review request (Google / Airbnb / Booking.com links)
LANDLORD RETENTION: Monthly automated report (Make + GHL, 1st of month): Bookings · Occupancy rate % · Revenue · vs. last month · Upcoming bookings Upsell — IF occupancy < 70% for 2 consecutive months: → Optimisation consultation email offer Upsell — IF landlord has 1 property AND 6+ months active: → Multi-property upsell sequence RENTER RETENTION: Day 1: Review request Day 7: "We'd love to have you back" + 10% returning guest discount Day 30: "Any upcoming plans?" + availability CTA Loyalty tags: After 2 stays → [Returning Guest] After 3 stays → [Loyal Guest] + priority support
LANDLORD REFERRAL (triggered: Closed - Won + 30 days): Email: "Know another landlord in [city]?" + reward details SMS (1 week later, no referral): reminder GHL tracking: custom field: referred_by (contact ID) tag [Referred Lead] on new contact tag [Referring Contact] on referrer On referral close → issue reward + thank you email RENTER REFERRAL (triggered: positive review 3+ stars): SMS +24h: "If friends are visiting [city] — they get 10% off, you get 10% off" Email: referral program details + shareable tracking link
FACEBOOK / INSTAGRAM AUDIENCES: Audience 1: All website visitors (180 days) Audience 2: Landlord landing page visitors (180 days) Audience 3: Renter landing page visitors (180 days) Audience 4: Form starters — did not submit (90 days) Audience 5: Thank you page visitors = converters [EXCLUDE FROM ALL AD SETS] Audience 6: Video viewers 75%+ (180 days) Lookalike audiences: Build ONLY after 100+ conversions EXCLUSION SYNC (Make): TRIGGER : Contact tagged [Converted] ACTION : Make adds email to Facebook Custom Audience exclusion list Prevents serving ads to existing customers. Saves budget. // 2026: Enable Meta CAPI + TikTok Events API via GHL. // Without server-side events: 30–50% of signal. LAL quality degrades.
Automated Content Generation Workflow
TRIGGER: New row in "Content Ideas" Google Sheet Columns: [Topic] [Wing] [Target Keyword] [Priority] [City] STEP 1: n8n reads row STEP 2: n8n sends to Claude API (Sonnet) PROMPT TEMPLATE: ──────────────────────────────────────────────────────── "You are a content writer for a rental property management company. Topic: [topic] Target audience: [Wing] Keyword: [keyword] City: [city] Market: [UK/US] Tone: Conversational, trustworthy, direct. No fluff. Specific. Generate: 1. BLOG POST — 800–1000 words, H1/H2, keyword 3–4x naturally, CTA at end 2. VIDEO SCRIPT 1 — 60 seconds, hook/value/proof/CTA 3. VIDEO SCRIPT 2 — 30 seconds, urgency/curiosity 4. VIDEO SCRIPT 3 — 90 seconds, educational/case study 5. EMAIL — 150–200 words, subject + single CTA button label 6. CAROUSEL — 6 slides: slide 1 hook, 2–5 value, 6 CTA 7. CAPTIONS — short / medium / long with hashtags (max 10) Return ONLY valid JSON: {blog, video1, video2, video3, email, carousel, captions}" ──────────────────────────────────────────────────────── STEP 3: Claude returns JSON STEP 4: n8n parses JSON // try/catch — Claude occasionally returns malformed JSON // on error: log, retry once, alert if fails twice STEP 5: n8n saves to Google Drive STEP 6: Sheet row status → "Generated" STEP 7: Make → Slack/email: "✅ Content ready: [Topic] — [Drive link]" STEP 8: Human review — MANDATORY gate STEP 9: Approved → Buffer scheduled · Approved video → Repurpose.io
AI Personalized Follow-Up (n8n + Claude API)
TRIGGER: Contact tagged [High Interest - No Action] STEP 1: n8n pulls contact data from GHL API Fields: name, wing, city, property_type, budget, source, days_since_entry, sequence_day, lead_score STEP 2: n8n sends to Claude API "Write a personalized follow-up SMS (max 160 chars) and email (subject + 100 words max) for this lead. Rules: - Do NOT use: 'just checking in', 'hope this finds you well', 'circling back', 'touching base' - DO include: one specific reference to their city or property type - Do not fabricate urgency. Only reference real scarcity if confirmed. Return ONLY valid JSON: {sms, email_subject, email_body, email_cta}" STEP 3–7: Send SMS via GHL API · Send email via GHL API · Log in timeline
Looker Studio Dashboard Structure
| Page | Key Metrics | Source |
|---|---|---|
| 1. Acquisition | Sessions by source · Landing page CVR · CPL by channel · Time on page | GA4 + GHL → Sheets |
| 2. Pipeline | New leads · Consultation booked rate · Close rate · Avg days to close (per wing) | GHL → Sheets |
| 3. Content | Top posts by reach + clicks · Email open/click rate per sequence day · Video views by hook type | Buffer + GHL + Sheets |
| 4. Finance | CPA per wing · Revenue MoM · Best channel ROI · Operator time cost | Sheets (manual) |
Weekly Intelligence Report (n8n + Claude API)
TRIGGER: Every Monday 8:00am STEP 1: n8n pulls last 7 days from Google Sheets (leads/channel · conversion rates · email open/click · HOT leads actioned) STEP 2: n8n sends to Claude API "You are a growth analyst for a dual-wing rental marketing business. Here is last week's performance data: [data] In 200 words max: 1. What worked — top 2 things, with numbers 2. What needs fixing — top 2 things, specific cause if identifiable 3. This week's priority action — 1 specific, executable thing Rules: Be direct. If data is insufficient, say so. Do not invent trends from sparse data. Flag any metric that looks like a tracking error." STEP 3: Claude returns analysis STEP 4: n8n sends → email + Slack: "📊 Weekly Marketing Intel — [date]"
GOOGLE SHEETS STRUCTURE: Table 1: Cost Per Lead [Channel] [Spend] [Leads] [CPL] [Notes] SEO (time) → log hours × rate. Not zero. Table 2: Cost Per Acquisition [Wing] [Leads] [Closed] [Close %] [CPA] Table 3: Revenue Per Property [Property] [Mgmt Fee %] [Avg Booking Rev] [Net/Month] Table 4: Monthly Tool Costs (Actual vs Budget) GHL · Make · n8n VPS · Claude API · Canva · Buffer · other TOTAL: ~$168–430/mo depending on tier Table 5: Operator Time Ledger [Activity] [Hours/Week] [Hourly Rate] [Weekly Cost] DECISION RULES: IF CPL > threshold AND close rate < X%: → Pause or kill that channel IF tool cost > attributable revenue generated: → Evaluate replacement or removal IF operator time > 30% of revenue: → Identify highest-time tasks for automation priority IF HOT lead conversion rate < 50%: → Human response protocol is broken — audit immediately
FLYWHEEL LOOP: STEP 1: Landlord closes → property listed on platforms STEP 2: New listing → n8n → Claude API → generate 5 hooks specific to this property → generate 3 listing-specific social posts → schedule via Buffer automatically STEP 3: Content distributed → renter inquiries increase STEP 4: Renter inquiries captured in GHL → tagged by city STEP 5: n8n generates weekly "demand proof" report by city STEP 6: Demand proof email → all WARM landlord leads in that city "We had [X] renter inquiries in [city] this week. Is your property ready to capture this demand?" STEP 7: Social proof raises landlord conversion rate STEP 8: More landlords → more listings → back to STEP 2 FLYWHEEL BREAKS IF: ⛔ Landlord supply drops (acquisition stalls) ⛔ Renter inventory is empty (no social proof for landlords) ⛔ Demand proof email isn't sending (Make workflow offline) ⛔ Demand threshold too high (no emails fire) DEMAND PROOF WORKFLOW (Make — every Monday 9:00am): STEP 1: Pull last 7 days renter inquiries from GHL by city STEP 2: IF inquiries in city > [threshold — start at 3]: Pull all WARM landlord leads in same city Claude API → generate demand proof email Send via GHL to segment STEP 3: Log open rate + click rate to Google Sheets STEP 4: IF threshold not met → log "Insufficient demand data — [city]" Do NOT send. Empty proof emails kill credibility.
n8n (self-hosted VPS) — UptimeRobot (free): Ping n8n webhook endpoint every 5 minutes Alert: SMS to owner + email if down Auto-restart via systemd service on VPS Setup time: 20 minutes. Non-negotiable. GHL: Notable outages in 2023, 2024, 2025. Backup: on every form submit, direct email to personal inbox fires independently of GHL automation. Catches leads during GHL downtime. Cost: zero. Setup: 5 minutes. Make / Zapier: Set: notify immediately on scenario failure. Review error logs weekly — silent failures are common. Claude API: n8n: try/catch on all Claude API calls On error: log to Sheet, send Slack alert, skip (don't halt) Content machine failing silently for a week is a real risk.
Weekly System Health Check (Every Friday — 30 min)
FORMS: ☐ Submit test form (both wings) ☐ Verify GHL contact created + lead score populated + tags applied ☐ Verify Day 0 SMS + email fired within 5 min SEQUENCES: ☐ Last 10 new contacts — did sequences fire correctly? ☐ Behavioral triggers working? (reply → pause sequence) CONTENT MACHINE: ☐ Add test row to Content Ideas sheet ☐ Verify n8n triggers and Drive files created ANALYTICS: ☐ GA4 receiving data (realtime check) ☐ Looker Studio connections not broken ☐ Unit economics sheet updated FLYWHEEL: ☐ Monday demand proof email sent (check GHL sent log) ☐ Weekly Intel Report arrived Monday 8am MONITORING: ☐ UptimeRobot — any downtime events? ☐ Make scenario error log — any failures? ☐ Claude API usage — tracking against budget?
Automation Platforms
| Platform | Best For | 2026 Status |
|---|---|---|
| n8n (self-hosted) | AI orchestration, Claude API, cost control | Active. Best cost-per-workflow for AI-heavy stacks. |
| Make.com | Scheduled ops, visual logic, non-dev users | Good complement to n8n. Use together. |
| Zapier | Quick mainstream integrations | Expensive at volume. Use sparingly. |
| ActivePieces | Open-source Make alternative | Growing. Watch for GHL native connector. |
AI Content Generation
| Tool | Best For | Verdict |
|---|---|---|
| Claude API (Sonnet) | Long-form, structured JSON output, nuanced copy | ✓ Correct for this stack. Review Q3 2026. |
| GPT-4o API | Speed, multimodal | Less consistent on structured output |
| Gemini Pro API | Google ecosystem | Copy quality below Claude/GPT-4 for this use case |
| Jasper / Copy.ai | Non-technical users | Black box, limited API, expensive |
WhatsApp Channel Setup
PLATFORM: GHL WhatsApp Business API Requires: Meta Business verification (1–3 business days) USE CASES IN THIS SYSTEM: Renter Day 0: Listing photos via WhatsApp (higher engagement than email) HOT Lead Alert: Owner notified via WhatsApp (faster than email) Viewing Reminders: Day before + 2hr before Post-Stay: Review request (higher open rate than SMS) // UK 2026: WhatsApp open rates 90%+ vs SMS 82% vs email 20–35% // Build in Week 1 for UK-focused. Do not treat as optional. // US: SMS still dominant. WhatsApp for international communities in // major metros (NYC, Miami, LA, Houston).