v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Customer Onboarding KYC Verification

Automated compliance checks that validate identity documents, screen against watchlists, and apply risk-based due diligence during onboarding.

Solution

This KYC verification system streamlines financial customer onboarding through multi-layered risk evaluation and identity verification. It calculates customer risk scores based on geographic location, politically exposed person status, business type, and transaction amounts. Document validation ensures appropriate credentials match the assigned risk level, preventing acceptance of expired or insufficient documentation for high-risk scenarios.

The system performs thorough watchlist screening against sanctions lists, PEP databases, and adverse media sources, automatically triggering rejection for sanctioned individuals. Based on risk assessment, it determines the appropriate due diligence level (standard, enhanced, or blocked) and specifies exactly which additional verification requirements apply, such as source of funds documentation or face verification. This reduces compliance costs while ensuring regulatory requirements are met across all customer risk profiles.

How it works

The decision graph applies a systematic approach to KYC verification:

  1. Customer Risk Scoring: Evaluates customer data including location, PEP status, business type, and transaction values to generate a risk score and classification.
  2. Document Verification: Validates ID documents against the assigned risk level, ensuring appropriate documentation types for each risk category.
  3. Watchlist Screening: Checks customer information against sanctions lists, PEP databases, and adverse media sources.
  4. Due Diligence Determination: Calculates the appropriate due diligence level based on risk factors and watchlist results.
  5. Additional Requirements: Identifies specific verification requirements like source of funds documentation or enhanced monitoring.
  6. Verification Result: Produces a final decision (approved, pending, or rejected) with clear next steps for each customer.

Where teams use it

  • Banking customer onboarding
  • Investment account setup
  • Cryptocurrency exchanges
  • Payment service providers
  • Lending platforms
  • Insurance policy applications
  • Wealth management services
  • Fintech user verification

Inside the decision model

Customer Onboarding KYC Verification ships as a JDM decision graph with 7 nodes, 4 decision tables and 25 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph7 nodes · read-only
input requesttable customerRiskScoringtable documentVerificationtable watchlistCheckexpression dueDiligenceLeveltable additionalChecksexpression verificationResult
01

Request

input

Four request objects feed the checks: customer (address country, isPoliticallyExposed, isHighRiskBusiness), financialInfo with the estimatedTransactionValue, verification carrying the identity document details, and watchlist with pre-computed sanctions, PEP, and adverse media match flags.

Sample requestJSON
{
  "customer": {
    "id": "CUST12345",
    "firstName": "John",
    "lastName": "Smith",
    "dateOfBirth": "1985-06-15",
    "email": "[email protected]",
    "phone": "+1-555-123-4567",
    "address": {
      "line1": "123 Main Street",
      "line2": "Apt 4B",
      "city": "New York",
      "state": "NY",
      "postalCode": "10001",
      "country": "US"
    },
    "isPoliticallyExposed": false,
    "isHighRiskBusiness": false,
    "occupation": "Software Engineer",
    "employerName": "Tech Company Inc."
  },
  "financialInfo": {
    "estimatedTransactionValue": 25000,
    "accountPurpose": "Savings and Investment",
    "sourceOfFunds": "Employment Income"
  },
  "verification": {
    "documentType": "passport",
    "documentStatus": "valid",
    "documentNumber": "P123456789",
    "documentExpiry": "2028-05-20",
    "documentIssuingCountry": "US"
  },
  "watchlist": {
    "sanctionsMatch": false,
    "pepListMatch": false,
    "adverseMediaMatch": false
  }
}
02

Customer Risk Scoring

table

Risk is scored on four inputs with a first hit policy. Customers from the low-risk country list ('US', 'CA', 'GB', 'AU', 'NZ', 'JP', 'DE', 'FR') with no PEP or business flags score 10 'low' under 10000 of estimatedTransactionValue and 30 'medium' up to 100000; a PEP from those same countries jumps to 75 'high' and a high-risk business to 70. Any customer from the 'RU', 'IR', 'KP', 'CU', 'SY', 'VE' list scores 100 'very-high' regardless of other fields, combined PEP and high-risk business status elsewhere scores 90, transactions of 100000 or more score 60, and the fallback is 40 'medium'.

This is the risk-based approach FATF guidance expects, where geography, customer type, and transaction size each move the rating. Treating PEPs as high risk regardless of transaction value follows FATF Recommendation 12, and the very-high country list corresponds to jurisdictions under comprehensive sanctions programs; the specific 10000 and 100000 breakpoints are the institution's own calibration.

Decision tablefirst hit policy
Countrycustomer.address.countryPEP Statuscustomer.isPoliticallyExposedHigh Risk Businesscustomer.isHighRiskBusinessTransaction ValuefinancialInfo.estimatedTransactionValueRisk Scoreassessment.riskScoreRisk Levelassessment.riskLevel
'US', 'CA', 'GB', 'AU', 'NZ', 'JP', 'DE', 'FR'falsefalse< 1000010'low'
'US', 'CA', 'GB', 'AU', 'NZ', 'JP', 'DE', 'FR'falsefalse>= 10000, < 10000030'medium'
'US', 'CA', 'GB', 'AU', 'NZ', 'JP', 'DE', 'FR'true--75'high'
'US', 'CA', 'GB', 'AU', 'NZ', 'JP', 'DE', 'FR'-true-70'high'
'RU', 'IR', 'KP', 'CU', 'SY', 'VE'---100'very-high'
-truetrue-90'very-high'

+2 more rows in the downloadable template

03

Document Verification

table

