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

# Testing

> Scenario-based testing guide for Notify Classic single-party staged disbursements, recipient authentication, and webhook event verification.

## Sandbox Environment

Your sandbox mirrors production behavior including payment routing logic, OFAC screening, account verification services, and webhook delivery. Sandbox credentials and velocity limits are provisioned during onboarding.

<Info>
  Sandbox velocity limits are client-specific and configured by your Ingo integration manager during onboarding.
</Info>

***

## Test Categories

| Category         | Description                                                 | How to initiate                              |
| ---------------- | ----------------------------------------------------------- | -------------------------------------------- |
| **Self-Service** | Complete independently in the sandbox at your own pace      | Your sandbox credentials                     |
| **Controlled**   | Requires an enablement flag set by your integration manager | Contact your integration manager to schedule |
| **Guided**       | Live session with your Ingo integration team recommended    | Contact your integration manager to schedule |

***

## Understanding Soft Failures

**Soft failure** — A partial match that does not stop the flow. The recipient experiences no interruption and proceeds transparently. Your system is notified of the result in the background via the correlated **success** webhook carrying the soft-fail status code. No failure webhook emits.

**Hard failure** — A mismatch on a field your configuration has designated as requiring a hard failure. How each verification field’s mismatch is treated is defined during your implementation setup via the configuration form. When a hard failure occurs, the recipient is stopped and must retry. If maximum attempts are exhausted, the session or transaction terminates.

***

## Self-Service Scenarios

