Web SDK Integration

Learn how to integrate the ReadyRemit iframe into your web application with step-by-step instructions and configuration options.

Step 1: Add the iframe and Integrate ReadyRemit Helper Instance

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- ReadyRemit Helper Instance -->
    <script>
      ((w,d)=>{w.rremit||(w.rremit={sdkUrl:void 0,prevListener:void 0,getIFrame:function(){return d.getElementById("readyremit-iframe")},postMessage:function(m){w.rremit.getIFrame().contentWindow.postMessage(m,w.rremit.sdkUrl)},init:function(payload,onCreateCallback,onUnloadCallback){var iframe=w.rremit.getIFrame(),originAllowed=(w.rremit.sdkUrl=iframe.src,new URL(w.rremit.sdkUrl).origin),initSent=(w.rremit.prevListener&&w.removeEventListener("message",w.rremit.prevListener),!1);w.rremit.prevListener=function(e){if(e.origin===originAllowed){var _a=null==(_a=null==e?void 0:e.data)?void 0:_a.type;switch(_a){case"readyremit-unload-iframe":onUnloadCallback&&onUnloadCallback();break;case"readyremit-create-transfer":onCreateCallback&&onCreateCallback(e.data.payload);break;case"readyremit-ready":initSent||(iframe.style="",w.rremit.postMessage({type:"readyremit-initiate",payload:payload}),initSent=!0)}}},w.addEventListener("message",w.rremit.prevListener)},failed:function(e){w.rremit.postMessage({type:"readyremit-transfer-failed",payload:{error:e.response.data}})},completed:function(transferId){w.rremit.postMessage({type:"readyremit-transfer-completed",payload:{transferId:transferId}})}})})(window,document);
    </script>
    <!-- End ReadyRemit Helper Instance  -->

    <title>ReadyRemit Example</title>
  </head>
  <body>
    <!-- Content of your website -->
    <!-- The iframe's id attribute must be set to "readyremit-iframe" -->
    <iframe 
      id="readyremit-iframe" 
      src="https://sandbox-sdk.readyremit.com"
      allow="clipboard-read; clipboard-write; camera"    
      width="100%" 
      height="100%" 
      style="display: none;"
      title="International & Domestic Transfers"
		></iframe>
    <script>
      const customerId = "<this will be provided by ReadyRemit>";
      const resources = "<encrypted resources, this should be generated in the customer backend>";
      window.rremit.init(
        {
          sdkCore: {
            customerId,
            resources,
          },
          sdkColors: {
            brandPrimary: "#934ae0"
          },
          sdkFeatures: {
            darkMode: true // DEFAULT false
          }
        },
        async (eventPayload) => {
          try {
            // eventPayload: {
            //   language: string; // en-US | es-MX
            //   transfer: {
            //     quoteBy: string;
            //     quoteHistoryId: string;
            //     recipientId: string;
            //     recipientAccountId: string;
            //     fields: [{
            //       id: "VIRTUAL_SENDER_ACCOUNT_ID",
            //       type: "TEXT",
            //       value: string;
            //     }]
            //   };
            // }
            // TODO: 
            // 1. Post the transfer (eventPayload) to your server
            // 2. In your backend, retrieve the quote details using the quoteHistoryId from the eventPayload
            // 3. Post the transfer using the ReadyRemit API with the data from eventPayload + the quote details from step 2
            // The completed TransferId should be returned
            // For more information, see Step 6 in the C2C via SDK guide
            // https://developer.readyremit.com/docs/c2c-via-sdk#step-6-submit-the-transfer
            //
            // Example:
            // let transferResponse = postTransferToServer(event.data.payload, resources)
            // let transferId = transferResponse.transferId;

            // This message back to the iframe with the TransferId will render the confirmation screen
            window.rremit.completed(transferId);
          } catch (error) {
              // The error object should match this structure
              //{
  						//	"response": {
              //    "data": {
              //      "code": 400,
              //      "message": "Insufficient funds"
              //    },
              //  }
              //}
              window.rremit.failed(error);
          }
        }
      );
    </script>
  </body>
</html>

