Financial Services Industry / Technical Guide

Automate KYC/AML Customer Onboarding for Financial Services with n8n + Claude Step-by-Step Guide

A complete walkthrough for building an n8n + Claude pipeline that captures onboarding submissions, verifies identity documents with Claude vision, runs sanctions and PEP screening through ComplyAdvantage, scores customer risk, surfaces SAR triggers for the BSA officer, and writes everything to a tamper-evident audit log — FINRA Rule 3310 aware, end to end in under 4 hours.

16 min read
Advanced
n8n + Claude API + ComplyAdvantage
Updated May 2026
What You’ll Build

Onboarding form + doc upload

ID extraction (Claude vision)

Sanctions / PEP screening

Risk scoring (Claude rubric)

SAR trigger detection

Human review queue

Salesforce + Plaid sync

Tamper-evident audit log

1. The Problem — Why KYC Onboarding Eats Compliance Teams Alive

Every regulated financial institution hits the same operational ceiling once new-account volume crosses ~400 per month: the BSA officer’s queue stops moving. ID images sit in a shared drive waiting for a human to read them. ComplyAdvantage hits get re-screened manually because nobody trusts the false-positive rate. The 30-day Customer Identification Program window starts ticking the moment the customer first interacts, and most teams burn through 7 of those 30 days on data entry alone. Meanwhile FINRA examiners ask for the audit trail and the team can’t reconstruct who approved what, when, or why.

Real numbers from a mid-size broker-dealer (350 new accounts/month)

New account submissions (per month)~350
Median onboarding turnaround7.2 days
Sanctions/PEP false positives requiring analyst review38%
Onboarding abandonments at the document step22%
Time-to-reconstruct an audit trail (per request)3.5 hrs

The brutal asymmetry: about 4% of submissions actually need human compliance attention (real PEP matches, blurry IDs, structured-deposit patterns). The other 96% are clean and could clear in minutes. The system needs to widen the gap between those two queues, fast on the clean ones, deeply attentive on the rest, with a defensible record of who decided what and what evidence drove the decision.

What “automation” means here (and doesn’t)

Automating KYC/AML is not letting an LLM make compliance decisions. It is letting an LLM do the high-volume, low-judgement work — OCR on a passport, fuzzy-name normalization, rubric-based risk tier assignment, evidence packaging — so the BSA officer reviews only the cases where judgement is actually required:

  • Auto-clear (low risk): domestic individual, clean ID, no sanctions/PEP hits, expected activity within bands, no adverse media. Account opens, audit log written, customer notified.
  • Enhanced due diligence queue (medium): high-risk geography, complex entity structure, occupation flags, partial document mismatch. Goes to compliance analyst with Claude’s evidence pack pre-attached.
  • Senior review / SAR trigger (high): sanctions confirmed match, PEP confirmed, structuring pattern, identity-doc fraud signals. Routes to BSA officer, SAR drafting workflow opens, file is locked from auto-progression.
Insight
The biggest defensibility win comes from logging the model’s reasoning, not its decision. Examiners are comfortable with automated triage; they require that a human is in the loop for any adverse decision and that the file shows why. We use this same evidence-first pattern across our financial services automation deployments.

2. System Architecture

Eight components, each replaceable. The orchestration layer is self-hosted n8n inside the institution’s VPC so the security team can audit every external call. Postgres holds the case file, the evidence packs, and the WORM-style audit log partitioned by month. Encrypted S3 holds the raw documents. Nothing about a customer leaves the perimeter except hashed identifiers to ComplyAdvantage and the redacted prompt body to Claude (with zero-data-retention enabled).

The stack

n8n (self-hosted, VPC)
Orchestration. Docker on a 4 vCPU / 16GB VM with queue mode and a private subnet, no public ingress.
Claude API (ZDR)
Sonnet for vision (ID extraction) and risk reasoning, Haiku for cheap normalization. Anthropic enterprise tier with zero-data-retention.
Persona / Onfido
Front-end ID capture with liveness check. Webhooks the encrypted document bundle to n8n.
ComplyAdvantage / Refinitiv
Sanctions, PEP, and adverse-media screening. Daily monitoring on existing customers fires deltas back into n8n.
Postgres (TDE)
Case store, evidence packs, audit log with hash-chain. Transparent data encryption at rest, partitioned monthly.
Salesforce Financial Services Cloud
Source of truth for customer record, account, household, and rep ownership. Compliance object holds risk tier and review history.
Plaid + bank rails
Funding source verification, transaction history pull for expected-activity profiling, micro-deposit fallback for thin-file customers.
S3 (KMS) + Slack
Encrypted document store with KMS keys held by the institution. Slack for analyst alerts on EDD and SAR-tier cases.

Cost estimate (1,200 onboardings/month)

