56 min readContent generation

Implementation Guide: Generate mls listing descriptions, social media posts, and email drip campaigns

Step-by-step implementation guide for deploying AI to generate mls listing descriptions, social media posts, and email drip campaigns for Real Estate clients.

Hardware Procurement

Agent Workstation Laptop

DellLatitude 5550 (i5-1345U, 16GB RAM, 512GB SSD, Windows 11 Pro)Qty: 1

$1,050 per unit (MSP cost) / $1,350 suggested resale

Primary workstation for agents to access AI content platforms, review generated content, and manage MLS submissions. 16GB RAM and SSD ensure smooth multitasking between browser-based AI tools, CRM, and MLS portals. One per agent if replacing existing hardware; skip if current machines meet minimum specs (8GB RAM, SSD, Windows 10/11 or macOS 12+).

Dual Monitor Kit

Dual Monitor Kit

DellDell P2423D 24-inch QHD IPS MonitorQty: 2

$230 per unit (MSP cost) / $310 suggested resale

Dual-screen setup allows agents to view MLS property data or photos on one screen while reviewing and editing AI-generated content on the other. QHD resolution provides sharp text rendering for proofreading listing descriptions. Includes VESA mount compatibility for desk arm installation.

Smartphone for Property Photo/Video Capture

Smartphone for Property Photo/Video Capture

AppleiPhone 16 Pro (128GB)Qty: 1

$999 per unit (MSP cost at retail) / $1,150 suggested resale

Captures high-quality property photos and video walkthroughs that feed into AI description generators and social media content. 48MP main camera with ProRAW support and 4K video at 120fps. Only needed if agents lack a modern smartphone (2022 or newer with 12MP+ camera).

Smartphone Tripod with Remote

ManfrottoManfrotto PIXI Mini Tripod with Universal Smartphone Clamp (MKPIXICLAMP-BK)Qty: 1

$45 per unit (MSP cost) / $75 suggested resale

Stabilizes smartphone for consistent property photos and video walkthroughs. Compact enough to carry in a bag between showings. Bluetooth remote eliminates camera shake during capture.

Wide-Angle Lens Attachment for Smartphone

MomentMoment 18mm Wide Lens (M-Series)Qty: 1

$130 per unit (MSP cost) / $180 suggested resale

Snap-on wide-angle lens for smartphone captures full room views that better showcase property interiors. Critical for generating accurate AI descriptions from photos — wider field of view means more features visible for the AI to describe.

Software Procurement

Write.Homes Pro

Write.HomesSaaS per-seatQty: per seat

$17.50/agent/month (MSP cost) / $35–$50/agent/month suggested resale

Primary AI content generation engine purpose-built for real estate. Generates MLS listing descriptions, social media posts, email templates, neighborhood guides, and blog posts. Uses GPT-4 with real estate-specific fine-tuning and prompt templates. Pro plan includes 60,000 words/month per seat — sufficient for ~120 full listing descriptions or equivalent mixed content.

Mailchimp Standard

Intuit MailchimpSaaS subscription

$14.99–$34.99/month based on contact count (MSP cost) / $30–$65/month suggested resale

Email marketing platform for automated drip campaigns. Receives AI-generated email content via Zapier and deploys multi-step nurture sequences to buyer and seller leads. Standard plan includes advanced audience segmentation, multi-step automations (critical for drip campaigns), A/B testing, and custom-coded email templates. Supports up to 100,000 contacts.

Buffer Essentials

BufferSaaS per-channelQty: per channel

$6/channel/month (MSP cost) / $12/channel/month suggested resale; Free plan available for up to 3 channels

Social media scheduling and publishing platform. Receives AI-generated social media posts and publishes to Facebook Business Page, Instagram Business, LinkedIn, and X/Twitter on optimized schedules. Analytics dashboard tracks engagement metrics per post type. More affordable than Hootsuite ($199/month) for SMB real estate offices.

Zapier Professional

ZapierSaaS subscription

$29.99/month for 750 tasks (MSP cost) / $50–$60/month suggested resale

Automation middleware connecting all platforms. Triggers workflows when new listings appear in MLS/CRM, sends property data to Write.Homes API or OpenAI for content generation, then routes generated descriptions to MLS, email content to Mailchimp, and social posts to Buffer. Professional plan includes multi-step Zaps, custom logic paths, and webhook support.

Follow Up Boss Grow

Follow Up BossSaaS per-seatQty: per user/month

$69/user/month (typically already licensed by client) / pass-through or $89/user/month suggested resale

Real estate CRM serving as the central lead and contact database. AI-generated email drip campaigns target contacts segmented within FUB. Integrates with 200+ lead sources (Zillow, Realtor.com, etc.). API access enables Zapier to pull lead data for personalized AI content generation. Most real estate offices already have this or an equivalent CRM — confirm during discovery.

Canva Pro (Teams)

CanvaSaaS per-seat

$13/user/month (MSP cost) / $25/user/month suggested resale

Visual content design platform for creating branded social media graphics, email headers, and listing flyers. Extensive real estate template library enables agents to quickly pair AI-generated text with professional visuals. Brand Kit feature ensures consistent colors, fonts, and logo placement across all content.

OpenAI API (GPT-5.4 mini)

OpenAIGPT-5.4 miniQty: Usage-based API

$0.15/1M input tokens + $0.60/1M output tokens; ~$0.0003 per listing description; typical office: $2–$10/month (MSP cost) / bundled into managed service fee

Backup and custom content generation engine for advanced workflows. Used when Write.Homes templated output needs supplementation — e.g., custom neighborhood narratives, luxury listing premium descriptions, or bulk social media post variations. Also powers the custom prompt library and any white-label content tools the MSP builds.

FairSentry

FairSentrySaaS subscription (custom pricing)

Contact vendor for pricing; typically $50–$200/month for SMB (MSP cost) / bundled into compliance service

Automated Fair Housing compliance monitoring. Scans all published listing descriptions, social media posts, and digital advertising for discriminatory language, steering, and Fair Housing Act violations. Monitors major platforms including Zillow, Facebook, Instagram, and brokerage websites. Essential risk mitigation layer for all AI-generated content.

Prerequisites

  • Active MLS board membership with IDX/RESO Web API data feed credentials for the local MLS (contact local MLS board to obtain API key or IDX feed URL — this can take 1–3 weeks for approval)
  • Existing real estate CRM with API access enabled (Follow Up Boss, BoldTrail/kvCORE, LionDesk, or equivalent). Confirm API key generation is available on the client's current plan.
  • Business internet connection with minimum 50 Mbps download speed (all processing is cloud-based; verify with speed test at each agent workstation)
  • Verified sending domain for email deliverability — the brokerage must own a domain (e.g., @smithrealty.com) and have DNS management access for SPF, DKIM, and DMARC record configuration
  • Agent workstations meeting minimum specs: 8GB RAM, SSD storage, Windows 10/11 or macOS 12+, Chrome/Edge/Safari (latest version)
  • Active Google Workspace or Microsoft 365 subscription for cloud storage of photo assets, templates, and documentation (minimum 50GB available per agent)
  • Brokerage broker-of-record approval for AI content use — obtain written acknowledgment that AI-generated content will be used for listings, email, and social media with mandatory human review
  • Credit card or payment method for SaaS platform subscriptions (recommend a dedicated MSP billing account for resale margin management)
  • Client's social media business accounts created and accessible: Facebook Business Page, Instagram Business account, LinkedIn Company Page (agents may also need individual profiles connected)
  • List of current email contacts exported from existing CRM or email system in CSV format (for Mailchimp import) with documented opt-in consent records

Installation Steps

Step 1: Discovery Audit & Platform Selection

Conduct a thorough audit of the client's existing technology stack before purchasing any licenses. Document the current CRM (name, plan, user count, API availability), MLS board and data feed type (RETS vs. RESO Web API), email marketing platform (if any), social media accounts and posting cadence, and current content creation workflow. Interview 2-3 agents to understand pain points and content volume needs. Based on findings, confirm the recommended stack or adjust (e.g., if client already has ...

Step 2: Procure and Configure Write.Homes Pro Accounts

Create Write.Homes Pro accounts for each agent who will generate content. Start with a single admin account for the MSP to configure templates and test outputs before rolling out to agents. Configure the brokerage's brand voice settings including company name, tone (professional, friendly, luxury, etc.), target market demographics, and any boilerplate language required by the brokerage (e.g., brokerage disclaimer, equal housing logo reference).

