TL;DR: A redirect-capable payment was created without returnUrl. Include an absolute returnUrl on every /payments call; Adyen ignores it when no redirect is needed, and every 3DS or bank redirect requires it.

The exact error:

```text
14_030 - Return URL is missing
```

## The fix

1. Add returnUrl to the /payments request on all code paths, not just redirect ones.
   Expected: Every payment request carries a return destination.
2. Use a full URL your server handles, and carry order state in its query string.
   Expected: The URL is absolute and reachable.
3. Test a 3D Secure payment end to end and confirm the shopper lands back on your handler.
   Expected: Adyen returns a redirect action instead of 14_030.

## When this applies

- /payments returns 14_030
- A 3D Secure challenge never starts
- You added a new redirect payment method

## When it does NOT apply

- Direct authorizations with no redirect step
- /payments/details calls, which resume rather than create
- Wallet methods that handle their own return (they still usually want it)

## Versions

Adyen Checkout API v68 through v71.

## Why it happens

Redirect actions are constructed from returnUrl at payment creation time. Without it Adyen cannot produce the redirect, so the request fails validation instead of failing mid-redirect.

## Edge cases and pitfalls

- The returnUrl must be reachable by the shopper's browser, not just your server
- Some flows append their own query parameters; keep your own state in a separate parameter
- Test return URLs on YOUR_HOST need a registered origin (see 14_013)