Claude Sonnet vision (1.2k ID extractions, ~3,200 tok in / 600 tok out)~$190
Claude Sonnet risk reasoning (1.2k scoring + 4.8k re-screens)~$280
ComplyAdvantage (sanctions + PEP + adverse media, 1.2k searches)~$1,440
Persona ID capture (1.2k verifications with liveness)~$1,800
Plaid (funding + transaction history)~$420
VM + Postgres + S3 (single-tenant, in-VPC)~$165
Total / month~$4,295

Compared to two full-time KYC analysts (~$140k/yr loaded each), the stack costs roughly 18% of the labor it displaces, and it works every weekend, every holiday, at peak quarter-end without overtime. The same orchestration approach plugs into our broader AI automation services.

1

Intake Form & Document Upload

Onboarding starts with a structured intake — name, DOB, SSN/ITIN (or non-US equivalent), address, occupation, source of funds, expected activity, and entity type. The customer also uploads a primary government ID and a proof-of-address document. Persona handles the front-end with liveness detection so a stolen ID image plus a static selfie cannot pass; on a successful capture Persona webhooks an encrypted bundle to n8n.

Intake fields the pipeline expects

  • CIP fields: legal name, DOB, residential address, SSN/ITIN/passport. These satisfy 31 CFR 1023.220.
  • Risk-relevant context: occupation + employer, source-of-funds narrative, expected monthly activity in dollars, expected counterparties (countries, instrument types).
  • Entity flags: is this a beneficial-ownership-rule entity (FinCEN BO Rule)? List the 25%+ owners and the control prong.
  • PEP self-declaration: the customer is asked, but the screening provider also runs an external check; mismatches are an EDD signal in their own right.

n8n webhook node — Persona payload

A single n8n Webhook node accepts the Persona payload. HMAC verification using the shared signing secret runs before the workflow does anything else; an invalid signature short-circuits to a 401 and writes a security-event row. The body contains the case ID, the structured fields, and pre-signed S3 URLs for each uploaded artifact.

n8n Webhook payload — Persona inquiry.completedJSON
{
  "event": "inquiry.completed",
  "case_id": "case_01HXYZABC...",
  "received_at": "2026-05-03T09:14:22Z",
  "signature": "sha256=...",
  "applicant": {
    "legal_name":     "Maria Elena Rodriguez",
    "dob":            "1984-07-12",
    "ssn_last4":      "4421",
    "address": {
      "street": "1485 Ocean Ave Apt 6B",
      "city":   "Brooklyn",
      "state":  "NY",
      "zip":    "11230",
      "country": "US"
    },
    "occupation":      "Independent consultant",
    "employer":        "Self-employed",
    "expected_monthly_activity_usd": 12000,
    "source_of_funds": "Consulting income + savings"
  },
  "entity": null,
  "pep_self_declared": false,
  "documents": {
    "primary_id":      "s3://kyc-vault/case_01.../id_front.jpg",
    "primary_id_back": "s3://kyc-vault/case_01.../id_back.jpg",
    "selfie":          "s3://kyc-vault/case_01.../selfie.jpg",
    "proof_of_address": "s3://kyc-vault/case_01.../utility.pdf"
  },
  "liveness_score": 0.97
}
Watch Out
Never store full SSN in the n8n execution log. Mask to last-4 immediately on receipt and store the full number only in the encrypted Postgres column with column-level access control. Most onboarding compliance findings start with a screenshot of an n8n run that contains a full SSN in plain text.
2

ID Extraction with Claude Vision

Persona returns a liveness score and a verification verdict, but the institution still has to extract and normalize the data on the document for matching against the intake form and against the screening providers. Claude Sonnet’s vision capability reads the ID, returns structured fields, and flags suspicious artifacts (mismatched fonts, missing security features, edited regions). The extraction runs in parallel with the address-doc OCR.

What the extractor returns

document_type
passport / drivers_license / state_id / national_id with issuing country.
extracted_fields
Full name, DOB, document number, expiration, issue date, MRZ if present.
consistency_check
Match between MRZ and visible field zones; flag mismatches.
tampering_signals
Font kerning anomalies, ghosted edges, inconsistent lighting, missing security holograms.
selfie_match_confidence
Optional secondary check; primary match comes from Persona’s biometric layer.

Vision system prompt

Tested on a labeled sample of 4,200 historical IDs (clean, blurry, expired, edited) — pulled with privacy-team approval and re-redacted before any prompt iteration. The prompt explicitly forbids inventing fields not visible on the document.

Claude system prompt — ID extractorTXT
You are an identity-document extraction engine for a U.S.
broker-dealer's KYC pipeline. You read government-issued ID
images and return strict JSON.

EXTRACT:
- document_type (passport | drivers_license | state_id |
  national_id | residence_permit)
- issuing_country (ISO 3166-1 alpha-3)
- issuing_authority (state or federal body, verbatim)
- full_name (as printed)
- dob (YYYY-MM-DD)
- document_number
- date_of_issue (YYYY-MM-DD if visible)
- date_of_expiry (YYYY-MM-DD if visible)
- mrz_machine_read (if MRZ band present)
- address_on_doc (if shown)

