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.
These are the build and dependency errors you're most likely to hit while adding the SDK.
Failed to resolve: com.paypal.android:...mavenCentral() is in your repositories and use a current v3 version; add only the modules you use.browser-switch, Kotlin stdlib) conflicts with another library.These errors show up early, usually on your first call into the SDK, and generally trace back to config or call order.
PayPalEvent.SESSION_NOT_STARTED reported, and the start() or vault() callback receives a PayPalError.sessionNotCreatedError failurecreatePayPalSession() first.createPayPalSession(tokenType, userIdentity, urlConfig, userAction) in your button's onClick, before or alongside order creation.start() or vault() proceeds without a sessionNotCreatedError failure.start()coreEnvironment, or a missing or not-valid merchantId, required in v3 and distinct from your client ID.CoreConfig: clientId, merchantId, and whether you set CoreEnvironment.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.
/.well-known/assetlinks.json, with your app's SHA-256 fingerprint, android:autoVerify="true", and Open supported links enabled. Keep return and cancel URLs under the registered host + prefix. Registering a fallbackSchemeUrl alongside your App Link covers delivery failures. The SDK only requires at least one of returnAppUrl or fallbackSchemeUrl to be set, but setting both is the safer default.PayPalFinishStartResult after the buyer returnsstart() callback only reports PayPalPresentAuthChallengeResult (Success or Failure), meaning whether checkout launched. The Success, Canceled, Failure, or NoResult outcome comes from finishStart(intent). Also remember finishStart(intent) returns PayPalFinishStartResult?. A null result, meaning no matching start() or vault() call in this process, is a distinct case from NoResult and needs its own branch.checkoutClient.finishStart(intent) in onNewIntent, and set the return activity to launchMode="singleTop".finishStart(intent) returns a non-null PayPalFinishStartResult after the buyer returns.These come up after the buyer returns, when the SDK is reporting an outcome you didn't expect.
CancelCancel as a normal outcome, returning the buyer to checkout; if it happens unexpectedly often, re-check your App Link and return handling.Cancel, and a genuine cancel still returns the buyer to checkout cleanly.presentAuthChallenge() on an AuthorizationRequired result, or did not call finishApproveOrder(intent) on return.AuthorizationRequired, call cardClient.presentAuthChallenge(activity, authChallenge), then cardClient.finishApproveOrder(intent) in onNewIntent.AuthorizationRequired result and finishApproveOrder(intent) completes after it.This happens when Android reclaims your app's process while a challenge is still in flight.
cardClient.instanceState before the process dies and call cardClient.restore(instanceState) on recreation.CoreConfig, and register your return links.