56 min readDeterministic automation

Implementation Guide: Send milestone-based status updates to clients throughout the transaction

Step-by-step implementation guide for deploying AI to send milestone-based status updates to clients throughout the transaction for Real Estate clients.

Hardware Procurement

iPad 10th Generation Wi-Fi 64GB

AppleMPQ03LL/AQty: 2

$349 per unit (MSP cost) / $449 suggested resale with configuration

Optional intake tablets placed at the brokerage front desk and signing room. Used to capture client SMS opt-in consent (TCPA-compliant written consent) via a digital form at listing or buyer agreement signings. Also serves as a client-facing kiosk for reviewing transaction status. Not strictly required — consent can be captured on paper or via existing agent devices.

Tablet Floor Stand with Locking Enclosure

AboveTEKTS011BQty: 2

$89 per unit (MSP cost) / $129 suggested resale

Secures iPad tablets in the brokerage office and signing room for client self-service SMS consent capture. Anti-theft locking mechanism prevents removal.

Software Procurement

Open to Close (Grow Plan)

Open to CloseGrow PlanQty: per account

$99/month + $69/month per additional user beyond first; suggest resale at $129/month base + $89/user

Primary Transaction Management System. Serves as the single source of truth for all deal milestones. Chosen specifically because it has the best native notification automation among TMS platforms — built-in SMS and email triggers that fire when transaction status changes, reducing or eliminating the need for external middleware for basic setups. Includes automated text triggers for buy-side and list-side processes, smart blocks, scheduled emails, and integrations with Follow Up Boss, SkySlope, Dotloop, Google Workspace, and Microsoft 365.

Zapier (Professional Plan)

ZapierProfessional PlanQty: 1 subscription

$29.99/month (suggested resale at $49.99/month)

Workflow automation middleware that connects Open to Close (or alternative TMS) to Twilio SMS and SendGrid email APIs. Handles advanced routing logic: buyer vs. seller message selection, agent CC preferences, milestone-to-template mapping, and error notifications to the MSP. Used for workflows that exceed Open to Close's native trigger capabilities — e.g., conditional branching based on transaction type, multi-channel dispatch, or CRM writeback.

Twilio Programmable Messaging (SMS)

TwilioUsage-based APIQty: Per message + per number + one-time registration

$0.0079/message sent + $0.0079/message received + $2/month per phone number + ~$19 one-time A2P 10DLC registration; typical brokerage volume: $15–50/month; suggest billing client $0.04/SMS (5x markup)

Programmatic SMS delivery for milestone text alerts to clients. Provides deliverability tracking, opt-out (STOP keyword) handling, and message logging. Required for any SMS notifications that go beyond Open to Close's native SMS capability or for MSPs wanting centralized SMS billing across multiple real estate clients.

Twilio SendGrid (Essentials Plan)

TwilioEssentials PlanQty: 50,000 emails/month

$19.95/month (suggested resale at $39.95/month)

Transactional email delivery for milestone email notifications. Provides branded HTML email templates, delivery analytics, bounce handling, and compliance features (unsubscribe management). Median delivery speed of 1.9 seconds ensures clients receive updates promptly. Also handles the SPF/DKIM authentication required for reliable inbox delivery.

Follow Up Boss (Grow Plan)

Follow Up BossSaaS per-seatQty: per user

$69/month per user; suggest resale at $89/month per user

Real estate CRM that serves as the authoritative client contact database. Provides the email addresses and phone numbers that milestone notifications are sent to. Webhook-based API integration allows bidirectional sync: pulling contact data into automation workflows, and writing back milestone completion events to the client's CRM timeline for agent visibility. If the brokerage already has a CRM (kvCORE, LionDesk, Wise Agent), use that instead.

$7.20/month per user; suggest resale at $12/month per user

Email sending domain and calendar integration. SPF, DKIM, and DMARC records are configured on the brokerage's Google Workspace domain to authenticate SendGrid as an authorized sender. Google Calendar integration allows milestone events (inspection date, appraisal date, closing date) to be auto-created on agent and client calendars.

Jotform (Bronze Plan)

JotformBronze PlanQty: 25 forms, 1,000 submissions/month

$39/month (suggested resale at $59/month)

Digital consent capture forms for TCPA-compliant SMS opt-in. Deployed on intake iPads and embeddable in listing/buyer agreement packets. Captures client name, phone number, consent checkbox, timestamp, and e-signature — all required for A2P 10DLC compliance. Submissions auto-sync to the CRM and automation platform via Zapier.

Prerequisites

  • Active real estate brokerage with at least 3 agents and a minimum of 5 active transactions per month to justify automation investment
  • Brokerage owns a custom domain (e.g., sunsetrealty.com) with administrative access to DNS records for SPF/DKIM/DMARC configuration
  • Existing or willingness to adopt a Transaction Management System — Open to Close is recommended but Dotloop, SkySlope, or Paperless Pipeline are also supported
  • Existing CRM with client contact data (email + phone) accessible via API or CSV export — Follow Up Boss, kvCORE, LionDesk, or Wise Agent
  • Each agent has a business email on the brokerage domain (not personal Gmail/Yahoo) for consistent branded communication
  • Standard business internet connection (25+ Mbps) at the brokerage office
  • Outbound HTTPS (port 443) traffic allowed through any firewall to SaaS endpoints (opentoclose.com, api.twilio.com, api.sendgrid.com, zapier.com)
  • Client credit card or ACH on file for recurring SaaS subscriptions, or MSP billing arrangement established
  • Brokerage principal broker has approved the transaction milestone list and message templates — this is a business decision, not a technical one
  • Written commitment from brokerage leadership to mandate TMS usage by all agents (automation only works if agents update deal status)
  • State real estate commission licensing requirements reviewed — some states require specific disclosures in automated communications

Installation Steps

Step 1: A2P 10DLC Brand and Campaign Registration

Register the brokerage as an A2P 10DLC brand with The Campaign Registry (TCR) through Twilio. This is mandatory for sending SMS to US phone numbers and is the #1 timeline blocker — approval takes 1–4 weeks. Do this on Day 1 of the engagement before any other work. You will register the brokerage brand (legal name, EIN, address, website) and then create a campaign describing the use case (real estate transaction status updates). Carriers will review and approve the campaign before SMS sending is enabled.

1
Log in to Twilio Console → Messaging → Trust Hub → A2P Registration
2
Register Brand: - Brand Name: [Brokerage Legal Name] - EIN: [Brokerage EIN from W-9] - Business Type: Private Profit - Industry: Real Estate - Business Registration Number: [State broker license number] - Website: [Brokerage website URL]
3
Create A2P Campaign: - Campaign Use Case: Mixed (Notifications + Marketing) - Sub-Use Case: Account Notification - Sample Message 1: 'Great news! Your home inspection for 123 Main St has been completed. Your agent Sarah will share the full report within 24 hours. Reply STOP to opt out.' - Sample Message 2: 'Congratulations! The appraisal for 456 Oak Ave came back at the expected value. We are on track for closing on March 15. Reply STOP to opt out.' - Opt-in Description: Clients provide written consent via digital form at transaction intake - Opt-in Keywords: START, YES - Opt-out Keywords: STOP, CANCEL, UNSUBSCRIBE
4
Purchase a local 10DLC phone number in the brokerage's area code: Twilio Console → Phone Numbers → Buy a Number → Select local area code → Purchase ($2/mo)
Note

A2P 10DLC registration costs approximately $4 for brand registration + $15 for campaign registration (one-time). Approval typically takes 1–3 business days for standard brands but can take up to 4 weeks if additional vetting is required. Do NOT attempt to send SMS before approval — all unregistered traffic is blocked as of December 1, 2024. If the brokerage has multiple offices/brands, each needs its own registration.

Step 2: DNS Configuration for Email Authentication

Configure SPF, DKIM, and DMARC records on the brokerage's domain to authenticate SendGrid as an authorized email sender. This is critical for deliverability — without proper authentication, milestone emails will land in spam folders. Access the domain's DNS management panel (Google Workspace Admin → Domains → DNS, or the domain registrar like GoDaddy/Namecheap).

1
Log in to SendGrid → Settings → Sender Authentication → Domain Authentication
2
Enter the brokerage domain (e.g., sunsetrealty.com) and follow the wizard
3
SendGrid will generate DNS records. Add them to the domain's DNS zone (see records below)
4
Wait 24-48 hours for DNS propagation
5
Return to SendGrid → Verify Domain Authentication
DNS records to add to the domain's DNS zone
dns
# SPF Record (TXT) — add SendGrid to existing SPF record:
# Host: @
# Type: TXT
# Value: v=spf1 include:sendgrid.net include:_spf.google.com ~all

