Introduce free trial countdown pop-up - #84049
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 |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@shubham1206agra 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] |
|
Asking for the Spanish translation: https://expensify.slack.com/archives/C01GTK53T8Q/p1772555174811579 |
|
@Expensify/design can you please review this PR to verify the pop-up styles? Thanks |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f21e45eaa1
ℹ️ 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".
|
@dylanexpensify I found 1 issue: We're checking the trial plan by using |
|
@dylanexpensify by the way, we also need BE changes to allow for updating |
|
Can we get mobile screenshots as well? Desktop is looking good |
JmillsExpensify
left a comment
There was a problem hiding this comment.
We saw a big uplift with this modal. Let's get it in product!
Re: this, free trials only apply to workspaces. So if no workspace, no free trial. |
|
Thank you, @dylanexpensify. Can you please request a BE member to handle this issue |
@dubielzyk-expensify I added the video for iOS Safari. Can you please take a look? I'll record the videos for other platforms when the BE is ready |
|
That looks right to me. @Expensify/design for extra 👀 |
@dukenv0307 I am not sure what the problem is, sometimes I see the modal like this (with no backdrop). Can you look into this? |
|
@dukenv0307 Your case 3 test is broken. It's not showing countdown This works for me const today = new Date();
const firstDay = new Date(today);
firstDay.setDate(today.getDate() - 29); // → currentTrialDay = 29
const lastDay = new Date(firstDay);
lastDay.setDate(firstDay.getDate() + 30); // → remaining ≈ 2 days (skips last24h)
const fmt = (d) => d.toISOString().replace('T', ' ').split('.')[0];
// Dismissed during day 29 (firstDay + 28d at 00:00 UTC)
const dismissedDuringDay29 = new Date(firstDay);
dismissedDuringDay29.setUTCDate(firstDay.getUTCDate() + 29);
dismissedDuringDay29.setUTCHours(0, 0, 0, 0);
Onyx.merge('nvp_private_firstDayFreeTrial', fmt(firstDay));
Onyx.merge('nvp_private_lastDayFreeTrial', fmt(lastDay));
Onyx.merge('nvp_expensify_billingFundID', null);
Onyx.merge('nvp_dismissedTrialPaymentReminder', dismissedDuringDay29.toISOString()); |
|
@dukenv0307 Bump here |
|
@shubham1206agra I'll check it today |
|
🚧 grgia has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
@shubham1206agra I tried many times but still can't reproduce. It seems unrelated to this issue But I found another issue while testing: the modal shows again when I clear cache and restart. And I fixed it |
I can check it since I can access BE code |
Reviewer Checklist
Screenshots/VideosScreen.Recording.2026-07-07.at.4.55.10.PM.movScreen.Recording.2026-07-07.at.6.59.41.PM.movScreen.Recording.2026-07-07.at.7.08.04.PM.mov |
grgia
left a comment
There was a problem hiding this comment.
please comment on https://github.com/Expensify/App/pull/84049/changes#r3570618992 before we merge
@dukenv0307 @shubham1206agra
|
🚧 grgia 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! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/grgia in version: 9.4.34-0 🚀
|
Help site review — no changes requiredI reviewed the changes in this PR against the help articles under What this PR does: it introduces the free trial countdown pop-up (Trial Payment Reminder Modal) — an in-app reminder that nudges free-trial users to add a payment card before their trial ends. It's a UX nudge that surfaces an existing action; it doesn't add a new user-facing feature, setting, tab, or workflow that would need documentation. Why no docs change: the underlying behavior the pop-up promotes is already documented:
Per the Help Authoring Guidelines, help articles document how to use features and complete workflows — not every in-app reminder or promotional prompt. This modal adds no capability or step that isn't already covered, so no draft docs PR was created. Note: browser-based verification of the live UI was unavailable in this run (web prep failed), so feature/label names were confirmed against the PR code and existing help articles rather than the running app. |
|
Deploy Blocker #96056 was identified to be related to this PR. |
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.4.34-14 🚀
|
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.4.34-14 🚀
Bundle Size Analysis (Sentry): |

Explanation of Change
Fixed Issues
$ #84022
PROPOSAL:
Tests
Case 1: With 1, 2, 3, 7 and 15 days
Title: "Stay Ahead of the Deadline”
Subtitle: “Don’t wait until the last minute, add your payment method today to ensure continuous access to your expenses on Expensify.”
Button: “Add payment card” (redirecting to /settings/subscription/add-payment-card)
Button: “Close” (closes the pop-up)
Case 2: With 28, 29
“Trial ends in X days” (3 or 2 days)
Title: ”Stay Ahead of the Deadline”
Subtitle: “Don’t wait until the last minute, add your payment method today to ensure continuous access to your expenses on Expensify.”
Button: “Add payment card” (to /settings/subscription/add-payment-card)
Button: “Close” (closes the pop-up)
Case 3: On the last 24h
“Trial ends in 00h : 00m : 00s” (Countdown)
Title: ”Stay Ahead of the Deadline”
Subtitle: “Don’t wait until the last minute, add your payment method today to ensure continuous access to your expenses on Expensify.”
Button: “Add payment card” (redirecting to /settings/subscription/add-payment-card)
Button: “Close” (closes the pop-up)
Case 4: Open the free trial countdown popup after the app review modal
Offline tests
QA Steps
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
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
Screen.Recording.2026-03-04.at.21.36.43.mov
MacOS: Chrome / Safari
Screen.Recording.2026-03-03.at.23.13.16.mov
Screen.Recording.2026-03-03.at.23.13.40.mov