[Payment due @ChavdaSachin] Onboarding: drop cohort gate now that server generates per-tier welcome#89469
Conversation
The Web-Expensify side (#52519) generates the full bespoke welcome body server-side from a per-tier template, so the App-side cohort gate that previously required either Phase-1 (MICRO) cohort or the suggestedFollowups beta is no longer needed. Every MANAGE_TEAM signup now opts into the bespoke direct-post path; the server picks the right copy based on companySize and attaches the guide block when an eligible guide is on the policy. getBespokeWelcomeMessage's optimistic placeholder is reshaped to match the server's per-tier skeleton (header + Concierge intro + per-tier hint, no guide block) so the hand-off when the server response reconciles is visually continuous — the only change on reconciliation is the guide block appearing for non-MICRO cohorts.
Now that prepareOnboardingOnyxData no longer reads betas/betaConfiguration, clear the supporting plumbing: - Remove the betaConfiguration Onyx.connect (one no-onyx-connect seatbelt entry). - Drop the BetaConfiguration type import. - Stop destructuring betas in prepareOnboardingOnyxData; keep an optional `betas?` field on PrepareOnboardingOnyxDataParams so existing callers keep type-checking.
|
@ChavdaSachin Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e159a01d77
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
…rding - Optimistic placeholder header changes from "Welcome to Expensify 👋" to "Your free trial has started! Let's get you set up." across all four tiers. - 1-10 body drops the "I'm Concierge, and I'll help you get set up." opening so the placeholder mirrors what the server posts. - 11-100 / 101-1000 / 1001+ bodies unchanged. Keeps the optimistic→reconciled hand-off visually continuous when the server's reportActionID reconciliation lands.
…ize param Both tiers now share identical optimistic placeholder copy (header + Concierge intro + closing CTA). The only structural difference between 1-4 and 5+ cohorts is the guide block, which the server inserts on reconciliation via optimisticConciergeReportActionID — not something the App needs to know about. Removes the companySize switch and the per-tier string divergence that existed only to mirror what the server would eventually generate.
Server is now sole source of truth for admins room welcome content. App no longer builds an optimistic bespoke action, only generates optimisticConciergeReportActionID as a dedup key for the server's addComment call. This prevents the A to B content flash that occurred when the server's generated message replaced the App's optimistic message.
…ks change - Update tests that used MANAGE_TEAM + SMALL to stay on the tasks path; they now use LOOKING_AROUND since every MANAGE_TEAM signup uses followups - Rewrite "without suggestedFollowups beta" test to verify the new behavior (MANAGE_TEAM always produces followups, never tasks) - Replace "dedup" with "deduplication" in two comments to pass cspell
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
Ok this one is now ready for review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4f17b1a477
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
MANAGE_TEAM always produces an empty `tasks` array, so the `.filter()` and `.map()` callbacks never execute for that choice. Three blocks were unreachable: - Feature-gating filter based on `selectedInterestedFeatures` (MANAGE_TEAM branch) - VIEW_TOUR skip guarded by `engagementChoice === MANAGE_TEAM` - `emailCreatingAction` ternary that always resolved to CONCIERGE for non-MANAGE_TEAM callers
- Fix lastVisibleActionCreated advancing without an optimistic action on the MANAGE_TEAM path: add `shouldUseFollowupsInsteadOfTasks ||` to the skip condition so the field is never set when followups replace tasks. - Remove `betas` from PrepareOnboardingOnyxDataParams, CompleteOnboardingProps, and getGuidedSetupDataForOpenReport — the field was accepted but never consumed once the beta gate was removed. Drop from all callers and tests.
Remove unused TASK_TO_FEATURE import from ReportUtils.ts, remove unused selectedInterestedFeatures from PrepareOnboardingOnyxDataParams and its consumers, remove unused betas destructuring from buildPolicyData and openReport while keeping betas in BuildPolicyDataOptions type so existing callers are unaffected.
|
@codex review. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 86e23d6caf
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| ...(shouldUseFollowupsInsteadOfTasks || (skipSignOff && !message) ? {} : {lastVisibleActionCreated}), | ||
| lastActorAccountID: actorAccountID, | ||
| }, |
There was a problem hiding this comment.
Avoid updating last actor when no action is posted
In the MANAGE_TEAM followups path, this merge now skips lastVisibleActionCreated but still writes lastActorAccountID, even though no optimistic report action is added for that actor in this request. That leaves report metadata in an inconsistent state (actor changed without a corresponding visible action), which can cause incorrect sidebar preview/unread attribution until the server message arrives, especially on slow/offline connections.
Useful? React with 👍 / 👎.
|
@marcochavezf, I don't see the setup specialist's name. Also, the calendar link wasn't working. |
Yup this is expected on staging
|
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / SafariScreen.Recording.2026-05-20.at.6.41.41.PM.movScreen.Recording.2026-05-20.at.7.30.30.PM.mov |
|
🎯 @ChavdaSachin, thanks for reviewing and testing this PR! 🎉 A payment issue will be created for your review once this PR is deployed to production. If payment is not needed (e.g., regression PR review fix etc), react with 👎 to this comment to prevent the payment issue from being created. |
|
🚧 @marcochavezf has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/marcochavezf in version: 9.3.79-1 🚀
Bundle Size Analysis (Sentry): |
|
No help site changes required. This PR is a purely internal refactor — it removes the client-side cohort gate and The existing help site articles that reference the #admins welcome, Setup Specialists, and free trials (e.g., |
|
Deploy Blocker #91384 was identified to be related to this PR. |
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.3.79-4 🚀
|
|
🤖 Payment issue created: #91474 |

Explanation of Change
Removes the client-side cohort gate that limited the bespoke direct-post
#adminswelcome to MICRO-size signups. Every MANAGE_TEAM signup now goes through the bespoke path — the welcome body is generated server-side, so the App no longer needsgetBespokeWelcomeMessage()or thesuggestedFollowupsbeta gate.Fixed Issues
$ https://github.com/Expensify/Expensify/issues/621176
PROPOSAL: N/A — paired with Web-Expensify#52519.
Tests
#adminsand verify the bespoke "Your free trial has started!" welcome appears.Offline steps
N/A — the change removes a client-side beta gate; offline behavior is unchanged.
QA Steps
+email.#adminsand confirm the bespoke welcome message appears.PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
To be captured during QA.
Android: mWeb Chrome
To be captured during QA.
iOS: Native
To be captured during QA.
iOS: mWeb Safari
To be captured during QA.
MacOS: Chrome / Safari
Screen.Recording.2026-05-20.at.1.14.48.p.m.mov