Skip to content

Personal card expenses auto-added to a workspace report are created without an IOU report action #102280

Open

Description

@melvin-bot

Problem
Some expenses imported from a personal card get auto-added to a workspace expense report without an IOU (money request) report action. The action is only created later, when the user opens the expense.

Until the user opens it, the expense exists on the report but has no IOU action. App features that need the action fail on these expenses. For example, bulk delete from Search skips them without any message (see Bulk delete from Search silently skips legacy expenses that have no IOU report action).

These expenses are not legacy. They were imported in the last few days.

Steps to reproduce

  1. Connect a personal card, not a company card feed.
  2. Turn on auto-reporting on a workspace the user belongs to.
  3. Wait for the card to import new expenses onto the workspace report.
  4. Check the report actions before you open any expense.

Expected result
Each imported expense has an IOU report action as soon as it's imported, the same as company card expenses.

Actual result
The imported expenses have no IOU report action until the user opens each one.

Notes
This appears to be a backend/internal issue. A separate internal investigation is needed.

Related: Track legacy transactions missing IOU report actions

Reported in Slack.

Issue OwnerCurrent Issue Owner: @hungvu193

Activity

  1. added
    InternalRequires API changes or must be handled by Expensify staff
    BugSomething is broken. Auto assigns a BugZero manager.
    Hot PickReady for an engineer to pick up and run with
    on Sep 25, 2026
  2. MelvinBot commented on Sep 25, 2026

    @MelvinBot
    Contributor

    Issue Analysis

    Root Cause: This appears to be a backend/internal issue. A separate internal investigation is needed. The App never creates IOU actions for imported card expenses. The server imports the expense and adds it to the report, so the missing action comes from the server.

    Recommended Fix: The fix needs changes outside the App repo. An internal engineer with backend access should pick this up. No App change fixes the root cause.

    The action shows up later only because of the App's legacy fallback in src/libs/actions/Report/index.ts:1860-1950. When you open an expense with no IOU action, openReport builds one and asks the server to save it. That fallback was meant for old transactions (Track legacy transactions missing IOU report actions), not new imports.

    Related issues:

    Investigation details

    The App doesn't create these actions.

    These paths trigger the fallback when you open an expense:

    These App features break until the expense is opened:

    The fallback has a gap. The prev/next buttons in the expense view open the parent report when an expense has no IOU action (TransactionThreadNavigationUtils.ts:66-69). They never trigger the fallback. This isn't the root cause, but it's an App-side mitigation worth fixing along with Bulk delete from Search silently skips legacy expenses that have no IOU report action.

    Not related: Expense - Missing Delete option from context menu when report contains only one card expense has a separate App-side cause. It happens when the IOU action does exist.

    To measure scope: Count the App log [Report] Legacy transaction fallback: creating money request preview for card expenses created recently. If the count jumped on a specific day, a recent deploy caused it. If it didn't, the gap has been there for a while.


    Next Steps: An internal engineer should take this on, because the fix is outside the App repo. Reply with @MelvinBot <your feedback> to refine this analysis.


    view run

  3. melvin-bot commented on Sep 28, 2026

    @melvin-bot
    Author

    Whoops! This issue is 2 days overdue. Let's get this updated quick!

  4. melvin-bot commented on Sep 30, 2026

    @melvin-bot
    Author

    Eep! 4 days overdue now. Issues have feelings too...

  5. melvin-bot commented on Oct 2, 2026

    @melvin-bot
    Author

    6 days overdue. This is scarier than being forced to listen to Vogon poetry!

  6. melvin-bot commented on Oct 3, 2026

    @melvin-bot
    Author

    6 days overdue. This is scarier than being forced to listen to Vogon poetry!

  7. removed
    Hot PickReady for an engineer to pick up and run with
    on Oct 5, 2026
  8. 1 remaining item

  9. removed their assignment
    on Oct 8, 2026
  10. added
    Hot PickReady for an engineer to pick up and run with
    on Oct 8, 2026
  11. melvin-bot commented on Oct 9, 2026

    @melvin-bot
    Author

    this issue was created 2 weeks ago. Are we close to a solution? Let's make sure we're treating this as a top priority. Don't hesitate to create a thread in #expensify-open-source to align faster in real time. Thanks!

  12. melvin-bot commented on Oct 13, 2026

    @melvin-bot
    Author

    Huh... This is 4 days overdue. Who can take care of this?

  13. self-assigned this
    on Oct 14, 2026
  14. hungvu193 commented on Oct 15, 2026

    @hungvu193
    Contributor

    Working on it 👀

  15. hungvu193 commented on Oct 20, 2026

    @hungvu193
    Contributor

    Still working on it

  16. hungvu193 commented on Oct 21, 2026

    @hungvu193
    Contributor

    @MelvinBot Looks like this is fixed, can you verify?

  17. MelvinBot commented on Oct 21, 2026

    @MelvinBot
    Contributor

    🤖 Web test steps verification results: ⚠️ partial

    I couldn't confirm the fix end to end. A backend fix for this was deployed to production on Oct 5, but my web test stopped at the CSV file picker, which the test tool can't drive, so no expenses were imported. To confirm, connect a non-reimbursable personal card on a workspace with auto-reporting on. Then check that Hold, Move, and Delete appear for a new expense before you open it.
    Import spreadsheet screen blocked at file picker

    Step Status
    Workspace created with auto-reporting turned onWorkflows > Submissions is on, and Frequency changed from Manually to Daily.
    Workflows Submissions toggle on
    ✅
    Personal card import set to not reimbursableImport transactions: card name "Melvin Personal Card", USD, "Transactions are reimbursable" turned off.
    Transactions are reimbursable toggle off
    ✅
    CSV import completes and the card shows imported expensesReached "Upload a spreadsheet", but choosing a file opens a native file picker the web test tool can't use. The import never ran.
    Import spreadsheet screen blocked at file picker
    ❌
    Imported expenses land on a workspace report (not Unreported)Not reached, because no expenses were imported.
    ❌
    Hold, Move, and Delete appear for an unopened imported expenseNot reached, because no expenses were imported.
    ❌
    Bulk delete from Search removes an unopened imported expenseNot reached, because no expenses were imported.
    ❌

    view run · view recording

  18. hungvu193 commented on Oct 21, 2026

    @hungvu193
    Contributor

    @MelvinBot looks like it's fixed in here

  19. MelvinBot commented on Oct 21, 2026

    @MelvinBot
    Contributor

    I can't confirm that from the linked PR because I don't have access to that repository, so I can't read its diff or merge status.

    Here's what I can confirm:

    • The internal issue tracking this backend fix is closed.
    • That fix was deployed to production on Oct 5.
    • I still can't reproduce the bug in the web test. It needs a card import, and the test tool can't upload the CSV file.

    If that PR is the Oct 5 fix and you're happy with it, this issue can be closed. To double-check, an internal engineer can connect a non-reimbursable personal card on a workspace with auto-reporting on. Before opening a newly imported expense, they should see Hold, Move and Delete in the report's selection menu.


    view run

  20. hungvu193 commented on Oct 21, 2026

    @hungvu193
    Contributor

    Ok I can confirm this is fixed. I'll ask QA to retest this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

BugSomething is broken. Auto assigns a BugZero manager.DailyKSv2InternalRequires API changes or must be handled by Expensify staff

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions