For the complete documentation index, see llms.txt. This page is also available as Markdown.

React Native

Welcome to the Debt Relief React Native SDK Integration Guide

This guide walks you through the process of integrating the Debt Relief SDK into your React Native application. By using this SDK, you can easily connect to Engine by MoneyLion’s financial network, authenticate with the Engine API, and give your users access to personalized Debt Relief offers.

Setup Instructions

Step 1: Request an API token

Before you can use the Debt Relief Engine SDK, you’ll need to request a new API token from your Partner Manager. This is used to authenticate with the Engine API and provides access to different financial institutions. You may want to use multiple API tokens depending on how many entry points your app has into the SDK.

Step 2: Software Requirements

Platform Requirements

  • React Native >= 0.71.0

  • Node JS >= 18

  • React >= 18.0.0

Peer Dependencies

Please note that react, react-native and @react-native-async-storage/async-storage are peer dependencies, meaning that you should ensure they are installed before installing the SDK.

Package Size:

  • SDK Bundle Size: 1.99 MB (unpacked)

Step 3: Install the SDK

Install the SDK using your preferred package manager:

  • npm: npm i @moneylion/react-native-debt-relief-sdk @react-native-async-storage/async-storage

  • Yarn: yarn add @moneylion/react-native-debt-relief-sdk @react-native-async-storage/async-storage

  • pnpm: pnpm add @moneylion/react-native-debt-relief-sdk @react-native-async-storage/async-storage

Step 4: Initialize the SDK

There are certain fields that must be provided to the Engine SDK component on initialization:

  • Bearer token

  • Required prefilled data (the Engine SDK does not ask for these 3 fields):

  • First name

  • Last name

  • Email address

Lead IP Address is captured automatically by the SDK from the user's device; you do not need to pass this field in your integration.

You can import the EngineSDK component into your app. At a minimum, you must provide the API token obtained in Step 1 (requesting a token from your Partner Manager) via the bearerToken prop, and pass the user's first name, last name, and email, as the Engine SDK does not request these three fields. For the full list of supported props, please refer to the EngineSDK Props section.

Here is a sample code snippet of how you might implement the Engine SDK into your app:

Adding Client Tags for Reporting

The Engine Mobile SDK supports adding your unique Client Tags to track performance of specific campaigns or users. All Client Tag data is attributed to the lead level.

Client Tags can be added by including a clientTags attribute at the top level of the request body, where the value is an array of strings. We strongly recommend only including one element per array for ease of reporting/attribution - if you want two separate tags, include the second tag under a different key. There is no limit to the number of keys in the clientTags object.

Example

Here is a sample code snippet of how you might implement the Mobile SDK into your app, with sample clientTags appended:

See our GET Lead Client Tags endpoint for information on attributing lead analytics to your own client tags, if you decide to hit our Analytics API for reporting.

Supported Client Tag Keys

If you plan for the Engine team to set up reporting (i.e. you do not plan to hit our Analytics API), these are the only keys that are currently fully supported. If a different key is needed, please reach out to your partner manager - we may be able to accommodate, but adding nonstandard keys will increase the time it takes Engine to report Client Tag values back to you, and is therefore not recommended.

  • agentId

  • campaignId

  • clientId

  • deviceid

  • medium

  • sourceId

  • subid

  • subid1

  • subid2

  • subid3

  • target

  • trafficsource

  • userid

Prefilling Lead Data

The prefilledData object should be structured with any fields you want the user not to have to answer themselves, if you already have that info available. Here is an example of prefilledData as a Javascript Object. You may prefill as many of these fields as desired; the only 3 required are firstName, lastName, and email.

Prefilled values cannot be edited by the user on the final confirm-details screen (before submitting the form). If the user's info is incorrect (e.g. Address is incorrect outdated), the user should edit the info in your app directly.

Example React Native Implementation

Here is a sample code snippet of how you might implement the Mobile SDK into your app, with all prefilledData fields populated:

For any of these fields, DO NOT prefill any fields that are empty or otherwise unavailable. If you do not have info for a particular field available to prefill, omit that field in your prefilledDataobject.

For example, this is incorrect:

This is correct:

PrefilledData Type Validations

The data should follow a type schema, described here in Typescript notation:

Enums/Accepted Values for Certain Fields

Certain fields, although strings, must be within a predetermined list of accepted values. Here are those values:

PrefilledData Sanitization

Prefilled Data must align with the type validations above, and any fields with an accepted value enum must be within that enum. If you (the partner) prefill user data, and any type/value is invalid, that attribute will be stripped, and the lead will have to enter it again manually.

UI Customization

You can customize the branding by changing the primary and secondary colors to match your own brand. use the ‘primaryColor’ and ‘secondaryColor’ attributes to accomplish this.

Event Handlers

The Engine Mobile SDK has real-time Event Handlers so you can track lead progression through the flow in real time (accessing lead data and notifications when leads progress through each step of the SDK, up to and including offer click).

Implementation

There are 11 Event Handlers you can implement that will be called as a user progresses through the SDK flow. Here is a screenshot of a sample code snippet of how you might implement the Mobile SDK into your app, with all 11 implemented (you can choose any or all of these to implement):

For your convenience, the same code snippet is pasted below as text, so you can copy-paste the bulk of the code. Please wrap the following snippet in a self closing `<` and `/>`, following the screenshot above (the text below omits the wrapping `</>` so as not to trigger a CSS attack warning on this page)

{ your handler logic } is a placeholder for any function you actually want to execute when that handler is called. Channel Partners typically use Event Handlers to call their own endpoints when leads hit specific funnel stages, for tracking, retargeting, or other purposes.

Each handler takes a structure object as an argument. Feel free to choose whichever arguments are useful to include in your handler logic, and omit the rest.

Descriptions

