Add August product marketing window - #98565
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
…st-product-marketing-window
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx bun ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
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.
|
|
Screenshots and videos look good to me 👍 |
|
Great shout 👍 I like that idea. Would be nice to make a follow-up on that now cause we'll keep updating this each month I assume? |
|
Yup that makes sense. @KJ21-ENG thoughts on the idea before I make an issue? |
|
@shawnborton I loved the idea, as it had seemed off to me since last month when I was working on implementing this marketing window. All this time I had been thinking about how to make it load faster😅, but the spinner now makes more sense to me as well :) |
|
@shawnborton @dubielzyk-expensify Do you need an ad hoc build to test? |
|
Thoughts ? Screen.Recording.2026-08-17.at.10.14.49.AM.compressed.mp4 |
That looks good.
I'll kick one off |
|
🚧 dubielzyk-expensify 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! 🧪🧪
|
|
Can someone help run this translation? |
Screen.Recording.2026-08-17.at.12.45.19.mov@shawnborton When the Product Marketing Window is showing the Admins Case Window and we delete all workspaces, it changes to the Employee Case Window because there’s no workspace. Is this expected behavior, or should we hide the Product Marketing Window instead? |
Reviewer Checklist
Screenshots/VideosMacOS: Chrome / SafariScreen.Recording.2026-08-17.at.12.51.56.mp4 |
IMO, I think the current behavior makes sense and this is more of a product decision. Once the last workspace is deleted, the user no longer matches the Admin audience and now matches the Employee audience, so switching the window feels more consistent than hiding it. Hiding it here would add a special suppression path even though the user hasn’t dismissed or acted on the campaign. cc: @huult @shawnborton |
|
That makes sense to me. What about the cases where you are admin of one workspace but an employee on another - how are we handling that? |
|
@shawnborton In that mixed case, the admin variant takes precedence. We check whether the user is an admin of any active workspace. If the currently active workspace is one they administer, the CTA uses that workspace; otherwise, we fall back to their first active admin workspace. The employee variant is only shown when they aren’t an admin of any active workspace, so being an employee in another workspace won’t change the targeting or point the CTA somewhere they lack admin access. cc: @huult |
|
Interesting, I kinda think the employee case is still important to show (specifically in this case for agents). I would think we should do something where we display the employee modal maybe X days after the admin modal was dismissed or something? cc @Expensify/product @danielrvidal for thoughts there. |
|
(The image loading spinner looks great btw, thanks for squeezing that in here!) |
Quite interesting; eager to hear what others think. |
joekaufmanexpensify
left a comment
There was a problem hiding this comment.
Good for product
|
#98565 (comment) Still waiting for the final decision. |
@KJ21-ENG Did you update the loading spinner in this PR? I didn’t see the change. |
I'm not passionate about showing it twice. We're going to be doing these once a month already at a minimum with the product updates so it feels like it could be a lot if there are always feature advertisements. I'm also not passionate about not doing them. @JmillsExpensify might have some thoughts though too. |
Ahh, strange, seems like due to yesterday's GitHub downtime, my comment did not get published and fell in draft. Actually, I haven't pushed it to this PR yet. I was asking whether I should push it in this PR itself or we should handle it in a separate issue/PR for better traceability. I am OK with both of them, as I have changes ready in my local. |









Explanation of Change
Replaces the July product marketing announcement with the August admin and eligible member variants and their supplied images. The admin CTA uses the selected admin workspace's hydrated accounting connections to route to Vendors when enabled, or safely falls back to More Features while offline or after a failed connection refresh. Members with Custom Agent access can open the new Agents flow without bypassing its beta boundary. Dismissal remains campaign-keyed and is persisted before navigation.
Fixed Issues
$ #98233
PROPOSAL: #98233 (comment)
Tests
ProductMarketingWindowappear in the JS console.ProductMarketingWindowappear in the JS consoleOffline tests
QA Steps
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, 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.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
Record_2026-08-16-03-39-38_40d2c9e2d8fb5b5aba3904834590021e.compressed.mp4
Android: mWeb Chrome
Record_2026-08-15-12-10-46.mp4
iOS: Native
Simulator.Screen.Recording.-.iPhone.17.-.2026-08-15.at.17.24.55.compressed.mp4
iOS: mWeb Safari
Simulator.Screen.Recording.-.iPhone.17.-.2026-08-15.at.14.26.29.compressed.mp4
MacOS: Chrome / Safari
Pre-review POC evidence from the earlier candidate. This does not replace final-head, all-platform recordings.
Member marketing window:
Admin marketing window:
More Features fallback:
Direct Vendors destination:
Video:
Screen.Recording.2026-08-13.at.11.43.16.AM.compressed.mp4