Skip to content

[Due for payment 2026-10-16] Android & iOS - Expense - Retry button is not shown when uploading receipt fails #102494

Description

@applause-bot

If you haven’t already, check out our contributing guidelines for onboarding. To join our Slack channel, fill out this form.


Version Number: 9.4.95-0
Reproducible in staging?: Yes
Reproducible in production?: N/A - new feature, doesn't exist in prod
If this was caught during regression testing, add the test name, ID and link from BrowserStack: #99902
Email or phone of affected tester (no customers): jsdoijnodsdisojo@gmail.com
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: iPhone 17 Pro Max / iOS 27.0
App Component: Money Requests

Action Performed:

  1. Launch Expensify app.
  2. Go to workspace chat.
  3. Create an expense without receipt.
  4. Open the expense.
  5. Enable Simulate failing network requests via test tool.
  6. Add a receipt.

Expected Result:

Retry button will be shown when uploading receipt fails.

Actual Result:

Retry button is not shown when uploading receipt fails.

Workaround:

Unknown

Platforms:

  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome Safari

Screenshots/Videos

Bug7272007_1790634353574.ScreenRecording_09-29-2026_06-22-15_1.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Rizky Gunawan
Bug ID: 7272007

Issue OwnerCurrent Issue Owner: @brunovjk

Activity

  1. applause-bot commented on Sep 29, 2026

    @applause-bot
    Author

    While Applause doesn't embed attachments for this bug, here are the links for quick view:
    https://platform.applause.com/services/links/v1/external/b2fed4a385aabadf15907e78f354fdbba0f5b5a9e3edb7736313858fc22df01c

  2. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Sep 29, 2026
  3. melvin-bot commented on Sep 29, 2026

    @melvin-bot

    You have been assigned to this deploy blocker because you recently merged this PR: #99902

  4. melvin-bot commented on Sep 29, 2026

    @melvin-bot

    @mountiny @brunovjk you have been assigned to this deploy blocker because you reviewed the offending PR: #99902

  5. melvin-bot commented on Sep 29, 2026

    @melvin-bot

    @rinej you have been assigned to this deploy blocker because you authored the offending PR: #99902

  6. github-actions commented on Sep 29, 2026

    @github-actions
    Contributor

    👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:

    1. Identify the pull request that introduced this issue and revert it.
    2. Find someone who can quickly fix the issue.
    3. Fix the issue yourself.
  7. melvin-bot commented on Sep 29, 2026

    @melvin-bot

    💬 A slack conversation has been started in #expensify-open-source

  8. MelvinBot commented on Sep 29, 2026

    @MelvinBot
    Contributor

    Deploy Blocker Analysis

    Recommendation: demote. This is not a regression. Retry is a new feature from Add retry button and logic. That PR supports Retry only when creating a new expense fails. It deliberately leaves out adding or replacing a receipt on an existing expense, which is the flow in this issue. Reverting would also remove Retry from the new-expense flow, which works.

    Why the button is missing: Adding a receipt to an existing expense calls replaceReceipt. When that upload fails, the error is tagged REPLACE_RECEIPT (Receipt.ts:292). canBuildRetryPayload returns false for any action except MONEY_REQUEST. So the view passes no retry handler (MoneyRequestReceiptView.tsx:718) and shows only the Save option.

    Investigation details
    • The limit is documented. The feature issue, Add a "Retry" button for a failed receipt upload, says: "Scoped to RequestMoney on a plain receipt expense; ReplaceReceipt and TrackExpense can follow up." A unit test asserts it: ReceiptUploadRetryHandlerTest.ts:109.
    • Why only Android and iOS: Retry is native-only in every flow. isRetrySupported.ts:2 is false on web, so testers expected the button only on native.
    • No other PR is involved. Among the 71 PRs in Deploy Checklist: New Expensify 2026-09-28, only PR Add retry button and logic #99902 touches this code.
    • Impact: The failed-upload message still makes sense on its own ("Upload failed. Save your receipt to keep it."). The user can save the receipt, and the expense keeps its previous receipt (Receipt.ts:291). The one change for this flow is that the PR removed "Delete expense" from the error row.
    • Follow-up (not needed for this deploy): replaceReceipt already stores retryParams in the error. To add Retry here, allow REPLACE_RECEIPT in canBuildRetryPayload and retryReceiptUpload, reload the file from ReceiptStorage, and call replaceReceipt again. Then update the test at line 109.
    • I did not test this in the app. The bug only happens on native, and Retry is turned off on web.

    Next Steps: An internal engineer should remove DeployBlockerCash if they agree. Track the ReplaceReceipt follow-up on the feature issue linked above.


    view run

  9. 6 remaining items

  10. rinej commented on Oct 1, 2026

    @rinej
    Contributor

    Thanks @BartekObudzinski for checking it! I am back from OOO, I can help with that

  11. mountiny commented on Oct 1, 2026

    @mountiny
    Contributor

    Thanks! Welcome back

  12. added
    ReviewingHas a PR in review
    and removed on Oct 2, 2026
  13. rinej commented on Oct 2, 2026

    @rinej
    Contributor

    I've split this into two parts:

    1. ReplaceReceipt fixes the case reported here. The Try again button now appears next to Save on both iOS and Android in the replace flow. Pressing it re-uploads the receipt to the same expense
      PR: Show Try again when replacing a receipt fails #102893 is ready for review @brunovjk

    2. TrackExpense will come in a separate follow-up PR, I will open that PR next.

  14. rinej commented on Oct 8, 2026

    @rinej
    Contributor

    @mountiny @brunovjk

    I’ve created the final PR covering the TrackExpense flow -> #103487

    It should finalize the Try again button implementation for all planned flows

  15. mountiny commented on Oct 9, 2026

    @mountiny
    Contributor

    Great, thank you!

  16. added and removed
    ReviewingHas a PR in review
    on Oct 9, 2026
  17. changed the title [-]Android & iOS - Expense - Retry button is not shown when uploading receipt fails[/-] [+][Due for payment 2026-10-16] Android & iOS - Expense - Retry button is not shown when uploading receipt fails[/+] on Oct 9, 2026
  18. melvin-bot commented on Oct 9, 2026

    @melvin-bot

    @brunovjk

    The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.6-6 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:

    If no regressions arise, payment will be issued on 2026-10-16. 🎊

    The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]

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

Metadata

Metadata

Labels

BugSomething is broken. Auto assigns a BugZero manager.DailyKSv2Engineering

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions