> ## 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 Order Insight & Compelling Evidence

> Reduce cardholder confusion and deflect disputes before they become chargebacks.

Visa Order Insight (OI), Order Insight Digital (OID), and Compelling Evidence 3.0 (CE) all run on the same Visa lookup channel. Every time a cardholder, issuer, or dispute system queries one of your transactions, Visa pulls a receipt from PayNext and uses it to defuse the dispute.

CE 3.0 is the highest-impact of the three—it can deflect a filed dispute before it becomes a chargeback. OI and OID work earlier in the funnel, defusing cardholder confusion before a dispute is ever filed.

## Lookup channels

| Channel | Trigger                                                               | Where the receipt appears                   |
| :------ | :-------------------------------------------------------------------- | :------------------------------------------ |
| `OI`    | Cardholder calls the issuing bank about a charge                      | Bank agent's screen during the call         |
| `OID`   | Cardholder taps "what's this charge?" inside the issuer's banking app | In-app, shown to the cardholder directly    |
| `CE`    | A dispute is filed; Visa runs CE 3.0 rules to evaluate deflection     | Internal—evaluated by Visa's dispute system |

The channel that triggered the most recent lookup is recorded as `visa_order_insight.type` on the payment.

## Subscription handling

When OI, OID, or CE fires on a payment that belongs to an active subscription, PayNext acts on the subscription that paid for that charge.

| Event                                          | Subscription action                                                                                                |
| :--------------------------------------------- | :----------------------------------------------------------------------------------------------------------------- |
| OI lookup (`type = "OI"`)                      | Scheduled for cancellation at the end of the current billing period; `status` becomes `scheduled_for_cancellation` |
| OID lookup (`type = "OID"`)                    | No action—an in-app lookup is treated as self-service curiosity, not a dispute signal                              |
| CE lookup (`type = "CE"`)                      | Scheduled for cancellation at the end of the current billing period                                                |
| CE terminal outcome (`accepted` or `declined`) | Cancelled immediately; `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.scheduled_for_cancellation` and `subscription_v2.cancelled` webhooks.

<Note>
  These cancellations are attributed automatically: the subscription's [`cancellation_details.reason`](/guides/platform/subscriptions#cancellation-details) is set to `fraud_prevention`, with `trigger_payment_id` pointing at the queried payment. If a refund is issued as part of the same flow, the payment's `refund_reason` is `fraud_prevention` too. This lets you distinguish dispute-driven cancels from your own `merchant_initiated` ones.
</Note>

## Setup

There is no integration work for OI or CE beyond keeping your Dashboard configuration current. The receipt PayNext serves is built from data you already provide.

### Required fields

| Source                                      | Fields                                                                                          |
| :------------------------------------------ | :---------------------------------------------------------------------------------------------- |
| **Dashboard → Organization**                | Merchant name, URL, support email, support phone, product description, terms and conditions URL |
| **Dashboard → Integrations → \[Processor]** | Merchant billing address                                                                        |

These are required Dashboard fields—if your account is set up, they're already filled in. Keep them up to date and OI/CE work automatically.

<Warning>
  The merchant billing address on each integration must match the address registered with that processor when you opened the merchant account. A mismatch causes Visa to reject the receipt.
</Warning>

### Captured automatically

Device data—IP address, geolocation, user agent, timezone—is captured by the [Web SDK](/guides/advanced/device-fingerprinting) at checkout and feeds directly into CE 3.0 evidence. No additional code is required.

## `visa_order_insight` payload

Written every time Visa runs a lookup, regardless of channel. The latest lookup overwrites all three fields atomically.

```json theme={"system"}
{
  "visa_order_insight": {
    "type": "OI",
    "insight_id": "4bfe0233-7b19-4e82-9c0a-1e8d2f3c5b11",
    "updated_at": "2026-04-23T12:45:51Z"
  }
}
```

| Field        | Type              | Description                                                                                                      |
| :----------- | :---------------- | :--------------------------------------------------------------------------------------------------------------- |
| `type`       | string            | Channel of the most recent lookup. Open enum: `OI`, `OID`, `CE`. New values may be added without a version bump. |
| `insight_id` | string (UUID)     | Identifier for the most recent lookup. Transient—changes whenever a new lookup arrives.                          |
| `updated_at` | string (ISO-8601) | Timestamp of the most recent lookup, UTC with `Z` suffix.                                                        |

<Note>
  This sub-object has no `status` field. Visa never reports back what the cardholder did with the receipt, so there's no terminal state to capture. Presence of `visa_order_insight` means at least one lookup happened; `type` and `updated_at` describe the latest one.
</Note>

## `visa_compelling_evidence` payload

Written only when Visa returns a terminal CE outcome. The lookup itself updates `visa_order_insight.type` to `CE`; the deflection result lands here when CE evaluation completes.

```json theme={"system"}
{
  "visa_compelling_evidence": {
    "status": "accepted",
    "case_id": "a6cf8f35-d753-4a66-8e09-65b451c96eed",
    "updated_at": "2026-04-23T12:45:54Z"
  }
}
```

| Field        | Type              | Description                                                                                                                     |
| :----------- | :---------------- | :------------------------------------------------------------------------------------------------------------------------------ |
| `status`     | string            | Terminal CE outcome. Closed enum: `accepted` (deflected; chargeback blocked), `declined` (evidence rejected; dispute proceeds). |
| `case_id`    | string (UUID)     | Stable identifier for the CE case.                                                                                              |
| `updated_at` | string (ISO-8601) | Timestamp of the CE outcome, UTC with `Z` suffix.                                                                               |

## Read the payload

CE evaluation is asynchronous. Between the lookup and the terminal outcome, the payment shows `visa_order_insight.type = "CE"` but no `visa_compelling_evidence` sub-object yet. The pending window is typically under 10 seconds.

| Payload state                                                       | Meaning                                                    |
| :------------------------------------------------------------------ | :--------------------------------------------------------- |
| `visa_order_insight` absent                                         | No Visa lookup has happened on this payment                |
| `visa_order_insight.type = "OI"` or `"OID"`                         | Cardholder looked up the charge; no dispute filed          |
| `visa_order_insight.type = "CE"`, `visa_compelling_evidence` absent | CE lookup happened; outcome pending or never delivered     |
| `visa_compelling_evidence.status = "accepted"`                      | Dispute was deflected by CE 3.0                            |
| `visa_compelling_evidence.status = "declined"`                      | CE evidence was rejected; dispute proceeds as a chargeback |

<Note>
  Once `visa_compelling_evidence` is written, it is never cleared. Only a later CE decision (`accepted` or `declined`) can change its `status`.
</Note>

## Webhook events

Updates to `visa_order_insight` and `visa_compelling_evidence` 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.
