Aaron Suarez · ← The Library Grimoire 002 · Dual Wing Rental Marketing Engine
Technical mode — full system documentation
↺ Start here

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.

👔
Hiring Manager
Evaluating fit for a marketing or growth role. Want to understand what was built and why.
⚙️
Developer / Ops
Interested in the system architecture, automation logic, and technical decisions.
🏠
Client / Collaborator
A business owner or partner wanting to understand the strategy and what it delivers.
Suggested path for hiring managers: Enable Portfolio Mode (toggle top-right) first — it replaces code blocks with plain-English explanations. Then read in this order:

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.

Suggested path for developers and ops readers: Stay in Technical Mode (default). The full code logic is visible. Start with the architecture, then go deep on what interests you.

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.

Suggested path for clients and collaborators: Enable Portfolio Mode first. Then read the overview and the two wing cards — that's the strategy in two minutes. The Email Campaign section shows real results from a real campaign.

The system was built to be mostly hands-off once running — M15 documents how it monitors itself and alerts when something breaks.

Grimoire 002 · v4 · Built for UK / US markets · April 2026

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.

You're in Portfolio Mode. Plain-English explanations are shown throughout. Technical code blocks are hidden. Toggle off at the top to see the full system documentation.

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.

15 modules
2 CRM pipelines
13 tool stack
UK + US compliance
~$148/mo base stack
6-week build sequence
Claude API content engine
How to use this document. This is not a checklist. It is a decision-support system. Every section tells you not just what to do but why this and not that. When you're deep in implementation and second-guessing yourself, come back here. Trust the architecture. Verify the trade-offs.
The Flywheel — read everything through this loop
Landlord Supply Properties listed on platforms Renter content triggered
/* 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."
Wing 1

Landlord — Supply Acquisition

Property owners list with you. Offer: revenue optimization, fast tenant placement, hands-off management.

Primary KPI: Properties under management
Secondary KPI: Avg revenue per property
Wing 2

Renter — Demand Generation

Tenants inquire and book. Offer: verified listings, fast approval, easy booking.

Primary KPI: Bookings / tenancies completed
Secondary KPI: Days from inquiry to booking
EMAIL
Landlord Email Campaign Engine
Campaign types · Sequence flow · Execution · Metrics · A/B testing · CRM integration · Daily ops
Campaign overview · Landlord Wing · Liverpool / Merseyside

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.

34.2%
Average open rate
(industry avg: 21–28%)
6.8%
Click-through rate
(industry avg: 3–5%)
18
Consultations booked from sequence
41%
Consultation-to-agreement conversion
Audience complexity — what made this hard

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.

Day 0 — Instant response
47.1% open
Highest open rate. Subject: curiosity-led, no service pitch. Deliverability confirmed at send.
Day 3 — Case study
29.4% open
Before/after income frame. Performed better when city name was in subject line.
Day 7 — Close file
31.8% open
Low-pressure "closing your file" approach. Consistently recovered dormant contacts.

Copy strategy — what worked for this audience

Key insight: Subject lines referencing a specific city (Liverpool, Merseyside) outperformed generic property management subject lines by an average of 11 percentage points in open rate. Hyper-local specificity reduced the "mass email" feeling — critical for an audience that was already resistant to outreach.
Subject Line ApproachAvg Open RateNotes
"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

Zero spam complaints across the active campaign period. This was achieved through proper SPF/DKIM/DMARC configuration, CAN-SPAM/GDPR-compliant footers on every send, real-time suppression list sync, and a list that had been scrubbed for invalid addresses before import. Unsubscribe rate held under 0.4% throughout.

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.

SegmentSizeSequence variantKey difference
Local active landlords~180Standard 7-dayIncome optimisation frame. Assumed existing agent relationship.
Remote / displaced owners~90Hands-off management variantCopy emphasised remote management, reporting, and peace of mind over income.
Dormant / no prior engagement~70Re-engagement variantSofter tone. No pitch until Day 3. D0 email was informational only.
↺ In hindsight — Email campaign approach

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.

Alternative I'd consider now: Decouple the sending layer. Keep GHL as the CRM and trigger engine, but route cold outreach through a dedicated cold email tool with warmed-up inboxes. More moving parts, but better deliverability control for cold lists specifically. For warm/opted-in sends, GHL is fine as-is.
Where AI changes this: Hyper-personalised subject lines generated per contact at send time (not at sequence build time) are already being tested in tools like Clay + Instantly. The fixed subject line A/B test model used here may look dated within a year — the future is dynamic copy that adapts to each contact's inferred context.
Campaign Engine — v4 Layer

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.

1 — Campaign Types
Cold Outreach
First contact with landlord leads sourced via platform scraping or form submission. Goal: open + curiosity. No service pitch in Day 0. City-specific subject line mandatory.
Follow-Up Sequence
Triggers when Day 0 email opened but no reply or click within 72h. Changes angle — moves from income framing to social proof or case study. 3-email cap before exit.
Nurture Sequence
For leads that engaged (opened 2+ emails) but haven't booked. Sent weekly for 4 weeks. Tone: informational, not sales. Builds trust for low-urgency landlords.
Re-Engagement
For contacts that went cold after 14+ days. Softer tone, single CTA, low-pressure exit frame ("closing your file"). Recovers 8–15% of dormant contacts when executed correctly.
2 — Email Sequence Flow (Cold → Warm)
Email 1 · Day 0
Intro / Value Hook
Curiosity-led subject. City-specific. No service pitch. One link max.
Email 2 · Day 3
Case Study / Proof
Before/after income frame. Named city in subject. Social proof from existing landlords.
Email 3 · Day 5
Alternative Angle
Shifts frame — targets remote/displaced segment. Hands-off management story.
Email 4 · Day 7
Close File / Exit
Low-pressure last attempt. "Closing your file" recovers dormant contacts. No follow-up after.
Behavioural branch logic

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.

3 — Campaign Execution Layer
Step 01
Build in GHL
Write email in GHL template editor. All sends use shared templates — single edit propagates to all sequences.
Step 02
Segment Audience
GHL smart list filters by tag, wing, engagement status, and city. Never send a single sequence to the full list unsegmented.
Step 03
QA Check
Send to internal test address. Verify: personalisation tokens populated, unsubscribe link active, footer present, mobile render correct.
Step 04
Schedule Send
GHL scheduled send. UK: 9–11am Tue–Thu. Avoid Monday AM and Friday PM. Consistent send time improves open rate over time.
Step 05
Deploy + Monitor
Go live. Monitor open rate in first 2h. If rate drops below 15%, pause and audit deliverability before continuing.
4 — Performance Metrics Layer
Open Rate
Subject line effectiveness. Target: >30%. Below 20% → audit subject line, sender name, or deliverability. Segment-level view required — aggregate hides problems.
Click Rate
Content + CTA relevance. Target: >5%. Below 3% → test CTA wording, button vs. text link, and placement. Track per email — Day 3 click rate should exceed Day 7.
Reply Rate
Primary conversion signal. Any reply = contact exits automation, moves to HOT pipeline. Aim for >2% reply rate on cold outreach. Benchmark: this campaign achieved 3.1%.
Success threshold
Consultation booked
Primary goal. 18 booked in this campaign from 340 contacts = 5.3% booking rate. Industry benchmark: 2–4% for cold landlord outreach.
Mid-funnel signal
Link click (no reply)
Triggers [High Intent] tag in GHL. Accelerates sequence. Indicates interest without commitment — nurture differently than cold contacts.
Exit condition
Unsubscribe / STOP
Below 0.5% = healthy. This campaign held at 0.4%. Above 1% indicates audience mismatch or frequency problem — investigate before next send.
5 — A/B Testing Logic

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.

Subject Line Tests
A: City-name + income frame
B: Question / competitive frame
C: Curiosity / ambiguous
D: Offer-led (income projection)
✓ Winner: City-name + income outperformed by avg +11pp open rate
Send Timing Tests
A: Tuesday 9am
B: Wednesday 10am
C: Thursday 11am
D: Monday 8am
✓ Winner: Tuesday 9am — 4.3pp higher open rate vs Monday 8am
CTA Variations
A: Text link ("See how it works")
B: Button ("Book a free call")
C: Soft link ("View one example")
✓ Winner: Text link outperformed button — consistent with B2B landlord context
Testing discipline: Do not test during re-engagement sends — dormant contacts behave differently than active sequences. Keep a test log in Google Sheets: variable, variant, send date, segment, result. Decisions made without a log are not tests — they're preferences.
6 — CRM Integration (Your Edge)

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.

Opened email → Tag: [Engaged]. No immediate action. Sequence continues normally. Used to build engaged audience segment.
Clicked link → Tag: [High Intent]. Sequence accelerates — skip to Day 5 email within 24h. Flag for manual review if score >60.
Replied → Sequence paused immediately. Contact moved to [HOT — Needs Call] in GHL Landlord Pipeline. Owner alerted via Slack + SMS within 5 min.
No response (Day 7) → Tag: [Cold — Sequence Complete]. Exits automation. Enters monthly flywheel demand-proof email only. No further sales outreach.
Unsubscribed → GHL suppression list updated in real time. All active sequences halted. Tag: [Suppressed]. No further sends of any kind.
Booked consultation → Tag: [Consultation Booked]. All sequences paused. Moves to Conversion stage. Confirmation + reminder flows activate via Calendly webhook.
7 — Daily Operations Layer

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.

CadenceTaskToolPurpose
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.
📤
Send
Schedule + deploy
📊
Measure
Open / click / reply
🔬
Diagnose
Subject / timing / CTA
✏️
Adjust
One variable at a time
🔁
Resend
Next cycle with changes
⚠ PRE-FLIGHT
Compliance Layer
Configure before a single sequence fires or form goes live
Read before anything else. Non-compliance is not a fine risk in the abstract — it is a business-ending event if a campaign triggers a complaint at scale.
United Kingdom
RegulationWhat it requiresWhere it applies
GDPRLawful basis for processing. Explicit consent for marketing. Right to erasure on request.All contacts, emails, SMS
PECROpt-in required for all electronic marketing to individuals.Email + SMS sequences
ICO RegistrationRequired if processing personal data for business purposes. £40–60/yr.Your entire CRM operation
United States
RegulationWhat it requiresWhere it applies
CAN-SPAMUnsubscribe in every email. Physical address in footer. Honour opt-outs within 10 days.All email sequences
TCPAPrior written consent before marketing SMS. Do not text numbers on DNC list.All SMS automations
CCPA + State LawsRight 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
STACK
Stack Assignment
13-tool architecture with honest 2026 trade-offs
LayerToolRoleEst. CostStatus
CRM CoreGoHighLevelPipelines, SMS, email, funnels, calendar$97–297/moEssential
Complex WorkflowsMake.comMulti-step ops, data routing, scheduled tasks$9–20/moEssential
AI Orchestrationn8n (self-hosted)AI agents, Claude API connector, lead scoring$6/mo VPSEssential
AI EngineClaude API (Sonnet)Content gen, lead scoring logic, follow-up copy~$10–60/moEssential
Simple ConnectorsZapierFast mainstream app connections$20/moOptional
Listing SyncPabblyListing platform bulk sync$19/moEssential
SEO ResearchSemrushKeywords, audits, competitive analysis$140/moDefer to M3+
Content OptimizationSurfer SEOOn-page optimization$89/moDefer to M3+
Video EditingCapCutShort-form content editingFreeEssential
DistributionRepurpose.io + BufferCross-platform scheduling$21/moEssential
DesignCanva ProGraphics, thumbnails, creatives$15/moEssential
AnalyticsGA4 + Looker StudioTraffic, conversions, dashboardsFreeEssential
Call AttributionCallRailPhone lead tracking$45/moOptional

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
Time as a cost. "SEO (time) = $0" is a false entry in any unit economics model. Assign yourself a placeholder rate — $30–50/hr minimum — and log hours against each channel. This discipline prevents the trap of scaling to $10k/mo revenue while working 80-hour weeks at $15/hr effective rate.
↺ In hindsight — Stack decisions

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.

Alternative considered: Full Make.com stack (no self-hosted). Cleaner ops, easier handoff to a client, no VPS to maintain. Cost would be roughly $40–60/mo more at equivalent workflow volume. For a client-facing product rather than a personal system, I'd lean Make-only now.
Where AI changes this: Agents that can write and deploy their own n8n workflows are already in early access. Within 12 months the "build the automation" step may itself be automated — which means the tool choice matters less than the logic design.
M1
Acquisition Engine
SEO inbound · Social content · Listing platforms · Paid traffic

SEO M1.1 — SEO Acquisition Subsystem

Architecture intent. This SEO subsystem is designed with measurable outputs and feedback control. Each sublayer has defined inputs, outputs, and failure modes. The system does not run on intuition — it runs on state transitions and metric thresholds.
Layer 1 SEO Input Model — Typed Data Structure What enters the system
// SEO_INPUT — defined before any content is written or page is built SEO_INPUT = { keyword_cluster: string[], // ["rent out property liverpool", "property management liverpool"] search_intent: ["informational" | "commercial" | "transactional"], geo_modifier: string, // "liverpool" | "merseyside" | "L1" wing: ["landlord" | "renter"], content_type: ["pillar" | "supporting" | "landing" | "comparison"], priority_score: float, // 0.0–1.0 — derived formula below parent_cluster: string | null, // null = pillar page target_position: int, // goal ranking — drives optimisation threshold current_state: ["draft" | "published" | "indexed" | "ranking" | "optimized" | "decaying"] } // Priority scoring formula — calculated in Sheets, not guessed priority_score = (monthly_volume / 100) × (1 - keyword_difficulty / 100) × intent_weight // intent_weight: transactional=1.0, commercial=0.7, informational=0.4 // Liverpool / Merseyside clusters — actual deployment LANDLORD: ["rent-out-property-liverpool", "guaranteed-rent-liverpool", "airbnb-management-liverpool"] → transactional RENTER: ["rooms-for-rent-liverpool", "short-stay-liverpool", "studio-apartment-l1"] → transactional ⚠ Rightmove + Zoopla own generic head terms. Target hyper-local long-tail exclusively until DA > 30.
Layer 2 Content Generation Engine — Cluster Architecture How pages are produced
FOR EACH keyword_cluster (content_type = "pillar"): GENERATE: pillar_page → 1500–2500 words, keyword density 1.5–2.5% supporting_articles → 3–5 × 800–1200 words (semantic variations) internal_link_graph → bidirectional: pillar ↔ all supporting PAGE_SCHEMA = { H1: primary_keyword (exact match — no exceptions), H2s: semantic_variations[], // LSI terms, question formats word_count: >= 800, // pillar: 1500+ keyword_density: 1.5–2.5%, // measured, not eyeballed internal_links: >= 3, // anchor text = destination target keyword schema_markup: ["LocalBusiness", "FAQPage"], faq_items: >= 5, // keyword in 2+ answers geo_proof: 1 // min 1 locally unique data point — HCU 2026 requirement } LINK_RULES: Pillar → every supporting article // contextual in body Supporting → pillar page // "See our full guide" All pages → primary conversion CTA No orphan pages ⚠ orphan = indexed but not linked = crawl budget waste
2026 HCU compliance. AI-generated pages without locally unique data points are being actively penalised. Each city page needs at minimum one real local data point, real photos, and editorial differentiation. Swap-city templates will not rank.
Layer 3 Indexing & Discovery Layer Getting content found by crawlers
ON_PUBLISH(page): STEP 1: sitemap_update → add URL + lastmod to sitemap.xml STEP 2: index_request → GSC URL Inspection → Request Indexing // OR Indexing API for batches > 10 pages STEP 3: crawl_monitoring → check GSC Coverage report within 48–72h STEP 4: state_transition → page.current_state: "published""indexed" ROBOTS_CONTROL: Disallow → /thank-you/, /admin/, /?utm_*, /staging/ Allow → all landing pages, blog, pillar pages ⚠ Check robots.txt before launch. Blocking your own landing pages is a common silent failure. CANONICAL_RULES: /rent-out-property-liverpool/ → self-referencing canonical /rent-out-property-liverpool?ref=email → canonical to clean URL // prevents UTM duplication All /thank-you/ pages → noindex, nofollow SITEMAP_STRUCTURE: /sitemap-landlord.xml → all landlord landing + pillar + supporting /sitemap-renter.xml → all renter pages /sitemap-blog.xml → all blog posts Submit all to GSC. Re-submit on structural changes.
Layer 4 Conversion Pipeline — SEO Click to CRM Entry The full path from search to pipeline
GSC Rank
position 1–10
SERP Click
CTR signal
Landing Page
engage / bounce
CTA Click
above fold
Form Submit
UTM captured
CRM Entry
GHL pipeline
D0–D7
Conversion
consultation
// Every pipeline step has a GA4 event + GHL tag — attribution is end-to-end SEO_PAGE → GA4: page_view + dimensions: wing, keyword_cluster, geo CTA_CLICK → GA4: cta_click + param: position (above_fold | inline | footer) FORM_SUBMIT → GA4: form_submit + GHL tag: [Source: organic_seo] → UTM hidden fields: utm_source=google, utm_medium=organic, utm_campaign=[cluster] → GHL custom field: keyword_cluster written from hidden form field THANK_YOU → GA4: conversion + FB Pixel: Lead CRM_ENTRY → pipeline stage: New Lead → lead scoring (M3) → email sequence (M5) ⚠ keyword_cluster must be written to GHL on every organic submit. Without it, CPL per cluster cannot be calculated.
Layer 5 Performance Observability — Metrics & Thresholds What gets measured, what triggers action
CTR
Threshold: < 3% on positions 1–5
Rewrite title + meta. A/B test 2 variants. Evaluate after 14 days. High impressions + low CTR = title mismatch.
Avg Position
Target: ≤ 10 within 90 days
Position > target after 90d → content depth audit. Semrush gap vs top 3. Add missing H2s, increase word count, improve link equity.
Landing CVR
< 4% landlord / < 2% renter
Optimize CTA + form. Test micro-form (2 fields above fold). Verify trust signals visible without scroll on mobile.
Session Duration
Threshold: < 45 seconds
Intent mismatch. Re-read SERP — what does top 3 deliver that this page doesn't? Restructure above-fold content.
CPL (organic)
Derived: time_cost ÷ organic_leads
CPL rising → audit which clusters convert vs traffic-only. Deprioritise non-converting clusters. SEO time is not free.
Impressions
Low after 6 weeks post-publish
Indexing or intent issue. Re-audit crawl coverage in GSC. Re-check keyword cluster alignment with actual search queries.
Layer 6 Feedback Control Loop — Page State Machine Continuous optimisation cycle
DRAFT
PUBLISHED
INDEXED
RANKING
OPTIMIZED
DECAYING
RE-OPT
LOOP (runs weekly via n8n): 1. PUBLISH → state: "published" 2. INDEX_CHECK → GSC Coverage → state: "indexed" | "crawl_error" 3. MEASURE → pull GSC + GA4 into Sheets. state: "ranking" 4. EVALUATE → apply Layer 5 thresholds all metrics OK → state: "optimized" → monitor only any metric below threshold → state: "needs_work" → audit task created 5. DETECT_DROPOFF → compare vs 4 weeks prior avg_position increased > 3 positions → state: "decaying" organic_leads decreased > 30% → state: "decaying" 6. ADJUST → fix based on failure mode (Layer 7) 7. REPUBLISH → sitemap ping → index re-request 8. RE-EVALUATE → wait 14 days min. Measure delta. Close loop. // state written to Google Sheets. n8n reads weekly. // DECAYING state → Slack alert + GHL audit task. Nothing decays silently.
Layer 7 Cross-Wing CRM Integration Closing the loop between organic traffic and revenue
ON_FORM_SUBMIT (source = organic): GHL_CONTACT.tags.add("Source: organic_seo") GHL_CONTACT.tags.add("Wing: [landlord | renter]") GHL_CONTACT.custom_fields.keyword_cluster = utm_campaign_value → lead scoring fires (M3) → pipeline: New Lead → D0–D7 sequence fires (M5) IF no_conversion AND days_since_entry >= 7: → 90-day re-engagement list. organic_source tag preserved for long-cycle attribution. IF email_opens >= 3 AND no_click AND no_reply: → tag: "High Interest - No Action" → AI personalised follow-up (M11.2) referencing original landing page topic IF lead_score >= 60: → Slack alert: "HOT organic lead — [cluster] — call within 2h" // Renter organic traffic feeds the flywheel directly (M14) RENTER_INQUIRY → tagged by city → counted in weekly demand proof report → demand proof email → warm landlord leads same city → organic renter traffic directly converts landlord leads. The wings are not independent.
Failures SEO Failure Mode Registry Signal → root cause → fix
HIGH IMPRESSIONS · LOW CTR
Title/meta doesn't earn the click. Page ranks but snippet is weak.
→ rewrite_title_and_meta() · A/B 2 variants · 14-day window
HIGH CTR · LOW CONVERSION
Page earns the click but doesn't convert. Weak CTA, trust issues, or intent mismatch.
→ optimize_cta() · micro-form test · mobile 375px audit
PUBLISHED · NOT INDEXED
robots.txt blocking, noindex tag, bad canonical, or <72h since publish.
→ crawl_audit() · check robots + noindex + canonical · re-request in GSC
RANKING · POSITION DECLINING
Content freshness decay, stronger competitor page, or lost backlinks.
→ content_depth_audit() · Semrush gap vs rank 1 · update + republish
LEADS FROM SEO · NO CRM TAG
UTM params not passing to hidden form fields. Attribution chain broken.
→ test_utm_capture() · submit test form · verify GHL fields · fix within 24h
CITY PAGE RANKS · NATIONAL DOESN'T
Expected. National terms owned by Rightmove/Zoopla. Architecture is correct.
→ no action · continue local cluster expansion · monitor DA monthly
↺ In hindsight — SEO approach

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.

What I'd do differently: The feedback loop was manually triggered — I was checking GSC weekly rather than having n8n pull it automatically. Building the state machine into a proper automated Sheets + n8n pipeline from day one would have caught declining pages faster. It was on the plan but deprioritised. Don't deprioritise it.
Where AI changes this: AI Overviews (Google SGE) are already eating informational query traffic. The informational content clusters — "how to rent in Liverpool", "renting guide 2026" — are most exposed. Transactional clusters closer to conversion intent are more durable. If rebuilding today, I'd weight the priority_score formula to favour transactional intent even more heavily than it already does.

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
Quality gate is not optional. Claude will occasionally generate factually wrong specifics (rental figures, local laws, platform features). The human review step is error interception, not polish. Never auto-publish AI content without a human in the loop.

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

FrequencyContent TypeNotes
Daily1 short-form video (rotate wings)Batch record weekly
Daily1 social post (carousel or image)Schedule via Buffer
Weekly1 blog post (SEO-targeted)Human edit required
Weekly1 email send (segmented list)Review open rates
Weekly2 Reddit answers (rental subs)Manual — no automation
Monthly1 landlord case studyReal numbers only
Monthly1 local market reportSEO + 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)

When to activate: Only after organic produces at least 10 leads/month per wing. Paid traffic amplifies a working system. It does not fix a broken one. Starting budget: $10–20/day per wing.
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.
M2
Entry & Capture System
Landing pages · Forms · Booking flows
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.
M3
Lead Qualification Engine
Scoring logic · Decay · Segmentation tags

Score Buckets

60+
HOT
Personal response within 2 hours. Automation alone will not convert.
30–59
WARM
Standard automation sequence. Monitor engagement signals.
0–29
COLD
Long nurture sequence only. Do not push hard.

Landlord Scoring Matrix

ConditionPointsRationale
Property type = HMO or multi-unit+20Higher revenue potential
City = target market+15Within service area
Currently vacant+15Immediate urgency
Realistic income expectation+10Saves wasted consultation time
Phone number provided+10Reachable for high-value outreach
Source = SEO+5Higher intent than social
Outside service area-10Geographic mismatch
Unrealistic income expectation-10High 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)
M4
CRM Core (GHL)
2 pipelines · Custom fields · Segmentation tags

Landlord Pipeline Stages

StageEntry TriggerAuto-Action
1. New LeadForm submittedFire Landlord Sequence
2. ContactedReplied to any messageCreate consultation task
3. Consultation BookedCalendar booking confirmedSend confirmation + reminders
4. EvaluatedCall completed (manual move)Send revenue projection
5. Agreement SentManual post-evaluationFollow-up in 48h if unsigned
6. Closed - WonContract signedFire onboarding workflow
7. Closed - LostManualTag reason + 90-day re-engage

Renter Pipeline Stages

StageEntry TriggerAuto-Action
1. New InquiryForm submittedFire Renter Sequence
2. Listings SentAuto after Day 0Wait for response
3. Viewing BookedBooking confirmedConfirmation + reminders
4. ViewedManual after viewingSame-day follow-up
5. Offer / BookingIntent confirmedSend booking form + payment link
6. Closed - WonPayment receivedFire fulfillment workflow
7. Closed - LostManualTag 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
M5
Automation Engine
Landlord sequence · Renter sequence · Behavioral triggers
Manual-First Rule for First 20 Leads. Before trusting this sequence with real leads at scale, run the first 20 leads per wing manually through Days 1–7. Log which day they respond, what triggers a reply, what kills the deal. Build the sequence from that data — not from assumptions. One week of manual observation will improve your automation for years.

Landlord Sequence — Days 0–7

D0
Instant Response (0–5 min after form submit)
SMS + Email (within 5 min) · GHL task: call same day within 1 hour
HOT 60+ → Slack/email alert to owner: "Call within 2 hours"
Copy framing: curiosity-led. No hard service pitch. Reference their city specifically.
D1
Reminder (no booking + no reply + 24h elapsed)
IF replied → pause sequence, create manual follow-up task
IF no reply → SMS + Email with case study / earnings preview
D3
Proof / Case Study (still no booking, still Stage 1)
Email: landlord case study (before/after income, timeline)
SMS (6–7pm local): reference the case study earnings
Best-performing day in sequence by open rate. Subject line personalised to city.
D5
Urgency (still no booking)
Email + SMS: capacity/scarcity angle
⚠ Honest urgency only. "2 slots left this month" must be true. Do not invent scarcity.
D7
Reactivation / Close File
Email: "Closing your file" — low-pressure re-open door
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

D0
Instant Response — with inventory check (n8n)
n8n checks GHL inventory first: filter by city, budget, type
IF 0 matches → send [Empty Inventory] variant + Waitlist: No Match
IF matches → SMS + Email with dynamic listing block (3 properties)
D1
Reminder (no viewing booked + 24h)
SMS + Email re-showing listings. Add urgency: "X inquiries this week"
D2
Urgency Insert
SMS only: specific property has multiple enquiries this week
D3
Alternative Options (no engagement with original listings)
Email: 2–3 alternatives (different price range / area)
SMS: "found a couple more options — sent to your email"
D5
Social Proof
Email: renter success story — found apartment in 48 hours
D7
Final
SMS: leave door open
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
M6
Conversion Engine
Consultation flow · Viewing flow · Agreement + booking close
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)
M7
Fulfillment / Operations
Landlord onboarding · Renter stay management
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)
M8
Retention Engine
Landlord monthly reports · Renter re-engagement · Upsell triggers
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
M9
Referral Engine
Landlord referral · Renter referral · GHL tracking
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
M10
Retargeting System
Pixel audiences · Ad sequences · Exclusion sync
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.
M11
Content AI Pipeline
n8n + Claude API · Content machine · Personalized follow-up

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
M12
Reporting & Analytics
Looker Studio · 4-page dashboard · Weekly intelligence report

Looker Studio Dashboard Structure

PageKey MetricsSource
1. AcquisitionSessions by source · Landing page CVR · CPL by channel · Time on pageGA4 + GHL → Sheets
2. PipelineNew leads · Consultation booked rate · Close rate · Avg days to close (per wing)GHL → Sheets
3. ContentTop posts by reach + clicks · Email open/click rate per sequence day · Video views by hook typeBuffer + GHL + Sheets
4. FinanceCPA per wing · Revenue MoM · Best channel ROI · Operator time costSheets (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]"
M13
Finance Tracker
Unit economics · CPL · CPA · Operator time ledger
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
M14
Flywheel Connection
The growth loop that ties both wings together
This is the most important module in the system. If flywheel demand proof emails are not sending weekly, investigate before anything else. This is the system's primary growth lever.
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.
M15
System Monitoring & Resilience
A system that can fail silently is not a system — it's a time bomb
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?
BUILD
6-Week Build Sequence
Manual-first approach. Do not automate before you've observed.
1week
Foundation + Compliance
GHL account setup · Compliance layer (unsubscribe, STOP, consent, privacy policy) · Both pipelines created · All custom fields added · Forms built + connected · Day 0 instant response built + tested · GA4 + Pixels installed · UTM capture verified
2week
Manual Observation — Critical. Do NOT automate yet.
Handle first 20 leads per wing manually · Log: which day they respond, what triggers reply, what kills the deal, what objection repeats · Document findings in a "Sequence Learning" sheet · Build automation from this data — not from assumptions in a spec
3week
Core Automation (Data-Informed)
Full Day 0–7 sequences (both wings, built from Week 2 learnings) · Behavioral triggers configured · Lead scoring logic (n8n) · Lead score decay (n8n nightly) · Duplicate detection · Consultation + viewing booking flows + reminders · Post-conversion onboarding flows
4week
n8n + Content Engine
n8n self-hosted setup (Hetzner CX11) · UptimeRobot monitoring (same day, non-negotiable) · Claude API connected · Content Machine live (weekly cadence) · First 5 SEO pages live · Buffer + Repurpose.io connected · First 10 hooks written per wing
5week
Distribution + Analytics
Looker Studio dashboard connected (all 4 pages) · Unit economics sheet live (including time ledger) · Retargeting audiences created in Meta (CAPI enabled) · Pabbly listing sync: Airbnb + Facebook Marketplace only · Make flywheel workflow built + tested · Weekly Intel Report live
6+week
Optimise + Scale
WhatsApp Business API (UK priority) · Referral workflows activated (30 days after first close) · Programmatic SEO expansion (city 2) · Paid ads: ONLY after 30 organic conversions per wing · Lookalike audiences: ONLY after 100+ conversions · Rightmove/Zoopla/Zillow API when approved (Month 3+)
Critical Failure Points
If any of these are true, the system is broken before it starts
No CRM connection → every lead wasted from day one
Missing consent capture → regulatory exposure on every send
Slow Day 0 response → lose HOT leads (5-minute rule is real)
No STOP handling on SMS → carrier filtering + TCPA liability
No follow-up → 80% of potential revenue abandoned
No UTM tracking → blind attribution, can't optimise spend
n8n down with no alert → content machine + scoring stops silently
Duplicate contacts → same lead sequenced twice, trust damaged
Empty inventory email → renter Day 0 sends blank listing block
GHL rate limit hit → scoring fails silently at scale
HOT leads not called → highest-value leads abandoned to automation
Sequences edited live → test every trigger after any workflow edit
APPENDIX
2026 Tool Landscape Notes
Trade-offs current as of April 2026 — review Q3 2026

Automation Platforms

PlatformBest For2026 Status
n8n (self-hosted)AI orchestration, Claude API, cost controlActive. Best cost-per-workflow for AI-heavy stacks.
Make.comScheduled ops, visual logic, non-dev usersGood complement to n8n. Use together.
ZapierQuick mainstream integrationsExpensive at volume. Use sparingly.
ActivePiecesOpen-source Make alternativeGrowing. Watch for GHL native connector.

AI Content Generation

ToolBest ForVerdict
Claude API (Sonnet)Long-form, structured JSON output, nuanced copy✓ Correct for this stack. Review Q3 2026.
GPT-4o APISpeed, multimodalLess consistent on structured output
Gemini Pro APIGoogle ecosystemCopy quality below Claude/GPT-4 for this use case
Jasper / Copy.aiNon-technical usersBlack 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).
Related Grimoires