diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx
index e9b6e26842c3..303d67e8ad5c 100644
--- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx
+++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx
@@ -54,6 +54,7 @@ import {
     generateReportID,
     getReportOrDraftReport,
     hasViolations as hasViolationsReportUtils,
+    isMoneyRequestReport,
     isProcessingReport,
     isReportOutstanding,
     isSelectedManagerMcTest,
@@ -527,6 +528,41 @@ function IOURequestStepConfirmation({
         });
     }, [requestType, iouType, initialTransactionID, reportID, action, report, transactions, participants]);
 
+    const policyParams = useMemo(
+        () => ({
+            policy,
+            policyTagList: policyTags,
+            policyCategories,
+            policyRecentlyUsedCategories,
+        }),
+        [policy, policyTags, policyCategories, policyRecentlyUsedCategories],
+    );
+
+    const emptyPolicyParams = useMemo(() => ({}), []);
+
+    const getMoneyRequestContextForParticipant = useCallback(
+        (participant: Participant | undefined) => {
+            const isWorkspaceTarget = !!participant?.isPolicyExpenseChat;
+            const workspaceChatReport = isWorkspaceTarget && participant?.reportID ? getReportOrDraftReport(participant.reportID) : undefined;
+            return {
+                parentChatReport: isWorkspaceTarget ? workspaceChatReport : undefined,
+                policyParams: isWorkspaceTarget ? policyParams : emptyPolicyParams,
+            };
+        },
+        [policyParams, emptyPolicyParams],
+    );
+
+    const getReportToUseAndBackToReport = useCallback(
+        (participant: Participant | undefined, parentChatReport: Report | undefined, reportParam: Report | undefined, backToReportParam: string | undefined) => {
+            const reportToUse = participant?.isPolicyExpenseChat ? parentChatReport : undefined;
+
+            const backToReportToUse = backToReportParam ?? (isMoneyRequestReport(reportParam) ? reportParam?.reportID : undefined);
+
+            return {reportToUse, backToReportToUse};
+        },
+        [],
+    );
+
     const requestMoney = useCallback(
         (selectedParticipants: Participant[], gpsPoint?: GpsPoint) => {
             if (!transactions.length) {
@@ -538,6 +574,9 @@ function IOURequestStepConfirmation({
                 return;
             }
 
+            const {parentChatReport, policyParams: contextPolicyParams} = getMoneyRequestContextForParticipant(participant);
+            const {reportToUse, backToReportToUse} = getReportToUseAndBackToReport(participant, parentChatReport, report, backToReport);
+
             const optimisticChatReportID = generateReportID();
             const optimisticCreatedReportActionID = rand64();
             const optimisticReportPreviewActionID = rand64();
@@ -556,7 +595,7 @@ function IOURequestStepConfirmation({
                 }
 
                 const {iouReport} = requestMoneyIOUActions({
-                    report,
+                    report: reportToUse,
                     existingIOUReport,
                     optimisticChatReportID,
                     optimisticCreatedReportActionID,
@@ -566,12 +605,7 @@ function IOURequestStepConfirmation({
                         payeeAccountID: currentUserPersonalDetails.accountID,
                         participant,
                     },
-                    policyParams: {
-                        policy,
-                        policyTagList: policyTags,
-                        policyCategories,
-                        policyRecentlyUsedCategories,
-                    },
+                    policyParams: contextPolicyParams,
                     gpsPoint,
                     action,
                     transactionParams: {
@@ -600,7 +634,7 @@ function IOURequestStepConfirmation({
                     },
                     shouldHandleNavigation: index === transactions.length - 1,
                     shouldGenerateTransactionThreadReport,
-                    backToReport,
+                    backToReport: backToReportToUse,
                     isASAPSubmitBetaEnabled,
                     currentUserAccountIDParam: currentUserPersonalDetails.accountID,
                     currentUserEmailParam: currentUserPersonalDetails.login ?? '',
@@ -700,12 +734,15 @@ function IOURequestStepConfirmation({
             if (!participant) {
                 return;
             }
+            const {parentChatReport, policyParams: contextPolicyParams} = getMoneyRequestContextForParticipant(participant);
+            const {reportToUse} = getReportToUseAndBackToReport(participant, parentChatReport, report, backToReport);
+
             for (const [index, item] of transactions.entries()) {
                 const isLinkedTrackedExpenseReportArchived =
                     !!item.linkedTrackedExpenseReportID && archivedReportsIdSet.has(`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${item.linkedTrackedExpenseReportID}`);
 
                 trackExpenseIOUActions({
-                    report,
+                    report: reportToUse,
                     isDraftPolicy,
                     action,
                     participantParams: {
@@ -713,11 +750,7 @@ function IOURequestStepConfirmation({
                         payeeAccountID: currentUserPersonalDetails.accountID,
                         participant,
                     },
-                    policyParams: {
-                        policy,
-                        policyCategories,
-                        policyTagList: policyTags,
-                    },
+                    policyParams: contextPolicyParams,
                     transactionParams: {
                         amount: item.amount,
                         distance: isManualDistanceRequest ? (item.comment?.customUnit?.quantity ?? undefined) : undefined,
@@ -774,19 +807,23 @@ function IOURequestStepConfirmation({
             if (!transaction) {
                 return;
             }
+
+            const participant = selectedParticipants.at(0);
+            if (!participant) {
+                return;
+            }
+
+            const {parentChatReport, policyParams: contextPolicyParams} = getMoneyRequestContextForParticipant(participant);
+            const {reportToUse, backToReportToUse} = getReportToUseAndBackToReport(participant, parentChatReport, report, backToReport);
+
             createDistanceRequestIOUActions({
-                report,
+                report: reportToUse,
                 participants: selectedParticipants,
                 currentUserLogin: currentUserPersonalDetails.login,
                 currentUserAccountID: currentUserPersonalDetails.accountID,
                 iouType,
                 existingTransaction: transaction,
-                policyParams: {
-                    policy,
-                    policyCategories,
-                    policyTagList: policyTags,
-                    policyRecentlyUsedCategories,
-                },
+                policyParams: contextPolicyParams,
                 transactionParams: {
                     amount: transaction.amount,
                     comment: trimmedComment,
@@ -806,7 +843,7 @@ function IOURequestStepConfirmation({
                     attendees: transaction.comment?.attendees,
                     receipt: isManualDistanceRequest ? receiptFiles[transaction.transactionID] : undefined,
                 },
-                backToReport,
+                backToReport: backToReportToUse,
                 isASAPSubmitBetaEnabled,
                 transactionViolations,
             });