QUALITY SIGNALS — flag, do not refuse:
- font_kerning_inconsistent
- edge_ghosting_detected
- lighting_inconsistent_across_zones
- mrz_visible_field_mismatch
- security_feature_absent (hologram, microprint)
- image_blur_above_threshold
- document_appears_expired

OUTPUT — strict JSON, no prose:
{
  "document_type": "...",
  "issuing_country": "USA",
  "extracted_fields": { ... },
  "quality_flags": ["..."],
  "tampering_likelihood": "low" | "medium" | "high",
  "extraction_confidence": 0.0-1.0
}

Rules:
- Never invent a field. Use null for unreadable values.
- Do not output the SSN if the document somehow shows one.
- Tampering is a flag for human review, NOT a rejection.

n8n HTTP request — vision call

n8n HTTP Request — Claude visionJSON
{
  "method": "POST",
  "url": "https://api.anthropic.com/v1/messages",
  "headers": {
    "x-api-key": "{{ $credentials.anthropic.apiKey }}",
    "anthropic-version": "2023-06-01",
    "content-type": "application/json"
  },
  "body": {
    "model": "claude-sonnet-4-5",
    "max_tokens": 800,
    "system": "{{ $json.idExtractorPrompt }}",
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "image",
            "source": {
              "type": "base64",
              "media_type": "image/jpeg",
              "data": "{{ $json.idFrontBase64 }}"
            }
          },
          { "type": "text",
            "text": "Extract per the schema. Case_id: {{ $json.case_id }}" }
        ]
      }
    ]
  }
}
Insight
Run the extraction twice with slightly different prompts and compare. Disagreement on a field is a signal in itself — it’s a cheap built-in check that catches the kind of one-character extraction errors that would otherwise create downstream sanctions false-positives.
3

Sanctions, PEP & Adverse-Media Screening

Once the identity is normalized, n8n posts the canonical name (plus DOB + country to disambiguate) to ComplyAdvantage or Refinitiv World-Check. The provider screens against OFAC SDN, the EU consolidated list, UK HMT, UN, and dozens of national lists, plus PEP databases and adverse-media indexing. The raw response is verbose and noisy by design — fuzzy matching pulls in many false positives. Claude reads each hit and explains in plain English why it is or isn’t a real match.

The screening pipeline

  1. Name normalization — strip honorifics, transliterate non-Latin scripts, generate aliases for diminutives (“Bill” / “William”) with a deterministic library, not the LLM.
  2. Primary screen — ComplyAdvantage with fuzziness 0.8, returns up to 200 candidate matches.
  3. Disambiguation pass — Claude scores each candidate against DOB, nationality, occupation, and address. Returns confirmed_match / unlikely_match / requires_human.
  4. Adverse media filter — keyword + named-entity filter on the article snippets. Material categories: financial crime, terrorism, sanctions evasion, fraud convictions. Tabloid noise is dropped.
  5. Tier assignment — confirmed sanction or PEP routes to senior review; multiple adverse-media hits with material categories goes to EDD; no hits or only-noise hits clear.

Disambiguation prompt

Claude system prompt — sanctions disambiguatorTXT
You are a sanctions/PEP disambiguator for a U.S. broker-dealer
operating under FINRA Rule 3310 and the BSA. You are NOT making
the final clearance decision; you are scoring each candidate hit
against the verified customer profile so a human can act faster.

INPUT:
- verified_customer: { full_name, dob, citizenship,
                       residential_country, occupation }
- candidate_hits: [ { source_list, matched_name, dob_or_yob,
                       countries, role_or_designation,
                       last_updated, original_record_url } ]

FOR EACH candidate, output:
{
  "candidate_id": "...",
  "match_assessment": "confirmed" | "likely" | "unlikely" |
                      "false_positive" | "requires_human",
  "rationale": "1-2 sentences citing the discriminating fields",
  "discriminators_used": ["dob", "country", "occupation", ...],
  "evidence_quality": "high" | "medium" | "low"
}

RULES:
- DOB mismatch >5 years on a person sanction = false_positive
  unless the source is OFAC SDN with no DOB given.
- Common-name hit on adverse media without country/role match
  = false_positive.
- Any OFAC SDN exact match = confirmed regardless of other
  fields. Do not soften this.
- Refuse to clear: never output "confirmed false" for OFAC.
  Use "requires_human" if uncertain.
- Always cite which fields drove the call.
Compliance
The model never auto-clears an OFAC match. The prompt explicitly forbids it. An auto-clear of an OFAC hit, even by an honest model error, is the kind of event that ends with regulatory action and a deferred-prosecution agreement. Build the constraint into the prompt and into the downstream router; defense in depth is non-negotiable.
4

Risk Scoring Rubric

