INTERACTIVE DEMOS
A neobank processes 3M wire transfers per day. Compliance must screen every transaction against sanctions lists and detect structuring patterns (splitting transactions to stay under $10K reporting thresholds) — all before the wire settles in 30 minutes.
| wire_id | sender_acct | receiver_acct | amount | currency | receiver_bank | ts |
|---|---|---|---|---|---|---|
| WIR-20240315-88901 | ACC-7741 | ACC-3302 | 9400 | USD | JPMorgan Chase | 2024-03-15T10:02:14.000Z |
| WIR-20240315-88914 | ACC-7741 | ACC-5518 | 8750 | USD | Bank of America | 2024-03-15T10:06:41.000Z |
| WIR-20240315-88927 | ACC-7741 | ACC-3302 | 7900 | USD | JPMorgan Chase | 2024-03-15T10:11:03.000Z |
| WIR-20240315-88938 | ACC-7741 | ACC-8890 | 9950 | USD | Wells Fargo | 2024-03-15T10:15:22.000Z |
| WIR-20240315-88945 | ACC-7741 | ACC-6617 | 6200 | USD | Citibank | 2024-03-15T10:19:48.000Z |
| WIR-20240315-88951 | ACC-7741 | ACC-5518 | 5800 | USD | Bank of America | 2024-03-15T10:24:07.000Z |
CREATE MATERIALIZED VIEW structuring_alerts AS
SELECT
sender_acct,
COUNT(*) AS txn_count,
COUNT(DISTINCT receiver_acct) AS distinct_recipients,
SUM(amount) AS total_amount,
MAX(amount) AS largest_txn,
MIN(amount) AS smallest_txn,
EXTRACT(EPOCH FROM MAX(ts) - MIN(ts)) / 60 AS time_span_minutes,
window_start
FROM TUMBLE(wire_transfers, ts, INTERVAL '60 MINUTES')
WHERE currency = 'USD'
GROUP BY sender_acct, window_start
HAVING
COUNT(*) > 3
AND MAX(amount) < 10000
AND SUM(amount) > 30000;| sender_acct | alert_type | txn_count | total_amount | time_span_minutes | risk_score |
|---|---|---|---|---|---|
| ACC-7741 | STRUCTURING | 6 | 48000 | 21.88 | 92 |
| ACC-2204 | SANCTIONS_MATCH | 1 | 47250 | 0 | 78 |