<AccordionGroup>
  <Accordion title="Notify API — Staging & Lifecycle">
    <Card title="Successful Notification Delivery" icon="envelope">
      **Category:** Self-Service

      **Scenario:** Stage a transaction via the Notify API. The recipient receives the notification email and it is delivered successfully.

      **Success criteria:** Notification sent and received events fire

      **Key webhook sequence to verify:**

      | # | Event                 | Topic                                                | Expected Status |
      | - | --------------------- | ---------------------------------------------------- | --------------- |
      | 1 | Notification Sent     | `transaction.recipient.notification.status.sent`     | 1200 series     |
      | 2 | Notification Received | `transaction.recipient.notification.status.received` | 1200 series     |
    </Card>

    <Card title="Notification Bounce" icon="envelope-circle-check">
      **Category:** Self-Service

      **Scenario:** Stage a transaction using an invalid email address. Confirms your system handles undeliverable notification events.

      **Success criteria:** Bounce event received

      **Key webhook sequence to verify:**

      | # | Event                | Topic                                               | Expected Status |
      | - | -------------------- | --------------------------------------------------- | --------------- |
      | 1 | Notification Sent    | `transaction.recipient.notification.status.sent`    | 1200 series     |
      | 2 | Notification Bounced | `transaction.recipient.notification.status.bounced` | 1200 series     |
    </Card>

    <Card title="Idempotent Notify Request" icon="rotate">
      **Category:** Self-Service

      **Scenario:** Resubmit an identical Notify API request using the same `participant_unique_id1`. Confirms duplicate protection is working correctly.

      **Success criteria:** Response `status: 101` — no new transaction created
    </Card>

    <Card title="Cancel — Successful" icon="ban">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Submit a Notify Cancel request before the recipient completes the flow. Confirms cancellation before disbursement selection.

      **Success criteria:** Disbursement canceled event fires

      **Key webhook sequence to verify:**

      | # | Event                 | Topic                                                         | Expected Status |
      | - | --------------------- | ------------------------------------------------------------- | --------------- |
      | 1 | Notification Sent     | `transaction.recipient.notification.status.sent`              | 1200 series     |
      | 2 | Disbursement Canceled | `transaction.recipient.payment.disbursement.request.canceled` | 1110            |
    </Card>

    <Card title="Cancel — Failure Conditions" icon="circle-xmark">
      **Category:** Self-Service

      **Scenario:** Attempt to cancel a transaction in a state that does not permit cancellation — already completed, already canceled, already expired, or invalid notification ID. Confirms your system handles cancel error responses gracefully.

      **Success criteria:** Appropriate error status returned for each invalid state
    </Card>

    <Card title="Notification Expiration" icon="clock">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Allow the notification to expire without recipient action.

      **Success criteria:** Disbursement expired event fires

      **Key webhook sequence to verify:**

      | # | Event                | Topic                                                        | Expected Status |
      | - | -------------------- | ------------------------------------------------------------ | --------------- |
      | — | Disbursement Expired | `transaction.recipient.payment.disbursement.request.expired` | 1109            |
    </Card>

    <Card title="Notify Termination" icon="circle-stop">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Complete the authentication flow in a way that causes the transaction to reach a terminal failure state.

      **Success criteria:** Payment terminated event fires

      **Key webhook sequence to verify:**

      | # | Event              | Topic                                             | Expected Status |
      | - | ------------------ | ------------------------------------------------- | --------------- |
      | — | Payment Terminated | `transaction.recipient.payment.status.terminated` | 1113 or 1132    |
    </Card>
  </Accordion>

  <Accordion title="Recipient Authentication & RVDM">
    <Card title="Authentication — Success" icon="shield-check">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Open the notification and complete the authentication challenge with fully matching data. Recipient proceeds to disbursement selection.

      **Success criteria:** Authentication success event fires

      **Key webhook sequence to verify:**

      | # | Event                  | Topic                                                 | Expected Status |
      | - | ---------------------- | ----------------------------------------------------- | --------------- |
      | 1 | Notification Sent      | `transaction.recipient.notification.status.sent`      | 1200 series     |
      | 2 | Notification Received  | `transaction.recipient.notification.status.received`  | 1200 series     |
      | 3 | Authentication Success | `transaction.recipient.authentication.status.success` | 1100            |
    </Card>

    <Card title="Authentication — Soft Failure" icon="shield">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Enter partially matching authentication data. The recipient experiences no interruption and proceeds transparently. Your system is notified of the partial match in the background via the authentication success webhook carrying the soft-fail status code.

      **Success criteria:** Authentication success fires with soft-fail status code; recipient proceeds uninterrupted

      **Key webhook sequence to verify:**

      | #   | Event                        | Topic                                                 | Expected Status |
      | --- | ---------------------------- | ----------------------------------------------------- | --------------- |
      | 1–2 | Notification Sent / Received | *(as above)*                                          | 1200 series     |
      | 3   | Authentication Success       | `transaction.recipient.authentication.status.success` | 1101            |
    </Card>

    <Card title="Authentication — Hard Failure" icon="shield-xmark">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Provide non-matching authentication data. The recipient is stopped and must retry. Confirms hard failure handling.

      **Success criteria:** Authentication failure event fires

      **Key webhook sequence to verify:**

      | #   | Event                        | Topic                                                 | Expected Status |
      | --- | ---------------------------- | ----------------------------------------------------- | --------------- |
      | 1–2 | Notification Sent / Received | *(as above)*                                          | 1200 series     |
      | 3   | Authentication Failure       | `transaction.recipient.authentication.status.failure` | 1102            |
    </Card>

    <Card title="Authentication — Max Attempts Termination" icon="shield-slash">
      **Category:** Self-Service

      **Scenario:** Provide non-matching authentication data until maximum attempts are exhausted. Transaction terminates.

      **Success criteria:** Authentication failure fires, overall failure fires, transaction terminates

      **Key webhook sequence to verify:**

      | # | Event                  | Topic                                                 | Expected Status |
      | - | ---------------------- | ----------------------------------------------------- | --------------- |
      | — | Authentication Failure | `transaction.recipient.authentication.status.failure` | 1102            |
      | — | Overall Auth Failure   | `transaction.party.authentication.overall.failure`    | 1161            |
      | — | Payment Terminated     | `transaction.recipient.payment.status.terminated`     | 1113            |
    </Card>

    <Card title="RVDM — Success" icon="user-check">
      **Category:** Self-Service

      **Scenario:** Stage a transaction with RVDM enabled. Complete authentication. Provide recipient information that fully matches the session data.

      **Success criteria:** RVDM success event fires, flow continues to account selection

      **Key webhook sequence to verify:**

      | #   | Event                      | Topic                                             | Expected Status |
      | --- | -------------------------- | ------------------------------------------------- | --------------- |
      | 1–3 | Notification / Auth events | *(as above)*                                      | —               |
      | 4   | RVDM Success               | `transaction.recipient.verification.rvdm.success` | 1103            |
    </Card>

    <Card title="RVDM — Soft Failure" icon="user">
      **Category:** Self-Service

      **Scenario:** Provide partially matching recipient data. The recipient experiences no interruption and proceeds transparently. Your system is notified of the partial match in the background via the RVDM success webhook carrying the soft-fail status code.

      **Success criteria:** RVDM success fires with soft-fail status code; recipient proceeds uninterrupted

      **Key webhook sequence to verify:**

      | #   | Event                      | Topic                                             | Expected Status |
      | --- | -------------------------- | ------------------------------------------------- | --------------- |
      | 1–3 | Notification / Auth events | *(as above)*                                      | —               |
      | 4   | RVDM Success               | `transaction.recipient.verification.rvdm.success` | 1104            |
    </Card>

    <Card title="RVDM — Hard Failure & Termination" icon="user-xmark">
      **Category:** Self-Service

      **Scenario:** Provide non-matching recipient data until maximum attempts are exhausted. Transaction terminates.

      **Success criteria:** RVDM failure fires, transaction terminates

      **Key webhook sequence to verify:**

      | #   | Event                      | Topic                                             | Expected Status |
      | --- | -------------------------- | ------------------------------------------------- | --------------- |
      | 1–3 | Notification / Auth events | *(as above)*                                      | —               |
      | 4   | RVDM Failure               | `transaction.recipient.verification.rvdm.failure` | 1105            |
      | 5   | Payment Terminated         | `transaction.recipient.payment.status.terminated` | 1113            |
    </Card>
  </Accordion>

  <Accordion title="Payment Scenarios — Card">
    <Card title="Card — Successful Disbursement" icon="credit-card">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Complete authentication and RVDM. Select card disbursement, tokenize a valid test card, and complete the payment.

      **Success criteria:** Tokenization and payment success events fire

      **Key webhook sequence to verify:**

      | #   | Event                             | Topic                                          | Expected Status |
      | --- | --------------------------------- | ---------------------------------------------- | --------------- |
      | 1–4 | Notification / Auth / RVDM events | *(as above)*                                   | —               |
      | 5   | Tokenization Success              | `transaction.account.tokenization.success`     | 100             |
      | 6   | Payment Success                   | `transaction.recipient.payment.status.success` | 1125            |
    </Card>

    <Card title="Card — Repeat Recipient" icon="rotate-right">
      **Category:** Self-Service

      **Scenario:** Stage a second card transaction for a recipient with a previously tokenized account. Completes using the existing token without re-entering card details.

      **Success criteria:** Payment completes using stored token
    </Card>

    <Card title="Card — Account Not Available" icon="credit-card-front">
      **Category:** Self-Service

      **Scenario:** Enter a card account number not supported for disbursement. The recipient is stopped and must use a different account. Your system is notified via the CNS/CD failure webhook.

      **Success criteria:** CNS/CD failure event fires

      **Key webhook sequence to verify:**

      | # | Event          | Topic                                                  | Expected Status |
      | - | -------------- | ------------------------------------------------------ | --------------- |
      | — | CNS/CD Failure | `transaction.account.verification.card.failure.cns_cd` | 700             |
    </Card>
  </Accordion>

  <Accordion title="Payment Scenarios — ACH">
    <Card title="ACH — Successful Disbursement" icon="building-columns">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Complete authentication and RVDM. Select ACH disbursement, enter a valid test routing and account number, and complete the payment.

      **Success criteria:** Tokenization and payment success events fire

      **Key webhook sequence to verify:**

      | #   | Event                             | Topic                                          | Expected Status |
      | --- | --------------------------------- | ---------------------------------------------- | --------------- |
      | 1–4 | Notification / Auth / RVDM events | *(as above)*                                   | —               |
      | 5   | Tokenization Success              | `transaction.account.tokenization.success`     | 100             |
      | 6   | Payment Success                   | `transaction.recipient.payment.status.success` | 1126            |
    </Card>

    <Card title="ACH — Repeat Recipient" icon="rotate-right">
      **Category:** Self-Service

      **Scenario:** Stage a second ACH transaction for a recipient with a previously registered account. Completes using the existing token.

      **Success criteria:** Payment completes using stored token
    </Card>

    <Card title="ACH — RVDM Hard Failure" icon="building-columns">
      **Category:** Self-Service

      **Scenario:** Stage an ACH transaction. Provide non-matching session recipient information during account entry. Confirms hard failure stops the flow before tokenization.

      **Success criteria:** RVDM failure fires; no tokenization

      **Key webhook sequence to verify:**

      | # | Event        | Topic                                             | Expected Status |
      | - | ------------ | ------------------------------------------------- | --------------- |
      | — | RVDM Failure | `transaction.recipient.verification.rvdm.failure` | 1105            |
    </Card>

    <Card title="ACH — Session Termination" icon="circle-stop">
      **Category:** Self-Service

      **Scenario:** Provide non-matching session recipient information repeatedly until the session terminates.

      **Success criteria:** Session terminated event fires

      **Key webhook sequence to verify:**

      | # | Event              | Topic                                           | Expected Status |
      | - | ------------------ | ----------------------------------------------- | --------------- |
      | — | Session Terminated | `plugin.transaction.session.request.terminated` | 1127            |
    </Card>
  </Accordion>

  <Accordion title="Payment Scenarios — PayPal">
    <Card title="PayPal — Successful Disbursement" icon="paypal">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Complete authentication and RVDM. Select PayPal disbursement. PayPal Account Verification (AV) runs as the PayPal-specific account check. The AV result notifies your system in the background. The account is tokenized and payment completes.

      **Success criteria:** RVDM success, PayPal AV success, tokenization success, and payment success all fire

      **Key webhook sequence to verify:**

      | # | Event                  | Topic                                                 | Expected Status |
      | - | ---------------------- | ----------------------------------------------------- | --------------- |
      | 1 | Notification Sent      | `transaction.recipient.notification.status.sent`      | 1200 series     |
      | 2 | Notification Received  | `transaction.recipient.notification.status.received`  | 1200 series     |
      | 3 | Authentication Success | `transaction.recipient.authentication.status.success` | 1100 or 1101    |
      | 4 | RVDM Success           | `transaction.recipient.verification.rvdm.success`     | 1103 or 1104    |
      | 5 | PayPal AV Success      | `transaction.account.verification.paypal.success.av`  | 1148            |
      | 6 | Tokenization Success   | `transaction.account.tokenization.success`            | 100             |
      | 7 | Payment Success        | `transaction.recipient.payment.status.success`        | 1134            |
    </Card>

    <Card title="PayPal — RVDM Soft Failure" icon="paypal">
      **Category:** Self-Service

      **Scenario:** Stage a PayPal transaction. Provide partially matching session recipient data. The recipient experiences no interruption. Your system is notified of the partial RVDM match in the background via the RVDM success webhook. The flow continues to PayPal AV and tokenization.

      **Success criteria:** RVDM success fires with soft-fail code; PayPal flow continues; payment completes

      **Key webhook sequence to verify:**

      | #   | Event                      | Topic                                                | Expected Status |
      | --- | -------------------------- | ---------------------------------------------------- | --------------- |
      | 1–3 | Notification / Auth events | *(as above)*                                         | —               |
      | 4   | RVDM Success               | `transaction.recipient.verification.rvdm.success`    | 1104            |
      | 5   | PayPal AV Success          | `transaction.account.verification.paypal.success.av` | 1148            |
      | 6   | Tokenization Success       | `transaction.account.tokenization.success`           | 100             |
      | 7   | Payment Success            | `transaction.recipient.payment.status.success`       | 1134            |
    </Card>

    <Card title="PayPal — RVDM Hard Failure" icon="circle-xmark">
      **Category:** Self-Service

      **Scenario:** Stage a PayPal transaction. Provide non-matching session recipient data. The RVDM hard failure stops the flow before PayPal AV or tokenization.

      **Success criteria:** RVDM failure fires; no PayPal AV or tokenization

      **Key webhook sequence to verify:**

      | # | Event        | Topic                                             | Expected Status |
      | - | ------------ | ------------------------------------------------- | --------------- |
      | — | RVDM Failure | `transaction.recipient.verification.rvdm.failure` | 1105            |
    </Card>
  </Accordion>

  <Accordion title="Payment Scenarios — Check">
    <Card title="Check — Recipient-Elected (Client Issuance)" icon="money-check">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Complete the full flow. Recipient elects check. Client issues the check.

      **Success criteria:** Check in process event fires confirming the recipient elected check

      **Key webhook sequence to verify:**

      | # | Event            | Topic                                        | Expected Status |
      | - | ---------------- | -------------------------------------------- | --------------- |
      | — | Check In Process | `transaction.recipient.payment.status.check` | 1111 or 1112    |
    </Card>

    <Card title="Check — Address Not Confirmed" icon="location-dot">
      **Category:** Self-Service

      **Scenario:** Stage a check transaction. Recipient selects check but does not confirm the address on file.

      **Success criteria:** Check in process event fires with address-not-confirmed status code

      **Key webhook sequence to verify:**

      | # | Event            | Topic                                        | Expected Status |
      | - | ---------------- | -------------------------------------------- | --------------- |
      | — | Check In Process | `transaction.recipient.payment.status.check` | 1112            |
    </Card>

    <Card title="Check — Notification Expiration (Client Issuance)" icon="clock">
      **Category:** Self-Service

      **Scenario:** Stage a Client Issuance check transaction. Allow the notification to expire without recipient action. The disbursement request expires and the transaction terminates.

      **Success criteria:** Expired event fires; transaction terminates

      **Key webhook sequence to verify:**

      | # | Event                | Topic                                                        | Expected Status |
      | - | -------------------- | ------------------------------------------------------------ | --------------- |
      | 1 | Disbursement Expired | `transaction.recipient.payment.disbursement.request.expired` | 1109            |
      | 2 | Payment Terminated   | `transaction.recipient.payment.status.terminated`            | 1113            |
    </Card>

    <Card title="Check — Notification Expiration (Ingo Issuance)" icon="clock">
      **Category:** Self-Service

      **Scenario:** Stage an Ingo Issuance check transaction. Allow the notification to expire without recipient action. Ingo defaults to issuing the check — the payment succeeds and the check is issued and subsequently paid.

      **Success criteria:** Payment success fires, followed by check issued and check paid events

      **Key webhook sequence to verify:**

      | # | Event           | Topic                                               | Expected Status |
      | - | --------------- | --------------------------------------------------- | --------------- |
      | 1 | Payment Success | `transaction.recipient.payment.status.success`      | 1133            |
      | 2 | Check Issued    | `transaction.recipient.payment.status.check.issued` | 100             |
      | 3 | Check Paid      | `transaction.recipient.payment.status.check.paid`   | 100             |
    </Card>

    <Card title="Check — Ingo Issuance" icon="envelope-open-dollar">
      **Category:** Self-Service

      **Scenario:** Stage a transaction configured for Ingo check issuance. Complete the full flow. Ingo issues the check and it is subsequently paid.

      **Success criteria:** Payment success, check issued, and check paid events all fire

      **Key webhook sequence to verify:**

      | # | Event           | Topic                                               | Expected Status |
      | - | --------------- | --------------------------------------------------- | --------------- |
      | 1 | Payment Success | `transaction.recipient.payment.status.success`      | 1133            |
      | 2 | Check Issued    | `transaction.recipient.payment.status.check.issued` | 100             |
      | 3 | Check Paid      | `transaction.recipient.payment.status.check.paid`   | 100             |
    </Card>
  </Accordion>

  <Accordion title="Recipient Cancel">
    <Card title="Recipient-Initiated Cancellation" icon="hand">
      **Category:** Self-Service

      **Scenario:** Stage a transaction. Complete authentication and have the recipient elect to cancel the disbursement from within the iFrame.

      **Success criteria:** Recipient cancel event fires, transaction terminates

      **Key webhook sequence to verify:**

      | # | Event              | Topic                                                          | Expected Status |
      | - | ------------------ | -------------------------------------------------------------- | --------------- |
      | — | Recipient Cancel   | `transaction.recipient.payment.notice.status.recipient.cancel` | 1139            |
      | — | Payment Terminated | `transaction.recipient.payment.status.terminated`              | 1113            |
    </Card>
  </Accordion>