1
Navigate to https://write.homes and click 'Sign Up'
2
Select 'Pro Plan' ($17.50/month) for each agent seat
3
Complete registration with MSP billing email for centralized management
4
In Settings > Brand Voice, configure: Company Name: [Client Brokerage Name], Tone: [Professional/Luxury/Friendly — per client preference], Default listing style: [Narrative/Feature-focused/SEO-optimized]
5
In Settings > Templates, review and customize: MLS Listing Description template, Social Media Post templates (Facebook, Instagram, LinkedIn), Email templates (New Listing, Open House, Price Reduction, Market Update)
6
Test with a sample property: enter address, beds, baths, sqft, features
7
Review output for quality, accuracy, and Fair Housing compliance
8
Repeat for 3-5 sample properties across different price points
Note

Write.Homes offers a free Freemium plan with 1,500 credits — use this for initial testing before committing to Pro licenses for all agents. If the output quality doesn't meet client expectations, fall back to the Jasper AI or custom OpenAI API approach described in the alternatives section. Save all test outputs in a shared Google Drive folder for client review during the approval gate.

Step 3: Configure Email Domain Authentication for Deliverability

Before setting up any email drip campaigns, ensure the client's sending domain is properly authenticated to prevent AI-generated emails from landing in spam. Configure SPF, DKIM, and DMARC DNS records for the brokerage's domain. This is critical — without proper authentication, drip campaign effectiveness drops by 50-70%.

1
Log into the client's DNS management panel (GoDaddy, Cloudflare, Namecheap, etc.)
2
Add SPF record for Mailchimp: Type: TXT Host: @ Value: v=spf1 include:servers.mcsv.net ~all (If existing SPF record exists, ADD 'include:servers.mcsv.net' before '~all')
3
Add DKIM record for Mailchimp: - In Mailchimp, go to Settings > Verified Domains > Authenticate - Copy the CNAME records provided (typically two records) - Add both CNAME records to DNS: Type: CNAME Host: k1._domainkey (as provided by Mailchimp) Value: dkim.mcsv.net (as provided by Mailchimp)
4
Add/Update DMARC record: Type: TXT Host: _dmarc Value: v=DMARC1; p=none; rua=mailto:dmarc-reports@[clientdomain.com]; pct=100
5
Verify in Mailchimp: Settings > Verified Domains — status should show 'Authenticated'
6
Send test email to mail-tester.com and verify score is 9/10 or higher
7
After 2 weeks of monitoring, tighten DMARC policy — update Value to: v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@[clientdomain.com]; pct=100
Note