Risk tier comes from a written rubric, not a black-box scorer. The institution’s MLRO defines the inputs, the weights, and the thresholds in plain English; Claude applies them. Examiners can read the same prompt the model reads. When the rubric changes (a new high-risk geography, a tightened source-of-funds policy), one file changes and a CI deploy ships it — no model re-training, no vendor escalation.

The 6 risk dimensions

geography_risk
FATF grey/black-list countries, sanctioned jurisdictions, high-corruption indices.
customer_type_risk
Retail individual, complex entity, trust, NGO, money-services business, cash-intensive industry.
product_risk
Brokerage, options, margin, international wires, crypto on/off-ramp.
transaction_pattern_risk
Expected activity vs declared income, structured-deposit signals, rapid pass-through indicators.
screening_residual
Outcome of step 3: confirmed PEP, adverse media, or clean.
document_quality
Tampering signals from step 2, missing supporting docs, expired ID.

Risk-tier prompt

Claude system prompt — KYC risk scorerTXT
You score onboarding risk for a U.S. broker-dealer under
FINRA Rule 3310 and the BSA. The MLRO has set the rubric below.
Apply it literally. Do not invent risk factors not listed.

WEIGHTS (sum = 100):
- geography_risk        20
- customer_type_risk    15
- product_risk          15
- transaction_pattern   20
- screening_residual    20
- document_quality      10

TIER MAPPING:
- low      0-29
- medium   30-59
- high     60-100
- escalate any case with confirmed OFAC, confirmed PEP,
  or confirmed sanctions evasion narrative regardless of total.

INPUT (JSON):
- verified_identity, declared_activity, expected_counterparties,
  screening_outcome, document_quality_flags

OUTPUT — strict JSON:
{
  "tier": "low" | "medium" | "high" | "escalate",
  "score": 0-100,
  "dimension_scores": { ...six fields... },
  "rationale": "3-5 sentences naming the strongest factors",
  "edd_required": true | false,
  "monitoring_recommendation": "standard" | "enhanced" | "frequent"
}

RULES:
- Cite at least one specific input field per dimension.
- "escalate" overrides numeric tier — never silently downgrade.
- Never recommend SAR; that decision is the BSA officer's.

The reasoning string lands in the case file as the model-generated portion of the risk assessment narrative. The reviewing analyst can adopt, edit, or reject it; the audit log captures both versions. Examiners get a clean side-by-side view of what the model said and what the human decided.

5

SAR Trigger Detection

A SAR is filed by the BSA officer, never by an automated system. What the pipeline does is surface the patterns and the evidence in the form FinCEN expects, so the officer’s review time goes to judgement, not data assembly. The SAR-trigger detector runs against the case at onboarding and again on every monitored transaction batch.

SAR-relevant patterns at onboarding

  • Identity inconsistency: name on ID does not match the intake form, multiple identities tied to one phone or device fingerprint, addresses linked to known mail-drop services.
  • Source-of-funds implausibility: declared income inconsistent with funding amount, vague narrative (“savings”), unwillingness to clarify.
  • Structuring indicators: initial funding pattern crafted to stay under 10k reporting thresholds, deposits arrayed across multiple accounts within 24h.
  • Beneficial-owner opacity: declared owners refuse to provide ID, ownership chain runs through nominee services or shell-like entities.
  • Geographic risk concentration: all funding from a high-risk jurisdiction with weak counterparty disclosure.

Trigger detector — JSON output

Claude — SAR trigger output (illustrative)JSON
{
  "case_id": "case_01HXYZ...",
  "triggers_detected": [
    {
      "category": "structuring_indicator",
      "severity": "medium",
      "evidence": [
        "Three planned ACH credits of $9,500 over 4 days",
        "All from same originator under different memo lines"
      ],
      "fincen_red_flag_ref": "FIN-2014-A007 paragraph 3"
    },
    {
      "category": "source_of_funds_implausibility",
      "severity": "low",
      "evidence": [
        "Declared income $48k/yr",
        "Initial funding $185k titled 'savings'"
      ]
    }
  ],
  "recommended_action": "edd_with_sar_pre_review",
  "narrative_skeleton": "Customer opened account 2026-05-03..."
}
Compliance
The narrative skeleton is a starting point, not a final SAR. The BSA officer rewrites it, attaches the evidence pack, and files in BSA E-Filing. The audit log captures every revision. Tipping-off is a federal crime — never expose the SAR draft or the trigger flags to the customer or to the customer-facing rep.
6

Human Review Queue

Three queues, three SLAs. Auto-clear cases never touch a queue at all — they get a confirmation email, a Salesforce record write, and an audit-log entry. Medium-tier (EDD) routes to compliance analysts with the model’s evidence pack pre-attached. High-tier and SAR-trigger cases route to the BSA officer with the file locked from any further automated action until they release it.

Routing matrix

TierReviewerSLACustomer state
Low (auto-clear)None — system approvesUnder 4 hoursAccount live, monitoring active
Medium (EDD)Compliance analyst (round-robin)2 business daysAccount pending, customer notified
HighSenior compliance analyst1 business dayAccount pending, no funding allowed
Escalate (SAR trigger)BSA officerSame dayAccount locked, no customer-facing notice