Here's what's happening in the code sample above:

  • Line 6: The ReadyRemit code snippet functions as a helper to facilitate communication between your application and the ReadyRemit SDK loaded in the iframe.

  • Line 15: The iframe that loads the ReadyRemit SDK. The iframe must have an id attribute set to "readyremit-iframe".

  • Line 17: The ReadyRemit iframe URL is defined based on the environment (Sandbox or Production) and matches the URL provided in the script.

  • Line 25: This value will be provided by ReadyRemit technical support during onboarding.

  • Line 26: This is a string containing encrypted resources that should be encrypted in your backend and provided to the frontend to initialize the iframe. Technical support will provide examples of how to encrypt this data and which resources to include.

  • Line 27: Initializes the ReadyRemit iframe. Parameter descriptions can be found in the specification below.

  • Line 40: This is your custom callback function that fires from the iframe when the user completes the transfer flow and wants to submit the transfer. For security purposes, the iframe does not complete the transfer but relies on your server to make the final API call to the ReadyRemit API. For more information, see Step 6 in the C2C via SDK guide. Here you'll receive an eventPayload containing transfer and language data.

  • Line 48: When calling your backend to complete the transfer, you'll also need to send the encrypted resources (Line 26) so your backend can call the ReadyRemit API.

  • Line 52: Once your server completes the transfer with the ReadyRemit API, it will receive a Transfer ID in response. Here, we post a message back to the iframe with the ID of the completed transfer.

  • Line 52: If an error occurs while attempting to post the transfer, your server should return the error without modification (we'll handle it on our end). Here, a message is sent back to the iframe with the error object, allowing it to be handled appropriately.

❗️

Resources/Token Security

In the wrong hands, the ReadyRemit API Access Token generated for the C2C use case can be used to view personal information about your users or create fraudulent transfers. Be sure to encrypt the token in your backend and only send it to the frontend for iframe configuration after encryption.

Step 2: Configuration & Styling

To initialize the ReadyRemit SDK, a message containing a payload is posted to the iframe. The specification for that payload is as follows:

FORM_SUBMISSION Payload

PropertyDescriptionTypeRequired
sdkCoreCore configuration optionsSDKCoreOptionsYes
sdkColorsColor theme customization optionsSDKColorsOptionsNo
sdkFeaturesFeature toggle optionsSDKFeaturesOptionsNo
virtualSenderAccountsVirtual sender account configurationVirtualSenderAccountsNo

SDKCoreOptions

PropertyDescriptionTypeRequiredSupported
resourcesAn encrypted string containing the auth token to connect to the ReadyRemit API. This token should be scoped to the current Sender. For more information, see the Authentication guide.stringYes
idleTimeoutTimeout in milliseconds before the remittance session is canceledintNo
languageLanguage for the remittance transfer flowstringNoen-US | es-MX

SDKColorsOptions

PropertyDescriptionTypeRequiredDefault
backgroundBackground color for the entire remittance flowhexNo#F3F4F6
darkBackgroundDark mode version of the backgroundhexNo#111111
foregroundForeground color for the entire remittance flowhexNo#FFFFFF
darkForegroundDark mode version of the foregroundhexNo#1F1F1F
buttonBackgroundMain background color for all buttonshexNo#934AE0
darkButtonBackgroundDark mode version of buttonBackgroundhexNo#A26FD8
buttonFontColorFont color for buttonshexNo#FFFFFF
darkButtonFontColorDark mode version of the button font colorhexNo#FFFFFF
dangerColor displayed when there's an API errorhexNo#AA220F
darkDangerDark mode version of dangerhexNo#ED7083
dividerColor for horizontal rules separating sectionshexNo#E2E2E2
darkDividerDark mode version of dividerhexNo#313131
iconFill and stroke colors for SVG iconshexNo#444444
darkIconDark mode version of the iconhexNo#7E7E7E
inputLineBorder color for input fieldshexNo#858585
darkInputLineDark mode version of inputLinehexNo#505050
brandPrimaryPrimary brand color for buttons and linkshexNo#934AE0
darkBrandPrimaryDark mode version of brandPrimaryhexNo#A26FD8
textPrimaryPrimary font color for the entire SDKhexNo#0E0F0C
darkTextPrimaryDark mode version of textPrimaryhexNo#E3E3E3
textSecondarySecondary font color for the entire SDKhexNo#454545
darkTextSecondaryDark mode version of textSecondaryhexNo#B0B0B0
successColor for success stateshexNo#008761
darkSuccessDark mode version of successhexNo#008761

SDKFeaturesOptions

PropertyDescriptionTypeRequired
darkModeForces the iframe into dark mode regardless of browser settingsboolNo
confettiEnables a confetti animation when a transaction is submittedboolNo
useUnloadEventEnables the 'unloadEvent' when pressing the back button from the Home screen, causing the iframe to trigger an unload of itself through the parent application. In scenarios where the Web SDK is loaded within a parent application, you may want to use the built-in navigation to return to the host app.boolNo
defaultCountryWhen a valid ISO3 code is provided and the sender has missing fields, the initial "Start a Transfer" screen is auto-filled with that country's code. A quote is automatically fetched, resulting in a filled transfer screen upon load.stringNo

VirtualSenderAccounts

Virtual Sender Accounts provide the web SDK with a list of accounts from which funds will be debited. The web SDK will not initiate any fund transfers or money movement on its own.

When enabled, the SDK displays a dropdown menu showing the accounts and their balances. After a user selects an account, the SDK sends back a reference to that account, allowing you to identify which account to deduct funds from in your system.

Expected Payload for virtualSenderAccounts

The virtualSenderAccounts property expects an array of objects. Each object must match the following schema:

PropertyDescriptionTypeRequired
aliasA user-friendly name for the account (e.g., "Main Checking")stringYes
last4The last four digits of the account number, used to distinguish between accounts with the same aliasnumberYes
balanceThe current balance of the account. The SDK uses this to check if there are sufficient funds for a transfernumberYes
srcProviderIdYour internal reference for the account, which you'll use to perform any necessary money movementstringYes

Handling Money Movement

Since the web SDK doesn't handle money movement, it will include a new field called VIRTUAL_SENDER_ACCOUNT_ID in the fields array within the eventPayload. This field provides the srcProviderId of the selected account, indicating which account needs to be updated or debited on your end.