DEV Community

Alex Kane
Alex Kane

Posted on

n8n for Debt Collection/FinTech SaaS Vendors: 5 Automations for FDCPA Regulation F, CFPB UDAAP, and TCPA Compliance

Debt collection SaaS companies operate under some of the most aggressive federal and state enforcement regimes in financial services. The FDCPA 5-day validation notice clock starts the moment your platform transmits the first communication. Regulation F's 7-in-7 call cap runs per-consumer per-creditor per-week — not per-account. A missed cease-communication acknowledgment is an IMMEDIATE FDCPA §1692c(c) violation. And the TCPA one-to-one consent rule (FCC 23-107, effective January 27, 2025) means a single texted consent form cannot cover multiple collection campaigns.

This post covers 5 n8n workflow templates built for debt collection SaaS vendors — the companies building the platforms, not just the collectors using them. All workflows include import-ready JSON you can drop into any n8n instance.


Why Self-Hosted n8n for DebtTech SaaS

When your platform routes debtor PII, account numbers, payment history, and cease-communication requests through a cloud iPaaS like Zapier or Make, you inherit a third-party data processor liability chain under CCPA CPRA (financial data = sensitive PI, 15-business-day response window), NY FDCPA Gen Bus Law §601, CA Rosenthal Act, and IL Collection Agency Act. A cloud automation vendor in your compliance workflow is a CC9.2 SOC 2 vendor risk finding. Self-hosted n8n keeps debtor PII and compliance event data in your own VPC — git-versioned workflows are your audit trail for CFPB examination.


Workflow 1: New Collections Platform Customer Onboarding Drip

Trigger: Webhook — new customer created event

What it does:
Segments incoming customers by tier and injects compliance flags into every email — Day 0 welcome, Day 3 FDCPA walkthrough, Day 7 integration check-in.