</AccordionGroup>

***

## Controlled Scenarios

<Warning>
  The following scenarios require your Ingo integration manager to enable a specific configuration before testing can begin. Contact your integration team to schedule these.
</Warning>

<AccordionGroup>
  <Accordion title="OTAC — One-Time Authentication Code">
    <Note>
      OTAC is a configurable authentication method where a one-time code is delivered to the recipient's mobile number during the authentication flow. The following scenarios require OTAC to be enabled in your sandbox configuration.
    </Note>

    <Card title="OTAC Validation — Success" icon="mobile-screen-button">
      **Category:** Controlled

      **Scenario:** Stage a transaction with OTAC enabled. Complete the RA challenge. Receive the OTAC code on the registered mobile number and enter it correctly. Authentication completes successfully.

      **Success criteria:** OTAC generate, validation success, and overall auth success events all fire

      **Key webhook sequence to verify:**

      | #   | Event                        | Topic                                                      | Expected Status |
      | --- | ---------------------------- | ---------------------------------------------------------- | --------------- |
      | 1–2 | Notification Sent / Received | *(as above)*                                               | 1200 series     |
      | 3   | Authentication Success       | `transaction.recipient.authentication.status.success`      | 1100 or 1101    |
      | 4   | OTAC Generated               | `transaction.party.authentication.otac.delivery.generate`  | 1153 or 1154    |
      | 5   | OTAC Validation Success      | `transaction.party.authentication.otac.validation.success` | 1150            |
      | 6   | Overall Auth Success         | `transaction.party.authentication.overall.success`         | 1160            |
    </Card>

    <Card title="OTAC Validation — Failure" icon="mobile">
      **Category:** Controlled

      **Scenario:** Enter an incorrect OTAC code. The recipient is stopped and may retry. Confirms validation failure handling.

      **Success criteria:** OTAC validation failure event fires; retry permitted

      **Key webhook sequence to verify:**

      | # | Event                   | Topic                                                      | Expected Status |
      | - | ----------------------- | ---------------------------------------------------------- | --------------- |
      | — | OTAC Generated          | `transaction.party.authentication.otac.delivery.generate`  | 1153 or 1154    |
      | — | OTAC Validation Failure | `transaction.party.authentication.otac.validation.failure` | 1152            |
    </Card>

    <Card title="OTAC — Max Failed Attempts Termination" icon="mobile-slash">
      **Category:** Controlled

      **Scenario:** Enter incorrect OTAC codes until maximum attempts are exhausted. Transaction terminates.

      **Success criteria:** OTAC validation failure fires repeatedly; overall auth failure fires; transaction terminates

      **Key webhook sequence to verify:**

      | # | Event                   | Topic                                                      | Expected Status |
      | - | ----------------------- | ---------------------------------------------------------- | --------------- |
      | — | OTAC Validation Failure | `transaction.party.authentication.otac.validation.failure` | 1152            |
      | — | Overall Auth Failure    | `transaction.party.authentication.overall.failure`         | 1161            |
      | — | Payment Terminated      | `transaction.recipient.payment.status.terminated`          | 1113            |
    </Card>

    <Card title="OTAC — Send Limit Reached" icon="circle-pause">
      **Category:** Controlled

      **Scenario:** Request OTAC code delivery repeatedly until the send limit is reached. Confirms your system handles the send limit event.

      **Success criteria:** OTAC delivery limit event fires; overall auth failure fires

      **Key webhook sequence to verify:**

      | # | Event                | Topic                                                  | Expected Status |
      | - | -------------------- | ------------------------------------------------------ | --------------- |
      | — | OTAC Send Limit      | `transaction.party.authentication.otac.delivery.limit` | 1151            |
      | — | Overall Auth Failure | `transaction.party.authentication.overall.failure`     | 1162            |
    </Card>

    <Card title="OTAC — Inaccessible (Termination)" icon="circle-stop">
      **Category:** Controlled

      **Scenario:** OTAC cannot be delivered or accessed (e.g., no mobile number available). Transaction terminates.

      **Success criteria:** Overall auth failure fires with inaccessible status; transaction terminates

      **Key webhook sequence to verify:**

      | # | Event                | Topic                                              | Expected Status |
      | - | -------------------- | -------------------------------------------------- | --------------- |
      | — | Overall Auth Failure | `transaction.party.authentication.overall.failure` | 1163            |
      | — | Payment Terminated   | `transaction.recipient.payment.status.terminated`  | 1113            |
    </Card>
  </Accordion>

  <Accordion title="Card — AVS & CVV Risk Management">
    <Card title="AVS Soft Fail" icon="location-crosshairs">
      **Category:** Controlled

      **Scenario:** A card account tokenization where the AVS check returns a soft failure. The recipient experiences no interruption and proceeds transparently. Your system is notified of the partial address match in the background via the tokenization success webhook carrying the soft-fail status code.

      **Success criteria:** Tokenization success fires with AVS soft-fail status code; payment completes

      **Key webhook sequence to verify:**

      | #   | Event                             | Topic                                          | Expected Status |
      | --- | --------------------------------- | ---------------------------------------------- | --------------- |
      | 1–4 | Notification / Auth / RVDM events | *(as above)*                                   | —               |
      | 5   | Tokenization Success              | `transaction.account.tokenization.success`     | 111–119 range   |
      | 6   | Payment Success                   | `transaction.recipient.payment.status.success` | 1125            |
    </Card>

    <Card title="AVS Decline" icon="location-dot-slash">
      **Category:** Controlled

      **Scenario:** A card account tokenization where the AVS check returns a hard decline. The recipient is stopped and must use a different account. Your system is notified via the AVS/CVV failure webhook.

      **Success criteria:** AVS/CVV failure event fires; account rejected

      **Key webhook sequence to verify:**

      | # | Event           | Topic                                                   | Expected Status |
      | - | --------------- | ------------------------------------------------------- | --------------- |
      | — | AVS/CVV Failure | `transaction.account.verification.card.failure.avs_cvv` | 753–759 range   |
    </Card>

    <Card title="CVV Decline" icon="shield-slash">
      **Category:** Controlled

      **Scenario:** A card account tokenization where the CVV check returns a hard decline. Your system is notified via the AVS/CVV failure webhook.

      **Success criteria:** AVS/CVV failure event fires; account rejected

      **Key webhook sequence to verify:**

      | # | Event           | Topic                                                   | Expected Status |
      | - | --------------- | ------------------------------------------------------- | --------------- |
      | — | AVS/CVV Failure | `transaction.account.verification.card.failure.avs_cvv` | —               |
    </Card>
  </Accordion>

  <Accordion title="ACH — GIACT Account Verification">
    <Card title="ANV / NAV Soft Fail" icon="building-columns">
      **Category:** Controlled

      **Scenario:** An ACH account verification returns a soft failure on account number validation (ANV) or name/address validation (NAV). The recipient experiences no interruption. Your system is notified of the partial match in the background via the tokenization success webhook carrying the soft-fail status code.

      **Success criteria:** Tokenization success fires with soft-fail status code; payment completes

      **Key webhook sequence to verify:**

      | # | Event                  | Topic                                                 | Expected Status       |
      | - | ---------------------- | ----------------------------------------------------- | --------------------- |
      | 1 | Notification Sent      | `transaction.recipient.notification.status.sent`      | 1200 series           |
      | 2 | Notification Received  | `transaction.recipient.notification.status.received`  | 1200 series           |
      | 3 | Authentication Success | `transaction.recipient.authentication.status.success` | 1100 or 1101          |
      | 4 | RVDM Success           | `transaction.recipient.verification.rvdm.success`     | 1103 or 1104          |
      | 5 | Tokenization Success   | `transaction.account.tokenization.success`            | Soft-fail status code |
      | 6 | Payment Success        | `transaction.recipient.payment.status.success`        | 1126                  |
    </Card>

    <Card title="RNV / ANV / NAV Hard Decline" icon="ban">
      **Category:** Controlled

      **Scenario:** ACH account verification returns a hard decline on routing number, account number, or name/address validation. The recipient is stopped and must use a different account. Your system is notified via the appropriate failure webhook.

      **Success criteria:** Applicable failure event fires; account rejected

      **Key webhook sequence to verify:**

      | # | Event            | Topic                                              | Expected Status |
      | - | ---------------- | -------------------------------------------------- | --------------- |
      | — | RNV Failure      | `transaction.account.verification.ach.failure.rnv` | 743             |
      | — | *or* ANV Failure | `transaction.account.verification.ach.failure.anv` | 767–769         |
      | — | *or* NAV Failure | `transaction.account.verification.ach.failure.nav` | 776–778         |
    </Card>
  </Accordion>

  <Accordion title="PayPal — Account Verification">
    <Card title="PayPal AV — Soft Fail" icon="paypal">
      **Category:** Controlled

      **Scenario:** PayPal account verification returns a partial match. The recipient experiences no interruption and proceeds transparently. Your system is notified of the partial match in the background via the PayPal AV success webhook carrying the soft-fail status code. The account is tokenized and payment completes.

      **Success criteria:** PayPal AV success fires with soft-fail status code; tokenization and payment success follow

      **Key webhook sequence to verify:**

      | #   | Event                             | Topic                                                | Expected Status       |
      | --- | --------------------------------- | ---------------------------------------------------- | --------------------- |
      | 1–4 | Notification / Auth / RVDM events | *(as above)*                                         | —                     |
      | 5   | PayPal AV Success                 | `transaction.account.verification.paypal.success.av` | Soft-fail status code |
      | 6   | Tokenization Success              | `transaction.account.tokenization.success`           | 100                   |
      | 7   | Payment Success                   | `transaction.recipient.payment.status.success`       | 1134                  |
    </Card>

    <Card title="PayPal AV — Hard Fail & Max Attempts Termination" icon="circle-xmark">
      **Category:** Controlled

      **Scenario:** PayPal account verification returns a hard failure. The recipient is stopped and must retry. If maximum attempts are reached, the transaction terminates.

      **Success criteria:** PayPal AV failure fires; termination event fires after max attempts

      **Key webhook sequence to verify:**

      | #     | Event              | Topic                                                | Expected Status |
      | ----- | ------------------ | ---------------------------------------------------- | --------------- |
      | —     | PayPal AV Failure  | `transaction.account.verification.paypal.failure.av` | 1150            |
      | Final | Payment Terminated | `transaction.recipient.payment.status.terminated`    | 1113            |
    </Card>
  </Accordion>

  <Accordion title="OFAC Screening">
    <Card title="OFAC Suspended — Cleared (Payment Success)" icon="flag">
      **Category:** Controlled

      **Scenario:** A staged transaction triggers an OFAC hit during the disbursement flow. The payment is suspended. After OFAC review, the transaction is cleared and payment completes.

      **Success criteria:** Suspended and cleared events both fire; payment ultimately succeeds

      **Key webhook sequence to verify:**

      | # | Event           | Topic                                                      | Expected Status |
      | - | --------------- | ---------------------------------------------------------- | --------------- |
      | 1 | OFAC Suspended  | `transaction.recipient.verification.ofac.status.suspended` | 1106            |
      | 2 | OFAC Cleared    | `transaction.recipient.verification.ofac.status.cleared`   | 1107            |
      | 3 | Payment Success | `transaction.recipient.payment.status.success`             | 1125–1134       |
    </Card>

    <Card title="OFAC Suspended — Cleared (Payment Declined)" icon="flag-checkered">
      **Category:** Controlled

      **Scenario:** An OFAC suspension is reviewed and cleared, but payment is subsequently declined by the network.

      **Success criteria:** Suspended and cleared events fire; payment failure fires

      **Key webhook sequence to verify:**

      | # | Event           | Topic                                                      | Expected Status |
      | - | --------------- | ---------------------------------------------------------- | --------------- |
      | 1 | OFAC Suspended  | `transaction.recipient.verification.ofac.status.suspended` | 1106            |
      | 2 | OFAC Cleared    | `transaction.recipient.verification.ofac.status.cleared`   | 1107            |
      | 3 | Payment Failure | `transaction.recipient.payment.status.failure`             | —               |
    </Card>

    <Card title="OFAC Failure — Transaction Terminated" icon="triangle-exclamation">
      **Category:** Controlled

      **Scenario:** An OFAC suspension is reviewed and confirmed. The transaction is terminated.

      **Success criteria:** Suspended and failure events fire; transaction terminates

      **Key webhook sequence to verify:**

      | # | Event              | Topic                                                      | Expected Status |
      | - | ------------------ | ---------------------------------------------------------- | --------------- |
      | 1 | OFAC Suspended     | `transaction.recipient.verification.ofac.status.suspended` | 1106            |
      | 2 | OFAC Failure       | `transaction.recipient.verification.ofac.status.failure`   | 1108            |
      | 3 | Payment Terminated | `transaction.recipient.payment.status.terminated`          | 1113            |
    </Card>
  </Accordion>
