
Implementation Guide: Score leads by engagement signals and recommend next-best action for agents
Step-by-step implementation guide for deploying AI to score leads by engagement signals and recommend next-best action for agents for Real Estate clients.
Hardware Procurement
Business Laptop — Agent Workstations
$850 per unit MSP cost / $1,100 suggested resale
Primary workstation for agents to access Follow Up Boss CRM dashboard, view scored lead lists, and manage next-best-action workflows. Minimum spec for running Chrome with multiple CRM tabs, video calls, and email simultaneously.
Dual Monitor — Secondary Display
$220 per unit MSP cost / $300 suggested resale
Second screen allows agents to view CRM lead board on one display and MLS listings or email on the other, reducing context switching during follow-up calls.
Professional USB Headset
$180 per unit MSP cost / $250 suggested resale
Active noise-canceling headset for scored-lead follow-up calls. Required for VoIP integration with Follow Up Boss calling features and Structurely AI voice handoffs. USB-A model for universal compatibility.
Business-Grade Wireless Access Point
$160 per unit MSP cost / $230 suggested resale
Ensures reliable Wi-Fi coverage throughout the office for mobile CRM access and VoIP quality. Two units for redundancy and coverage in typical 2,000–4,000 sq ft real estate office.
Software Procurement
Follow Up Boss Pro
$416/month (Pro plan) or $833/month (Platform plan)
Central CRM hub and integration backbone. Provides website tracking pixel for behavioral scoring, smart lists for lead prioritization, two-way email/text sync, native integrations with 250+ lead sources (Zillow, Realtor.com, Facebook Lead Ads, Google Ads), call tracking, and API access for custom scoring workflows. AI features included at no additional charge.
Revaluate
$139/month per 2,000 contacts; scale as needed (e.g., $278/mo for 4,000 contacts)
Predictive analytics engine that scores existing CRM contacts for move likelihood using 200+ public and proprietary data signals (social media activity, life events, financial indicators). Assigns a 0–100 Reva Score indicating probability of moving in the next 6–12 months. Enables proactive outreach to sphere-of-influence contacts before they list with a competitor.
Structurely AI ISA
$149–$450/month
AI-powered Inside Sales Agent that engages new inbound leads via SMS text and voice within 60 seconds of inquiry, 24/7/365. Qualifies leads by asking budget, timeline, pre-approval status, and property preferences. Hands off qualified leads to the assigned agent with full conversation context. Replaces $3,000–$5,000/month human ISA cost.
Zapier Professional
$49/month (2,000 tasks) or $69/month (5,000 tasks) — Professional plan
Integration middleware that connects Follow Up Boss, Revaluate, Structurely, email marketing, and custom webhooks. Executes multi-step Zaps for composite lead score calculation, next-best-action routing, Slack/push notifications, and data enrichment workflows.
Google Workspace Business Standard
$14/user/month
Professional email with custom domain for SPF/DKIM/DMARC compliance, Google Sheets for score override tracking, Google Calendar for showing scheduling integration, and Google Chat/Spaces for internal agent notifications.
Slack Pro (Optional)
$8.75/user/month (annual billing)
Real-time notification channel for hot lead alerts. Zapier sends instant Slack messages when a lead score exceeds threshold, delivering next-best-action cards with one-click CRM deep links. Optional — can substitute with Google Chat or Follow Up Boss native notifications.
Leadflow (Optional Add-On)
$99/month (starter)
Optional supplemental predictive scoring that analyzes 250+ data points per property to predict seller likelihood with a 0–1,000 score. Useful for listing-focused teams who want property-level predictions in addition to contact-level Revaluate scores.
Prerequisites
- Active Realtor® membership with local MLS board for all agents who will use the system
- Business-grade internet connection: minimum 50 Mbps download / 10 Mbps upload with < 50ms latency
- Custom domain name owned by the brokerage (e.g., brokerage.com) with DNS management access for CNAME, SPF, DKIM, and DMARC record configuration
- Google Workspace or Microsoft 365 already provisioned with individual agent email accounts on the brokerage domain
- Existing lead database exported as CSV with minimum fields: first name, last name, email, phone, lead source, lead date, status/stage. Minimum 500 contacts recommended; 1,000+ preferred for meaningful scoring patterns
- Current lead source accounts set up and active (e.g., Zillow Premier Agent, Realtor.com, Facebook Business Manager with Lead Ads, Google Ads account)
- IDX/property search website live and accessible — either existing WordPress + IDX plugin site or willingness to use Follow Up Boss's built-in Pond sites
- Brokerage managing broker's written authorization for CRM data migration and AI-assisted lead communication (required for TCPA compliance)
- Signed TCPA-compliant consent language in all web forms, registration pages, and lead capture points — consult real estate attorney before go-live
- Credit card or ACH payment method authorized for recurring SaaS subscriptions totaling approximately $700–$1,100/month
- Team organizational chart: list of all agents with roles (team lead, buyer agent, listing agent, ISA), round-robin assignment preferences, and territory/zip code assignments
- Minimum 2 hours of availability per agent blocked for training sessions during weeks 5–6 of implementation
Installation Steps
...
Step 1: Discovery & Data Audit
Conduct a 90-minute discovery call with the brokerage team lead and managing broker. Document current lead sources and monthly volume, existing CRM (if any), lead routing rules, agent specializations, pain points with current follow-up process, and compliance posture. Export the existing contact database and perform a data quality audit: check for duplicate records, missing email/phone fields, invalid formats, and lead source attribution gaps. Create a data cleanup plan.
# checks for missing fields, duplicates, and outputs a cleaned export
pip install pandas
python3 -c "import pandas as pd; df = pd.read_csv('leads_export.csv'); print(f'Total records: {len(df)}'); print(f'Missing emails: {df.email.isna().sum()}'); print(f'Missing phones: {df.phone.isna().sum()}'); print(f'Duplicates: {df.duplicated(subset=["email"]).sum()}'); df.drop_duplicates(subset=['email'], keep='first', inplace=True); df.to_csv('leads_cleaned.csv', index=False); print(f'Cleaned records: {len(df)}')"If the brokerage has no existing CRM and leads are in spreadsheets or email inboxes, add 1–2 weeks to timeline for manual data collection and structuring. Request the last 12 months of closed transaction data from the transaction management system (Dotloop/SkySlope) to establish baseline conversion metrics.
Step 2: DNS & Email Authentication Configuration
Configure the brokerage domain's DNS records to support Follow Up Boss email sending, Structurely SMS/voice, and marketing email deliverability. Add SPF, DKIM, and DMARC records. Create a CNAME for the Follow Up Boss tracking pixel domain. This prevents emails from landing in spam and ensures lead engagement tracking works correctly.
v=spf1 include:_spf.google.com include:followupboss.com include:structurely.com ~all
_dmarc.brokerage.com TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@brokerage.com; pct=100"
tracking.brokerage.com CNAME track.followupboss.comdig TXT brokerage.com +short
dig CNAME tracking.brokerage.com +short
nslookup -type=txt _dmarc.brokerage.comDNS propagation can take up to 48 hours. Configure DNS early in the project to avoid delays. If using Microsoft 365 instead of Google Workspace, replace _spf.google.com with spf.protection.outlook.com in the SPF record. Use MXToolbox (https://mxtoolbox.com) to verify all records after propagation.
Step 3: Follow Up Boss Pro Account Setup & Configuration
Create the Follow Up Boss Pro account, configure the team structure, import cleaned leads, set up lead source tracking, and configure the website tracking pixel. This is the foundational CRM layer that all other components integrate into.
<!-- add to <head> of all pages on IDX website (WordPress example) -->
<!-- Follow Up Boss Tracking Pixel -->
<script>
(function(d,u,h,s){h=d.getElementsByTagName('head')[0];
s=d.createElement('script');s.async=1;s.src=u;
h.appendChild(s);})(document,
'https://tracking.brokerage.com/fub.js?id=YOUR_FUB_ACCOUNT_ID');
</script>Follow Up Boss offers a free 14-day trial. Start the trial during Week 1 so configuration happens within the trial period — convert to paid only after confirming the platform fits. Request a dedicated onboarding specialist from FUB (included in Pro plan) to assist with initial setup. The tracking pixel must be on EVERY page of the IDX site, including individual listing pages, for accurate behavioral scoring.
Step 4: Connect Lead Sources to Follow Up Boss
Integrate all active lead generation channels so that new leads flow automatically into Follow Up Boss with source attribution. Each source must be connected via native integration or API webhook to ensure real-time lead delivery and proper scoring context.
Zillow Premier Agent Integration
Realtor.com Integration
Facebook Lead Ads Integration
Google Ads / PPC Landing Pages
POST https://api.followupboss.com/v1/events
Authorization: Basic base64(API_KEY:)
{"source": "Google Ads", "type": "Registration", ...}Website IDX Registration
- Already handled by tracking pixel from Step 3
- Registrations auto-create leads in FUB with full browsing history
Manual / Referral Leads
Test each integration by submitting a test lead from each source and verifying it appears in FUB within 60 seconds with correct source attribution. Zillow leads are extremely time-sensitive — FUB should trigger Structurely AI ISA within 30 seconds of receipt (configured in Step 6). Document all integration connection IDs for future troubleshooting.
Step 5: Revaluate Integration for Sphere-of-Influence Scoring
Connect Revaluate to the existing contact database to score all sphere-of-influence (SOI) contacts for move likelihood. Revaluate analyzes 200+ social and public data signals to predict which contacts are likely to move in the next 6–12 months. These scores supplement the behavioral engagement scores from Follow Up Boss.
Trigger: Revaluate > Score Updated
Action: Follow Up Boss > Update Person
Map fields:
- reva_score -> Custom Field 'Reva Score' (number 0-100)
- reva_reason -> Custom Field 'Move Likelihood Reason' (text)Revaluate scores are updated monthly as new data signals are detected. The initial batch scoring of an existing database takes 24–72 hours. Not all contacts will receive scores — Revaluate needs sufficient public data signals. Expect 60–70% of contacts to receive usable scores. Remaining contacts should be flagged for manual assessment.
Step 6: Structurely AI ISA Setup & Configuration
Deploy Structurely as the automated AI Inside Sales Agent that handles initial lead qualification for all new inbound leads. Configure conversation scripts, qualification criteria, handoff rules, and integration with Follow Up Boss for seamless agent handoff when a lead is qualified.
CRITICAL COMPLIANCE: Ensure all web forms that generate leads include TCPA-compliant consent language: 'By submitting this form, you consent to receive automated text messages and phone calls from [Brokerage Name] at the number provided. Message frequency varies. Reply STOP to unsubscribe.' Have the brokerage's real estate attorney review all consent language before go-live. Structurely uses local presence phone numbers to increase contact rates — verify these numbers are registered with the carrier registries (10DLC) to avoid SMS filtering.
Step 7: Build Composite Lead Score Engine via Zapier
Create a multi-step Zapier workflow that calculates a composite lead score by combining Follow Up Boss behavioral signals, Revaluate move-likelihood scores, and Structurely qualification status. The composite score is written back to Follow Up Boss as a custom field and triggers next-best-action notifications.
- Zapier Workflow: 'Composite Lead Score Calculator'
- Trigger option A: Schedule (every 2 hours) — Zapier Schedule trigger
- Trigger option B: Follow Up Boss > Person Updated (when activity fields change)
# Composite Lead Score calculation for Step 2 of the Zap
behavioral_score = 0
# Email engagement (from FUB fields)
emails_opened = input_data.get('emails_opened', 0)
emails_clicked = input_data.get('emails_clicked', 0)
behavioral_score += min(int(emails_opened or 0) * 2, 20)
behavioral_score += min(int(emails_clicked or 0) * 3, 15)
# Website activity
page_views = input_data.get('page_views', 0)
behavioral_score += min(int(page_views or 0) * 2, 20)
# Property alert engagement
alerts_opened = input_data.get('alerts_opened', 0)
behavioral_score += min(int(alerts_opened or 0) * 3, 15)
# Recency bonus
last_activity_days = int(input_data.get('days_since_last_activity', 999))
if last_activity_days <= 1:
behavioral_score += 15
elif last_activity_days <= 7:
behavioral_score += 10
elif last_activity_days <= 30:
behavioral_score += 5
# Call/text responsiveness
calls_answered = input_data.get('calls_answered', 0)
texts_replied = input_data.get('texts_replied', 0)
behavioral_score += min(int(calls_answered or 0) * 5, 15)
behavioral_score += min(int(texts_replied or 0) * 3, 10)
# Reva score (0-100 from Revaluate)
reva_score = int(input_data.get('reva_score', 0) or 0)
# Structurely qualification
ai_qualified = input_data.get('ai_qualification_status', 'none')
qualification_bonus = 0
if ai_qualified == 'qualified':
qualification_bonus = 20
elif ai_qualified == 'nurture':
qualification_bonus = 5
# Composite calculation (weighted)
composite = round(
(behavioral_score * 0.45) +
(reva_score * 0.30) +
(qualification_bonus * 0.25) +
(min(behavioral_score, 100) * 0.00) # placeholder for future signals
, 0)
composite = min(int(composite), 100)
# Determine tier
if composite >= 75:
tier = 'A - Hot'
elif composite >= 50:
tier = 'B - Warm'
elif composite >= 25:
tier = 'C - Nurture'
else:
tier = 'D - Cold'
output = {'composite_score': composite, 'tier': tier, 'behavioral_score': behavioral_score}Zapier Professional plan supports multi-step Zaps and the Code by Zapier step (Python/JavaScript). The scoring weights (45% behavioral, 30% Revaluate, 25% AI qualification) should be tuned after 90 days of data. Start with these defaults and adjust based on which signals best predict actual closings. Zapier has a 10-second timeout for Code steps — this calculation completes well within that limit.
Step 8: Build Next-Best-Action Recommendation Engine
Create a Zapier workflow that evaluates each lead's current score, engagement pattern, and pipeline stage to generate a specific next-best-action recommendation. The recommendation is stored in Follow Up Boss and pushed to agents via Slack/notification.
Zapier Workflow 2: 'Next-Best-Action Router' — Trigger: Follow Up Boss > Person Updated (when Composite Score changes)
# Next-Best-Action logic for NBA Router workflow
score = int(input_data.get('composite_score', 0))
tier = input_data.get('tier', 'D - Cold')
days_since_activity = int(input_data.get('days_since_last_activity', 999))
page_views_today = int(input_data.get('page_views_today', 0))
ai_status = input_data.get('ai_qualification_status', 'none')
has_phone = input_data.get('has_phone', 'false') == 'true'
reva_score = int(input_data.get('reva_score', 0) or 0)
stage = input_data.get('stage', 'New')
last_action = input_data.get('last_nba', '')
nba = ''
priority = 'normal'
channel = 'email'
# Hot leads with real-time browsing activity
if page_views_today >= 3 and has_phone:
nba = 'CALL NOW — Lead viewed {0} properties today. Ask about specific listings they browsed.'.format(page_views_today)
priority = 'urgent'
channel = 'phone'
elif score >= 75 and ai_status == 'qualified' and has_phone:
nba = 'CALL — AI-qualified hot lead. Review Structurely conversation notes, then call within 5 minutes.'
priority = 'urgent'
channel = 'phone'
elif score >= 75 and ai_status == 'qualified' and not has_phone:
nba = 'TEXT/EMAIL — AI-qualified but no phone. Send personalized property matches with a call-to-action to schedule a call.'
priority = 'high'
channel = 'text'
elif score >= 50 and reva_score >= 70:
nba = 'SEND CMA — High move likelihood detected by Revaluate. Send a complimentary Comparative Market Analysis for their current home.'
priority = 'high'
channel = 'email'
elif score >= 50 and days_since_activity <= 7:
nba = 'SEND LISTINGS — Active engagement this week. Send 3 curated property matches based on their search criteria.'
priority = 'normal'
channel = 'email'
elif score >= 25 and days_since_activity > 30:
nba = 'RE-ENGAGE — Dormant warm lead. Send market update email with neighborhood stats for their preferred area.'
priority = 'normal'
channel = 'email'
elif score >= 25:
nba = 'NURTURE — Add to monthly market newsletter and quarterly check-in call rotation.'
priority = 'low'
channel = 'email'
elif reva_score >= 50 and score < 25:
nba = 'SOI OUTREACH — Low engagement but moderate move signal. Send personal check-in message (not automated).'
priority = 'normal'
channel = 'text'
else:
nba = 'AI NURTURE — Keep in Structurely automated drip. No manual action needed.'
priority = 'low'
channel = 'auto'
output = {'next_best_action': nba, 'priority': priority, 'channel': channel}📋 ACTION REQUIRED for {lead_name}
Score: {composite_score} | Tier: {tier}
➡️ {next_best_action}
📱 {phone} | ✉️ {email}
🔗 Open in FUB: https://app.followupboss.com/people/{fub_id}The next-best-action logic should be reviewed and tuned quarterly. Track which NBA recommendations lead to actual conversations and closings. After 6 months of data, consider upgrading to a machine learning model trained on actual conversion outcomes. For now, this rule-based system is transparent, explainable, and easy for agents to trust.
Step 9: Configure Follow Up Boss Smart Lists & Dashboard Views
Set up agent-facing Smart Lists in Follow Up Boss that organize leads by composite score tier and next-best-action priority. These lists become the agent's daily work queue — replacing manual lead list management.
Train agents to START their day by opening the 'Call Queue — Urgent NBAs' smart list, then work through 'My Hot Leads,' then 'Warm Leads.' This replaces the old model of scrolling through an unsorted lead list or relying on memory. Pin these smart lists to the FUB sidebar for one-click access.
Step 10: Action Plans & Automated Drip Sequences
Configure Follow Up Boss Action Plans that trigger automatically based on lead tier and next-best-action recommendations. These ensure that even when agents are busy, leads receive timely follow-up.
Action Plan 1: 'Hot Lead — Speed to Lead'
Trigger: New lead + source = Zillow or Realtor.com
Action Plan 2: 'Warm Nurture — Engagement Drip'
Trigger: Lead Tier changes to 'B - Warm'
Action Plan 3: 'SOI Reactivation — Move Likely'
Trigger: Reva Score >= 70 (via Zapier updating FUB tag)
Configure Action Plans in FUB
Use merge fields in email and text content:
{{first_name}}, {{assigned_agent_name}}, {{preferred_area}}Action Plans are Follow Up Boss's built-in automation — no Zapier needed for these. Keep email content short and personal-sounding; avoid heavy HTML templates. FUB tracks open rates and click rates per Action Plan step, feeding data back into the behavioral scoring. Review Action Plan performance monthly and A/B test subject lines and send times.
Step 11: Mobile App Configuration & Push Notifications
Configure the Follow Up Boss mobile app on all agent devices to receive real-time push notifications for hot lead alerts and next-best-action prompts. Agents in the field need immediate awareness of high-priority leads.
Many real estate agents are in the field 60%+ of the time. Mobile notifications are not optional — they are the primary way agents receive hot lead alerts. During training, physically verify each agent has notifications working on their device. Disable notification grouping/summarizing on iOS to ensure each alert is seen immediately.
Step 12: Compliance Configuration & TCPA Safeguards
Implement compliance guardrails for Fair Housing, TCPA, CAN-SPAM, and state privacy laws. This is a critical step — non-compliance can result in $500–$1,500 per violation fines under TCPA and Fair Housing enforcement actions.
1. TCPA Consent Capture — Update ALL Lead Capture Forms
Add checkbox (pre-unchecked) with the following consent text:
By providing your phone number, you consent to receive calls and text
messages, including by automated means, from [Brokerage Name] regarding
real estate services. Message frequency varies. Message and data rates
may apply. Reply STOP to opt out. View our Privacy Policy [link].2. Follow Up Boss DNC Configuration
https://www.donotcall.gov/3. CAN-SPAM Compliance for Action Plans
Every automated email must include:
- Brokerage physical address in footer
- Unsubscribe link (FUB includes automatically)
- Accurate 'From' name and email address
4. Fair Housing Scoring Audit
Document that composite scoring uses ONLY the following permitted criteria, and never uses prohibited criteria:
NEVER use the following in scoring — these are prohibited criteria under Fair Housing law: • Race, color, religion, sex, familial status, national origin, disability (protected classes) • Neighborhood demographic composition • School district ratings as a proxy for demographics
5. State Privacy Law Compliance
Add a privacy policy page to the brokerage website including the following elements. For CA brokerages, also include CCPA-specific disclosures.
- Categories of personal data collected
- Purpose of collection (lead scoring disclosed)
- Data sharing practices
- Consumer rights (access, deletion, opt-out)
- Contact method for privacy requests
- CCPA-specific disclosures (California brokerages only)
6. Create Compliance Documentation Binder
MANDATORY: Have the brokerage's real estate attorney review all consent language, privacy policy updates, and scoring criteria documentation BEFORE go-live. The MSP should not provide legal advice — provide the technical implementation and configuration, but defer legal review to counsel. Schedule a quarterly compliance review as part of the managed services agreement. TCPA penalties are $500–$1,500 PER VIOLATION — a single non-compliant mass text to 500 leads could cost $250,000–$750,000.
Step 13: System Integration Testing & Score Calibration
Conduct end-to-end testing of the complete lead scoring pipeline: from initial lead capture through composite scoring, next-best-action generation, and agent notification. Calibrate scoring weights using historical conversion data.
Test Sequence 1: New Zillow Lead (Full Pipeline)
Test Sequence 2: Website Browsing Behavior
Test Sequence 3: Revaluate Score Integration
Test Sequence 4: Score Calibration
Test Sequence 5: Compliance Verification
Allow 1–2 full weeks for testing. Run all test sequences with at least 3 different test leads each. Involve 2–3 agents in User Acceptance Testing (UAT) to catch UX issues. Document all test results in a formal test log for the client handoff package. Score calibration is the most important tuning activity — the default weights work for most brokerages, but actual conversion data always improves accuracy.
Custom AI Components
Composite Lead Score Calculator
Type: workflow A Zapier multi-step workflow that combines behavioral engagement data from Follow Up Boss, predictive move-likelihood scores from Revaluate, and AI qualification status from Structurely into a single composite lead score (0–100). The score is calculated using weighted factors: 45% behavioral engagement, 30% Revaluate move likelihood, and 25% AI qualification status. Scores are categorized into tiers: A-Hot (75+), B-Warm (50–74), C-Nurture (25–49), D-Cold (0–24). The composite score is written back to Follow Up Boss custom fields and triggers downstream next-best-action workflows.
Implementation
Trigger
- App: Schedule by Zapier
- Event: Every 2 Hours
- Alternative Trigger: Follow Up Boss > Updated Person (for real-time on activity change)
Step 1: Follow Up Boss — Find Person
- Search by: Iterate through all persons updated in last 2 hours
- Use Zapier Looping or trigger on individual person updates
Step 2: Code by Zapier (Python)
# input data mappings and calculation logic
# Input Data mappings from Step 1:
# input_data['emails_opened'] = FUB field: Emails Opened (lifetime)
# input_data['emails_clicked'] = FUB field: Emails Clicked (lifetime)
# input_data['page_views'] = FUB field: Page Views (last 30 days)
# input_data['alerts_opened'] = FUB field: Alerts Opened (last 30 days)
# input_data['days_since_last_activity'] = calculated from FUB Last Activity date
# input_data['calls_answered'] = FUB field: Calls Answered
# input_data['texts_replied'] = FUB field: Texts Replied
# input_data['reva_score'] = FUB Custom Field: Reva Score
# input_data['ai_qualification_status'] = FUB Tag: qualified|nurture|none
# input_data['showing_requests'] = FUB Custom Field: Showing Requests Count
behavioral_score = 0
# --- EMAIL ENGAGEMENT (max 35 pts) ---
emails_opened = int(input_data.get('emails_opened', 0) or 0)
emails_clicked = int(input_data.get('emails_clicked', 0) or 0)
behavioral_score += min(emails_opened * 2, 20) # 2 pts per open, max 20
behavioral_score += min(emails_clicked * 3, 15) # 3 pts per click, max 15
# --- WEBSITE ACTIVITY (max 30 pts) ---
page_views = int(input_data.get('page_views', 0) or 0)
behavioral_score += min(page_views * 2, 20) # 2 pts per view, max 20
showing_requests = int(input_data.get('showing_requests', 0) or 0)
behavioral_score += min(showing_requests * 10, 10) # 10 pts per showing, max 10
# --- ALERT ENGAGEMENT (max 15 pts) ---
alerts_opened = int(input_data.get('alerts_opened', 0) or 0)
behavioral_score += min(alerts_opened * 3, 15) # 3 pts per alert, max 15
# --- RECENCY BONUS (max 15 pts) ---
last_activity_days = int(input_data.get('days_since_last_activity', 999) or 999)
if last_activity_days <= 1:
behavioral_score += 15
elif last_activity_days <= 3:
behavioral_score += 12
elif last_activity_days <= 7:
behavioral_score += 10
elif last_activity_days <= 14:
behavioral_score += 7
elif last_activity_days <= 30:
behavioral_score += 5
# --- RESPONSIVENESS (max 25 pts) ---
calls_answered = int(input_data.get('calls_answered', 0) or 0)
texts_replied = int(input_data.get('texts_replied', 0) or 0)
behavioral_score += min(calls_answered * 5, 15) # 5 pts per call, max 15
behavioral_score += min(texts_replied * 3, 10) # 3 pts per text, max 10
# Cap behavioral at 100
behavioral_score = min(behavioral_score, 100)
# --- REVALUATE MOVE LIKELIHOOD (0-100 scale) ---
reva_score = int(input_data.get('reva_score', 0) or 0)
# --- AI QUALIFICATION BONUS (0-100 scale) ---
ai_status = str(input_data.get('ai_qualification_status', 'none')).lower()
if 'qualified' in ai_status:
qualification_score = 100
elif 'nurture' in ai_status:
qualification_score = 25
elif 'attempted' in ai_status:
qualification_score = 10
else:
qualification_score = 0
# --- COMPOSITE CALCULATION ---
# Weights: behavioral 45%, revaluate 30%, qualification 25%
composite = round(
(behavioral_score * 0.45) +
(reva_score * 0.30) +
(qualification_score * 0.25)
)
composite = max(0, min(composite, 100))
# --- TIER ASSIGNMENT ---
if composite >= 75:
tier = 'A - Hot'
elif composite >= 50:
tier = 'B - Warm'
elif composite >= 25:
tier = 'C - Nurture'
else:
tier = 'D - Cold'
# --- TREND DETECTION ---
previous_score = int(input_data.get('previous_composite_score', 0) or 0)
score_change = composite - previous_score
if score_change >= 15:
trend = 'Rising Fast'
elif score_change >= 5:
trend = 'Rising'
elif score_change <= -15:
trend = 'Dropping Fast'
elif score_change <= -5:
trend = 'Dropping'
else:
trend = 'Stable'
output = {
'composite_score': str(composite),
'tier': tier,
'behavioral_score': str(behavioral_score),
'reva_component': str(round(reva_score * 0.30)),
'qual_component': str(round(qualification_score * 0.25)),
'trend': trend,
'score_change': str(score_change)
}Step 3: Follow Up Boss — Update Person
- Custom Field 'Composite Score' =
{{composite_score}} - Custom Field 'Lead Tier' =
{{tier}} - Custom Field 'Behavioral Score' =
{{behavioral_score}} - Custom Field 'Score Trend' =
{{trend}} - Custom Field 'Previous Composite Score' = (copy current before update)
Step 4: Filter
- Only continue if
tier= 'A - Hot' ANDtrendin ('Rising Fast', 'Rising')
Step 5: Paths (Zapier Paths)
- Path A: If
score_change>= 15 → Slack urgent notification - Path B: If
tierchanged to 'A - Hot' → Create urgent FUB task
Custom Fields Required in Follow Up Boss
Next-Best-Action Recommendation Engine
Type: workflow A rule-based decision engine implemented as a Zapier Code step that evaluates a lead's composite score, engagement pattern, pipeline stage, channel preferences, and time-of-day to generate specific, actionable recommendations for the assigned agent. Each recommendation includes the action type (call, text, email, in-person), the specific content to deliver, and the urgency level. Recommendations are personalized based on the lead's browsing history and stated preferences.
Implementation
Zapier Workflow: Next-Best-Action Router
Trigger
- App: Follow Up Boss
- Event: Person Updated (when Composite Score field changes)
Step 1: Follow Up Boss — Get Person Details
- Retrieve full person record including all custom fields, tags, notes
Step 2: Code by Zapier (Python)
# evaluates score, trend, activity, channel, and lead type to output a
# prioritized recommendation
import json
from datetime import datetime
# --- INPUT DATA ---
score = int(input_data.get('composite_score', 0) or 0)
tier = str(input_data.get('tier', 'D - Cold'))
trend = str(input_data.get('trend', 'Stable'))
days_inactive = int(input_data.get('days_since_last_activity', 999) or 999)
page_views_today = int(input_data.get('page_views_today', 0) or 0)
page_views_7d = int(input_data.get('page_views_7d', 0) or 0)
ai_status = str(input_data.get('ai_qualification_status', 'none')).lower()
has_phone = str(input_data.get('has_phone', 'false')).lower() == 'true'
has_email = str(input_data.get('has_email', 'false')).lower() == 'true'
reva_score = int(input_data.get('reva_score', 0) or 0)
stage = str(input_data.get('stage', 'New'))
lead_type = str(input_data.get('lead_type', 'buyer')).lower() # buyer or seller
preferred_area = str(input_data.get('preferred_area', 'your preferred area'))
price_range = str(input_data.get('price_range', ''))
last_nba = str(input_data.get('last_nba', ''))
previous_calls = int(input_data.get('call_attempts', 0) or 0)
texts_sent = int(input_data.get('texts_sent', 0) or 0)
# --- DECISION LOGIC ---
nba = ''
priority = 'normal'
channel = 'email'
action_detail = ''
# Priority 1: Real-time browsing activity (highest urgency)
if page_views_today >= 4 and has_phone:
nba = f'CALL NOW — Lead viewed {page_views_today} properties in the last few hours'
action_detail = f'Reference specific listings they viewed. Ask: "I noticed you were looking at homes in {preferred_area} — would you like to schedule a showing?"'
priority = 'urgent'
channel = 'phone'
elif page_views_today >= 4 and not has_phone:
nba = f'TEXT/CHAT NOW — Lead viewed {page_views_today} properties today but no phone on file'
action_detail = f'Send via text or FUB chat: "Hi {{first_name}}, I see you\'re exploring {preferred_area}! I\'d love to help you find the perfect home. When is a good time to chat?"'
priority = 'urgent'
channel = 'text'
# Priority 2: AI-qualified hot leads
elif 'qualified' in ai_status and score >= 70 and has_phone:
nba = 'CALL — AI-qualified hot lead ready for agent conversation'
action_detail = 'Review Structurely conversation transcript in FUB notes. Lead has confirmed timeline, budget, and area. Open with: "Hi {{first_name}}, I\'m following up on your conversation — I have some great options that match what you described."'
priority = 'urgent'
channel = 'phone'
elif 'qualified' in ai_status and score >= 70 and not has_phone:
nba = 'EMAIL — AI-qualified hot lead, phone number missing'
action_detail = f'Send personalized email with 3 property matches in {preferred_area}. Include CTA: "Reply with your phone number and I\'ll send you details with photos and virtual tours."'
priority = 'high'
channel = 'email'
# Priority 3: Rising score / re-engagement
elif trend == 'Rising Fast' and score >= 50:
nba = 'CALL — Score rising rapidly, lead is re-engaging'
action_detail = f'Lead score jumped significantly. Ask: "I have some new listings in {preferred_area} that just hit the market — would any of these interest you?"'
priority = 'high'
channel = 'phone' if has_phone else 'email'
# Priority 4: High Revaluate score (likely mover from SOI)
elif reva_score >= 70 and lead_type == 'seller':
nba = 'SEND CMA — Revaluate signals high move likelihood for seller lead'
action_detail = 'Prepare a Comparative Market Analysis for their current property. Call with: "I was doing some market research in your area and thought you might like to know what your home is worth in today\'s market."'
priority = 'high'
channel = 'phone' if has_phone else 'email'
elif reva_score >= 70 and lead_type != 'seller':
nba = 'PERSONAL OUTREACH — SOI contact showing move signals'
action_detail = 'Send a personal (non-automated) text or call. Do NOT mention Revaluate or data monitoring. Try: "Hey {{first_name}}, just thinking of you — how are things going? Let me know if you ever need anything real estate related!"'
priority = 'high'
channel = 'phone' if has_phone else 'text'
# Priority 5: Warm leads with recent activity
elif score >= 50 and days_inactive <= 7 and page_views_7d >= 3:
nba = f'SEND CURATED LISTINGS — Active browsing this week ({page_views_7d} views)'
action_detail = f'Send 3-5 handpicked listings in {preferred_area} within {price_range if price_range else "their price range"}. Add personal note: "These just came on the market and I thought of you."'
priority = 'normal'
channel = 'email'
elif score >= 50 and days_inactive <= 14:
nba = 'SEND MARKET REPORT — Warm lead, keep engagement momentum'
action_detail = f'Send neighborhood market report for {preferred_area} with recent sales, average prices, and days-on-market data. Position as helpful information, not sales push.'
priority = 'normal'
channel = 'email'
# Priority 6: Dormant warm leads (re-engagement needed)
elif score >= 30 and days_inactive > 30 and days_inactive <= 90:
nba = 'RE-ENGAGE — Dormant warm lead needs a touchpoint'
action_detail = f'Send "checking in" message: "Hi {{first_name}}, I know the market has been busy — are you still thinking about {"selling" if lead_type == "seller" else "buying"}? The market in {preferred_area} has had some interesting changes."'
priority = 'normal'
channel = 'text' if has_phone and texts_sent < 3 else 'email'
# Priority 7: Cold re-engagement attempt
elif score >= 15 and days_inactive > 90:
nba = 'LONG-TERM NURTURE — Add to quarterly newsletter'
action_detail = 'No manual action needed. Ensure lead is on quarterly market newsletter list and annual holiday card list. Set reminder to personally review in 6 months.'
priority = 'low'
channel = 'auto'
# Priority 8: Default — AI nurture
else:
nba = 'AI NURTURE — Structurely handles ongoing engagement'
action_detail = 'Lead is in automated AI nurture via Structurely. No manual action required unless status changes. Structurely will re-engage monthly and notify if lead becomes responsive.'
priority = 'low'
channel = 'auto'
# --- AVOID REPETITIVE ACTIONS ---
if nba == last_nba and priority != 'urgent':
nba = f'MAINTAIN CURRENT PLAN — Previous action still relevant ({channel})'
action_detail = 'Same recommendation as last cycle. Continue current approach unless lead engagement changes.'
priority = 'low'
output = {
'next_best_action': nba,
'action_detail': action_detail,
'priority': priority,
'channel': channel,
'timestamp': datetime.utcnow().isoformat()
}Step 3: Follow Up Boss — Update Person
- Custom Field 'Next Best Action' =
{{next_best_action}} - Custom Field 'Action Detail' =
{{action_detail}} - Custom Field 'NBA Priority' =
{{priority}} - Custom Field 'NBA Channel' =
{{channel}}
Step 4: Paths
- Path A (Urgent): priority = 'urgent' → Slack DM to assigned agent: 🔥 emoji + lead name + NBA + deep link; FUB Task: Due today, description = action_detail; If agent has no Slack: Send SMS via Twilio to agent's phone
- Path B (High): priority = 'high' → Slack channel #daily-actions: lead name + NBA; FUB Task: Due tomorrow, description = action_detail
- Path C (Normal): priority = 'normal' → FUB Task only: Due in 2 days, description = action_detail
- Path D (Low): priority = 'low' → No notification. Update fields only.
Hot Lead Real-Time Alert System
Type: integration A Zapier workflow that monitors Follow Up Boss for real-time website visitor activity. When a known lead visits 3+ property pages within a 15-minute window, the system immediately calculates an urgency score and sends a push notification to the assigned agent via Slack with specific listing URLs the lead viewed, suggested talking points, and a one-click call button.
Zapier Workflow: Real-Time Hot Lead Alert
Trigger Option A: Follow Up Boss Webhook
- Follow Up Boss sends a webhook when a tracked visitor views a property page
- Configure in FUB: Admin > API & Webhooks > New Webhook
- Event:
visits.created - URL: Zapier Webhook catch URL
Trigger Option B: Zapier Schedule (if webhooks unavailable)
- Schedule every 15 minutes
- FUB API call: GET /v1/people?sort=last_visited&limit=20&last_visited_after={15_min_ago}
Step 1: Zapier Webhook (Catch Raw Hook)
- Receives payload: {person_id, page_url, timestamp, visit_count_today}
Step 2: Follow Up Boss — Get Person
- Lookup by person_id from webhook
- Retrieve: name, phone, email, assigned_agent, composite_score, preferred_area
Step 3: Filter
- Continue only if: page_views_today >= 3
- OR (page_views_today >= 2 AND composite_score >= 50)
- AND assigned_agent is not empty
Step 4: Code by Zapier (JavaScript)
// calculates urgency score and formats Slack message
const leadName = inputData.lead_name || 'Unknown Lead';
const score = parseInt(inputData.composite_score) || 0;
const phone = inputData.phone || 'No phone on file';
const email = inputData.email || '';
const pageViews = parseInt(inputData.page_views_today) || 0;
const lastPageUrl = inputData.last_page_url || '';
const agentName = inputData.assigned_agent || 'Unassigned';
const fubId = inputData.fub_person_id || '';
const fubLink = `https://app.followupboss.com/people/${fubId}`;
// Extract property address from URL if possible
const propertyMatch = lastPageUrl.match(/\/property\/(.+?)(?:\?|$)/);
const propertyRef = propertyMatch ? decodeURIComponent(propertyMatch[1]).replace(/-/g, ' ') : 'multiple listings';
let urgencyEmoji = '🟡';
if (score >= 75 && pageViews >= 4) urgencyEmoji = '🔴';
else if (score >= 50 || pageViews >= 4) urgencyEmoji = '🟠';
const message = `${urgencyEmoji} *ACTIVE NOW: ${leadName}*\n` +
`📊 Score: ${score} | 👀 Pages today: ${pageViews}\n` +
`🏠 Last viewed: ${propertyRef}\n` +
`📱 Phone: ${phone}\n` +
`\n💡 *Suggested action:* Call now and reference the ${propertyRef} listing. Ask if they'd like to see it in person.\n` +
`\n🔗 <${fubLink}|Open in Follow Up Boss>`;
output = [{message: message, agent_name: agentName, urgency: urgencyEmoji}];Step 5: Slack — Send Direct Message
- Find user by: agent email (mapped from FUB assigned agent)
- Message:
{{message}}from Step 4 - Include: Link button to FUB person record
Step 6: Follow Up Boss — Create Task
- Person: {{fub_person_id}}
- Assigned to: {{assigned_agent}}
- Due: Today
- Description: 'Lead is actively browsing right now. Call immediately.'
- Priority: High
Webhook Configuration in FUB
# POST endpoint and required headers
POST https://hooks.zapier.com/hooks/catch/XXXXX/YYYYY/
Content-Type: application/json
Events: visits.createdWeekly Score Digest Report
Type: workflow An automated weekly report generated every Monday morning that summarizes lead scoring activity for the team lead and managing broker. Includes: total leads scored, tier distribution changes, top 10 hottest leads, leads with biggest score increases, conversion funnel metrics, and AI ISA qualification rates. Delivered via email and posted to a Slack channel.
Implementation:
Zapier Workflow: Weekly Score Digest
Trigger
- App: Schedule by Zapier
- Event: Every Week (Monday at 8:00 AM local time)
Step 1: Follow Up Boss — API Request (Custom)
- Method: GET
- URL:
https://api.followupboss.com/v1/people?sort=-custom_composite_score&limit=200&fields=id,name,custom_composite_score,custom_lead_tier,custom_score_trend,custom_reva_score,custom_ai_qualification_status,assignedTo,lastActivity,stage - Headers:
Authorization: Basic {base64(API_KEY:)}
Step 2: Code by Zapier (Python)
# Python script to calculate tier distribution, top leads, risers, and AI
# ISA stats, then build the weekly digest report string
import json
from collections import Counter
people = json.loads(input_data.get('people_json', '[]'))
# Tier distribution
tiers = Counter(p.get('custom_lead_tier', 'Unknown') for p in people)
# Top 10 hottest
top_10 = sorted(people, key=lambda x: int(x.get('custom_composite_score', 0) or 0), reverse=True)[:10]
# Biggest risers (score_trend = 'Rising Fast')
risers = [p for p in people if p.get('custom_score_trend') == 'Rising Fast'][:10]
# AI qualification stats
ai_qualified = sum(1 for p in people if 'qualified' in str(p.get('custom_ai_qualification_status', '')).lower())
ai_nurture = sum(1 for p in people if 'nurture' in str(p.get('custom_ai_qualification_status', '')).lower())
# Build report
report = f"""📊 WEEKLY LEAD SCORE DIGEST — {input_data.get('date', 'This Week')}
📈 TIER DISTRIBUTION:
🔴 A - Hot: {tiers.get('A - Hot', 0)} leads
🟠 B - Warm: {tiers.get('B - Warm', 0)} leads
🟡 C - Nurture: {tiers.get('C - Nurture', 0)} leads
⚪ D - Cold: {tiers.get('D - Cold', 0)} leads
Total scored: {len(people)}
🏆 TOP 10 HOTTEST LEADS:
"""
for i, p in enumerate(top_10, 1):
report += f" {i}. {p.get('name', 'Unknown')} — Score: {p.get('custom_composite_score', 0)} ({p.get('custom_score_trend', 'Stable')}) — Assigned: {p.get('assignedTo', 'Unassigned')}\n"
report += f"""
🚀 FASTEST RISING LEADS:
"""
for p in risers[:5]:
report += f" ⬆️ {p.get('name', 'Unknown')} — Score: {p.get('custom_composite_score', 0)} (Rising Fast)\n"
report += f"""
🤖 AI ISA PERFORMANCE:
Qualified by AI: {ai_qualified}
In AI Nurture: {ai_nurture}
Total AI-touched: {ai_qualified + ai_nurture}
💡 RECOMMENDATION:
"""
if tiers.get('A - Hot', 0) > 20:
report += " High volume of hot leads — consider adding an agent or redistributing round-robin."
elif tiers.get('A - Hot', 0) < 5:
report += " Low hot lead count — review lead sources and marketing spend. Consider increasing ad budget."
else:
report += " Lead volume is healthy. Focus on conversion rate from A-tier to appointment."
output = {'report': report}Step 3: Gmail — Send Email
- To: team_lead@brokerage.com, managing_broker@brokerage.com
- Subject:
📊 Weekly Lead Score Digest — {{date}} - Body:
{{report}}
Step 4: Slack — Post to Channel
- Channel: #lead-reports
- Message:
{{report}}
Fair Housing Scoring Bias Audit Tool
Type: prompt A quarterly audit checklist and automated report that analyzes the lead scoring system for potential Fair Housing Act violations. Verifies that no protected class proxies have been introduced into scoring criteria, checks for disparate impact patterns in score distribution, and generates a compliance documentation report for the brokerage's records.
Implementation
Fair Housing Scoring Audit — Quarterly Checklist & Report Template
Step 1: Export Score Data
Export all scored leads from Follow Up Boss via API or CSV export:
- Fields: composite_score, lead_tier, lead_source, zip_code, price_range, property_type, stage, assigned_agent, created_date
- DO NOT export or analyze: name (can indicate ethnicity), address (can indicate neighborhood demographics)
Step 2: Statistical Distribution Check
Using Google Sheets or Python:
import pandas as pd
df = pd.read_csv('scored_leads_export.csv')
# Check 1: Score distribution by lead source
print('=== Score Distribution by Lead Source ===')
print(df.groupby('lead_source')['composite_score'].describe())
# Check 2: Score distribution by zip code (potential geographic bias)
print('\n=== Score Distribution by Zip Code ===')
zip_scores = df.groupby('zip_code')['composite_score'].agg(['mean', 'count'])
print(zip_scores[zip_scores['count'] >= 10].sort_values('mean'))
# Flag: If certain zip codes consistently score lower, investigate whether
# the scoring algorithm inadvertently penalizes leads from certain areas
# Check 3: Tier distribution by price range
print('\n=== Tier Distribution by Price Range ===')
print(pd.crosstab(df['price_range_bucket'], df['lead_tier'], normalize='index'))
# Check 4: Agent assignment equity (are hot leads distributed fairly?)
print('\n=== Hot Lead Distribution by Agent ===')
hot = df[df['lead_tier'] == 'A - Hot']
print(hot['assigned_agent'].value_counts())Step 3: Criteria Verification Checklist
Step 4: Generate Compliance Report
FAIR HOUSING SCORING COMPLIANCE REPORT
Brokerage: [Name]
Date: [Audit Date]
Auditor: [MSP Technician Name]
Period Covered: [Quarter]
SCORING CRITERIA REVIEWED:
- Behavioral engagement signals: [COMPLIANT/NON-COMPLIANT]
- Predictive move likelihood (Revaluate): [COMPLIANT/NON-COMPLIANT]
- AI qualification (Structurely): [COMPLIANT/NON-COMPLIANT]
STATISTICAL ANALYSIS:
- Geographic score distribution: [EVEN/FLAGGED]
- Price range score distribution: [EVEN/FLAGGED]
- Lead source score distribution: [EVEN/FLAGGED]
FINDINGS: [Describe any issues found]
REMEDIATION: [Describe corrective actions taken]
CERTIFICATION:
I certify that the lead scoring system has been reviewed and contains
no criteria that discriminate based on race, color, religion, sex,
familial status, national origin, or disability.
Signed: _______________________ Date: _______________Frequency: Quarterly (January, April, July, October). Retain reports for 5 years minimum.
Testing & Validation
- TEST 1 — Lead Source Integration: Submit a test lead from each connected source (Zillow, Realtor.com, Facebook Lead Ad, website registration, manual entry). Verify each lead appears in Follow Up Boss within 60 seconds with correct source attribution, assigned agent, and triggered Action Plan.
- TEST 2 — Structurely AI ISA Response Time: Submit a test lead with a valid phone number. Time the interval from lead creation in FUB to first Structurely text message. Must be under 120 seconds. Respond as a qualified buyer and verify the 'Qualified by AI' tag appears in FUB within 5 minutes.
- TEST 3 — Structurely STOP Compliance: Reply 'STOP' to a Structurely conversation. Verify all automated messages cease immediately. Verify the lead's record in FUB is updated with a 'Do Not Contact' or 'Opted Out' tag. Attempt to manually trigger an Action Plan email — verify it is blocked.
- TEST 4 — Composite Score Calculation: Create a test lead with known engagement data (5 email opens, 3 clicks, 10 page views, Reva Score 60, AI qualified). Run the Zapier composite score workflow manually. Verify the calculated composite score matches expected output: (min(5*2,20) + min(3*3,15) + min(10*2,20) + 15 recency + 0 calls + 0 texts) * 0.45 = (10+9+20+15)*0.45 = 24.3 behavioral; 60*0.30 = 18 reva; 100*0.25 = 25 qual; total = 67 → Tier B-Warm.
- TEST 5 — Next-Best-Action Generation: For the test lead with composite score 67 and recent activity within 7 days, verify NBA generates: 'SEND CURATED LISTINGS' recommendation with 'normal' priority and 'email' channel. Change page_views_today to 5 and re-run — verify NBA changes to 'CALL NOW' with 'urgent' priority.
- TEST 6 — Smart List Population: After scoring 20+ test leads with varied scores, verify Follow Up Boss Smart Lists correctly filter: 'My Hot Leads' shows only Tier A leads assigned to the logged-in agent; 'Call Queue — Urgent NBAs' shows only leads with NBA Priority = urgent and phone on file; 'SOI — Likely Movers' shows only leads with Reva Score >= 60.
- TEST 7 — Real-Time Alert Pipeline: Visit the IDX website as a tracked test lead and view 4+ property pages within 10 minutes. Verify the assigned agent receives a Slack direct message within 5 minutes containing the lead's name, score, page view count, and FUB deep link. Verify a 'Call immediately' task is created in FUB.
- TEST 8 — Revaluate Score Sync: Verify that at least 60% of imported SOI contacts have received a Reva Score within 72 hours of initial upload. Verify scores appear correctly in the FUB custom field 'Reva Score' and that the 'SOI - Likely Movers' Smart List populates with contacts scoring >= 70.
- TEST 9 — Action Plan Execution: Trigger the 'Hot Lead — Speed to Lead' Action Plan for a test lead. Verify Day 0 Structurely text fires, Day 0 agent task is created, Day 1 follow-up task appears on schedule. Fast-forward to Day 7 and verify market update email is sent with correct merge fields, unsubscribe link, and physical address.
- TEST 10 — Mobile Push Notification: Assign a hot lead to each agent's FUB account. Verify each agent receives a push notification on their mobile device within 60 seconds. Have each agent click the notification and confirm it opens the correct lead record in the FUB mobile app.
- TEST 11 — Weekly Digest Report: Manually trigger the Weekly Score Digest Zapier workflow. Verify the email arrives at the team lead and managing broker addresses with correct tier distribution counts, top 10 list, and AI ISA statistics. Verify the Slack post appears in #lead-reports channel.
- TEST 12 — DNS and Email Deliverability: Send a test Action Plan email to a Gmail address, an Outlook address, and a Yahoo address. Verify all three land in the primary inbox (not spam/junk). Check email headers for proper SPF pass, DKIM pass, and DMARC alignment using Google Admin Toolbox (https://toolbox.googleapps.com/apps/messageheader/).
- TEST 13 — Fair Housing Compliance Spot Check: Review the composite score calculation code and verify zero references to demographic data, neighborhood composition, school district rankings, or any protected class characteristic. Review Structurely conversation scripts and verify no questions about family status, religion, national origin, or disability.
- TEST 14 — End-to-End Conversion Tracking: Create 5 test leads representing different scenarios (new Zillow buyer, re-engaged website visitor, high Reva Score SOI, AI-qualified renter, cold unresponsive). Process each through the full pipeline and verify appropriate scores, tiers, NBAs, and Action Plans are assigned to each persona correctly and distinctly.
Client Handoff
Client Handoff Agenda (2-Hour Session with Team Lead + All Agents)
Part 1: System Overview (30 min)
- Explain what lead scoring is and why it matters (data shows scored leads convert 2–3x better than unscored)
- Walk through the scoring methodology: behavioral signals (45%), Revaluate move likelihood (30%), AI qualification (25%)
- Demonstrate the tier system: A-Hot, B-Warm, C-Nurture, D-Cold
- Show a real lead's score breakdown so agents understand what drives scores up/down
Part 2: Daily Workflow Training (45 min)
- Live demonstration of the agent's daily workflow: 1. Open FUB → 'Call Queue — Urgent NBAs' (handle urgent first) 2. Work through 'My Hot Leads' list 3. Process 'Warm Leads — Follow Up Today' 4. Check 'SOI — Likely Movers' weekly
- Practice reading and acting on Next-Best-Action recommendations
- Practice using the mobile app: receiving push notifications, viewing lead details, logging call outcomes
- Role-play exercise: agent receives hot lead alert, opens FUB, reads NBA, makes simulated call
Part 3: AI ISA Understanding (15 min)
- Explain how Structurely works: what it says, when it hands off, how to read transcripts
- Show agents where to find AI conversation transcripts in FUB notes
- Demonstrate the qualified vs. nurture handoff difference
- Emphasize: agents should NOT duplicate Structurely's questions when calling qualified leads
Part 4: Compliance Training (15 min)
- Review TCPA requirements: only contact leads with documented consent
- Review Fair Housing: scoring is behavioral only, never demographic
- Show agents how to mark a lead as 'Do Not Contact' if requested
- Review STOP/unsubscribe handling procedures
Part 5: Q&A + Success Criteria Review (15 min)
- Answer questions from agents
- Review success criteria with team lead:
Documentation Package to Leave Behind:
Maintenance
Ongoing MSP Maintenance Responsibilities
Weekly Tasks (30 minutes/week)
- Review Zapier task usage and error logs — resolve any failed Zaps within 24 hours
- Verify Structurely is engaging new leads (check conversation volume in Structurely dashboard)
- Monitor Follow Up Boss webhook health and API connectivity
- Review the Weekly Score Digest report for anomalies (sudden score drops, zero hot leads, etc.)
Monthly Tasks (2 hours/month)
Quarterly Tasks (4 hours/quarter)
- Score Calibration: Export last 90 days of closed transactions, cross-reference with composite scores at time of first contact, adjust tier thresholds and scoring weights if needed. Document changes.
- Fair Housing Compliance Audit: Run the full bias audit checklist (custom component above). Generate and file compliance report.
- Structurely Script Review: Review AI conversation logs for accuracy, professionalism, and compliance. Update qualification questions if market conditions change (e.g., interest rate shifts affecting pre-approval questions).
- Integration Health Check: Test each lead source integration end-to-end. Verify tracking pixel is still installed on all website pages. Check for any platform API changes or deprecations.
- Client Strategy Meeting: 1-hour call with team lead to review KPIs, discuss score calibration changes, and plan next-quarter optimizations.
Semi-Annual Tasks (2 hours/6 months)
- Review Revaluate contract and contact volume — adjust tier if database has grown
- Evaluate new AI tools/features released by FUB, Structurely, or Revaluate — recommend upgrades
- Review Zapier workflow efficiency — consolidate or optimize Zaps that have grown complex
- Update compliance documentation for any new state privacy laws enacted
Annual Tasks (4 hours/year)
- Full platform audit: review all custom fields, Smart Lists, Action Plans, Zapier workflows for relevance
- Negotiate software renewal pricing — leverage MSP partner status for discounts
- Present annual ROI report to managing broker: leads scored, conversion rate changes, AI ISA savings vs. human ISA cost, revenue attributed to scored-lead follow-up
- Recommend technology stack updates for the coming year
SLA Commitments
- Critical (system down, leads not flowing): 1-hour response, 4-hour resolution
- High (scoring not updating, AI ISA not engaging): 4-hour response, 24-hour resolution
- Normal (Smart List configuration, report tweaks): 24-hour response, 72-hour resolution
- Low (training requests, feature questions): 48-hour response, 1-week resolution
Escalation Path
Model Retraining Triggers
The rule-based scoring system does not require ML model retraining, but scoring weights should be recalibrated when:
- Conversion rate from A-tier leads drops below 5% (thresholds too low)
- More than 30% of closed deals came from B-tier or lower leads (thresholds too high)
- A new lead source is added that behaves differently from existing sources
- Market conditions shift significantly (e.g., buyer's market → seller's market)
- Agent count changes by more than 25% (routing and distribution changes needed)
Alternatives
All-in-One Platform: BoldTrail/kvCORE
Replace the three-tool stack (Follow Up Boss + Revaluate + Structurely) with BoldTrail by Inside Real Estate, which includes built-in AI behavioral scoring, automated action plans, IDX website, CRM, and smart follow-up in a single platform. BoldTrail serves 250,000+ agents and provides a complete ecosystem without third-party integrations.
Premium Platform: BoomTown
Deploy BoomTown's predictive CRM with its 'Opportunity Wall' that surfaces the most likely-to-convert leads using proprietary AI. BoomTown includes lead generation (PPC management), IDX website, CRM, and predictive scoring in one platform. Research shows BoomTown produces 2x more leads and 33% more commission income in head-to-head testing.
Enterprise CRM: HubSpot Sales Hub + Custom Scoring
Deploy HubSpot Sales Hub Professional ($90/seat/month) with its built-in AI predictive lead scoring. Build custom scoring properties and workflows using HubSpot's native automation. Add Revaluate integration via Zapier for move-likelihood data. This approach gives the brokerage a world-class CRM that can grow beyond real estate if the business diversifies.
Budget Option: Lofty (formerly Chime) Standalone
Deploy Lofty's all-in-one platform which includes dynamic lead scoring that adjusts based on contact validity, online behavior, property info, and more. Lofty Core starts at $449/month and includes CRM, IDX website, AI assistant, and lead scoring — the lowest-cost all-in-one option with dynamic scoring.
DIY Scoring: ActiveCampaign + Custom Automation
Use ActiveCampaign ($79/month Pro plan) as the CRM and marketing automation platform with its built-in point-based lead scoring. Configure detailed scoring rules for every engagement signal. Add Structurely for AI ISA and Revaluate for move-likelihood. This gives the MSP maximum control over scoring logic without custom code.
Want early access to the full toolkit?