Last updated: October 14, 2026
Resolve common integration issues by finding the symptom that matches what you see.
Each entry gives the symptom, its likely cause, a fix, and a way to confirm the fix worked. For errors specific to one payment method, also check the results section of the payment method guide.
This is the build error you're most likely to hit while adding the SDK.
CorePayments plus the products you use (PayPalPayments, FraudProtection, PaymentButtons, CardPayments).These errors show up early, usually on your first call into the SDK, and generally trace back to config or call order.
PayPalError.sessionNotStartedError returned on start() or vault()createPayPalSession() first.createPayPalSession(sessionType:userIdentity:urlConfig:userAction:) on PayPalClient in your button's action, before or alongside order creation.start() or vault() proceeds without a sessionNotStartedError failure.start()environment, or a missing or not-valid merchantID, required in v3 and distinct from your client ID.CoreConfig: confirm clientID, merchantID, and whether you set .sandbox or .live as intended.start() launches the checkout flow without an auth or configuration error.These problems appear after the buyer leaves your app for checkout and needs to find their way back.
applinks:example.com, and that your AASA file is served at https://<domain>/.well-known/apple-app-site-association. Keep return/cancel URLs on that domain. Setting fallbackSchemeURL in CFBundleURLTypes covers Universal Link delivery failures.checkoutClient.handleReturnURL(url) on your PayPalClient, from scene(_:continue:), or .onOpenURL in SwiftUI.LSApplicationQueriesSchemes is missing paypal, or this is an expected fallback. The buyer is not eligible, or the PayPal app is not installed. Other triggers are a buyer outside the US or an identity email that does not match the signed-in PayPal account.paypal under LSApplicationQueriesSchemes. To exercise the app-switch path in testing, meet all trigger conditions; see PayPal Checkout → Test and go live.These come up after the buyer returns, when the SDK is reporting an outcome you didn't expect.
.failure you expected to be a cancel.failure, never a separate .cancel case, for either PayPal or Card.PayPalError.isCheckoutCanceled(error) / isVaultCanceled(error) for PayPal, or CardError.isThreeDSecureCanceled(error) for Card, and route the buyer back to checkout.isCanceled check instead of falling through as an unhandled error.CardError.threeDSecureURLError: the challenge URL failed iOS's PayPal 3DS validation. On approveOrder(), the SDK checks the URL is a genuine PayPal Helios flow=3ds page before opening it. On vault(), the check is slightly weaker: it only confirms the URL contains helios, without also requiring flow=3ds.threeDSecureURLError.CoreConfig, and register your return links.