Protect payment transactions with Fraud Prevention

Stay organized with collections Save and categorize content based on your preferences.

This page describes how to effectively protect payment transactions against attacks, such as carding, stolen instrument fraud, and account takeover payment fraud by using reCAPTCHA Enterprise Fraud Prevention.

reCAPTCHA Enterprise Fraud Prevention helps you protect payment transactions by identifying targeted manual attacks and scaled fraud attempts. It automatically trains behavior and transaction models to identify events that are likely fraudulent and can result in a dispute or chargeback if accepted.

As part of these models, reCAPTCHA Enterprise Fraud Prevention examines transaction signals to enable detection of fraud. For example, a series of purchase attempts with low prices might indicate a carding attack. In the response, you receive risk scores for different types of fraud, which you can use to send the transaction to a manual review, or directly block sufficiently suspicious transactions.

To set up reCAPTCHA Enterprise Fraud Prevention, complete the following steps:

  1. Install reCAPTCHA Enterprise on your payment frontend.

  2. Create assessments with transaction data.

  3. Annotate assessments with transaction events.

  4. Interpret responses to take action on potential fraud.

Before you begin

  1. Review the pricing information for reCAPTCHA Enterprise Fraud Prevention.

  2. Choose the best method for setting up reCAPTCHA Enterprise in your environment and complete the setup.

  3. Create score-based site keys.

Install reCAPTCHA Enterprise on your payment frontend

To start detecting attacks, install a score-based site key on each page in your payment user flow. This includes the interface where a user reviews their cart, selects their payment method, and completes the purchase. After the user has made their selection at each step, call grecaptcha.enterprise.execute() to generate a token. To learn how to install score-based site keys and call execute(), see Installing score-based site keys.

The following example shows how to integrate a score-based site key on a credit card transaction event.

function submitForm() {
  grecaptcha.enterprise.ready(function() {
    grecaptcha.enterprise.execute(
      'reCAPTCHA_site_key', {action: 'purchase'}).then(function(token) {
       document.getElementById("token").value = token;
       document.getElementByID("paymentForm").submit();
    });
  });
}
<form id="paymentForm" action="?" method="POST">
  Total: $1.99
  Credit Card Number: <input name="cc-number" id="cc-number" autocomplete="cc-number"><br/>
  <input type="hidden" id="token" name="recaptcha_token"/>
  <button onclick="submitForm()">Purchase</button>
</form>
<script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>

You can experiment with this code in JSFiddle by clicking the <> icon in the top-right corner of the code window.

<html>
  <head>
    <title>Protected Payment</title>
    <script src="https://www.google.com/recaptcha/enterprise.js" async defer></script>
    <script>
    function submitForm() {
      grecaptcha.enterprise.ready(function() {
        grecaptcha.enterprise.execute(
          'reCAPTCHA_site_key', {action: 'purchase'}).then(function(token) {
           document.getElementById("token").value = token;
           document.getElementByID("paymentForm").submit();
        });
      });
    }
    </script>
  </head>
  <body>
    <form id="paymentForm" action="?" method="POST">
      Total: $1.99
      Credit Card Number: <input name="cc-number" id="cc-number" autocomplete="cc-number"><br/>
      <input type="hidden" id="token" name="recaptcha_token"/>
      <button onclick="submitForm()">Purchase</button>
    </form>
  </body>
</html>

Create an assessment with transaction data

To enable payment fraud verdicts, create assessments with transaction data by using the additional fields in the projects.assessments.create method.

The simplest integration includes the transaction ID, payment method, currency, and transaction value.

{
  "event": {
    "token": "",
    "site_key": "siteKey",
    "expected_action": "your-checkout-action-name",
    "transaction_data": {
      "transaction_id": "txid_1234567890",
      "payment_method": "credit-card",
      "card_bin": "411111",
      "card_last_four": "1234",
      "currency_code": "USD",
      "value": 39.98,
    }
  }
}

Providing more fields is optional, but improves the fraud detection quality.