Customer Tiers:

  • LARGE_DEBT_BUYER_SAAS — FDCPA §1692a(6), CFPB Supervision, FCRA §623, Reg F 7-in-7 cap, TCPA one-to-one, CCPA CPRA sensitive PI
  • FIRST_PARTY_COLLECTIONS_SAAS — FDCPA §1692a(6)(F) creditor exemption nuance, CFPB UDAAP, TCPA, state mini-FDCPA
  • THIRD_PARTY_COLLECTIONS_SAAS — Full FDCPA, Reg F §1006.14 7-in-7, mini-Miranda §1692e(11), validation notice §1692g
  • MEDICAL_DEBT_COLLECTIONS_SAAS — FDCPA, No Surprises Act, HIPAA minimum necessary, CFPB medical debt credit reporting rule
  • STUDENT_LOAN_SERVICER_SAAS — HEA §484A income-driven repayment, PSLF tracking, CFPB student loan supervision
  • MORTGAGE_COLLECTIONS_SAAS — RESPA §2605 QWR 20-day/60-day, TILA §1026.41 periodic statements, FDCPA §1692f(6)
  • DEBTTECH_STARTUP_SAAS — Full compliance stack, SOC 2 Type II roadmap, state licensing cascade (49 states)
{
  "name": "DebtTech - Customer Onboarding Drip",
  "nodes": [
    {
      "id": "1",
      "type": "n8n-nodes-base.webhook",
      "name": "New Customer Webhook",
      "parameters": {
        "path": "debttech-onboarding",
        "httpMethod": "POST"
      }
    },
    {
      "id": "2",
      "type": "n8n-nodes-base.code",
      "name": "Segment & Compliance Flags",
      "parameters": {
        "jsCode": "const d = $input.first().json; const tier = d.customer_tier || 'DEBTTECH_STARTUP_SAAS'; const flags = {LARGE_DEBT_BUYER_SAAS: 'FDCPA \u00a71692a(6)/CFPB Supervision/FCRA \u00a7623/Reg F 7-in-7/TCPA one-to-one/CCPA CPRA', FIRST_PARTY_COLLECTIONS_SAAS: 'FDCPA \u00a71692a(6)(F) creditor exemption/CFPB UDAAP/TCPA/state mini-FDCPA', THIRD_PARTY_COLLECTIONS_SAAS: 'FDCPA full/Reg F \u00a71006.14 7-in-7/mini-Miranda \u00a71692e(11)/validation \u00a71692g', MEDICAL_DEBT_COLLECTIONS_SAAS: 'FDCPA/No Surprises Act/HIPAA minimum necessary/CFPB medical debt rule', STUDENT_LOAN_SERVICER_SAAS: 'HEA \u00a7484A/PSLF tracking/CFPB student loan supervision', MORTGAGE_COLLECTIONS_SAAS: 'RESPA \u00a72605 QWR/TILA \u00a71026.41/FDCPA \u00a71692f(6)', DEBTTECH_STARTUP_SAAS: 'FDCPA full stack/SOC2 roadmap/49-state licensing'}; return [{json: {...d, tier, compliance_note: flags[tier] || flags.DEBTTECH_STARTUP_SAAS, ts: new Date().toISOString()}}];"
      }
    },
    {
      "id": "3",
      "type": "n8n-nodes-base.gmail",
      "name": "Day 0 Welcome Email",
      "parameters": {
        "to": "={{$json.contact_email}}",
        "subject": "Welcome to FlowKit \u2014 FDCPA/Reg F Compliance Checklist Inside",
        "message": "Welcome {{$json.company_name}}. Tier: {{$json.tier}}. Key compliance note: {{$json.compliance_note}}. Your self-hosted n8n instance keeps all debtor PII and cease-communication events in your VPC \u2014 git-versioned audit trail for CFPB examination."
      }
    },
    {
      "id": "4",
      "type": "n8n-nodes-base.googleSheets",
      "name": "Log Onboarding",
      "parameters": {
        "operation": "append",
        "sheetId": "SHEET_ID",
        "range": "Onboarding!A:F",
        "values": [
          [
            "={{$json.company_name}}",
            "={{$json.tier}}",
            "={{$json.contact_email}}",
            "day0_sent",
            "={{$json.ts}}",
            "={{$json.compliance_note}}"
          ]
        ]
      }
    },
    {
      "id": "5",
      "type": "n8n-nodes-base.wait",
      "name": "Wait 3 Days",
      "parameters": {
        "amount": 3,
        "unit": "days"
      }
    },
    {
      "id": "6",
      "type": "n8n-nodes-base.gmail",
      "name": "Day 3 FDCPA Walkthrough",
      "parameters": {
        "to": "={{$json.contact_email}}",
        "subject": "FDCPA Regulation F Automation Walkthrough \u2014 5-Day Validation Clock + 7-in-7 Cap",
        "message": "Day 3 check-in for {{$json.company_name}}. The FDCPA \u00a71692g 5-day validation notice clock starts the moment your first communication is transmitted \u2014 our workflow captures the exact timestamp and routes to your compliance queue. Reg F 7-in-7 call cap: tracked per-consumer per-creditor per-week. Reply if you have integration questions."
      }
    },
    {
      "id": "7",
      "type": "n8n-nodes-base.wait",
      "name": "Wait 4 Days",
      "parameters": {
        "amount": 4,
        "unit": "days"
      }
    },
    {
      "id": "8",
      "type": "n8n-nodes-base.gmail",
      "name": "Day 7 Integration Check-In",
      "parameters": {
        "to": "={{$json.contact_email}}",
        "subject": "Week 1 Check-In \u2014 CFPB Audit Trail & Cease-Communication Automation Ready?",
        "message": "One week in, {{$json.company_name}}. Key milestone: is your cease-communication webhook endpoint live? FDCPA \u00a71692c(c) requires IMMEDIATE acknowledgment \u2014 no queue delay. Book a 30-min setup call if you haven't configured the cease-comm pipeline yet."
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Workflow 2: Regulation F 7-in-7 Call Cap Monitor

Trigger: Every 30 minutes (Schedule)

What it does:
Queries your call log database for each active account. Regulation F §1006.14(b)(2)(i): a debt collector cannot call more than 7 times within 7 consecutive days per consumer per debt. This workflow flags accounts approaching the cap before violation occurs.

{
  "name": "DebtTech - Reg F 7-in-7 Call Cap Monitor",
  "nodes": [
    {
      "id": "1",
      "type": "n8n-nodes-base.scheduleTrigger",
      "name": "Every 30 Min",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 30
            }
          ]
        }
      }
    },
    {
      "id": "2",
      "type": "n8n-nodes-base.postgres",
      "name": "Query Call Logs",
      "parameters": {
        "query": "SELECT consumer_id, creditor_id, COUNT(*) as calls_7d, MAX(call_timestamp) as last_call FROM call_logs WHERE call_timestamp >= NOW() - INTERVAL '7 days' AND call_outcome != 'CEASED_COMMUNICATION' GROUP BY consumer_id, creditor_id HAVING COUNT(*) >= 5 ORDER BY calls_7d DESC LIMIT 200"
      }
    },
    {
      "id": "3",
      "type": "n8n-nodes-base.code",
      "name": "Classify Cap Proximity",
      "parameters": {
        "jsCode": "return $input.all().map(item => { const c = item.json; const calls = parseInt(c.calls_7d); let status = calls >= 7 ? 'CAP_REACHED_VIOLATION_RISK' : calls === 6 ? 'ONE_CALL_REMAINING' : 'APPROACHING_CAP'; return {json: {...c, status, regulation: 'Reg F \u00a71006.14(b)(2)(i) 7-in-7 per-consumer per-creditor per-7-days', penalty: 'FDCPA \u00a71692k $1,000/violation, class action up to $500K or 1% net worth', ts: new Date().toISOString()}}; });"
      }
    },
    {
      "id": "4",
      "type": "n8n-nodes-base.if",
      "name": "CAP_REACHED?",
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json.status}}",
              "operation": "equals",
              "value2": "CAP_REACHED_VIOLATION_RISK"
            }
          ]
        }
      }
    },
    {
      "id": "5",
      "type": "n8n-nodes-base.slack",
      "name": "Slack Urgent - Cap Reached",
      "parameters": {
        "channel": "#fdcpa-compliance-urgent",
        "text": "VIOLATION RISK: Consumer {{$json.consumer_id}} / Creditor {{$json.creditor_id}} \u2014 {{$json.calls_7d}} calls in 7 days. Reg F \u00a71006.14 cap = 7. {{$json.regulation}}. BLOCK all outbound calls for this account NOW."
      }
    },
    {
      "id": "6",
      "type": "n8n-nodes-base.slack",
      "name": "Slack Warning - Approaching",
      "parameters": {
        "channel": "#fdcpa-compliance-watch",
        "text": "CAP PROXIMITY: Consumer {{$json.consumer_id}} / Creditor {{$json.creditor_id}} \u2014 {{$json.calls_7d}}/7 calls used this week. Last call: {{$json.last_call}}. Status: {{$json.status}}. Review before next outbound attempt."
      }
    },
    {
      "id": "7",
      "type": "n8n-nodes-base.postgres",
      "name": "Log Cap Events",
      "parameters": {
        "query": "INSERT INTO reg_f_cap_log (consumer_id, creditor_id, calls_7d, status, ts) VALUES ('{{$json.consumer_id}}', '{{$json.creditor_id}}', {{$json.calls_7d}}, '{{$json.status}}', '{{$json.ts}}') ON CONFLICT (consumer_id, creditor_id, date_trunc('day', NOW())) DO UPDATE SET calls_7d = EXCLUDED.calls_7d, status = EXCLUDED.status"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Workflow 3: FDCPA/CFPB/TCPA Compliance Deadline Tracker

Trigger: Weekdays at 7:00 AM

What it does:
Reads a compliance calendar from Google Sheets or Postgres and fires tiered alerts for 14 regulatory deadlines unique to debt collection SaaS.

14 Deadline Types:

Type Regulation Window
FDCPA_VALIDATION_NOTICE §1692g — 5 business days after first communication 5 biz days
FDCPA_DISPUTE_WINDOW_CLOSE §1692g(b) — 30-day consumer dispute deadline 30 days
REG_F_CEASE_COMM_ACK §1006.6(c)(1) — IMMEDIATE upon receipt IMMEDIATE
TCPA_ONE_TO_ONE_AUDIT FCC 23-107 — quarterly consent record audit Quarterly
CFPB_EXAM_PREP CFPB Supervision — annual readiness review Annual
STATE_LICENSE_RENEWAL 49-state collection agency license 60-120 days before expiry
CCPA_CPRA_DSR_RESPONSE §1798.130 financial data = sensitive PI 15 biz days
NY_FDCPA_ANNUAL_REPORT Gen Bus Law §601 Annual
CA_ROSENTHAL_AUDIT CA RFDCPA — annual internal audit Annual
IL_COLLECTION_LICENSE IL Collection Agency Act 225 ILCS 425 Annual
FCRA_FURNISHER_ACCURACY §623(a) — monthly dispute response window 30 days
HIPAA_DEBT_MINNOTICE If medical debt: 45 CFR §164.524 30 days
SOC2_TYPE2_RENEWAL Annual re-certification Annual
ANNUAL_PENTEST PCI DSS v4.0 Req 11.3 / CFPB exam prep Annual

Workflow 4: FDCPA Cease-Communication & Dispute Handling Pipeline

Trigger: Webhook — collections event endpoint

What it does:
The most legally sensitive workflow in debt collection tech. FDCPA §1692c(c): when a consumer notifies the collector in writing to cease communication, the only permitted contacts after that are (1) advising no further contact will be made, (2) notifying of specific remedies such as suit. This pipeline handles the full event chain — cease-comm, validation request, dispute, payment, legal referral.

8 Event Types:

  • CEASE_COMMUNICATION_RECEIVED — FDCPA §1692c(c): IMMEDIATE Slack to compliance + hold queue + Postgres audit trail. No further outbound except final notice.
  • VALIDATION_NOTICE_REQUIRED — §1692g: 5-day clock starts at first communication. Stamp timestamp, route to notice queue.
  • CONSUMER_DISPUTE_FILED — §1692g(b): collector must cease collection until validation provided. IMMEDIATE hold.
  • VALIDATION_PERIOD_EXPIRED — 30-day dispute window closed without dispute: resume normal collection cadence, log.
  • PAYMENT_RECEIVED — Update balance, log payment method, if zero balance trigger account close, FCRA Metro 2 update.
  • LEGAL_REFERRAL — §1692e(5): threat of suit must be lawful + intended. Log referral date, attorney name, jurisdiction.
  • MINI_MIRANDA_REQUIRED — §1692e(11) Reg F §1006.18(e): every communication must contain 'This is an attempt to collect a debt' disclosure. Flag missing disclosure in outbound queue.
  • TCPA_CONSENT_REVOKED — FCC 23-107 one-to-one: revocation is IMMEDIATE, applies to all campaigns using that consent record.
{
  "name": "DebtTech - FDCPA Cease-Comm & Dispute Pipeline",
  "nodes": [
    {
      "id": "1",
      "type": "n8n-nodes-base.webhook",
      "name": "Collections Event Webhook",
      "parameters": {
        "path": "debttech-collections-event",
        "httpMethod": "POST"
      }
    },
    {
      "id": "2",
      "type": "n8n-nodes-base.code",
      "name": "Parse & Classify Event",
      "parameters": {
        "jsCode": "const d = $input.first().json; const deadlines = {CEASE_COMMUNICATION_RECEIVED: {window: 'IMMEDIATE', regulation: 'FDCPA \u00a71692c(c)', action: 'HALT_ALL_COLLECTION \u2014 only permitted contacts: no-further-contact notice, legal remedy notification'}, VALIDATION_NOTICE_REQUIRED: {window: '5 business days from first communication', regulation: 'FDCPA \u00a71692g', action: 'SEND_VALIDATION_NOTICE \u2014 debt amount, creditor name, dispute rights'}, CONSUMER_DISPUTE_FILED: {window: 'IMMEDIATE collection halt until validation provided', regulation: 'FDCPA \u00a71692g(b)', action: 'CEASE_COLLECTION_PENDING_VALIDATION'}, VALIDATION_PERIOD_EXPIRED: {window: '30 days elapsed, no dispute', regulation: 'FDCPA \u00a71692g', action: 'RESUME_COLLECTION_CADENCE'}, PAYMENT_RECEIVED: {window: 'Same business day', regulation: 'FCRA \u00a7623 Metro 2', action: 'UPDATE_BALANCE_METRO2_FLAG'}, LEGAL_REFERRAL: {window: 'Document referral date + attorney', regulation: 'FDCPA \u00a71692e(5)', action: 'LOG_REFERRAL_JURISDICTION'}, MINI_MIRANDA_REQUIRED: {window: 'EVERY communication', regulation: 'FDCPA \u00a71692e(11) / Reg F \u00a71006.18(e)', action: 'FLAG_MISSING_DISCLOSURE_IN_QUEUE'}, TCPA_CONSENT_REVOKED: {window: 'IMMEDIATE across all campaigns', regulation: 'FCC 23-107 one-to-one TCPA', action: 'REVOKE_CONSENT_ALL_CAMPAIGNS'}}; const info = deadlines[d.event_type] || {window: 'REVIEW', regulation: 'FDCPA', action: 'MANUAL_REVIEW'}; return [{json: {...d, ...info, event_id: d.event_id || 'EVT-' + Date.now(), ts: new Date().toISOString()}}];"
      }
    },
    {
      "id": "3",
      "type": "n8n-nodes-base.switch",
      "name": "Route by Event Type",
      "parameters": {
        "dataType": "string",
        "value1": "={{$json.event_type}}",
        "rules": {
          "rules": [
            {
              "value2": "CEASE_COMMUNICATION_RECEIVED",
              "output": 0
            },
            {
              "value2": "CONSUMER_DISPUTE_FILED",
              "output": 1
            },
            {
              "value2": "TCPA_CONSENT_REVOKED",
              "output": 2
            }
          ]
        },
        "fallbackOutput": 3
      }
    },
    {
      "id": "4",
      "type": "n8n-nodes-base.slack",
      "name": "Slack Urgent - Cease Comm",
      "parameters": {
        "channel": "#fdcpa-compliance-urgent",
        "text": "CEASE-COMM RECEIVED: Account {{$json.account_id}} / Consumer {{$json.consumer_id}}. {{$json.regulation}}. {{$json.action}}. Received: {{$json.ts}}. HALT ALL OUTBOUND IMMEDIATELY. Log in Postgres audit_trail."
      }
    },
    {
      "id": "5",
      "type": "n8n-nodes-base.slack",
      "name": "Slack Urgent - Dispute",
      "parameters": {
        "channel": "#fdcpa-compliance-urgent",
        "text": "DISPUTE FILED: Account {{$json.account_id}}. {{$json.regulation}} \u2014 {{$json.action}}. Validation must be provided before collection resumes. Window: {{$json.window}}."
      }
    },
    {
      "id": "6",
      "type": "n8n-nodes-base.slack",
      "name": "Slack Urgent - TCPA Revoke",
      "parameters": {
        "channel": "#tcpa-compliance",
        "text": "TCPA CONSENT REVOKED: Consumer {{$json.consumer_id}}. FCC 23-107 one-to-one \u2014 revocation is IMMEDIATE across ALL campaigns using this consent record. Consumer ID: {{$json.consumer_id}}. Action: {{$json.action}}."
      }
    },
    {
      "id": "7",
      "type": "n8n-nodes-base.slack",
      "name": "Slack Standard Event",
      "parameters": {
        "channel": "#collections-compliance-log",
        "text": "Collections event: {{$json.event_type}} \u2014 Account {{$json.account_id}}. {{$json.regulation}}. Window: {{$json.window}}. Action: {{$json.action}}."
      }
    },
    {
      "id": "8",
      "type": "n8n-nodes-base.postgres",
      "name": "Audit Trail Log",
      "parameters": {
        "query": "INSERT INTO collections_audit_trail (event_id, account_id, consumer_id, event_type, regulation, action_required, window, ts) VALUES ('{{$json.event_id}}', '{{$json.account_id}}', '{{$json.consumer_id}}', '{{$json.event_type}}', '{{$json.regulation}}', '{{$json.action}}', '{{$json.window}}', '{{$json.ts}}')"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Workflow 5: Weekly DebtTech SaaS Platform KPI Dashboard

Trigger: Every Monday at 7:30 AM

What it does:
Pulls platform metrics from Postgres, computes WoW% changes, and emails a compliance-weighted HTML dashboard to the CEO and CCO. The compliance officer BCC is intentional — it closes the governance gap between product metrics and regulatory exposure in a single weekly touchpoint.

Metrics tracked:

  • MRR and WoW% change (flagged if drop >5%)
  • Active platform customers by tier (LARGE_DEBT_BUYER / THIRD_PARTY / MEDICAL / etc.)
  • Accounts processed this week across all customers
  • Open cease-communication holds (FDCPA §1692c(c) — any number >0 is a risk flag)
  • Pending validation notice queue (§1692g 5-day clock items)
  • Active disputes (§1692g(b) — collection halted)
  • Reg F 7-in-7 cap violations this week (goal: 0)
  • TCPA consent revocations processed (FCC 23-107)
  • CFPB examination readiness score (1-100, from compliance checklist table)
  • Open state license renewals ≤60 days
{
  "name": "DebtTech - Weekly KPI Dashboard",
  "nodes": [
    {
      "id": "1",
      "type": "n8n-nodes-base.scheduleTrigger",
      "name": "Monday 7:30 AM",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "30 7 * * 1"
            }
          ]
        }
      }
    },
    {
      "id": "2",
      "type": "n8n-nodes-base.postgres",
      "name": "Query Platform Metrics",
      "parameters": {
        "query": "SELECT COUNT(DISTINCT customer_id) as active_customers, SUM(mrr_usd) as total_mrr, SUM(accounts_processed_7d) as accounts_week, SUM(cease_comm_holds_open) as cease_comm_open, SUM(validation_notices_pending) as validation_pending, SUM(active_disputes) as disputes_open, SUM(reg_f_violations_7d) as reg_f_violations, SUM(tcpa_revocations_7d) as tcpa_revocations, AVG(cfpb_readiness_score) as avg_cfpb_score FROM platform_metrics WHERE metric_date = CURRENT_DATE"
      }
    },
    {
      "id": "3",
      "type": "n8n-nodes-base.postgres",
      "name": "Query Prior Week",
      "parameters": {
        "query": "SELECT SUM(mrr_usd) as prior_mrr, SUM(accounts_processed_7d) as prior_accounts FROM platform_metrics WHERE metric_date = CURRENT_DATE - INTERVAL '7 days'"
      }
    },
    {
      "id": "4",
      "type": "n8n-nodes-base.merge",
      "name": "Merge Metrics",
      "parameters": {
        "mode": "mergeByIndex"
      }
    },
    {
      "id": "5",
      "type": "n8n-nodes-base.code",
      "name": "Build HTML Dashboard",
      "parameters": {
        "jsCode": "const c = $input.first().json; const mrrWoW = c.prior_mrr > 0 ? (((c.total_mrr - c.prior_mrr) / c.prior_mrr) * 100).toFixed(1) : 'N/A'; const mrrFlag = parseFloat(mrrWoW) < -5 ? ' \u26a0\ufe0f DROP >5%' : ''; const riskFlags = []; if (parseInt(c.cease_comm_open) > 0) riskFlags.push('CEASE-COMM HOLDS OPEN: ' + c.cease_comm_open + ' (FDCPA \u00a71692c(c))'); if (parseInt(c.reg_f_violations) > 0) riskFlags.push('REG F 7-IN-7 VIOLATIONS: ' + c.reg_f_violations + ' THIS WEEK'); if (parseInt(c.disputes_open) > 0) riskFlags.push('ACTIVE DISPUTES (collection halted): ' + c.disputes_open); const html = '<h2>DebtTech SaaS \u2014 Weekly Platform Dashboard</h2><table border=1 cellpadding=5><tr><th>Metric</th><th>Value</th></tr><tr><td>Total MRR</td><td>$' + (c.total_mrr||0) + ' (WoW: ' + mrrWoW + '%' + mrrFlag + ')</td></tr><tr><td>Active Customers</td><td>' + (c.active_customers||0) + '</td></tr><tr><td>Accounts Processed (7d)</td><td>' + (c.accounts_week||0) + '</td></tr><tr><td>Cease-Comm Holds Open</td><td>' + (c.cease_comm_open||0) + '</td></tr><tr><td>Validation Notices Pending</td><td>' + (c.validation_pending||0) + '</td></tr><tr><td>Active Disputes</td><td>' + (c.disputes_open||0) + '</td></tr><tr><td>Reg F Violations (7d)</td><td>' + (c.reg_f_violations||0) + ' (target: 0)</td></tr><tr><td>TCPA Revocations (7d)</td><td>' + (c.tcpa_revocations||0) + '</td></tr><tr><td>CFPB Readiness Score</td><td>' + (c.avg_cfpb_score||0) + '/100</td></tr></table>' + (riskFlags.length ? '<h3>\u26a0\ufe0f Risk Flags</h3><ul>' + riskFlags.map(f => '<li>' + f + '</li>').join('') + '</ul>' : '<p>No active risk flags.</p>'); return [{json: {html, summary: 'MRR $' + (c.total_mrr||0) + ' | WoW ' + mrrWoW + '% | Cease-comm: ' + (c.cease_comm_open||0) + ' | Reg F violations: ' + (c.reg_f_violations||0) + ' | CFPB score: ' + (c.avg_cfpb_score||0) + '/100', ts: new Date().toISOString()}}];"
      }
    },
    {
      "id": "6",
      "type": "n8n-nodes-base.gmail",
      "name": "Email CEO + CCO",
      "parameters": {
        "to": "ceo@company.com",
        "bcc": "cco@company.com",
        "subject": "DebtTech Platform KPI \u2014 Week of {{$json.ts.substring(0,10)}}",
        "message": "={{$json.html}}",
        "options": {
          "bodyContentType": "html"
        }
      }
    },
    {
      "id": "7",
      "type": "n8n-nodes-base.slack",
      "name": "Slack One-Liner",
      "parameters": {
        "channel": "#management",
        "text": "Weekly KPI: {{$json.summary}}"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Quick Comparison: n8n vs Zapier/Make for Debt Collection SaaS

Factor Self-Hosted n8n Zapier / Make
Debtor PII routing Stays in your VPC Flows through US cloud vendor
Cease-comm audit trail Git-versioned JSON, on-prem Third-party vendor logs
CFPB examination Show workflow JSON = evidence 'We use Zapier' = CC9.2 finding
FDCPA §1692c(c) latency Sub-second webhook processing Minutes of cloud queue delay
Reg F 7-in-7 enforcement Custom Postgres query, real-time Pre-built Zapier step, no custom SQL
State license tracking Custom deadline table, any field Limited to fixed-field templates
TCPA consent log Your database, your schema Vendor DB, data portability risk
Per-month cost at scale ~$20/month VPS $599-$999+/month

Get the Complete DebtTech Workflow Pack

All 5 workflows above — plus 9 more for debt collection SaaS ops — are available as a single import-ready pack at stripeai.gumroad.com.

Individual templates: $12–$29. Full automation bundle (14 workflows): $97.

Questions about FDCPA/Reg F n8n implementation? Drop a comment below.

Top comments (0)