n8n for PropTech SaaS Vendors: 5 Automations for RESPA §8, TRID, Fair Housing Act, and FCRA Compliance (Free Workflow JSON)
Target audience: PropTech SaaS companies selling software B2B to real estate brokerages, mortgage lenders, property management companies, title/escrow providers, and commercial RE firms. If you build POS, transaction management, CRM, or compliance software for real estate — this is for you.
Real estate software vendors operate at the intersection of some of the most consequential US financial regulations: RESPA §8 kickback prohibitions (12 USC §2607), TRID disclosure timing mandates (Reg Z §1026.19(e)), Fair Housing Act §3604 disparate impact liability, and FCRA §1681m adverse action notice requirements. A missed TRID clock, a kickback audit gap, or an algorithm bias complaint can trigger CFPB examination, HUD referral, or DOJ enforcement.
These 5 n8n workflows give PropTech SaaS vendors a production-ready compliance automation stack. All JSON is free to import.
Workflow 1: PropTech Customer Onboarding Drip
Classifies new customers into 7 tiers (ENTERPRISE_BROKERAGE_PLATFORM / MID_MARKET_PROPTECH_SAAS / RESIDENTIAL_TRANSACTION_PLATFORM / COMMERCIAL_RE_SAAS / PROPERTY_MANAGEMENT_SAAS / MORTGAGE_LENDING_TECH_VENDOR / TITLE_ESCROW_TECH_VENDOR) and detects 7 compliance flags (RESPA_SECTION_8_APPLICABLE / TRID_TILA_RESPA_REQUIRED / FAIR_HOUSING_APPLICABLE / FCRA_TENANT_SCREENING / CFPB_EXAMINATION_SCOPE / GLBA_NPI_HANDLER / STATE_RE_LICENSE_LAW_APPLICABLE). Day 0 sends RESPA §8 kickback audit log setup guide + TRID 3-business-day disclosure clock API config + Fair Housing §3604 algorithm decision audit template + FCRA §1681m adverse action notice pipeline.
{
"name": "PropTech Customer Onboarding Drip",
"nodes": [
{
"id": "n1",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"httpMethod": "POST",
"path": "proptech-onboarding",
"responseMode": "onReceived"
},
"position": [
200,
300
]
},
{
"id": "n2",
"name": "Classify Tier",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const d = $input.first().json;\nconst mrr = d.mrr_usd || 0;\nconst tiers = [\n {tier: 'ENTERPRISE_BROKERAGE_PLATFORM', min: 50000},\n {tier: 'MID_MARKET_PROPTECH_SAAS', min: 10000},\n {tier: 'RESIDENTIAL_TRANSACTION_PLATFORM', min: 5000},\n {tier: 'COMMERCIAL_RE_SAAS', min: 3000},\n {tier: 'PROPERTY_MANAGEMENT_SAAS', min: 1000},\n {tier: 'MORTGAGE_LENDING_TECH_VENDOR', min: 500},\n {tier: 'TITLE_ESCROW_TECH_VENDOR', min: 0}\n];\nconst flags = [\n d.respa_section8 ? 'RESPA_SECTION_8_APPLICABLE' : null,\n d.trid_required ? 'TRID_TILA_RESPA_REQUIRED' : null,\n d.fair_housing ? 'FAIR_HOUSING_APPLICABLE' : null,\n d.fcra_tenant_screening ? 'FCRA_TENANT_SCREENING' : null,\n d.cfpb_exam_scope ? 'CFPB_EXAMINATION_SCOPE' : null,\n d.glba_npi ? 'GLBA_NPI_HANDLER' : null,\n d.state_re_license ? 'STATE_RE_LICENSE_LAW_APPLICABLE' : null\n].filter(Boolean);\nconst tier = tiers.find(t => mrr >= t.min)?.tier || 'TITLE_ESCROW_TECH_VENDOR';\nreturn [{json: {...d, tier, compliance_flags: flags, enrolled_at: new Date().toISOString()}}];"
},
"position": [
420,
300
]
},
{
"id": "n3",
"name": "Save to Postgres",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "insert",
"table": "proptech_customers",
"columns": "customer_id,tier,compliance_flags,mrr_usd,enrolled_at",
"additionalFields": {}
},
"position": [
640,
300
]
},
{
"id": "n4",
"name": "Day 0 Email",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "={{$json.email}}",
"subject": "={{$json.tier === 'ENTERPRISE_BROKERAGE_PLATFORM' ? '[FlowKit] RESPA \u00a78 audit trail + TRID clock setup \u2014 your compliance stack' : '[FlowKit] Getting started with RESPA/Fair Housing compliance automation'}}",
"text": "Day 0: RESPA \u00a78(a) kickback audit log setup guide, TRID 3-business-day disclosure clock API config, Fair Housing \u00a73604 algorithm decision audit template, FCRA \u00a71681m adverse action notice pipeline. Setup guide: {{$json.setup_link}}"
},
"position": [
860,
200
]
},
{
"id": "n5",
"name": "Wait 3 Days",
"type": "n8n-nodes-base.wait",
"parameters": {
"unit": "days",
"amount": 3
},
"position": [
860,
300
]
},
{
"id": "n6",
"name": "Day 3 Email",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "={{$json.email}}",
"subject": "=[FlowKit] RESPA \u00a710 escrow analysis + TRID timing table \u2014 configure now",
"text": "Day 3: RESPA \u00a710 escrow analysis automation, TRID timing table API, Fair Housing disparate impact monitoring config, GLBA NPI data flow audit. Connect your property management APIs."
},
"position": [
1080,
300
]
},
{
"id": "n7",
"name": "Wait 4 Days",
"type": "n8n-nodes-base.wait",
"parameters": {
"unit": "days",
"amount": 4
},
"position": [
1080,
400
]
},
{
"id": "n8",
"name": "Day 7 Email",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "={{$json.email}}",
"subject": "=[FlowKit] Advanced PropTech compliance features \u2014 live demo invite",
"text": "Day 7: Advanced Fair Housing audit dashboard, CFPB exam-ready reporting, FCRA adverse action automation, RESPA kickback detection alerts. Book your 30-min advanced onboarding call."
},
"position": [
1300,
300
]
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Classify Tier",
"type": "main",
"index": 0
}
]
]
},
"Classify Tier": {
"main": [
[
{
"node": "Save to Postgres",
"type": "main",
"index": 0
}
]
]
},
"Save to Postgres": {
"main": [
[
{
"node": "Day 0 Email",
"type": "main",
"index": 0
},
{
"node": "Wait 3 Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 3 Days": {
"main": [
[
{
"node": "Day 3 Email",
"type": "main",
"index": 0
}
]
]
},
"Day 3 Email": {
"main": [
[
{
"node": "Wait 4 Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 4 Days": {
"main": [
[
{
"node": "Day 7 Email",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Workflow 2: RESPA/TRID Critical API Health Monitor
Polls 5 compliance-critical endpoints every 5 minutes. Uses $getWorkflowStaticData for UP→DOWN state tracking (fires once on transition, not every poll). Endpoints annotated with regulatory clocks:
-
respa_section8_audit_api— RESPA §8(a) kickback audit trail. DOWN = CFPB subpoena readiness gap. -
trid_disclosure_engine_api— TRID §1026.19(e) 3-business-day clock. DOWN = CFPB enforcement exposure. -
fair_housing_algorithm_api— FHA §3604 algorithm decision audit. DOWN = disparate impact documentation gap. -
fcra_tenant_screening_api— FCRA §1681m adverse action pipeline. DOWN = 30-day notice clock at risk. -
glba_npi_data_api— GLBA §6801 NPI protection. DOWN = state AG complaint exposure.
{
"name": "RESPA/TRID Critical API Health Monitor",
"nodes": [
{
"id": "m1",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 5
}
]
}
},
"position": [
200,
300
]
},
{
"id": "m2",
"name": "Check RESPA Audit API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{$vars.RESPA_SECTION8_AUDIT_API}}/health",
"method": "GET",
"timeout": 10000
},
"position": [
420,
200
]
},
{
"id": "m3",
"name": "Check TRID Engine API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{$vars.TRID_DISCLOSURE_ENGINE_API}}/health",
"method": "GET",
"timeout": 10000
},
"position": [
420,
300
]
},
{
"id": "m4",
"name": "Check FHA Algorithm API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{$vars.FAIR_HOUSING_ALGORITHM_API}}/health",
"method": "GET",
"timeout": 10000
},
"position": [
420,
400
]
},
{
"id": "m5",
"name": "Check FCRA Screening API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{$vars.FCRA_TENANT_SCREENING_API}}/health",
"method": "GET",
"timeout": 10000
},
"position": [
420,
500
]
},
{
"id": "m6",
"name": "Check GLBA NPI API",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "={{$vars.GLBA_NPI_DATA_API}}/health",
"method": "GET",
"timeout": 10000
},
"position": [
420,
600
]
},
{
"id": "m7",
"name": "Evaluate Status",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const store = $getWorkflowStaticData('global');\nif (!store.prevStatus) store.prevStatus = {};\nconst endpoints = [\n {name: 'respa_section8_audit_api', label: 'RESPA \u00a78(a) Audit Trail', risk: 'CFPB subpoena readiness gap \u2014 12 USC \u00a72607 kickback audit unavailable'},\n {name: 'trid_disclosure_engine_api', label: 'TRID Disclosure Engine', risk: 'TRID \u00a71026.19(e) 3-business-day clock dependency DOWN \u2014 CFPB enforcement exposure'},\n {name: 'fair_housing_algorithm_api', label: 'FHA Algorithm Audit', risk: 'Fair Housing \u00a73604 algorithm decision audit unavailable \u2014 disparate impact documentation gap'},\n {name: 'fcra_tenant_screening_api', label: 'FCRA Tenant Screening', risk: 'FCRA \u00a71681m adverse action pipeline DOWN \u2014 30-day notice clock at risk'},\n {name: 'glba_npi_data_api', label: 'GLBA NPI Data API', risk: 'GLBA \u00a76801 NPI protection DOWN \u2014 state AG complaint exposure'}\n];\nconst items = $input.all();\nconst alerts = [];\nendpoints.forEach((ep, i) => {\n const status = items[i]?.json?.status === 'ok' ? 'UP' : 'DOWN';\n const prev = store.prevStatus[ep.name] || 'UP';\n if (status === 'DOWN' && prev === 'UP') {\n alerts.push({endpoint: ep.name, label: ep.label, risk: ep.risk, ts: new Date().toISOString()});\n }\n store.prevStatus[ep.name] = status;\n});\nreturn alerts.length ? alerts.map(a => ({json: a})) : [{json: {skip: true}}];"
},
"position": [
640,
400
]
},
{
"id": "m8",
"name": "Filter Alerts",
"type": "n8n-nodes-base.filter",
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "={{$json.skip}}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "notEquals"
}
}
]
}
},
"position": [
860,
400
]
},
{
"id": "m9",
"name": "Alert Slack",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#compliance-alerts",
"text": "=:red_circle: PropTech API DOWN: {{$json.label}}\\nRisk: {{$json.risk}}\\nTime: {{$json.ts}}"
},
"position": [
1080,
350
]
},
{
"id": "m10",
"name": "Alert Email",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "ciso@yourcompany.com",
"cc": "compliance@yourcompany.com",
"subject": "=[CRITICAL] PropTech compliance API DOWN: {{$json.label}}",
"text": "=API DOWN: {{$json.label}}\\nRegulatory risk: {{$json.risk}}\\nTimestamp: {{$json.ts}}\\n\\nImmediate action required \u2014 CFPB examination readiness impacted."
},
"position": [
1080,
450
]
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Check RESPA Audit API",
"type": "main",
"index": 0
},
{
"node": "Check TRID Engine API",
"type": "main",
"index": 0
},
{
"node": "Check FHA Algorithm API",
"type": "main",
"index": 0
},
{
"node": "Check FCRA Screening API",
"type": "main",
"index": 0
},
{
"node": "Check GLBA NPI API",
"type": "main",
"index": 0
}
]
]
},
"Check RESPA Audit API": {
"main": [
[
{
"node": "Evaluate Status",
"type": "main",
"index": 0
}
]
]
},
"Check TRID Engine API": {
"main": [
[
{
"node": "Evaluate Status",
"type": "main",
"index": 0
}
]
]
},
"Check FHA Algorithm API": {
"main": [
[
{
"node": "Evaluate Status",
"type": "main",
"index": 0
}
]
]
},
"Check FCRA Screening API": {
"main": [
[
{
"node": "Evaluate Status",
"type": "main",
"index": 0
}
]
]
},
"Check GLBA NPI API": {
"main": [
[
{
"node": "Evaluate Status",
"type": "main",
"index": 0
}
]
]
},
"Evaluate Status": {
"main": [
[
{
"node": "Filter Alerts",
"type": "main",
"index": 0
}
]
]
},
"Filter Alerts": {
"main": [
[
{
"node": "Alert Slack",
"type": "main",
"index": 0
},
{
"node": "Alert Email",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Workflow 3: Fair Housing/RESPA/TRID Compliance Deadline Tracker
Runs weekdays at 8 AM. Tracks 12 deadline types with OVERDUE/CRITICAL/URGENT/WARNING/NOTICE routing and alert_sent_date deduplication:
| Deadline Type | Regulation |
|---|---|
| RESPA_SECTION_8_ANNUAL_AUDIT | RESPA 12 USC §2607 — kickback audit trail review |
| RESPA_SECTION_10_ESCROW_ANALYSIS | RESPA §2609 — annual escrow account analysis |
| TRID_DISCLOSURE_TIMING_AUDIT | TRID Reg Z §1026.19(e) — 3-business-day LE delivery audit |
| FAIR_HOUSING_ALGORITHM_AUDIT_ANNUAL | FHA 42 USC §3604 — algorithm disparate impact review |
| FCRA_ADVERSE_ACTION_REVIEW_ANNUAL | FCRA 15 USC §1681m — adverse action notice compliance audit |
| CFPB_SUPERVISORY_EXAM_PREP | CFPB 12 USC §5512 — supervisory examination readiness |
| GLBA_PRIVACY_NOTICE_ANNUAL | GLBA §6803 — annual privacy notice delivery |
| GLBA_SAFEGUARDS_ANNUAL_REVIEW | GLBA 16 CFR Part 314 §314.4 — Safeguards Rule program review |
| NAR_CODE_ETHICS_ANNUAL | NAR Code of Ethics — annual member ethics training |
| STATE_RE_LICENSE_RENEWAL | State RE Commission — license renewal + CE requirements |
| SOC2_TYPE2_RENEWAL | SOC 2 Type II — annual attestation renewal |
| ANNUAL_PENTEST | GLBA §314.4(h) — annual penetration test |
{
"name": "Fair Housing/RESPA/TRID Compliance Deadline Tracker",
"nodes": [
{
"id": "d1",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1-5"
}
]
}
},
"position": [
200,
300
]
},
{
"id": "d2",
"name": "Load Deadlines",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT deadline_type, due_date, assignee_email, last_alert_sent FROM proptech_compliance_deadlines WHERE due_date IS NOT NULL ORDER BY due_date ASC"
},
"position": [
420,
300
]
},
{
"id": "d3",
"name": "Classify Urgency",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const now = new Date();\nreturn $input.all().map(item => {\n const d = item.json;\n const due = new Date(d.due_date);\n const days = Math.ceil((due - now) / 86400000);\n const lastAlert = d.last_alert_sent ? new Date(d.last_alert_sent) : null;\n const alertedToday = lastAlert && (now - lastAlert) < 86400000;\n let urgency = null;\n if (days < 0) urgency = 'OVERDUE';\n else if (days <= 14) urgency = 'CRITICAL';\n else if (days <= 30) urgency = 'URGENT';\n else if (days <= 60) urgency = 'WARNING';\n else if (days <= 90) urgency = 'NOTICE';\n const regulationMap = {\n RESPA_SECTION_8_ANNUAL_AUDIT: 'RESPA 12 USC \u00a72607 \u2014 kickback audit trail review',\n RESPA_SECTION_10_ESCROW_ANALYSIS: 'RESPA \u00a72609 \u2014 annual escrow account analysis',\n TRID_DISCLOSURE_TIMING_AUDIT: 'TRID Reg Z \u00a71026.19(e) \u2014 3-business-day LE delivery audit',\n FAIR_HOUSING_ALGORITHM_AUDIT_ANNUAL: 'FHA 42 USC \u00a73604 \u2014 algorithm disparate impact review',\n FCRA_ADVERSE_ACTION_REVIEW_ANNUAL: 'FCRA 15 USC \u00a71681m \u2014 adverse action notice compliance audit',\n CFPB_SUPERVISORY_EXAM_PREP: 'CFPB 12 USC \u00a75512 \u2014 supervisory examination readiness',\n GLBA_PRIVACY_NOTICE_ANNUAL: 'GLBA \u00a76803 \u2014 annual privacy notice delivery',\n GLBA_SAFEGUARDS_ANNUAL_REVIEW: 'GLBA 16 CFR Part 314 \u00a7314.4 \u2014 Safeguards Rule program review',\n NAR_CODE_ETHICS_ANNUAL: 'NAR Code of Ethics \u2014 annual member ethics training',\n STATE_RE_LICENSE_RENEWAL: 'State RE Commission \u2014 license renewal + CE requirements',\n SOC2_TYPE2_RENEWAL: 'SOC 2 Type II \u2014 annual attestation renewal',\n ANNUAL_PENTEST: 'GLBA \u00a7314.4(h) \u2014 annual penetration test'\n };\n return {json: {...d, days_until_due: days, urgency, regulation: regulationMap[d.deadline_type] || d.deadline_type, skip: !urgency || alertedToday}};\n});"
},
"position": [
640,
300
]
},
{
"id": "d4",
"name": "Filter Actionable",
"type": "n8n-nodes-base.filter",
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "={{$json.skip}}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "notEquals"
}
}
]
}
},
"position": [
860,
300
]
},
{
"id": "d5",
"name": "Send Alert",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "={{$json.assignee_email}}",
"cc": "compliance@yourcompany.com",
"subject": "=[{{$json.urgency}}] {{$json.deadline_type}} due in {{$json.days_until_due}} days \u2014 {{$json.regulation}}",
"text": "=Compliance deadline alert:\\n\\nType: {{$json.deadline_type}}\\nUrgency: {{$json.urgency}}\\nDue: {{$json.due_date}} ({{$json.days_until_due}} days)\\nRegulation: {{$json.regulation}}\\n\\nAction required \u2014 update proptech_compliance_deadlines.last_alert_sent after review."
},
"position": [
1080,
300
]
},
{
"id": "d6",
"name": "Update Alert Timestamp",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "UPDATE proptech_compliance_deadlines SET last_alert_sent = NOW() WHERE deadline_type = '{{$json.deadline_type}}'"
},
"position": [
1300,
300
]
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Load Deadlines",
"type": "main",
"index": 0
}
]
]
},
"Load Deadlines": {
"main": [
[
{
"node": "Classify Urgency",
"type": "main",
"index": 0
}
]
]
},
"Classify Urgency": {
"main": [
[
{
"node": "Filter Actionable",
"type": "main",
"index": 0
}
]
]
},
"Filter Actionable": {
"main": [
[
{
"node": "Send Alert",
"type": "main",
"index": 0
}
]
]
},
"Send Alert": {
"main": [
[
{
"node": "Update Alert Timestamp",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Workflow 4: Real Estate Compliance Incident Pipeline
Webhook intake for 8 incident types with regulatory response clocks. Logs to Postgres and routes to appropriate legal/compliance teams:
| Incident Type | Clock | Regulation |
|---|---|---|
| RESPA_KICKBACK_COMPLAINT | 24h | RESPA 12 USC §2607 — CFPB + state AG |
| TRID_DISCLOSURE_TIMING_VIOLATION | 48h | Reg Z §1026.19(e) — CFPB exam trigger |
| FAIR_HOUSING_COMPLAINT | 72h | FHA 42 USC §3604 — HUD §810.810 + DOJ referral |
| FCRA_ADVERSE_ACTION_OVERDUE | 720h | FCRA 15 USC §1681m — FTC + state AG |
| GLBA_NPI_UNAUTHORIZED_DISCLOSURE | 24h | GLBA §6801 — state law + CFPB |
| DATA_BREACH_BORROWER_PII | 72h | GLBA §6801 + CFPB 12 USC §5512 + state breach laws |
| STATE_RE_LICENSE_COMPLAINT | 48h | State RE Commission — license at risk |
| ALGORITHM_DISPARATE_IMPACT_COMPLAINT | 72h | FHA §3614 — DOJ civil enforcement referral |
{
"name": "Real Estate Compliance Incident Pipeline",
"nodes": [
{
"id": "i1",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"httpMethod": "POST",
"path": "proptech-incident",
"responseMode": "onReceived",
"responseData": "={{JSON.stringify({received: true, incident_id: $json.incident_id, regulation: $json.incident_type, response_deadline_hours: {RESPA_KICKBACK_COMPLAINT: 24, TRID_DISCLOSURE_TIMING_VIOLATION: 48, FAIR_HOUSING_COMPLAINT: 72, FCRA_ADVERSE_ACTION_OVERDUE: 720, GLBA_NPI_UNAUTHORIZED_DISCLOSURE: 24, DATA_BREACH_BORROWER_PII: 72, STATE_RE_LICENSE_COMPLAINT: 48, ALGORITHM_DISPARATE_IMPACT_COMPLAINT: 72}[$json.incident_type] || 72})}}"
},
"position": [
200,
300
]
},
{
"id": "i2",
"name": "Route by Type",
"type": "n8n-nodes-base.switch",
"parameters": {
"dataPropertyName": "incident_type",
"rules": {
"rules": [
{
"value": "RESPA_KICKBACK_COMPLAINT"
},
{
"value": "TRID_DISCLOSURE_TIMING_VIOLATION"
},
{
"value": "FAIR_HOUSING_COMPLAINT"
},
{
"value": "FCRA_ADVERSE_ACTION_OVERDUE"
},
{
"value": "DATA_BREACH_BORROWER_PII"
},
{
"value": "ALGORITHM_DISPARATE_IMPACT_COMPLAINT"
}
]
}
},
"position": [
420,
300
]
},
{
"id": "i3",
"name": "Log to Postgres",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "insert",
"table": "proptech_incidents",
"columns": "incident_id,incident_type,reported_at,response_deadline_hours,status,raw_payload",
"additionalFields": {}
},
"position": [
420,
500
]
},
{
"id": "i4",
"name": "RESPA Alert",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "general-counsel@yourcompany.com",
"cc": "compliance@yourcompany.com",
"subject": "[URGENT] RESPA \u00a78(a) kickback complaint \u2014 24h CFPB response window",
"text": "=RESPA \u00a78(a) kickback complaint received.\\n\\nIncident: {{$json.incident_id}}\\nReported: {{$json.reported_at}}\\nRegulation: RESPA 12 USC \u00a72607 \u2014 kickback prohibition\\nResponse window: 24h (CFPB + state AG)\\n\\nAction: Pull RESPA \u00a78(a) audit trail from Postgres, engage outside counsel, notify state AG within 24h."
},
"position": [
640,
100
]
},
{
"id": "i5",
"name": "TRID Alert",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "compliance@yourcompany.com",
"cc": "legal@yourcompany.com",
"subject": "[URGENT] TRID \u00a71026.19(e) disclosure timing violation \u2014 48h review",
"text": "=TRID disclosure timing violation.\\n\\nIncident: {{$json.incident_id}}\\nRegulation: Reg Z \u00a71026.19(e) \u2014 3-business-day Loan Estimate delivery\\nResponse: 48h CFPB exam trigger assessment\\n\\nPull TRID disclosure timestamp audit trail from Postgres. CFPB will examine timestamp chain."
},
"position": [
640,
220
]
},
{
"id": "i6",
"name": "FHA Alert",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "general-counsel@yourcompany.com",
"cc": "compliance@yourcompany.com",
"subject": "[URGENT] Fair Housing Act \u00a73604 complaint \u2014 72h HUD response + DOJ referral risk",
"text": "=Fair Housing Act complaint received.\\n\\nIncident: {{$json.incident_id}}\\nRegulation: FHA 42 USC \u00a73604 \u2014 disparate impact / discriminatory practice\\nResponse: 72h HUD \u00a7810.810 + potential DOJ referral\\n\\nAction: Pull algorithm decision audit trail from Postgres for \u00a73614 litigation defense preparation."
},
"position": [
640,
340
]
},
{
"id": "i7",
"name": "FCRA Alert",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "compliance@yourcompany.com",
"subject": "[URGENT] FCRA \u00a71681m adverse action notice overdue \u2014 30-day clock",
"text": "=FCRA adverse action notice overdue.\\n\\nIncident: {{$json.incident_id}}\\nRegulation: FCRA 15 USC \u00a71681m \u2014 adverse action notice requirement\\nClock: 30 days from adverse action decision\\n\\nAction: Issue adverse action notice immediately, log permissible purpose chain, notify FTC + state AG."
},
"position": [
640,
460
]
},
{
"id": "i8",
"name": "Data Breach Alert",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "ciso@yourcompany.com",
"cc": "general-counsel@yourcompany.com,compliance@yourcompany.com",
"subject": "[CRITICAL] Borrower PII breach \u2014 72h CFPB + state AG notification window",
"text": "=Borrower PII data breach detected.\\n\\nIncident: {{$json.incident_id}}\\nRegulation: GLBA \u00a76801 + CFPB 12 USC \u00a75512 + state breach notification laws\\nResponse: 72h state AG notification + CFPB exam trigger\\n\\nAction: Activate breach response plan, preserve Postgres audit trail, engage outside counsel within 2h."
},
"position": [
640,
580
]
},
{
"id": "i9",
"name": "Disparate Impact Alert",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "general-counsel@yourcompany.com",
"subject": "[URGENT] FHA \u00a73604 algorithm disparate impact complaint \u2014 72h DOJ referral risk",
"text": "=Algorithm disparate impact complaint received.\\n\\nRegulation: Fair Housing Act \u00a73614 \u2014 DOJ civil enforcement / HUD referral\\nResponse: 72h\\n\\nAction: Pull algorithm decision audit trail from Postgres. Self-hosted Postgres audit trail is primary \u00a73614 litigation defense evidence."
},
"position": [
640,
700
]
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Route by Type",
"type": "main",
"index": 0
},
{
"node": "Log to Postgres",
"type": "main",
"index": 0
}
]
]
},
"Route by Type": {
"main": [
[
{
"node": "RESPA Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "TRID Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "FHA Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "FCRA Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "Data Breach Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "Disparate Impact Alert",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Workflow 5: Weekly PropTech Compliance KPI Dashboard
Runs Monday 8 AM. Queries dual Postgres tables (platform metrics by tier + compliance events). Flags subject line with [RESPA KICKBACK OPEN] / [TRID TIMING MISSED] / [FHA COMPLAINT OPEN] / [CFPB EXAM TRIGGERED]. Sends to CEO+COO with CISO BCC.
{
"name": "Weekly PropTech Compliance KPI Dashboard",
"nodes": [
{
"id": "k1",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1"
}
]
}
},
"position": [
200,
300
]
},
{
"id": "k2",
"name": "Query Platform Metrics",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT tier, COUNT(*) as customers, SUM(mrr_usd) as mrr, SUM(CASE WHEN enrolled_at > NOW() - INTERVAL '7 days' THEN mrr_usd ELSE 0 END) as new_mrr_wow FROM proptech_customers WHERE status='active' GROUP BY tier ORDER BY mrr DESC"
},
"position": [
420,
200
]
},
{
"id": "k3",
"name": "Query Compliance Events",
"type": "n8n-nodes-base.postgres",
"parameters": {
"operation": "executeQuery",
"query": "SELECT incident_type, COUNT(*) as count, MAX(reported_at) as latest FROM proptech_incidents WHERE reported_at > NOW() - INTERVAL '7 days' GROUP BY incident_type UNION ALL SELECT deadline_type as incident_type, COUNT(*) as count, MAX(due_date) as latest FROM proptech_compliance_deadlines WHERE due_date < NOW() + INTERVAL '14 days' AND status != 'completed' GROUP BY deadline_type"
},
"position": [
420,
400
]
},
{
"id": "k4",
"name": "Build KPI Report",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "const platform = $input.all().slice(0, 10).map(i => i.json);\nconst compliance = $input.all().slice(10).map(i => i.json);\nconst respaOpen = compliance.filter(c => c.incident_type === 'RESPA_KICKBACK_COMPLAINT').reduce((a,b) => a + parseInt(b.count), 0);\nconst tridMissed = compliance.filter(c => c.incident_type === 'TRID_DISCLOSURE_TIMING_VIOLATION').reduce((a,b) => a + parseInt(b.count), 0);\nconst fhaOpen = compliance.filter(c => c.incident_type?.includes('FAIR_HOUSING')).reduce((a,b) => a + parseInt(b.count), 0);\nconst cfpbFlag = compliance.filter(c => c.incident_type === 'CFPB_SUPERVISORY_EXAM_PREP').length > 0;\nconst flags = [];\nif (respaOpen > 0) flags.push('[RESPA KICKBACK OPEN]');\nif (tridMissed > 0) flags.push('[TRID TIMING MISSED]');\nif (fhaOpen > 0) flags.push('[FHA COMPLAINT OPEN]');\nif (cfpbFlag) flags.push('[CFPB EXAM TRIGGERED]');\nconst subject = flags.length ? flags.join(' ') + ' \u2014 PropTech KPI' : 'Weekly PropTech Compliance KPI';\nconst totalMRR = platform.reduce((a,b) => a + parseFloat(b.mrr || 0), 0);\nlet html = '<h2>PropTech Compliance KPI \u2014 Week Ending ' + new Date().toISOString().split('T')[0] + '</h2>';\nhtml += '<h3>Platform</h3><table border=1><tr><th>Tier</th><th>Customers</th><th>MRR</th><th>New MRR WoW</th></tr>';\nplatform.forEach(r => { html += '<tr><td>' + r.tier + '</td><td>' + r.customers + '</td><td>$' + parseFloat(r.mrr||0).toFixed(0) + '</td><td>$' + parseFloat(r.new_mrr_wow||0).toFixed(0) + '</td></tr>'; });\nhtml += '<tr><td><b>TOTAL</b></td><td></td><td><b>$' + totalMRR.toFixed(0) + '</b></td><td></td></tr></table>';\nhtml += '<h3>Compliance Events (7 days)</h3><table border=1><tr><th>Type</th><th>Count</th><th>Latest</th></tr>';\ncompliance.forEach(r => { html += '<tr><td>' + r.incident_type + '</td><td>' + r.count + '</td><td>' + (r.latest || '') + '</td></tr>'; });\nhtml += '</table>';\nreturn [{json: {subject, html_body: html}}];"
},
"position": [
640,
300
]
},
{
"id": "k5",
"name": "Send KPI Email",
"type": "n8n-nodes-base.sendEmail",
"parameters": {
"to": "ceo@yourcompany.com",
"cc": "coo@yourcompany.com",
"bcc": "ciso@yourcompany.com",
"subject": "={{$json.subject}}",
"html": "={{$json.html_body}}"
},
"position": [
860,
300
]
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Query Platform Metrics",
"type": "main",
"index": 0
},
{
"node": "Query Compliance Events",
"type": "main",
"index": 0
}
]
]
},
"Query Platform Metrics": {
"main": [
[
{
"node": "Build KPI Report",
"type": "main",
"index": 0
}
]
]
},
"Query Compliance Events": {
"main": [
[
{
"node": "Build KPI Report",
"type": "main",
"index": 0
}
]
]
},
"Build KPI Report": {
"main": [
[
{
"node": "Send KPI Email",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Why Self-Host n8n for PropTech Compliance?
| Regulation | Self-Hosting Argument |
|---|---|
| RESPA §8(a) kickback prohibition (12 USC §2607) | Cloud iPaaS creates third-party referral fee data trail that CFPB can subpoena under 12 USC §5512 examination authority. Self-hosted n8n processes referral routing in your perimeter — no subpoena exposure to vendor. |
| TRID §1026.19(e) 3-business-day disclosure clock | If cloud iPaaS has an outage during the Loan Estimate delivery window, the clock doesn't stop — CFPB enforcement exposure. Self-hosted infrastructure = no third-party SLA dependency in disclosure pipeline. |
| Fair Housing Act §3604 disparate impact | Algorithm output routing through cloud iPaaS means decision trails are visible to cloud vendor. Postgres (on-premise) audit trail supports DOJ/HUD §3614 disparate impact litigation defense. |
| FCRA §1681m adverse action notice | 30-day clock + permissible purpose chain. Self-hosted preserves complete adverse action audit trail without cloud vendor exposure. |
| GLBA Safeguards Rule 16 CFR Part 314 | §314.4(f) requires service provider oversight assessment. Self-hosted n8n is not a third-party service provider — removes it from annual vendor risk assessment and SOC 2 attestation review cycle. |
Buyer Q&A
Q: Does n8n appear in our RESPA §8(a) referral tracking chain?
RESPA §8(a) prohibits kickbacks for referrals of settlement service business (12 USC §2607). Self-hosted n8n processes referral routing internally — no third-party vendor in the referral data chain. Cloud iPaaS (Zapier/Make) creates a subpoena-accessible third-party data trail reachable under CFPB 12 USC §5512 examination authority.
Q: What if n8n goes down during a TRID 3-business-day disclosure window?
Vendor SLA risk: if cloud iPaaS has an outage during the Regulation Z §1026.19(e) Loan Estimate delivery window, the clock doesn't stop — CFPB enforcement exposure. Self-hosted infrastructure means the disclosure pipeline is under your operational control with no dependency on third-party SLA.
Q: How does n8n handle Fair Housing Act §3604 algorithm audit?
Algorithm output logging to Postgres (on-premise) means decision audit trails are in your infrastructure perimeter — supporting DOJ/HUD §3614 disparate impact litigation defense. Cloud routing creates algorithm decision trails visible to the cloud vendor, which complicates privilege assertions.
Q: Do FCRA §1681m adverse action notices go through n8n?
FCRA §1681m requires prompt adverse action notice with reason disclosure. Self-hosted n8n handles notice generation and logging within your perimeter. If cloud platform processes tenant screening data, it enters consumer reporting agency definition risk (15 USC §1681a(f)).
Q: What's the GLBA Safeguards Rule implication for n8n?
GLBA 16 CFR Part 314 §314.4(f) requires financial institutions to assess and oversee service providers. Self-hosted n8n is not a third-party service provider — removes it from annual vendor risk assessment scope and the SOC 2 attestation review cycle that cloud iPaaS vendors trigger.
All 5 workflows are free. Import the JSON directly into n8n.
Full n8n automation template store (paid templates, bundles): stripeai.gumroad.com
Top comments (0)