DEV Community

Alex Kane
Alex Kane

Posted on

n8n for CryptoTech/Web3/DeFi SaaS Vendors: 5 Automations for FinCEN BSA/AML, FATF Travel Rule, OFAC Sanctions Screening, and MiCA Compliance

TL;DR — OFAC SDN match requires immediate blocking before transaction completes — the clock starts when your screening system detects the hit, not when a compliance officer reviews the alert. FinCEN SAR confidentiality rules (31 USC §5318(g)(2)) extend to your cloud automation vendor's logs. FATF Travel Rule requires originator/beneficiary PII to accompany the transfer at execution time. Five production-ready n8n workflows, full JSON, seven customer tiers.


Why CryptoTech and Web3 SaaS Has the Most Complex Multi-Jurisdictional Compliance Stack in Financial Services

A crypto exchange platform operating in 2026 simultaneously manages obligations across:

  • FinCEN MSB Registration (31 CFR §1022.380) — required within 180 days of starting business as a money services business; annual renewal
  • BSA AML Program (31 USC §5318) — written program with four pillars: policies/procedures, designated compliance officer, ongoing employee training, independent audit
  • FinCEN SAR Filing (31 CFR §1020.320) — within 30 days of detecting suspicious activity; SAR confidentiality §5318(g)(2) prohibits "tipping off" the subject
  • FinCEN CTR Filing (31 CFR §1010.311) — within 15 calendar days of a $10,000+ cash equivalent transaction
  • FATF Travel Rule (FinCEN 2019 CVC Guidance, 31 CFR §1010.410) — originator/beneficiary PII must accompany the transfer at execution time, not after
  • OFAC SDN Sanctions Screening (50 USC §1701, 31 CFR Parts 500–599) — immediate blocking required; report to OFAC within 10 business days via blocked/rejected transactions report
  • IRS 1099-DA Broker Reporting (IRC §6045) — effective 2025 tax year; digital asset brokers must report gross proceeds and cost basis by January 31
  • EU MiCA (Regulation EU 2023/1114) — significant incident notification within 4 hours (Article 66); pre-offering crypto-asset whitepaper requirements
  • State Money Transmitter Licenses — 49 states have separate MTL requirements; New York BitLicense (23 NYCRR 200) adds additional surveillance and AML obligations

The problem: most CryptoTech SaaS vendors route transaction monitoring alerts, SAR draft data, KYC/AML screening results, and OFAC hits through the same workflow automation stack that handles their customer onboarding emails. The FinCEN SAR confidentiality obligation applies to any system that processes suspicious activity data — including your cloud automation vendor's execution logs.


Seven Customer Tiers

Tier Profile Key Obligations
CENTRALIZED_EXCHANGE_SAAS CEX order book, custody, KYC/AML at scale FinCEN MSB + BSA + FATF Travel Rule + OFAC + NY BitLicense + MiCA
DEFI_PROTOCOL_SAAS Front-end/dashboard, smart contract monitoring FinCEN CVC 2019 + OFAC screening + SEC Howey test exposure + MiCA CASP
CRYPTO_CUSTODIAN_SAAS Qualified custodian, cold/warm storage FinCEN MSB + BSA + OFAC + OCC Trust Charter + state MTL
CRYPTO_PAYMENT_PROCESSOR Merchant crypto payments, payment rails FinCEN MSB + FATF Travel Rule + OFAC + PCI DSS + state MTL 49 states
NFT_MARKETPLACE_SAAS Minting, secondary trading, royalties FinCEN CVC guidance + OFAC + potential BSA if fiat on/off ramp
BLOCKCHAIN_ANALYTICS_SAAS Chain forensics, AML screening, TRM FinCEN §5318(h) AML program data + OFAC SDN + data sovereignty
CRYPTOTECH_STARTUP Seed/Series A, limited licenses FinCEN MSB registration + BSA basics + OFAC + state MTL roadmap

Compliance Flags

{
  "FINCEN_MSB_REGISTERED": true,
  "BSA_AML_PROGRAM_REQUIRED": true,
  "FATF_TRAVEL_RULE_SUBJECT": true,
  "OFAC_SCREENING_REQUIRED": true,
  "SEC_DIGITAL_ASSET_REGULATED": false,
  "STATE_MTL_LICENSED": true,
  "EU_MICA_COMPLIANT": false
}
Enter fullscreen mode Exit fullscreen mode

Workflow 1: Tier-Segmented Customer Onboarding Drip with Compliance Flag Injection

New customers receive onboarding sequences tailored to their regulatory tier and active compliance flags.