{
  "event": {
    "token": "",
    "site_key": "siteKey",
    "expected_action": "your-checkout-action-name",
    "transaction_data": {
      "transaction_id": "txid_1234567890",
      "payment_method": "credit-card",
      "card_bin": "411111",
      "card_last_four": "1234",
      "currency_code": "USD",
      "value": 39.98,
      "shipping_value": 7.99,
      "shipping_address": {
        "recipient": "name1 name2",
        "address": "123 Street Name",
        "address": "Apt 1",
        "locality": "Sunnyvale",
        "administrative_area": "CA",
        "region_code": "USA",
        "postal_code": "123456"
      },
      "billing_address": {
        "recipient": "name1 name2",
        "address": "123 Street Name",
        "address": "Apt 1",
        "locality": "Sunnyvale",
        "administrative_area": "CA",
        "region_code": "USA",
        "postal_code": "123456"
      },
      "user": {
        "account_id": "abcde12345",
        "creation_ms": 1650000000000,
        "email": "user@example.com",
        "email_verified": true,
        "phone_number": "+16502530000",
        "phone_verified" false
      },
      "merchant": {
        "account_id": "abcde12345",
        "creation_ms": 1650000000000,
        "email": "user@example.com",
        "email_verified": true,
        "phone_number": "+16502530000",
        "phone_verified": false
      },
      "items": {
        "name": "first item",
        "value": 19.99,
        "quantity": 1,
        "merchant_account_id": "abcde12345",
      },
      "items": {
        "name": "second item",
        "value": 19.99,
        "quantity": 1,
        "merchant_account_id": "abcde12345",
      },
      "gateway_info": {
        "name": "google",
        "gateway_response_code": "SUCCESS",
        "avs_response_code": "Y",
        "cvv_response_code": "Y",
      }
    }
  }
}

To learn about how to create assessments, see Create an assessment.

Annotate assessments with transaction events

For best performance, reCAPTCHA Enterprise Fraud Prevention needs visibility into payment lifecycle events for transactions. Therefore, you must send annotations for the assessments that you created with transaction data. For example, you must provide the transaction information to reCAPTCHA Enterprise Fraud Prevention as a transaction event in the following scenarios:

  • The payment provider accepts or declines the transaction

  • The merchant issues a refund

  • The payment issuer files a refund

To learn more about how to send annotations, see Annotate an assessment.

We recommend that you make these requests automatically as part of the corresponding logic in your system when the data is available, such as when the status of a transaction changes.

After creating an assessment with included transaction data, reCAPTCHA Enterprise Fraud Prevention returns a verdict and an assessment_id. Annotate the assessment with transaction events at the following important stages in the payment lifecycle when they occur:

Event type Description Reason example Value example
MERCHANT_APPROVE | MERCHANT_DENY When you decide whether the transaction should be allowed to proceed. IN_HOUSE N/A
AUTHORIZATION | AUTHORIZATION_DECLINE When you submit the transaction to be processed, and the card issuer decides whether to allow the transaction to proceed. 82 (a reason code meaning that the CVV was incorrect) N/A
CHARGEBACK When the transaction is charged back. Card Reported Stolen 20 (representing a partial chargeback of 20 units of currency)
REFUND When the transaction is refunded. PROACTIVE_FRAUD 15.50 (representing a partial refund of 15.50 units of currency)

Along with the CHARGEBACK event type, include the chargeback reason code that was provided by the card issuer by using the reason field. Also, include the monetary amount charged back in the value field if the transaction was partially charged back.

In the transaction event reason field, either include clarifying terms to provide more context on the reason for the event, or provide reason codes that are obtained directly from the payment network or card issuer. These terms and codes differ depending on the event type.

The following table specifies the full list of transaction event types:

