Generate Credit Card Transaction Alerts
- Capella Operational
Use an Eventing Function to generate high-risk alerts whenever a customer makes certain credit card transactions.
This page walks you through generating high-risk transaction alerts whenever a credit card transaction exceeds the customer’s available credit limit or are made in a foreign currency.
The OnUpdate
JavaScript handler listens to mutations or data changes within a specified register
collection.
When you create or modify data in a document of the type transaction
inside the register
collection, the Eventing Function executes its JavaScript code.
The Eventing Function then:
-
Looks up details from the customer’s card information, like date, spending limits, location, and default currency. This data is collected from the
register
collection and has the typecard
. -
Looks up the exchange rates for the date of the transaction. This data is collected from the
register
collection and has the typeexchange_rates
. -
Transforms the currency of the transaction and the currency of the spending limit into USD, following the correct date’s exchange rate.
-
Determines if the customer exceeded the spending threshold.
-
Determines if the purchase was made in a foreign currency.
-
Generates a new document for high-risk transactions that contains transaction information and calculated data.
-
Writes the new document to the
review
collection with typetransaction
. -
(Optional) Uses custom applications written in a Couchbase SDK or a third-party integration like Kafka to read items in the
review
collection. This lets you create more automated actions.
Prerequisites
Before trying out the examples on this page, you must first:
-
Create two buckets called
bulk
andrr100
with a minimum size of 100MB. -
Inside the
bulk
bucket, create two keyspaces calledbulk.data.register
andbulk.data.review
. -
Inside the
rr100
bucket, create one keyspace calledrr100.eventing.metadata
.
For more information about creating buckets, scopes, and collections, see Manage Buckets.
Do not add, modify, or delete documents in the Eventing storage keyspace rr100.eventing.metadata while your Eventing Functions are in a deployed state.
|
Example: Generate High Risk Credit Card Transaction Alerts
This example walks you through how to create an Eventing Function to cascade delete documents.
Flush Items from the UI
Flushing clears a bucket of all documents and resets it to an empty state while maintaining the bucket’s configuration and settings.
To enable Capella to flush documents:
-
Go to
. -
Click More Options (⋮) next to the bulk bucket.
-
Click Settings.
-
In the Settings page, expand the Advanced Settings section.
-
Turn on the Flush toggle.
-
Click Save to save the bucket settings.
For more information about flushing, see Configure Advanced Bucket Settings.
Create Indexes
To create indexes for the register and review collections:
-
Go to
. -
For the Query Context, select bulk as the bucket.
-
In the code editor, enter the following query to create indexes:
CREATE INDEX `adv_type_rg` ON `bulk`.`data`.`register`(`type`); CREATE INDEX `adv_type_rv` ON `bulk`.`data`.`review`(`type`); CREATE PRIMARY INDEX `adv_prim_rv` ON `bulk`.`data`.`review`;
Create an Eventing Function
To create a new Eventing Function:
-
Go to
. -
Click Add Function.
-
In the Settings page, enter the following Function settings:
-
high_risk_txns under Name.
-
Flag transactions that go over a credit threshold or are made in a foreign currency. under Description.
-
The keyspace
bulk.data.register
under Listen to Location. -
The keyspace
rr100.eventing.metadata
under Eventing Storage.
-
-
Click Next.
-
In the Bindings page, click Add Binding and create two bindings.
-
For the first binding:
-
Select Bucket.
-
Enter register as the Alias Name.
-
Enter the keyspace
bulk.data.register
under Bucket, Scope, and Collection. -
Select Read Only under Permission.
-
-
For the second binding:
-
Select Bucket.
-
Enter review as the Alias Name.
-
Enter the keyspace
bulk.data.review
under Bucket, Scope, and Collection. -
Select Read and Write under Permission.
-
-
-
Click Next.
-
In the code editor, replace the placeholder JavaScript code with the following code sample:
function OnUpdate(doc, meta) { if (doc.type != "transaction") return; try { var verbose = 0; // logging - 0: minimal, 1: moderate, 2: massive if (verbose > 0) log(meta.id + ' Process transaction for doc.card: ' + doc.card + ', doc.amount: ' + nformat(doc.amount, 0, 2)); // Loads the associated card info of this transaction var card = register['card:' + doc.card]; if (!card) { log(meta.id + ' warn card does not exist: ' + doc.card); return; } // Loads the exchange rate table for the day of the transaction var erid = 'exchange_rates:er-' + (doc.date).substr(0, 10); var exchange_rates = register[erid]; if (!exchange_rates) { log(meta.id + ' WARNING exchange_rates does not exist: ' + erid); return; } var to_USD = exchange_rates['to_USD']; var trxn_2_USD = to_USD[doc.currency]; var card_2_USD = to_USD[card['currency']]; if (!trxn_2_USD || !card_2_USD) { log(meta.id + ' WARNING exchange_rates for either ' + card['currency'] + ' or ' + doc.currency + ' does exist'); return; } // Converts transaction charge and credit card limit into USD var trxn_amount_USD = doc.amount / trxn_2_USD; var card_thresh_USD = card['threshold'] / card_2_USD; if (verbose > 1) { log(meta.id + ' doc ', doc); log(meta.id + ' card ', card); log(meta.id + ' rates ', exchange_rates) } if (verbose > 0) { log(meta.id + ' 1 doc.amount ' + nformat(doc.amount, 8, 2) + ', card_limit ' + nformat(card['threshold'], 8, 2)); log(meta.id + ' 2 trxn_currency ' + sformat(doc.currency, 8) + ', card_currency ' + sformat(card['currency'], 8)); log(meta.id + ' 3 trxn_2_USD ' + nformat(trxn_2_USD, 8, 6) + ', card_2_USD ' + nformat(card_2_USD, 8, 6)); log(meta.id + ' 4 trxn_amount_USD ' + nformat(trxn_amount_USD, 8, 2) + ', card_thresh_USD ' + nformat(card_thresh_USD, 8, 2)); } // Checks if transaction is high risk due to being over threshold limit if (card_thresh_USD < trxn_amount_USD) { var msg = 'High Risk Txn: amount: ' + nformat(doc.amount, 8, 2) + ' ' + doc.currency + ' exceeds purchase threshold: ' + nformat(card['threshold'], 8, 2) + ' ' + card['currency']; log(meta.id + ' *** ' + msg); doc["comments"] = msg; // Appends description to the document doc["reason_code"] = 'X-CREDIT'; // Appends the code to the document delete doc["city"]; // Removes city sub document review[meta.id] = doc; // Saves the modified document for review return; } // Checks if transacton is high risk due to being in a foreign currency if (doc.currency != card['currency']) { var msg = 'High Risk Txn: currency mismatch card: ' + card['currency'] + ' != txn: ' + doc.currency; log(meta.id + ' *** ' + msg); doc["comments"] = msg; // Appends description to the document doc["reason_code"] = 'X-MISMATCH'; // Appends the code to the document delete doc["city"]; // Removes city sub document review[meta.id] = doc; // Saves the modified document for review return; } if (verbose > 0) log(meta.id + ' Charge by ' + card["firstname"] + ' ' + card["lastname"] + ' appears normal in the amount of ' + nformat(doc.amount, 0, 2) + ' ' + doc.currency); } catch (e) { // Notifies the user if there is a processing error or exception log(meta.id + 'ERROR in OnUpdate:', e); } } // Right justify string with given width function sformat(s, width) { var str = s; while (width > str.length) str = ' ' + str; return str; } // Right justify number with given width with given precision function nformat(n, width, prec) { return sformat(n.toFixed(prec), width, prec); }
-
Click Create function to create your Eventing Function.
When a change happens to the data inside the source collection, the OnUpdate
handler is triggered and checks if the transaction amount is under the customer’s credit limit and if the transaction has been made in a foreign currency.
If any of these conditions are true, the Eventing Function flags the transaction as a high-risk transaction.
The Eventing Function then copies the transaction to the review
bucket.
The OnUpdate
handler:
-
Enriches the document with pre-defined
comments
and provides areason code
-
Performs currency validation
-
Converts the credit limit and transaction amount to USD currency based on the exchange rate of the exact date of the transaction
Populate Your Cluster with Sample Data
To seed your data and populate your cluster, download the following data files:
Data Set | Description | JSON Type Indicator | Number of Records | File Link |
---|---|---|---|---|
cards.json |
Credit card information |
type='card' |
7 |
|
merchants.json |
Merchant information |
type='merchant' |
5001 |
|
exchange_rates.json |
Daily exchange rates |
type='exchange_rates' |
422 |
|
txns.json |
Credit card charges |
type='transaction' |
417 |
Right-click the file link and choose Save Link As… to download the files, or right-click the file link and choose Copy Link Address to download the files using cURL.
cards.json
file, which contains the information from a credit card.{
"type": "card",
"cardnumber": "4273-6623-8686-4599",
"firstname": "Winfred",
"lastname": "Raftery",
"street": "3965 I-80 E Off Ramp",
"mobile": "+1-617-555-1371",
"sms": true,
"city": {
"name": "Uxbridge",
"code": "MA",
"state": "Massachusetts",
"county": "Worcester",
"display": "Uxbridge"
},
"issued": "11/15",
"expiry": "6/19",
"ccv": 736,
"issuer": "Helena National Bank",
"maxcredit": 1000,
"threshold": 9500,
"country": "US",
"currency": "USD"
}
merchants.json
file, which contains the information from the merchant.{
"type": "merchant",
"merchantid": "merchant-501233450539197794-0",
"name": "FlightAware Inc",
"city": {
"name": "Bentonville",
"code": "IN",
"state": "Indiana",
"county": "Fayette",
"display": "Bentonville"
}
}
exchange_rates.json
file, which contains the information from a set of exchange rates.{
"type": "exchange_rates",
"erid": "er-2017-09-01",
"to_USD": {
"CAD": 1.2441275168,
"INR": 64.0331375839,
"EUR": 0.8389261745,
"USD": 1,
"SGD": 1.3545302013,
"GBP": 0.7724412752,
"CNY": 6.5591442953,
"AUD": 1.2601510067
}
}
txns.json
file, which contains the information from a transaction or a credit card charge.{
"type": "transaction",
"txnid": "tx-1526311379-002",
"amount": 15.99,
"product": "Thread Bore Brush: .22 Caliber, Centerfire",
"card": "4273-6623-8686-4599",
"merchant": "GoodGuide Inc",
"city": {
"name": "Waseca",
"code": "MN",
"state": "Minnesota",
"county": "Waseca",
"display": "Otisco"
},
"date": "2018-05-14T20:52:59+05:30",
"currency": "USD"
}
After downloading the files, you must import them into your register
collection.
To import them into the collection:
-
Go to
. -
Select Load from your browser.
-
In the Choose your source section, click Upload and select the files you want to import.
-
In the Choose your target section, select bulk for the bucket, data for the scope, and register for the collection.
-
Click Import to import and seed the data.
Deploy the Eventing Function
To deploy your Eventing Function:
-
Go to
. -
Click More Options (⋮) next to high_risk_txns.
-
Click Deploy to deploy your Function.
After it’s deployed, the Eventing Function executes on all existing documents and any documents you create in the future.
The Eventing Function reads the data you loaded into the register
collection and creates 40 new high-risk transaction alert documents in the review
collection.
Check the Eventing Function Log
To check the Eventing Function log:
-
Go to
. -
Click the Log icon next to the high_risk_txns Eventing Function. You should see something similar to the following:
2021-07-18T16:00:58.953-07:00 [INFO] "transaction:tx-1511710690-182 *** High Risk Txn: amount: 12506.00 USD exceeds purchase threshold: 12000.00 USD" 2021-07-18T16:00:58.952-07:00 [INFO] "transaction:tx-1505402809-074 *** High Risk Txn: currency mismatch card: USD != txn: EUR" 2021-07-18T16:00:58.938-07:00 [INFO] "transaction:tx-1514648212-166 *** High Risk Txn: amount: 12506.00 USD exceeds purchase threshold: 12000.00 USD" 2021-07-18T16:00:58.934-07:00 [INFO] "transaction:tx-1505315650-406 *** High Risk Txn: currency mismatch card: USD != txn: GBP"
Check the Results in the review
Collection
To check that the document in the review
collection has been updated:
-
Go to
. -
Select the keyspace
bulk.data.review
in the Get documents from list. You should see 40 new high-risk alert documents in thereview
collection. -
Click one of the 40 documents to open the Edit Document dialog. The JSON document indicates that a credit card transaction was either made in a currency different than USD, or that it has surpassed the customer’s credit limit.
{ "type": "transaction", "txnid": "tx-1505315650-403", "amount": 5383.35, "product": "Computer, iMac 64GB 4TB Nvme", "card": "4273-6623-8686-4599", "merchant": "Apple Regent Street", "date": "2018-09-14T20:46:10+05:30", "currency": "GBP", "comments": "High Risk Txn: currency mismatch card: USD != txn: GBP", "reason_code": "X-MISMATCH" }
Run SQL++ Queries to Return Data
To run SQL++ queries to return data:
-
Go to
. -
For the Query Context, select bulk as the bucket.
-
In the code editor, enter the following queries:
-
To return the number of high-risk transactions:
SELECT COUNT(*) num_high_risk FROM `bulk`.`data`.`review` WHERE type='transaction';
-
To return the data in a specific order:
SELECT * FROM `bulk`.`data`.`review` WHERE type='transaction' ORDER BY currency, amount DESC;
-
To return summarized data in a group and in a specific order:
SELECT COUNT(*) count, reason_code, SUM(amount) total_amount, currency FROM `bulk`.`data`.`review` WHERE type='transaction' GROUP BY reason_code, currency ORDER by count DESC;
-
To return the transaction records by key:
SELECT * FROM `bulk`.`data`.`register` USE KEYS ('transaction:tx-1505315650-403');
-
To return the credit card records by key:
SELECT * FROM `bulk`.`data`.`register` USE KEYS ('card:4273-6623-8686-4599');
-
To return the flagged transaction record by key:
SELECT * FROM `bulk`.`data`.`review` USE KEYS ('transaction:tx-1505315650-403');
-
Run the Eventing Function Again
To run your Eventing Function again:
-
Go to
. -
For the Query Context, select bulk as the bucket.
-
In the code editor, enter the following query to delete all data from the bucket:
DELETE FROM `bulk`.`data`.`review`;
-
Go to
. -
Click More Options (⋮) next to high_risk_txns.
-
Click Pause to pause your Function.
-
Click the Settings icon to edit the Function.
-
In the code editor, change
var verbose = 0
tovar verbose = 3
:function OnUpdate(doc, meta) { if (doc.type != "transaction") return; try { var verbose = 3; // logging - 0: minimal, 1: moderate, 2: massive // ... } }
-
Click Save to save your edits.
-
In the Eventing page, click More Options (⋮) next to high_risk_txns.
-
Click Resume to resume your Function. The Function resumes from the checkpoint created when you paused it. It then executes on all new documents and on any mutations that occur after the checkpoint.
-
Go to
. -
Select the keyspace
bulk.data.register
in the Get documents from list. -
Click the document
transaction:tx-1505315650-403
to open the Edit Document dialog. -
Change
"amount": 5383.35
to"amount": 5383.36
. -
Click Save to create a mutation.
-
Go to
. -
Click the Log icon next to the high_risk_txns Eventing Function. You should see something similar to the following:
2021-07-18T16:41:20.522-07:00 [INFO] "transaction:tx-1505315650-403 Process transaction for doc.card: 4273-6623-8686-4599, doc.amount: 5383.36" 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 doc " {"type":"transaction","txnid":"tx-1505315650-403","amount":5383.36,"product":"Computer, iMac 64GB 4TB Nvme","card":"4273-6623-8686-4599","merchant":"Apple Regent Street","city":{"name":"London","code":"W1B 2EL","county":"Westminster","display":"London Westminster"},"date":"2018-09-14T20:46:10+05:30","currency":"GBP"} 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 card " {"type":"card","cardnumber":"4273-6623-8686-4599","firstname":"Winfred","lastname":"Raftery","street":"3965 I-80 E Off Ramp","mobile":"+1-617-555-1371","sms":true,"city":{"name":"Uxbridge","code":"MA","state":"Massachusetts","county":"Worcester","display":"Uxbridge"},"issued":"11/15","expiry":"6/19","ccv":736,"issuer":"Helena National Bank","maxcredit":1000,"threshold":9500,"country":"US","currency":"USD"} 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 rates " {"type":"exchange_rates","erid":"er-2018-09-14","to_USD":{"CAD":1.3008811703,"INR":71.8162374882,"EUR":0.8555051758,"USD":1,"SGD":1.3698348875,"GBP":0.7633501583,"CNY":6.8543074686,"AUD":1.3910514159}} 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 1 doc.amount 5383.36, card_limit 9500.00" 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 2 trxn_currency GBP, card_currency USD" 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 3 trxn_2_USD 0.763350, card_2_USD 1.000000" 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 4 trxn_amount_USD 7052.28, card_thresh_USD 9500.00" 2021-07-18T16:41:20.525-07:00 [INFO] "transaction:tx-1505315650-403 *** High Risk Txn: currency mismatch card: USD != txn: GBP"
The Eventing Function debug log displays the following:
-
The transaction document or
doc
that has just mutated -
The credit card or
card
that the customer used to make the transaction -
Daily exchange rates or
rates
for the date of the transaction -
If the transaction is considered high-risk