Repository navigation
[Home Page] Surface overdue invoice awareness on Home in New Expensify - #100604
yuwenmemon merged 10 commits into
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 bun ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
Needs the parrot 🙏 |
|
@shawnborton @brunovjk One of you needs to 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] |
|
@MelvinBot can you trigger polyglot parrot? |
|
I can't trigger it — my token isn't allowed to dispatch workflows ( Why it never ran on its own: this PR comes from a fork (
if: ${{ github.event_name == 'workflow_dispatch' || !github.event.pull_request.head.repo.fork }}Both runs on your branch show To run it manually, an engineer with write access can either use the Generate static translations workflow → Run workflow → paste this PR's URL, or run: gh workflow run generateTranslations.yml --repo Expensify/App \
-f PULL_REQUEST_URL=https://github.com/Expensify/App/pull/100604The |
|
I gotchu |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f940655810
ℹ️ 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".
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.
|
Reviewer Checklist
Screenshots/VideosAndroid: HybridApp100604_android_native.movAndroid: mWeb Chrome100604_android_web.moviOS: HybridApp100604_ios_native.moviOS: mWeb Safari100604_ios_web.movMacOS: Chrome / SafariScreen.Recording.2026-09-16.at.11.49.03.movScreen.Recording.2026-09-16.at.11.48.26.mov |
|
@adamgrzybowski Could you confirm that Apart from that, everything looks good to me. |
|
@brunovjk, that's how I understood the issue, but to be extra safe, let's summon @flaviadefaria and @shawnborton. Is this alert meant to warn the billing owner before the grace period expires? Or after? We assumed that before. |
|
Hmm, but I guess we should keep the alert after and probably change the copy (or not?) |
|
@flaviadefaria, ready to test, but we will need 🦜 once again. @shawnborton, you were my good spirit last time with translations, so if I could ask you for a favor 🙏 BTW it would be great to get some accounts with real overdue issues to test this code |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 1c9ccac0..f9431d9d 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -990,7 +990,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: 'Fügen Sie Ihre Daten hinzu, um Ihre Expensify Karte anzuzeigen und zu verwenden.', subtitle: 'Expensify Karte', cta: 'Hinzufügen'},
enterSignerInfo: {title: 'Unterzeichnerdaten erforderlich', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Bankkonto ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Bezahlen Sie Ihre Rechnung bis zum ${date}, um Serviceunterbrechungen zu vermeiden`, cta: 'Überprüfen'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Bezahlen Sie Ihre Rechnung bis zum ${date}, um Serviceunterbrechungen zu vermeiden`,
+ cta: 'Prüfen',
+ dueSoonTitle: ({date}: {date: string}) => `Bezahlen Sie Ihre Rechnung bis zum ${date}, um eine Unterbrechung des Dienstes zu vermeiden`,
+ overdueTitle: 'Ihre Zahlung ist überfällig, bitte begleichen Sie Ihre Rechnung',
+ },
},
discoverSection: {
title: 'Entdecken',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index a0b4f8cf..868b7f16 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -1033,7 +1033,12 @@ const translations: TranslationDeepObject<typeof en> = {
title: 'Απαιτούνται στοιχεία υπογράφοντος',
subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Τραπεζικός λογαριασμός ${bankAccountLastFour}`,
},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Πληρώστε το τιμολόγιό σας έως ${date} για να αποφύγετε τη διακοπή της υπηρεσίας`, cta: 'Έλεγχος'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Πληρώστε το τιμολόγιό σας έως ${date} για να αποφύγετε τη διακοπή της υπηρεσίας`,
+ cta: 'Έλεγχος',
+ dueSoonTitle: ({date}: {date: string}) => `Πληρώστε το τιμολόγιό σας έως ${date} για να αποφύγετε τη διακοπή της υπηρεσίας`,
+ overdueTitle: 'Η πληρωμή σας έχει λήξει, παρακαλούμε εξοφλήστε το τιμολόγιό σας',
+ },
},
freeTrialSection: {
title: ({count}: {count: number}) => ({
diff --git a/src/languages/es.ts b/src/languages/es.ts
index ff40ffd4..116a4038 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -986,7 +986,12 @@ const translations: TranslationDeepObject<typeof en> = {
personalSubtitle: 'Billetera',
},
enterSignerInfo: {title: 'Se necesita la información del firmante', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Cuenta bancaria ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Paga tu factura antes del ${date} para evitar la interrupción del servicio`, cta: 'Revisar'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Paga tu factura antes del ${date} para evitar la interrupción del servicio`,
+ cta: 'Revisar',
+ dueSoonTitle: ({date}: {date: string}) => `Paga tu factura antes del ${date} para evitar la interrupción del servicio`,
+ overdueTitle: 'Tu pago está vencido, por favor paga tu factura',
+ },
},
freeTrialSection: {
title: ({count}: {count: number}) => ({
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index e9979551..dd71f77d 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -993,7 +993,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: 'Ajoutez vos informations pour voir et commencer à utiliser votre Carte Expensify.', subtitle: 'Carte Expensify', cta: 'Ajouter'},
enterSignerInfo: {title: 'Informations du signataire requises', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Compte bancaire ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Payez votre facture avant le ${date} pour éviter une interruption de service`, cta: 'Examiner'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Payez votre facture avant le ${date} pour éviter une interruption de service`,
+ cta: 'Examiner',
+ dueSoonTitle: ({date}: {date: string}) => `Payez votre facture avant le ${date} pour éviter une interruption de service`,
+ overdueTitle: 'Votre paiement est en retard, veuillez régler votre facture',
+ },
},
discoverSection: {
title: 'Découvrir',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index b98e32ab..da2debf8 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -991,7 +991,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: 'Aggiungi i tuoi dati per visualizzare e iniziare a usare la tua Carta Expensify.', subtitle: 'Carta Expensify', cta: 'Aggiungi'},
enterSignerInfo: {title: 'Informazioni del firmatario necessarie', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Conto bancario ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Paga la tua fattura entro il ${date} per evitare l’interruzione del servizio`, cta: 'Rivedi'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Paga la tua fattura entro il ${date} per evitare l’interruzione del servizio`,
+ cta: 'Rivedi',
+ dueSoonTitle: ({date}: {date: string}) => `Paga la tua fattura entro il ${date} per evitare l’interruzione del servizio`,
+ overdueTitle: 'Il tuo pagamento è in ritardo, ti preghiamo di saldare la fattura',
+ },
},
discoverSection: {
title: 'Scopri',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 761971f7..07f68ec7 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -978,7 +978,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: 'Expensify カードを表示して利用を開始するには、ご自身の情報を追加してください。', subtitle: 'Expensify カード', cta: '追加'},
enterSignerInfo: {title: '署名者情報が必要です', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `銀行口座 ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `サービス中断を防ぐために、${date} までに請求書をお支払いください`, cta: '確認'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `サービス中断を防ぐために、${date} までに請求書をお支払いください`,
+ cta: 'レビュー',
+ dueSoonTitle: ({date}: {date: string}) => `サービス中断を防ぐため、${date}までに請求書をお支払いください`,
+ overdueTitle: 'お支払いの期限が過ぎています。請求書をお支払いください。',
+ },
},
discoverSection: {
title: '発見',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 6b385b0d..9fe6dd34 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -989,7 +989,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: 'Voeg je gegevens toe om je Expensify Kaart te bekijken en te gebruiken.', subtitle: 'Expensify Kaart', cta: 'Toevoegen'},
enterSignerInfo: {title: 'Ondertekenaargegevens vereist', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Bankrekening ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Betaal je factuur vóór ${date} om onderbreking van de service te voorkomen`, cta: 'Beoordelen'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Betaal je factuur vóór ${date} om onderbreking van de service te voorkomen`,
+ cta: 'Beoordelen',
+ dueSoonTitle: ({date}: {date: string}) => `Betaal je factuur vóór ${date} om onderbreking van de service te voorkomen`,
+ overdueTitle: 'Je betaling is achterstallig, betaal alsjeblieft je factuur.',
+ },
},
discoverSection: {
title: 'Ontdekken',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index ab8c66e0..a0c03464 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -997,7 +997,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: 'Dodaj swoje dane, aby wyświetlić i zacząć używać swojej Karty Expensify.', subtitle: 'Karta Expensify', cta: 'Dodaj'},
enterSignerInfo: {title: 'Wymagane dane podpisującego', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Konto bankowe ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Opłać fakturę do ${date}, aby uniknąć przerwy w świadczeniu usług`, cta: 'Przegląd'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Opłać fakturę do ${date}, aby uniknąć przerwy w świadczeniu usług`,
+ cta: 'Przejrzyj',
+ dueSoonTitle: ({date}: {date: string}) => `Opłać fakturę do ${date}, aby uniknąć przerwy w świadczeniu usługi`,
+ overdueTitle: 'Twoja płatność jest zaległa, zapłać proszę swoją fakturę',
+ },
},
discoverSection: {
title: 'Odkryj',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index f798bad1..3154f319 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -989,7 +989,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: 'Adicione seus dados para visualizar e começar a usar seu Cartão Expensify.', subtitle: 'Cartão Expensify', cta: 'Adicionar'},
enterSignerInfo: {title: 'Informações do signatário necessárias', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `Conta bancária ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `Pague sua fatura até ${date} para evitar interrupção do serviço`, cta: 'Revisar'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `Pague sua fatura até ${date} para evitar interrupção do serviço`,
+ cta: 'Revisar',
+ dueSoonTitle: ({date}: {date: string}) => `Pague sua fatura até ${date} para evitar interrupção do serviço`,
+ overdueTitle: 'Seu pagamento está atrasado, por favor pague sua fatura',
+ },
},
discoverSection: {
title: 'Descobrir',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 6349fe39..dfbdc4ce 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -953,7 +953,12 @@ const translations: TranslationDeepObject<typeof en> = {
},
addVirtualCardPersonalDetails: {title: '添加你的详细信息以查看并开始使用 Expensify 卡。', subtitle: 'Expensify 卡', cta: '添加'},
enterSignerInfo: {title: '需要签署人信息', subtitle: ({bankAccountLastFour}: {bankAccountLastFour: string}) => `银行账户 ${bankAccountLastFour}`},
- payOverdueInvoice: {title: ({date}: {date: string}) => `请在 ${date} 前支付发票以避免服务中断`, cta: '审核'},
+ payOverdueInvoice: {
+ title: ({date}: {date: string}) => `请在 ${date} 前支付发票以避免服务中断`,
+ cta: '审核',
+ dueSoonTitle: ({date}: {date: string}) => `请在 ${date} 前支付您的发票,以避免服务中断`,
+ overdueTitle: '您的付款已逾期,请支付您的发票',
+ },
},
discoverSection: {
title: '发现',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
I don't think I have a policy that has bad billing, so unfortunately I can't test. |
|
In that case, we need a review, and we are good to go @brunovjk . The logic is quite simple, so I don't expect many problems |
|
Great, everything looks good to me. I updated the screenshot videos. |
|
We did not find an internal engineer to review this PR, trying to assign a random engineer to #100140 as well as to this PR... Please reach out for help on Slack if no one gets assigned! |
|
🚧 yuwenmemon has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/yuwenmemon in version: 9.4.81-0 🚀
|
|
🤖 Yes — help site changes were required. Draft PR: Docs updates for E/A#100604 overdue invoice alert on Home ( This PR added a new user-facing surface that the help site did not describe: a Time sensitive row on Home, shown to the Workspace owner when a subscription invoice is unpaid, with a Review button that opens invoices on the Spend page. Two articles needed updating:
UI label verification and one pre-existing naming issue I fixedI verified every label against the live web UI before writing:
Follow-up worth noting, not included in the docs PR: seven other articles still say "Time-sensitive" (the Global Reimbursement set, Audience claim: I documented the alert as Workspace-owner-only based on Checks run: @adamgrzybowski, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
@adamgrzybowski @brunovjk @shawnborton Could you please share additional steps how can we get the account with |
|
cc @flaviadefaria do you have a way to test this? |
I know a customer who’s in this situation, so I can check their account in Supportal using the test build. Other than that, I’m not quite sure how we’d test this. |
|
🚀 Deployed to production by https://github.com/luacmartins in version: 9.4.81-1 🚀
|
|
🚀 Deployed to production by https://github.com/luacmartins in version: 9.4.81-1 🚀
|

Explanation of Change
Reviewbutton.Reviewtakes the billing owner to the Spend page filtered to Invoices.Fixed Issues
$ #100140
PROPOSAL:
Tests
Offline tests
QA Steps
Reviewbutton and the invoice icon.Reviewand verify you land on the Spend page filtered to Invoices.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
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-09-08.at.16.39.03.mov