# Adyen resultCode CANCELLED: shopper cancelled at the 3DS challenge screen

## TL;DR
CANCELLED is not a decline; the shopper deliberately closed or abandoned the 3DS challenge screen, so no money moved. Do not treat it like a bank refusal and do not auto-retry the same 3DS session. Show "you cancelled the payment" in the UI and start a fresh payment with a new 3DS transaction when they try again.

```text
adyen resultCode CANCELLED: shopper cancelled at the 3DS challenge screen
```

## Steps

1. Read the resultCode from the /payments or /payments/details response. If it is CANCELLED, stop; this is shopper abandonment, not a decline. Success check: your code branches CANCELLED away from the refusal-handling path.

2. Mark the order as "payment cancelled by shopper" in your system, not as declined or failed. Success check: your reporting shows cancellation as a distinct outcome.

3. Show the shopper a clear message: they cancelled the verification step, and nothing was charged. Success check: the UI copy mentions cancellation, not a generic "payment failed."

4. If the shopper tries again, create a brand-new payment request with a fresh 3DS transaction. Never reuse the abandoned challenge. Success check: the new attempt gets a fresh 3DS session and completes normally.

5. Log the abandonment point (3DS challenge vs earlier) so you can tell checkout friction apart from fraud-driven cancels later. Success check: analytics separates CANCELLED from REFUSED and ERROR.

## When this applies

- resultCode is exactly CANCELLED after a 3DS challenge (native 3DS2 or redirect).
- You need to distinguish shopper abandonment from real declines in reporting and UX.
- Your agent flow auto-retries payments and you want to exclude cancellations.

## When it doesn't

- resultCode is REFUSED; that is the issuer's decision and needs different messaging.
- The redirect returns with no resultCode at all; that is a broken return flow, not a cancellation.
- The 3DS challenge loops without ever returning; that is a challenge-integration bug.

## Tool + version compatibility

Adyen Checkout API v68+, Drop-in and Components v5+, EMV 3-D Secure 2 (3DS2) flows.

### "adyen cancelled 3d secure payment"
Same thing. CANCELLED at any point in the 3DS flow means the shopper bailed; handle per steps 1-4.

### "adyen resultCode cancelled after challenge"
The challenge screen specifically. Fresh payment on retry, never reuse the session.

### "adyen shopper closed 3ds window"
Identical handling. Treat window-close and explicit cancel the same way.

## Why it happens

Adyen separates the shopper's decision (CANCELLED) from the bank's decision (REFUSED) and from system problems (ERROR). When the shopper closes the challenge, the issuer never renders a verdict, so Adyen reports exactly what happened: nobody declined anything, the shopper walked away.

## Edge cases / pitfalls

- Do not fire your "payment failed" email on CANCELLED; it confuses shoppers who chose to stop.
- Some shoppers cancel because the challenge looked suspicious. Offer an alternative payment method on the retry screen.
- A high CANCELLED rate at the challenge step usually means checkout friction or a scary-looking challenge screen, not fraud.
- CANCELLED can also arrive when the challenge times out on the shopper's device; the handling is the same.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_Y8uZKSiMlbtvcaJdkkOsnw