{
  "name": "CryptoTech \u2014 Tier-Segmented Onboarding Drip",
  "nodes": [
    {
      "id": "1",
      "name": "Webhook \u2014 New Customer",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "crypto-customer-created",
        "responseMode": "onReceived"
      },
      "position": [
        100,
        300
      ]
    },
    {
      "id": "2",
      "name": "Switch \u2014 Tier Router",
      "type": "n8n-nodes-base.switch",
      "parameters": {
        "mode": "expression",
        "rules": [
          {
            "value1": "={{$json.tier}}",
            "value2": "CENTRALIZED_EXCHANGE_SAAS",
            "output": 0
          },
          {
            "value1": "={{$json.tier}}",
            "value2": "DEFI_PROTOCOL_SAAS",
            "output": 1
          },
          {
            "value1": "={{$json.tier}}",
            "value2": "CRYPTO_CUSTODIAN_SAAS",
            "output": 2
          },
          {
            "value1": "={{$json.tier}}",
            "value2": "CRYPTO_PAYMENT_PROCESSOR",
            "output": 3
          },
          {
            "value1": "={{$json.tier}}",
            "value2": "NFT_MARKETPLACE_SAAS",
            "output": 4
          },
          {
            "value1": "={{$json.tier}}",
            "value2": "BLOCKCHAIN_ANALYTICS_SAAS",
            "output": 5
          },
          {
            "value1": "={{$json.tier}}",
            "value2": "CRYPTOTECH_STARTUP",
            "output": 6
          }
        ]
      },
      "position": [
        300,
        300
      ]
    },
    {
      "id": "3",
      "name": "Gmail \u2014 CEX Day 0",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{$json.email}}",
        "subject": "Getting started: FinCEN MSB + FATF Travel Rule architecture for your exchange",
        "message": "={{$json.company_name}} \u2014 your CENTRALIZED_EXCHANGE_SAAS tier activates FinCEN MSB registration (31 CFR \u00a71022.380), BSA AML program (31 USC \u00a75318), FATF Travel Rule PII-at-transfer-time requirement (31 CFR \u00a71010.410), and OFAC SDN screening (IMMEDIATE block requirement). Day 0 note: every transaction monitoring alert that transits Zapier or Make is processed outside your FinCEN SAR confidentiality boundary. SAR draft data in vendor logs = \u00a75318(g)(2) tipping-off risk. Self-hosted n8n keeps AML pipeline inside your FinCEN reporting institution boundary. \u2014 FlowKit team"
      },
      "position": [
        500,
        100
      ]
    },
    {
      "id": "4",
      "name": "Gmail \u2014 DeFi Day 0",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{$json.email}}",
        "subject": "Getting started: FinCEN CVC 2019 + OFAC screening architecture for DeFi platforms",
        "message": "={{$json.company_name}} \u2014 your DEFI_PROTOCOL_SAAS tier activates FinCEN 2019 CVC guidance (front-end operators may be MSBs), OFAC SDN screening for wallet addresses (OFAC FAQ 594), and potential SEC Howey test exposure for governance token distributions. Day 0 note: OFAC updates the SDN list multiple times per day \u2014 cloud automation with stale watchlist cache = unscreened transactions. Real-time SDN polling in self-hosted n8n = deterministic screening latency inside your audit boundary. \u2014 FlowKit team"
      },
      "position": [
        500,
        200
      ]
    },
    {
      "id": "5",
      "name": "Gmail \u2014 Custodian Day 0",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{$json.email}}",
        "subject": "Getting started: OCC + OFAC + BSA architecture for qualified custodians",
        "message": "={{$json.company_name}} \u2014 your CRYPTO_CUSTODIAN_SAAS tier activates OCC Trust Charter obligations, FinCEN MSB (31 CFR \u00a71022.380), BSA CDD Rule (31 CFR \u00a71010.230) beneficial ownership records, OFAC SDN screening, and state MTL requirements. Day 0 note: beneficial ownership data (name, address, EIN) flowing through cloud iPaaS = CDD Rule \u00a71010.230 PII data sovereignty risk + GDPR Art.46 cross-border transfer safeguards for EU customers. \u2014 FlowKit team"
      },
      "position": [
        500,
        300
      ]
    },
    {
      "id": "6",
      "name": "Gmail \u2014 Payment Processor Day 0",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{$json.email}}",
        "subject": "Getting started: FATF Travel Rule + 49-state MTL architecture for crypto payment processors",
        "message": "={{$json.company_name}} \u2014 your CRYPTO_PAYMENT_PROCESSOR tier activates FATF Travel Rule PII requirements (at-transfer-time, not after), 49-state money transmitter license compliance, OFAC SDN screening per transaction, and PCI DSS for any fiat card rails. Day 0 note: Travel Rule requires originator name/account/address and beneficiary name/account to accompany the transfer \u2014 cloud automation processing this PII mid-transaction = data egress outside your MTL compliance boundary. \u2014 FlowKit team"
      },
      "position": [
        500,
        400
      ]
    },
    {
      "id": "7",
      "name": "Gmail \u2014 NFT Marketplace Day 0",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{$json.email}}",
        "subject": "Getting started: FinCEN CVC + OFAC architecture for NFT marketplaces",
        "message": "={{$json.company_name}} \u2014 your NFT_MARKETPLACE_SAAS tier activates FinCEN CVC 2019 guidance (NFT platforms with fiat on/off ramps may qualify as MSBs), OFAC SDN screening for buyer/seller wallet addresses, and potential BSA if fiat rails are present. Day 0 note: NFT smart contract events (mint, sale, royalty) flowing through cloud automation = transaction metadata outside your AML monitoring boundary. \u2014 FlowKit team"
      },
      "position": [
        500,
        500
      ]
    },
    {
      "id": "8",
      "name": "Gmail \u2014 Analytics SaaS Day 0",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{$json.email}}",
        "subject": "Getting started: FinCEN AML data + OFAC SDN architecture for blockchain analytics platforms",
        "message": "={{$json.company_name}} \u2014 your BLOCKCHAIN_ANALYTICS_SAAS tier activates FinCEN \u00a75318(h) AML program data handling obligations, OFAC SDN screening data sovereignty requirements, and SOC2 data boundaries for your analytics pipeline. Day 0 note: chain forensics data (wallet clusters, risk scores, flagged entities) transiting cloud iPaaS = AML intelligence outside your FinCEN reporting boundary \u2014 potential exposure under SAR confidentiality \u00a75318(g)(2). \u2014 FlowKit team"
      },
      "position": [
        500,
        600
      ]
    },
    {
      "id": "9",
      "name": "Gmail \u2014 Startup Day 0",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "={{$json.email}}",
        "subject": "Getting started: FinCEN MSB registration + OFAC architecture for CryptoTech startups",
        "message": "={{$json.company_name}} \u2014 your CRYPTOTECH_STARTUP tier activates FinCEN MSB registration within 180 days of launch (31 CFR \u00a71022.380), BSA AML program basics (31 USC \u00a75318), and OFAC SDN screening. Day 0 note: MSB registration is independent of revenue \u2014 operating as an unregistered MSB = criminal exposure under 31 USC \u00a75330. Build your compliance boundary with self-hosted n8n before your first transaction. \u2014 FlowKit team"
      },
      "position": [
        500,
        700
      ]
    },
    {
      "id": "10",
      "name": "Sheets \u2014 Log Onboarding",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "appendOrUpdate",
        "spreadsheetId": "{{SHEET_ID}}",
        "sheetName": "onboarding_log",
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "customer_id": "={{$json.customer_id}}",
            "tier": "={{$json.tier}}",
            "onboarded_at": "={{$now}}",
            "compliance_flags": "={{JSON.stringify($json.compliance_flags)}}"
          }
        }
      },
      "position": [
        700,
        400
      ]
    }
  ],
  "connections": {
    "Webhook \u2014 New Customer": {
      "main": [
        [
          {
            "node": "Switch \u2014 Tier Router",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch \u2014 Tier Router": {
      "main": [
        [
          {
            "node": "Gmail \u2014 CEX Day 0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail \u2014 DeFi Day 0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail \u2014 Custodian Day 0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail \u2014 Payment Processor Day 0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail \u2014 NFT Marketplace Day 0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail \u2014 Analytics SaaS Day 0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Gmail \u2014 Startup Day 0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail \u2014 CEX Day 0": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Onboarding",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail \u2014 DeFi Day 0": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Onboarding",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail \u2014 Custodian Day 0": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Onboarding",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail \u2014 Payment Processor Day 0": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Onboarding",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail \u2014 NFT Marketplace Day 0": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Onboarding",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail \u2014 Analytics SaaS Day 0": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Onboarding",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail \u2014 Startup Day 0": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Onboarding",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 2: FinCEN / OFAC / FATF / MiCA Compliance Deadline Tracker

Tracks 12 recurring crypto compliance deadlines with tiered urgency and escalation routing.

{
  "name": "CryptoTech \u2014 Compliance Deadline Tracker",
  "nodes": [
    {
      "id": "1",
      "name": "Schedule \u2014 Daily 8AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * *"
            }
          ]
        }
      },
      "position": [
        100,
        300
      ]
    },
    {
      "id": "2",
      "name": "Sheets \u2014 Read Deadlines",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "readRows",
        "spreadsheetId": "{{SHEET_ID}}",
        "sheetName": "compliance_deadlines"
      },
      "position": [
        300,
        300
      ]
    },
    {
      "id": "3",
      "name": "Code \u2014 Classify Urgency",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "\nconst today = new Date();\nconst items = $input.all();\nconst classified = items.map(item => {\n  const d = item.json;\n  const due = new Date(d.due_date);\n  const daysRemaining = Math.floor((due - today) / 86400000);\n  let urgency = 'NOTICE';\n  if (daysRemaining < 0) urgency = 'OVERDUE';\n  else if (daysRemaining <= 2) urgency = 'CRITICAL';\n  else if (daysRemaining <= 7) urgency = 'URGENT';\n  else if (daysRemaining <= 14) urgency = 'WARNING';\n  return { ...d, days_remaining: daysRemaining, urgency };\n});\nconst actionable = classified.filter(d => ['OVERDUE','CRITICAL','URGENT','WARNING'].includes(d.urgency));\nreturn actionable.map(d => ({ json: d }));\n"
      },
      "position": [
        500,
        300
      ]
    },
    {
      "id": "4",
      "name": "IF \u2014 Critical or Overdue",
      "type": "n8n-nodes-base.if",
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "leftValue": "={{$json.urgency}}",
              "rightValue": "CRITICAL",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            },
            {
              "leftValue": "={{$json.urgency}}",
              "rightValue": "OVERDUE",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "or"
        }
      },
      "position": [
        700,
        300
      ]
    },
    {
      "id": "5",
      "name": "Slack \u2014 Critical Deadline",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-critical",
        "text": "={{$json.urgency}} | {{$json.deadline_type}} | {{$json.days_remaining}} days | {{$json.description}} | Owner: {{$json.owner_email}}"
      },
      "position": [
        900,
        200
      ]
    },
    {
      "id": "6",
      "name": "Gmail \u2014 CCO Alert",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "{{CCO_EMAIL}}",
        "subject": "={{$json.urgency}}: {{$json.deadline_type}} \u2014 {{$json.days_remaining}} days remaining",
        "message": "={{$json.deadline_type}} is {{$json.urgency}}. Days remaining: {{$json.days_remaining}}. Description: {{$json.description}}. Regulation: {{$json.regulation_cite}}. Owner: {{$json.owner_email}}. Required action: {{$json.required_action}}."
      },
      "position": [
        900,
        300
      ]
    },
    {
      "id": "7",
      "name": "Slack \u2014 Warning Channel",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance",
        "text": "={{$json.urgency}} | {{$json.deadline_type}} | {{$json.days_remaining}} days | {{$json.regulation_cite}}"
      },
      "position": [
        900,
        400
      ]
    }
  ],
  "connections": {
    "Schedule \u2014 Daily 8AM": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Read Deadlines",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sheets \u2014 Read Deadlines": {
      "main": [
        [
          {
            "node": "Code \u2014 Classify Urgency",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code \u2014 Classify Urgency": {
      "main": [
        [
          {
            "node": "IF \u2014 Critical or Overdue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF \u2014 Critical or Overdue": {
      "main": [
        [
          {
            "node": "Slack \u2014 Critical Deadline",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gmail \u2014 CCO Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 Warning Channel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

The 12 deadline types loaded in the sheet:

Deadline Type Regulation Window
FINCEN_SAR_30_DAY 31 CFR §1020.320 30 days from detection
FINCEN_CTR_15_DAY 31 CFR §1010.311 15 days from $10K+ transaction
FATF_TRAVEL_RULE_TRANSFER 31 CFR §1010.410 At time of transfer — no delay
OFAC_SDN_BLOCK_REPORT OFAC FAQ 560 IMMEDIATE block + 10 biz days report
FINCEN_MSB_REGISTRATION_ANNUAL 31 CFR §1022.380 Annual renewal by Dec 31
IRS_1099_DA_JANUARY_31 IRC §6045 January 31 annual filing
STATE_MTL_ANNUAL_RENEWAL 49 state statutes Varies by state
EU_MICA_INCIDENT_4H Art. 66 MiCA 2023/1114 4 hours initial notification
EU_MICA_WHITEPAPER_REVIEW Art. 6–21 MiCA Pre-offering requirement
SEC_ENFORCEMENT_REQUEST 15 USC §77 / §78 IMMEDIATE subpoena hold
CFTC_SWAP_REPORTING CFTC §731 Dodd-Frank Same-day reporting
SOC2_TYPE2_ANNUAL AICPA SOC2 Annual audit cycle

Workflow 3: Blockchain & Compliance API Health Monitor

Polls five compliance-critical APIs every 5 minutes. OFAC SDN screening downtime = unscreened transactions in flight.

{
  "name": "CryptoTech \u2014 Compliance API Health Monitor",
  "nodes": [
    {
      "id": "1",
      "name": "Schedule \u2014 Every 5 Minutes",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "*/5 * * * *"
            }
          ]
        }
      },
      "position": [
        100,
        300
      ]
    },
    {
      "id": "2",
      "name": "HTTP \u2014 Blockchain RPC API",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "{{BLOCKCHAIN_RPC_ENDPOINT}}/health",
        "method": "GET",
        "timeout": 5000
      },
      "continueOnFail": true,
      "position": [
        300,
        100
      ],
      "notes": "FATF Travel Rule: originator/beneficiary data must accompany transfer at execution time. RPC downtime = Travel Rule data gap."
    },
    {
      "id": "3",
      "name": "HTTP \u2014 OFAC Screening API",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "{{OFAC_SCREENING_ENDPOINT}}/ping",
        "method": "GET",
        "timeout": 3000
      },
      "continueOnFail": true,
      "position": [
        300,
        200
      ],
      "notes": "50 USC \u00a71701 OFAC SDN \u2014 downtime = unscreened transactions. OFAC FAQ 560: IMMEDIATE block required on SDN match. Must not process transactions if screening is unavailable."
    },
    {
      "id": "4",
      "name": "HTTP \u2014 Transaction Monitoring API",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "{{TRM_CHAINALYSIS_ENDPOINT}}/health",
        "method": "GET",
        "timeout": 5000
      },
      "continueOnFail": true,
      "position": [
        300,
        300
      ],
      "notes": "FinCEN \u00a75318(h) AML program: automated transaction monitoring is a core AML program component. Downtime = SAR detection gap."
    },
    {
      "id": "5",
      "name": "HTTP \u2014 FinCEN BSA Portal",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "https://bsaefiling.fincen.treas.gov/healthcheck",
        "method": "GET",
        "timeout": 10000
      },
      "continueOnFail": true,
      "position": [
        300,
        400
      ],
      "notes": "31 CFR \u00a71010/\u00a71022 SAR and CTR filing portal. SAR 30-day clock continues during portal outages \u2014 must track filing deadlines independently."
    },
    {
      "id": "6",
      "name": "HTTP \u2014 KYC/CDD API",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "{{KYC_IDENTITY_ENDPOINT}}/health",
        "method": "GET",
        "timeout": 5000
      },
      "continueOnFail": true,
      "position": [
        300,
        500
      ],
      "notes": "FinCEN CDD Rule 31 CFR \u00a71010.230: customer due diligence and beneficial ownership records. API downtime = KYC/AML onboarding gap."
    },
    {
      "id": "7",
      "name": "Code \u2014 Analyze Health",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "\nconst apis = [\n  { name: 'blockchain_rpc_api', reg: 'FATF Travel Rule 31 CFR \u00a71010.410', critical: true },\n  { name: 'ofac_screening_api', reg: 'OFAC 50 USC \u00a71701 \u2014 IMMEDIATE block required', critical: true },\n  { name: 'transaction_monitoring_api', reg: 'FinCEN \u00a75318(h) AML program', critical: true },\n  { name: 'fincen_bsa_portal', reg: '31 CFR \u00a71010.311/\u00a71020.320 SAR/CTR filing', critical: false },\n  { name: 'kyc_cdd_api', reg: 'FinCEN CDD Rule 31 CFR \u00a71010.230', critical: true }\n];\nconst inputs = $input.all();\nconst now = new Date().toISOString();\nconst results = apis.map((api, i) => {\n  const resp = inputs[i];\n  const ok = resp && resp.json && !resp.error && resp.json.status !== 'error';\n  return { api_name: api.name, status: ok ? 'UP' : 'DOWN', regulation: api.reg, critical: api.critical, checked_at: now };\n});\nconst failures = results.filter(r => r.status === 'DOWN');\nif (failures.length === 0) return [{ json: { all_healthy: true, checked_at: now } }];\nreturn failures.map(f => ({ json: f }));\n"
      },
      "position": [
        500,
        300
      ]
    },
    {
      "id": "8",
      "name": "IF \u2014 Critical API Down",
      "type": "n8n-nodes-base.if",
      "parameters": {
        "conditions": {
          "conditions": [
            {
              "leftValue": "={{$json.critical}}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "equal"
              }
            }
          ],
          "combinator": "and"
        }
      },
      "position": [
        700,
        300
      ]
    },
    {
      "id": "9",
      "name": "Slack \u2014 CRITICAL API Failure",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-ops",
        "text": "CRITICAL: {{$json.api_name}} is DOWN | {{$json.regulation}} | Checked: {{$json.checked_at}} | Unscreened transactions may be in flight \u2014 halt processing if OFAC screening affected."
      },
      "position": [
        900,
        200
      ]
    },
    {
      "id": "10",
      "name": "Gmail \u2014 CTO Alert",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "{{CTO_EMAIL}}",
        "subject": "CRITICAL: {{$json.api_name}} DOWN \u2014 {{$json.regulation}}",
        "message": "API {{$json.api_name}} is not responding. Regulation: {{$json.regulation}}. Checked at: {{$json.checked_at}}. If OFAC screening API is down, halt transaction processing immediately per OFAC FAQ 560."
      },
      "position": [
        900,
        300
      ]
    },
    {
      "id": "11",
      "name": "Slack \u2014 Non-Critical Warning",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-ops",
        "text": "WARNING: {{$json.api_name}} DOWN | {{$json.regulation}} | Non-critical \u2014 monitor and restore within SLA."
      },
      "position": [
        900,
        400
      ]
    }
  ],
  "connections": {
    "Schedule \u2014 Every 5 Minutes": {
      "main": [
        [
          {
            "node": "HTTP \u2014 Blockchain RPC API",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP \u2014 OFAC Screening API",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP \u2014 Transaction Monitoring API",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP \u2014 FinCEN BSA Portal",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP \u2014 KYC/CDD API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP \u2014 Blockchain RPC API": {
      "main": [
        [
          {
            "node": "Code \u2014 Analyze Health",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP \u2014 OFAC Screening API": {
      "main": [
        [
          {
            "node": "Code \u2014 Analyze Health",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP \u2014 Transaction Monitoring API": {
      "main": [
        [
          {
            "node": "Code \u2014 Analyze Health",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP \u2014 FinCEN BSA Portal": {
      "main": [
        [
          {
            "node": "Code \u2014 Analyze Health",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP \u2014 KYC/CDD API": {
      "main": [
        [
          {
            "node": "Code \u2014 Analyze Health",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code \u2014 Analyze Health": {
      "main": [
        [
          {
            "node": "IF \u2014 Critical API Down",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF \u2014 Critical API Down": {
      "main": [
        [
          {
            "node": "Slack \u2014 CRITICAL API Failure",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gmail \u2014 CTO Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 Non-Critical Warning",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 4: Crypto Compliance Incident Alert Pipeline

Webhook-triggered routing for eight incident types with response clocks and escalation paths.

{
  "name": "CryptoTech \u2014 Compliance Incident Alert Pipeline",
  "nodes": [
    {
      "id": "1",
      "name": "Webhook \u2014 Incident Trigger",
      "type": "n8n-nodes-base.webhook",
      "parameters": {
        "path": "crypto-compliance-incident",
        "responseMode": "onReceived"
      },
      "position": [
        100,
        400
      ]
    },
    {
      "id": "2",
      "name": "Sheets \u2014 Log Incident",
      "type": "n8n-nodes-base.googleSheets",
      "parameters": {
        "operation": "appendOrUpdate",
        "spreadsheetId": "{{SHEET_ID}}",
        "sheetName": "incident_log",
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "incident_id": "={{$json.incident_id}}",
            "incident_type": "={{$json.incident_type}}",
            "detected_at": "={{$json.detected_at}}",
            "severity": "={{$json.severity}}",
            "details": "={{JSON.stringify($json.details)}}"
          }
        }
      },
      "position": [
        300,
        400
      ]
    },
    {
      "id": "3",
      "name": "Switch \u2014 Incident Router",
      "type": "n8n-nodes-base.switch",
      "parameters": {
        "mode": "expression",
        "rules": [
          {
            "value1": "={{$json.incident_type}}",
            "value2": "OFAC_SDN_MATCH",
            "output": 0
          },
          {
            "value1": "={{$json.incident_type}}",
            "value2": "FINCEN_SAR_TRIGGER",
            "output": 1
          },
          {
            "value1": "={{$json.incident_type}}",
            "value2": "FINCEN_CTR_REQUIRED",
            "output": 2
          },
          {
            "value1": "={{$json.incident_type}}",
            "value2": "FATF_TRAVEL_RULE_VIOLATION",
            "output": 3
          },
          {
            "value1": "={{$json.incident_type}}",
            "value2": "SEC_DIGITAL_ASSET_ENFORCEMENT",
            "output": 4
          },
          {
            "value1": "={{$json.incident_type}}",
            "value2": "CFTC_COMMODITY_DIGITAL_ASSET_INQUIRY",
            "output": 5
          },
          {
            "value1": "={{$json.incident_type}}",
            "value2": "STATE_MTL_SUSPENSION_NOTICE",
            "output": 6
          },
          {
            "value1": "={{$json.incident_type}}",
            "value2": "EU_MICA_SIGNIFICANT_INCIDENT",
            "output": 7
          }
        ]
      },
      "position": [
        500,
        400
      ]
    },
    {
      "id": "4",
      "name": "Slack \u2014 OFAC SDN MATCH IMMEDIATE",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-critical",
        "text": "OFAC SDN MATCH DETECTED \u2014 IMMEDIATE ACTION REQUIRED | Transaction ID: {{$json.transaction_id}} | Wallet: {{$json.wallet_address}} | SDN Entry: {{$json.sdn_entry}} | BLOCK TRANSACTION NOW. Report to OFAC within 10 business days via blocked/rejected transactions report (OFAC FAQ 560). Do NOT notify customer \u2014 potential tipping-off violation."
      },
      "position": [
        700,
        50
      ]
    },
    {
      "id": "5",
      "name": "Gmail \u2014 CCO OFAC Alert",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "{{CCO_EMAIL}}",
        "subject": "IMMEDIATE: OFAC SDN Match \u2014 Transaction {{$json.transaction_id}} BLOCKED",
        "message": "OFAC SDN match detected at {{$json.detected_at}}. Transaction {{$json.transaction_id}} has been flagged. Wallet address: {{$json.wallet_address}}. SDN list entry: {{$json.sdn_entry}}. Required actions: (1) Block/freeze the transaction immediately. (2) Do NOT notify the customer \u2014 OFAC FAQ 719 tipping-off risk. (3) Report to OFAC via blocked transactions report within 10 business days. (4) Preserve all records. Consult OFAC counsel immediately."
      },
      "position": [
        700,
        150
      ]
    },
    {
      "id": "6",
      "name": "Slack \u2014 SAR Trigger 30-Day Clock",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-critical",
        "text": "FINCEN_SAR_TRIGGER: SAR clock started | Detected: {{$json.detected_at}} | SAR due: {{$json.sar_due_date}} (30 days, 31 CFR \u00a71020.320) | Customer: {{$json.customer_id}} | Do NOT disclose to customer or any person \u2014 \u00a75318(g)(2) confidentiality. All SAR data must remain within FinCEN reporting boundary."
      },
      "position": [
        700,
        250
      ]
    },
    {
      "id": "7",
      "name": "Slack \u2014 CTR 15-Day Clock",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance",
        "text": "FINCEN_CTR_REQUIRED: CTR clock started | Transaction: {{$json.transaction_id}} | Amount: {{$json.amount}} | Transaction date: {{$json.transaction_date}} | CTR due: {{$json.ctr_due_date}} (15 calendar days, 31 CFR \u00a71010.311)"
      },
      "position": [
        700,
        350
      ]
    },
    {
      "id": "8",
      "name": "Slack \u2014 Travel Rule Violation",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-critical",
        "text": "FATF_TRAVEL_RULE_VIOLATION: Transfer executed without required originator/beneficiary PII | Transfer ID: {{$json.transfer_id}} | Amount: {{$json.amount}} | Required: originator name + account + address + beneficiary name + account per 31 CFR \u00a71010.410. Remediate immediately \u2014 retroactive PII collection does not cure the violation."
      },
      "position": [
        700,
        450
      ]
    },
    {
      "id": "9",
      "name": "Slack \u2014 SEC Enforcement IMMEDIATE",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#legal-critical",
        "text": "SEC_DIGITAL_ASSET_ENFORCEMENT: SEC action filed or Wells Notice received | IMMEDIATE: implement litigation hold on ALL records | Contact outside securities counsel now | Do not delete, modify, or transfer any records | SEC action: {{$json.action_type}} | Reference: {{$json.sec_reference}}"
      },
      "position": [
        700,
        550
      ]
    },
    {
      "id": "10",
      "name": "Slack \u2014 CFTC Inquiry",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#legal-critical",
        "text": "CFTC_COMMODITY_DIGITAL_ASSET_INQUIRY: CFTC subpoena or investigative demand received | IMMEDIATE: implement litigation hold | Contact outside CFTC counsel | Reference: {{$json.cftc_reference}}"
      },
      "position": [
        700,
        650
      ]
    },
    {
      "id": "11",
      "name": "Slack \u2014 MTL Suspension 1-Hour Clock",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-critical",
        "text": "STATE_MTL_SUSPENSION_NOTICE: MTL suspended in {{$json.state}} | 1-hour customer notification window per state statute | States affected: {{$json.states_affected}} | Halt operations in affected states immediately | Notify customers within 1 hour | Contact state MTL counsel"
      },
      "position": [
        700,
        750
      ]
    },
    {
      "id": "12",
      "name": "Slack \u2014 MiCA Incident 4H Clock",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance-critical",
        "text": "EU_MICA_SIGNIFICANT_INCIDENT: MiCA Article 66 incident | 4-hour initial notification to competent authority | Incident detected: {{$json.detected_at}} | Notification due by: {{$json.mica_notification_due}} | Contact EU MiCA counsel | Submit incident notification to {{$json.competent_authority}}"
      },
      "position": [
        700,
        850
      ]
    }
  ],
  "connections": {
    "Webhook \u2014 Incident Trigger": {
      "main": [
        [
          {
            "node": "Sheets \u2014 Log Incident",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sheets \u2014 Log Incident": {
      "main": [
        [
          {
            "node": "Switch \u2014 Incident Router",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch \u2014 Incident Router": {
      "main": [
        [
          {
            "node": "Slack \u2014 OFAC SDN MATCH IMMEDIATE",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gmail \u2014 CCO OFAC Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 SAR Trigger 30-Day Clock",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 CTR 15-Day Clock",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 Travel Rule Violation",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 SEC Enforcement IMMEDIATE",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 CFTC Inquiry",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 MTL Suspension 1-Hour Clock",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack \u2014 MiCA Incident 4H Clock",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Incident response clock summary:

Incident Type Response Window Regulation
OFAC_SDN_MATCH IMMEDIATE block + 10 biz days report OFAC FAQ 560, 50 USC §1701
FINCEN_SAR_TRIGGER 30 days from detection 31 CFR §1020.320 + §5318(g)(2)
FINCEN_CTR_REQUIRED 15 calendar days from transaction 31 CFR §1010.311
FATF_TRAVEL_RULE_VIOLATION IMMEDIATE — at time of transfer 31 CFR §1010.410, FinCEN 2019 CVC
SEC_DIGITAL_ASSET_ENFORCEMENT IMMEDIATE litigation hold 15 USC §77/§78, subpoena hold
CFTC_COMMODITY_DIGITAL_ASSET_INQUIRY IMMEDIATE CFTC §731 Dodd-Frank
STATE_MTL_SUSPENSION_NOTICE 1 hour customer notification State MTL statutes
EU_MICA_SIGNIFICANT_INCIDENT 4 hours initial notification Art. 66 MiCA 2023/1114

Workflow 5: Weekly Crypto Compliance KPI Dashboard

Monday 8AM digest for CEO, CCO, and CTO with open compliance items and key platform metrics.

{
  "name": "CryptoTech \u2014 Weekly Compliance KPI Dashboard",
  "nodes": [
    {
      "id": "1",
      "name": "Schedule \u2014 Monday 8AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * 1"
            }
          ]
        }
      },
      "position": [
        100,
        300
      ]
    },
    {
      "id": "2",
      "name": "Postgres \u2014 Platform Metrics",
      "type": "n8n-nodes-base.postgres",
      "parameters": {
        "operation": "executeQuery",
        "query": "\nSELECT\n  COUNT(DISTINCT customer_id) AS active_customers,\n  COUNT(DISTINCT CASE WHEN tier = 'CENTRALIZED_EXCHANGE_SAAS' THEN customer_id END) AS cex_count,\n  COUNT(DISTINCT CASE WHEN tier = 'DEFI_PROTOCOL_SAAS' THEN customer_id END) AS defi_count,\n  COUNT(DISTINCT CASE WHEN tier = 'CRYPTO_PAYMENT_PROCESSOR' THEN customer_id END) AS payment_processor_count,\n  SUM(mrr_usd) AS total_mrr_usd,\n  SUM(api_calls_7d) AS api_calls_7d,\n  SUM(wallets_monitored) AS wallets_monitored,\n  SUM(transactions_screened_7d) AS transactions_screened_7d\nFROM customer_metrics\nWHERE is_active = true\n"
      },
      "position": [
        300,
        200
      ]
    },
    {
      "id": "3",
      "name": "Postgres \u2014 Open Compliance Items",
      "type": "n8n-nodes-base.postgres",
      "parameters": {
        "operation": "executeQuery",
        "query": "\nSELECT\n  COUNT(CASE WHEN item_type = 'OFAC_HIT_PENDING_REPORT' THEN 1 END) AS ofac_hits_pending_report,\n  COUNT(CASE WHEN item_type = 'SAR_PENDING_30D' AND DATEDIFF('day', detected_at, NOW()) >= 25 THEN 1 END) AS sars_approaching_deadline,\n  COUNT(CASE WHEN item_type = 'CTR_PENDING_15D' AND DATEDIFF('day', transaction_date, NOW()) >= 12 THEN 1 END) AS ctrs_approaching_deadline,\n  COUNT(CASE WHEN item_type = 'TRAVEL_RULE_VIOLATION' AND status = 'OPEN' THEN 1 END) AS travel_rule_violations_open,\n  COUNT(CASE WHEN item_type = 'STATE_MTL_EXPIRING_90D' THEN 1 END) AS mtl_expirations_90d,\n  COUNT(CASE WHEN item_type = 'MICA_INCIDENT_OPEN' THEN 1 END) AS mica_incidents_open\nFROM compliance_items\nWHERE status IN ('OPEN', 'PENDING')\n"
      },
      "position": [
        300,
        400
      ]
    },
    {
      "id": "4",
      "name": "Code \u2014 Build Report",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "jsCode": "\nconst metrics = $('Postgres \u2014 Platform Metrics').first().json;\nconst compliance = $('Postgres \u2014 Open Compliance Items').first().json;\nconst history = $getWorkflowStaticData('global');\nconst prevMrr = history.last_mrr_usd || 0;\nconst mrrWoW = prevMrr > 0 ? (((metrics.total_mrr_usd - prevMrr) / prevMrr) * 100).toFixed(1) : 'N/A';\nhistory.last_mrr_usd = metrics.total_mrr_usd;\n$setWorkflowStaticData('global', history);\n\nconst report = `<h2>FlowKit CryptoTech Compliance KPI \u2014 Week of ${new Date().toISOString().slice(0,10)}</h2>\n<h3>Platform Overview</h3>\n<table border='1' cellpadding='6'>\n<tr><th>Metric</th><th>Value</th><th>WoW</th></tr>\n<tr><td>Active Customers</td><td>${metrics.active_customers}</td><td>\u2014</td></tr>\n<tr><td>CEX Customers</td><td>${metrics.cex_count}</td><td>\u2014</td></tr>\n<tr><td>DeFi Customers</td><td>${metrics.defi_count}</td><td>\u2014</td></tr>\n<tr><td>Payment Processor Customers</td><td>${metrics.payment_processor_count}</td><td>\u2014</td></tr>\n<tr><td>Total MRR (USD)</td><td>$${Number(metrics.total_mrr_usd).toLocaleString()}</td><td>${mrrWoW}%</td></tr>\n<tr><td>API Calls (7d)</td><td>${Number(metrics.api_calls_7d).toLocaleString()}</td><td>\u2014</td></tr>\n<tr><td>Wallets Monitored</td><td>${Number(metrics.wallets_monitored).toLocaleString()}</td><td>\u2014</td></tr>\n<tr><td>Transactions Screened (7d)</td><td>${Number(metrics.transactions_screened_7d).toLocaleString()}</td><td>\u2014</td></tr>\n</table>\n<h3>Open Compliance Items</h3>\n<table border='1' cellpadding='6'>\n<tr><th>Item</th><th>Count</th><th>Status</th></tr>\n<tr><td>OFAC Hits Pending 10-Day Report</td><td><b>${compliance.ofac_hits_pending_report}</b></td><td>${compliance.ofac_hits_pending_report > 0 ? '\ud83d\udd34 CRITICAL' : '\u2705 Clear'}</td></tr>\n<tr><td>SARs Approaching 30-Day Deadline</td><td><b>${compliance.sars_approaching_deadline}</b></td><td>${compliance.sars_approaching_deadline > 0 ? '\ud83d\udd34 ACTION REQUIRED' : '\u2705 Clear'}</td></tr>\n<tr><td>CTRs Approaching 15-Day Deadline</td><td><b>${compliance.ctrs_approaching_deadline}</b></td><td>${compliance.ctrs_approaching_deadline > 0 ? '\ud83d\udfe1 REVIEW' : '\u2705 Clear'}</td></tr>\n<tr><td>Travel Rule Violations (Open)</td><td><b>${compliance.travel_rule_violations_open}</b></td><td>${compliance.travel_rule_violations_open > 0 ? '\ud83d\udd34 CRITICAL' : '\u2705 Clear'}</td></tr>\n<tr><td>State MTL Expirations (90 days)</td><td><b>${compliance.mtl_expirations_90d}</b></td><td>${compliance.mtl_expirations_90d > 0 ? '\ud83d\udfe1 RENEW' : '\u2705 Clear'}</td></tr>\n<tr><td>MiCA Incidents Open</td><td><b>${compliance.mica_incidents_open}</b></td><td>${compliance.mica_incidents_open > 0 ? '\ud83d\udd34 NOTIFY EU AUTH' : '\u2705 Clear'}</td></tr>\n</table>`;\n\nreturn [{ json: { report_html: report, metrics, compliance } }];\n"
      },
      "position": [
        500,
        300
      ]
    },
    {
      "id": "5",
      "name": "Gmail \u2014 CEO + CCO + CTO Report",
      "type": "n8n-nodes-base.gmail",
      "parameters": {
        "to": "{{CEO_EMAIL}}",
        "bcc": "{{CCO_EMAIL}},{{CTO_EMAIL}}",
        "subject": "={{new Date().toISOString().slice(0,10)}} \u2014 CryptoTech Weekly Compliance KPI",
        "message": "={{$json.report_html}}",
        "options": {
          "appendAttribution": false
        }
      },
      "position": [
        700,
        300
      ]
    },
    {
      "id": "6",
      "name": "Slack \u2014 Weekly Summary",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#compliance",
        "text": "Weekly KPI: MRR ${{$json.metrics.total_mrr_usd}} | {{$json.metrics.wallets_monitored}} wallets monitored | OFAC pending: {{$json.compliance.ofac_hits_pending_report}} | SARs approaching deadline: {{$json.compliance.sars_approaching_deadline}} | Travel Rule violations: {{$json.compliance.travel_rule_violations_open}}"
      },
      "position": [
        700,
        400
      ]
    }
  ],
  "connections": {
    "Schedule \u2014 Monday 8AM": {
      "main": [
        [
          {
            "node": "Postgres \u2014 Platform Metrics",
            "type": "main",
            "index": 0
          },
          {
            "node": "Postgres \u2014 Open Compliance Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Postgres \u2014 Platform Metrics": {
      "main": [
        [
          {
            "node": "Code \u2014 Build Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Postgres \u2014 Open Compliance Items": {
      "main": [
        [
          {
            "node": "Code \u2014 Build Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code \u2014 Build Report": {
      "main": [
        [
          {
            "node": "Gmail \u2014 CEO + CCO + CTO Report",
            "type": "main",
            "index": 0
          },
          {
            "node": "Slack \u2014 Weekly Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Why Self-Hosted n8n Is the Right Architecture for CryptoTech Compliance

Five data sovereignty arguments that are unique to the crypto compliance stack:

Argument Cloud iPaaS Problem Self-Hosted n8n Fix
FinCEN §5318(g)(2) SAR confidentiality SAR draft data + suspicious activity flags transiting cloud vendor logs = potential tipping-off exposure under §5318(g)(2) SAR workflow runs entirely inside FinCEN reporting institution boundary — no vendor log entry
OFAC SDN list currency Cloud automation with stale watchlist cache = processed transactions against entries added since last cache refresh Local SDN pull on every transaction execution = deterministic freshness inside compliance boundary
FATF Travel Rule PII Originator/beneficiary name/account/address transiting cloud vendor mid-transfer = data egress outside MTL compliance boundary + GDPR Art.46 cross-border safeguard issue for EU-facing operators Travel Rule PII handled by self-hosted n8n inside your regulated entity perimeter
SEC digital asset enforcement Cloud automation audit logs discoverable by SEC via third-party subpoena; investigation extends to vendor-held execution records Self-hosted n8n logs under your litigation privilege boundary; one subpoena target, not two
State MTL audit trail 49-state examiners can subpoena cloud automation vendor records independently of your response Transaction routing audit trail inside your regulated entity boundary; MTL examination scope is deterministic

Five Buyer Questions

Q: Does FinCEN §5318(g)(2) actually apply to cloud automation logs?
A: The statute prohibits notifying "any person" that a SAR has been filed or that a transaction has been reported. "Any person" includes cloud automation vendor support staff who can view execution logs for debugging. The practical risk is workflow debugging conversations that reference flagged customer IDs — those conversations may constitute disclosure. SAR data should not appear in any vendor-held log.

Q: Is OFAC really that concerned about stale SDN checks?
A: OFAC's Enforcement Guidelines (PDF 2019) emphasize that sanctions compliance programs must include "real-time or near-real-time" screening. OFAC FAQ 560 requires immediate blocking upon SDN match — if your cloud automation polled the SDN list 4 hours ago and a new entry was added since, you have processed unscreened transactions. OFAC has levied civil penalties for exactly this scenario.

Q: Does the FATF Travel Rule apply to DeFi front-end operators?
A: FinCEN's 2019 CVC guidance and 2022 proposed rulemaking both indicate that entities that "facilitate" covered transactions — including front-end interfaces with control over transaction routing — may be covered under the Travel Rule. The safe answer is: if your platform controls originator/beneficiary wallet data at transfer time, you should treat the Travel Rule as applicable.

Q: What is the penalty exposure for unregistered MSB operation?
A: Operating as an unregistered MSB is a federal criminal offense under 31 USC §5330 — up to 5 years imprisonment plus civil penalties. FinCEN has assessed penalties against crypto platforms that began operations before completing MSB registration. The 180-day window from "initiating services" is the relevant trigger.

Q: How does MiCA affect non-EU crypto platforms?
A: MiCA applies to any crypto-asset service provider (CASP) offering services to EU residents, regardless of where the provider is incorporated. The Article 66 4-hour incident notification obligation applies to platforms with EU users even if headquartered in the US. EU users constitute a significant portion of most CEX customer bases.


Get the Full Workflow Bundle

All five workflows are production-ready, import directly into n8n, and include compliance annotations for each node. Available at stripeai.gumroad.com — part of the FlowKit automation template library.

The bundle includes workflows for CryptoTech, FinTech, InsurTech, MedDevice SaaS, and 15+ additional regulated SaaS verticals.

Top comments (0)