# DKIM Records (CNAME) — SendGrid provides two CNAME records:
# Host: s1._domainkey
# Type: CNAME
# Value: s1.domainkey.u[XXXXXXX].wl[XXX].sendgrid.net

# Host: s2._domainkey
# Type: CNAME
# Value: s2.domainkey.u[XXXXXXX].wl[XXX].sendgrid.net

# DMARC Record (TXT):
# Host: _dmarc
# Type: TXT
# Value: v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@sunsetrealty.com; pct=100
Verification commands
shell
# run from any terminal to confirm DNS records have propagated

nslookup -type=txt sunsetrealty.com
nslookup -type=cname s1._domainkey.sunsetrealty.com
nslookup -type=txt _dmarc.sunsetrealty.com
Note

DNS propagation can take up to 48 hours. Start this on Day 1 alongside A2P registration. If the brokerage uses Google Workspace, be careful not to overwrite the existing SPF record — merge the include:sendgrid.net into the existing v=spf1 line. If using Microsoft 365, the SPF record will reference include:spf.protection.outlook.com instead of _spf.google.com. DMARC policy should start at p=quarantine and move to p=reject after 2 weeks of monitoring.

Step 3: Transaction Management System Setup — Open to Close

Create the brokerage's Open to Close account, configure transaction types (buy-side and list-side), define milestone stages, and set up user accounts for all agents. This is the core of the system — the TMS is where agents will update deal status, which triggers all downstream notifications.

1
Sign up at opentoclose.com → Grow Plan ($99/month)
2
Add brokerage details (name, address, logo, branding colors)
3
Create Transaction Types: Type 1: 'Buyer Transaction' | Type 2: 'Seller Transaction (Listing)' | Type 3: 'Dual Agency' (if applicable per state law)
4
Define Milestone Stages for BUYER TRANSACTION: Stage 1: Pre-Approval Received | Stage 2: Offer Submitted | Stage 3: Offer Accepted / Under Contract | Stage 4: Earnest Money Deposited | Stage 5: Home Inspection Scheduled | Stage 6: Home Inspection Completed | Stage 7: Appraisal Ordered | Stage 8: Appraisal Completed | Stage 9: Loan Approval / Clear to Close | Stage 10: Final Walkthrough Scheduled | Stage 11: Closing Day | Stage 12: Post-Closing / Keys Handed Over
5
Define Milestone Stages for SELLER TRANSACTION: Stage 1: Listing Agreement Signed | Stage 2: Property Listed on MLS | Stage 3: Showing Feedback Available | Stage 4: Offer Received | Stage 5: Offer Accepted / Under Contract | Stage 6: Buyer Inspection Scheduled | Stage 7: Inspection Negotiations Complete | Stage 8: Appraisal Scheduled | Stage 9: Appraisal Completed | Stage 10: Buyer Clear to Close | Stage 11: Closing Day | Stage 12: Post-Closing / Funds Disbursed
6
Create user accounts for each agent: Settings → Team → Add Member → enter agent email → assign role 'Agent'
7
Connect integrations: Settings → Integrations → Connect Google Workspace (or Microsoft 365) | Settings → Integrations → Connect Follow Up Boss (API key)
Note

Discuss the milestone list with the principal broker BEFORE configuration. Different brokerages may want more or fewer milestones. The 12-stage model above is comprehensive; a minimal viable setup can work with 8 stages. Ensure milestone names are client-friendly since they may appear in notification subject lines. If the brokerage already uses Dotloop or SkySlope, skip this step and adapt the milestone definitions within that existing TMS.

Step 4: CRM Integration — Follow Up Boss

Connect Follow Up Boss to Open to Close so that client contact data (name, email, phone) flows automatically into transaction records. This eliminates manual data entry and ensures notifications always go to the correct recipient. Also configure webhooks so milestone completions write back to the CRM timeline.

1
In Follow Up Boss → Admin → API → Generate API Key. Copy the API key securely.
2
In Open to Close → Settings → Integrations → Follow Up Boss. Paste the API key → Authorize → Test Connection.
3
Configure contact sync rules: When a new transaction is created in Open to Close, auto-pull the primary contact from FUB. Map fields: FUB 'Email' → OTC 'Client Email'; FUB 'Phone' → OTC 'Client Phone'. Enable bidirectional sync: milestone updates in OTC create notes in FUB contact timeline.
4
In Follow Up Boss → Admin → Webhooks → Add Webhook. Set Event Type to 'Contact Updated'. Set the webhook URL (this will be created in Step 6 when configuring Zapier).
5
Test by creating a test contact in FUB and verifying it appears in OTC.
Zapier webhook URL to use as the Follow Up Boss webhook endpoint (created in Step 6)
text
https://hooks.zapier.com/hooks/catch/[YOUR_ZAPIER_WEBHOOK_ID]/
Note

If the brokerage uses a different CRM (kvCORE, LionDesk, Wise Agent), the integration method will differ. Check Open to Close's integration directory for native connectors. For CRMs without native integration, Zapier or Make can serve as the bridge. Ensure the CRM contains clean, deduplicated contact data before enabling sync — duplicate contacts will cause duplicate notifications.

Build a TCPA-compliant SMS opt-in form using Jotform that captures client written consent for receiving automated transaction updates via text message. This form will be deployed on intake iPads and can also be sent as a link in the initial transaction welcome email. Consent records must be stored with timestamps for compliance auditing.

1
Log in to Jotform → Create New Form → Start from Scratch
2
Add the following fields: - Full Name (required, text) - Phone Number (required, phone field with US format validation) - Email Address (required, email validation) - Property Address (required, text — the transaction property) - Agent Name (dropdown — list of brokerage agents) - Consent Checkbox (required): Label: 'I consent to receive automated text message updates about my real estate transaction from [Brokerage Name] at the phone number provided above. Message frequency varies (typically 8-15 messages per transaction). Message and data rates may apply. Reply STOP to opt out at any time. Reply HELP for assistance. View our Privacy Policy at [URL].' - E-Signature field (Jotform native widget) - Hidden field: Timestamp (auto-populated)
3
Configure form settings: - Form → Settings → Thank You Page → 'Thank you! You will receive transaction updates at [phone number]. Reply STOP at any time to opt out.' - Form → Settings → Emails → Send confirmation email to client email address
4
Connect Jotform to Zapier: - Jotform → Settings → Integrations → Zapier → Connect - (Zap will be built in Step 6)
5
Configure iPad Kiosk Mode: - On iPad → Settings → Accessibility → Guided Access → Enable - Open Safari → Navigate to Jotform form URL → Triple-click Home → Start Guided Access - This locks the iPad to the consent form only
Note

TCPA requires 'prior express written consent' which must include: (1) the identity of the sender, (2) the type of messages, (3) expected frequency, (4) data rate disclosure, (5) opt-out instructions. The consent checkbox language above covers all requirements. Store all form submissions indefinitely — you may need to produce consent records in the event of a TCPA complaint. Jotform stores submissions in their cloud with timestamps and IP addresses, which is generally sufficient for compliance.

Step 6: Zapier Workflow Automation Build

Build the core automation workflows in Zapier that connect the TMS milestone changes to email and SMS delivery. Create separate Zaps for buyer transactions and seller transactions, with conditional logic for milestone-specific message templates. This is the 'brain' of the system — the orchestration layer that routes the right message to the right client at the right time.

Zap 1: Buyer Transaction Milestone Notifications

1
Trigger: Open to Close → Transaction Stage Changed. Filter: Transaction Type = 'Buyer Transaction'
2
Zapier Filter: Only continue if Stage Name is not empty AND Client Phone is not empty
3
Zapier Lookup Table (built-in): Input: Stage Name
4
Zapier Path A — Send SMS (if SMS = true): Action: Twilio → Send SMS
5
Zapier Path B — Send Email (always): Action: SendGrid → Send Email
6
Zapier Action — Log to Google Sheets

Step 3: Lookup Table — Stage Name to Channel Mapping