Acceptance depends on both the document and the risk it must support: a valid 'passport' verifies every tier, producing 'standard' verification at 'low' or 'medium' risk and 'enhanced' with extra checks at 'high' or 'very-high'; a 'driving_license' only verifies 'low' risk customers and comes back 'insufficient' above that, while a 'national_id' covers 'low' and 'medium'. Any document with status 'expired', 'damaged', or 'suspicious' is 'rejected' outright, and the final catch-all marks the case 'missing'.

Tiering documents this way reflects their assurance value in customer due diligence: passports are government-issued, internationally standardized, and hardest to forge, so they anchor the higher tiers, while a driving licence is acceptable evidence only where exposure is small. The exact pairings of document type to risk level are the firm's own policy choice, but demanding stronger identity evidence as risk rises is the substance of a risk-based CDD program.

Decision tablefirst hit policy
Document Typeverification.documentTypeDocument Statusverification.documentStatusRisk Levelassessment.riskLevelDocument Verifiedverification.isDocumentVerifiedVerification Statusverification.documentVerificationStatusAdditional Verification Requiredverification.requiresAdditionalVerification
'passport''valid''low', 'medium'true'standard'false
'passport''valid''high', 'very-high'true'enhanced'true
'driving_license''valid''low'true'standard'false
'driving_license''valid''medium', 'high', 'very-high'false'insufficient'true
'national_id''valid''low', 'medium'true'standard'false
'national_id''valid''high', 'very-high'false'insufficient'true

+2 more rows in the downloadable template

04

Watchlist Check

table

Screening outcomes cascade in severity order under a first hit policy: sanctionsMatch true immediately returns 'reject' with 'Customer appears on sanctions list', a pepListMatch or adverseMediaMatch each return 'review' for manual handling, and a clean result across all three passes with 'No watchlist hits found'.

The asymmetry is deliberate and mirrors real compliance obligations: a sanctions hit cannot be risk-managed, since dealing with sanctioned persons is prohibited, so it hard-blocks onboarding. PEP status and adverse media are not prohibitions under FATF guidance, they are triggers for enhanced scrutiny, which is why those rows route to human review instead of rejection.

Decision tablefirst hit policy
Sanctions Matchwatchlist.sanctionsMatchPEP Matchwatchlist.pepListMatchAdverse Mediawatchlist.adverseMediaMatchWatchlist Passedwatchlist.passedWatchlist Statuswatchlist.statusWatchlist Messagewatchlist.message
true--false'reject''Customer appears on sanctions list'
falsetrue-true'review''Customer appears on PEP list - requires manual review'
falsefalsetruetrue'review''Customer has adverse media - requires manual review'
falsefalsefalsetrue'pass''No watchlist hits found'
05

Due Diligence Level

expression

Two booleans set up the tier: requiresEDD fires when assessment.riskLevel is 'high' or 'very-high' or the watchlist came back 'review', and isSanctioned mirrors a watchlist 'reject'. The nested ternary then resolves dueDiligenceLevel to 'blocked', 'enhanced', or 'standard', the single value the requirements table keys on next.

Expressions3 fields
requiresEDDassessment.riskLevel == 'high' or assessment.riskLevel == 'very-high' or watchlist.status == 'review'
isSanctionedwatchlist.status == 'reject'
dueDiligenceLevel$.isSanctioned ? 'blocked' : ($.requiresEDD ? 'enhanced' : 'standard')
06

Additional Checks

table

Verification obligations scale with the tier: 'enhanced' due diligence with a riskScore of 60 or more switches on all four requirements (sourceOfFunds, addressVerification, faceVerification, enhancedMonitoring), while 'enhanced' below 60 drops only faceVerification. 'standard' customers need addressVerification when their score is 40 or above and nothing extra below that, and the 'blocked' row returns false across the board since no verification can cure a sanctions match.

Collecting source of funds and applying ongoing monitoring for enhanced-tier customers matches the enhanced due diligence measures FATF and national AML rules describe for higher-risk relationships, including PEPs. Graduating the burden keeps onboarding friction proportional: low-risk applicants clear with baseline document checks, which is the cost-control argument for risk-based compliance.

Decision tablefirst hit policy
Due Diligence LeveldueDiligenceLevelRisk Scoreassessment.riskScoreRequires Source of Fundsrequirements.sourceOfFundsRequires Address Verificationrequirements.addressVerificationRequires Face Verificationrequirements.faceVerificationRequires Enhanced Monitoringrequirements.enhancedMonitoring
'enhanced'>= 60truetruetruetrue
'enhanced'< 60truetruefalsetrue
'standard'>= 40falsetruefalsefalse
'standard'< 40falsefalsefalsefalse
'blocked'-falsefalsefalsefalse
07

Verification Result

expression

Everything converges into a final verdict: verificationStatus resolves to 'rejected' when dueDiligenceLevel is 'blocked', 'approved' when the document verified and the watchlist passed, and 'pending' otherwise. Alongside it, requiredActionsCount counts the true flags in requirements with count(values(requirements), # == true), and nextSteps renders the matching operator instruction, so the caller gets a decision plus a work queue in one payload.

Expressions4 fields
verificationStatusdueDiligenceLevel == 'blocked' ? 'rejected' : (verification.isDocumentVerified and watchlist.passed ? 'approved' : 'pending')
requiredActionsCountcount(values(requirements), # == true)
nextStepsdueDiligenceLevel == 'blocked' ? 'Application rejected due to sanctions match' : ($.verificationStatus == 'pending' ? 'Additional verification required' : 'Onboarding approved')
requirementsrequirements

Make this template
your own.

Load Customer Onboarding KYC Verification into GoRules, adjust the rules to your policy, and ship it behind your own API.