</AccordionGroup>

***

## Guided Scenarios

<Warning>
  The following scenarios involve coordination with your Ingo integration team. Contact your integration manager to schedule a guided session.
</Warning>

<AccordionGroup>
  <Accordion title="Returned & Refunded Payments">
    <Card title="Returned Payment" icon="arrow-rotate-left">
      **Category:** Guided

      **Scenario:** A previously completed payment is returned by the account issuer. Confirms your system correctly handles the returned status.

      **Success criteria:** Returned event received and processed correctly

      **Key webhook sequence to verify:**

      | # | Event            | Topic                                           | Expected Status |
      | - | ---------------- | ----------------------------------------------- | --------------- |
      | — | Payment Returned | `transaction.recipient.payment.status.returned` | 1114            |
    </Card>
  </Accordion>
</AccordionGroup>

***

## Webhook Events Reference

<AccordionGroup>
  <Accordion title="Notification Events">
    | Event                 | Topic                                                | Expected Status |
    | --------------------- | ---------------------------------------------------- | --------------- |
    | Notification Sent     | `transaction.recipient.notification.status.sent`     | 1200 series     |
    | Notification Received | `transaction.recipient.notification.status.received` | 1200 series     |
    | Notification Bounced  | `transaction.recipient.notification.status.bounced`  | 1200 series     |
  </Accordion>

  <Accordion title="Authentication Events">
    | Event                   | Topic                                                      | Expected Status                                             |
    | ----------------------- | ---------------------------------------------------------- | ----------------------------------------------------------- |
    | Auth Success            | `transaction.recipient.authentication.status.success`      | 1100 (full), 1101 (soft fail)                               |
    | Auth Failure            | `transaction.recipient.authentication.status.failure`      | 1102                                                        |
    | OTAC Generated          | `transaction.party.authentication.otac.delivery.generate`  | 1153 (SMS), 1154 (email)                                    |
    | OTAC Send Limit         | `transaction.party.authentication.otac.delivery.limit`     | 1151                                                        |
    | OTAC Validation Success | `transaction.party.authentication.otac.validation.success` | 1150                                                        |
    | OTAC Validation Failure | `transaction.party.authentication.otac.validation.failure` | 1152                                                        |
    | Overall Auth Success    | `transaction.party.authentication.overall.success`         | 1160                                                        |
    | Overall Auth Failure    | `transaction.party.authentication.overall.failure`         | 1161 (max attempts), 1162 (send limit), 1163 (inaccessible) |
  </Accordion>

  <Accordion title="Verification Events">
    | Event          | Topic                                                      | Expected Status               |
    | -------------- | ---------------------------------------------------------- | ----------------------------- |
    | RVDM Success   | `transaction.recipient.verification.rvdm.success`          | 1103 (full), 1104 (soft fail) |
    | RVDM Failure   | `transaction.recipient.verification.rvdm.failure`          | 1105                          |
    | OFAC Suspended | `transaction.recipient.verification.ofac.status.suspended` | 1106                          |
    | OFAC Cleared   | `transaction.recipient.verification.ofac.status.cleared`   | 1107                          |
    | OFAC Failure   | `transaction.recipient.verification.ofac.status.failure`   | 1108                          |
  </Accordion>

  <Accordion title="Account Verification Events">
    | Event                | Topic                                                   | Expected Status                     |
    | -------------------- | ------------------------------------------------------- | ----------------------------------- |
    | Card CNS/CD Failure  | `transaction.account.verification.card.failure.cns_cd`  | 700                                 |
    | Card AVS/CVV Failure | `transaction.account.verification.card.failure.avs_cvv` | 753–759                             |
    | ACH RNV Failure      | `transaction.account.verification.ach.failure.rnv`      | 743                                 |
    | ACH ANV Failure      | `transaction.account.verification.ach.failure.anv`      | 767–769                             |
    | ACH NAV Failure      | `transaction.account.verification.ach.failure.nav`      | 776–778                             |
    | PayPal AV Failure    | `transaction.account.verification.paypal.failure.av`    | 1150                                |
    | PayPal AV Success    | `transaction.account.verification.paypal.success.av`    | 1148                                |
    | Tokenization Success | `transaction.account.tokenization.success`              | 100 (full), 111–119 (AVS soft fail) |
  </Accordion>

  <Accordion title="Payment Status Events">
    | Event                    | Topic                                                          | Expected Status |
    | ------------------------ | -------------------------------------------------------------- | --------------- |
    | Payment Success — Card   | `transaction.recipient.payment.status.success`                 | 1125            |
    | Payment Success — ACH    | `transaction.recipient.payment.status.success`                 | 1126            |
    | Payment Success — Check  | `transaction.recipient.payment.status.success`                 | 1133            |
    | Payment Success — PayPal | `transaction.recipient.payment.status.success`                 | 1134            |
    | Payment Failure          | `transaction.recipient.payment.status.failure`                 | varies          |
    | Payment Terminated       | `transaction.recipient.payment.status.terminated`              | 1113, 1132      |
    | Payment Returned         | `transaction.recipient.payment.status.returned`                | 1114            |
    | Disbursement Expired     | `transaction.recipient.payment.disbursement.request.expired`   | 1109            |
    | Disbursement Canceled    | `transaction.recipient.payment.disbursement.request.canceled`  | 1110            |
    | Recipient Cancel         | `transaction.recipient.payment.notice.status.recipient.cancel` | 1139            |
    | Check In Process         | `transaction.recipient.payment.status.check`                   | 1111, 1112      |
    | Check Issued             | `transaction.recipient.payment.status.check.issued`            | 100             |
    | Check Paid               | `transaction.recipient.payment.status.check.paid`              | 100             |
    | Check Returned           | `transaction.recipient.payment.status.check.returned`          | 1114            |
  </Accordion>
</AccordionGroup>