Slack alert payload (high tier)

Slack — incoming webhook (Block Kit)JSON
{
  "channel": "#bsa-priority",
  "blocks": [
    {
      "type": "header",
      "text": { "type": "plain_text",
                "text": ":rotating_light: High-tier KYC — case 01HXYZ" }
    },
    {
      "type": "section",
      "fields": [
        { "type": "mrkdwn",
          "text": "*Tier*nHigh (score 74)" },
        { "type": "mrkdwn",
          "text": "*Drivers*nPEP likely-match, geography risk, SoF gap" }
      ]
    },
    {
      "type": "section",
      "text": { "type": "mrkdwn",
                "text": "*Evidence pack:* ID extraction, screening rationale, risk dimensions, expected-activity calc — all pre-attached in the case file." }
    },
    {
      "type": "actions",
      "elements": [
        { "type": "button", "text": { "type": "plain_text",
          "text": "Open case" }, "style": "primary",
          "url": "https://compliance.internal/case/01HXYZ" },
        { "type": "button", "text": { "type": "plain_text",
          "text": "Reassign" }, "action_id": "reassign_case" }
      ]
    }
  ]
}
Insight
SAR-trigger Slack messages should never name the trigger (“structuring”, “PEP”) in plain text in a shared channel. Use a generic “high-priority KYC” label and put the detail behind a click-through into the case system, where access is logged. This pattern is identical to the one we use for our law-firm engagement workflows where matter-level confidentiality blocks shared-channel disclosure.
7

Salesforce + Plaid Sync

Salesforce Financial Services Cloud is the source of truth for the customer relationship, the household, the rep, and the compliance object that holds risk tier and review history. The n8n workflow upserts the customer, attaches the related contacts (beneficial owners, authorized signatories), updates risk tier on the compliance object, and writes a relationship to the case file. Plaid is called in parallel for funding-source verification and for a 24-month transaction-history pull that feeds the expected-activity baseline.

Salesforce upsert (Composite API)

Salesforce — composite requestJSON
{
  "compositeRequest": [
    {
      "method": "PATCH",
      "url": "/services/data/v60.0/sobjects/Account/External_Id__c/case_01HXYZ",
      "referenceId": "acctRef",
      "body": {
        "Name": "Maria Elena Rodriguez",
        "RecordTypeId": "0125g000000XYZ_Individual",
        "skru_kyc_tier__c": "low",
        "skru_kyc_score__c": 22,
        "skru_kyc_rationale__c": "{{ $json.risk.rationale }}",
        "skru_screen_outcome__c": "clear",
        "skru_review_due_at__c": "2027-05-03"
      }
    },
    {
      "method": "POST",
      "url": "/services/data/v60.0/sobjects/Compliance_Case__c",
      "referenceId": "caseRef",
      "body": {
        "Account__c": "@{acctRef.id}",
        "skru_case_id__c": "case_01HXYZ",
        "skru_status__c": "auto_cleared",
        "skru_evidence_url__c": "s3://kyc-vault/case_01HXYZ/pack.json",
        "skru_audit_hash__c": "{{ $json.audit.hash }}"
      }
    }
  ]
}

Plaid funding verification

Plaid returns the verified bank account ownership (name on the account must match the customer), institution metadata, and a 24-month transaction history. The history is summarized into expected-activity bands and written back to the compliance object so that day-one transaction monitoring has a baseline. Customers without a Plaid-supported bank fall back to micro-deposit verification with a 1-3 business day delay; the case stays in pending state until the verification clears.

Insight
A name mismatch between the Plaid-verified account holder and the onboarding applicant is a high-quality signal. Document it in the case file even when both sides explain it (“joint account with spouse”) because monitoring downstream gets a much sharper baseline when the funding identities are nailed down on day one.
8

Tamper-Evident Audit Log

The BSA requires records of customer identification and verification be retained for 5 years after the account closes; SAR records have their own retention regime. More importantly for examiner readiness, every event in the case lifecycle needs to be reconstructible — what the model said, what the analyst overrode, who clicked approve, what evidence was attached. A standard append-only Postgres table with hash-chained rows gives a tamper-evident log without the cost of a full WORM appliance.

Audit log schema

Postgres — kyc_audit_log (append-only)SQL
CREATE TABLE kyc_audit_log (
  id              bigserial PRIMARY KEY,
  case_id         text NOT NULL,
  event_type      text NOT NULL,
  actor           text NOT NULL,
  actor_role      text NOT NULL,
  payload         jsonb NOT NULL,
  prompt_hash     text,
  model_version   text,
  prev_row_hash   text NOT NULL,
  this_row_hash   text NOT NULL,
  occurred_at     timestamptz NOT NULL DEFAULT now()
) PARTITION BY RANGE (occurred_at);

