Skip to content

Company cards - Choose a cardholder page is blank when assigning card after going online #105347

Closed

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.5.25.0
Reproducible in staging?: Yes
Reproducible in production?: No
If this was caught during regression testing, add the test name, ID and link from BrowserStack: https://test-management.browserstack.com/projects/2219752/test-runs/81167663/folder/13176706/68947830/1923345198
Email or phone of affected tester (no customers): kiatest.80+ck1028261@gmail.com
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Pixel 8a/Android 16
App Component: Workspace Settings

Action Performed:

Precondition :

  1. Workspace owner has invited few members (around 6 or 7) to workspace

  2. Workspace connected to Wells Fargo company card direct feed

  3. Launch Hybrid app

  4. Go to workspace settings >> Company cards

  5. Assign 3333 card to the owner selecting transaction date as "From the Beginning"

  6. Go offline

  7. Tap Assign CTA on 0000 card

  8. Verify a modal displayed with a message You appear to be offline.

  9. Tap on Got it button

  10. Go online

  11. Tap Assign CTA on 0000 card

  12. Unassign 3333 card

  13. Tap Assign CTA on 3333 card

Expected Result:

On step 9 & 11 - Members list should appear in choose a cardholder page when assigning card after going online

Actual Result:

On step 9 & 11 - After going online, members list not displayed in choose a cardholder page when assigning card

Workaround:

Unknown

Platforms:

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

Screenshots/Videos

Bug7299377_1793247875694.az_recorder_20261028_235914.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Julia Ponikarchuk
Bug ID: 7299377

Activity

  1. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Oct 29, 2026
  2. applause-bot commented on Oct 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/2b18703dcaf596090570928bac00b44232e1d4255f523655f0a190c998a0d65d

  3. melvin-bot commented on Oct 29, 2026

    @melvin-bot

    Triggered auto assignment to @mjasikowski (DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.

  4. github-actions commented on Oct 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.
  5. melvin-bot commented on Oct 29, 2026

    @melvin-bot

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

  6. added
    DeployBlockerIndicates it should block deploying the API
    BugSomething is broken. Auto assigns a BugZero manager.
    and removed
    BugSomething is broken. Auto assigns a BugZero manager.
    DeployBlockerCashThis issue or pull request should block deployment
    on Oct 29, 2026
  7. jponikarchuk commented on Oct 29, 2026

    @jponikarchuk

    This issue is only reproducible with Staging Server enebled.

  8. MelvinBot commented on Oct 29, 2026

    @MelvinBot
    Contributor

    Deploy Blocker Investigation

    Result: No App PR in Deploy Checklist: New Expensify 2026-10-29 (9.5.25-0) explains this bug. Don't revert anything yet. This likely needs a staging backend/data check.

    Why:

    • None of the 52 App PRs in the checklist touches the "Choose a cardholder" page, the offline modal, the reconnect reload, or the shared list and screen components it uses.
    • The Applause lead jponikarchuk said on [No QA] Add RBR to workspace agents + Prepare for 1:1:1 that this bug "is repro on all PRs." If every test build reproduces it, one App change is unlikely to be the cause. The staging API is the more likely source.

    Next steps:

    1. Check the Applause video. A loading skeleton means the list never initialized. An empty list means policy.employeeList is wrong.
    2. Check the staging responses to OpenPolicyCompanyCardsPage (sent on reconnect) and to the assign/unassign requests. Look for anything that clears or reshapes policy.employeeList.
    3. If an App PR is confirmed later, add DeployBlockerCash back. It was removed when the label was switched to DeployBlocker.
    Investigation details

    All line links point to App commit 67eb990.

    What the page depends on (unchanged in this release):

    Candidates ruled out:

    PR Why it's unlikely
    Raise test tools and the offline banner above required 2FA. Only PR touching a wrapper this page uses (ScreenWrapperContainer.tsx). It removes memoization and moves the four-finger-tap handler into a hook. No data or transition-end changes. Its banner only renders under the required-2FA overlay.
    [No QA] Add RBR to workspace agents + Prepare for 1:1:1 Touches agents, useWorkspaceMembers, and the members/invite pages. Nothing in the assign-card flow.
    [Performance] Wide pre-mount 5/5: support RHP destination pre-mount on wide layout Wide layout only. The bug is on native phones.
    Native Account keeps the tab bar with no item selected under the Insights beta Gated behind the Insights beta and limited to the tab bar.
    [LegendList 4/9] fix: stabilize composer focus and scroll notifications Only gates composer scroll events on inverted.
    refactor: remove unsafe assertions from Search tracking and shared helpers Type-only refactor.

    Gaps: I couldn't check the Mobile-Expensify PRs in the checklist. I didn't reproduce the bug or confirm the backend behavior.

    Confidence: Low that any App PR caused this.


    Next Steps: Reply with @MelvinBot <your feedback> to refine this investigation.

  9. MelvinBot commented on Oct 29, 2026

    @MelvinBot
    Contributor

    ⚠️ Preliminary analysis (low confidence): treat this as a starting point, not a conclusion.

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

    Why: The bug only reproduces with the staging server on, and no App PR in this release changes the flow. On the App side, a blank cardholder list (with no loading skeleton) means the workspace member list (policy.employeeList) was empty when the page opened. The App never writes employeeList during this flow, so a server response must have emptied it. Likely suspects are the responses to OpenPolicyCompanyCardsPage / OpenPolicyCompanyCardsFeed (sent on reconnect) and AssignCard / unassign.

    To confirm:

    1. Reproduce the bug, then open Workspace > Members. If that list is empty too, the member list was cleared. If members show there but not in the assignee picker, member role values changed.
    2. Compare the staging and production responses for the four requests above. Look for a workspace update that replaces or drops employeeList.

    I couldn't check backend code or logs from here, so the backend cause is unverified.

    App-side evidence (commit 67eb990)
    • List source: the picker is built only from policy.employeeList. It skips deleted members and roles that can't create expenses: AssigneeStep.tsx:225-257.
    • Blank vs. loading: the skeleton depends only on areOptionsInitialized, not on employeeList: AssigneeStep.tsx:341. So a blank page with no skeleton means the filtered list was empty.
    • Empty, not filtered: with exactly one active member, the flow skips the picker and goes to confirmation. With zero, or two or more, it opens the picker: useAssignCard.ts:187-204. The owner is an admin and would pass the role filter, so a fully blank picker points to an empty employeeList rather than filtered entries.
    • Reconnect requests: going online calls OpenPolicyCompanyCardsPage, and the feed reload runs again: WorkspaceCompanyCardsPage.tsx:91-100.
    • No App write to employeeList: the App's optimistic data for assign and unassign only touches card and report keys: CompanyCards.ts:466-619. Any employeeList change must come from the server.
    • Possibly related: Guard against null workspace member entries in employeeList (merged 2026-10-20) notes that server updates can leave null entries in employeeList. It's already in production, so it isn't the cause here.

    Next Steps: Reply with @MelvinBot <your feedback> to refine this analysis.

  10. mjasikowski commented on Oct 29, 2026

    @mjasikowski
    Contributor

    Investigating

  11. m-natarajan commented on Oct 29, 2026

    @m-natarajan

    Unable to reproduce this in v9.5.25-0

    screen-20261029-153939-1793281141648.mp4
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.DeployBlockerIndicates it should block deploying the APIEngineeringHourlyKSv2

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions