DEV Community

Alex Kane
Alex Kane

Posted on

n8n for TelecomTech SaaS Vendors: 5 Automations for FCC CPNI, CALEA, STIR-SHAKEN, E911, and TCPA Compliance

If you sell SaaS to telecommunications carriers, MVNOs, UCaaS platforms, or any business routing phone calls and texts, you operate inside one of the most legally dense compliance stacks in technology.

The FCC doesn't send warning letters before fining. The CPNI clock starts when a breach is discovered — not when it's reported. CALEA lawful intercept demands are immediate by definition. TCPA class actions are filed the same day consent records fail.

This is the stack you're managing for your customers — and the automations that handle it.


The Regulatory Stack for TelecomTech SaaS

FCC CPNI (47 CFR §64.2009): Customer Proprietary Network Information is arguably the most strictly enforced privacy rule in US telecommunications. Section 64.2009(e) prohibits disclosure of CPNI to third parties without express customer approval. The FCC has interpreted "third party" broadly — including cloud subprocessors routing CPNI records through their infrastructure. Civil forfeiture: $100,000 per day per violation. Criminal referral: available.

CALEA (18 USC §2522): The Communications Assistance for Law Enforcement Act requires telecommunications carriers to maintain lawful intercept capability on-demand. There is no grace period on a CALEA demand — law enforcement expects carrier-grade intercept capability available immediately. Failure to comply triggers a court order within 90 days, with civil penalties accruing daily.

STIR-SHAKEN (FCC Order 20-48): Real-time call authentication attestation is required per call, not per day or per week. Attestation failure results in gateway blocking — your customers' calls don't complete. The attestation obligation is continuous.

E911 / Kari's Law (47 CFR §9.3): Multi-line telephone system (MLTS) vendors — UCaaS, hosted PBX, contact center — must enable direct 911 dialing and automatic notification. Kari's Law violations are an FCC enforcement priority. There is no minimum size threshold.

TCPA (47 USC §227): The Telephone Consumer Protection Act creates per-call statutory damages ($500–$1,500) and an unlimited class action window. Consent records are the only defense. A consent lookup API failure during an outbound campaign creates per-call exposure in real time.


The Self-Hosting Argument for TelecomTech SaaS

The sharpest compliance argument for self-hosted n8n in this vertical is FCC §64.2009(e):

"A telecommunications carrier may not use, disclose, or permit access to individually identifiable CPNI in its possession by a third party..."

When your automation layer is a cloud iPaaS — Zapier, Make, n8n Cloud — that platform's employees and infrastructure have access to the data flowing through it. Under FCC interpretation, that access constitutes disclosure to a third party. The $100,000/day civil forfeiture does not require a breach. The disclosure is the violation.

Self-hosted n8n inside your network perimeter eliminates the third-party relationship. The automation layer is part of your infrastructure, not a vendor with access to CPNI.

Secondary argument: CALEA. If your automation layer processes communications metadata or routing data for CALEA-covered carriers, cloud iPaaS introduces a third-party into the intercept chain. Self-hosted n8n stays inside the CALEA perimeter.


5 n8n Automations for TelecomTech SaaS Vendors

1. Tier-Segmented Customer Onboarding (CPNI / CALEA / STIR-SHAKEN Context)

Carrier customers need immediate CPNI compliance context. MVNO customers need STIR-SHAKEN attestation setup. UCaaS customers need E911/Kari's Law audit reminders. One generic onboarding email serves none of them.

This workflow classifies incoming customers into seven tiers and injects the correct regulatory context on Day 0, Day 3, and Day 7:

{
  "name": "TelecomTech SaaS \u2014 Tier-Segmented Customer Onboarding Drip",
  "nodes": [
    {
      "parameters": {
        "path": "telecom-onboarding",
        "responseMode": "responseNode"
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "\nconst d = $json;\nconst tiers = {\n  'ENTERPRISE_CARRIER_SAAS': { cpni: true, calea: true, stirshaken: true, e911: false, tcpa: true, priority: 'ENTERPRISE' },\n  'MVNO_PLATFORM_VENDOR':    { cpni: true, calea: false, stirshaken: true, e911: false, tcpa: true, priority: 'MVNO' },\n  'UCaaS_CCaaS_VENDOR':      { cpni: true, calea: false, stirshaken: true, e911: true, tcpa: true, priority: 'UCaaS' },\n  'STIR_SHAKEN_VENDOR':      { cpni: false, calea: false, stirshaken: true, e911: false, tcpa: false, priority: 'STIR' },\n  'E911_MLTS_VENDOR':        { cpni: false, calea: false, stirshaken: false, e911: true, tcpa: false, priority: 'E911' },\n  'WHOLESALE_VOIP_VENDOR':   { cpni: true, calea: true, stirshaken: true, e911: false, tcpa: false, priority: 'VOIP' },\n  'TELECOM_ANALYTICS_SAAS':  { cpni: true, calea: false, stirshaken: false, e911: false, tcpa: false, priority: 'ANALYTICS' }\n};\nconst t = tiers[d.customer_tier] || tiers['UCaaS_CCaaS_VENDOR'];\nreturn { json: { ...d, ...t, tier: d.customer_tier || 'UCaaS_CCaaS_VENDOR' } };\n"
      },
      "name": "Tier Classifier",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{$json[\"cpni\"]}}",
              "value2": true
            }
          ]
        }
      },
      "name": "CPNI Subject?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "fromEmail": "alex@flowkithq.com",
        "toEmail": "={{$json[\"email\"]}}",
        "subject": "FCC CPNI compliance context for {{$json[\"company_name\"]}}",
        "text": "Welcome to FlowKit. Your platform tier ({{$json[\"tier\"]}}) is subject to FCC CPNI rules under 47 CFR \u00a764.2009. Key obligation: cloud iPaaS routing CPNI records = unauthorized disclosure to a third party under \u00a764.2009(e) = $100,000/day civil forfeiture exposure. Self-hosted n8n keeps CPNI inside your network perimeter. Your deadline tracker is active."
      },
      "name": "CPNI Day-0 Brief",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        850,
        200
      ]
    },
    {
      "parameters": {
        "fromEmail": "alex@flowkithq.com",
        "toEmail": "={{$json[\"email\"]}}",
        "subject": "Your FlowKit automation suite is active",
        "text": "Welcome to FlowKit ({{$json[\"tier\"]}} tier). Your compliance deadline tracker and incident pipeline are running. Store: https://stripeai.gumroad.com"
      },
      "name": "Standard Day-0",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        850,
        400
      ]
    },
    {
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{$json[\"calea\"]}}",
              "value2": true
            }
          ]
        }
      },
      "name": "CALEA Subject?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        1050,
        200
      ]
    },
    {
      "parameters": {
        "fromEmail": "alex@flowkithq.com",
        "toEmail": "={{$json[\"email\"]}}",
        "subject": "CALEA Day-3: lawful intercept capability requirement",
        "text": "Day 3 reminder: Your platform is subject to CALEA (18 USC \u00a72522). Facilities-based carriers must maintain lawful intercept capability on-demand. CALEA_WIRETAP_DEMAND is an IMMEDIATE obligation \u2014 law enforcement expects capability ready; failure triggers court order within 90 days. Cloud iPaaS in your communications path = third-party in the intercept chain = CALEA compliance complexity. Self-hosted n8n keeps your data routing inside the CALEA perimeter."
      },
      "name": "CALEA Day-3 Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        1250,
        100
      ]
    },
    {
      "parameters": {
        "fromEmail": "alex@flowkithq.com",
        "toEmail": "={{$json[\"email\"]}}",
        "subject": "STIR-SHAKEN: Day-7 attestation compliance reminder",
        "text": "Day 7: Your platform must provide STIR-SHAKEN attestation per FCC Order 20-48. Full (A) attestation requires you to authenticate the originating subscriber. Partial (B/C) attestation requires gateway registration. Non-compliance: FCC gateway blocking. STIR-SHAKEN attestation happens per-call \u2014 real-time obligation."
      },
      "name": "STIR-SHAKEN Day-7",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        1250,
        300
      ]
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Tier Classifier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tier Classifier": {
      "main": [
        [
          {
            "node": "CPNI Subject?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CPNI Subject?": {
      "main": [
        [
          {
            "node": "CPNI Day-0 Brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Standard Day-0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CPNI Day-0 Brief": {
      "main": [
        [
          {
            "node": "CALEA Subject?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CALEA Subject?": {
      "main": [
        [
          {
            "node": "CALEA Day-3 Email",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "STIR-SHAKEN Day-7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

What it does: Classifies by tier (carrier, MVNO, UCaaS, STIR-SHAKEN vendor, E911/MLTS vendor, wholesale VoIP, analytics), sends CPNI §64.2009(e) third-party disclosure brief to CPNI-subject tiers on Day 0, CALEA intercept capability reminder to facilities-based carriers on Day 3, STIR-SHAKEN attestation compliance note on Day 7.


2. FCC / CALEA / TCPA Deadline Tracker

Twelve deadline types across the TelecomTech regulatory stack, from the annual CPNI certification (March 1) to the 7-business-day FCC breach notification window and the quarterly TCPA consent audit:

{
  "name": "TelecomTech SaaS \u2014 FCC/CALEA/TCPA Deadline Tracker",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "name": "Every 6h",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "\nconst now = new Date();\nconst deadlines = [\n  { type: 'CPNI_ANNUAL_CERT_MARCH_1', ref: '47 CFR \u00a764.2009(e)', due: new Date(now.getFullYear(), 2, 1), daysUntil: null, urgency: 'ANNUAL' },\n  { type: 'CPNI_CUSTOMER_NOTICE_30D', ref: '47 CFR \u00a764.2011(b)', due: new Date(Date.now() + 30*86400000), daysUntil: 30, urgency: 'INCIDENT_DRIVEN' },\n  { type: 'CPNI_FCC_NOTICE_7BD', ref: '47 CFR \u00a764.2011(a)', due: new Date(Date.now() + 7*86400000), daysUntil: 7, urgency: 'INCIDENT_DRIVEN' },\n  { type: 'STIR_SHAKEN_ANNUAL_REPORT', ref: 'FCC Order 20-48', due: new Date(now.getFullYear(), 5, 30), daysUntil: null, urgency: 'ANNUAL' },\n  { type: 'E911_KARIS_LAW_AUDIT', ref: '47 CFR \u00a79.3 / Karis Law', due: new Date(now.getFullYear(), 11, 31), daysUntil: null, urgency: 'ANNUAL' },\n  { type: 'TCPA_CONSENT_AUDIT_QUARTERLY', ref: '47 USC \u00a7227', due: new Date(Date.now() + 90*86400000), daysUntil: 90, urgency: 'QUARTERLY' },\n  { type: 'FCC_FORM_477_BIANNUAL', ref: '47 CFR \u00a743.11', due: new Date(now.getFullYear(), 8, 1), daysUntil: null, urgency: 'BIANNUAL' },\n  { type: 'FCC_FORM_499_ANNUAL', ref: '47 CFR \u00a754.711', due: new Date(now.getFullYear(), 3, 1), daysUntil: null, urgency: 'ANNUAL' },\n  { type: 'CALEA_COMPLIANCE_REVIEW', ref: '18 USC \u00a72522', due: new Date(now.getFullYear(), 11, 31), daysUntil: null, urgency: 'ANNUAL' },\n  { type: 'ROBOCALL_MITIGATION_REPORT', ref: 'FCC Order 21-11', due: new Date(now.getFullYear(), 5, 30), daysUntil: null, urgency: 'ANNUAL' },\n  { type: 'TCPA_CLASS_ACTION_STATUTE_4YR', ref: '28 USC \u00a71658 / 47 USC \u00a7227', due: new Date(Date.now() + 4*365*86400000), daysUntil: 1460, urgency: 'LITIGATION' },\n  { type: 'SOC2_TYPE2_RENEWAL', ref: 'AICPA TSC', due: new Date(Date.now() + 365*86400000), daysUntil: 365, urgency: 'ANNUAL' }\n];\nfor (const d of deadlines) {\n  if (!d.daysUntil && d.due) d.daysUntil = Math.floor((d.due - now) / 86400000);\n}\nconst urgent = deadlines.filter(d => d.daysUntil !== null && d.daysUntil <= 30);\nreturn urgent.map(d => ({ json: d }));\n"
      },
      "name": "Deadline Calculator",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{$json[\"daysUntil\"]}}",
              "operation": "smallerEqual",
              "value2": 7
            }
          ]
        }
      },
      "name": "Critical (<= 7d)?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "channel": "#telecom-compliance",
        "text": "CRITICAL DEADLINE: {{$json[\"type\"]}} \u2014 {{$json[\"daysUntil\"]}} days. Ref: {{$json[\"ref\"]}}"
      },
      "name": "Slack Critical",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [
        850,
        200
      ]
    },
    {
      "parameters": {
        "fromEmail": "compliance@flowkithq.com",
        "toEmail": "cco@company.com",
        "subject": "FCC Deadline Warning: {{$json[\"type\"]}} in {{$json[\"daysUntil\"]}} days",
        "text": "Compliance deadline approaching:\n\nType: {{$json[\"type\"]}}\nDays remaining: {{$json[\"daysUntil\"]}}\nRegulatory ref: {{$json[\"ref\"]}}\nUrgency: {{$json[\"urgency\"]}}"
      },
      "name": "Email Warning",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        850,
        400
      ]
    }
  ],
  "connections": {
    "Every 6h": {
      "main": [
        [
          {
            "node": "Deadline Calculator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Deadline Calculator": {
      "main": [
        [
          {
            "node": "Critical (<= 7d)?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Critical (<= 7d)?": {
      "main": [
        [
          {
            "node": "Slack Critical",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Email Warning",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Deadline types covered: CPNI annual cert (March 1, §64.2009(e)), CPNI customer breach notice (30 days, §64.2011(b)), CPNI FCC notice (7 business days, §64.2011(a)), STIR-SHAKEN annual report, E911/Kari's Law audit, TCPA consent audit (quarterly), FCC Form 477 (biannual), FCC Form 499 (annual), CALEA compliance review, robocall mitigation report, TCPA class action statute (4 years), SOC2 renewal.


3. FCC / STIR-SHAKEN / E911 API Health Monitor

Five endpoints. Three-minute polling interval. Dedup on $getWorkflowStaticData so you get one alert per outage, not one per polling cycle:

{
  "name": "TelecomTech SaaS \u2014 FCC/STIR-SHAKEN/E911 API Health Monitor",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 3
            }
          ]
        }
      },
      "name": "Every 3 Min",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "\nconst endpoints = [\n  { name: 'cpni_auth_api', url: process.env.CPNI_AUTH_API, ref: '47 CFR \u00a764.2009 \u2014 CPNI unauthorized access risk if down' },\n  { name: 'stir_shaken_api', url: process.env.STIR_SHAKEN_API, ref: 'FCC Order 20-48 \u2014 attestation failure if down' },\n  { name: 'e911_dispatch_api', url: process.env.E911_DISPATCH_API, ref: '47 CFR \u00a79.3 / Karis Law \u2014 911 routing failure = FCC enforcement' },\n  { name: 'tcpa_consent_api', url: process.env.TCPA_CONSENT_API, ref: '47 USC \u00a7227 \u2014 consent lookup failure = TCPA exposure per call/text' },\n  { name: 'fcc_portal_api', url: process.env.FCC_PORTAL_API, ref: 'FCC CORES \u2014 license/registration filing access' }\n];\nreturn endpoints.map(e => ({ json: e }));\n"
      },
      "name": "Endpoint List",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "url": "={{$json[\"url\"]}}",
        "method": "GET",
        "options": {
          "timeout": 5000
        }
      },
      "name": "HTTP Check",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "\nconst prev = $getWorkflowStaticData('global');\nconst key = $json.name || 'unknown';\nconst status = $json.statusCode >= 200 && $json.statusCode < 300 ? 'UP' : 'DOWN';\nconst wasDown = prev[key] === 'DOWN';\nprev[key] = status;\n$setWorkflowStaticData('global', prev);\nif (status === 'DOWN' && !wasDown) return [{ json: { ...$json, alert: true, ref: $json.ref || '' } }];\nreturn [];\n"
      },
      "name": "Dedup Alert",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        850,
        300
      ]
    },
    {
      "parameters": {
        "channel": "#fcc-ops",
        "text": "FCC API DOWN: {{$json[\"name\"]}} \u2014 {{$json[\"ref\"]}}"
      },
      "name": "Slack Alert",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [
        1050,
        300
      ]
    }
  ],
  "connections": {
    "Every 3 Min": {
      "main": [
        [
          {
            "node": "Endpoint List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Endpoint List": {
      "main": [
        [
          {
            "node": "HTTP Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Check": {
      "main": [
        [
          {
            "node": "Dedup Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedup Alert": {
      "main": [
        [
          {
            "node": "Slack Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Each alert includes the specific regulatory obligation active during the outage: CPNI auth API down = unauthorized access risk (§64.2009); STIR-SHAKEN API down = attestation failure = gateway blocking; E911 dispatch API down = Kari's Law enforcement exposure; TCPA consent API down = per-call/text TCPA exposure on active campaigns.


4. FCC / CALEA / TCPA Incident Pipeline

Eight incident types with SLA routing from IMMEDIATE (CALEA wiretap demand, E911 routing failure, STIR-SHAKEN failure, CPNI breach, TCPA consent violation) down to 72 hours (data breach) and 30 days (FCC complaint):

{
  "name": "TelecomTech SaaS \u2014 FCC/CALEA/TCPA Incident Pipeline",
  "nodes": [
    {
      "parameters": {
        "path": "telecom-incident",
        "responseMode": "responseNode"
      },
      "name": "Incident Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "\nconst inc = $json;\nconst slas = {\n  'CALEA_WIRETAP_DEMAND': { slaHours: 0, urgency: 'IMMEDIATE', action: 'Lawful intercept capability must be available on-demand \u2014 18 USC \u00a72522; failure triggers court order within 90 days', escalate: ['CEO','CCO','Legal','VP Engineering'] },\n  'E911_CALL_ROUTING_FAILURE': { slaHours: 0, urgency: 'IMMEDIATE', action: 'E911 routing failure \u2014 47 CFR \u00a79.3 / Karis Law; FCC enforcement proceeding, $100k/day civil forfeiture exposure', escalate: ['CCO','VP Engineering','NOC'] },\n  'STIR_SHAKEN_ATTESTATION_FAILURE': { slaHours: 0, urgency: 'IMMEDIATE', action: 'STIR-SHAKEN attestation failure \u2014 FCC Order 20-48; gateway blocking risk, FCC complaint filed', escalate: ['VP Engineering','CCO'] },\n  'CPNI_UNAUTHORIZED_DISCLOSURE': { slaHours: 0, urgency: 'IMMEDIATE_THEN_7BD_FCC_30D_CUSTOMER', action: 'CPNI breach \u2014 notify FBI/Secret Service immediately; FCC notice within 7 business days \u00a764.2011(a); customer notice within 30 days \u00a764.2011(b)', escalate: ['CEO','CCO','Legal','CISO'] },\n  'TCPA_CONSENT_VIOLATION': { slaHours: 0, urgency: 'IMMEDIATE', action: 'TCPA \u00a7227 per-call/text violation \u2014 $500 statutory/$1500 treble damages; class action exposure. Stop affected campaign immediately.', escalate: ['CCO','Legal','VP Marketing'] },\n  'FCC_COMPLAINT_FILED': { slaHours: 720, urgency: '30_DAYS', action: 'FCC complaint \u2014 30 calendar days to respond; non-response = default enforcement order', escalate: ['CCO','Legal'] },\n  'ROBOCALL_MITIGATION_FAILURE': { slaHours: 0, urgency: 'IMMEDIATE', action: 'Robocall mitigation plan failure \u2014 FCC Order 21-11; gateway blocking if non-compliant. Restore STIR-SHAKEN attestation immediately.', escalate: ['VP Engineering','CCO'] },\n  'DATA_BREACH_TELECOM': { slaHours: 72, urgency: '72H', action: 'Telecom data breach \u2014 72h GDPR Art.33 notification if EU subscribers; FCC CPNI breach rules if US CPNI involved; state breach laws', escalate: ['CISO','CCO','Legal','CEO'] }\n};\nconst sla = slas[inc.incident_type] || { slaHours: 24, urgency: 'STANDARD', action: 'Review incident', escalate: ['CCO'] };\nreturn [{ json: { ...inc, ...sla, ts: new Date().toISOString() } }];\n"
      },
      "name": "SLA Router",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"urgency\"]}}",
              "operation": "contains",
              "value2": "IMMEDIATE"
            }
          ]
        }
      },
      "name": "IMMEDIATE?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "fromEmail": "compliance@flowkithq.com",
        "toEmail": "={{$json[\"escalate\"].join(\",\")}}",
        "subject": "IMMEDIATE FCC/CALEA INCIDENT: {{$json[\"incident_type\"]}}",
        "text": "INCIDENT: {{$json[\"incident_type\"]}}\nCustomer: {{$json[\"customer_id\"]}}\nAction required: {{$json[\"action\"]}}\nTimestamp: {{$json[\"ts\"]}}"
      },
      "name": "Immediate Alert",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        850,
        200
      ]
    },
    {
      "parameters": {
        "fromEmail": "compliance@flowkithq.com",
        "toEmail": "cco@company.com",
        "subject": "Compliance Incident: {{$json[\"incident_type\"]}} \u2014 {{$json[\"slaHours\"]}}h SLA",
        "text": "Incident: {{$json[\"incident_type\"]}}\nUrgency: {{$json[\"urgency\"]}}\nSLA: {{$json[\"slaHours\"]}} hours\nRequired action: {{$json[\"action\"]}}"
      },
      "name": "SLA Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        850,
        400
      ]
    }
  ],
  "connections": {
    "Incident Webhook": {
      "main": [
        [
          {
            "node": "SLA Router",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SLA Router": {
      "main": [
        [
          {
            "node": "IMMEDIATE?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IMMEDIATE?": {
      "main": [
        [
          {
            "node": "Immediate Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "SLA Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Fastest clock: CALEA_WIRETAP_DEMAND and E911_CALL_ROUTING_FAILURE are IMMEDIATE — no reporting window, capability must be available on-demand. CPNI_UNAUTHORIZED_DISCLOSURE is IMMEDIATE for law enforcement notification, then 7 business days for FCC (§64.2011(a)), then 30 days for customer notification (§64.2011(b)).


5. Weekly FCC / TCPA KPI Dashboard

Tier-segmented MRR with week-over-week delta, plus the compliance indicators your CCO needs weekly: CPNI incidents, CALEA demands, TCPA violations, STIR-SHAKEN attestation rate, E911 uptime, FCC complaint queue:

{
  "name": "TelecomTech SaaS \u2014 Weekly FCC/TCPA KPI Dashboard",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "weeksInterval": 1
            }
          ]
        }
      },
      "name": "Weekly",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "url": "={{$env[\"INTERNAL_API\"]}}/metrics/telecom",
        "method": "GET"
      },
      "name": "Fetch Metrics",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "\nconst m = $json;\nconst prevData = $getWorkflowStaticData('global');\nconst mrrWoW = prevData.lastMrr ? ((m.mrr - prevData.lastMrr) / prevData.lastMrr * 100).toFixed(1) : 'N/A';\nprevData.lastMrr = m.mrr;\n$setWorkflowStaticData('global', prevData);\nreturn [{ json: { ...m, mrrWoW, week: new Date().toISOString().slice(0,10) } }];\n"
      },
      "name": "WoW Calc",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "fromEmail": "reporting@flowkithq.com",
        "toEmail": "ceo@company.com",
        "bccEmail": "cco@company.com,vp-compliance@company.com",
        "subject": "TelecomTech Weekly KPI \u2014 {{$json[\"week\"]}}",
        "text": "WEEKLY TELECOM SAAS KPI\n\nMRR: ${{$json[\"mrr\"]}} ({{$json[\"mrrWoW\"]}}% WoW)\nActive carrier accounts: {{$json[\"active_carrier_accounts\"]}}\nCPNI incidents open: {{$json[\"cpni_incidents_open\"]}}\nCALEA demands active: {{$json[\"calea_demands_active\"]}}\nTCPA consent violations: {{$json[\"tcpa_violations\"]}}\nSTIR-SHAKEN attestation rate: {{$json[\"stir_shaken_rate\"]}}%\nE911 uptime: {{$json[\"e911_uptime\"]}}%\nFCC complaints open: {{$json[\"fcc_complaints_open\"]}}\n\nStore: https://stripeai.gumroad.com"
      },
      "name": "Weekly KPI Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        850,
        300
      ]
    }
  ],
  "connections": {
    "Weekly": {
      "main": [
        [
          {
            "node": "Fetch Metrics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Metrics": {
      "main": [
        [
          {
            "node": "WoW Calc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WoW Calc": {
      "main": [
        [
          {
            "node": "Weekly KPI Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

The Compliance Architecture Decision

Regulatory obligation Cloud iPaaS risk Self-hosted n8n
FCC §64.2009(e) CPNI Cloud subprocessor = third-party CPNI disclosure Inside network perimeter — no third-party relationship
CALEA §2522 Cloud routing = third party in intercept chain Inside CALEA perimeter
STIR-SHAKEN per-call Real-time attestation dependency on cloud API uptime Local attestation logic, no external dependency
TCPA consent lookup Cloud API failure = per-call TCPA exposure during outage Local consent DB, no external lookup required
FCC discovery (enforcement) Cloud iPaaS = third-party subpoena target in FCC investigation Internal records only

Get the complete FlowKit n8n template library

All five workflows above — plus 10 more for other compliance verticals — are available at https://stripeai.gumroad.com.

Each template includes the full workflow JSON, setup guide, and environment variable reference. Import directly into your n8n instance.


FlowKit builds n8n automation templates for SaaS compliance teams. All workflows are production-ready and self-hostable.

Top comments (0)