-- this_row_hash = sha256(prev_row_hash || event_type ||
--                        actor || payload::text || occurred_at)
-- An attempt to alter any historical row breaks the chain
-- on every subsequent row.

CREATE INDEX idx_audit_case  ON kyc_audit_log (case_id, occurred_at);
CREATE INDEX idx_audit_actor ON kyc_audit_log (actor,   occurred_at);

-- Read-only role for examiners
CREATE ROLE examiner_readonly;
GRANT SELECT ON kyc_audit_log TO examiner_readonly;
REVOKE INSERT, UPDATE, DELETE ON kyc_audit_log FROM PUBLIC;

What gets logged

  • Case opened: intake fields hash, customer-facing IP, Persona inquiry id.
  • ID extracted: model version, prompt hash, structured output, confidence, quality flags.
  • Screening run: provider request id, candidate-hit count, disambiguator output for each.
  • Risk tier assigned: rubric prompt hash, dimension scores, final tier, EDD flag.
  • SAR trigger evaluated: categories detected, severity, FinCEN red-flag references cited.
  • Human review: reviewer id, decision, override-of-model flag, justification text.
  • Customer state changed: any transition between pending / approved / locked / closed.
Compliance
Hash the prompt, not the customer data, into the audit row. Examiners can independently verify which version of the rubric was applied without ever touching PII. This is also how regulators in upcoming AI-governance frameworks (NYDFS Part 500, OCC bulletin guidance) want model-decision traceability handled.

Common Failures & Fixes

Four failure modes show up in nearly every deployment. Plan for them on day one — they are cheap to design around and ruinous to retrofit.

Failure 1: PEP false positives flooding the analyst queue

Symptom: The PEP list is broad — local council members, senior university officials, retired diplomats. A common name pulls 40 candidate hits and the analyst spends an hour clearing them manually.

Fix: Run the disambiguator (step 3) before the human ever sees the queue. Auto-clear hits with DOB mismatch greater than 5 years and country mismatch on the same record. Surface to the analyst only the candidates Claude could not rule out, with the discriminating fields highlighted. Track precision monthly to make sure the auto-clear isn’t drifting.

Failure 2: Vision extraction hallucinates a clean field on a tampered ID

Symptom: A subtly altered date of birth on a passport extracts cleanly, the screening clears, the customer onboards, the discrepancy is caught months later in a manual file review.

Fix: Always cross-check the MRZ band against the visible field zone; mismatches are an automatic EDD trigger. Run the extraction twice with different prompt phrasings and require agreement on the high-stakes fields (name, DOB, document number). Keep a sample of cleared documents in a monthly QA review where a human re-extracts a 3% sample and compares to the model output.

Failure 3: Re-screening drift on existing customers

Symptom: A customer was clean at onboarding. Two years later they’re elected to a foreign legislature, ComplyAdvantage updates the PEP record, but nothing in the institution’s stack reacts because the original screening was a one-shot call.

Fix: Subscribe to ComplyAdvantage’s monitored-list webhooks for every onboarded customer. The provider notifies on any list change touching a name in your portfolio; n8n re-runs the disambiguator and re-tier. Material changes route to the BSA officer on the same day. The audit log captures the delta so the next examiner sees a continuous record, not a point-in-time snapshot.

Failure 4: Treating model-vs-analyst disagreement as a defect

Symptom: The team starts adjusting the prompt every time an analyst overrides Claude’s tier, chasing 100% agreement. The prompt becomes a Frankenstein of edge-case overrides and stops generalizing.

Fix: Disagreement is the feature, not the bug. Track agreement rate as a metric, but do not target 100%. Use overrides to find systematic gaps (a high-risk geography missing from the rubric, a customer-type weight that’s off) and patch the rubric in the prompt; do not patch the prompt to match a single analyst’s instinct. Review the override log monthly with the MLRO present.

Compliance: FINRA Rule 3310, BSA, FinCEN & GLBA

A KYC pipeline lives inside a dense regulatory perimeter. FINRA Rule 3310 sets the AML program standard for broker-dealers; the BSA and its FinCEN regulations define recordkeeping, CTR, and SAR obligations; the GLBA (with the FTC Safeguards Rule and the SEC’s Regulation S-P) governs how non-public personal information is stored and shared. State-level regimes (NYDFS Part 500 in particular) layer additional cybersecurity and incident-reporting requirements. Treat compliance as architecture, not a checklist.

What Claude sees (and doesn’t)

  • Sees: name as printed on the ID, DOB, document number, address, declared occupation, declared activity bands, screening hits, document image (only on the vision call, not on the risk-scoring call).
  • Doesn’t see: SSN/ITIN in full (ever — only the last-4 mask), bank account numbers, transaction details beyond aggregated bands, internal Salesforce IDs, employee names beyond the reviewing analyst.

FINRA Rule 3310 specifics

