> ## Documentation Index
> Fetch the complete documentation index at: https://docs.paynext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Visa CDRN Alerts

> Auto-refund Visa CDRN pre-dispute cases before they become chargebacks, and cancel the customer's subscriptions at your account.

Visa Cardholder Dispute Resolution Network (CDRN), operated by Verifi, delivers pre-dispute cases. When a cardholder disputes a charge with their bank, CDRN notifies PayNext before the dispute becomes a chargeback. PayNext refunds the payment and reports the outcome back to the network, so the case closes without a chargeback, a dispute fee, or an entry against your chargeback ratio.

CDRN covers both the Visa and Mastercard networks, with primary coverage on Visa. Each case is recorded on the payment as `fraud_prevention.visa_cdrn_alert`.

## Case types

The kind of case that landed on the payment is recorded as `visa_cdrn_alert.type`.

| Value     | What it means                                                                                                       |
| :-------- | :------------------------------------------------------------------------------------------------------------------ |
| `DISPUTE` | An actionable pre-dispute case. The cardholder disputed the charge and it will become a chargeback unless resolved. |

`DISPUTE` is the only case type PayNext acts on and the only one recorded on a payment, so `visa_cdrn_alert.type` always reads `DISPUTE`.

<Note>
  CDRN also defines cancellation and notice case types. PayNext doesn't record these—they are advisory, and the same underlying dispute normally arrives as an actionable `DISPUTE` case anyway.
</Note>

## How CDRN cases work

<Steps>
  <Step title="Verifi sends the case">
    The cardholder disputes the charge with their bank. Verifi's network raises a case and notifies PayNext.
  </Step>

  <Step title="PayNext matches the case to your payment">
    PayNext matches the case to your payment automatically, using the transaction identifiers the network provides. In the rare event a case can't be matched, nothing changes on your payments.
  </Step>

  <Step title="PayNext refunds and cancels">
    The payment is refunded in full, and the customer's active subscriptions at your account are cancelled immediately.
  </Step>

  <Step title="PayNext reports the outcome to Verifi">
    Once the refund succeeds, PayNext reports the case as resolved. Verifi closes it, and the dispute never becomes a chargeback.
  </Step>
</Steps>

When PayNext resolves a case, it refunds the disputed payment in full—PayNext never issues a partial refund. To prevent a repeat dispute from the same cardholder, PayNext may also refund the customer's later payments at your account, meaning those taken after the disputed one. Earlier payments are left alone. All refunds appear on the payment with a `refund_reason` of `fraud_prevention`.

Expect more than one alert on the same payment: a cardholder dispute can be reported through more than one network. The payment always shows the most recent case.

## Subscription handling

When a case lands on a payment that belongs to an active subscription, PayNext cancels the subscription immediately. A dispute filing is a strong signal that the cardholder no longer wants the charge to recur. The subscription `status` becomes `cancelled`.

All of the customer's active subscriptions at your account are acted on. Subscriptions the same customer holds at other merchants are not affected. Track changes via the `subscription_v2.cancelled` webhook.

<Note>
  Both actions are attributed automatically as `fraud_prevention`: the refunded payment's `refund_reason` and the cancelled subscription's [`cancellation_details.reason`](/guides/platform/subscriptions#cancellation-details) are set to `fraud_prevention`, with `trigger_payment_id` pointing at the disputed payment—so you can distinguish case-driven activity from `merchant_initiated` actions.
</Note>

## Set up

<Steps>
  <Step title="Contact PayNext support">
    Request CDRN enrollment and list the statement descriptors to cover.
  </Step>

  <Step title="PayNext enrolls your descriptor with Verifi">
    CDRN enrolls by statement descriptor, not by CAID. PayNext handles the registration end-to-end.
  </Step>

  <Step title="Done">
    No code changes required. Cases appear on the `fraud_prevention.visa_cdrn_alert` sub-object of every affected payment.
  </Step>
</Steps>

## `visa_cdrn_alert` payload

Written when Verifi raises a case on the payment. All five fields are always present.

```json theme={"system"}
{
  "visa_cdrn_alert": {
    "case_id": "32838-001",
    "updated_at": "2026-04-23T12:45:51Z",
    "type": "DISPUTE",
    "source": "ISSUER",
    "reason_code": "10"
  }
}
```

| Field         | Type              | Description                                                                                                                                                                               |
| :------------ | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `case_id`     | string            | Verifi's identifier for the case. An opaque string, **not a UUID**—don't parse it or assume a format.                                                                                     |
| `updated_at`  | string (ISO-8601) | When the network raised the case, UTC with `Z` suffix.                                                                                                                                    |
| `type`        | string            | Case type. Always `DISPUTE`, always upper-case.                                                                                                                                           |
| `source`      | string            | The system that raised the case—one of `ISSUER`, `VMPI`, `BARCLAYS`, or `DISCOVER`. Always upper-case.                                                                                    |
| `reason_code` | string            | Case reason code, passed through verbatim. Values differ by card scheme and are not always numeric, so treat it as an opaque string: don't parse it as a number or assume a fixed length. |

## Read the payload

| Payload state             | Meaning                                                                                                        |
| :------------------------ | :------------------------------------------------------------------------------------------------------------- |
| `visa_cdrn_alert` absent  | No CDRN case has landed on this payment                                                                        |
| `visa_cdrn_alert` present | A pre-dispute case landed on this payment—refunded, and the customer's subscriptions at your account cancelled |

<Note>
  Once `visa_cdrn_alert` is written, it is never cleared. A later case on the same payment replaces the whole sub-object—last-write-wins.
</Note>

## Where you see results

A case is recorded on the payment it matched, so the payment is where you look for it—there's no separate alerts screen.

To check a single payment, open **Dashboard → Payments**, select the payment, and read its timeline: an entry reads **Visa CDRN Alert (Dispute)**, next to the refund and the subscription cancellation the case triggered. To find every affected payment, filter the Payments list by CDRN case **Type** or **Reason Code**. In your own systems, read `fraud_prevention.visa_cdrn_alert` from the payment.

| Surface                   | What you get                                                                                                                                 |
| :------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------- |
| Payment timeline          | **Dashboard → Payments → \[payment]**—an entry reading **Visa CDRN Alert (Dispute)**, plus the refund and cancellation entries.              |
| Payment payload           | `fraud_prevention.visa_cdrn_alert` on the payment, carrying the case type and reason code. Read it from the API, or receive it on a webhook. |
| Payment filters           | **Dashboard → Payments → More filters**—filter by CDRN case **Type** and **Reason Code**.                                                    |
| Analytics filters         | The same filters narrow every chart and metric on the analytics dashboard.                                                                   |
| Analytics chart           | **Risk** tab—**Visa CDRN alerts**, as a share of settled card payments.                                                                      |
| Refunds and cancellations | The refund reason and the subscription cancellation reason both read **Fraud prevention**.                                                   |

## Related products

CDRN's primary coverage is the Visa network. [Mastercard Ethoca Alerts](/guides/fraud-prevention/mastercard-ethoca-alerts) is the Mastercard-network counterpart—enroll in both for full pre-dispute coverage across networks.

## Webhook events

Updates to `visa_cdrn_alert` are delivered on the `payment_v2.updated` event. See [Webhook event types](/webhooks/introduction/event-types) and the [Payment webhook object](/webhooks/objects/payment/payment) for the full schema.