Zapier Lookup Table: Stage Name → SMS/Email channel flags
text
'Offer Accepted / Under Contract' → SMS: true, Email: true
'Earnest Money Deposited'         → SMS: false, Email: true
'Home Inspection Scheduled'       → SMS: true, Email: true
'Home Inspection Completed'       → SMS: true, Email: true
'Appraisal Completed'             → SMS: true, Email: true
'Loan Approval / Clear to Close'  → SMS: true, Email: true
'Final Walkthrough Scheduled'     → SMS: true, Email: true
'Closing Day'                     → SMS: true, Email: true
'Post-Closing / Keys Handed Over' → SMS: true, Email: true

Step 4A: Send SMS via Twilio

Twilio → Send SMS configuration
text
From: [Registered 10DLC Number]
To: {{Client Phone}}
Body: (see custom_ai_components for template logic)

Step 4B: Send Email via SendGrid

SendGrid → Send Email configuration
text
From: updates@sunsetrealty.com
From Name: [Agent Name] at [Brokerage Name]
To: {{Client Email}}
Subject: (see custom_ai_components for template logic)
Body: (see custom_ai_components for HTML template)

Step 5: Log to Google Sheets

Google Sheets logging — Transaction Notification Log
text
Spreadsheet: 'Transaction Notification Log'
Row fields: Timestamp, Transaction ID, Client Name, Milestone, Channel (SMS/Email), Status

Zap 2: Seller Transaction Milestone Notifications

Same structure as Zap 1, with seller-specific milestones and templates.

1
Trigger: Jotform → New Submission (SMS Consent Form)
2
Follow Up Boss → Update Contact → Set Custom Field 'SMS Consent' = 'Yes'
3
Open to Close → Update Transaction → Add Note 'SMS consent received [timestamp]'
4
Google Sheets → Add Row to 'SMS Consent Log' spreadsheet

Zap 4: Error Monitoring → MSP Alert

1
Trigger: Zapier → Zap Error (any of the above Zaps)
2
Action: Email → Send email to msp-alerts@yourmsp.com with Zap name, error message, timestamp, and transaction details
Note

Zapier Professional plan allows 750 tasks/month. A typical brokerage with 20 transactions/month × 10 milestones × 2 channels (SMS + email) = 400 tasks/month, well within limits. If the client exceeds this, upgrade to Team plan ($103.50/mo for 2,000 tasks). Each Zap should be tested individually before enabling. Use Zapier's built-in testing to send test messages to the MSP's own phone/email first. Set all Zaps to 'OFF' until full testing is complete in Step 10.

Step 7: SendGrid Email Template Configuration

Create branded HTML email templates in SendGrid for each transaction milestone. Templates use dynamic fields (client name, property address, agent name, milestone details) that are populated by Zapier at send time. Design should be mobile-responsive since 68% of real estate emails are opened on mobile devices.

1
Log in to SendGrid → Email API → Dynamic Templates → Create Template
2
Create the following template groups: Template Group: 'Buyer Milestones' Version 1: 'Offer Accepted' Version 2: 'Inspection Scheduled' Version 3: 'Inspection Completed' Version 4: 'Appraisal Completed' Version 5: 'Clear to Close' Version 6: 'Final Walkthrough' Version 7: 'Closing Day' Version 8: 'Post-Closing Welcome Home' Template Group: 'Seller Milestones' Version 1: 'Listed on MLS' Version 2: 'Offer Received' Version 3: 'Under Contract' Version 4: 'Inspection Scheduled' Version 5: 'Appraisal Completed' Version 6: 'Buyer Clear to Close' Version 7: 'Closing Day' Version 8: 'Post-Closing Funds Disbursed'
3
For each template, use the SendGrid Design Editor: upload brokerage logo (recommended: 200x60px PNG), set brand colors (header background, button color), and use Handlebars dynamic fields: {{client_first_name}}, {{property_address}}, {{agent_name}}, {{agent_phone}}, {{agent_email}}, {{milestone_details}}, {{next_steps}}, {{closing_date}}
4
Add required compliance elements to every template: physical mailing address of brokerage in footer, unsubscribe link: {{unsubscribe}} (SendGrid handles this), and 'You are receiving this because you are a client of [Brokerage Name]'
5
Copy each template's Template ID (e.g., d-abc123def456) — these IDs will be referenced in the Zapier workflows
Note

Keep email templates simple and scannable — clients want quick status updates, not lengthy newsletters. Each email should have: (1) a clear subject line with the milestone name and property address, (2) a one-sentence summary of what just happened, (3) a 2-3 sentence explanation of what happens next, (4) the agent's contact information, (5) a prominent CTA button if action is needed (e.g., 'Schedule Your Walkthrough'). Test rendering in Litmus or Email on Acid across Gmail, Outlook, Apple Mail, and mobile clients.

Step 8: Twilio SMS Configuration and Template Setup

Configure the Twilio messaging service, attach the registered 10DLC phone number, and create message templates for each milestone. SMS messages must be concise (under 160 characters for single-segment delivery when possible) and include opt-out language.

1
In Twilio Console → Messaging → Services → Create Messaging Service. Service Name: '[Brokerage Name] Transaction Updates', Use Case: Notifications, Add Sender: Select the 10DLC number purchased in Step 1, Integration: Use with Zapier (select 'Send messages using the Messaging Service SID'), Compliance: Enable Advanced Opt-Out → STOP, CANCEL, UNSUBSCRIBE auto-handled
2
Note the Messaging Service SID (starts with MG...) — this SID is used in Zapier instead of a phone number for better deliverability
3
Create SMS templates (stored in Zapier lookup table, not in Twilio)
4
Configure Twilio error webhooks: Messaging Service → Integration → Status Callback URL

Buyer Milestone SMS Templates

Buyer milestone SMS templates for Zapier lookup table
text
offer_accepted: '🎉 Congrats {{first_name}}! Your offer on {{address}} has been accepted! {{agent_name}} will be in touch with next steps. Reply STOP to opt out.'
inspection_scheduled: '🔍 Your home inspection for {{address}} is scheduled for {{date}}. {{agent_name}} will share details shortly. Reply STOP to opt out.'
inspection_complete: '✅ Inspection complete for {{address}}! {{agent_name}} will review the report with you soon. Reply STOP to opt out.'
appraisal_complete: '📋 The appraisal for {{address}} is in! {{agent_name}} will walk you through the results. Reply STOP to opt out.'
clear_to_close: '🎯 Great news {{first_name}}! You are clear to close on {{address}}! Closing is set for {{closing_date}}. Reply STOP to opt out.'
closing_day: '🔑 Today is the day! Closing for {{address}} is happening. {{agent_name}} will see you at {{time}}. Reply STOP to opt out.'
post_closing: '🏡 Welcome home, {{first_name}}! {{address}} is officially yours. It has been a pleasure working with you! Reply STOP to opt out.'

Seller Milestone SMS Templates

Seller milestone SMS templates for Zapier lookup table
text
listed_mls: '📣 {{address}} is now live on MLS! {{agent_name}} will keep you updated on showing activity. Reply STOP to opt out.'
offer_received: '📩 You have received an offer on {{address}}! {{agent_name}} will call you to review the details. Reply STOP to opt out.'
under_contract: '🤝 {{address}} is under contract! {{agent_name}} will guide you through the next steps. Reply STOP to opt out.'
buyer_clear_close: '✅ The buyer is clear to close on {{address}}! We are on track for {{closing_date}}. Reply STOP to opt out.'
closing_day_seller: '🎉 Closing day for {{address}}! {{agent_name}} will confirm once funds are disbursed. Reply STOP to opt out.'
funds_disbursed: '💰 Funds from the sale of {{address}} have been disbursed! Check with your title company for wire details. Reply STOP to opt out.'

Twilio Error Webhook URL

Status Callback URL for Twilio Messaging Service → Integration
text
https://hooks.zapier.com/hooks/catch/[YOUR_WEBHOOK_ID]/sms-status/
Note

SMS messages over 160 characters are split into multiple segments and billed accordingly. Keep messages under 160 chars including the STOP opt-out language (about 30 chars). Emojis count as multiple characters in GSM encoding — if you use them, messages will use UCS-2 encoding (70 chars per segment). Consider removing emojis if cost is a concern. The STOP auto-responder is handled by Twilio's Advanced Opt-Out management — no custom handling needed. Test all messages on both iOS and Android devices before going live.

Create structured Google Sheets spreadsheets to log all sent notifications and store SMS consent records. These serve as the compliance audit trail and also provide the data source for the MSP's monthly reporting dashboard to the client.

