If you sell SaaS to real estate brokerages, mortgage lenders, property managers, or commercial real estate analytics buyers, your platform touches a regulatory stack that most compliance tools miss: RESPA §2607 kickback prohibition, TRID 3-business-day disclosure clocks, HMDA annual LAR filings, Fair Housing Act disparate impact obligations, and FinCEN Geographic Targeting Orders for cash purchases.
Here are 5 n8n workflows your PropTech platform can run autonomously — full JSON below.
Why PropTech SaaS Has a Hidden Compliance Stack
PropTech vendors often assume they are just building software and the licensed professionals (brokers, lenders, property managers) handle compliance. That assumption breaks when your platform:
- Facilitates referrals between settlement service providers (RESPA §2607 applies to the referral network itself)
- Processes mortgage applications and generates Loan Estimates (TRID 3-day clock starts at your system's application receipt timestamp)
- Aggregates HMDA-reportable loan data across lender customers (your LAR pipeline is the source of record)
- Powers listing search algorithms with filtering by neighborhood, school district, or walk score (Fair Housing disparate impact runs on your algorithm's outputs)
- Collects latitude/longitude for property search or smart building IoT (CCPA CPRA treats precise geolocation as Sensitive Personal Information requiring opt-in)
CFPB supervises PropTech vendors under Dodd-Frank §1024 when they are "service providers" to supervised entities. One TRID violation at a mortgage lender customer can result in a CFPB civil money penalty — and the lender will contractually pass that liability to you.
Your 7 Customer Tiers and Compliance Flags
| Tier | Key Obligations |
|---|---|
| PROPTECH_MARKETPLACE_SAAS | RESPA §2607 kickback prohibition, Fair Housing §3604 disparate impact |
| CRE_ANALYTICS_SAAS | CCPA CPRA precise geolocation Sensitive PI, GDPR Art.9 property data |
| PROPERTY_MANAGEMENT_SAAS | ADA §12101 tenant portal accessibility, CCPA tenant data rights |
| MORTGAGE_TECH_SAAS | TRID §1026.19(e)(f) 3-biz-day clocks, HMDA 12 CFR §1003 LAR March 1 |
| REAL_ESTATE_CRM_SAAS | Fair Housing adverse action, CCPA prospect data deletion rights |
| SMART_BUILDING_SAAS | CCPA CPRA geolocation, GDPR Art.9 occupancy data |
| PROPTECH_STARTUP | RESPA Safe Harbor §1024.14(g), Fair Housing disparate impact pre-launch audit |
Workflow 1: PropTech Customer Onboarding Drip (RESPA/TRID/HMDA/FHA Segmented)
The onboarding flow branches by tier at Day 0, delivers tier-specific regulatory education at Day 4, and sends the product automation toolkit at Day 8. Mortgage tier gets TRID clock setup; Marketplace tier gets RESPA §2607 AfBA disclosure requirements; CRE Analytics gets CCPA CPRA geolocation consent architecture.
{
"name": "PropTech Customer Onboarding Drip (RESPA/TRID/HMDA/FHA Segmented)",
"nodes": [
{
"id": "1",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "proptech-onboard",
"responseMode": "onReceived"
},
"position": [
100,
300
]
},
{
"id": "2",
"name": "Switch on Tier",
"type": "n8n-nodes-base.switch",
"parameters": {
"value": "={{ $json.customer_tier }}",
"rules": {
"values": [
{
"value": "PROPTECH_MARKETPLACE_SAAS",
"output": 0
},
{
"value": "MORTGAGE_TECH_SAAS",
"output": 1
},
{
"value": "CRE_ANALYTICS_SAAS",
"output": 2
},
{
"value": "PROPERTY_MANAGEMENT_SAAS",
"output": 3
},
{
"value": "REAL_ESTATE_CRM_SAAS",
"output": 4
},
{
"value": "SMART_BUILDING_SAAS",
"output": 5
}
]
}
},
"position": [
300,
300
]
},
{
"id": "3",
"name": "Marketplace Day0 Email",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "={{ $json.email }}",
"subject": "RESPA \u00a72607 Compliance Quickstart",
"message": "Your platform facilitates referrals between real estate service providers. RESPA 12 USC \u00a72607 prohibits kickbacks for referrals of settlement service business. Key obligations: (1) No thing of value may be given in exchange for referral of settlement services; (2) Affiliated Business Arrangements (AfBAs) require written disclosure and consumer choice; (3) Prohibited markups on third-party services violate \u00a72607(b). Fair Housing Act 42 USC \u00a73604 requires your listing algorithm produces no disparate impact on protected classes \u2014 run quarterly disparate impact analysis on search results by race, national origin, familial status.",
"sendAsPlainText": false
},
"position": [
500,
100
]
},
{
"id": "4",
"name": "Mortgage Day0 Email",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "={{ $json.email }}",
"subject": "TRID Compliance Onboarding \u2014 Your 3-Business-Day Clock",
"message": "TRID (TILA-RESPA Integrated Disclosure) 12 CFR \u00a71026.19(e) requires Loan Estimate delivery within 3 business days of receiving a complete application. Closing Disclosure must be delivered 3 business days before consummation (\u00a71026.19(f)). HMDA 12 CFR \u00a71003: if you originate 25+ closed-end mortgage loans annually, you must file the Loan Application Register (LAR) by March 1. LAR includes applicant race, sex, income, loan amount, property location \u2014 each field subject to CFPB data quality exam. Your n8n workflows will track every application timestamp and trigger TRID delivery deadline alerts automatically.",
"sendAsPlainText": false
},
"position": [
500,
200
]
},
{
"id": "5",
"name": "CRE Analytics Day0 Email",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "={{ $json.email }}",
"subject": "CCPA CPRA Geolocation & GDPR Onboarding",
"message": "Your platform processes property location data. Under CCPA CPRA Cal. Civ. Code \u00a71798.140(ae)(1)(K), latitude and longitude coordinates precise to within 1,850 feet constitute Sensitive Personal Information requiring opt-in consent and right to limit use. GDPR Art.9 treats property ownership data as potentially revealing financial position \u2014 implement data minimization at collection. CCPA CPRA consumers have the right to know geolocation data is collected, right to delete, and right to opt-out of sale/sharing. Implement consent collection before any geolocation API call.",
"sendAsPlainText": false
},
"position": [
500,
300
]
},
{
"id": "6",
"name": "Wait 3 Days",
"type": "n8n-nodes-base.wait",
"parameters": {
"amount": 3,
"unit": "days"
},
"position": [
700,
300
]
},
{
"id": "7",
"name": "Day4 Checklist Email",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "={{ $json.email }}",
"subject": "PropTech Compliance Checklist \u2014 Day 4",
"message": "Day 4 follow-up: (1) RESPA AfBA disclosure form ready? 12 CFR \u00a71024.15(b) requires written disclosure at time of referral. (2) TRID delivery tracking system configured? Every Loan Estimate and Closing Disclosure delivery must be timestamped. (3) Fair Housing algorithm review scheduled? Document your disparate impact analysis methodology. (4) CCPA privacy notice updated to include geolocation data collection? 45-day response window for consumer requests.",
"sendAsPlainText": false
},
"position": [
900,
300
]
},
{
"id": "8",
"name": "Wait 4 Days",
"type": "n8n-nodes-base.wait",
"parameters": {
"amount": 4,
"unit": "days"
},
"position": [
1100,
300
]
},
{
"id": "9",
"name": "Day8 Store Link Email",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "={{ $json.email }}",
"subject": "PropTech Compliance Automation Templates",
"message": "Your compliance automation toolkit: RESPA audit trail workflow, TRID 3-day deadline tracker, HMDA LAR submission scheduler, Fair Housing disparate impact monitor, and FinCEN GTO reporting pipeline. Download at https://stripeai.gumroad.com \u2014 all workflows ready to import into your n8n instance.",
"sendAsPlainText": false
},
"position": [
1300,
300
]
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Switch on Tier",
"type": "main",
"index": 0
}
]
]
},
"Switch on Tier": {
"main": [
[
{
"node": "Marketplace Day0 Email",
"type": "main",
"index": 0
}
],
[
{
"node": "Mortgage Day0 Email",
"type": "main",
"index": 0
}
],
[
{
"node": "CRE Analytics Day0 Email",
"type": "main",
"index": 0
}
],
[
{
"node": "Day4 Checklist Email",
"type": "main",
"index": 0
}
],
[
{
"node": "Day4 Checklist Email",
"type": "main",
"index": 0
}
],
[
{
"node": "Day4 Checklist Email",
"type": "main",
"index": 0
}
]
]
},
"Marketplace Day0 Email": {
"main": [
[
{
"node": "Wait 3 Days",
"type": "main",
"index": 0
}
]
]
},
"Mortgage Day0 Email": {
"main": [
[
{
"node": "Wait 3 Days",
"type": "main",
"index": 0
}
]
]
},
"CRE Analytics Day0 Email": {
"main": [
[
{
"node": "Wait 3 Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 3 Days": {
"main": [
[
{
"node": "Day4 Checklist Email",
"type": "main",
"index": 0
}
]
]
},
"Day4 Checklist Email": {
"main": [
[
{
"node": "Wait 4 Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 4 Days": {
"main": [
[
{
"node": "Day8 Store Link Email",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 2: PropTech Compliance Deadline Tracker (TRID/HMDA/RESPA/FHA/GTO)
Runs daily at 6 AM. Fetches all compliance deadlines in the next 30 days. Classifies urgency: TRID Loan Estimate (CRITICAL — 3-business-day clock from application receipt), TRID Closing Disclosure (CRITICAL — 3 business days before consummation, loan may not close without it), FinCEN GTO (HIGH if within 5 days of 30-day deadline). HMDA LAR March 1 escalates to CRITICAL within 14 days.
The TRID 3-day clock has no grace period — a lender who misses it must restart the waiting period, which can delay closing. CFPB exam findings for pattern TRID violations carry civil money penalties up to $1,000,000 per day of violation.
{
"name": "PropTech Compliance Deadline Tracker (TRID/HMDA/RESPA/FHA/GTO)",
"nodes": [
{
"id": "1",
"name": "Daily 6AM Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 6 * * *"
}
]
}
},
"position": [
100,
300
]
},
{
"id": "2",
"name": "Fetch Deadlines",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT id, deadline_type, due_date, customer_id, customer_name, CURRENT_DATE as today_date FROM proptech_compliance_deadlines WHERE due_date BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL '30 days' AND status = 'OPEN' ORDER BY due_date ASC"
},
"position": [
300,
300
]
},
{
"id": "3",
"name": "Classify Urgency",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "\nconst items = $input.all();\nreturn items.map(item => {\n const d = item.json;\n const daysOut = Math.round((new Date(d.due_date) - new Date(d.today_date)) / 86400000);\n const urgencyMap = {\n TRID_LOAN_ESTIMATE_3DAY: 'CRITICAL',\n TRID_CLOSING_DISCLOSURE_3DAY: 'CRITICAL',\n HMDA_LAR_ANNUAL_MARCH1: daysOut <= 14 ? 'CRITICAL' : daysOut <= 45 ? 'HIGH' : 'MEDIUM',\n RESPA_KICKBACK_AUDIT: daysOut <= 7 ? 'HIGH' : 'MEDIUM',\n FAIR_HOUSING_DISPARATE_IMPACT_REVIEW: daysOut <= 14 ? 'HIGH' : 'MEDIUM',\n ADA_ACCESSIBILITY_AUDIT: daysOut <= 14 ? 'HIGH' : 'MEDIUM',\n CCPA_GEOLOCATION_CONSENT_RENEWAL: daysOut <= 14 ? 'HIGH' : 'MEDIUM',\n GTO_CASH_PURCHASE_REPORT: daysOut <= 5 ? 'CRITICAL' : 'HIGH',\n GDPR_DATA_RETENTION_REVIEW: 'MEDIUM',\n SOC2_TYPE2_RENEWAL: daysOut <= 30 ? 'HIGH' : 'MEDIUM'\n };\n return { json: { ...d, days_remaining: daysOut, urgency: urgencyMap[d.deadline_type] || 'MEDIUM' } };\n});\n"
},
"position": [
500,
300
]
},
{
"id": "4",
"name": "IF Critical",
"type": "n8n-nodes-base.if",
"parameters": {
"conditions": {
"options": {
"caseSensitive": true
},
"conditions": [
{
"id": "1",
"leftValue": "={{ $json.urgency }}",
"rightValue": "CRITICAL",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
}
},
"position": [
700,
300
]
},
{
"id": "5",
"name": "Critical Slack Alert",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#proptech-compliance-critical",
"text": "\ud83d\udea8 CRITICAL PropTech Deadline: {{ $json.deadline_type }} for {{ $json.customer_name }} due {{ $json.due_date }} ({{ $json.days_remaining }} days). TRID 3-day violations carry CFPB civil money penalties up to $1M/day. GTO failures: FinCEN civil penalties + potential BSA criminal referral."
},
"position": [
900,
200
]
},
{
"id": "6",
"name": "Queue Other Alerts",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#proptech-compliance-watch",
"text": "PropTech Deadline ({{ $json.urgency }}): {{ $json.deadline_type }} for {{ $json.customer_name }} \u2014 {{ $json.days_remaining }} days remaining."
},
"position": [
900,
400
]
},
{
"id": "7",
"name": "Update Notified Status",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "UPDATE proptech_compliance_deadlines SET last_notified_at = NOW() WHERE id = {{ $json.id }}"
},
"position": [
1100,
300
]
}
],
"connections": {
"Daily 6AM Trigger": {
"main": [
[
{
"node": "Fetch Deadlines",
"type": "main",
"index": 0
}
]
]
},
"Fetch Deadlines": {
"main": [
[
{
"node": "Classify Urgency",
"type": "main",
"index": 0
}
]
]
},
"Classify Urgency": {
"main": [
[
{
"node": "IF Critical",
"type": "main",
"index": 0
}
]
]
},
"IF Critical": {
"main": [
[
{
"node": "Critical Slack Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "Queue Other Alerts",
"type": "main",
"index": 0
}
]
]
},
"Critical Slack Alert": {
"main": [
[
{
"node": "Update Notified Status",
"type": "main",
"index": 0
}
]
]
},
"Queue Other Alerts": {
"main": [
[
{
"node": "Update Notified Status",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 3: PropTech API Health Monitor (TRID/HMDA/RESPA/FHA)
Polls your TRID delivery API, HMDA LAR data aggregator, Fair Housing algorithm API, and RESPA referral audit API every 5 minutes. If any endpoint goes down, the specific regulatory exposure is documented in the Slack alert — not just 'API down' but 'TRID_DELIVERY_API_DOWN — CFPB §1026.19(e) 3-business-day clock tracking failure.'
HMDA LAR downtime matters because the LAR must be accurate and complete at March 1 submission. Missing loan records from a data pipeline outage cannot be retroactively fixed without CFPB disclosure.
{
"name": "PropTech API Health Monitor (TRID/HMDA/RESPA/FHA)",
"nodes": [
{
"id": "1",
"name": "Every 5 Minutes",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "*/5 * * * *"
}
]
}
},
"position": [
100,
300
]
},
{
"id": "2",
"name": "Check TRID Delivery API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "{{ $env.PROPTECH_API_BASE }}/trid/delivery-status",
"method": "GET",
"timeout": 5000,
"continueOnFail": true
},
"position": [
300,
100
]
},
{
"id": "3",
"name": "Check HMDA LAR API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "{{ $env.PROPTECH_API_BASE }}/hmda/lar-status",
"method": "GET",
"timeout": 5000,
"continueOnFail": true
},
"position": [
300,
200
]
},
{
"id": "4",
"name": "Check Fair Housing API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "{{ $env.PROPTECH_API_BASE }}/fair-housing/algorithm-status",
"method": "GET",
"timeout": 5000,
"continueOnFail": true
},
"position": [
300,
300
]
},
{
"id": "5",
"name": "Check RESPA Referral API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "{{ $env.PROPTECH_API_BASE }}/respa/referral-audit",
"method": "GET",
"timeout": 5000,
"continueOnFail": true
},
"position": [
300,
400
]
},
{
"id": "6",
"name": "Evaluate API Health",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "\nconst results = $input.all();\nconst flags = [];\nresults.forEach(r => {\n const d = r.json;\n if (d.error || d.statusCode >= 500) {\n const apiMap = {\n 'trid': 'TRID_DELIVERY_API_DOWN \u2014 CFPB \u00a71026.19(e) 3-business-day clock tracking failure',\n 'hmda': 'HMDA_LAR_API_DOWN \u2014 CFPB HMDA \u00a71003 annual filing integrity at risk',\n 'fair-housing': 'FAIR_HOUSING_ALGO_API_DOWN \u2014 42 USC \u00a73604 disparate impact monitoring disabled',\n 'respa': 'RESPA_REFERRAL_API_DOWN \u2014 RESPA \u00a72607 kickback audit trail offline'\n };\n const key = Object.keys(apiMap).find(k => JSON.stringify(d).includes(k)) || 'UNKNOWN';\n flags.push({ flag: apiMap[key] || 'API_DOWN', detail: d.error || `HTTP ${d.statusCode}` });\n }\n});\nreturn flags.length ? flags.map(f => ({ json: f })) : [{ json: { flag: 'ALL_OK', detail: 'All PropTech compliance APIs healthy' } }];\n"
},
"position": [
500,
300
]
},
{
"id": "7",
"name": "Alert if Down",
"type": "n8n-nodes-base.if",
"parameters": {
"conditions": {
"conditions": [
{
"leftValue": "={{ $json.flag }}",
"rightValue": "ALL_OK",
"operator": {
"type": "string",
"operation": "notEquals"
}
}
]
}
},
"position": [
700,
300
]
},
{
"id": "8",
"name": "Slack Alert",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#proptech-infra-alerts",
"text": "\ud83d\udd34 {{ $json.flag }}: {{ $json.detail }}"
},
"position": [
900,
200
]
}
],
"connections": {
"Every 5 Minutes": {
"main": [
[
{
"node": "Check TRID Delivery API",
"type": "main",
"index": 0
},
{
"node": "Check HMDA LAR API",
"type": "main",
"index": 0
},
{
"node": "Check Fair Housing API",
"type": "main",
"index": 0
},
{
"node": "Check RESPA Referral API",
"type": "main",
"index": 0
}
]
]
},
"Check TRID Delivery API": {
"main": [
[
{
"node": "Evaluate API Health",
"type": "main",
"index": 0
}
]
]
},
"Check HMDA LAR API": {
"main": [
[
{
"node": "Evaluate API Health",
"type": "main",
"index": 0
}
]
]
},
"Check Fair Housing API": {
"main": [
[
{
"node": "Evaluate API Health",
"type": "main",
"index": 0
}
]
]
},
"Check RESPA Referral API": {
"main": [
[
{
"node": "Evaluate API Health",
"type": "main",
"index": 0
}
]
]
},
"Evaluate API Health": {
"main": [
[
{
"node": "Alert if Down",
"type": "main",
"index": 0
}
]
]
},
"Alert if Down": {
"main": [
[
{
"node": "Slack Alert",
"type": "main",
"index": 0
}
],
[]
]
}
}
}
Workflow 4: TRID/Fair Housing/GTO Incident Pipeline
Webhook receives compliance events and classifies 8 event types with specific clocks and regulatory consequences:
| Event Type | Clock | Consequence |
|---|---|---|
| TRID_LOAN_ESTIMATE_3DAY_VIOLATION | IMMEDIATE | CFPB civil penalty $1M/day/pattern |
| TRID_CLOSING_DISCLOSURE_3DAY_VIOLATION | IMMEDIATE | Loan may not close — waiting period restarts |
| RESPA_KICKBACK_FLAG | 24h | HUD/CFPB $10K/transaction + criminal referral |
| FAIR_HOUSING_DISPARATE_IMPACT | 72h | HUD complaint + DOJ referral + $65K civil penalty |
| HMDA_LAR_DISCREPANCY | 7d | CFPB exam finding + resubmission required |
| CCPA_GEOLOCATION_BREACH | 72h | CA AG $7,500/intentional violation |
| GTO_CASH_PURCHASE_THRESHOLD | 30d | FinCEN §5326 report required |
| ADA_ACCESSIBILITY_COMPLAINT | 14d | DOJ settlement + plaintiff attorney fees |
{
"name": "TRID/Fair Housing/GTO Incident Pipeline",
"nodes": [
{
"id": "1",
"name": "Compliance Event Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "proptech-compliance-event",
"responseMode": "onReceived"
},
"position": [
100,
300
]
},
{
"id": "2",
"name": "Classify Event",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "\nconst event = $input.first().json;\nconst classifications = {\n TRID_LOAN_ESTIMATE_3DAY_VIOLATION: { urgency: 'CRITICAL', clock: 'IMMEDIATE', regulation: 'CFPB 12 CFR \u00a71026.19(e) \u2014 3 business days from application', action: 'CFPB civil money penalty potential $1M/day per violation pattern' },\n TRID_CLOSING_DISCLOSURE_3DAY_VIOLATION: { urgency: 'CRITICAL', clock: 'IMMEDIATE', regulation: 'CFPB 12 CFR \u00a71026.19(f) \u2014 3 business days before consummation', action: 'Loan may not close until 3-day waiting period satisfied' },\n RESPA_KICKBACK_FLAG: { urgency: 'CRITICAL', clock: '24h', regulation: 'RESPA 12 USC \u00a72607 \u2014 no thing of value for referrals', action: 'HUD/CFPB civil penalty up to $10K per transaction + criminal referral' },\n FAIR_HOUSING_DISPARATE_IMPACT: { urgency: 'HIGH', clock: '72h', regulation: 'Fair Housing Act 42 USC \u00a73604 \u2014 disparate impact on protected class', action: 'HUD complaint + DOJ referral + private right of action $16K\u2013$65K civil penalty' },\n HMDA_LAR_DISCREPANCY: { urgency: 'HIGH', clock: '7d', regulation: 'HMDA 12 CFR \u00a71003 \u2014 LAR accuracy for CFPB exam', action: 'CFPB HMDA data quality exam finding + resubmission required' },\n CCPA_GEOLOCATION_BREACH: { urgency: 'CRITICAL', clock: '72h', regulation: 'CCPA CPRA Cal. Civ. Code \u00a71798.150 \u2014 sensitive PI breach notification', action: 'CA AG civil penalty $2,500/violation unintentional, $7,500/violation intentional' },\n GTO_CASH_PURCHASE_THRESHOLD: { urgency: 'HIGH', clock: '30d', regulation: 'FinCEN GTO 31 USC \u00a75326 \u2014 cash RE purchases above threshold', action: 'FinCEN GTO report required within 30 days of closing' },\n ADA_ACCESSIBILITY_COMPLAINT: { urgency: 'HIGH', clock: '14d', regulation: 'ADA 42 USC \u00a712101 \u2014 web portal accessibility for tenants/buyers', action: 'DOJ settlement + plaintiff attorney fees; web accessibility = public accommodation' }\n};\nconst c = classifications[event.event_type] || { urgency: 'MEDIUM', clock: '15d', regulation: 'PropTech compliance review required', action: 'Review and document' };\nreturn [{ json: { ...event, ...c } }];\n"
},
"position": [
300,
300
]
},
{
"id": "3",
"name": "Switch Urgency",
"type": "n8n-nodes-base.switch",
"parameters": {
"value": "={{ $json.urgency }}",
"rules": {
"values": [
{
"value": "CRITICAL",
"output": 0
},
{
"value": "HIGH",
"output": 1
}
]
}
},
"position": [
500,
300
]
},
{
"id": "4",
"name": "Critical Alert",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#proptech-compliance-critical",
"text": "\ud83d\udea8 CRITICAL: {{ $json.event_type }} | Customer: {{ $json.customer_name }} | Regulation: {{ $json.regulation }} | Action: {{ $json.action }} | Clock: {{ $json.clock }}"
},
"position": [
700,
100
]
},
{
"id": "5",
"name": "High Alert",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#proptech-compliance-watch",
"text": "\u26a0\ufe0f HIGH: {{ $json.event_type }} | {{ $json.regulation }} | {{ $json.action }}"
},
"position": [
700,
300
]
},
{
"id": "6",
"name": "Log to Sheets",
"type": "n8n-nodes-base.googleSheets",
"parameters": {
"operation": "append",
"spreadsheetId": "{{ $env.PROPTECH_INCIDENT_SHEET_ID }}",
"sheetName": "Incidents",
"columns": {
"mappingMode": "defineBelow",
"value": {
"event_type": "={{ $json.event_type }}",
"customer_name": "={{ $json.customer_name }}",
"urgency": "={{ $json.urgency }}",
"regulation": "={{ $json.regulation }}",
"clock": "={{ $json.clock }}",
"timestamp": "={{ $now }}"
}
}
},
"position": [
900,
300
]
},
{
"id": "7",
"name": "Webhook Response",
"type": "n8n-nodes-base.respondToWebhook",
"parameters": {
"respondWith": "json",
"responseBody": "{\"received\": true, \"urgency\": \"{{ $json.urgency }}\"}"
},
"position": [
1100,
300
]
}
],
"connections": {
"Compliance Event Webhook": {
"main": [
[
{
"node": "Classify Event",
"type": "main",
"index": 0
}
]
]
},
"Classify Event": {
"main": [
[
{
"node": "Switch Urgency",
"type": "main",
"index": 0
}
]
]
},
"Switch Urgency": {
"main": [
[
{
"node": "Critical Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "High Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "Log to Sheets",
"type": "main",
"index": 0
}
]
]
},
"Critical Alert": {
"main": [
[
{
"node": "Log to Sheets",
"type": "main",
"index": 0
}
]
]
},
"High Alert": {
"main": [
[
{
"node": "Log to Sheets",
"type": "main",
"index": 0
}
]
]
},
"Log to Sheets": {
"main": [
[
{
"node": "Webhook Response",
"type": "main",
"index": 0
}
]
]
}
}
}
Workflow 5: Weekly PropTech Compliance KPI Dashboard
Every Monday at 7 AM: new customers, TRID overdue count (Loan Estimate and Closing Disclosure tracked separately because they have different downstream consequences), RESPA audits due in 14 days, HMDA LAR submissions due in 45 days, Fair Housing disparate impact reviews open, FinCEN GTO reports pending, ADA accessibility complaints in the last 30 days.
{
"name": "Weekly PropTech Compliance KPI Dashboard",
"nodes": [
{
"id": "1",
"name": "Monday 7AM",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 7 * * 1"
}
]
}
},
"position": [
100,
300
]
},
{
"id": "2",
"name": "Fetch KPIs",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "\nSELECT\n COUNT(DISTINCT customer_id) FILTER (WHERE created_at >= NOW() - INTERVAL '7 days') as new_customers_7d,\n COUNT(*) FILTER (WHERE deadline_type = 'TRID_LOAN_ESTIMATE_3DAY' AND status = 'OVERDUE') as trid_le_overdue,\n COUNT(*) FILTER (WHERE deadline_type = 'TRID_CLOSING_DISCLOSURE_3DAY' AND status = 'OVERDUE') as trid_cd_overdue,\n COUNT(*) FILTER (WHERE deadline_type = 'RESPA_KICKBACK_AUDIT' AND due_date <= CURRENT_DATE + 14) as respa_audits_due_14d,\n COUNT(*) FILTER (WHERE deadline_type = 'HMDA_LAR_ANNUAL_MARCH1' AND due_date <= CURRENT_DATE + 45) as hmda_lar_due_45d,\n COUNT(*) FILTER (WHERE deadline_type = 'FAIR_HOUSING_DISPARATE_IMPACT_REVIEW' AND status = 'OPEN') as fha_reviews_open,\n COUNT(*) FILTER (WHERE deadline_type = 'GTO_CASH_PURCHASE_REPORT' AND status = 'OPEN') as gto_reports_pending,\n COUNT(*) FILTER (WHERE event_type = 'ADA_ACCESSIBILITY_COMPLAINT' AND created_at >= NOW() - INTERVAL '30 days') as ada_complaints_30d\nFROM proptech_compliance_deadlines\n"
},
"position": [
300,
300
]
},
{
"id": "3",
"name": "Format Report",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "\nconst d = $input.first().json;\nconst report = [\n `*PropTech Compliance KPI \u2014 Week of ${new Date().toISOString().slice(0,10)}*`,\n `New Customers (7d): ${d.new_customers_7d}`,\n `TRID Loan Estimate Overdue: ${d.trid_le_overdue} ${d.trid_le_overdue > 0 ? '\ud83d\udea8 CFPB \u00a71026.19(e) violation exposure' : '\u2705'}`,\n `TRID Closing Disclosure Overdue: ${d.trid_cd_overdue} ${d.trid_cd_overdue > 0 ? '\ud83d\udea8 consummation blocked' : '\u2705'}`,\n `RESPA Kickback Audits Due (14d): ${d.respa_audits_due_14d}`,\n `HMDA LAR Submissions Due (45d): ${d.hmda_lar_due_45d}`,\n `Fair Housing Disparate Impact Reviews Open: ${d.fha_reviews_open}`,\n `FinCEN GTO Reports Pending: ${d.gto_reports_pending}`,\n `ADA Accessibility Complaints (30d): ${d.ada_complaints_30d}`\n].join('\\n');\nreturn [{ json: { report } }];\n"
},
"position": [
500,
300
]
},
{
"id": "4",
"name": "Send to Slack",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#proptech-compliance-weekly",
"text": "={{ $json.report }}"
},
"position": [
700,
300
]
},
{
"id": "5",
"name": "Email CEO+CPO",
"type": "n8n-nodes-base.gmail",
"parameters": {
"to": "ceo@yourproptech.com",
"bcc": "cpo@yourproptech.com",
"subject": "PropTech Weekly Compliance KPI",
"message": "={{ $json.report }}"
},
"position": [
900,
300
]
}
],
"connections": {
"Monday 7AM": {
"main": [
[
{
"node": "Fetch KPIs",
"type": "main",
"index": 0
}
]
]
},
"Fetch KPIs": {
"main": [
[
{
"node": "Format Report",
"type": "main",
"index": 0
}
]
]
},
"Format Report": {
"main": [
[
{
"node": "Send to Slack",
"type": "main",
"index": 0
}
]
]
},
"Send to Slack": {
"main": [
[
{
"node": "Email CEO+CPO",
"type": "main",
"index": 0
}
]
]
}
}
}
Why Self-Host These Workflows
RESPA audit trail data — documenting that a referral network did not pay kickbacks — should not route through a third-party automation SaaS (Zapier, Make.com). If a CFPB investigation subpoenas your RESPA audit records, the data custodian is Zapier, not you. n8n self-hosted means you control the audit trail.
HMDA LAR race and ethnicity data (required by 12 CFR §1003.4) cannot be processed by third-party cloud automation without triggering HMDA's Fair Lending data sensitivity requirements. The LAR contains applicant demographic data that is legally sensitive under the Fair Housing Act. Self-hosted n8n keeps LAR pipeline data in your Postgres instance.
Fair Housing disparate impact algorithm performance data — which demographic groups see which listings — is the exact data that a HUD disparate impact investigation would request. Routing algorithm output through a third-party service creates a chain-of-custody problem at the moment you most need clean records.
Get the Full PropTech Automation Toolkit
All 5 workflows plus the full FlowKit bundle (15 templates) are available at stripeai.gumroad.com. Ready to import into your n8n instance — swap the environment variables for your endpoints, connect your Postgres and Slack, and your compliance clock is running.
What PropTech compliance problem is your team solving with automation? Drop it in the comments.
Top comments (0)