diff --git a/package-lock.json b/package-lock.json
index 11a5ee7f2e5..0490c1c6eb3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -161,6 +161,7 @@
         "@testing-library/jest-native": "5.4.1",
         "@testing-library/react-native": "11.5.1",
         "@trivago/prettier-plugin-sort-imports": "^4.2.0",
+        "@types/canvas-size": "^1.2.2",
         "@types/concurrently": "^7.0.0",
         "@types/jest": "^29.5.2",
         "@types/jest-when": "^3.5.2",
@@ -20916,6 +20917,12 @@
         "@types/responselike": "^1.0.0"
       }
     },
+    "node_modules/@types/canvas-size": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/canvas-size/-/canvas-size-1.2.2.tgz",
+      "integrity": "sha512-yuTXFWC4tHV3lt5ZtbIP9VeeMNbDYm5mPyqaQnaMuSSx2mjsfZGXMNmHTnfdsR5qZdB6dtbaV5IP2PKv79vmKg==",
+      "dev": true
+    },
     "node_modules/@types/concurrently": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/@types/concurrently/-/concurrently-7.0.0.tgz",
@@ -71204,6 +71211,12 @@
         "@types/responselike": "^1.0.0"
       }
     },
+    "@types/canvas-size": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/canvas-size/-/canvas-size-1.2.2.tgz",
+      "integrity": "sha512-yuTXFWC4tHV3lt5ZtbIP9VeeMNbDYm5mPyqaQnaMuSSx2mjsfZGXMNmHTnfdsR5qZdB6dtbaV5IP2PKv79vmKg==",
+      "dev": true
+    },
     "@types/concurrently": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/@types/concurrently/-/concurrently-7.0.0.tgz",
diff --git a/package.json b/package.json
index d7bc53713f2..b3809fa7e41 100644
--- a/package.json
+++ b/package.json
@@ -209,6 +209,7 @@
     "@testing-library/jest-native": "5.4.1",
     "@testing-library/react-native": "11.5.1",
     "@trivago/prettier-plugin-sort-imports": "^4.2.0",
+    "@types/canvas-size": "^1.2.2",
     "@types/concurrently": "^7.0.0",
     "@types/jest": "^29.5.2",
     "@types/jest-when": "^3.5.2",
diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts
index 89ddbdc0688..98e3856f454 100755
--- a/src/ONYXKEYS.ts
+++ b/src/ONYXKEYS.ts
@@ -458,6 +458,7 @@ type OnyxValues = {
     [ONYXKEYS.COLLECTION.REPORT_USER_IS_LEAVING_ROOM]: boolean;
     [ONYXKEYS.COLLECTION.SECURITY_GROUP]: OnyxTypes.SecurityGroup;
     [ONYXKEYS.COLLECTION.TRANSACTION]: OnyxTypes.Transaction;
+    [ONYXKEYS.COLLECTION.TRANSACTION_DRAFT]: OnyxTypes.Transaction;
     [ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_TAGS]: OnyxTypes.RecentlyUsedTags;
     [ONYXKEYS.COLLECTION.SELECTED_TAB]: string;
     [ONYXKEYS.COLLECTION.PRIVATE_NOTES_DRAFT]: string;
diff --git a/src/libs/Navigation/Navigation.ts b/src/libs/Navigation/Navigation.ts
index 99321d7734c..91285821fe9 100644
--- a/src/libs/Navigation/Navigation.ts
+++ b/src/libs/Navigation/Navigation.ts
@@ -73,7 +73,7 @@ function getActiveRouteIndex(stateOrRoute: StateOrRoute, index?: number): number
  * @param path - Path that you are looking for.
  * @return - Returns distance to path or -1 if the path is not found in root navigator.
  */
-function getDistanceFromPathInRootNavigator(path: string): number {
+function getDistanceFromPathInRootNavigator(path?: string): number {
     let currentState = navigationRef.getRootState();
 
     for (let index = 0; index < 5; index++) {
@@ -149,7 +149,7 @@ function navigate(route: Route = ROUTES.HOME, type?: string) {
  * @param shouldEnforceFallback - Enforces navigation to fallback route
  * @param shouldPopToTop - Should we navigate to LHN on back press
  */
-function goBack(fallbackRoute: Route, shouldEnforceFallback = false, shouldPopToTop = false) {
+function goBack(fallbackRoute?: Route, shouldEnforceFallback = false, shouldPopToTop = false) {
     if (!canNavigate('goBack')) {
         return;
     }
diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts
index 0d7658adf18..ef27f8374eb 100644
--- a/src/libs/ReportUtils.ts
+++ b/src/libs/ReportUtils.ts
@@ -4534,4 +4534,4 @@ export {
     shouldDisableThread,
 };
 
-export type {ExpenseOriginalMessage, OptionData, OptimisticChatReport};
+export type {ExpenseOriginalMessage, OptionData, OptimisticChatReport, OptimisticCreatedReportAction};
diff --git a/src/libs/actions/App.ts b/src/libs/actions/App.ts
index 798d94bfb0e..c0691eb8647 100644
--- a/src/libs/actions/App.ts
+++ b/src/libs/actions/App.ts
@@ -297,12 +297,12 @@ function finalReconnectAppAfterActivatingReliableUpdates(): Promise<void | OnyxT
  * @param [updateIDFrom] the ID of the Onyx update that we want to start fetching from
  * @param [updateIDTo] the ID of the Onyx update that we want to fetch up to
  */
-function getMissingOnyxUpdates(updateIDFrom = 0, updateIDTo = 0): Promise<void | OnyxTypes.Response> {
+function getMissingOnyxUpdates(updateIDFrom = 0, updateIDTo: number | string = 0): Promise<void | OnyxTypes.Response> {
     console.debug(`[OnyxUpdates] Fetching missing updates updateIDFrom: ${updateIDFrom} and updateIDTo: ${updateIDTo}`);
 
     type GetMissingOnyxMessagesParams = {
         updateIDFrom: number;
-        updateIDTo: number;
+        updateIDTo: number | string;
     };
 
     const parameters: GetMissingOnyxMessagesParams = {
diff --git a/src/libs/actions/CanvasSize.js b/src/libs/actions/CanvasSize.ts
similarity index 92%
rename from src/libs/actions/CanvasSize.js
rename to src/libs/actions/CanvasSize.ts
index b313763131b..8e0a155f25e 100644
--- a/src/libs/actions/CanvasSize.js
+++ b/src/libs/actions/CanvasSize.ts
@@ -11,12 +11,12 @@ function retrieveMaxCanvasArea() {
     // More information at: https://github.com/jhildenbiddle/canvas-size/issues/13
     canvasSize
         .maxArea({
-            max: Browser.isMobile() ? 8192 : null,
+            max: Browser.isMobile() ? 8192 : undefined,
             usePromise: true,
             useWorker: false,
         })
         .then(() => ({
-            onSuccess: (width, height) => {
+            onSuccess: (width: number, height: number) => {
                 Onyx.merge(ONYXKEYS.MAX_CANVAS_AREA, width * height);
             },
         }));
diff --git a/src/libs/actions/Card.js b/src/libs/actions/Card.js
deleted file mode 100644
index 68642bd8fdf..00000000000
--- a/src/libs/actions/Card.js
+++ /dev/null
@@ -1,176 +0,0 @@
-import Onyx from 'react-native-onyx';
-import * as API from '@libs/API';
-import * as Localize from '@libs/Localize';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-
-/**
- * @param {Number} cardID
- */
-function reportVirtualExpensifyCardFraud(cardID) {
-    API.write(
-        'ReportVirtualExpensifyCardFraud',
-        {
-            cardID,
-        },
-        {
-            optimisticData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.FORMS.REPORT_VIRTUAL_CARD_FRAUD,
-                    value: {
-                        isLoading: true,
-                    },
-                },
-            ],
-            successData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.FORMS.REPORT_VIRTUAL_CARD_FRAUD,
-                    value: {
-                        isLoading: false,
-                    },
-                },
-            ],
-            failureData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.FORMS.REPORT_VIRTUAL_CARD_FRAUD,
-                    value: {
-                        isLoading: false,
-                    },
-                },
-            ],
-        },
-    );
-}
-
-/**
- * Call the API to deactivate the card and request a new one
- * @param {String} cardId - id of the card that is going to be replaced
- * @param {String} reason - reason for replacement ('damaged' | 'stolen')
- */
-function requestReplacementExpensifyCard(cardId, reason) {
-    API.write(
-        'RequestReplacementExpensifyCard',
-        {
-            cardId,
-            reason,
-        },
-        {
-            optimisticData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.FORMS.REPORT_PHYSICAL_CARD_FORM,
-                    value: {
-                        isLoading: true,
-                        errors: null,
-                    },
-                },
-            ],
-            successData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.FORMS.REPORT_PHYSICAL_CARD_FORM,
-                    value: {
-                        isLoading: false,
-                    },
-                },
-            ],
-            failureData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.FORMS.REPORT_PHYSICAL_CARD_FORM,
-                    value: {
-                        isLoading: false,
-                    },
-                },
-            ],
-        },
-    );
-}
-
-/**
- * Activates the physical Expensify card based on the last four digits of the card number
- *
- * @param {String} cardLastFourDigits
- * @param {Number} cardID
- */
-function activatePhysicalExpensifyCard(cardLastFourDigits, cardID) {
-    API.write(
-        'ActivatePhysicalExpensifyCard',
-        {cardLastFourDigits, cardID},
-        {
-            optimisticData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.CARD_LIST,
-                    value: {
-                        [cardID]: {
-                            errors: null,
-                            isLoading: true,
-                        },
-                    },
-                },
-            ],
-            successData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.CARD_LIST,
-                    value: {
-                        [cardID]: {
-                            isLoading: false,
-                        },
-                    },
-                },
-            ],
-            failureData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: ONYXKEYS.CARD_LIST,
-                    value: {
-                        [cardID]: {
-                            isLoading: false,
-                        },
-                    },
-                },
-            ],
-        },
-    );
-}
-
-/**
- * Clears errors for a specific cardID
- *
- * @param {Number} cardID
- */
-function clearCardListErrors(cardID) {
-    Onyx.merge(ONYXKEYS.CARD_LIST, {[cardID]: {errors: null, isLoading: false}});
-}
-
-/**
- * Makes an API call to get virtual card details (pan, cvv, expiration date, address)
- * This function purposefully uses `makeRequestWithSideEffects` method. For security reason
- * card details cannot be persisted in Onyx and have to be asked for each time a user want's to
- * reveal them.
- *
- * @param {String} cardID - virtual card ID
- *
- * @returns {Promise<Object>} - promise with card details object
- */
-function revealVirtualCardDetails(cardID) {
-    return new Promise((resolve, reject) => {
-        // eslint-disable-next-line rulesdir/no-api-side-effects-method
-        API.makeRequestWithSideEffects('RevealExpensifyCardDetails', {cardID})
-            .then((response) => {
-                if (response.jsonCode !== CONST.JSON_CODE.SUCCESS) {
-                    reject(Localize.translateLocal('cardPage.cardDetailsLoadingFailure'));
-                    return;
-                }
-                resolve(response);
-            })
-            .catch(() => reject(Localize.translateLocal('cardPage.cardDetailsLoadingFailure')));
-    });
-}
-
-export {requestReplacementExpensifyCard, activatePhysicalExpensifyCard, clearCardListErrors, reportVirtualExpensifyCardFraud, revealVirtualCardDetails};
diff --git a/src/libs/actions/Card.ts b/src/libs/actions/Card.ts
new file mode 100644
index 00000000000..172b0ac73ca
--- /dev/null
+++ b/src/libs/actions/Card.ts
@@ -0,0 +1,193 @@
+import Onyx from 'react-native-onyx';
+import type {OnyxUpdate} from 'react-native-onyx';
+import * as API from '@libs/API';
+import * as Localize from '@libs/Localize';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import type {Response} from '@src/types/onyx';
+
+type ReplacementReason = 'damaged' | 'stolen';
+
+function reportVirtualExpensifyCardFraud(cardID: number) {
+    const optimisticData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.FORMS.REPORT_VIRTUAL_CARD_FRAUD,
+            value: {
+                isLoading: true,
+            },
+        },
+    ];
+
+    const successData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.FORMS.REPORT_VIRTUAL_CARD_FRAUD,
+            value: {
+                isLoading: false,
+            },
+        },
+    ];
+
+    const failureData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.FORMS.REPORT_VIRTUAL_CARD_FRAUD,
+            value: {
+                isLoading: false,
+            },
+        },
+    ];
+
+    type ReportVirtualExpensifyCardFraudParams = {
+        cardID: number;
+    };
+
+    const parameters: ReportVirtualExpensifyCardFraudParams = {
+        cardID,
+    };
+
+    API.write('ReportVirtualExpensifyCardFraud', parameters, {optimisticData, successData, failureData});
+}
+
+/**
+ * Call the API to deactivate the card and request a new one
+ * @param cardId - id of the card that is going to be replaced
+ * @param reason - reason for replacement
+ */
+function requestReplacementExpensifyCard(cardId: number, reason: ReplacementReason) {
+    const optimisticData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.FORMS.REPORT_PHYSICAL_CARD_FORM,
+            value: {
+                isLoading: true,
+                errors: null,
+            },
+        },
+    ];
+
+    const successData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.FORMS.REPORT_PHYSICAL_CARD_FORM,
+            value: {
+                isLoading: false,
+            },
+        },
+    ];
+
+    const failureData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.FORMS.REPORT_PHYSICAL_CARD_FORM,
+            value: {
+                isLoading: false,
+            },
+        },
+    ];
+
+    type RequestReplacementExpensifyCardParams = {
+        cardId: number;
+        reason: string;
+    };
+
+    const parameters: RequestReplacementExpensifyCardParams = {
+        cardId,
+        reason,
+    };
+
+    API.write('RequestReplacementExpensifyCard', parameters, {optimisticData, successData, failureData});
+}
+
+/**
+ * Activates the physical Expensify card based on the last four digits of the card number
+ */
+function activatePhysicalExpensifyCard(cardLastFourDigits: string, cardID: number) {
+    const optimisticData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.CARD_LIST,
+            value: {
+                [cardID]: {
+                    errors: null,
+                    isLoading: true,
+                },
+            },
+        },
+    ];
+
+    const successData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.CARD_LIST,
+            value: {
+                [cardID]: {
+                    isLoading: false,
+                },
+            },
+        },
+    ];
+
+    const failureData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: ONYXKEYS.CARD_LIST,
+            value: {
+                [cardID]: {
+                    isLoading: false,
+                },
+            },
+        },
+    ];
+
+    type ActivatePhysicalExpensifyCardParams = {
+        cardLastFourDigits: string;
+        cardID: number;
+    };
+
+    const parameters: ActivatePhysicalExpensifyCardParams = {
+        cardLastFourDigits,
+        cardID,
+    };
+
+    API.write('ActivatePhysicalExpensifyCard', parameters, {optimisticData, successData, failureData});
+}
+
+/**
+ * Clears errors for a specific cardID
+ */
+function clearCardListErrors(cardID: number) {
+    Onyx.merge(ONYXKEYS.CARD_LIST, {[cardID]: {errors: null, isLoading: false}});
+}
+
+/**
+ * Makes an API call to get virtual card details (pan, cvv, expiration date, address)
+ * This function purposefully uses `makeRequestWithSideEffects` method. For security reason
+ * card details cannot be persisted in Onyx and have to be asked for each time a user want's to
+ * reveal them.
+ *
+ * @param cardID - virtual card ID
+ *
+ * @returns promise with card details object
+ */
+function revealVirtualCardDetails(cardID: number): Promise<Response> {
+    return new Promise((resolve, reject) => {
+        type RevealExpensifyCardDetailsParams = {cardID: number};
+
+        const parameters: RevealExpensifyCardDetailsParams = {cardID};
+
+        // eslint-disable-next-line rulesdir/no-api-side-effects-method
+        API.makeRequestWithSideEffects('RevealExpensifyCardDetails', parameters)
+            .then((response) => {
+                if (response?.jsonCode !== CONST.JSON_CODE.SUCCESS) {
+                    reject(Localize.translateLocal('cardPage.cardDetailsLoadingFailure'));
+                    return;
+                }
+                resolve(response);
+            })
+            .catch(() => reject(Localize.translateLocal('cardPage.cardDetailsLoadingFailure')));
+    });
+}
+
+export {requestReplacementExpensifyCard, activatePhysicalExpensifyCard, clearCardListErrors, reportVirtualExpensifyCardFraud, revealVirtualCardDetails};
diff --git a/src/libs/actions/MemoryOnlyKeys/MemoryOnlyKeys.js b/src/libs/actions/MemoryOnlyKeys/MemoryOnlyKeys.ts
similarity index 71%
rename from src/libs/actions/MemoryOnlyKeys/MemoryOnlyKeys.js
rename to src/libs/actions/MemoryOnlyKeys/MemoryOnlyKeys.ts
index 028bce22590..3e8c613187b 100644
--- a/src/libs/actions/MemoryOnlyKeys/MemoryOnlyKeys.js
+++ b/src/libs/actions/MemoryOnlyKeys/MemoryOnlyKeys.ts
@@ -1,8 +1,9 @@
 import Onyx from 'react-native-onyx';
