v2.0

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

Watch the launch videoWatch

Financial Transaction Compliance Classifier

Automated system that classifies financial transactions, assigns risk scores, identifies compliance issues, and determines regulatory reporting requirements.

Solution

This solution streamlines financial regulatory compliance by automatically classifying transactions based on type and amount, applying appropriate jurisdiction-specific rules, and calculating comprehensive risk scores. It evaluates multiple risk factors including transaction amount, priority level, customer risk profile, suspicious activity history, and jurisdiction requirements.

The system flags potential compliance issues through detailed condition checking that identifies incomplete KYC verification, high-risk jurisdictions, suspicious activity patterns, potential structuring, and unusual transaction behavior. For each identified issue, it generates specific alerts with descriptive reasons. The solution determines precise reporting deadlines, form requirements, and filing urgency based on risk assessment and compliance flags, enabling financial institutions to prioritize high-risk transactions for immediate review while maintaining standard monitoring for lower-risk activities.

How it works

The decision graph processes financial transactions through these key components:

  1. Transaction Classification: Determines priority level and report type based on transaction type and amount.
  2. Jurisdiction Rules: Applies specific regulatory requirements based on customer jurisdiction and report type.
  3. Risk Score Calculation: Computes a comprehensive risk score considering transaction amount, priority, customer risk status, suspicious activity history, and jurisdiction.
  4. Regulatory Threshold Evaluation: Determines if compliance review is required based on risk score and priority.
  5. Compliance Issue Identification: Detects potential regulatory issues including incomplete KYC, high-risk jurisdictions, suspicious patterns, structuring, and unusual activity.
  6. Reporting Requirement Determination: Sets reporting deadlines, identifies required forms, and establishes filing urgency based on risk level and compliance flags.

Where teams use it

  • Banking transaction monitoring
  • Anti-money laundering (AML) compliance
  • Know Your Customer (KYC) verification
  • Securities trading compliance
  • Cryptocurrency transaction monitoring
  • Cross-border payment screening
  • Cash transaction reporting
  • Suspicious activity detection
  • Regulatory filing management
  • Financial risk assessment

Inside the decision model

Financial Transaction Compliance Classifier ships as a JDM decision graph with 7 nodes, 4 decision tables and 22 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph7 nodes · read-only
input requesttable classify_transactiontable apply_jurisdiction_rulesexpression calculate_risk_scoretable regulatory_thresholdstable identify_compliance_issuesexpression determine_reporting_requirements
01

Request

input

The transaction block supplies the type, amount, and flags like structuring_suspected, while the customer block adds jurisdiction, kyc_verified status, risk indicators, and normal_activity_patterns for behavioral comparison.

Sample requestJSON
{
  "transaction": {
    "id": "TX123456789",
    "type": "cash_deposit",
    "amount": 15000,
    "date": "2025-03-15T10:30:00Z",
    "currency": "USD",
    "description": "Business cash deposit",
    "high_risk_country": false,
    "structuring_suspected": false
  },
  "customer": {
    "id": "CUST98765",
    "name": "Acme Corporation",
    "type": "business",
    "jurisdiction": "US",
    "kyc_verified": true,
    "high_risk": false,
    "suspicious_activity_count": 0,
    "normal_activity_patterns": [
      "cash_deposit",
      "domestic_wire",
      "check_deposit"
    ],
    "account_opening_date": "2020-01-15",
    "risk_category": "medium"
  }
}
02

Classify Transaction

table

Type and amount pairs assign priority and paperwork under a first hit policy: a 'cash_deposit' over 10000 is 'high_priority' with a 'CTR', an 'international_wire' over 3000 maps to 'FBAR', a 'securities_trade' over 5000 to 'SEC_REPORT', a 'crypto_transaction' over 3000 to a 'high_priority' 'CRYPTO_SAR', and any 'structured_deposit' straight to 'SAR' with no amount test. Domestic wires over 10000 file a 'WIRE_REPORT' at 'low_priority', and everything else falls to 'standard' and 'STANDARD'.

The 10000 cash threshold is the genuine Bank Secrecy Act trigger for a Currency Transaction Report, and routing suspected structured deposits directly to a SAR reflects that structuring is itself reportable regardless of amount. The 3000 and 5000 thresholds on wires, securities, and crypto are tighter than statutory minimums, a conservative screening choice that surfaces activity for review before it reaches mandatory reporting levels.

Decision tablefirst hit policy
Transaction Typetransaction.typeAmounttransaction.amountPriorityclassification.priorityReport Typeclassification.report_type
'cash_deposit'> 10000'high_priority''CTR'
'international_wire'> 3000'medium_priority''FBAR'
'securities_trade'> 5000'medium_priority''SEC_REPORT'
'crypto_transaction'> 3000'high_priority''CRYPTO_SAR'
'structured_deposit'-'high_priority''SAR'
'domestic_wire'> 10000'low_priority''WIRE_REPORT'

+1 more row in the downloadable template

03

Apply Jurisdiction Rules

table

Reporting mechanics come from crossing customer.jurisdiction with the classification.report_type: a 'US' 'CTR' allows 15 days on 'FinCEN Form 112' with a jurisdiction score of 15, a 'US' 'SAR' 30 days on 'FinCEN Form 111', 'EU' cases get 10 days on the 'EU Suspicious Transaction Report', 'UK' cases 7 days on an 'NCA SAR', and the default grants 30 days on a 'Standard Reporting Form' with the lowest score of 5.

The US rows match actual FinCEN practice: Form 112 is the Currency Transaction Report with a 15-day filing window, and Form 111 is the Suspicious Activity Report, generally due within 30 days of detection. UK suspicious activity reports really are filed with the National Crime Agency; the day counts on the EU row and the jurisdiction scores are the template's own risk weighting rather than a single statutory figure.