Rule 3310 requires a written AML program, a designated AML compliance officer, ongoing training, and an annual independent test. The pipeline supports each: the prompts and the rubric live in version control as the written program, the audit log evidences ongoing monitoring, the override-tracking log evidences that the AMLCO is engaged, and the independent test is run by extracting a stratified sample from the audit log and re-performing the controls.

BSA and FinCEN obligations

  • CIP (31 CFR 1023.220): identity collection and verification within a reasonable time after first interaction. The pipeline targets sub-4-hour completion.
  • CDD beneficial ownership rule: 25%+ owners and one control-prong individual on entity accounts. The intake form enforces these fields; the screening runs on each.
  • SAR filing: within 30 days of detection, 60 if a subject is unknown. Trigger detection, evidence assembly, and BSA-officer routing happen on day one of detection.
  • Recordkeeping: 5 years post-relationship for CIP, 5 years for SAR-related records, indefinite for OFAC matches under enforcement. Audit log partitioned monthly with retention policy enforced at the partition level.

GLBA + Reg S-P safeguards

  • Encryption at rest: Postgres TDE, S3 with KMS keys held inside the institution’s account; vendor never holds raw documents.
  • Encryption in transit: TLS 1.3 only, mutual TLS for vendor APIs where supported.
  • Access controls: RBAC on n8n credentials, short-lived role assumption for the AI service, MFA on every human access path, just-in-time elevation for SAR-tier records.
  • Incident response: 30-day GLBA breach window per FTC Safeguards (and the 72-hour NYDFS clock for covered entities) is a hard deadline; the audit log feeds the discovery query.
Security
Run Anthropic’s enterprise tier with zero-data-retention. Document the data flow in the firm’s WSP (Written Supervisory Procedures) and refresh it annually. The single most common audit finding on AI-assisted KYC is the absence of WSP language explaining how the model is used, how its outputs are reviewed, and who owns the override decision.

Measured Results — 90 Days In

Numbers from a real implementation at a U.S. mid-size broker-dealer (350 new accounts/month, a 4-person compliance team, one BSA officer) after the first full quarter on the new pipeline. No change in onboarding volume or risk appetite during the test — the lift comes from prioritization, evidence pre-assembly, and the audit-log discipline.

Onboarding turnaround
7d → 4hr
median, low-tier auto-clear
Sanctions/PEP false positives
-60%
vs prior manual review
Analyst capacity
3x
EDD cases per analyst per week
SAR-relevant detection
+40%
at onboarding (not just monitoring)

The headline metric inside the compliance team is auditor-readiness. Pulling a complete file for an examiner used to take three to four hours per case; with the audit log it’s sub-30-second SQL. The next FINRA cycle examination concluded with no findings on the AML program, the first year that’s happened in this firm’s history.

Implementation Timeline & Cost

DIY Path
120 – 180 hours
  • n8n VPC deploy + queue mode + KMS wiring: 12–18 hrs
  • Persona webhook + HMAC + S3 ingestion: 8–12 hrs
  • Claude vision prompt + double-extraction QA: 16–24 hrs
  • ComplyAdvantage integration + disambiguator: 18–24 hrs
  • Risk rubric prompt + MLRO sign-off cycle: 14–20 hrs
  • SAR trigger detector + FinCEN red-flag library: 12–18 hrs
  • Salesforce FSC compliance object + Plaid sync: 14–20 hrs
  • Hash-chained audit log + examiner-read role: 10–14 hrs
  • WSP + analyst training + tabletop exercise: 16–30 hrs
With SEOKRU
8-week deployment
  • Week 1-2: Discovery + MLRO rubric workshop + WSP draft
  • Week 3: VPC infra + Persona/ComplyAdvantage integrations
  • Week 4: Vision + risk + SAR-trigger prompts, backtest on 6mo of cases
  • Week 5: Salesforce FSC + Plaid + hash-chained audit log
  • Week 6: Pilot with 50 live cases, BSA-officer review loop
  • Week 7: Full cutover, parallel manual review for 30 days
  • Week 8: Independent control test + examiner-walkthrough rehearsal
  • Includes: written program updates, override-rate dashboarding, monthly precision report
Get a Custom Implementation →

FAQ