Annotation reason Description
MERCHANT_APPROVE Indicates that the transaction is approved by the merchant. The accompanying reasons can include terms such as IN_HOUSE, ACCERTIFY, CYBERSOURCE, or MANUAL_REVIEW.
MERCHANT_DENY Indicates that the transaction is denied and concluded due to risks detected by the merchant. The accompanying reasons can include terms such as IN_HOUSE, ACCERTIFY, CYBERSOURCE, or MANUAL_REVIEW.
MANUAL_REVIEW Indicates that the transaction is being evaluated by a human, due to suspicion or risk.
AUTHORIZATION Indicates that the authorization attempt with the card issuer succeeded.
AUTHORIZATION_DECLINE Indicates that the authorization attempt with the card issuer failed. The accompanying reasons can include Visa's 54 indicating that the card is expired or 82 indicating that the CVV is incorrect.
PAYMENT_CAPTURE Indicates that the transaction is completed because the funds were settled.
PAYMENT_CAPTURE_DECLINE Indicates that the transaction could not be completed because the funds were not settled.
CANCEL Indicates that the transaction is canceled. Specify the reason for the cancellation. For example, INSUFFICIENT_INVENTORY.
CHARGEBACK_INQUIRY Indicates that the merchant has received a chargeback inquiry due to fraud for the transaction, requesting additional information before a fraud chargeback is officially issued and a formal chargeback notification is sent.
CHARGEBACK_ALERT Indicates that the merchant has received a chargeback alert due to fraud for the transaction. The process of resolving the dispute without involving the payment network is started.
FRAUD_NOTIFICATION Indicates that a fraud notification is issued for the transaction, sent by the payment instrument's issuing bank because the transaction appears to be fraudulent. We recommend including TC40 or SAFE data in the reason field for this event type. For partial chargebacks, we recommend that you include an amount in the value field.
CHARGEBACK Indicates that the merchant is informed by the payment network that the transaction has entered the chargeback process due to fraud. Reason code examples include Discover's 6005 and 6041. For partial chargebacks, we recommend that you include an amount in the value field.
CHARGEBACK_REPRESENTMENT Indicates that the transaction has entered the chargeback process due to fraud, and that the merchant has chosen to enter representment. Reason examples include Discover's 6005 and 6041. For partial chargebacks, we recommend that you include an amount in the value field.
CHARGEBACK_REVERSE Indicates that the transaction has had a fraud chargeback which was illegitimate and was reversed as a result. For partial chargebacks, we recommend that you include an amount in the value field.
REFUND_REQUEST Indicates that the merchant has received a refund for a completed transaction. For partial refunds, we recommend that you include an amount in the value field. Reason example: FRAUD.
REFUND_DECLINE Indicates that the merchant has received a refund request for this transaction, but that they have declined it. For partial refunds, we recommend that you include an amount in the value field. Reason example: FRAUD.
REFUND Indicates that the completed transaction was refunded by the merchant. For partial refunds, we recommend that you include an amount in the value field. Reason example: PROACTIVE_FRAUD.
REFUND_REVERSE Indicates that the completed transaction was refunded by the merchant, and that this refund was reversed. For partial refunds, we recommend that you include an amount in the value field.

The following example shows a sample annotation payload containing a transaction event. For more details, see Annotating an assessment.

POST https://recaptchaenterprise.googleapis.com/v1/ASSESSMENT_ID:annotate
{
  "transaction_event": {
    "event_type": "CHARGEBACK",
    "reason": "Card Reported Stolen",
    "value": 20
  }
}

Interpret assessments

After you start sending the transaction data, you see the transactionAssessment component in the riskAnalysis response.

The transactionAssessment component includes a transaction risk score, and multiple fraud scores that identify different types of attacks. reCAPTCHA Enterprise Fraud Prevention risk scores range from 0.0 to 1.0. The risk score 0.0 indicates that the risk is low and the transaction is likely legitimate, and 1.0 indicates that the risk is high and the interaction is likely fraudulent.

By installing reCAPTCHA Enterprise Fraud Prevention and adding the TransactionData component, you get access to the cardTestingVerdict value, which detects adversaries using your website to test lists of stolen instruments or brute force information. When they succeed, this results in losses for your business.

After you send lifecycle events including chargeback information, you get access to the stolenInstrumentVerdict value. This detects attacks even at very low scale that are likely to be fraudulent based on the signals that reCAPTCHA Enterprise analyzes on the transaction and on the user's behavior across its network of millions of websites.

The following block shows an example response with the transactionRisk, cardTestingVerdict, and stolenInstrumentVerdict values.

"riskAnalysis": {
    "score": "BOT_SCORE"
}
"fraudPreventionAssessment": {
    "transaction_risk": 0.9,
    "stolenInstrumentVerdict": {
        "risk": 0.7
    },
    "cardTestingVerdict": {
        "risk": 1.0
    }
}

For the simplest integration, you can set thresholds on the top level transaction_risk to contribute to your decision. For example, it can contribute to sending to a manual review or directly rejecting likely fraudulent transactions. You can also use these scores in your own fraud workflows, or as part of rules with your existing system. Because reCAPTCHA Enterprise examines different signals and has a different visibility of behavior, you can expect incremental value even with an already mature detection engine.

Access to the additional scores (stolen instrument risk, card testing risk) is enabled after a security review. Contact our sales team to initiate the security review.