On this page
No Headings
Last updated: September 14, 2026
Common problems integrating the PayPal Mobile SDK v3.0.0 on iOS, organized by symptom. For an error that happens inside one specific flow, also check that guide's Result handling section.
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() was not called 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're using .sandbox or .live.start() launches the checkout flow without an auth or configuration error.These problems appear once 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 expected fallback: the buyer is not eligible, the PayPal app is not installed, the buyer is not in the US, or the identity email 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.