{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["sub-heading","admonition"]},"type":"markdown"},"seo":{"title":"Testing","description":"Transform your commerce with PXP's unified platform—seamless payments, real-time insights, and global growth in one powerful integration.","lang":"en-UK","siteUrl":"https://developer.pxp.io","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"testing","__idx":0},"children":["Testing"]},{"$$mdtype":"Tag","name":"SubHeading","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Test your payout integration thoroughly before going live."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Always test payout functionality in PayPal's sandbox environment before deploying to production."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide covers:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Setting up sandbox accounts"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Testing the complete payout flow"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Common test scenarios"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Troubleshooting failed tests"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Moving to production"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"before-you-start","__idx":2},"children":["Before you start"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ensure you have:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Completed ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/checkout/components/ios/paypal/payouts/onboarding"},"children":["PayPal onboarding"]}," with sandbox credentials."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Implemented the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/checkout/components/ios/paypal/payouts/withdrawal-flow"},"children":["withdrawal flow"]}," including backend setup."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Created PayPal sandbox test accounts."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-configure-your-sandbox-environment","__idx":3},"children":["Step 1: Configure your sandbox environment"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"update-ios-app-configuration","__idx":4},"children":["Update iOS app configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Import the SDK and set it to use the test environment:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"import PXPCheckoutSDK\n\nlet config = CheckoutConfig(\n    environment: .test,  // Environment.test (sandbox)\n    session: sessionData,\n    transactionData: transactionData,\n    merchantShopperId: \"test_shopper_01\",\n    ownerId: \"Unity\"\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Available environment values:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".test"]},": Sandbox environment for testing"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".live"]},": Production environment"]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The SDK automatically uses sandbox PayPal endpoints and the test Unity API when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["environment: .test"]}," is set."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"update-backend-configuration","__idx":5},"children":["Update backend configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is backend server configuration (not iOS code):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"// Environment configuration\nconst ENVIRONMENT = 'sandbox';\n\nconst config = {\n  paypal: {\n    clientId: process.env.PAYPAL_SANDBOX_CLIENT_ID,\n    secret: process.env.PAYPAL_SANDBOX_SECRET,\n    apiBaseUrl: 'https://api-m.sandbox.paypal.com'\n  },\n  unity: {\n    apiBaseUrl: 'https://api-services-test.pxp.io',\n    clientId: process.env.UNITY_TEST_CLIENT_ID,\n    tokenId: process.env.UNITY_TEST_TOKEN_ID,\n    tokenValue: process.env.UNITY_TEST_TOKEN_VALUE\n  }\n};\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-create-test-accounts","__idx":6},"children":["Step 2: Create test accounts"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-business-account-payout-sender","__idx":7},"children":["Create a business account (payout sender)"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Log in to ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://developer.paypal.com/","target":"_blank"},"children":["PayPal Developer Dashboard"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Go to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sandbox > Accounts"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create Account"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure your account:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Account Type"]},": Business"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Email"]},": business-sender@example.com"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Password"]},": Choose a password"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Account balance"]},": $10,000 (for testing)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Country"]},": United States"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create Account"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-personal-accounts-payout-recipients","__idx":8},"children":["Create personal accounts (payout recipients)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create multiple recipient accounts to test different scenarios:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"account-1-valid-recipient","__idx":9},"children":["Account 1: Valid recipient"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Account type"]},": Personal"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Email"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recipient1@example.com"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Balance"]},": $0"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Status"]},": Verified"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"account-2-unverified-recipient","__idx":10},"children":["Account 2: Unverified recipient"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Account type"]},": Personal"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Email"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recipient2@example.com"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Balance"]},": $0"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Status"]},": Unverified (don't complete email verification)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"account-3-limited-account","__idx":11},"children":["Account 3: Limited account"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Account type"]},": Personal"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Email"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recipient3@example.com"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Balance"]},": $0"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Status"]},": Limited (simulate by restricting in sandbox)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"access-test-accounts","__idx":12},"children":["Access test accounts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To log in to sandbox accounts:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Go to ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://www.sandbox.paypal.com/","target":"_blank"},"children":["PayPal Sandbox"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use the sandbox account credentials."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify account status and balance."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-test-payout-execution","__idx":13},"children":["Step 3: Test payout execution"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-scenario-successful-payout-sdk-managed","__idx":14},"children":["Test scenario: successful payout (SDK-managed)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Configuration: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["proceedPayoutWithSdk: true"]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Initiate the withdrawal flow with pre-configured payer ID."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPrePayoutSubmit"]}," callback triggered."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Show approval UI"]},": Display confirmation to user."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Return approval"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isApproved: true"]}," with payer ID."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Observe"]},": SDK executes payout."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wait"]},": For payout to process (typically < 30 seconds in sandbox)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPostPayout"]}," callback triggered with transaction IDs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check sandbox"]},": Log into ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["recipient1@example.com"]}," account."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify balance"]},": $100 added to account balance."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," The payout completes and funds appear in the recipient account."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-scenario-merchant-rejects-payout","__idx":15},"children":["Test scenario: Merchant rejects payout"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Initiate the withdrawal flow."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPrePayoutSubmit"]}," callback, show the approval UI."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Return rejection"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isApproved: false"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": No payout executed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check"]},": No error callback triggered."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," The payout is cancelled gracefully and no funds are transferred."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-scenario-successful-payout-backend-managed","__idx":16},"children":["Test scenario: Successful payout (backend-managed)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Configuration: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["proceedPayoutWithSdk: false"]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Initiate the withdrawal flow with pre-configured credentials."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Call the backend endpoint"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/payouts/execute"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Backend calls the Unity Payout API."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check response"]},": Payout transaction ID returned."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Log into sandbox"]},": Verify funds transferred."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," Backend successfully triggers payout."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-test-error-scenarios","__idx":17},"children":["Step 4: Test error scenarios"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-invalid-payer-id-format","__idx":18},"children":["Test: Invalid payer ID format"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"// Configure SDK with invalid payer ID (contains non-alphanumeric characters)\nlet paypalConfig = PayPalConfig(\n    payout: PayPalPayoutConfig(\n        paypalWallet: PayPalWallet(\n            email: \"user@example.com\",\n            payerId: \"INVALID@ID!\",  // Contains non-alphanumeric characters\n            proceedPayoutWithSdk: true\n        )\n    )\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0818"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutPayerIdInvalidException"]},")."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To test an ID that is valid format but doesn't exist in PayPal, the SDK will pass validation but the payout transaction will fail with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0819"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutFailedException"]},")."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-empty-payer-id","__idx":19},"children":["Test: Empty payer ID"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"// Configure SDK with empty payer ID\nlet paypalConfig = PayPalConfig(\n    payout: PayPalPayoutConfig(\n        paypalWallet: PayPalWallet(\n            email: \"user@example.com\",\n            payerId: \"\",  // Empty payer ID\n            proceedPayoutWithSdk: true\n        )\n    )\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0809"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutPayerIdRequiredException"]},")"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-payer-id-too-long","__idx":20},"children":["Test: Payer ID too long"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"// Configure SDK with payer ID exceeding max length\nlet paypalConfig = PayPalConfig(\n    payout: PayPalPayoutConfig(\n        paypalWallet: PayPalWallet(\n            email: \"user@example.com\",\n            payerId: \"ABCDEFGHIJKLMN\",  // 14 characters, max is 13\n            proceedPayoutWithSdk: true\n        )\n    )\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0817"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutPayerIdMaxLengthException"]},")"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-negative-amount","__idx":21},"children":["Test: Negative amount"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let transactionData = TransactionData(\n    amount: Decimal(-50.00),  // Negative amount\n    currency: \"USD\",\n    entryType: .ecom,\n    intent: TransactionIntentData(card: nil, paypal: .payout),\n    merchantTransactionId: \"test-\\(UUID().uuidString)\",\n    merchantTransactionDate: { Date() }\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0811"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutAmountNotPositiveException"]},")"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-zero-amount","__idx":22},"children":["Test: Zero amount"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let transactionData = TransactionData(\n    amount: Decimal(0.00),  // Zero amount\n    currency: \"USD\",\n    entryType: .ecom,\n    intent: TransactionIntentData(card: nil, paypal: .payout),\n    merchantTransactionId: \"test-\\(UUID().uuidString)\",\n    merchantTransactionDate: { Date() }\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0811"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutAmountNotPositiveException"]},") - amount must be greater than zero"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-invalid-amount-nan-or-infinity","__idx":23},"children":["Test: Invalid amount (NaN or infinity)"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let transactionData = TransactionData(\n    amount: Decimal(Double.nan),  // Not a number\n    currency: \"USD\",\n    entryType: .ecom,\n    intent: TransactionIntentData(card: nil, paypal: .payout),\n    merchantTransactionId: \"test-\\(UUID().uuidString)\",\n    merchantTransactionDate: { Date() }\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0810"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutAmountInvalidException"]},")"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-invalid-currency-code-length","__idx":24},"children":["Test: Invalid currency code length"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let transactionData = TransactionData(\n    amount: Decimal(100.00),\n    currency: \"US\",  // Only 2 characters, must be 3\n    entryType: .ecom,\n    intent: TransactionIntentData(card: nil, paypal: .payout),\n    merchantTransactionId: \"test-\\(UUID().uuidString)\",\n    merchantTransactionDate: { Date() }\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0814"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutCurrencyInvalidLengthException"]},")."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-invalid-currency-code-format","__idx":25},"children":["Test: Invalid currency code format"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let transactionData = TransactionData(\n    amount: Decimal(100.00),\n    currency: \"XXX\",  // Invalid ISO 4217 code\n    entryType: .ecom,\n    intent: TransactionIntentData(card: nil, paypal: .payout),\n    merchantTransactionId: \"test-\\(UUID().uuidString)\",\n    merchantTransactionDate: { Date() }\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0815"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutCurrencyInvalidException"]},")."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-session-expired","__idx":26},"children":["Test: Session expired"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create a session."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Wait for the session timeout (typically 2 hours)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Attempt a payout."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Unity API returns session error."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with Unity API error response (not SDK error code)"]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Session expiry is validated by the the the Unity backend, not the iOS SDK. The SDK will forward the API error. We recommend prompting the customer to refresh the session or re-authenticate."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-insufficient-funds-merchant-account","__idx":27},"children":["Test: Insufficient funds (merchant account)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Setup"]},": Configure your sandbox PayPal business account (the payout sender) with $0 balance."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Attempt payout of $100 to recipient."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": PayPal API rejects payout due to insufficient merchant funds."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SDK behaviour"]},": Error forwarded as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0819"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PayoutFailedException"]},")."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onError"]}," callback with error code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK0819"]}," and PayPal error details in message."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This tests your business account balance, not the recipient's balance."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-5-test-webhook-handling-backend-only","__idx":28},"children":["Step 5: Test webhook handling (backend only)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Webhooks are received by your backend server, not the iOS app. This testing is for backend integration. The iOS SDK doesn't interact with webhooks directly. Webhook processing happens entirely on your backend."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you implemented backend webhooks:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-payout-success-webhook","__idx":29},"children":["Test: Payout success webhook"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Execute a payout."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Wait"]},": For webhook delivery (1-5 minutes in sandbox)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check backend"]},": Webhook received."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Event type is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYMENT.PAYOUTS-ITEM.SUCCEEDED"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Signature validation passes."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check"]},": Payout status updated in database."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," Webhook received and processed correctly."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"test-payout-failure-webhook","__idx":30},"children":["Test: Payout failure webhook"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Trigger payout that will fail (e.g., to blocked account)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Wait for webhook."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Event type is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PAYMENT.PAYOUTS-ITEM.FAILED"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check"]},": Error handling logic executes."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expected result:"]}," Failure webhook handled correctly."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simulate-webhooks","__idx":31},"children":["Simulate webhooks"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use PayPal's webhook simulator:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Go to Developer Dashboard > Webhooks."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click on your webhook."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click \"Simulator\"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select event type to simulate."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click \"Send Test\"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-6-test-edge-cases","__idx":32},"children":["Step 6: Test edge cases"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"multiple-sequential-payouts","__idx":33},"children":["Multiple sequential payouts"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Execute payout #1 to recipient1 ($50)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Immediately execute payout #2 to recipient1 ($50)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Both complete successfully."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check balance"]},": $100 total received."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"concurrent-payouts","__idx":34},"children":["Concurrent payouts"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Execute payout to recipient1 ($50)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Simultaneously execute payout to recipient2 ($50)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Both complete successfully."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"network-interruption","__idx":35},"children":["Network interruption"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Start payout process."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Disable network mid-transaction."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verify"]},": Error handling activates."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Check"]},": Transaction not partially completed."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"test-checklist","__idx":36},"children":["Test checklist"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use this checklist to ensure comprehensive testing:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"payout-execution","__idx":37},"children":["Payout execution"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Successful payout (SDK-managed)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Successful payout (backend-managed)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Merchant approval flow"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Merchant rejection"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Invalid payer ID"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Empty payer ID"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Payer ID too long"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Invalid amount"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Negative amount"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Zero amount"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Invalid currency"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Session expired"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"error-handling","__idx":38},"children":["Error handling"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Network errors"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["API errors"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Validation errors"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["User-facing error messages"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Error logging"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"integration","__idx":39},"children":["Integration"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Backend API calls"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Session creation"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Webhook delivery (if implemented)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Webhook signature validation"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"user-experience","__idx":40},"children":["User experience"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Button rendering"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Loading states"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Success messages"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Error messages"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Cancellation flow"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Retry options"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"moving-to-production","__idx":41},"children":["Moving to production"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once all tests pass in sandbox:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-1-update-paypal-credentials","__idx":42},"children":["Step 1: Update PayPal credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Replace sandbox credentials with live credentials:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const config = {\n  paypal: {\n    clientId: process.env.PAYPAL_LIVE_CLIENT_ID,\n    secret: process.env.PAYPAL_LIVE_SECRET,\n    apiBaseUrl: 'https://api-m.paypal.com'\n  }\n};\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-2-update-unity-environment","__idx":43},"children":["Step 2: Update Unity environment"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"let config = CheckoutConfig(\n    environment: .live,  // Switch to live\n    // ...\n)\n","lang":"swift"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const config = {\n  unity: {\n    apiBaseUrl: 'https://api-services.pxp.io',\n    clientId: process.env.UNITY_LIVE_CLIENT_ID,\n    tokenId: process.env.UNITY_LIVE_TOKEN_ID,\n    tokenValue: process.env.UNITY_LIVE_TOKEN_VALUE\n  }\n};\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-3-test-with-small-amounts","__idx":44},"children":["Step 3: Test with small amounts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before full rollout:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Execute test payout of $1.00 to your own PayPal account."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify funds received."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify transaction appears in PayPal reports."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Test refund flow if applicable."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-4-enable-monitoring","__idx":45},"children":["Step 4: Enable monitoring"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Set up error tracking (e.g., Sentry, Datadog)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Configure alerts for payout failures."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Monitor webhook delivery rates."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Track payout completion times."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-5-gradual-rollout","__idx":46},"children":["Step 5: Gradual rollout"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Beta users"]},": Release to small group (5-10%)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Monitor"]},": Watch for errors and user feedback."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Iterate"]},": Fix any issues discovered."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Expand"]},": Gradually increase rollout percentage."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Full release"]},": Roll out to all users."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"troubleshooting","__idx":47},"children":["Troubleshooting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you encounter issues during testing, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/checkout/components/ios/paypal/payouts/troubleshooting"},"children":["Troubleshooting"]}," guide for solutions to common problems including production vs sandbox issues, webhook delivery problems, and SDK error codes."]}]},"headings":[{"value":"Testing","id":"testing","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Before you start","id":"before-you-start","depth":2},{"value":"Step 1: Configure your sandbox environment","id":"step-1-configure-your-sandbox-environment","depth":2},{"value":"Update iOS app configuration","id":"update-ios-app-configuration","depth":3},{"value":"Update backend configuration","id":"update-backend-configuration","depth":3},{"value":"Step 2: Create test accounts","id":"step-2-create-test-accounts","depth":2},{"value":"Create a business account (payout sender)","id":"create-a-business-account-payout-sender","depth":3},{"value":"Create personal accounts (payout recipients)","id":"create-personal-accounts-payout-recipients","depth":3},{"value":"Account 1: Valid recipient","id":"account-1-valid-recipient","depth":4},{"value":"Account 2: Unverified recipient","id":"account-2-unverified-recipient","depth":4},{"value":"Account 3: Limited account","id":"account-3-limited-account","depth":4},{"value":"Access test accounts","id":"access-test-accounts","depth":3},{"value":"Step 3: Test payout execution","id":"step-3-test-payout-execution","depth":2},{"value":"Test scenario: successful payout (SDK-managed)","id":"test-scenario-successful-payout-sdk-managed","depth":3},{"value":"Test scenario: Merchant rejects payout","id":"test-scenario-merchant-rejects-payout","depth":3},{"value":"Test scenario: Successful payout (backend-managed)","id":"test-scenario-successful-payout-backend-managed","depth":3},{"value":"Step 4: Test error scenarios","id":"step-4-test-error-scenarios","depth":2},{"value":"Test: Invalid payer ID format","id":"test-invalid-payer-id-format","depth":3},{"value":"Test: Empty payer ID","id":"test-empty-payer-id","depth":3},{"value":"Test: Payer ID too long","id":"test-payer-id-too-long","depth":3},{"value":"Test: Negative amount","id":"test-negative-amount","depth":3},{"value":"Test: Zero amount","id":"test-zero-amount","depth":3},{"value":"Test: Invalid amount (NaN or infinity)","id":"test-invalid-amount-nan-or-infinity","depth":3},{"value":"Test: Invalid currency code length","id":"test-invalid-currency-code-length","depth":3},{"value":"Test: Invalid currency code format","id":"test-invalid-currency-code-format","depth":3},{"value":"Test: Session expired","id":"test-session-expired","depth":3},{"value":"Test: Insufficient funds (merchant account)","id":"test-insufficient-funds-merchant-account","depth":3},{"value":"Step 5: Test webhook handling (backend only)","id":"step-5-test-webhook-handling-backend-only","depth":2},{"value":"Test: Payout success webhook","id":"test-payout-success-webhook","depth":3},{"value":"Test: Payout failure webhook","id":"test-payout-failure-webhook","depth":3},{"value":"Simulate webhooks","id":"simulate-webhooks","depth":3},{"value":"Step 6: Test edge cases","id":"step-6-test-edge-cases","depth":2},{"value":"Multiple sequential payouts","id":"multiple-sequential-payouts","depth":3},{"value":"Concurrent payouts","id":"concurrent-payouts","depth":3},{"value":"Network interruption","id":"network-interruption","depth":3},{"value":"Test checklist","id":"test-checklist","depth":2},{"value":"Payout execution","id":"payout-execution","depth":3},{"value":"Error handling","id":"error-handling","depth":3},{"value":"Integration","id":"integration","depth":3},{"value":"User experience","id":"user-experience","depth":3},{"value":"Moving to production","id":"moving-to-production","depth":2},{"value":"Step 1: Update PayPal credentials","id":"step-1-update-paypal-credentials","depth":3},{"value":"Step 2: Update Unity environment","id":"step-2-update-unity-environment","depth":3},{"value":"Step 3: Test with small amounts","id":"step-3-test-with-small-amounts","depth":3},{"value":"Step 4: Enable monitoring","id":"step-4-enable-monitoring","depth":3},{"value":"Step 5: Gradual rollout","id":"step-5-gradual-rollout","depth":3},{"value":"Troubleshooting","id":"troubleshooting","depth":2}],"frontmatter":{"seo":{"title":"Testing"}},"lastModified":"2026-05-08T12:23:09.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/checkout/components/ios/paypal/payouts/testing","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}