Below are descriptions of the various event handlers and the data each one has access to when it fires. All event handlers have access to timestamp, which is a string representation of the moment (in UTC) the handler was called.

  1. onInitialize is called when the SDK is initialized, after any data saved to local storage has been loaded. The saved data is supplied to the handler. onInitialize has access to the savedLeadUuid and savedLeadData, if the user's data was stored on the device from a previous session.

    All page names provided to the handlers, such as page, nextPage, and editingPage, will be in snake_case format.

    *Note: PrefilledLeadData here here and for the rest of this page indicates the data type, i.e. what fields/data formats might be present. This will include all fields set on the lead at that point, regardless of whether the data was initially prefilled, or later submitted by the user.

  2. onCreate is called when the SDK first creates a lead with the Engine service. The data used to create the lead is supplied along with the current page and the page the user is editing, if any.

  3. onUpdate is called whenever the SDK updates a lead with the Engine service. It receives the same data that the onCreate handler receives.

  4. onNavigate is called whenever the user navigates to a new page. It receives the current lead data, the current page, the next page, and the page the user is editing if any.

  5. onSubmit is called when the user submits their information to the Engine service and receives offers. The submitted data is supplied to the handler.

    s

  6. onRateTableRender is called when the user submits their information to the Engine service and receives offers. The submitted data is supplied to the handler.

  7. onOfferClick is called when the user submits their information to the Engine service and receives offers. The submitted data is supplied to the handler.

  8. onErrorPageView is called when the user is driven to the Error page ("Something Went Wrong"). This alerts you to when there may be an issue with Engine's servers, and when your users are not able to complete their application and submit for offers successfully.

  9. onErrorPageRetry is called when the user taps "Retry" on the error page. This informs you when the user attempts to retry on the previous page.

  10. onExit is called when the user attempts to exit the SDK flow. It is important to supply this handler in order to understand when the user exited the SDK and retarget the user to complete the flow.

  11. OnError is called when an error occurs during SDK operations. You may use this to log errors to your error tracking service or implement custom error handling logic.

    additionalInfo contains additional information that is relevant to the error that occured. Some examples of what information it could contain: • leadData (Record<string, unknown>) - The lead data object at the time of error • leadUuid (string) - The lead UUID

    page (string) - The current page where the error occurred

    productTypes (string) - Product types being processed

    clientTags (Record<string, string[]> - Client tags

    rateTableUuid (string) - Rate table UUID

All page names provided to the handlers, such as page, nextPage, and editingPage, will be in snake_case format.

Example Event Handler Calls

Scenario 1: No user info is prefilled

1. onInitialize

When the user first enters the SDK and reaches the splash page:

onInitialize fires with:

onInitialize({ timestamp, storedLeadUuid,storedLeadData })

*Note: unless a lead has already begun, exited, and re-entered the SDK, storedLeadUuid and storedLeadData will be null. If the user re-enters the SDK after a previous session where a leadUuid was created and leadData was stored in local storage on their device, the handler will fire with those values.

2. onNavigate and onCreate

When the user navigates to the following screen (which differs depending how much user info is prefilled), onNavigate and onCreate will fire. For example, if no info is prefilled, the user will navigate away from the splash screen, where onNavigate fires:

onNavigate({ timestamp, leadUuid, leadData, currentPage, nextPage })

Values will be as follows:

  • leadUuid: null (unless the user returned from a previous session, where the leadUuid was stored in local storage)

  • leadData: any user info prefilled, e.g. {firstName: "Bob", lastName: "Dylan", email: "[email protected]", {...other prefilled data, if provided}}

  • currentPage: splash

  • nextPage: loan_amount

onCreate({ timestamp, leadUuid, leadData, createPage })

Values will be as follows:

The user will then navigate into the loan_amount screen (again, assuming loanAmount is not prefilled):

When the user presses Continue, onNavigate will fire:

onNavigate({ timestamp, leadUuid, leadData, currentPage, nextPage })

Values will be as follows:

  • leadUuid: {the lead's UUID as a string}

  • leadData: {"firstName":"Bob","lastName":"Dylan","email":"[email protected]","ipAddress":"x.x.x.x"}

  • currentPage: loan_amount

  • nextPage: loan_purpose

The lead is also updated at this point, so onUpdate fires:

onUpdate({ timestamp, leadUuid, leadData, page })

Values will be as follows:

  • leadUuid: {the lead's UUID as a string}

  • leadData: {"firstName":"Bob","lastName":"Dylan","email":"[email protected]","ipAddress":"x.x.x.x","loanAmount":5000}

  • page: loan_amount

3. Subsequent onNavigate and onUpdate calls

onNavigate and onUpdate will fire at each user navigation, with the leadData object growing as fields are updated onto the lead. currentPage / nextPage values are as follows:

  • loan_purpose

  • date_of_birth

  • address

  • phone

  • credit_rating

  • property_status

  • education_level

  • employment_status

  • annual_income

  • ssn

  • confirm_details

  • offers

4. onSubmit

When the user presses See my offers on the confirm_details screen:

The Event Handlers that fire are:

onSubmit({ timestamp, leadUuid, leadData })

onNavigate({ timestamp, leadUuid, leadData, currentPage, nextPage })

onUpdate({ timestamp, leadUuid, leadData, page })

  • currentPage and page here will = confirm_details

  • nextPage will = offers

5. onRateTableRender

When the user lands on the offer page, onRateTableRender fires with a rateTableUuid, a leadUuid, and two arrays: loanOffers and specialOffers

rateTableUuid

This is associated with that application from that lead. Useful to identify and map with the leadUuid.

loanOffers

This is an array of objects. Each object will have the following attributes:

  • offerUuid

  • financialInstitutionName

  • financialInstitutionUuid

  • productType

  • productSubType

  • loanAmount

  • apr

  • termLength

  • monthlyPayment

specialOffers

This is an array of objects. Each object has the following attributes:

  • offerUuid

  • name

  • financialInstitutionName

  • financialInstitutionUuid

  • productSubType

  1. onOfferClick

onOfferClick fires when a lead clicks on an offer from the offer table. The financialInstitutionName , productType, and productSubType will indicate whether the user clicked a loan offer or special offer.

Scenario 2: Some (but not all) user info is prefilled

When some user info is prefilled, the first onNavigate fire away from the splash screen will have:

  • currentPage=splash

  • nextPage={the first page in the flow that was not prefilled}

The rest of the flow will be the same as Scenario 1 above.

Scenario 3: All user info is prefilled

When some user info is prefilled, the first onNavigate fire on the first navigation away from the splash screen will have:

  • currentPage=splash

  • nextPage=confirm_details

onCreate will also fire at this point, since this is when the leadUuid is created by posting the lead to the Engine API.

The user will submit by pressing See my offers, and onSubmit, onNavigate, and onUpdate will function the same as in Scenario 1.

Note: onUpdate will still fire when the user presses See my offers on the confirm_details screen because this is when legal consents are accepted / set to the lead object.

onExit - wherever a user exits the flow

onExit will fire whenever a user leaves the Engine Mobile SDK, regardless of where in the flow the user left the flow. You can use this to infer whether a lead completed / submitted the loan form, depending what other Event Handler callbacks have fired (assuming you set those up as well). More details in the next section:

onError - when an error occur

For example, if the SDK API call to synchronize a lead fails, the onError callback is invoked with these props

How to use Event Handlers for Tracking

Event handlers can be used to track how far a lead progressed in the flow, i.e. if your Event Handler callbacks fire an onExit but do not fire an onSubmit, and/or if your onNavigate handlers never fire with nextPage=offers, you can infer that the lead exited the flow before submitting to see offers. This allows you to retarget the lead accordingly to entice them to complete the form and see their offers.

Similarly, if your Event Handler fires indicate the lead submitted the form (i.e. onSubmit fires and/or onNavigate fires with nextPage=offers, but you do not receive reporting/notifications that the lead converted on a loan or other product, you may retarget the lead to entice them to re-enter the SDK, immediately see their offers (since on re-entry the user will be directed straight to the offers screen, and ideally convert on an available offer. See Reporting Options for Channel Partners for your available options for receiving conversion reporting from Engine by MoneyLion.

EngineSDK Props

Name

Type

Default

Description

endpoint

string

Optional custom API endpoint. If not provided, the SDK will use https://api.engine.tech by default

bearerToken

string

Required

The API token obtained from Partner Manager. Used to authenticate requests to the Engine API.

prefilledData

Required: firstName, lastName, email

User information to prepopulate the Debt Relief flow. See the Prefilled Data section for details.

primaryColor

string (RGBA hex)

-

Primary theme color for the SDK UI (e.g., #FF0000FF).

secondaryColor

string (RGBA hex)

-

Secondary theme color for the SDK UI.

clientTags

-

Optional tags used for tracking performance of specific campaigns or users. See the ClientTags section for details.

onInitialize

(props) => void

-

Triggered when the SDK initializes. See the Events page.

onCreate

(props) => void

-

Called after a lead is created. See the Events page.

onUpdate

(props) => void

-

Called when a lead is updated. See the Events page.

onNavigate

(props) => void

-

Fired when the user navigates between SDK screens. See the Events page.

onSubmit

(props) => void

-

Fired when the user submits their information. See the Events page.

onRateTableRender

(props) => void

-

Called when the user submits their information to the Engine service and receives offers. See the Events Page

onOfferClick

(props) => void

-

Fired when a user clicks an offer. See the Events page.

onErrorPageView

(props) => void

-

Triggered when the user is driven to the Error page. See the Events page.

onErrorPageRetry

(props) => void

-

Trigger when the user taps “Retry” on the error page. See the Events page.

onError

(props) => void

-

Fired when an error occurs during SDK operations. See the Events page.

onExit

(props) => void

-

Fired when the user attempts to exit the SDK flow. See the Events page.

Changelog

View the full React Native Debt Relief SDK changelog

2.1.0 (2026-07-21)

  • Upgraded build tooling to support latest React Native features and improvements

  • Added loading state to button group component for better user feedback during async operations

2.0.0 (2026-07-07)

  • Replaced deprecated React Native SafeAreaView usage with react-native-safe-area-context to align with the current React Native recommendations and improve compatibility

1.3.0 (2026-06-23)

  • Fixed modal animation and safe area handling for improved UI behavior

  • Added react-native-safe-area-context as a required peer dependency

1.2.0 (2026-04-21)

  • Improved SSN handling by masking sensitive values for enhanced user privacy and security

  • Improved type definitions

1.1.1 (31 Mar 2026)

  • Renamed consentsToSms field to phoneConsent in lead creation data

  • Renamed consentsToSms field to phoneConsent in offer catalog lead creation data

1.1.0 (25 Mar 2026)

  • Fixed a potential infinite loop in masked input fields (address, date of birth, phone, SSN)

    • Inputs no longer re-trigger updates when value is set externally

  • Improved prop handling in form input components to prevent unnecessary re-renders

  • Moved react-native-svg to peer dependencies (required version: >=15.11.0 <16)

Last updated

Was this helpful?