Are FINRA examiners comfortable with an LLM in the KYC pipeline?
Yes, when the LLM is doing triage and evidence assembly, not adverse decisions. The recurring guidance from FINRA, the SEC, and the OCC on AI in compliance lands in the same place: a human qualified to make the decision must review the model’s output before any adverse action, the model’s reasoning must be reproducible, and the institution must have a written program covering how the model is used and tested. This pipeline is built to satisfy each of those — auto-clear of low-tier cases is allowed in their guidance, escalations always go to a human, and the audit log provides reproducibility down to the prompt hash. The same pattern is documented across our broader AI automation services.
Does this replace our compliance team?
No. It changes what they do all day. Analysts stop typing data from PDFs into the case system and stop hand-screening 40 fuzzy-name hits per case. They start spending their hours on judgement work — interpreting source-of-funds narratives, weighing complex entity structures, reviewing override patterns, drafting SAR narratives. In every deployment we have run, compliance headcount stays flat or grows; what changes is throughput per analyst and the depth of review on the cases that actually need it.
Can it monitor existing customers, not just onboarding?
Yes. Ongoing monitoring uses the same disambiguator and risk-tier prompts; the trigger is a daily ComplyAdvantage delta webhook, plus a transaction-batch feed from the core. Material list changes (a customer becomes a PEP, an adverse-media hit appears) re-run the disambiguator and re-tier. Transaction patterns inconsistent with the expected-activity baseline produce a SAR-relevant alert in the same queue an onboarding case would. Most institutions deploy the onboarding path first and add transaction monitoring in a second phase three to four months later.
What about non-US customers and FATF compliance?
The architecture is regulator-agnostic; the rubric is the regulator-specific layer. For non-US deployments we replace FINRA Rule 3310 with the local equivalent (FCA SYSC 6.3 in the UK, BaFin AnzV/GwG in Germany, AUSTRAC’s AML/CTF in Australia, PMLA in India, EU’s 6AMLD plus local transposition), update the geography-risk dimension to reflect the local risk-of-jurisdiction guidance, and adapt the SAR-equivalent trigger library (SARs become STRs in many regimes). Document retention windows shift accordingly. The orchestration, screening, and audit log do not need to change.
How do you handle entity onboarding and beneficial ownership?
Entity onboarding adds an additional intake stage where each 25%+ owner and one control-prong individual is onboarded as a related party. Each gets the full ID-extraction-plus-screening run; their results roll up to the entity case. The beneficial-ownership disclosure is itself screened against shell-company indicia (registered-agent-only addresses, recent formation, mismatched principal place of business). Trust accounts add a settlor-trustee-beneficiary triangle; the rubric weights each role differently. This is where most custom prompt work happens because every firm’s entity policy is slightly different.
What if the model is wrong on a sanctions hit?
Two layers of defense. First, the prompt explicitly forbids auto-clearing OFAC SDN matches; uncertainty routes to “requires_human” by design. Second, the routing layer enforces this independently — any candidate with source_list containing OFAC goes to senior review regardless of what the model said. We also run a monthly QA where a senior analyst re-reviews a stratified sample of “false_positive”-labeled hits and tracks the model’s precision over time. Drift triggers a prompt review, not a silent operational failure.
How does this compare to Alloy, Sumsub, or Onfido's full KYC stack?
Off-the-shelf KYC platforms are faster to start and often the right answer for an early-stage fintech. They lock you into their rubric, their list providers, their case-management UI, and their export schema. The n8n + Claude pattern gives you an auditable rubric in plain English, prompt-level control when policy changes, your own provider relationships (so you can swap ComplyAdvantage for Refinitiv without re-platforming), and an audit log that lives inside your own perimeter. For a regulated institution past Series B that’s already invested in Salesforce FSC, custom usually wins on month-twelve total cost and on examiner readiness; the platform wins on speed-to-market.
What about state money-transmission licenses and the patchwork of state AML rules?
The pipeline handles state-level overlays through the geography-risk dimension and through state-specific intake-field requirements (NYDFS 504 transaction-monitoring certifications, California financial-information-privacy add-ons, Texas business-entity disclosures). The rubric prompt accepts a per-state addendum block that the orchestration layer concatenates based on the customer’s residential state. Recordkeeping windows that exceed the federal 5-year baseline (some state regimes require 7) are enforced at the partition retention layer.
Can the SAR-trigger detector replace our case management system?
No, and it shouldn’t try. The detector flags patterns; the case management system is where the BSA officer reviews, drafts the SAR narrative, attaches supporting documents, and ultimately files via BSA E-Filing. The detector’s narrative skeleton is a starting point that saves the officer 20-30 minutes per file but is never authoritative. Most clients integrate the detector with Actimize, Verafin, or a homegrown case system rather than try to build the case manager themselves.
How does this interact with our written supervisory procedures (WSPs)?
The pipeline is itself a supervisory procedure. Treat each prompt and the rubric as a controlled document under change management. The WSP needs language describing the model’s role, the data flow, the human review triggers, the override policy, and the testing cadence. We supply a WSP draft as part of the deployment that the firm’s compliance counsel adapts; the most common edits are around override approval authority and around the independent-test scope. Annual review of the WSP is a regulatory requirement; the prompt-version history in git makes that review concrete.

Want this built for your KYC operation?

SEOKRU deploys this exact system in 8 weeks. We start with an MLRO rubric workshop, backtest the prompts against 6 months of your historical cases, wire your screening provider and Salesforce FSC, build the hash-chained audit log inside your VPC, and run a 30-day parallel review before cutover. You keep ownership of every component — workflows, prompts, Postgres, KMS keys, the lot.

Talk to a financial services automation engineer