DNS propagation can take 24-48 hours. Do NOT proceed with email drip campaign setup until authentication is verified. If the client uses Google Workspace or Microsoft 365 for email, ensure the existing SPF record includes both the email provider AND Mailchimp — multiple SPF records on the same domain will cause failures. Use MXToolbox (https://mxtoolbox.com/spf.aspx) to validate the combined SPF record doesn't exceed the 10-lookup limit.

Step 4: Set Up Mailchimp Standard with Real Estate Audience Segments

Configure Mailchimp Standard as the email drip campaign engine. Create audience segments that align with real estate lead lifecycle stages, import existing contacts with proper consent documentation, and build the email template framework that will receive AI-generated content.

1
Create Mailchimp account at https://mailchimp.com — select Standard plan
2
Settings > Account > verify sending domain (configured in Step 3)
3
Create primary Audience named '[Brokerage Name] Contacts'
4
Create Audience Segments: 'Active Buyers' (tag: buyer, status: active), 'Active Sellers' (tag: seller, status: active), 'Past Clients' (tag: past-client, closed date > 6 months ago), 'Open House Leads' (tag: open-house, source: open-house-signup), 'Website Leads' (tag: web-lead, source: idx-website), 'Sphere of Influence' (tag: soi, relationship: personal)
5
Import existing contacts: Export from CRM as CSV (include: email, first_name, last_name, tags, source), then in Mailchimp go to Audience > Import Contacts > Upload CSV and map fields: email, FNAME, LNAME, TAGS
6
Create Email Templates: 'New Listing Announcement' (property photo header, description body, CTA button), 'Open House Invitation' (event details, map, RSVP link), 'Price Reduction Alert' (urgency-focused, before/after price), 'Market Update Monthly' (stats + commentary + featured listings), 'Just Sold / Social Proof' (sold property + testimonial), 'Drip #1: Welcome / Introduction' (agent bio, value proposition), 'Drip #2: Market Education' (local market insights), 'Drip #3: Home Search Tips' (buyer) / 'Home Prep Tips' (seller)
7
Add CAN-SPAM compliant footer to ALL templates: physical brokerage address, unsubscribe link (Mailchimp auto-generates), 'You are receiving this because [merge tag reason]', Equal Housing Opportunity logo
Critical

Only import contacts with documented opt-in consent. If the client has purchased lead lists or has contacts without documented consent, those contacts must NOT be imported — this violates CAN-SPAM and Mailchimp's terms of service and will result in account suspension. Each violation carries up to $16,000 in FCC penalties.

Note

Mailchimp limits imports to contacts with verifiable opt-in consent. Constant Contact is an alternative if the client already has an account ($35/month for Standard with 500 contacts).

Step 5: Configure Buffer for Social Media Scheduling

Set up Buffer as the social media scheduling hub. Connect all brokerage social media accounts, configure posting schedules optimized for real estate audience engagement, and create post templates that will receive AI-generated content from Write.Homes via Zapier.

1
Create Buffer account at https://buffer.com
2
Connect social channels: - Facebook Business Page: Buffer > Channels > Connect > Facebook > select Page - Instagram Business: Buffer > Channels > Connect > Instagram > authorize (Requires Instagram Business account linked to Facebook Page) - LinkedIn Company Page: Buffer > Channels > Connect > LinkedIn > select Page - X/Twitter (optional): Buffer > Channels > Connect > X
3
Configure posting schedule per channel: - Facebook: Tue 10am, Thu 2pm, Sat 11am (3x/week) - Instagram: Mon 11am, Wed 6pm, Fri 12pm, Sun 10am (4x/week) - LinkedIn: Tue 8am, Thu 12pm (2x/week)
4
Create hashtag groups in Buffer: - 'New Listing': #justlisted #newlisting #realestate #[cityname]homes #forsale #dreamhome - 'Open House': #openhouse #househunting #[cityname]realestate #sundayopenhouse - 'Just Sold': #justsold #sold #realestatewins #closingday #[cityname]realtor - 'Market Update': #housingmarket #realestate #marketupdate #[cityname]housing
5
Test by manually creating and scheduling one post per channel
6
Verify posts publish correctly with proper formatting and images
Note

If the client has more than 3 social channels and prefers the free tier, Buffer's free plan supports up to 3 channels with 10 scheduled posts per channel. For offices with 4+ channels, the Essentials plan at $6/channel/month is required. Instagram requires a Business or Creator account (not a personal account) for API scheduling. Guide the client through converting their Instagram account if needed: Settings > Account > Switch to Professional Account > Business.

Step 6: Create Zapier Automation Account and Connect All Platforms

Set up Zapier Professional as the central automation hub. Establish connections (authentications) to all platforms that will participate in automated workflows. This step only creates the connections — the actual automation workflows are built in subsequent steps.

1
Create Zapier account at https://zapier.com — select Professional plan ($29.99/mo)
2
Navigate to My Apps and connect each platform:
3
Connect Write.Homes: My Apps > Add Connection > Search 'Write.Homes' (If not natively available, use Webhooks by Zapier for API calls)
4
Connect Mailchimp: My Apps > Add Connection > Mailchimp > Authorize with Mailchimp credentials
5
Connect Buffer: My Apps > Add Connection > Buffer > Authorize with Buffer credentials
6
Connect Follow Up Boss (CRM): My Apps > Add Connection > Follow Up Boss > Enter API key (API key found in FUB: Admin > API > Generate Key)
7
Connect OpenAI: My Apps > Add Connection > OpenAI (ChatGPT) > Enter API key (API key from https://platform.openai.com/api-keys)
8
Connect Google Sheets (for content logging/review): My Apps > Add Connection > Google Sheets > Authorize with Google account
9
Test each connection by clicking 'Test' in the My Apps panel
10
Verify all connections show 'Connected' status
Note

Zapier Professional plan includes 750 tasks/month. Estimate task usage: each listing generates approximately 4-6 tasks (1 trigger + 1 AI generation + 2-3 distribution tasks + 1 logging task). A 15-agent office listing 40 properties/month uses ~200 tasks for listing content alone, plus drip campaign tasks. If usage exceeds 750 tasks, upgrade to Team plan ($103.50/month for 2,000 tasks). Monitor task usage weekly during the first month.

Step 7: Build Core Automation Workflow: New Listing Content Pipeline

Create the primary Zapier workflow that triggers when a new listing appears in the CRM, generates AI content (listing description, social posts, email copy), routes content to a human review queue, and upon approval distributes to MLS, social media, and email platforms. This is the highest-value automation in the entire solution.

ZAP 1: New Listing → AI Content Generation → Review Queue

1
Trigger: Follow Up Boss — New Deal Created (Stage: 'Active Listing')
2
Follow Up Boss — Get Deal Details: Pull: address, price, beds, baths, sqft, lot_size, description_notes, photos_url
3
OpenAI (ChatGPT) — Send Prompt
4
Code by Zapier (JavaScript) — Parse AI Response: Parse the structured JSON response into separate fields: mls_description, facebook_post, instagram_caption, linkedin_post, email_subject, email_body
5
Google Sheets — Create Row in 'Content Review Queue': Agent reviews content in Google Sheet, changes Status to 'APPROVED'
ZAP 1 configuration
text
# OpenAI prompt settings and Google Sheets review queue setup

# Step 3: OpenAI (ChatGPT) — Send Prompt
#   Model: gpt-5.4-mini
#   System Prompt: (see Custom AI Components section - 'MLS Listing Description Generator')
#   User Prompt: 'Generate content for: {{address}}, {{price}}, {{beds}} bed/{{baths}} bath, {{sqft}} sqft. Features: {{description_notes}}'
#   Temperature: 0.7
#   Max Tokens: 2000

# Step 5: Google Sheets — Create Row in 'Content Review Queue'
#   Spreadsheet: '[Brokerage] AI Content Review'
#   Sheet: 'Pending Review'
#   Columns: Date, Address, Agent, MLS_Description, FB_Post, IG_Caption, LI_Post, Email_Subject, Email_Body, Status='PENDING'

ZAP 2: Approved Content → Distribution

1
Trigger: Google Sheets — New or Updated Row (Status = 'APPROVED')
2
Buffer — Create Post (Facebook): Profile: [Brokerage FB Page], Text: {{FB_Post}}, Scheduled: Next available slot
3
Buffer — Create Post (Instagram): Profile: [Brokerage IG], Text: {{IG_Caption}}, Scheduled: Next available slot
4
Buffer — Create Post (LinkedIn): Profile: [Brokerage LI Page], Text: {{LI_Post}}, Scheduled: Next available slot
5
Mailchimp — Create Campaign: Audience: 'Active Buyers' segment, Template: 'New Listing Announcement', Subject: {{Email_Subject}}, Body Content: {{Email_Body}}, Schedule: Send within 2 hours
6
Google Sheets — Update Row: Status: 'DISTRIBUTED', Distribution_Date: {{current_timestamp}}
Critical

The human review step (Google Sheets approval) is mandatory for Fair Housing compliance and MLS accuracy. Do NOT create a fully automated pipeline that publishes without human review. The two-Zap architecture (Generation → Review → Distribution) ensures no content reaches the public without agent sign-off. If Write.Homes has a native Zapier integration available, substitute it for the OpenAI step to get pre-formatted real estate content without custom prompt engineering.

Step 8: Build Email Drip Campaign Automations in Mailchimp

Create multi-step automated email drip sequences in Mailchimp that use AI-generated content templates. Build separate drip campaigns for buyer leads, seller leads, and sphere of influence/past clients. Each drip sequence sends a series of pre-written emails at timed intervals after a contact enters the sequence.

Buyer Lead Drip Campaign (8-email sequence over 45 days)

1
In Mailchimp: Automations > Create > Customer Journey
2
Starting Point: Tag added = 'buyer' AND tag added = 'new-lead'
3
Build journey steps with the following schedule: Day 0 — Email 1: Welcome + Agent Introduction (AI-generated bio + value prop) | Day 2 — Email 2: Local Market Overview (AI-generated market snapshot) | Day 5 — Email 3: Home Buying Process Guide (AI-generated educational content) | Day 10 — Email 4: Featured Listings Matching Criteria (AI-generated descriptions) | Day 15 — Email 5: Mortgage Pre-Approval Tips (AI-generated financial guidance) | Day 22 — Email 6: Neighborhood Spotlight (AI-generated neighborhood narrative) | Day 30 — Email 7: Open House Invitation (if applicable) or Market Update | Day 45 — Email 8: Check-in + CTA to Schedule Consultation
4
For each email step: Select the corresponding template created in Step 4 | Paste AI-generated content from Write.Homes or custom prompt output | Add personalization: *|FNAME|*, *|AGENT_NAME|*, *|AGENT_PHONE|* | Verify CAN-SPAM footer is present | Enable link tracking and open tracking

Seller Lead Drip Campaign (6-email sequence over 30 days)

  • Day 0: Welcome + CMA Offer
  • Day 3: Home Preparation Checklist
  • Day 7: Local Market Stats + Recent Sales
  • Day 14: Staging Tips + Before/After Examples
  • Day 21: Pricing Strategy Education
  • Day 30: Check-in + Listing Appointment CTA

Past Client / SOI Drip (Monthly Ongoing)

  • Monthly: Market Update + 1 Featured Listing + Community Event
  • Quarterly: Home Value Update CTA + Referral Request
1
Set sending schedule: Tue/Thu 10am local time (highest open rates for RE)
2
Enable A/B testing on subject lines for first email in each sequence
3
Activate all three campaigns
Note

Pre-generate ALL email content for each drip sequence before activating the campaigns. Use Write.Homes or the custom OpenAI prompt to batch-generate all 8 buyer emails, 6 seller emails, and 12 months of SOI emails in a single session. Store the generated content in a Google Doc for agent review before loading into Mailchimp. AI-generated content should be refreshed quarterly to keep market data current and prevent content staleness.

Step 9: Configure Fair Housing Compliance Guardrails

Implement multiple layers of Fair Housing Act compliance checking across all AI-generated content. This is the most legally critical step in the entire implementation. Discriminatory language in listings can result in HUD complaints, lawsuits, and license revocation. Configure automated scanning, manual review checklists, and content filtering rules.

Layer 1: AI Prompt-Level Filtering

Add to ALL content generation prompts (see Custom AI Components for full prompts):

Prompt-level Fair Housing filter
text
# append to all AI content generation prompts

NEVER include language that references, implies, or could be perceived as referring to:
race, color, national origin, religion, sex, sexual orientation, gender identity,
disability, familial status, age, or any protected class under the Fair Housing Act.
DO NOT use phrases like: 'perfect for families', 'great bachelor pad', 'walking
distance to [church/temple/mosque]', 'master bedroom' (use 'primary bedroom'),
'man cave', 'ideal for young professionals', 'no children', 'quiet neighborhood
for retirees', 'exclusive community'. Focus ONLY on property features, not people.

Layer 2: Google Sheet Review Checklist

Add a 'Compliance Check' column to the Content Review Queue spreadsheet with the following data validation dropdown. Agent must set this column before changing Status to 'APPROVED'.

  • PASS - No Fair Housing concerns
  • FLAG - Needs revision (see comments)
  • FAIL - Contains prohibited language

Layer 3: FairSentry Automated Monitoring

1
Sign up for FairSentry at https://fairsentry.com
2
Connect brokerage website URL for continuous scanning
3
Connect social media accounts (Facebook, Instagram)
4
Configure MLS listing monitoring (if supported by local MLS)
5
Set alert recipients: broker-of-record email + MSP admin email
6
Review flagged content within 24 hours of alert

Layer 4: Prohibited Phrase Blocklist in Content Templates

In Mailchimp email templates, add a pre-send checklist note:

Mailchimp pre-send compliance reminder
text
# add to all email templates

Before sending: Verify this email contains NO references to resident
demographics, protected classes, or neighborhood descriptions that could
imply preference or exclusion based on race, religion, familial status,
disability, national origin, sex, or color.
Critical

Fair Housing compliance is NON-NEGOTIABLE and the MSP's primary liability concern. Document all compliance measures in the client handoff documentation. The broker-of-record is ultimately responsible for all content published under the brokerage, but the MSP can be implicated if the system was designed to bypass compliance checks. NAR requires human review of all AI-generated content before publication. Schedule a 30-minute Fair Housing refresher with the brokerage compliance officer or broker-of-record as part of the training phase.

Step 10: Build Zapier Workflow for Automated Drip Campaign Enrollment

Create a Zapier automation that watches for new leads in Follow Up Boss CRM and automatically enrolls them in the appropriate Mailchimp drip campaign based on lead type (buyer vs. seller). This closes the loop between CRM lead capture and AI-powered email nurturing.

ZAP 3: New CRM Lead → Mailchimp Drip Enrollment

  • Trigger: Follow Up Boss — New Lead Created
1
Step 2: Filter by Zapier — Condition: Lead Source is NOT blank AND Email is NOT blank
2
Step 3: Paths by Zapier (split by lead type)
3
Step 4: Follow Up Boss — Add Note to Lead

Path A: Lead tags contain 'buyer'

Path A: Mailchimp subscriber config for buyer leads
yaml
Action: Mailchimp — Add/Update Subscriber
Audience: '[Brokerage] Contacts'
Email: {{lead_email}}
First Name: {{lead_first_name}}
Last Name: {{lead_last_name}}
Tags: 'buyer, new-lead'
# This triggers the Buyer Drip campaign in Mailchimp

Path B: Lead tags contain 'seller'

Path B: Mailchimp subscriber config for seller leads
yaml
Action: Mailchimp — Add/Update Subscriber
Audience: '[Brokerage] Contacts'
Email: {{lead_email}}
Tags: 'seller, new-lead'
# This triggers the Seller Drip campaign in Mailchimp

Path C: Default (no tag or unclear)

Path C: Unclassified lead fallback — tag and notify agent
yaml
Action 1: Mailchimp — Add/Update Subscriber
Tags: 'unclassified, new-lead'

Action 2: Gmail/Outlook — Send notification to assigned agent
Message: 'New lead {{lead_name}} needs classification — please tag as buyer or seller in FUB'
Step 4: Write enrollment note back to Follow Up Boss lead record
yaml
Action: Follow Up Boss — Add Note to Lead
Note: 'Auto-enrolled in {{drip_type}} email drip campaign via Mailchimp on {{date}}'

ZAP 4: CRM Lead Stage Change → Drip Campaign Update

ZAP 4: Stage-based drip campaign update logic
yaml
Trigger: Follow Up Boss — Deal Stage Changed

If stage = 'Under Contract':
  Action: Mailchimp — Unsubscribe from tag (remove from active drip)

If stage = 'Closed':
  Action: Mailchimp — Move to 'past-client' tag, enroll in SOI monthly drip
Note

Test this workflow with 3-5 test leads before going live. Create test contacts in Follow Up Boss with buyer and seller tags and verify they appear in the correct Mailchimp audience segments within 5 minutes. Verify the Mailchimp drip campaign triggers correctly by checking the contact's activity log. Common issue: Follow Up Boss API may not expose lead tags in all plan tiers — verify during discovery that the client's FUB plan supports API tag access.

Step 11: Agent Training and Content Review Process Setup

Conduct a half-day training workshop for all agents covering the AI content tools, review process, compliance requirements, and day-to-day workflows. Create standard operating procedure documentation and a quick-reference guide for ongoing use.

Training Agenda (3–4 Hours)

Module 1: AI Content Generation with Write.Homes (60 min)

  • Account login and navigation
  • Generating MLS listing descriptions: inputting property details, selecting tone
  • Generating social media posts: platform-specific formatting
  • Generating email content: drip sequence content, one-off campaigns
  • Prompt tips: how to add context for better output (unique features, neighborhood highlights)
  • Hands-on exercise: each agent generates content for one of their current listings

Module 2: Content Review & Compliance (45 min)

  • Fair Housing language review checklist walkthrough
  • Prohibited phrases list review
  • Google Sheet review queue demonstration
  • How to edit and approve AI-generated content
  • MLS submission rules for AI-assisted content
  • Discussion: broker-of-record's expectations for content quality and compliance

Module 3: Automated Workflows Overview (45 min)

  • Demo: new listing triggers content generation automatically
  • Demo: approving content in Google Sheet triggers distribution
  • Demo: new lead auto-enrolls in email drip
  • What to do when automation fails (manual fallback process)
  • How to request new content types or template changes (submit to MSP)

Module 4: Social Media & Email Best Practices (30 min)

  • Posting schedule and content calendar
  • How to add property photos to social posts in Buffer
  • Monitoring email campaign performance in Mailchimp
  • Responding to social media engagement
  • When to escalate issues to MSP support

Documentation to Create and Deliver

1
Quick-Reference Card (1-page laminated) with login URLs, workflow steps, compliance checklist
2
SOP Document (Google Doc) with detailed procedures and screenshots
3
Fair Housing Prohibited Phrases cheat sheet
4
Escalation contact list: MSP support email/phone, Zapier status page URL
5
FAQ document addressing common questions from pilot testing
Note

Record the training session (with permission) and upload to a shared Google Drive folder so new agents can onboard independently. Schedule a 30-minute follow-up check-in call 1 week after training to address questions and issues. The most common post-training issue is agents forgetting to check the Google Sheet review queue — consider setting up a daily Slack/email reminder via Zapier for any items in PENDING status for more than 24 hours.

Step 12: Go-Live Launch and 2-Week Monitoring Period

Activate all automation workflows, switch from test mode to production, and begin an intensive 2-week monitoring period. Monitor task execution in Zapier, content quality, email deliverability metrics, social media posting accuracy, and compliance flag rates. Resolve any issues immediately during this stabilization period.

Go-Live Checklist

Daily Monitoring (First 2 Weeks)

1
Check Zapier Task History (https://zapier.com/app/history): Verify all Zaps executed successfully (no errors/holds). Note task consumption rate vs. plan limit.
2
Check Mailchimp: Campaigns > Reports — Open rate target: >20% (RE industry average). Bounce rate: <2% (higher indicates list quality issues). Spam complaints: <0.1% (higher = STOP and investigate).
3
Check Buffer: Analytics — Verify all scheduled posts published successfully. Note engagement rates by platform.
4
Check Google Sheet Review Queue — Any items stuck in 'PENDING' >24 hours? Follow up with agent. Any items marked 'FLAG' or 'FAIL'? Review AI prompt and adjust.
5
Check FairSentry dashboard for any compliance flags.

Weekly Reporting (Email to Client)

  • Content generated: X listings, Y social posts, Z emails
  • Email performance: open rate, click rate, unsubscribes
  • Social performance: impressions, engagement, follower growth
  • Issues resolved: list any problems and resolutions
  • Recommendations: prompt adjustments, schedule changes
Note

The first 2 weeks are critical for establishing trust with the client and catching configuration issues. Common go-live issues: (1) Zapier Zaps failing due to API rate limits — add delays between steps; (2) Mailchimp emails landing in spam despite authentication — warm up the sending domain by sending to small batches first; (3) Buffer posts missing images — agents must manually add photos to the Buffer queue until image automation is configured; (4) AI content quality inconsistency — refine prompts based on actual output review.

Custom AI Components

MLS Listing Description Generator

Type: prompt System prompt for generating MLS-compliant property listing descriptions via OpenAI API or Write.Homes custom templates. Produces a compelling, accurate, SEO-optimized listing description from structured property data. Enforces Fair Housing compliance at the prompt level and formats output for direct MLS submission.

Implementation

System Prompt

System prompt defining Fair Housing compliance rules, content structure, formatting constraints, and JSON output format
text
SYSTEM PROMPT:
---
You are an expert real estate copywriter specializing in MLS listing descriptions. You write compelling, accurate, and SEO-optimized property descriptions that comply with the Fair Housing Act and MLS formatting standards.

RULES:
1. FAIR HOUSING COMPLIANCE (MANDATORY):
   - NEVER reference or imply preferences based on race, color, national origin, religion, sex, sexual orientation, gender identity, disability, familial status, or age.
   - NEVER use: 'perfect for families', 'great for singles', 'bachelor pad', 'man cave', 'master bedroom' (use 'primary bedroom'), 'walking distance to [religious institution]', 'quiet for retirees', 'exclusive community', 'no children', 'family-friendly', 'ideal for young professionals', 'Christian/Jewish/Muslim neighborhood', 'handicap' (use 'accessible'), 'safe neighborhood' (implies other areas are unsafe), 'integrated', 'ethnic'.
   - Focus ONLY on property features, architectural details, finishes, systems, and location amenities (parks, shopping, transit, schools by name only without demographic inference).

2. CONTENT STRUCTURE:
   - Opening hook: 1-2 sentences that create emotional appeal through property features (NOT occupant lifestyle).
   - Property overview: beds, baths, sqft, lot size, year built, style, condition.
   - Feature highlights: 3-5 key features with descriptive detail (kitchen, bathrooms, outdoor space, views, upgrades).
   - Location context: Nearby amenities, school district name (not quality rating), commute access, community features.
   - Closing CTA: Create urgency through market context, not exclusivity.

3. FORMATTING:
   - Length: 150-300 words (adjustable per MLS character limits)
   - NO ALL CAPS except for proper nouns
   - NO exclamation marks in sequence (max 2 per description)
   - Include relevant keywords naturally: [city name], [neighborhood name], [property type], [key features]
   - Use present tense
   - Avoid superlatives without basis ('best', 'most', 'finest')

4. OUTPUT FORMAT:
   Return a JSON object with these fields:
   {
     "mls_description": "[Full MLS listing description, 150-300 words]",
     "headline": "[MLS headline, max 80 characters]",
     "seo_keywords": ["keyword1", "keyword2", "keyword3", "keyword4", "keyword5"]
   }
---

User Prompt Template

User prompt template with property data placeholders for MLS description generation
text
USER PROMPT TEMPLATE:
Generate an MLS listing description for the following property:

Address: {{address}}
City/State: {{city}}, {{state}}
Neighborhood: {{neighborhood}}
Price: ${{price}}
Bedrooms: {{beds}}
Bathrooms: {{baths}}
Square Feet: {{sqft}}
Lot Size: {{lot_size}}
Year Built: {{year_built}}
Property Type: {{property_type}} (e.g., Single Family, Condo, Townhouse)
Style: {{style}} (e.g., Colonial, Ranch, Contemporary, Craftsman)
Key Features: {{features}} (comma-separated list from agent notes)
Recent Upgrades: {{upgrades}}
Parking: {{parking}}
HOA: {{hoa_amount}} per {{hoa_period}} (if applicable)
School District: {{school_district}}
Agent Notes: {{agent_notes}} (any special selling points or context)

OpenAI API Integration (Python)

Python integration for MLS listing description generation via OpenAI API — replace system_prompt placeholder with the full system prompt above
python
import openai
import json

client = openai.OpenAI(api_key='sk-YOUR-API-KEY')

def generate_listing_description(property_data: dict) -> dict:
    system_prompt = """[Insert full system prompt above]"""
    
    user_prompt = f"""Generate an MLS listing description for the following property:
    Address: {property_data['address']}
    City/State: {property_data['city']}, {property_data['state']}
    Neighborhood: {property_data.get('neighborhood', 'N/A')}
    Price: ${property_data['price']:,}
    Bedrooms: {property_data['beds']}
    Bathrooms: {property_data['baths']}
    Square Feet: {property_data['sqft']:,}
    Lot Size: {property_data.get('lot_size', 'N/A')}
    Year Built: {property_data.get('year_built', 'N/A')}
    Property Type: {property_data['property_type']}
    Style: {property_data.get('style', 'N/A')}
    Key Features: {property_data.get('features', 'N/A')}
    Recent Upgrades: {property_data.get('upgrades', 'None noted')}
    Parking: {property_data.get('parking', 'N/A')}
    HOA: {property_data.get('hoa', 'N/A')}
    School District: {property_data.get('school_district', 'N/A')}
    Agent Notes: {property_data.get('agent_notes', 'None')}"""
    
    response = client.chat.completions.create(
        model='gpt-5.4-mini',
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': user_prompt}
        ],
        temperature=0.7,
        max_tokens=1000,
        response_format={'type': 'json_object'}
    )
    
    return json.loads(response.choices[0].message.content)

# Example usage:
property_info = {
    'address': '123 Oak Street',
    'city': 'Austin', 'state': 'TX',
    'neighborhood': 'Travis Heights',
    'price': 625000,
    'beds': 3, 'baths': 2.5,
    'sqft': 2100,
    'lot_size': '0.18 acres',
    'year_built': '2019',
    'property_type': 'Single Family',
    'style': 'Contemporary',
    'features': 'open floor plan, quartz countertops, 10-foot ceilings, covered patio, smart home system',
    'upgrades': 'New landscaping 2024, added solar panels',
    'parking': '2-car attached garage',
    'school_district': 'Austin ISD',
    'agent_notes': 'Corner lot with mature trees, walking distance to South Congress shops'
}
result = generate_listing_description(property_info)
print(result['mls_description'])

Social Media Multi-Platform Post Generator

Type: prompt System prompt that generates platform-optimized social media posts for Facebook, Instagram, and LinkedIn from property listing data. Each post is formatted for the specific platform's best practices, character limits, and audience expectations. Includes hashtag sets and emoji usage calibrated per platform.

Implementation

System Prompt
text
SYSTEM PROMPT:
---
You are a social media marketing expert specializing in real estate content. You create engaging, platform-specific social media posts that drive property inquiries and brand awareness.

For each property, generate THREE separate posts optimized for different platforms.

RULES:
1. FAIR HOUSING COMPLIANCE: All rules from the MLS Description Generator apply. Never reference potential occupant demographics.
2. Each post must be self-contained and platform-optimized.
3. Include a clear call-to-action in every post.
4. Use the agent's name and contact info provided.

PLATFORM SPECIFICATIONS:

FACEBOOK POST:
- Length: 100-200 words
- Tone: Conversational, community-focused
- Structure: Hook line → 3-4 key features → neighborhood context → CTA with link
- Include 1-2 emojis per sentence (subtle, professional)
- End with: 'DM me or call [phone] for a private showing!'
- DO NOT include hashtags (Facebook algorithm deprioritizes them)

INSTAGRAM CAPTION:
- Length: 80-150 words for caption
- Tone: Visual, aspirational, lifestyle-focused (property lifestyle, NOT occupant lifestyle)
- Structure: Attention-grabbing first line (this shows before 'more') → Property highlights → CTA
- Include 5-8 emojis throughout
- End caption with CTA: 'Link in bio for details! 📲'
- After caption, add a line break then 20-25 hashtags in a comment block, mix of:
  - Location: #[city]realestate #[neighborhood]homes #[city]realtor
  - Feature: #newlisting #justlisted #dreamhome #househunting #[bedscount]bedroom
  - Industry: #realestate #realtor #realtorlife #homeforsale #property
  - Niche: #[style]home #[feature]kitchen #[feature]pool (as applicable)

LINKEDIN POST:
- Length: 100-150 words
- Tone: Professional, market-informed, analytical
- Structure: Market context opener → Property as case study → Value proposition → Professional CTA
- Minimal emoji use (0-2 max)
- Include 3-5 hashtags inline at the end
- End with: 'Interested in learning more about opportunities in [neighborhood]? Let's connect.'

OUTPUT FORMAT:
Return a JSON object:
{
  "facebook_post": "[Full Facebook post text]",
  "instagram_caption": "[Full Instagram caption with emojis]",
  "instagram_hashtags": "[20-25 hashtags separated by spaces]",
  "linkedin_post": "[Full LinkedIn post text]"
}
---
User Prompt Template
text
USER PROMPT TEMPLATE:
Generate social media posts for this new listing:

Property: {{address}}, {{city}}, {{state}}
Price: ${{price}}
Beds/Baths: {{beds}}bd / {{baths}}ba
Sqft: {{sqft}}
Key Features: {{features}}
Neighborhood: {{neighborhood}}
Agent Name: {{agent_name}}
Agent Phone: {{agent_phone}}
Listing URL: {{listing_url}}
Photo Description: {{photo_description}} (brief description of the best listing photo for caption context)

Email Drip Campaign Content Generator

Type: prompt

System prompt for batch-generating a complete email drip campaign sequence. Generates all emails in a buyer or seller nurture sequence in a single API call, with subject lines, preview text, and body content personalized with merge tags. Each email builds on the previous to create a coherent nurture journey.

Implementation

System Prompt
text
SYSTEM PROMPT:
---
You are an expert real estate email marketing copywriter. You create high-converting email drip campaign sequences that nurture leads from initial contact through conversion (buyer: purchase; seller: listing appointment).

RULES:
1. FAIR HOUSING COMPLIANCE: Never reference occupant demographics or protected classes.
2. CAN-SPAM COMPLIANCE: Every email must be identifiable as marketing content. Do not use deceptive subject lines.
3. Include Mailchimp merge tags for personalization: *|FNAME|* (first name), *|AGENT_NAME|* (agent name), *|AGENT_PHONE|* (agent phone), *|AGENT_EMAIL|* (agent email), *|COMPANY|* (brokerage name).
4. Each email should have a single, clear call-to-action.
5. Subject lines: 40-60 characters, create curiosity or provide value, no spam trigger words (FREE, ACT NOW, URGENT, etc.).
6. Preview text: 40-90 characters, complements subject line.
7. Body: 150-250 words, scannable with short paragraphs (2-3 sentences max).
8. Tone: Warm, professional, helpful — position the agent as a trusted advisor, not a salesperson.

OUTPUT FORMAT:
Return a JSON object:
{
  "campaign_name": "[Descriptive campaign name]",
  "campaign_type": "buyer|seller|soi",
  "emails": [
    {
      "sequence_number": 1,
      "send_delay_days": 0,
      "subject_line": "[Subject line with optional merge tag]",
      "preview_text": "[Preview text]",
      "body_html": "[Email body in simple HTML with paragraphs, bold, and links. Use merge tags for personalization.]",
      "cta_text": "[Button text]",
      "cta_url": "[Placeholder URL like {{agent_calendar_link}} or {{property_search_url}}]"
    }
  ]
}
---
User Prompt — Buyer Drip
text
USER PROMPT — BUYER DRIP:
Generate a complete 8-email buyer lead nurture drip campaign for a real estate agent.

Agent Name: {{agent_name}}
Brokerage: {{brokerage_name}}
Market Area: {{city}}, {{state}}
Agent Specialty: {{specialty}} (e.g., first-time buyers, luxury, relocation, investment)
Average Price Range: ${{price_low}} - ${{price_high}}
Key Neighborhood(s): {{neighborhoods}}

Email schedule:
- Email 1 (Day 0): Welcome + agent introduction
- Email 2 (Day 2): Local market overview with current stats
- Email 3 (Day 5): Home buying process step-by-step guide
- Email 4 (Day 10): Featured listings showcase (use generic placeholders for properties)
- Email 5 (Day 15): Mortgage and financing tips
- Email 6 (Day 22): Neighborhood spotlight on {{primary_neighborhood}}
- Email 7 (Day 30): Open house invitation or market update
- Email 8 (Day 45): Personal check-in + consultation scheduling CTA
User Prompt — Seller Drip
text
USER PROMPT — SELLER DRIP:
Generate a complete 6-email seller lead nurture drip campaign.

Agent Name: {{agent_name}}
Brokerage: {{brokerage_name}}
Market Area: {{city}}, {{state}}
Average Days on Market: {{dom}}
Average Sale-to-List Ratio: {{sale_to_list}}%

Email schedule:
- Email 1 (Day 0): Welcome + free CMA offer
- Email 2 (Day 3): Home preparation checklist
- Email 3 (Day 7): Local market stats + recent comparable sales
- Email 4 (Day 14): Staging tips and ROI of preparation
- Email 5 (Day 21): Pricing strategy education
- Email 6 (Day 30): Personal check-in + listing appointment CTA

Zapier Content Parser (JavaScript Code Step)

Type: integration JavaScript code step for Zapier's 'Code by Zapier' action that parses the JSON response from the OpenAI API and extracts individual content fields for routing to downstream distribution platforms (Buffer, Mailchimp, Google Sheets). Handles error cases and provides fallback values.

Implementation

Zapier Code by Zapier
javascript
// JavaScript step for parsing OpenAI API response and extracting content
// fields

// Zapier Code by Zapier - JavaScript
// Input Data (configured in Zapier):
//   aiResponse: {{Step 3 OpenAI Response Content}}
//   propertyAddress: {{Step 2 Address}}
//   agentName: {{Step 2 Agent Name}}
//   agentPhone: {{Step 2 Agent Phone}}

const rawResponse = inputData.aiResponse;
const address = inputData.propertyAddress || 'Property';
const agentName = inputData.agentName || 'Your Agent';
const agentPhone = inputData.agentPhone || '';

let parsed;
try {
  parsed = JSON.parse(rawResponse);
} catch (e) {
  // If AI returned non-JSON, treat entire response as MLS description
  parsed = {
    mls_description: rawResponse,
    headline: address + ' - New Listing',
    facebook_post: 'New listing alert! ' + address + ' is now available. Contact ' + agentName + ' at ' + agentPhone + ' for details.',
    instagram_caption: '✨ Just Listed! ' + address + ' — Link in bio for details! 📲',
    instagram_hashtags: '#justlisted #newlisting #realestate #homeforsale #dreamhome',
    linkedin_post: 'Excited to bring ' + address + ' to market. Contact me to learn more about this opportunity.',
    email_subject: 'New Listing: ' + address,
    email_body: '<p>A new property has just hit the market at ' + address + '.</p><p>' + rawResponse.substring(0, 500) + '</p><p>Contact ' + agentName + ' at ' + agentPhone + ' for a private showing.</p>'
  };
}

// Validate and provide fallbacks for each field
const mlsDescription = (parsed.mls_description || '').trim();
const headline = (parsed.headline || address + ' - New Listing').trim();
const seoKeywords = Array.isArray(parsed.seo_keywords) ? parsed.seo_keywords.join(', ') : (parsed.seo_keywords || '');
const facebookPost = (parsed.facebook_post || 'New listing at ' + address + '! Contact ' + agentName + ' for details.').trim();
const instagramCaption = (parsed.instagram_caption || '✨ Just Listed! ' + address).trim();
const instagramHashtags = (parsed.instagram_hashtags || '#justlisted #newlisting #realestate').trim();
const linkedinPost = (parsed.linkedin_post || 'New listing opportunity at ' + address + '.').trim();
const emailSubject = (parsed.email_subject || 'New Listing: ' + address).trim();
const emailBody = (parsed.email_body || '<p>Check out this new listing at ' + address + '.</p>').trim();

// Character limit enforcement
const truncate = (str, max) => str.length > max ? str.substring(0, max - 3) + '...' : str;

output = {
  mls_description: truncate(mlsDescription, 4000),  // Most MLS systems cap at 4000 chars
  headline: truncate(headline, 80),
  seo_keywords: seoKeywords,
  facebook_post: truncate(facebookPost, 2000),
  instagram_caption: truncate(instagramCaption, 2200),  // IG caption limit
  instagram_hashtags: instagramHashtags,
  linkedin_post: truncate(linkedinPost, 3000),  // LinkedIn limit
  email_subject: truncate(emailSubject, 60),
  email_body: emailBody,
  content_generated_at: new Date().toISOString(),
  parse_status: 'success'
};

Fair Housing Language Validator

Type: skill A standalone validation function that scans AI-generated content for potential Fair Housing Act violations before content reaches the human review queue. Flags problematic phrases and provides specific remediation guidance. Can be integrated as a Zapier Code step or deployed as a serverless function.

Implementation

Fair Housing Language Validator
javascript
// Deploy as Zapier Code Step, AWS Lambda, or Google Cloud Function

// Fair Housing Language Validator
// Deploy as: Zapier Code Step, AWS Lambda, or Google Cloud Function
// Input: content string to validate
// Output: { is_clean: boolean, flags: array, remediation: array, severity: string }

const PROHIBITED_PHRASES = {
  high: [
    // Explicit protected class references
    { pattern: /\b(no\s+children|adults\s+only|no\s+kids)\b/gi, reason: 'Familial status discrimination', fix: 'Remove entirely — cannot restrict based on familial status' },
    { pattern: /\b(whites?\s+only|blacks?\s+only|no\s+(blacks?|whites?|hispanics?|asians?|mexicans?))\b/gi, reason: 'Race/national origin discrimination', fix: 'Remove entirely' },
    { pattern: /\b(no\s+wheelchairs?|no\s+disabled|no\s+handicap)\b/gi, reason: 'Disability discrimination', fix: 'Remove entirely' },
    { pattern: /\b(christian\s+community|jewish\s+neighborhood|muslim\s+area)\b/gi, reason: 'Religious discrimination', fix: 'Remove religious references' },
    { pattern: /\b(no\s+section\s+8|no\s+vouchers?)\b/gi, reason: 'Potential race/income discrimination (varies by jurisdiction)', fix: 'Remove — may violate local/state fair housing laws' }
  ],
  medium: [
    // Implied demographic preferences
    { pattern: /\b(perfect\s+for\s+families|family[- ]friendly|great\s+for\s+(singles?|couples?|retirees?|seniors?|young\s+professionals?|students?))\b/gi, reason: 'Implies preference for specific demographic group', fix: 'Describe property features instead of ideal occupants' },
    { pattern: /\b(bachelor\s+pad|man\s+cave|she[- ]shed|mother[- ]in[- ]law\s+suite)\b/gi, reason: 'Gender-stereotyped language', fix: 'Use: "bonus room", "private suite", "additional living space"' },
    { pattern: /\b(master\s+bedroom|master\s+suite|master\s+bath)\b/gi, reason: 'Potentially offensive historical connotation', fix: 'Use: "primary bedroom", "primary suite", "primary bathroom"' },
    { pattern: /\b(exclusive\s+(community|neighborhood|area|enclave))\b/gi, reason: 'Implies exclusionary practices', fix: 'Use: "private community", "gated community", or describe specific amenities' },
    { pattern: /\b(walking\s+distance\s+to\s+(church|temple|mosque|synagogue))\b/gi, reason: 'Religious institution proximity implies preference', fix: 'Remove or list as general "nearby places of worship"' },
    { pattern: /\b(ethnic\s+\w+|oriental|ghetto|barrio)\b/gi, reason: 'Racially/ethnically charged language', fix: 'Remove entirely — use neighborhood proper name only' }
  ],
  low: [
    // Subtle bias indicators — flag for human review
    { pattern: /\b(safe\s+neighborhood|low\s+crime|secure\s+area)\b/gi, reason: 'May imply other areas are unsafe (potential steering)', fix: 'Describe specific security features (gated entry, security system) instead of area characterization' },
    { pattern: /\b(quiet\s+neighborhood|peaceful\s+community)\b/gi, reason: 'May be coded language for excluding families with children', fix: 'Consider rephrasing to describe property features: "serene backyard setting"' },
    { pattern: /\b(close\s+to\s+public\s+transit|near\s+bus\s+stop)\b/gi, reason: 'Low risk but flagged — transit proximity can be steering indicator in some contexts', fix: 'Generally acceptable — include only if genuinely a selling point' },
    { pattern: /\b(up[- ]and[- ]coming|gentrifying|transitional\s+neighborhood)\b/gi, reason: 'May imply racial/economic demographic shifts', fix: 'Describe specific improvements: "new restaurants and shops opening on Main Street"' }
  ]
};

function validateFairHousing(content) {
  const flags = [];
  let highestSeverity = 'clean';
  
  for (const [severity, phrases] of Object.entries(PROHIBITED_PHRASES)) {
    for (const phrase of phrases) {
      const matches = content.match(phrase.pattern);
      if (matches) {
        flags.push({
          severity: severity,
          matched_text: matches[0],
          reason: phrase.reason,
          fix: phrase.fix,
          position: content.indexOf(matches[0])
        });
        if (severity === 'high') highestSeverity = 'high';
        else if (severity === 'medium' && highestSeverity !== 'high') highestSeverity = 'medium';
        else if (severity === 'low' && highestSeverity === 'clean') highestSeverity = 'low';
      }
    }
  }
  
  return {
    is_clean: flags.length === 0,
    flag_count: flags.length,
    highest_severity: highestSeverity,
    flags: flags,
    recommendation: flags.length === 0 
      ? 'Content passed Fair Housing language check. Proceed to human review.'
      : highestSeverity === 'high'
        ? 'BLOCK: Content contains high-severity Fair Housing violations. Must be revised before any publication.'
        : highestSeverity === 'medium'
          ? 'REVISE: Content contains language that may violate Fair Housing Act. Review flagged phrases and apply suggested fixes.'
          : 'REVIEW: Content contains subtle language that warrants human review. May be acceptable in context.',
    validated_at: new Date().toISOString()
  };
}

// --- Zapier Code Step Integration ---
// Input Data: contentToValidate (from previous step)
const result = validateFairHousing(inputData.contentToValidate);
output = {
  is_clean: result.is_clean.toString(),
  flag_count: result.flag_count.toString(),
  highest_severity: result.highest_severity,
  recommendation: result.recommendation,
  flag_details: JSON.stringify(result.flags),
  validated_at: result.validated_at
};

Content Review Queue Google Sheet Template

Type: workflow

Google Sheet template and setup instructions for the human-in-the-loop content review queue. This is where all AI-generated content lands for agent review and approval before distribution. Includes data validation, conditional formatting, and notification triggers.

Implementation:

1
Create a new Google Sheet named '[Brokerage Name] AI Content Review Queue'
2
Create the following sheets/tabs:

TAB 1: 'Pending Review' — Columns

  • A: Timestamp (auto-populated by Zapier)
  • B: Property Address
  • C: Assigned Agent
  • D: MLS Description (AI-generated)
  • E: Facebook Post (AI-generated)
  • F: Instagram Caption (AI-generated)
  • G: Instagram Hashtags
  • H: LinkedIn Post (AI-generated)
  • I: Email Subject Line
  • J: Email Body
  • K: Fair Housing Check (Data Validation dropdown: 'PASS', 'FLAG - Needs Edit', 'FAIL - Blocked')
  • L: Agent Notes / Edits (free text for agent modifications)
  • M: Status (Data Validation dropdown: 'PENDING', 'IN REVIEW', 'APPROVED', 'REJECTED', 'DISTRIBUTED')
  • N: Reviewed By (agent name)
  • O: Review Date (auto or manual)
  • P: Distribution Date (populated by Zapier after distribution)

Data Validation Setup

  • Column K: Settings > Data Validation > Dropdown > 'PASS', 'FLAG - Needs Edit', 'FAIL - Blocked'
  • Column M: Settings > Data Validation > Dropdown > 'PENDING', 'IN REVIEW', 'APPROVED', 'REJECTED', 'DISTRIBUTED'

Conditional Formatting

  • Column M = 'PENDING': Entire row background = Light Yellow (#FFF9C4)
  • Column M = 'APPROVED': Entire row background = Light Green (#C8E6C9)
  • Column M = 'REJECTED': Entire row background = Light Red (#FFCDD2)
  • Column M = 'DISTRIBUTED': Entire row background = Light Blue (#BBDEFB)
  • Column K = 'FAIL - Blocked': Cell background = Red (#F44336), white text
  • Column K = 'FLAG - Needs Edit': Cell background = Orange (#FF9800)

TAB 2: 'Archived'

Same columns as 'Pending Review'. Used for completed items — move rows here monthly to keep the active queue clean.

TAB 3: 'Dashboard' — Summary Metrics

Use COUNTIF formulas to populate the following summary metrics:

  • Total content generated this month
  • Pending review
  • Approved
  • Rejected
  • Fair Housing flags
  • Average review time (calculated from Timestamp vs Review Date)
Dashboard COUNTIF formulas for TAB 3
spreadsheet
Total content generated this month: =COUNTIF('Pending Review'!A:A,">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1))
Pending review:                      =COUNTIF('Pending Review'!M:M,"PENDING")
Approved:                            =COUNTIF('Pending Review'!M:M,"APPROVED")
Rejected:                            =COUNTIF('Pending Review'!M:M,"REJECTED")
Fair Housing flags:                  =COUNTIF('Pending Review'!K:K,"FLAG*")+COUNTIF('Pending Review'!K:K,"FAIL*")

Sharing & Permissions

  • MSP Admin: Editor access
  • Broker/Office Manager: Editor access
  • Individual Agents: Editor access (or Commenter if you want to restrict edits to their own rows only)
  • Set up notification rule: Tools > Notification Rules > 'Any changes are made' > notify MSP admin (daily digest)
1
Trigger: Schedule > Every Day at 9:00 AM
2
Step 2: Google Sheets > Get Rows (filter: Status = 'PENDING' AND Timestamp < 24 hours ago)
3
Step 3: Filter > Continue only if rows found
4
Step 4: Gmail > Send Email to assigned agent
Gmail step email template for the Zapier daily reminder Zap
text
Subject: 'Action Required: AI Content Awaiting Your Review'
Body: 'You have {{row_count}} listing descriptions pending review in the Content Queue. Please review and approve/reject within 24 hours to maintain your posting schedule. [Link to Sheet]'

Testing & Validation

  • END-TO-END LISTING PIPELINE TEST: Create a test listing in Follow Up Boss with complete property data (address, price, beds, baths, sqft, features). Verify within 5 minutes that: (1) Zapier Zap triggers successfully, (2) AI content appears in the Google Sheet review queue with all fields populated, (3) Fair Housing validator shows 'clean' status. Then approve the content and verify: (4) Facebook post appears in Buffer queue, (5) Instagram caption appears in Buffer queue, (6) LinkedIn post appears in Buffer queue, (7) Email campaign is created in Mailchimp with correct audience segment.
  • FAIR HOUSING COMPLIANCE TEST: Deliberately input property descriptions containing prohibited phrases: 'perfect for young families', 'master bedroom', 'walking distance to church', 'quiet neighborhood ideal for retirees', 'exclusive community'. Verify the AI prompt-level filtering either omits these phrases from output OR the Fair Housing Language Validator flags them with correct severity levels and remediation suggestions. No prohibited high-severity content should pass through to the review queue unmarked.
  • EMAIL DELIVERABILITY TEST: Send test emails from Mailchimp to 5 different email providers (Gmail, Outlook/Hotmail, Yahoo, Apple Mail/iCloud, company domain). Verify: (1) emails arrive in primary inbox (not spam/junk), (2) SPF/DKIM/DMARC authentication passes (check email headers), (3) all merge tags render correctly (*|FNAME|* shows actual name), (4) CAN-SPAM footer displays physical address and unsubscribe link, (5) unsubscribe link functions within 10 business days. Use mail-tester.com to verify a spam score of 9/10 or higher.
  • EMAIL DRIP SEQUENCE TEST: Create a test contact in Follow Up Boss tagged as 'buyer' and 'new-lead'. Verify: (1) Zapier adds the contact to Mailchimp within 5 minutes, (2) contact appears in 'Active Buyers' segment with correct tags, (3) first drip email (Day 0: Welcome) is sent within the configured schedule, (4) second drip email (Day 2: Market Overview) sends on schedule. For testing, temporarily shorten delays to minutes instead of days. Verify the CRM note is added to the Follow Up Boss contact confirming drip enrollment.
  • SOCIAL MEDIA PUBLISHING TEST: Manually approve a test listing's social content in the Google Sheet. Verify: (1) Buffer receives the posts within 5 minutes, (2) posts are scheduled at the correct times per the posting schedule, (3) Facebook post publishes correctly with proper formatting (no broken characters or truncation), (4) Instagram caption appears with hashtags separated correctly, (5) LinkedIn post maintains professional formatting. Check that no post exceeds platform character limits (Instagram: 2,200; Facebook: 63,206; LinkedIn: 3,000).
  • CONTENT QUALITY BENCHMARK TEST: Generate AI listing descriptions for 5 properties spanning different price points ($200K starter, $400K mid-range, $750K upper, $1.2M luxury, $50K condo). Review each for: (1) accurate reflection of input property data (no hallucinated features), (2) appropriate tone matching price point, (3) SEO keyword inclusion, (4) word count within MLS limits (150-300 words), (5) no superlatives without basis, (6) correct use of present tense. Have the broker-of-record review and score each on a 1-5 quality scale; target average of 4.0+.
  • ZAPIER ERROR HANDLING TEST: Test failure scenarios: (1) disconnect the OpenAI API key and verify the Zap produces a meaningful error notification (not silent failure), (2) submit a listing with missing required fields (no price, no address) and verify the workflow handles gracefully, (3) exceed Buffer's scheduling limit and verify the error is logged. Confirm that Zapier's error notification emails are sent to the MSP admin email address for all failure scenarios.
  • VOLUME/LOAD TEST: Simulate a busy listing day by creating 10 test listings in Follow Up Boss within a 30-minute window. Verify: (1) all 10 trigger content generation without API rate limiting errors, (2) all 10 appear in the review queue within 15 minutes, (3) Zapier task count aligns with expectations (~50-60 tasks for 10 listings), (4) no duplicate content is generated, (5) all downstream platforms (Buffer, Mailchimp) receive correct content for each unique listing.

Client Handoff

Training Deliverables

1
Conduct a 3-4 hour in-person or video training workshop covering all four modules: Write.Homes content generation, content review and Fair Housing compliance, automated workflow overview, and social media/email best practices. Record the session and provide the video file.
2
Deliver a laminated 1-page Quick Reference Card with login URLs for all platforms, the 5-step daily workflow (check queue → review → edit → approve → verify), the Fair Housing prohibited phrases checklist, and the MSP support contact information.
3
Provide a comprehensive SOP Google Document (shared with all agents) containing detailed procedures with screenshots for every workflow, troubleshooting steps for common issues, the complete Fair Housing compliance policy, and the content escalation process.

Success Criteria Review

During the handoff meeting with the broker/office manager, review these KPIs together:

Documentation to Leave Behind

1
Platform credential sheet (stored in client's password manager — NOT in email or Google Doc).
2
Zapier workflow documentation with screenshots of each Zap's configuration.
3
Mailchimp drip campaign content library in Google Docs (all pre-generated email content).
4
Monthly content calendar template.
5
Escalation matrix: what issues agents handle themselves, what goes to the office manager, and what requires MSP support.
6
MSP support SLA document specifying response times and contact methods.

Transition to Managed Service

Confirm the ongoing managed service agreement is signed, covering monthly platform monitoring, quarterly content refresh, prompt optimization, and break/fix support. Schedule the first monthly review call for 30 days post-launch.

Maintenance

Weekly Tasks (15–30 minutes)

1
Review Zapier task history for any failed Zaps — investigate and resolve errors within 24 hours.
2
Check Mailchimp delivery reports: monitor open rates (target >20%), bounce rates (target <2%), and spam complaints (target <0.1% — if exceeded, immediately pause campaigns and investigate).
3
Verify Buffer is publishing on schedule with no failed posts.
4
Check Google Sheet review queue for any items stuck in PENDING status for more than 48 hours — notify the assigned agent.

Monthly Tasks (1–2 hours)

1
Generate a monthly performance report: content volume generated, email campaign metrics (open/click/unsubscribe rates), social media engagement metrics (impressions, clicks, shares), Zapier task consumption vs. plan limit.
2
Review FairSentry compliance dashboard for any flagged content.
3
Audit Zapier task usage — if approaching 80% of plan limit, recommend plan upgrade.
4
Verify all platform subscriptions are active and billing correctly.
5
Back up Zapier workflow configurations (export Zap descriptions and settings).

Quarterly Tasks (2–4 hours)

1
Content refresh: regenerate all drip campaign email content to reflect current market conditions, seasonal themes, and updated stats.
2
Prompt optimization: review AI output quality trends, refine system prompts based on agent feedback and content quality scores.
3
A/B test results review: analyze Mailchimp A/B test data on subject lines and adjust the content generation prompts to favor higher-performing styles.
4
Platform updates: check for new features in Write.Homes, Mailchimp, Buffer, and Zapier that could enhance the workflow.
5
Compliance review: verify Fair Housing language validator phrase list is current with any new HUD guidance.

Annual Tasks

1
Full platform audit and license true-up (agent count changes, plan tier optimization).
2
Security review: rotate API keys for OpenAI, Follow Up Boss, and any other API-connected services.
3
Vendor evaluation: assess whether current platform stack remains optimal or if new entrants (e.g., upgraded Write.Homes features, Jasper AI improvements) warrant switching.
4
Client business review: meet with broker to review ROI, discuss expansion opportunities (video content, chatbots, predictive analytics).

SLA Considerations

1
Target 4-hour response time for automation failures (content pipeline down).
2
Target 24-hour resolution for non-critical issues (formatting problems, minor errors).
3
Target 1-hour response for compliance emergencies (discriminatory content published).
4
Include platform vendor escalation paths: Zapier support (support.zapier.com), Mailchimp support (mailchimp.com/help), Write.Homes support (support email on their site).
5
Maintain a runbook document with troubleshooting steps for the top 10 most common issues.

Model/Prompt Retraining Triggers

1
OpenAI releases a new model version (e.g., GPT-5.4 → GPT-5) — test new model against existing prompts, compare quality, adjust if improved.
2
Client changes brokerage branding, tone, or target market — update all system prompts and drip campaign content.
3
Fair Housing enforcement actions or new HUD guidance — update the prohibited phrases list in the Fair Housing Language Validator.
4
Content quality scores drop below 3.5/5 average in agent feedback — schedule prompt refinement session.
5
Email open rates drop below 15% — refresh subject line generation approach and email content style.

Alternatives

Jasper AI Enterprise Stack

Replace Write.Homes with Jasper AI Pro or Business plan as the primary content generation engine. Jasper offers more advanced brand voice training, team collaboration features, API access for custom integrations, and a broader template library. The Business plan ($500/month) includes dedicated support and custom workflows. This approach uses Jasper's native templates for real estate content rather than custom OpenAI prompts.

Note

WHEN TO RECOMMEND: Choose Jasper for brokerages with 10+ agents, strong brand guidelines, existing content marketing programs, or budget for premium tools. Not recommended for solo agents or small teams where Write.Homes' real estate focus provides better value.

Custom OpenAI API White-Label Solution

Skip SaaS content platforms entirely and build a custom white-labeled content generation portal using the OpenAI API directly. The MSP develops a simple web application (using tools like Retool, Bubble, or custom Next.js) with real estate-specific prompt templates, connects it to the client's CRM via API, and hosts it under the MSP's brand. Per-description cost drops to ~$0.0003 via GPT-5.4 mini.

Note

WHEN TO RECOMMEND: Choose this approach when the MSP has in-house development capacity, serves multiple real estate clients (amortize development cost), or wants to create a proprietary product. Also appropriate for large brokerages (50+ agents) where SaaS per-seat costs become prohibitive. The 1,600x+ markup on API costs creates the highest margin opportunity in the entire solution.

Epique AI Free Tier + Constant Contact

Budget-minimized stack using Epique AI's free plan (12 built-in real estate tools including property descriptions, email campaigns, and blog posts) combined with Constant Contact Lite ($12/month for 500 contacts) and Buffer free tier (3 channels). Eliminates Zapier by using manual copy-paste workflows. Total platform cost under $20/month.

Note

WHEN TO RECOMMEND: Choose this for budget-constrained solo agents or 2–3 person teams testing AI content generation before committing to a full automation stack. Also suitable as a Phase 1 proof-of-concept before upgrading to the automated pipeline. Upgrade path is clear: add Zapier and switch to Write.Homes Pro when volume justifies the investment.

Rechat All-in-One Brokerage Platform

Replace the multi-vendor stack with Rechat, a unified brokerage operating system that combines CRM, AI content generation, email marketing, social media management, and transaction management in a single platform. Rechat includes AI-powered listing descriptions, automated social posts, email drip campaigns, and a branded marketing center — all natively integrated without Zapier or third-party connectors.

n8n Self-Hosted Automation (Replace Zapier)

Replace Zapier with n8n, an open-source workflow automation platform that can be self-hosted on the MSP's infrastructure. n8n provides unlimited executions (no per-task pricing), visual workflow builder, and native integrations with OpenAI, Google Sheets, email platforms, and social media APIs. Host on a $20/month VPS or existing MSP server infrastructure.

Want early access to the full toolkit?