+import type {OnyxKey} from 'react-native-onyx/lib/types';
 import Log from '@libs/Log';
 import ONYXKEYS from '@src/ONYXKEYS';
 
-const memoryOnlyKeys = [ONYXKEYS.COLLECTION.REPORT, ONYXKEYS.COLLECTION.POLICY, ONYXKEYS.PERSONAL_DETAILS_LIST];
+const memoryOnlyKeys: OnyxKey[] = [ONYXKEYS.COLLECTION.REPORT, ONYXKEYS.COLLECTION.POLICY, ONYXKEYS.PERSONAL_DETAILS_LIST];
 
 const enable = () => {
     Log.info('[MemoryOnlyKeys] enabled');
diff --git a/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.native.js b/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.native.js
deleted file mode 100644
index 9d08b9db6aa..00000000000
--- a/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.native.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * This is a no-op because the global methods will only work for web and desktop
- */
-const exposeGlobalMemoryOnlyKeysMethods = () => {};
-
-export default exposeGlobalMemoryOnlyKeysMethods;
diff --git a/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.native.ts b/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.native.ts
new file mode 100644
index 00000000000..b89e03bdefd
--- /dev/null
+++ b/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.native.ts
@@ -0,0 +1,8 @@
+import type ExposeGlobalMemoryOnlyKeysMethods from './types';
+
+/**
+ * This is a no-op because the global methods will only work for web and desktop
+ */
+const exposeGlobalMemoryOnlyKeysMethods: ExposeGlobalMemoryOnlyKeysMethods = () => {};
+
+export default exposeGlobalMemoryOnlyKeysMethods;
diff --git a/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.js b/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.ts
similarity index 67%
rename from src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.js
rename to src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.ts
index 1d039c8980a..4514edacb28 100644
--- a/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.js
+++ b/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/index.ts
@@ -1,6 +1,7 @@
 import * as MemoryOnlyKeys from '@userActions/MemoryOnlyKeys/MemoryOnlyKeys';
+import type ExposeGlobalMemoryOnlyKeysMethods from './types';
 
-const exposeGlobalMemoryOnlyKeysMethods = () => {
+const exposeGlobalMemoryOnlyKeysMethods: ExposeGlobalMemoryOnlyKeysMethods = () => {
     window.enableMemoryOnlyKeys = () => {
         MemoryOnlyKeys.enable();
     };
diff --git a/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/types.ts b/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/types.ts
new file mode 100644
index 00000000000..4cb50041b62
--- /dev/null
+++ b/src/libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods/types.ts
@@ -0,0 +1,3 @@
+type ExposeGlobalMemoryOnlyKeysMethods = () => void;
+
+export default ExposeGlobalMemoryOnlyKeysMethods;
diff --git a/src/libs/actions/OnyxUpdateManager.js b/src/libs/actions/OnyxUpdateManager.ts
similarity index 86%
rename from src/libs/actions/OnyxUpdateManager.js
rename to src/libs/actions/OnyxUpdateManager.ts
index 21cea452295..ab0dea960b2 100644
--- a/src/libs/actions/OnyxUpdateManager.js
+++ b/src/libs/actions/OnyxUpdateManager.ts
@@ -1,5 +1,4 @@
 import Onyx from 'react-native-onyx';
-import _ from 'underscore';
 import Log from '@libs/Log';
 import * as SequentialQueue from '@libs/Network/SequentialQueue';
 import CONST from '@src/CONST';
@@ -22,27 +21,27 @@ import * as OnyxUpdates from './OnyxUpdates';
 // The circular dependency happens because this file calls API.GetMissingOnyxUpdates() which uses the SaveResponseInOnyx.js file
 // (as a middleware). Therefore, SaveResponseInOnyx.js can't import and use this file directly.
 
-let lastUpdateIDAppliedToClient = 0;
+let lastUpdateIDAppliedToClient: number | null = 0;
 Onyx.connect({
     key: ONYXKEYS.ONYX_UPDATES_LAST_UPDATE_ID_APPLIED_TO_CLIENT,
-    callback: (val) => (lastUpdateIDAppliedToClient = val),
+    callback: (value) => (lastUpdateIDAppliedToClient = value),
 });
 
 export default () => {
     console.debug('[OnyxUpdateManager] Listening for updates from the server');
     Onyx.connect({
         key: ONYXKEYS.ONYX_UPDATES_FROM_SERVER,
-        callback: (val) => {
-            if (!val) {
+        callback: (value) => {
+            if (!value) {
                 return;
             }
 
             // Since we used the same key that used to store another object, let's confirm that the current object is
             // following the new format before we proceed. If it isn't, then let's clear the object in Onyx.
             if (
-                !_.isObject(val) ||
-                !_.has(val, 'type') ||
-                (!(val.type === CONST.ONYX_UPDATE_TYPES.HTTPS && _.has(val, 'request') && _.has(val, 'response')) && !(val.type === CONST.ONYX_UPDATE_TYPES.PUSHER && _.has(val, 'updates')))
+                !(typeof value === 'object' && !!value) ||
+                !('type' in value) ||
+                (!(value.type === CONST.ONYX_UPDATE_TYPES.HTTPS && value.request && value.response) && !(value.type === CONST.ONYX_UPDATE_TYPES.PUSHER && value.updates))
             ) {
                 console.debug('[OnyxUpdateManager] Invalid format found for updates, cleaning and unpausing the queue');
                 Onyx.set(ONYXKEYS.ONYX_UPDATES_FROM_SERVER, null);
@@ -50,9 +49,9 @@ export default () => {
                 return;
             }
 
-            const updateParams = val;
-            const lastUpdateIDFromServer = val.lastUpdateID;
-            const previousUpdateIDFromServer = val.previousUpdateID;
+            const updateParams = value;
+            const lastUpdateIDFromServer = value.lastUpdateID;
+            const previousUpdateIDFromServer = value.previousUpdateID;
 
             // In cases where we received a previousUpdateID and it doesn't match our lastUpdateIDAppliedToClient
             // we need to perform one of the 2 possible cases:
@@ -76,7 +75,7 @@ export default () => {
                 canUnpauseQueuePromise = App.finalReconnectAppAfterActivatingReliableUpdates();
             } else {
                 // The flow below is setting the promise to a getMissingOnyxUpdates to address flow (2) explained above.
-                console.debug(`[OnyxUpdateManager] Client is behind the server by ${previousUpdateIDFromServer - lastUpdateIDAppliedToClient} so fetching incremental updates`);
+                console.debug(`[OnyxUpdateManager] Client is behind the server by ${Number(previousUpdateIDFromServer) - lastUpdateIDAppliedToClient} so fetching incremental updates`);
                 Log.info('Gap detected in update IDs from server so fetching incremental updates', true, {
                     lastUpdateIDFromServer,
                     previousUpdateIDFromServer,
diff --git a/src/libs/actions/OnyxUpdates.ts b/src/libs/actions/OnyxUpdates.ts
index a0772db4958..85f569246ec 100644
--- a/src/libs/actions/OnyxUpdates.ts
+++ b/src/libs/actions/OnyxUpdates.ts
@@ -71,6 +71,7 @@ function applyPusherOnyxUpdates(updates: OnyxUpdateEvent[]) {
  */
 function apply({lastUpdateID, type, request, response, updates}: Merge<OnyxUpdatesFromServer, {updates: OnyxUpdateEvent[]; type: 'pusher'}>): Promise<void>;
 function apply({lastUpdateID, type, request, response, updates}: Merge<OnyxUpdatesFromServer, {request: Request; response: Response; type: 'https'}>): Promise<Response>;
+function apply({lastUpdateID, type, request, response, updates}: OnyxUpdatesFromServer): Promise<Response>;
 function apply({lastUpdateID, type, request, response, updates}: OnyxUpdatesFromServer): Promise<void | Response> | undefined {
     Log.info(`[OnyxUpdateManager] Applying update type: ${type} with lastUpdateID: ${lastUpdateID}`, false, {command: request?.command});
 
diff --git a/src/libs/actions/TeachersUnite.js b/src/libs/actions/TeachersUnite.js
deleted file mode 100644
index 45bd70528c3..00000000000
--- a/src/libs/actions/TeachersUnite.js
+++ /dev/null
@@ -1,183 +0,0 @@
-import lodashGet from 'lodash/get';
-import Onyx from 'react-native-onyx';
-import _ from 'underscore';
-import * as API from '@libs/API';
-import Navigation from '@libs/Navigation/Navigation';
-import * as OptionsListUtils from '@libs/OptionsListUtils';
-import * as ReportUtils from '@libs/ReportUtils';
-import CONST from '@src/CONST';
-import ONYXKEYS from '@src/ONYXKEYS';
-
-let sessionEmail = '';
-let sessionAccountID = 0;
-Onyx.connect({
-    key: ONYXKEYS.SESSION,
-    callback: (val) => {
-        sessionEmail = lodashGet(val, 'email', '');
-        sessionAccountID = lodashGet(val, 'accountID', 0);
-    },
-});
-
-let allPersonalDetails;
-Onyx.connect({
-    key: ONYXKEYS.PERSONAL_DETAILS_LIST,
-    callback: (val) => (allPersonalDetails = val),
-});
-
-/**
- * @param {String} partnerUserID
- * @param {String} firstName
- * @param {String} lastName
- * @param {String} policyID
- * @param {String} publicRoomReportID - This is the global reportID for the public room, we'll ignore the optimistic one
- */
-function referTeachersUniteVolunteer(partnerUserID, firstName, lastName, policyID, publicRoomReportID) {
-    const optimisticPublicRoom = ReportUtils.buildOptimisticChatReport([], CONST.TEACHERS_UNITE.PUBLIC_ROOM_NAME, CONST.REPORT.CHAT_TYPE.POLICY_ROOM, policyID);
-    const optimisticData = [
-        {
-            onyxMethod: Onyx.METHOD.SET,
-            key: `${ONYXKEYS.COLLECTION.REPORT}${publicRoomReportID}`,
-            value: {
-                ...optimisticPublicRoom,
-                reportID: publicRoomReportID,
-                policyName: CONST.TEACHERS_UNITE.POLICY_NAME,
-            },
-        },
-    ];
-    API.write(
-        'ReferTeachersUniteVolunteer',
-        {
-            reportID: publicRoomReportID,
-            firstName,
-            lastName,
-            partnerUserID,
-        },
-        {optimisticData},
-    );
-    Navigation.dismissModal(publicRoomReportID);
-}
-
-/**
- * Optimistically creates a policyExpenseChat for the school principal and passes data to AddSchoolPrincipal
- * @param {String} firstName
- * @param {String} partnerUserID
- * @param {String} lastName
- * @param {String} policyID
- */
-function addSchoolPrincipal(firstName, partnerUserID, lastName, policyID) {
-    const policyName = CONST.TEACHERS_UNITE.POLICY_NAME;
-    const loggedInEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(sessionEmail);
-    const reportCreationData = {};
-
-    const expenseChatData = ReportUtils.buildOptimisticChatReport([sessionAccountID], '', CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT, policyID, sessionAccountID, true, policyName);
-    const expenseChatReportID = expenseChatData.reportID;
-    const expenseReportCreatedAction = ReportUtils.buildOptimisticCreatedReportAction(sessionEmail);
-    const expenseReportActionData = {
-        [expenseReportCreatedAction.reportActionID]: expenseReportCreatedAction,
-    };
-
-    reportCreationData[loggedInEmail] = {
-        reportID: expenseChatReportID,
-        reportActionID: expenseReportCreatedAction.reportActionID,
-    };
-
-    API.write(
-        'AddSchoolPrincipal',
-        {
-            firstName,
-            lastName,
-            partnerUserID,
-            policyID,
-            reportCreationData: JSON.stringify(reportCreationData),
-        },
-        {
-            optimisticData: [
-                {
-                    onyxMethod: Onyx.METHOD.SET,
-                    key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
-                    value: {
-                        id: policyID,
-                        isPolicyExpenseChatEnabled: true,
-                        type: CONST.POLICY.TYPE.CORPORATE,
-                        name: policyName,
-                        role: CONST.POLICY.ROLE.USER,
-                        owner: sessionEmail,
-                        outputCurrency: lodashGet(allPersonalDetails, [sessionAccountID, 'localCurrencyCode'], CONST.CURRENCY.USD),
-                        pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-                    },
-                },
-                {
-                    onyxMethod: Onyx.METHOD.SET,
-                    key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
-                    value: {
-                        [sessionAccountID]: {
-                            role: CONST.POLICY.ROLE.USER,
-                            errors: {},
-                        },
-                    },
-                },
-                {
-                    onyxMethod: Onyx.METHOD.SET,
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`,
-                    value: {
-                        pendingFields: {
-                            addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
-                        },
-                        ...expenseChatData,
-                    },
-                },
-                {
-                    onyxMethod: Onyx.METHOD.SET,
-                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`,
-                    value: expenseReportActionData,
-                },
-            ],
-            successData: [
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
-                    value: {pendingAction: null},
-                },
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`,
-                    value: {
-                        pendingFields: {
-                            addWorkspaceRoom: null,
-                        },
-                        pendingAction: null,
-                    },
-                },
-                {
-                    onyxMethod: Onyx.METHOD.MERGE,
-                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`,
-                    value: {
-                        [_.keys(expenseChatData)[0]]: {
-                            pendingAction: null,
-                        },
-                    },
-                },
-            ],
-            failureData: [
-                {
-                    onyxMethod: Onyx.METHOD.SET,
-                    key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
-                    value: null,
-                },
-                {
-                    onyxMethod: Onyx.METHOD.SET,
-                    key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`,
-                    value: null,
-                },
-                {
-                    onyxMethod: Onyx.METHOD.SET,
-                    key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`,
-                    value: null,
-                },
-            ],
-        },
-    );
-    Navigation.dismissModal(expenseChatReportID);
-}
-
-export default {referTeachersUniteVolunteer, addSchoolPrincipal};
diff --git a/src/libs/actions/TeachersUnite.ts b/src/libs/actions/TeachersUnite.ts
new file mode 100644
index 00000000000..6aff31ad383
--- /dev/null
+++ b/src/libs/actions/TeachersUnite.ts
@@ -0,0 +1,199 @@
+import Onyx from 'react-native-onyx';
+import type {OnyxEntry, OnyxUpdate} from 'react-native-onyx';
+import * as API from '@libs/API';
+import Navigation from '@libs/Navigation/Navigation';
+import * as OptionsListUtils from '@libs/OptionsListUtils';
+import * as ReportUtils from '@libs/ReportUtils';
+import type {OptimisticCreatedReportAction} from '@libs/ReportUtils';
+import CONST from '@src/CONST';
+import ONYXKEYS from '@src/ONYXKEYS';
+import type {PersonalDetailsList} from '@src/types/onyx';
+
+type CreationData = {
+    reportID: string;
+    reportActionID: string;
+};
+
+type ReportCreationData = Record<string, CreationData>;
+
+type ExpenseReportActionData = Record<string, OptimisticCreatedReportAction>;
+
+let sessionEmail = '';
+let sessionAccountID = 0;
+Onyx.connect({
+    key: ONYXKEYS.SESSION,
+    callback: (value) => {
+        sessionEmail = value?.email ?? '';
+        sessionAccountID = value?.accountID ?? 0;
+    },
+});
+
+let allPersonalDetails: OnyxEntry<PersonalDetailsList>;
+Onyx.connect({
+    key: ONYXKEYS.PERSONAL_DETAILS_LIST,
+    callback: (value) => (allPersonalDetails = value),
+});
+
+/**
+ * @param publicRoomReportID - This is the global reportID for the public room, we'll ignore the optimistic one
+ */
+function referTeachersUniteVolunteer(partnerUserID: string, firstName: string, lastName: string, policyID: string, publicRoomReportID: string) {
+    const optimisticPublicRoom = ReportUtils.buildOptimisticChatReport([], CONST.TEACHERS_UNITE.PUBLIC_ROOM_NAME, CONST.REPORT.CHAT_TYPE.POLICY_ROOM, policyID);
+    const optimisticData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${publicRoomReportID}`,
+            value: {
+                ...optimisticPublicRoom,
+                reportID: publicRoomReportID,
+                policyName: CONST.TEACHERS_UNITE.POLICY_NAME,
+            },
+        },
+    ];
+
+    type ReferTeachersUniteVolunteerParams = {
+        reportID: string;
+        firstName: string;
+        lastName: string;
+        partnerUserID: string;
+    };
+
+    const parameters: ReferTeachersUniteVolunteerParams = {
+        reportID: publicRoomReportID,
+        firstName,
+        lastName,
+        partnerUserID,
+    };
+
+    API.write('ReferTeachersUniteVolunteer', parameters, {optimisticData});
+    Navigation.dismissModal(publicRoomReportID);
+}
+
+/**
+ * Optimistically creates a policyExpenseChat for the school principal and passes data to AddSchoolPrincipal
+ */
+function addSchoolPrincipal(firstName: string, partnerUserID: string, lastName: string, policyID: string) {
+    const policyName = CONST.TEACHERS_UNITE.POLICY_NAME;
+    const loggedInEmail = OptionsListUtils.addSMSDomainIfPhoneNumber(sessionEmail);
+    const reportCreationData: ReportCreationData = {};
+
+    const expenseChatData = ReportUtils.buildOptimisticChatReport([sessionAccountID], '', CONST.REPORT.CHAT_TYPE.POLICY_EXPENSE_CHAT, policyID, sessionAccountID, true, policyName);
+    const expenseChatReportID = expenseChatData.reportID;
+    const expenseReportCreatedAction = ReportUtils.buildOptimisticCreatedReportAction(sessionEmail);
+    const expenseReportActionData: ExpenseReportActionData = {
+        [expenseReportCreatedAction.reportActionID]: expenseReportCreatedAction,
+    };
+
+    reportCreationData[loggedInEmail] = {
+        reportID: expenseChatReportID,
+        reportActionID: expenseReportCreatedAction.reportActionID,
+    };
+
+    const optimisticData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
+            value: {
+                id: policyID,
+                isPolicyExpenseChatEnabled: true,
+                type: CONST.POLICY.TYPE.CORPORATE,
+                name: policyName,
+                role: CONST.POLICY.ROLE.USER,
+                owner: sessionEmail,
+                outputCurrency: allPersonalDetails?.[sessionAccountID]?.localCurrencyCode ?? CONST.CURRENCY.USD,
+                pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
+            value: {
+                [sessionAccountID]: {
+                    role: CONST.POLICY.ROLE.USER,
+                    errors: {},
+                },
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`,
+            value: {
+                pendingFields: {
+                    addWorkspaceRoom: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD,
+                },
+                ...expenseChatData,
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`,
+            value: expenseReportActionData,
+        },
+    ];
+
+    const successData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
+            value: {pendingAction: null},
+        },
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`,
+            value: {
+                pendingFields: {
+                    addWorkspaceRoom: null,
+                },
+                pendingAction: null,
+            },
+        },
+        {
+            onyxMethod: Onyx.METHOD.MERGE,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`,
+            value: {
+                [Object.keys(expenseChatData)[0]]: {
+                    pendingAction: null,
+                },
+            },
+        },
+    ];
+
+    const failureData: OnyxUpdate[] = [
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.POLICY_MEMBERS}${policyID}`,
+            value: null,
+        },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.REPORT}${expenseChatReportID}`,
+            value: null,
+        },
+        {
+            onyxMethod: Onyx.METHOD.SET,
+            key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${expenseChatReportID}`,
+            value: null,
+        },
+    ];
+
+    type AddSchoolPrincipalParams = {
+        firstName: string;
+        lastName: string;
+        partnerUserID: string;
+        policyID: string;
+        reportCreationData: string;
+    };
+
+    const parameters: AddSchoolPrincipalParams = {
+        firstName,
+        lastName,
+        partnerUserID,
+        policyID,
+        reportCreationData: JSON.stringify(reportCreationData),
+    };
+
+    API.write('AddSchoolPrincipal', parameters, {optimisticData, successData, failureData});
+    Navigation.dismissModal(expenseChatReportID);
+}
+
+export default {referTeachersUniteVolunteer, addSchoolPrincipal};
diff --git a/src/libs/actions/TransactionEdit.js b/src/libs/actions/TransactionEdit.ts
similarity index 77%
rename from src/libs/actions/TransactionEdit.js
rename to src/libs/actions/TransactionEdit.ts
index 2cb79ac387b..b1710aa72cb 100644
--- a/src/libs/actions/TransactionEdit.js
+++ b/src/libs/actions/TransactionEdit.ts
@@ -1,28 +1,32 @@
 import Onyx from 'react-native-onyx';
+import type {OnyxEntry} from 'react-native-onyx';
 import ONYXKEYS from '@src/ONYXKEYS';
+import type {Transaction} from '@src/types/onyx';
 
 /**
  * Makes a backup copy of a transaction object that can be restored when the user cancels editing a transaction.
- *
- * @param {Object} transaction
  */
-function createBackupTransaction(transaction) {
+function createBackupTransaction(transaction: OnyxEntry<Transaction>) {
+    if (!transaction) {
+        return;
+    }
+
     const newTransaction = {
         ...transaction,
     };
+
     // Use set so that it will always fully overwrite any backup transaction that could have existed before
     Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction.transactionID}`, newTransaction);
 }
 
 /**
  * Removes a transaction from Onyx that was only used temporary in the edit flow
- * @param {String} transactionID
  */
-function removeBackupTransaction(transactionID) {
+function removeBackupTransaction(transactionID: string) {
     Onyx.set(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, null);
 }
 
-function restoreOriginalTransactionFromBackup(transactionID) {
+function restoreOriginalTransactionFromBackup(transactionID: string) {
     const connectionID = Onyx.connect({
         key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`,
         callback: (backupTransaction) => {
diff --git a/src/types/global.d.ts b/src/types/global.d.ts
index a3326ed4d00..0a122f083c8 100644
--- a/src/types/global.d.ts
+++ b/src/types/global.d.ts
@@ -26,3 +26,10 @@ declare module '*.lottie' {
     const value: LottieViewProps['source'];
     export default value;
 }
+
+// Global methods for Onyx key management for debugging purposes
+// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
+interface Window {
+    enableMemoryOnlyKeys: () => void;
+    disableMemoryOnlyKeys: () => void;
+}
diff --git a/src/types/onyx/Policy.ts b/src/types/onyx/Policy.ts
index 2cd686c115b..a9af3339eeb 100644
--- a/src/types/onyx/Policy.ts
+++ b/src/types/onyx/Policy.ts
@@ -36,7 +36,7 @@ type Policy = {
     owner: string;
 
     /** The accountID of the policy owner */
-    ownerAccountID: number;
+    ownerAccountID?: number;
 
     /** The output currency for the policy */
     outputCurrency: string;
@@ -51,7 +51,7 @@ type Policy = {
     pendingAction?: OnyxCommon.PendingAction;
 
     /** A list of errors keyed by microtime */
-    errors: OnyxCommon.Errors;
+    errors?: OnyxCommon.Errors;
 
     /** Whether this policy was loaded from a policy summary, or loaded completely with all of its values */
     isFromFullPolicy?: boolean;
@@ -66,13 +66,13 @@ type Policy = {
     isPolicyExpenseChatEnabled: boolean;
 
     /** Whether the auto reporting is enabled */
-    autoReporting: boolean;
+    autoReporting?: boolean;
 
     /** The scheduled submit frequency set up on the this policy */
-    autoReportingFrequency: ValueOf<typeof CONST.POLICY.AUTO_REPORTING_FREQUENCIES>;
+    autoReportingFrequency?: ValueOf<typeof CONST.POLICY.AUTO_REPORTING_FREQUENCIES>;
 
     /** Whether the scheduled submit is enabled */
-    isHarvestingEnabled: boolean;
+    isHarvestingEnabled?: boolean;
 
     /** The accountID of manager who the employee submits their expenses to on paid policies */
     submitsTo?: number;
diff --git a/src/types/onyx/ReportAction.ts b/src/types/onyx/ReportAction.ts
index 4a895e7b16d..d81335b284a 100644
--- a/src/types/onyx/ReportAction.ts
+++ b/src/types/onyx/ReportAction.ts
@@ -204,4 +204,4 @@ type ReportAction = ReportActionBase & OriginalMessage;
 type ReportActions = Record<string, ReportAction>;
 
 export default ReportAction;
-export type {ReportActions, ReportActionBase, Message, LinkMetadata};
+export type {ReportActions, ReportActionBase, Message, LinkMetadata, OriginalMessage};
diff --git a/src/types/onyx/Response.ts b/src/types/onyx/Response.ts
index b06ec976684..5e606738c56 100644
--- a/src/types/onyx/Response.ts
+++ b/src/types/onyx/Response.ts
@@ -11,6 +11,7 @@ type Response = {
     jsonCode?: number | string;
     onyxData?: OnyxUpdate[];
     requestID?: string;
+    reportID?: string;
     shouldPauseQueue?: boolean;
     authToken?: string;
     encryptedAuthToken?: string;
