{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-platform/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Migration Guide","llmstxt":{"title":"Glomopay developer documentation","description":"Cross-border payments APIs, organised by product. Each product section carries both the explanation of its objects and the job-shaped integration guides that set them up.","details":{"content":"How to use these docs:\n\n- Get started is the front door. It carries a routing table from\n  \"what are you building\" to the page that builds it, plus how to get\n  API keys.\n- The product sections - Payin, Payout, Multi-currency accounts,\n  Verification, Request for Information (RFI) - each hold two kinds of page.\n  Pages titled as a noun (\"Subscriptions\", \"Bank Transfer\") explain what\n  an object is. Pages titled as a job (\"Set up recurring subscriptions\",\n  \"Collect LRS remittances from India\") are complete integration flows\n  and live one level under the object they set up. Match a user's goal\n  against the job-shaped titles first.\n- Reports and Identity and Access Management are the two subjects with no\n  API counterpart. There are no endpoints for reports, users, roles or\n  invites; both pages document the merchant dashboard. A dashboard\n  procedure for something the API also does (a refund, a payout) is NOT\n  here - it stays in the product that owns it.\n- API reference is generated from OpenAPI and carries endpoint detail.\n- The OpenAPI description itself is published as a single self-contained\n  document at /openapi.yaml, and the same document as JSON at\n  /openapi.json. Every $ref is resolved into it, so one fetch is the\n  whole contract: 61 paths, 81 operations, 68 schemas - the same\n  endpoints the API reference pages render. Fetch that instead of\n  reading the 129 pages under /api-reference/.\n- Developer resources covers what every integration touches and no single\n  product owns: auth, errors, pagination, rate limits, webhooks,\n  versioning, supported countries, quotes, and the client SDKs.\n"},"sections":[{"title":"Get started","description":"The front door. The routing table from a merchant's goal to the flow that delivers it, how to obtain API keys, and the platform glossary.","includeFiles":["**/get-started/**"]},{"title":"Payin","description":"Collecting money: customers, orders, checkout, payment links, payment methods (cards, bank transfer, pay via bank), refunds, disputes, purpose codes, fee models, custom fields, subscriptions, and resident India remittance under LRS. Includes the flows that set each up - bank transfers, subscriptions, LRS remittances, and server-to-server card payments.","includeFiles":["**/payin/**"]},{"title":"Payout","description":"Sending money: the payout life cycle, queued payouts, creating and cancelling a payout, rails, beneficiaries, purpose codes, and the action required state.","includeFiles":["**/payout/**"]},{"title":"Multi-currency accounts","description":"Holding money: balances, balance conversion, adding balance, withdrawing balance, and the settlement holiday calendar - the Indian and US bank and FX holidays on which settlement to the merchant's bank account, and money movement generally, is affected.","includeFiles":["**/multi-currency-account/**"]},{"title":"Verification","description":"Proving who someone is and that an account is theirs: KYC, bank account validation, and third-party verification (TPV) with the flow that verifies a payer's bank account.","includeFiles":["**/verification/**"]},{"title":"Request for Information (RFI)","description":"Responding to a compliance request for information, per object - payment link, order, payment, payout - plus compliance reviews and RFIs raised on already-successful payments.","includeFiles":["**/request-for-information/**"]},{"title":"Reports","description":"The downloadable and scheduled reports a merchant pulls from the dashboard for reconciliation, compliance and treasury: payment, subscription, settlement breakup, balance statement and KYC reports, plus scheduling one for recurring email delivery. Dashboard only - there is no reports API.","includeFiles":["**/reports/**"]},{"title":"Identity and Access Management","description":"Administering who can use a merchant account: one set of credentials across multiple MIDs, switching between them without logging out, the Admin / Member / Sales Partner roles and what each may see and do, and inviting a new member. Dashboard only - there is no users, roles or invites API.","includeFiles":["**/access-management/**"]},{"title":"API reference","description":"Endpoint reference generated from the Glomopay OpenAPI description.","includeFiles":["**/api-reference/**"]},{"title":"Developer resources","description":"What every integration touches and no single product owns: auth, errors, pagination, rate limits, webhooks, versioning, API validations, security, supported countries, quotes, and the client SDKs - React Native, Flutter, Android and the Unified Web SDK, with per-version references and changelogs. Reports and Identity and Access Management used to be listed here and are now their own sections.","includeFiles":["**/platform/**"]}]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"migration-guide","__idx":0},"children":["Migration Guide"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#v1-to-v4"},"children":["v1 to v4"]}," - for merchants currently using v1"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#v3-to-v4"},"children":["v3 to v4"]}," - for merchants currently using v3"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#v1-to-v3"},"children":["v1 to v3"]}," - historical reference"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"v1-to-v4","__idx":1},"children":["v1 to v4"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["v4 replaces the LRS-only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckout"]}," with a unified ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckout"]}," that auto-detects order type (LRS, Standard, or Subscriptions) and provides a single ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," callback for all asynchronous payment flows."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the complete v4 API reference, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v4"},"children":["React Native SDK v4 documentation"]},"."," ","For the full list of changes, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/changelog"},"children":["Changelog"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"renamed-exports","__idx":2},"children":["Renamed Exports"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v1"},"children":["v1"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v4"},"children":["v4"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckout"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckout"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckoutRef"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckoutRef"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckoutProps"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckoutProps"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckoutPayload"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckoutPayload"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsServer"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoServer"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LrsCheckoutStatus"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutStatus"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["useLrsCheckout"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["useGlomoCheckout"]}," (deprecated - use component ref instead)"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking-changes","__idx":3},"children":["Breaking Changes"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["start()"]}," is now async"]}," - returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Promise<boolean>"]}," instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boolean"]},". Update call sites to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["await ref.current?.start()"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Asynchronous payment callbacks"]}," - v4 uses a single ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," callback with an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ASYNC_PAYMENT_EVENTS"]}," enum instead of separate per-flow callbacks. (These callbacks did not exist in v1, so no migration needed - just be aware of the v4 API when adding them.)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["New statuses"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detecting_order_type"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_transfer_submitted"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pay_via_bank_completed"]}," are additions to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutStatus"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSdkError"]}," is now required"]}," - was optional in v1. Must be provided in v4 to surface validation errors, device compliance failures, and configuration issues."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"before--after","__idx":4},"children":["Before / After"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["v1:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"import { GlomoLrsCheckout, type GlomoLrsCheckoutRef } from \"@glomopay/react-native-sdk\";\n\nconst ref = useRef<GlomoLrsCheckoutRef>(null);\nconst started = ref.current?.start(); // boolean\n","lang":"tsx"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["v4:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"import {\n  GlomoCheckout,\n  ASYNC_PAYMENT_EVENTS,\n  type GlomoCheckoutRef,\n} from \"@glomopay/react-native-sdk\";\n\nconst ref = useRef<GlomoCheckoutRef>(null);\nconst started = await ref.current?.start(); // Promise<boolean>\n\n// In your component JSX:\n<GlomoCheckout\n  ref={ref}\n  publicKey=\"live_pk_abc123\"\n  orderId=\"order_xyz789\"\n  onPaymentSuccess={(payload) => console.log(\"Success:\", payload.paymentId)}\n  onPaymentFailure={(payload) => console.log(\"Failed:\", payload.paymentId)}\n  onUserJourneyCompleted={(payload) => {\n    switch (payload.journeyType) {\n      case ASYNC_PAYMENT_EVENTS.BANK_TRANSFER_SUBMITTED:\n        console.log(\"Transfer ref:\", payload.transactionReference);\n        break;\n      case ASYNC_PAYMENT_EVENTS.PAY_VIA_BANK_COMPLETED:\n        console.log(\"Pay via bank:\", payload.status);\n        break;\n    }\n  }}\n/>\n","lang":"tsx"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"platform-configuration","__idx":5},"children":["Platform Configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Checkout flows with camera-based bank authentication require native permissions:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Android"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AndroidManifest.xml"]},"): ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<uses-permission android:name=\"android.permission.CAMERA\" />"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["iOS"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Info.plist"]},"): ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NSCameraUsageDescription"]}," key"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These are only required for flows that use camera-based bank authentication."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"new-in-v4-no-v1-equivalent","__idx":6},"children":["New in v4 (no v1 equivalent)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Subscriptions checkout"]}," - pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriptionId"]}," instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["orderId"]},". See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v4#subscriptions-checkout"},"children":["Subscriptions Checkout"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Asynchronous payment flows"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," callback with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ASYNC_PAYMENT_EVENTS"]}," enum. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v4#asynchronous-payment-flows"},"children":["Asynchronous Payment Flows"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Camera permissions handling"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserRefusedCameraPermissions"]}," callback. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v4#camera-permissions"},"children":["Camera Permissions"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Order type auto-detection"]}," - the SDK determines the checkout flow automatically. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detecting_order_type"]}," status is emitted during detection."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Mock mode extended"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mock_"]}," prefix keys now supported in addition to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["test_"]},"."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"v3-to-v4","__idx":7},"children":["v3 to v4"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["v4 consolidates the asynchronous payment flow callbacks into a single generic callback."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the full list of changes, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/changelog"},"children":["Changelog"]},"."," ","For the complete v4 API reference, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v4"},"children":["React Native SDK v4 documentation"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"removed-callbacks","__idx":8},"children":["Removed Callbacks"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v3"},"children":["v3"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v4"},"children":["v4"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBankTransferSubmitted"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journeyType: ASYNC_PAYMENT_EVENTS.BANK_TRANSFER_SUBMITTED"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPayViaBankCompleted"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journeyType: ASYNC_PAYMENT_EVENTS.PAY_VIA_BANK_COMPLETED"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPayViaBankBankConnectionSuccessful"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Removed (no replacement)"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"removed-types","__idx":9},"children":["Removed Types"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v3"},"children":["v3"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v4"},"children":["v4"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoBankTransferPayload"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoUserJourneyCompletedPayload"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoPayViaBankConnectionPayload"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Removed"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"new-types","__idx":10},"children":["New Types"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Purpose"},"children":["Purpose"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ASYNC_PAYMENT_EVENTS"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enum of asynchronous payment event types"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoUserJourneyCompletedPayload"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Payload for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserJourneyCompleted"]}," callback"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"onsdkerror-is-now-required","__idx":11},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSdkError"]}," is now required"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onSdkError"]}," was optional in v3. In v4 it is required. If you were not passing it, add it:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"onSdkError={(errors) => {\n  errors.forEach((e) => console.error(e.type, e.message, e.field));\n}}\n","lang":"tsx"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"unchanged","__idx":12},"children":["Unchanged"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutStatus"]}," values ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_transfer_submitted"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pay_via_bank_completed"]}," remain unchanged. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getStatus()"]}," continues to return granular status values."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"before--after-1","__idx":13},"children":["Before / After"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["v3:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"<GlomoCheckout\n  onBankTransferSubmitted={(payload) => {\n    console.log(\"Transfer ref:\", payload?.transactionReference);\n  }}\n  onPayViaBankCompleted={(payload) => {\n    console.log(\"Pay via bank:\", payload.status);\n  }}\n  onPayViaBankBankConnectionSuccessful={(payload) => {\n    console.log(\"Bank connected:\", payload?.bankName);\n  }}\n  // ...other props\n/>\n","lang":"tsx"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["v4:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"import { ASYNC_PAYMENT_EVENTS } from \"@glomopay/react-native-sdk\";\n\n<GlomoCheckout\n  onUserJourneyCompleted={(payload) => {\n    switch (payload.journeyType) {\n      case ASYNC_PAYMENT_EVENTS.BANK_TRANSFER_SUBMITTED:\n        console.log(\"Transfer ref:\", payload.transactionReference);\n        break;\n      case ASYNC_PAYMENT_EVENTS.PAY_VIA_BANK_COMPLETED:\n        console.log(\"Pay via bank:\", payload.status);\n        break;\n    }\n  }}\n  // ...other props\n/>\n","lang":"tsx"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"v1-to-v3","__idx":14},"children":["v1 to v3"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["v3 replaces the LRS-only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckout"]}," with a unified ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckout"]}," that auto-detects order type (LRS, Standard, or Subscriptions)."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the complete v3 API reference, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v3"},"children":["React Native SDK v3 documentation"]},"."," ","For the full list of changes, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/changelog"},"children":["Changelog"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"renamed-exports-1","__idx":15},"children":["Renamed Exports"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v1"},"children":["v1"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"v3"},"children":["v3"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckout"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckout"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckoutRef"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckoutRef"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckoutProps"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckoutProps"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsCheckoutPayload"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoCheckoutPayload"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoLrsServer"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GlomoServer"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LrsCheckoutStatus"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutStatus"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["useLrsCheckout"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["useGlomoCheckout"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking-changes-1","__idx":16},"children":["Breaking Changes"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["start()"]}," is now async"]},": Returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Promise<boolean>"]}," instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["boolean"]},". Update call sites to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["await ref.current?.start()"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["New statuses"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bank_transfer_submitted"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pay_via_bank_completed"]}," are new additions to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CheckoutStatus"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["New callbacks"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBankTransferSubmitted"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPayViaBankCompleted"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPayViaBankBankConnectionSuccessful"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserRefusedCameraPermissions"]}," are available."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"before--after-2","__idx":17},"children":["Before / After"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["v1:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"import { GlomoLrsCheckout, type GlomoLrsCheckoutRef } from \"@glomopay/react-native-sdk\";\n\nconst ref = useRef<GlomoLrsCheckoutRef>(null);\nconst started = ref.current?.start(); // boolean\n","lang":"tsx"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["v3:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"tsx","header":{"controls":{"copy":{}}},"source":"import { GlomoCheckout, type GlomoCheckoutRef } from \"@glomopay/react-native-sdk\";\n\nconst ref = useRef<GlomoCheckoutRef>(null);\nconst started = await ref.current?.start(); // Promise<boolean>\n","lang":"tsx"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"platform-configuration-new-in-v3","__idx":18},"children":["Platform Configuration (New in v3)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Checkout flows with camera-based bank authentication require native permissions:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Android"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AndroidManifest.xml"]},"): ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<uses-permission android:name=\"android.permission.CAMERA\" />"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["iOS"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Info.plist"]},"): ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NSCameraUsageDescription"]}," key"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These are only required for flows that use camera-based bank authentication."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the full changelog, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/changelog"},"children":["Changelog"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"new-in-v3","__idx":19},"children":["New in v3"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following features are new in v3 and have no v1 equivalent. No migration is needed for these - they are additive."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Subscriptions checkout"]}," - pass ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subscriptionId"]}," instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["orderId"]}," to process subscription payments. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v3#subscriptions-checkout"},"children":["Subscriptions Checkout"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Bank transfer support"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onBankTransferSubmitted"]}," callback for bank transfer flows. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v3#bank-transfer-support"},"children":["Bank Transfer Support"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pay via bank support"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPayViaBankCompleted"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onPayViaBankBankConnectionSuccessful"]}," callbacks. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v3#pay-via-bank-support"},"children":["Pay via Bank Support"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Camera permissions handling"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["onUserRefusedCameraPermissions"]}," callback. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v3#camera-permissions"},"children":["Camera Permissions"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Order type auto-detection"]}," - the SDK determines the checkout flow automatically. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["detecting_order_type"]}," status is emitted during detection."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Mock mode extended"]}," - ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mock_"]}," prefix keys now supported in addition to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["test_"]},"."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related","__idx":20},"children":["Related"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v4"},"children":["React Native SDK v4 documentation"]}," - complete v4 API reference"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v3"},"children":["React Native SDK v3 documentation (Archived)"]}," - v3 API reference"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/changelog"},"children":["Changelog"]}," - all release notes"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/platform/sdk/react-native-sdk/v1"},"children":["React Native SDK v1 (Archived)"]}," - legacy version documentation"]}]}]},"headings":[{"value":"Migration Guide","id":"migration-guide","depth":1},{"value":"v1 to v4","id":"v1-to-v4","depth":2},{"value":"Renamed Exports","id":"renamed-exports","depth":3},{"value":"Breaking Changes","id":"breaking-changes","depth":3},{"value":"Before / After","id":"before--after","depth":3},{"value":"Platform Configuration","id":"platform-configuration","depth":3},{"value":"New in v4 (no v1 equivalent)","id":"new-in-v4-no-v1-equivalent","depth":3},{"value":"v3 to v4","id":"v3-to-v4","depth":2},{"value":"Removed Callbacks","id":"removed-callbacks","depth":3},{"value":"Removed Types","id":"removed-types","depth":3},{"value":"New Types","id":"new-types","depth":3},{"value":"onSdkError is now required","id":"onsdkerror-is-now-required","depth":3},{"value":"Unchanged","id":"unchanged","depth":3},{"value":"Before / After","id":"before--after-1","depth":3},{"value":"v1 to v3","id":"v1-to-v3","depth":2},{"value":"Renamed Exports","id":"renamed-exports-1","depth":3},{"value":"Breaking Changes","id":"breaking-changes-1","depth":3},{"value":"Before / After","id":"before--after-2","depth":3},{"value":"Platform Configuration (New in v3)","id":"platform-configuration-new-in-v3","depth":3},{"value":"New in v3","id":"new-in-v3","depth":3},{"value":"Related","id":"related","depth":2}],"frontmatter":{"title":"React Native SDK Migration Guide","seo":{"title":"Migration Guide"}},"lastModified":"2026-09-22T05:15:29.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/platform/sdk/react-native-sdk/migration","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}