Step 1: Create Google Sheet 'Transaction Notification Log'

  • Sheet 1: 'Notifications' — Columns: Timestamp | Transaction ID | Property Address | Client Name | Client Email | Client Phone | Milestone | Channel (SMS/Email) | Status (Sent/Failed) | Message Preview | Agent Name
  • Sheet 2: 'Monthly Summary' (formula-driven) — Row per month: Total Notifications Sent | SMS Count | Email Count | Failure Count | Unique Transactions | Unique Clients
Monthly Summary formula: count notifications sent in the current month
excel
=COUNTIFS(Notifications!A:A,">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1),Notifications!A:A,"<"&DATE(YEAR(TODAY()),MONTH(TODAY())+1,1))

Columns: Timestamp | Client Name | Phone Number | Email | Property Address | Agent Name | Consent Text | IP Address | Form Submission ID. This sheet is populated by Zap 3 (SMS Consent Intake).

Step 3: Set Sharing Permissions

  • MSP service account: Editor
  • Brokerage admin: Viewer
  • Individual agents: No access (privacy)

Step 4: Enable Google Sheets API for Zapier

1
Navigate to Google Cloud Console → APIs & Services → Enable Google Sheets API
2
Zapier handles OAuth automatically during Zap setup

Step 5: Create a Google Data Studio (Looker Studio) Dashboard

1
Connect to 'Transaction Notification Log' sheet
2
Add widgets: Notifications per month (bar chart), Channel breakdown (pie), Failure rate (scorecard)
3
Share dashboard link with brokerage admin
Note

Google Sheets is chosen for simplicity and because most real estate brokerages already use Google Workspace. For higher volume brokerages (100+ transactions/month), consider migrating to Airtable ($20/month) for better performance and built-in views/dashboards. Notification logs should be retained for a minimum of 3 years (California) or up to 7 years (conservative) per state record retention requirements. SMS consent records should be retained indefinitely or until the client relationship ends plus the applicable statute of limitations.

Step 10: End-to-End Testing with Test Transaction

Create a test transaction in Open to Close and walk it through every milestone stage to verify that the correct email and SMS notifications are sent at each step. Test both buyer and seller transaction types. Verify message content, formatting, deliverability, and opt-out handling.

1
Create test contacts — In Follow Up Boss, create: 'Test Buyer' with MSP technician's email and phone; 'Test Seller' with MSP technician's email and phone
2
Create test transactions in Open to Close — Transaction 1: 'Test Buyer Transaction - 123 Test St' (Client: Test Buyer, Agent: [Select a real agent for realistic testing]); Transaction 2: 'Test Seller Transaction - 456 Test Ave' (Client: Test Seller, Agent: [Select a real agent])
3
Walk through each milestone sequentially — For each milestone: (a) Change transaction stage in Open to Close, (b) Wait 1–5 minutes for Zapier to trigger, (c) Verify email received (check subject, body, formatting, links), (d) Verify SMS received (check content, sender number), (e) Verify Google Sheets log entry created, (f) Verify CRM timeline updated in Follow Up Boss, (g) Document any issues in testing checklist
4
Test opt-out handling — Reply STOP to the SMS number → Verify Twilio auto-responds → Verify no further SMS sent for next milestone; Reply START to re-subscribe → Verify SMS resumes
5
Test email unsubscribe — Click unsubscribe link in milestone email → Verify SendGrid suppression list updated
6
Test error handling — Temporarily disconnect Twilio from Zapier → Trigger a milestone → Verify MSP alert email received (Zap 4)
7
Delete test transactions and contacts after testing
Note

Testing should be performed on real devices (not just the Zapier test panel). Have one technician update milestones while another monitors their phone and email. Test on both iOS (iMessage) and Android devices since SMS rendering differs. Verify that emails display correctly in Gmail web, Gmail mobile, Outlook desktop, and Apple Mail. If any Zap fails during testing, check the Zapier Task History for detailed error logs. Common issues: (1) SendGrid domain not verified yet, (2) A2P campaign not approved yet, (3) Zapier field mapping errors, (4) CRM contact missing phone number.

Step 11: Agent Training and Go-Live Preparation

Conduct a 60-90 minute training session with all brokerage agents covering: how the automation works, what clients will receive, how to update transaction status in Open to Close, how to handle client questions about automated messages, and how to capture SMS consent. Prepare a one-page quick reference card for each agent.

Training Agenda (90 minutes)

1
Overview (10 min): What the system does, why it matters for client experience
2
Demo (20 min): Walk through a transaction showing each milestone notification
3
Open to Close training (30 min): How to create transactions, update stages, add contacts
4
SMS Consent (10 min): How to use the iPad consent form or send consent link
5
FAQ handling (10 min): What to tell clients who ask about automated messages
6
Q&A (10 min)

Prepare the Following Materials

  • One-page laminated quick reference card (milestone list + how to update in OTC)
  • 5-minute screen recording walkthrough (store in shared Google Drive)
  • FAQ document for agents covering common client questions
  • Escalation contact: MSP helpdesk number/email for technical issues

Go-Live Checklist

Note

The single biggest risk to this project is agent adoption. If agents do not consistently update transaction status in Open to Close, no notifications will fire. The training must emphasize that the system is only as good as the data agents enter. Consider implementing a weekly 'compliance check' where the brokerage admin reviews active transactions for current stage accuracy. Recommend a 2-week soft launch with 5 transactions before full rollout to catch any issues in production.

Step 12: Production Rollout and Monitoring Setup

Enable all automation workflows for production use, configure ongoing monitoring dashboards, set up MSP alerting for failures, and establish the recurring maintenance cadence. Transition from project mode to managed service mode.

1
Enable all Zaps for production: Zapier → Each Zap → Toggle ON
2
Configure Zapier monitoring: Zapier → Settings → Notifications → Enable email alerts for task failures. Alert recipient: msp-alerts@yourmsp.com
3
Set up weekly automated report: In Zapier, create a scheduled Zap with Trigger: Schedule → Every Monday at 8:00 AM. Action: Google Sheets → Get rows from 'Transaction Notification Log' for past 7 days. Action: Email → Send summary to brokerage admin and MSP account manager. Subject: 'Weekly Transaction Update Report - [Brokerage Name]'. Body: Total notifications sent, breakdown by milestone, any failures.
4
SendGrid monitoring: SendGrid → Settings → Mail Settings → Event Notification → Enable. Track: Delivered, Opened, Clicked, Bounced, Spam Reports.
5
Twilio monitoring: Twilio Console → Messaging → Logs → Verify delivery rates. Set up Twilio Error Webhook → Alert MSP on delivery failures.
6
Create MSP runbook entry: Document all account credentials (in MSP password vault), Zap IDs, template IDs, escalation procedures, client contact for brokerage admin.
SendGrid Event Notification webhook URL (Step 4)
text
https://hooks.zapier.com/hooks/catch/[YOUR_WEBHOOK_ID]/sendgrid-events/
Note

Target SLA for this managed service: 99.5% notification delivery rate, 15-minute response to system-down alerts during business hours, 4-hour response for non-critical issues. Review Zapier task usage monthly to ensure the plan tier is adequate. SendGrid reputation monitoring is critical — if the brokerage domain's sender reputation drops below 90, investigate immediately for bounce issues or spam complaints. Schedule quarterly business reviews with the brokerage to review notification analytics, gather feedback on message content, and upsell additional automations.

Custom AI Components

Milestone Message Router

Type: workflow Core Zapier workflow that routes transaction milestone events from Open to Close to the appropriate email template (SendGrid) and SMS template (Twilio) based on the transaction type (buyer/seller), milestone stage, and client communication preferences. This is the central orchestration logic of the entire system. It handles conditional branching, template selection, dynamic field population, and multi-channel dispatch.

Implementation

Trigger

  • App: Open to Close
  • Trigger Event: Transaction Stage Changed
  • Account: [Brokerage's OTC account]
  • Output fields used: transaction_type (Buyer Transaction | Seller Transaction), stage_name (e.g., 'Offer Accepted / Under Contract'), client_first_name, client_last_name, client_email, client_phone, property_address, agent_name, agent_phone, agent_email, closing_date, transaction_id

Step 2: Filter

Only continue if stage_name (Text) is not empty AND client_email (Text) is not empty. Purpose: Prevents firing on incomplete transactions.

Step 3: Zapier Paths (Conditional Branching)

  • Path A: transaction_type = 'Buyer Transaction'
  • Path B: transaction_type = 'Seller Transaction'

Path A: Buyer Transaction

Step A1: Lookup Table — Buyer Milestone → Template Mapping

Key: stage_name

  • Offer Accepted / Under Contract → sendgrid: d-buyer-offer-acc | sms_key: buyer_offer_accepted | sms_on: yes
  • Earnest Money Deposited → sendgrid: d-buyer-earnest | sms_key: (none) | sms_on: no
  • Home Inspection Scheduled → sendgrid: d-buyer-insp-sch | sms_key: buyer_insp_scheduled | sms_on: yes
  • Home Inspection Completed → sendgrid: d-buyer-insp-done | sms_key: buyer_insp_complete | sms_on: yes
  • Appraisal Completed → sendgrid: d-buyer-appr-done | sms_key: buyer_appraisal_done | sms_on: yes
  • Loan Approval / Clear to Close → sendgrid: d-buyer-ctc | sms_key: buyer_clear_to_close | sms_on: yes
  • Final Walkthrough Scheduled → sendgrid: d-buyer-walkthru | sms_key: buyer_walkthrough | sms_on: yes
  • Closing Day → sendgrid: d-buyer-closing | sms_key: buyer_closing_day | sms_on: yes
  • Post-Closing / Keys Handed Over → sendgrid: d-buyer-welcome | sms_key: buyer_post_closing | sms_on: yes

Step A2: Zapier Formatter — SMS Body Builder

  • Transform: Text → Replace
  • Input: SMS template string (from lookup)
  • Replacements: {{first_name}} → client_first_name, {{address}} → property_address, {{agent_name}} → agent_name, {{closing_date}} → closing_date, {{date}} → (next step date if available, else '')
Buyer SMS template strings with merge field placeholders
python
BUYER_SMS_TEMPLATES = {
    'buyer_offer_accepted': '🎉 Congrats {{first_name}}! Your offer on {{address}} has been accepted! {{agent_name}} will be in touch with next steps. Reply STOP to opt out.',
    'buyer_insp_scheduled': '🔍 Inspection for {{address}} is scheduled. {{agent_name}} will share details soon. Reply STOP to opt out.',
    'buyer_insp_complete': '✅ Inspection complete for {{address}}! {{agent_name}} will review the report with you. Reply STOP to opt out.',
    'buyer_appraisal_done': '📋 Appraisal for {{address}} is in! {{agent_name}} will walk you through results. Reply STOP to opt out.',
    'buyer_clear_to_close': '🎯 Great news! You are clear to close on {{address}}. Closing set for {{closing_date}}. Reply STOP to opt out.',
    'buyer_walkthrough': '🏠 Final walkthrough for {{address}} is coming up. {{agent_name}} will confirm timing. Reply STOP to opt out.',
    'buyer_closing_day': '🔑 Today is closing day for {{address}}! {{agent_name}} will see you there. Reply STOP to opt out.',
    'buyer_post_closing': '🏡 Welcome home, {{first_name}}! {{address}} is officially yours. Congrats! Reply STOP to opt out.'
}

Step A3: Path Split — SMS Enabled?

  • If sms_on = 'yes' AND client_phone is not empty → Step A4 (Send SMS)
  • Else → Skip to Step A5 (Send Email)

Step A4: Twilio — Send SMS

  • App: Twilio
  • Action: Send SMS Message
  • Messaging Service SID: MG[your_service_sid]
  • To: {{client_phone}}
  • Body: {{formatted_sms_body}} (from Step A2)

Step A5: SendGrid — Send Email

  • App: Twilio SendGrid
  • Action: Send Email with Dynamic Template
  • From Email: updates@[brokerage-domain].com
  • From Name: {{agent_name}} at [Brokerage Name]
  • To: {{client_email}}
  • Template ID: {{sendgrid_template}} (from lookup table)
SendGrid Dynamic Template Data payload
json
{
  "client_first_name": "{{client_first_name}}",
  "property_address": "{{property_address}}",
  "agent_name": "{{agent_name}}",
  "agent_phone": "{{agent_phone}}",
  "agent_email": "{{agent_email}}",
  "closing_date": "{{closing_date}}",
  "current_year": "2025"
}

Step A6: Google Sheets — Log Notification

  • App: Google Sheets
  • Action: Create Spreadsheet Row
  • Spreadsheet: 'Transaction Notification Log'
  • Timestamp: {{zap_meta_human_now}}
  • Transaction ID: {{transaction_id}}
  • Property Address: {{property_address}}
  • Client Name: {{client_first_name}} {{client_last_name}}
  • Milestone: {{stage_name}}
  • Channel: SMS+Email (or Email Only if sms_on = no)
  • Status: Sent
  • Agent: {{agent_name}}

Path B: Seller Transaction

Identical structure to Path A with seller-specific templates.

Seller Lookup Table

  • Listing Agreement Signed → sendgrid: d-seller-listed | sms_key: (none) | sms_on: no
  • Property Listed on MLS → sendgrid: d-seller-mls-live | sms_key: seller_listed_mls | sms_on: yes
  • Offer Received → sendgrid: d-seller-offer-rcv | sms_key: seller_offer_received | sms_on: yes
  • Offer Accepted / Under Contract → sendgrid: d-seller-contract | sms_key: seller_under_contract | sms_on: yes
  • Inspection Negotiations Complete → sendgrid: d-seller-insp-neg | sms_key: seller_insp_negotiated | sms_on: yes
  • Appraisal Completed → sendgrid: d-seller-appr-done | sms_key: seller_appraisal_done | sms_on: yes
  • Buyer Clear to Close → sendgrid: d-seller-buyer-ctc | sms_key: seller_buyer_ctc | sms_on: yes
  • Closing Day → sendgrid: d-seller-closing | sms_key: seller_closing_day | sms_on: yes
  • Post-Closing / Funds Disbursed → sendgrid: d-seller-funds | sms_key: seller_funds_disbursed | sms_on: yes
Seller SMS template strings with merge field placeholders
python
SELLER_SMS_TEMPLATES = {
    'seller_listed_mls': '📣 {{address}} is now live on MLS! {{agent_name}} will keep you updated. Reply STOP to opt out.',
    'seller_offer_received': '📩 Offer received on {{address}}! {{agent_name}} will call to review details. Reply STOP to opt out.',
    'seller_under_contract': '🤝 {{address}} is under contract! {{agent_name}} will guide next steps. Reply STOP to opt out.',
    'seller_insp_negotiated': '✅ Inspection negotiations complete for {{address}}. Moving forward! Reply STOP to opt out.',
    'seller_appraisal_done': '📋 Appraisal for {{address}} is complete. {{agent_name}} has details. Reply STOP to opt out.',
    'seller_buyer_ctc': '✅ Buyer is clear to close on {{address}}! On track for {{closing_date}}. Reply STOP to opt out.',
    'seller_closing_day': '🎉 Closing day for {{address}}! {{agent_name}} will confirm fund disbursement. Reply STOP to opt out.',
    'seller_funds_disbursed': '💰 Funds from {{address}} sale have been disbursed. Check with title co for wire details. Reply STOP to opt out.'
}

SendGrid Milestone Email HTML Template

Type: prompt Master HTML email template used across all milestone notifications. Uses SendGrid's Handlebars templating syntax for dynamic content injection. Mobile-responsive design with brokerage branding. Each milestone variation is created by changing the subject line and body content sections while keeping the layout consistent.

Implementation:

SendGrid Handlebars HTML email template for milestone notifications
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Transaction Update</title>
<style>
  body { margin: 0; padding: 0; background-color: #f4f4f7; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; }
  .container { max-width: 600px; margin: 0 auto; background-color: #ffffff; }
  .header { background-color: #1a365d; padding: 24px; text-align: center; }
  .header img { max-height: 50px; }
  .header h2 { color: #ffffff; margin: 12px 0 0 0; font-size: 18px; font-weight: 400; }
  .milestone-badge { background-color: #e6f3ff; border-left: 4px solid #2b6cb0; padding: 16px 20px; margin: 24px; border-radius: 0 8px 8px 0; }
  .milestone-badge h3 { color: #2b6cb0; margin: 0 0 4px 0; font-size: 16px; text-transform: uppercase; letter-spacing: 0.5px; }
  .milestone-badge p { color: #4a5568; margin: 0; font-size: 14px; }
  .body-content { padding: 0 24px 24px 24px; color: #4a5568; line-height: 1.6; font-size: 15px; }
  .body-content h1 { color: #1a365d; font-size: 22px; margin-bottom: 8px; }
  .next-steps { background-color: #f7fafc; border-radius: 8px; padding: 16px 20px; margin: 16px 0; }
  .next-steps h4 { color: #1a365d; margin: 0 0 8px 0; font-size: 14px; text-transform: uppercase; }
  .next-steps p { margin: 0; font-size: 14px; }
  .cta-button { display: inline-block; background-color: #2b6cb0; color: #ffffff !important; text-decoration: none; padding: 12px 32px; border-radius: 6px; font-weight: 600; font-size: 15px; margin: 16px 0; }
  .agent-card { border-top: 1px solid #e2e8f0; padding: 20px 24px; display: flex; align-items: center; }
  .agent-info { margin-left: 16px; }
  .agent-info h4 { margin: 0; color: #1a365d; font-size: 15px; }
  .agent-info p { margin: 2px 0; color: #718096; font-size: 13px; }
  .footer { background-color: #f7fafc; padding: 20px 24px; text-align: center; font-size: 11px; color: #a0aec0; }
  .footer a { color: #718096; }
  @media only screen and (max-width: 480px) {
    .container { width: 100% !important; }
    .body-content { padding: 0 16px 16px 16px; }
    .body-content h1 { font-size: 20px; }
  }
</style>
</head>
<body>
<center>
<table role="presentation" width="100%" style="background-color:#f4f4f7;padding:24px 0;">
<tr><td align="center">
<table role="presentation" class="container" width="600" cellpadding="0" cellspacing="0">
  <!-- HEADER -->
  <tr><td class="header">
    <!-- Replace src with brokerage logo URL -->
    <img src="{{brokerage_logo_url}}" alt="{{brokerage_name}}" />
    <h2>Transaction Update</h2>
  </td></tr>
  <!-- MILESTONE BADGE -->
  <tr><td>
    <div class="milestone-badge">
      <h3>{{milestone_label}}</h3>
      <p>{{property_address}}</p>
    </div>
  </td></tr>
  <!-- BODY -->
  <tr><td class="body-content">
    <h1>{{email_headline}}</h1>
    <p>Hi {{client_first_name}},</p>
    <p>{{email_body_paragraph}}</p>
    <div class="next-steps">
      <h4>What Happens Next</h4>
      <p>{{next_steps_text}}</p>
    </div>
    {{#if cta_url}}
    <center>
      <a href="{{cta_url}}" class="cta-button">{{cta_text}}</a>
    </center>
    {{/if}}
  </td></tr>
  <!-- AGENT CARD -->
  <tr><td class="agent-card">
    <div class="agent-info">
      <h4>{{agent_name}}</h4>
      <p>Your Real Estate Agent</p>
      <p>📞 {{agent_phone}} | ✉️ {{agent_email}}</p>
    </div>
  </td></tr>
  <!-- FOOTER -->
  <tr><td class="footer">
    <p>{{brokerage_name}} | {{brokerage_address}}</p>
    <p>You are receiving this email because you are a client involved in a real estate transaction with us.</p>
    <p><a href="{{unsubscribe}}">Unsubscribe</a> from transaction updates</p>
    <p>&copy; {{current_year}} {{brokerage_name}}. All rights reserved.</p>
  </td></tr>
</table>
</td></tr>
</table>
</center>
</body>
</html>
Example dynamic data payload for the 'Offer Accepted' milestone
json
{
  "brokerage_logo_url": "https://sunsetrealty.com/logo.png",
  "brokerage_name": "Sunset Realty Group",
  "brokerage_address": "123 Main Street, Suite 200, Anytown, CA 90210",
  "milestone_label": "OFFER ACCEPTED",
  "property_address": "456 Oak Avenue, Anytown, CA 90210",
  "email_headline": "Your Offer Has Been Accepted! 🎉",
  "client_first_name": "Sarah",
  "email_body_paragraph": "Great news — the seller has accepted your offer on 456 Oak Avenue! This is a huge milestone, and we are thrilled for you. Your agent Sarah Johnson will be reaching out shortly to walk you through the next steps in the process, including scheduling the home inspection and finalizing your earnest money deposit.",
  "next_steps_text": "Within the next 1-2 business days, we will schedule your home inspection and confirm your earnest money deposit instructions with the title company. Your agent will send you all the details.",
  "cta_url": "",
  "cta_text": "",
  "agent_name": "Sarah Johnson",
  "agent_phone": "(555) 123-4567",
  "agent_email": "sarah@sunsetrealty.com",
  "current_year": "2025"
}

Type: workflow Zapier workflow that processes new SMS consent form submissions from Jotform, syncs consent status to Follow Up Boss CRM, adds a note to the Open to Close transaction, and logs the consent record to Google Sheets for compliance auditing. This ensures that SMS notifications are only sent to clients who have provided TCPA-compliant written consent.

Implementation

Trigger: Jotform — New Submission

  • App: Jotform
  • Trigger Event: New Submission
  • Form: 'SMS Consent for Transaction Updates'

Output fields:

  • client_name
  • client_phone
  • client_email
  • property_address
  • agent_name
  • consent_checkbox (value: 'I consent to receive automated text message updates...')
  • e_signature (base64 image)
  • submission_timestamp
  • submission_ip
  • submission_id

Step 2: Zapier Filter

Only continue if: consent_checkbox (Text) is not empty AND client_phone (Text) is not empty. Purpose: Ensures only completed consent forms trigger downstream actions.

Step 3: Zapier Formatter — Phone Number Standardization

  • Transform: Numbers → Format Phone Number
  • Input: {{client_phone}}
  • To Format: +1XXXXXXXXXX (E.164)
  • Purpose: Twilio requires E.164 format; ensures consistency across systems

Step 4: Follow Up Boss — Update Contact

  • App: Follow Up Boss
  • Action: Update or Create Contact
  • Match by: Phone Number = {{formatted_phone}}
  • Update fields — Custom Field 'SMS Consent': 'Yes'
  • Update fields — Custom Field 'SMS Consent Date': {{submission_timestamp}}
  • Update fields — Tags: Add tag 'sms-opted-in'
  • If no match found, create new contact with: Name: {{client_name}}, Phone: {{formatted_phone}}, Email: {{client_email}}, Tags: 'sms-opted-in'
Note

The 'SMS Consent' custom field must be created in FUB Admin → Custom Fields beforehand.

Step 5: Open to Close — Add Transaction Note

  • App: Open to Close
  • Action: Create Note on Transaction
  • Transaction: Search by Property Address = {{property_address}}
  • Note body: 'SMS consent received from {{client_name}} ({{formatted_phone}}) on {{submission_timestamp}}. Submission ID: {{submission_id}}. Automated text updates are now enabled for this client.'
Warning

Fallback: If no matching transaction is found, the note step will error — Zap 4 (error monitor) will alert MSP.

  • App: Google Sheets
  • Action: Create Spreadsheet Row
  • Spreadsheet: 'SMS Consent Records'
  • Sheet: 'Consent Log'
  • Column A (Timestamp): {{submission_timestamp}}
  • Column B (Client Name): {{client_name}}
  • Column C (Phone): {{formatted_phone}}
  • Column D (Email): {{client_email}}
  • Column E (Property): {{property_address}}
  • Column F (Agent): {{agent_name}}
  • Column G (Consent Text): {{consent_checkbox}}
  • Column H (IP Address): {{submission_ip}}
  • Column I (Submission ID): {{submission_id}}
  • Column J (E-Signature): 'On file in Jotform submission {{submission_id}}'

Compliance Notes

Critical

Never delete rows from the consent log. Consent records must be retained for a minimum of 4 years (TCPA statute of limitations).

  • Jotform retains the original submission with e-signature indefinitely.
  • If a client revokes consent (texts STOP), Twilio handles opt-out automatically.
  • To manually revoke consent: update FUB custom field to 'Revoked' and add a Google Sheets row noting the revocation.

Weekly Performance Report Generator

Type: workflow Scheduled Zapier workflow that runs every Monday morning, aggregates the past week's notification data from the Google Sheets log, and sends a formatted summary email to the brokerage admin and the MSP account manager. Provides visibility into system health, notification volumes, and agent adoption metrics.

Implementation

Trigger

  • App: Schedule by Zapier
  • Trigger Event: Every Week
  • Day: Monday
  • Time: 8:00 AM (client's local timezone)

Step 2: Google Sheets — Get All Rows (Last 7 Days)

  • App: Google Sheets
  • Action: Lookup Spreadsheet Rows
  • Spreadsheet: 'Transaction Notification Log'
  • Sheet: 'Notifications'
  • Lookup Column: A (Timestamp)
  • Lookup Value: Use Zapier Formatter in a preceding step to calculate 7-days-ago date — Formatter → Date → Subtract 7 days from {{zap_meta_human_now}} → Format as YYYY-MM-DD
Note

Zapier's native Google Sheets search has limitations on date filtering. RECOMMENDED APPROACH: Use a helper row in Google Sheets that calculates weekly stats.

Alternative Step 2: Google Sheets — Read Named Range

Add a 'Weekly Summary' tab in the Google Sheet with the following formulas:

Google Sheets formulas for the Weekly Summary tab
spreadsheet
Cell B1 (label: 'Week Starting'):         =TODAY()-WEEKDAY(TODAY(),2)+1-7
Cell B2 (label: 'Total Notifications'):   =COUNTIFS(Notifications!A:A,">="&B1,Notifications!A:A,"<"&B1+7)
Cell B3 (label: 'SMS Sent'):              =COUNTIFS(Notifications!A:A,">="&B1,Notifications!A:A,"<"&B1+7,Notifications!H:H,"*SMS*")
Cell B4 (label: 'Emails Sent'):           =COUNTIFS(Notifications!A:A,">="&B1,Notifications!A:A,"<"&B1+7,Notifications!H:H,"*Email*")
Cell B5 (label: 'Failures'):              =COUNTIFS(Notifications!A:A,">="&B1,Notifications!A:A,"<"&B1+7,Notifications!I:I,"Failed")
Cell B6 (label: 'Unique Transactions'):   =SUMPRODUCT((Notifications!A:A>=$B$1)*(Notifications!A:A<$B$1+7)/COUNTIFS(Notifications!B:B,Notifications!B:B,Notifications!A:A,">="&$B$1,Notifications!A:A,"<"&$B$1+7))
Cell B7 (label: 'Active Agents'):         Use UNIQUE + COUNTIF combination
  • App: Google Sheets → Get Cell Contents
  • Cells: B1, B2, B3, B4, B5, B6, B7

Step 3: Zapier Formatter — Build Report Body

  • Transform: Text → Create
  • Template: (see below)
Zapier Formatter template for the weekly report body
text
Weekly Transaction Update Report
================================
Week of: {{B1}}

Notification Summary:
  • Total notifications sent: {{B2}}
  • SMS messages: {{B3}}
  • Email messages: {{B4}}
  • Failures: {{B5}}
  • Delivery success rate: {{calculated: (B2-B5)/B2 * 100}}%

Transaction Activity:
  • Active transactions with updates: {{B6}}

System Health: {{if B5 = 0: '✅ All systems healthy' else: '⚠️ {{B5}} failures detected — review Zapier task history'}}

Action Items:
  {{if B5 > 0: '• Review failed notifications in Zapier task history and resend manually if needed'}}
  {{if B2 = 0: '• No notifications sent this week — verify agents are updating transaction stages in Open to Close'}}
  • Review any new transactions missing SMS consent

---
This is an automated report from your Transaction Update Automation system.
Managed by [MSP Name] | Support: [msp-support-email] | [msp-phone]

Step 4: Gmail/SendGrid — Send Report Email

  • App: Gmail (or SendGrid)
  • Action: Send Email
  • To: brokerage-admin@sunsetrealty.com, account-manager@yourmsp.com
  • Subject: '📊 Weekly Transaction Update Report — {{B1}} — [Brokerage Name]'
  • Body: {{formatted_report_body}} (from Step 3)
  • Attachments: None (or optionally attach a Google Sheets export)

Step 5 (Optional): Slack — Post to MSP Channel

If your MSP uses Slack for internal notifications:

  • App: Slack
  • Action: Send Channel Message
  • Channel: #client-[brokerage-name]
  • Message: 'Weekly report for [Brokerage Name]: {{B2}} notifications ({{B5}} failures). Success rate: {{rate}}%'

Post-Closing Review Request Trigger

Type: workflow Optional upsell workflow that fires 3-7 days after the Post-Closing milestone. Sends the client a personalized email and SMS asking them to leave a Google Business or Zillow review for their agent. This is a high-value add-on that directly impacts brokerage revenue through improved online reputation. Included here because it uses the same infrastructure (Zapier, Twilio, SendGrid) with minimal additional configuration.

Implementation

Note

This is an OPTIONAL UPSELL workflow. Offer as a Phase 2 add-on. Estimated additional MSP revenue: $500 one-time setup + $50/mo management

Trigger Options

Step: Send Review Request Email

1
App: Twilio SendGrid
2
Action: Send Email with Dynamic Template
3
Template ID: d-review-request
4
Populate the dynamic data payload below
SendGrid Dynamic Template Data — Review Request Email
json
{
  "client_first_name": "{{client_first_name}}",
  "agent_name": "{{agent_name}}",
  "property_address": "{{property_address}}",
  "google_review_url": "https://g.page/r/[BROKERAGE_GOOGLE_PLACE_ID]/review",
  "zillow_review_url": "https://www.zillow.com/profile/[AGENT_ZILLOW_SCREENNAME]/#reviews",
  "email_headline": "How Was Your Experience?",
  "email_body_paragraph": "Congratulations again on your new home at {{property_address}}! We hope you are settling in well. If you had a great experience working with {{agent_name}}, we would be incredibly grateful if you could take 2 minutes to share your feedback. Your review helps other families find the right agent and means the world to our team.",
  "cta_url": "https://g.page/r/[BROKERAGE_GOOGLE_PLACE_ID]/review",
  "cta_text": "Leave a Google Review ⭐"
}

Step: Send Review Request SMS

1
App: Twilio
2
Action: Send SMS
3
Messaging Service SID: MG[your_service_sid]
4
To: {{client_phone}}
5
Populate the SMS body below
Twilio SMS Body — Review Request
text
Hi {{first_name}}! Congrats again on {{address}}! 🏡 If {{agent_name}} did a great job, we would love a quick Google review: [short_url]. It means a lot! Reply STOP to opt out.

Notes

  • Use a URL shortener (Bitly or Rebrandly) for the Google review link in SMS
  • Track review conversion rate: compare review requests sent vs. new reviews received
  • Some brokerages may prefer to send the review request from the agent's personal email rather than the automated system — discuss during discovery
  • Zillow reviews must be left by verified clients; Google reviews are open to anyone
  • Do NOT send review requests for transactions that had disputes or unhappy clients — add a manual 'Skip Review Request' flag in Open to Close for agents to set

Testing & Validation

  • Create a test buyer transaction in Open to Close with MSP technician's contact info. Advance to 'Offer Accepted' stage. Verify that within 5 minutes: (1) SMS arrives on technician's phone with correct property address, client name, and agent name, (2) email arrives in technician's inbox (not spam) with branded template and correct dynamic fields, (3) a new row appears in the Google Sheets notification log with correct data, (4) a timeline note appears in the Follow Up Boss contact record.
  • Create a test seller transaction in Open to Close. Advance through all 9 seller milestones sequentially (waiting 2 minutes between each). Verify each milestone triggers the correct unique SMS and email template — not the buyer version. Confirm no duplicate messages are sent for any single milestone change.
  • Test SMS opt-out compliance: Reply STOP to the brokerage's Twilio 10DLC number from the test phone. Verify Twilio's auto-responder confirms opt-out. Then advance the test transaction to the next milestone. Verify that email notification still sends but SMS does NOT send. Then reply START and verify SMS resumes on the subsequent milestone.
  • Test email deliverability: Send test milestone emails to accounts on Gmail, Outlook/Hotmail, Yahoo, and Apple iCloud. Verify all land in the primary inbox (not Promotions or Spam tabs). Check email headers to confirm SPF=pass, DKIM=pass, DMARC=pass using a service like mail-tester.com (score should be 9/10 or higher).
  • Test the SMS consent form on the iPad in Guided Access (kiosk) mode. Submit a test consent form. Verify: (1) Jotform records the submission with timestamp and IP, (2) Follow Up Boss contact is updated with 'SMS Consent = Yes' custom field and 'sms-opted-in' tag, (3) Google Sheets consent log receives a new row with all required fields, (4) Open to Close transaction receives a note confirming consent.
  • Test error handling: Temporarily delete the Twilio API credentials from Zapier's Twilio connection. Trigger a milestone change. Verify that: (1) the SMS step fails, (2) the email step still sends successfully (paths should be independent), (3) Zap 4 (error monitor) sends an alert email to the MSP inbox within 5 minutes, (4) the notification log records the failure.
  • Test the weekly performance report: Manually trigger the report Zap or wait for the next scheduled Monday run. Verify the report email arrives with accurate notification counts matching the Google Sheets data. Verify the calculation of success rate and that failure count matches any test failures introduced.
  • Perform a volume test: Create 5 test transactions and advance each through 3 milestones within a 10-minute period (simulating a busy brokerage day). Verify all 15 milestone events trigger correctly without delays, duplicates, or dropped notifications. Check Zapier task history for any throttling or queue delays.
  • Verify mobile rendering: Open milestone emails on iPhone (iOS Mail and Gmail app) and Android (Gmail app and Samsung Email). Confirm the HTML template renders correctly, logo displays, CTA buttons are tappable, and text is readable without horizontal scrolling.
  • Test the full lifecycle: Create a buyer transaction, submit the SMS consent form, advance through all 12 milestones from 'Pre-Approval Received' to 'Post-Closing / Keys Handed Over', verify all 12 email notifications and 9 SMS notifications (3 milestones are email-only) arrive correctly, then verify the post-closing review request arrives 5 days after the final milestone (if the upsell workflow is enabled).

Client Handoff

The client handoff session should be a 90-minute meeting with the principal broker, office manager, and 2-3 lead agents. Cover the following topics:

1
System Overview (15 min): Walk through the architecture — how Open to Close milestone changes trigger automated emails and texts. Show the notification flow diagram. Emphasize that the system is only as reliable as agents updating deal status.
2
Live Demo (20 min): Create a real test transaction and walk it through 3-4 milestones while the brokerage team watches notifications arrive on their phones and email in real time.
3
Agent Training (20 min): Screen-share Open to Close and demonstrate how to create a new transaction, add client contacts, and advance through milestone stages. Distribute the laminated one-page quick reference card to each agent.
4
SMS Consent Process (10 min): Demonstrate the iPad consent form. Explain when to have clients complete it (at listing appointment or buyer consultation). Review the consent language and explain TCPA requirements in plain language.
5
Dashboard Review (10 min): Show the Looker Studio dashboard and Google Sheets notification log. Explain what the weekly report email contains and who receives it.
6
Documentation Handoff: Leave behind: (a) Quick reference card (printed, one per agent), (b) System architecture diagram (PDF), (c) Message template catalog showing all email and SMS messages for buyer and seller milestones, (d) FAQ document for agents, (e) MSP support contact card with hours, email, and phone number, (f) Login credentials document (stored securely).
7
Success Criteria Review (10 min): Review the agreed-upon success metrics: (a) 95%+ of active transactions have current milestone status within 24 hours of real-world change, (b) 99.5%+ notification delivery rate, (c) Zero TCPA complaints, (d) Client satisfaction improvement measured via post-closing survey or Google review volume increase within 90 days.
8
Support & Escalation (5 min): Confirm the MSP support process: who to contact, response time expectations, and what constitutes an emergency (system down) vs. a standard request (template change).

Maintenance

Ongoing Managed Service Responsibilities (billed at $200-500/month):

Weekly (15 minutes)

  • Review the automated weekly performance report email for anomalies (sudden drop in notification volume, spike in failures)
  • Check Zapier task history for any failed tasks and retry or investigate
  • Verify Twilio and SendGrid dashboards show healthy delivery rates (>98% SMS delivery, >95% email delivery)

Monthly (1 hour)

  • Review Zapier task usage against plan limits — upgrade plan tier proactively if approaching 80% of monthly task allowance
  • Check SendGrid sender reputation score (target: 90+); investigate any bounce rate increases
  • Review Twilio messaging logs for carrier filtering or delivery issues
  • Audit the SMS consent log for completeness — every active client receiving SMS should have a consent record
  • Send monthly summary report to brokerage admin with trends and recommendations
  • Verify all SaaS subscriptions are current and payment methods are valid

Quarterly (2-3 hours)

  • Business review meeting with brokerage leadership: review notification analytics, gather feedback on message content, discuss any new milestones or transaction types to add
  • Update email and SMS templates based on seasonal content, agent roster changes, or brokerage branding updates
  • Review and update A2P 10DLC campaign registration if messaging use case has changed
  • Test all Zaps end-to-end (mini regression test) to catch any API changes or connector updates
  • Review DNS records (SPF/DKIM/DMARC) for any changes that could affect deliverability
  • Propose upsell opportunities: post-closing review requests, anniversary/home-iversary drip campaigns, listing alert automations

Annually (4-6 hours)

  • Full system audit: review all Zaps, templates, integrations, and credentials
  • Rotate API keys and update stored credentials in MSP password vault
  • Review compliance posture: any new state privacy laws, TCPA updates, or FCC rule changes
  • Renegotiate SaaS subscriptions for volume discounts if applicable
  • Archive notification logs older than the retention period (but retain SMS consent records indefinitely)

Escalation Path

1
Level 1 (Agent): Agent notices a client didn't receive an update → Check if milestone was updated in OTC → Check Zapier task history
2
Level 2 (MSP Helpdesk): Zapier error alert received → Investigate failed task → Retry or fix configuration → Respond within 15 minutes during business hours
3
Level 3 (MSP Engineer): Systematic failure (all notifications down) → Check SaaS status pages (Zapier, Twilio, SendGrid) → If vendor outage, communicate to client and monitor → If configuration issue, diagnose and resolve within 4 hours
4
Level 4 (Vendor Support): Platform-level issues → Open support tickets with Zapier, Twilio, or SendGrid → Escalate with MSP partner status if available

SLA Targets

  • Notification delivery rate: 99.5%
  • Alert response time: 15 minutes (business hours) / 4 hours (after hours)
  • Template change requests: 2 business days
  • New milestone addition: 5 business days
  • System uptime: 99.9% (dependent on SaaS vendor SLAs)

Alternatives

Open to Close Native-Only (No Zapier/Twilio)

Use Open to Close's built-in automated text triggers and email notifications without any external middleware. Open to Close natively supports SMS and email triggers that fire when transaction stages change, which may be sufficient for brokerages with straightforward notification needs. No Zapier, Twilio, or SendGrid accounts needed.

Note

Recommend when: The brokerage is small (under 5 agents), budget-constrained, wants the fastest possible go-live, and does not need advanced reporting or compliance audit trails.

Self-Hosted n8n Replacement for Zapier

Replace Zapier with self-hosted n8n (open-source workflow automation) running on an MSP-managed VPS. n8n provides the same trigger→action workflow capabilities as Zapier but with no per-task fees, unlimited executions, and full MSP control. Host on a $20/month VPS (DigitalOcean, Hetzner, or Linode) and manage multiple real estate clients from one instance.

Note

Recommend when: The MSP serves 3+ real estate clients and wants to maximize recurring margin, has DevOps capability on staff, and is willing to own infrastructure reliability.

Dotloop or SkySlope Instead of Open to Close

If the brokerage already uses Dotloop (Zillow ecosystem) or SkySlope (mandated by their franchise or brokerage network), build the automation on top of the existing TMS rather than migrating to Open to Close. Both platforms support status-change triggers via Zapier integrations and/or native APIs.

All-in-One Platform: Wise Agent or kvCORE

Use an all-in-one real estate platform that combines CRM, transaction management, and automated communications in a single system. Wise Agent ($49/mo for 5 users) includes transaction tracking with automated email/text campaigns. kvCORE (Inside Real Estate) offers similar capabilities at enterprise scale. This eliminates the need for separate TMS, CRM, and middleware.

Custom Development with Make + Airtable

Replace the Zapier + Google Sheets stack with Make (formerly Integromat) for workflow automation and Airtable as the notification log and configuration database. Make offers more complex logic at lower per-operation cost, and Airtable provides a richer database experience with built-in views, forms, and automations.

Note

Recommend when: The brokerage processes 30+ transactions/month, the MSP team is comfortable with Make, or the client wants self-service template editing capability.

Want early access to the full toolkit?