Decision tablefirst hit policy
Jurisdictioncustomer.jurisdictionReport Typeclassification.report_typeDays to Reportreporting.days_to_reportForm Namereporting.form_nameJurisdiction Scorerisk.jurisdiction_score
'US''CTR'15'FinCEN Form 112'15
'US''SAR'30'FinCEN Form 111'30
'EU''CTR', 'SAR'10'EU Suspicious Transaction Report'10
'UK''CTR', 'SAR'7'NCA SAR'10
--30'Standard Reporting Form'5
04

Calculate Risk Score

expression

Additive scoring builds total_risk_score from five parts: amount_score steps 5/10/15/25 at the 5000, 10000, and 50000 marks, priority_score gives 'high_priority' 25 points, customer_score adds 20 for a high_risk customer, transaction_history_score adds up to 20 as suspicious_activity_count grows, and the jurisdiction score from the previous table completes the sum. Keeping each factor a separate key makes the final score auditable term by term.

Expressions6 fields
base_risk_score0
amount_scoretransaction.amount > 50000 ? 25 : (transaction.amount > 10000 ? 15 : (transaction.amount > 5000 ? 10 : 5))
priority_scoreclassification.priority == 'high_priority' ? 25 : (classification.priority == 'medium_priority' ? 15 : 5)
customer_scorecustomer.high_risk == true ? 20 : 0
transaction_history_scorecustomer.suspicious_activity_count > 2 ? 20 : (customer.suspicious_activity_count > 0 ? 10 : 0)
total_risk_score$.base_risk_score + $.amount_score + $.priority_score + $.customer_score + $.transaction_history_score + risk.jurisdiction_score
05

Regulatory Thresholds

table

Review necessity resolves from score and priority together: a total_risk_score over 75 combined with 'high_priority' demands immediate review, over 60 requires compliance review at any priority, and scores in the [40..60] band only escalate when the priority is high. The two remaining rows return requires_review false with standard monitoring messaging.

Two-dimensional cutoffs like this are how monitoring teams triage alert queues: pure score thresholds either flood analysts or miss context, so priority acts as a tiebreaker in the ambiguous middle band. The 40/60/75 boundaries are tuning parameters an institution would calibrate against its own alert volumes, not values fixed by regulation.

Decision tablefirst hit policy
Risk Scoretotal_risk_scorePriorityclassification.priorityRequires Reviewcompliance.requires_reviewReview Reasoncompliance.review_reason
> 75'high_priority'true'Requires immediate review - High risk score and priority'
> 60-true'High risk score requires compliance review'
[40..60]'high_priority'true'Medium risk score with high priority requires review'
[40..60]-false'Medium risk score - standard monitoring'
--false'Standard monitoring - no flags'
06

Identify Compliance Issues

table

Because the hit policy is collect, every matching condition appends a flag object to compliance.flags: 'KYC_INCOMPLETE' when transaction.amount > 10000 and customer.kyc_verified != true, 'HIGH_RISK_JURISDICTION' for amounts over 5000 touching a high_risk_country, 'PATTERN_ALERT' when prior suspicious_activity_count exists on transactions over 3000, 'STRUCTURING' whenever structuring_suspected is true, and 'UNUSUAL_ACTIVITY' for amounts over 50000 outside customer.normal_activity_patterns.

These mirror the red flags AML programs actually monitor: unverified identity on large transactions, exposure to high-risk jurisdictions, repeat suspicious behavior, structuring below reporting thresholds, and out-of-pattern activity are all staples of transaction monitoring typologies. Emitting typed flags with descriptions, rather than one boolean, gives case management systems the detail needed to open targeted investigations.

Decision tablecollect hit policy
Condition 1Condition 2Flag RaisedraisedFlag TypetypeFlag Descriptiondescription
transaction.amount > 10000customer.kyc_verified != truetrue'KYC_INCOMPLETE''Customer KYC verification incomplete for large transaction'
transaction.amount > 5000transaction.high_risk_country == truetrue'HIGH_RISK_JURISDICTION''Transaction involves high-risk jurisdiction'
customer.suspicious_activity_count > 0transaction.amount > 3000true'PATTERN_ALERT''Multiple suspicious activities detected with customer'
transaction.structuring_suspected == true-true'STRUCTURING''Potential structuring activity detected'
transaction.amount > 50000!contains(customer.normal_activity_patterns ?? [], transaction.type)true'UNUSUAL_ACTIVITY''Transaction outside of normal customer activity patterns'
07

Determine Reporting Requirements

expression

Deadlines and urgency are finalized here: reporting_deadline adds reporting.days_to_report (as seconds, days * 86400) to the transaction date, requires_immediate_filing fires when review is required or flags coincide with 'high_priority', and reporting_status grades the case as 'urgent_filing_required', 'filing_required', or 'standard_reporting'. The report_instructions string names the form and window, such as 'File ' + reporting.form_name + ' within 24 hours', so compliance staff receive an actionable directive.

Expressions5 fields
reporting_deadlinedate(transaction.date) + (reporting.days_to_report * 86400)
has_compliance_flagslen(compliance.flags ?? []) > 0
requires_immediate_filingcompliance.requires_review == true or ($.has_compliance_flags and classification.priority == 'high_priority')
reporting_status$.requires_immediate_filing ? 'urgent_filing_required' : ($.has_compliance_flags ? 'filing_required' : 'standard_reporting')
report_instructions$.requires_immediate_filing ? 'File ' + reporting.form_name + ' within 24 hours' : 'File ' + reporting.form_name + ' within ' + string(reporting.days_to_report) + ' days'

Make this template
your own.

Load Financial Transaction Compliance Classifier into GoRules, adjust the rules to your policy, and ship it behind your own API.