Skip to content

Commit 2e6571d

Browse files
committed
Merge branch 'main' into collectioneur/transition-tracker-v2
2 parents 9c0cd5e + e8861fe commit 2e6571d

303 files changed

Lines changed: 9767 additions & 3771 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/skills/playwright-app-testing/SKILL.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,19 @@ When signing in to dev environment:
4141
- **Email**: Generate random Gmail address (e.g., `user+throwaway<random>@gmail.com`)
4242
- **New Account**: Press join to create account
4343
- **Existing Account**: Magic code: Always `000000`
44-
- **Onboarding**: Skip all optional steps
44+
- **Onboarding**: The `SKIP_ONBOARDING` env flag is set to `false` by default in `.env`. When `false`, onboarding screens will appear after sign-in for new accounts. Unless you are specifically asked to test onboarding, update the flag to `true` before starting the dev server so that onboarding is bypassed entirely:
45+
```bash
46+
sed -i '' 's/SKIP_ONBOARDING=false/SKIP_ONBOARDING=true/' .env
47+
```
48+
If you need to test onboarding flows, set it back to `false`:
49+
```bash
50+
sed -i '' 's/SKIP_ONBOARDING=true/SKIP_ONBOARDING=false/' .env
51+
```
52+
You can check the current value with:
53+
```bash
54+
grep SKIP_ONBOARDING .env
55+
```
56+
**Important**: After changing `SKIP_ONBOARDING` in `.env`, the web dev server must be restarted for the change to take effect.
4557

4658
## Example Usage
4759

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ SECURE_NGROK_URL=https://secure-expensify-user.ngrok.io/
99
NGROK_URL=https://expensify-user.ngrok.io/
1010
USE_NGROK=false
1111
USE_WEB_PROXY=false
12+
SKIP_ONBOARDING=false
1213
USE_WDYR=false
1314
USE_REDUX_DEVTOOLS=false
1415
CAPTURE_METRICS=false

.github/workflows/buildAndroid.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ jobs:
183183
comment-bot: false
184184
rock-build-extra-params: ${{ inputs.variant == 'Adhoc' && '--extra-params "-PreactNativeArchitectures=arm64-v8a,x86_64 --profile"' || '--extra-params "--profile"' }}
185185
custom-identifier: ${{ steps.computeIdentifier.outputs.IDENTIFIER }}
186-
validate-elf-alignment: false
186+
validate-elf-alignment: true
187187

188188
- name: Upload Gradle profile report
189189
if: always()

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ android {
111111
minSdkVersion rootProject.ext.minSdkVersion
112112
targetSdkVersion rootProject.ext.targetSdkVersion
113113
multiDexEnabled rootProject.ext.multiDexEnabled
114-
versionCode 1009032704
115-
versionName "9.3.27-4"
114+
versionCode 1009032804
115+
versionName "9.3.28-4"
116116
// Supported language variants must be declared here to avoid from being removed during the compilation.
117117
// This also helps us to not include unnecessary language variants in the APK.
118118
resConfigs "en", "es"

config/webpack/webpack.common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const includeModules = [
5757
'expo',
5858
'expo-audio',
5959
'expo-video',
60+
'expo-image',
6061
'expo-image-manipulator',
6162
'expo-modules-core',
6263
'victory-native',

cspell.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@
8686
"billpay",
8787
"Billpay",
8888
"blahblahblah",
89+
"BMO",
90+
"BNDCCAMM",
91+
"BOFMCAM2",
8992
"blakeembrey",
9093
"blankrows",
9194
"BNDL",
@@ -118,7 +121,10 @@
118121
"cdfbmo",
119122
"Certinia",
120123
"Certinia's",
124+
"CCDQCAMM",
121125
"CFPB",
126+
"CIBC",
127+
"CIBCCATT",
122128
"chargeback",
123129
"Charleson",
124130
"Checkmark",
@@ -171,6 +177,7 @@
171177
"delegators",
172178
"delish",
173179
"deployers",
180+
"Desjardins",
174181
"describedby",
175182
"Deutsch",
176183
"devportal",
@@ -308,6 +315,7 @@
308315
"Highlightable",
309316
"Hoverable",
310317
"HRMS",
318+
"HKBCCATT",
311319
"HSBCSGS",
312320
"Humpty",
313321
"hybridapp",
@@ -469,6 +477,7 @@
469477
"noprompt",
470478
"nosymbol",
471479
"Noto",
480+
"NOSCCATT",
472481
"NSQS",
473482
"NSQSOAuth",
474483
"NSURL",
@@ -568,6 +577,7 @@
568577
"RCTI18nUtil",
569578
"RCTIs",
570579
"RCTURL",
580+
"RBC",
571581
"reactnative",
572582
"reactnativebackgroundtask",
573583
"reactnativehybridapp",
@@ -608,6 +618,7 @@
608618
"Roni",
609619
"Rosiclair",
610620
"rpartition",
621+
"ROYCCAT2",
611622
"RPID",
612623
"RRGGBB",
613624
"rstrip",
@@ -621,8 +632,10 @@
621632
"SBFJ",
622633
"Scaleway",
623634
"Scaleway's",
635+
"SCANREADY",
624636
"schedulable",
625637
"Schengen",
638+
"Scotiabank",
626639
"Schiffli",
627640
"SCIM",
628641
"sdkmanager",
@@ -705,6 +718,7 @@
705718
"TOTP",
706719
"touchables",
707720
"Touchless",
721+
"TDOMCATTTOR",
708722
"TQBQW",
709723
"Trainline",
710724
"tranid",

docs/articles/new-expensify/getting-started/Expensify-Home-Overview.md

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
22
title: Expensify Home Overview
33
description: Learn what you’ll see on Home and how it helps you understand what needs attention, get oriented, and stay informed when you sign in.
4-
keywords: [Expensify Home, Home, Home tab, For you, Discover, Announcements, time-sensitive, urgent alerts, Expensify Card fraud, broken bank connection]
5-
internalScope: Audience is all Expensify members. Covers what Home is and what appears on it, including the For you, Discover, Announcements, and Time-sensitive sections. Does not cover how to complete actions like submitting, approving, paying, exporting, or fixing expenses.
4+
keywords: [New Expensify, Expensify Home, Home, Home tab, For you, Discover, Announcements, time-sensitive, urgent alerts, Expensify Card fraud, broken bank connection, assigned cards. Expensify Card limit, available limit, available balance]
5+
internalScope: Audience is all Expensify members. Covers what Home is and what appears on it, including the For you, Discover, Announcements, Time-sensitive, and Assigned cards sections. Does not cover how to complete actions like submitting, approving, paying, exporting, or fixing expenses.
66

77
---
88

@@ -12,7 +12,7 @@ internalScope: Audience is all Expensify members. Covers what Home is and what a
1212

1313
It gives you a quick way to see whether anything needs attention, get oriented, and check what’s new, without having to dig through menus or reports.
1414

15-
![Home on New Expensify]({{site.url}}/assets/images/home-1.png){:width="100%"}
15+
![Home on New Expensify]({{site.url}}/assets/images/home.png){:width="100%"}
1616

1717
---
1818

@@ -34,6 +34,7 @@ Home includes:
3434
- **For you**
3535
- **Discover**
3636
- **Announcements**
37+
- **Assigned cards** (when applicable)
3738

3839
Each section provides context so you know where to go next.
3940

@@ -83,6 +84,14 @@ This section helps you stay informed about what’s new or recently changed in N
8384

8485
---
8586

87+
## How the Assigned cards section works on Home
88+
89+
The **Assigned cards** section shows all Expensify Cards assigned to you, along with the available spending limit for each card.
90+
91+
Use this section to quickly check how much you can spend before making a purchase. The available limit updates automatically as transactions are made.
92+
93+
---
94+
8695
# FAQ
8796

8897
## What is Home for?
@@ -101,7 +110,13 @@ Not directly. Home links you to other parts of Expensify where actions are compl
101110

102111
If there are no current financial to-dos, the **For you** section may appear empty. This means there’s nothing that requires action at that time.
103112

104-
## Why don’t I see the time-sensitive section?
113+
## Why don’t I see the Time-sensitive section?
105114

106115
The **Time-sensitive** section only appears when there is an urgent issue or limited-time action that requires attention. If everything is up to date, this section will not be visible.
107116

117+
## Why don’t I see the Assigned cards section?
118+
119+
The **Assigned cards** section only appears if you have an active **Expensify Card** assigned to you.
120+
121+
If you don’t have an Expensify Card assigned, or your assigned card isn’t active, the **Assigned cards** section won’t be visible.
122+

docs/articles/new-expensify/reports-and-expenses/Reimbursement-Failure-Reasons.md

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
---
22
title: Reimbursement Failure Reasons in Expensify
3-
description: Learn why a reimbursement failed in Expensify, what each Corpay ACH return reason means, and how Workspace Admins and members can fix and retry the payment.
4-
keywords: reimbursement failed, reimbursement unsuccessful, ACH bounce, Corpay return code, payment bounced, report returned to Approved, bank account name mismatch, retry reimbursement, Workspace Admin, update bank account Expensify
5-
internalScope: Audience is Workspace Admins and members who submit reports. Covers Corpay ACH return reason messages, what each reimbursement failure means, and how to resolve and retry payment. Does not cover bank account setup steps in detail, accounting integrations, non-ACH payments, or non-Corpay failures.
3+
description: Learn why a reimbursement failed in Expensify, what each reimbursement failure reason means, and how Workspace Admins and members can fix and retry the payment.
4+
keywords: reimbursement failed, reimbursement unsuccessful, ACH bounce, return code, payment bounced, report returned to Approved, bank account name mismatch, retry reimbursement, Workspace Admin, update bank account Expensify, Canadian bank account format, Singapore bank account, institution code, SWIFT code, EFT
5+
internalScope: Audience is Workspace Admins and members who submit reports. Covers reimbursement failure (return reason) messages, what each reimbursement failure means, and how to resolve and retry payment. Does not cover bank account setup steps in detail, accounting integrations, non-ACH payments, or failures from other payment providers.
66
---
77

88
When a reimbursement fails in Expensify, you’ll see a message in the report chat explaining why the payment was unsuccessful.
99

10-
The report automatically returns to **Approved** status so the issue can be fixed and the payment can be retried.
10+
The report automatically returns to **Approved** status so the issue can be fixed and the payment can be retried. The bank account is also removed from the submitter's Expensify Wallet to avoid further failures.
1111

12-
This article explains the most common Corpay ACH return reasons, what they mean, and exactly what to do next.
12+
This article explains the most common reimbursement failure reasons, what they mean, and exactly what to do next.
1313

1414
---
1515

1616
# What Happens When a Reimbursement Fails in Expensify
1717

18-
If an ACH reimbursement fails:
18+
If a reimbursement fails:
1919

2020
- A message appears in the report chat with the failure reason.
21-
- The report moves from **Processing** back to **Approved**.
21+
- The report moves from **Paid** back to **Approved**.
22+
- The report submitter must add their bank account to Expensify (either a different account, or the same one with corrected information). (Follow the instructions in [Connect a Personal Bank Account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account).)
2223
- A Workspace Admin must retry the payment after the issue is resolved.
2324

2425
---
@@ -40,7 +41,7 @@ Example:
4041
**How to fix it:** The member should:
4142

4243
1. Confirm the exact account holder name with their bank.
43-
2. Update their bank account name in Expensify to match exactly.
44+
2. [Reconnect their bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account) using the exact name on file with the bank.
4445

4546
Even small differences like nicknames, missing middle initials, or extra spaces can cause ACH rejection.
4647

@@ -53,7 +54,7 @@ The account holder name provided in Expensify does not match the name on file wi
5354
**How to fix it:** The member should:
5455

5556
1. Contact their bank to confirm the exact account holder name.
56-
2. Update their bank account details in Expensify so the name matches exactly.
57+
2. [Reconnect their bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account) using the exact name on file with the bank.
5758
3. Notify the Workspace Admin once updated so the payment can be retried.
5859

5960
---
@@ -67,27 +68,28 @@ The payment was sent as a personal reimbursement, but the bank account is regist
6768
- Personal bank account
6869
- Business bank account
6970

70-
Then update the connected bank account in Expensify to match.
71+
Then [reconnect the correct bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account) in Expensify.
7172

7273
---
7374

7475
## The Account Name Matches for a Personal Account
7576

7677
The payment was sent as a business reimbursement, but the connected account is a personal account.
7778

78-
**How to fix it:** Confirm the intended account type and reconnect the correct bank account in Expensify.
79+
**How to fix it:** Confirm the intended account type and [reconnect the correct bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account) in Expensify.
7980

8081
---
8182

8283
## Account Not Found
8384

8485
The account number or routing number does not correspond to a valid bank account.
8586

87+
For Canadian banks, ensure the account number matches the format required for your bank and transfer type (see [Canadian bank account formats](#canadian-bank-account-formats)).
88+
8689
**How to fix it:** The member should:
8790

8891
1. Double-check their account and routing numbers.
89-
2. Remove the incorrect bank connection.
90-
3. Reconnect their bank account with the correct details.
92+
2. [Reconnect their bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account) with the correct details.
9193

9294
---
9395

@@ -98,7 +100,7 @@ The bank account has been migrated, closed, or transferred to a new account numb
98100
**How to fix it:** The member should:
99101

100102
1. Confirm their current bank account details.
101-
2. Reconnect their bank account in Expensify using the updated information.
103+
2. [Reconnect their bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account) in Expensify using the updated information.
102104

103105
---
104106

@@ -108,18 +110,42 @@ The bank does not support account name verification for this account type.
108110

109111
Expensify cannot automatically verify the account holder name through the bank.
110112

111-
**What to do:** Manually confirm the account details with the member, then retry the payment once confirmed.
113+
**What to do:** Manually confirm the account details with the member. The member must [reconnect their bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account), then the Workspace Admin can retry the payment.
112114

113115
---
114116

115117
## Unable to Check Account Name
116118

117119
The account holder opted out of name verification at their bank.
118120

119-
**What to do:** Verify the bank details directly with the member, then retry the reimbursement once confirmed.
121+
**What to do:** Verify the bank details directly with the member. The member must [reconnect their bank account](https://help.expensify.com/articles/new-expensify/wallet-and-payments/Connect-a-Personal-Bank-Account), then the Workspace Admin can retry the reimbursement.
122+
123+
---
124+
## Canadian bank account formats for Expensify reimbursements
125+
## Canadian bank account formats
126+
127+
Reimbursements to Canadian banks can fail if the account number or institution details don't match the bank's required format. Formats differ by bank and by transfer type (e.g. CAD wires, USD wires, EFT). Use the table below as a reference for institution codes, SWIFT codes, and account number formats.
128+
129+
130+
| Bank name | Institution code | SWIFT code | A/C no. CAD wires | A/C no. USD wires | A/C no. CAD/USD EFT |
131+
| --------- | ---------------- | ---------- | ----------------- | ----------------- | ------------------- |
132+
| RBC (Royal Bank of Canada) | 0003 | ROYCCAT2 | 12 digits (5-digit transit + 7-digit account; must begin with 1 or 5) | 12 digits (must begin with 4) | 7 digits |
133+
| BMO (Bank of Montreal) | 0001 | BOFMCAM2 | 11 digits (first 4 digits transit + account; must begin with 1) | 7 or 11 digits (must begin with 4) | 7 digits |
134+
| CIBC (Canadian Imperial Bank of Commerce) | 0010 | CIBCCATT | 7 digits | 7 digits | 7 digits |
135+
| TD (Toronto-Dominion Bank) | 0004 | TDOMCATTTOR | 11 digits (first 4 digits transit; account begins with 5 or 6) | First 4 digits transit; account 7 or 11 digits (must begin with 7) | 11 digits |
136+
| HSBC (HSBC Bank Canada) | 0016 | HKBCCATT | 9–12 digits | 9–12 digits | 9 digits |
137+
| National Bank of Canada | 0006 | BNDCCAMM | 7 digits | 7 digits | 7 digits |
138+
| Scotiabank | 0002 | NOSCCATT | 12 digits (5-digit transit + 7-digit account) | 12 digits | 7 digits |
139+
| Desjardins | 0865 | CCDQCAMM | Contact bank / format may vary | Contact bank / format may vary | Contact bank / format may vary |
120140

121141
---
122142

143+
## Singaporean bank account formats
144+
145+
Review the FAQ in [Connect a Personal Bank Account](https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account#i-cant-find-all-the-details-for-my-bank-in-singapore-that-you-require-where-can-i-find-them) to confirm your SGD account has been correctly entered.
146+
## Singaporean bank account formats for Expensify reimbursements
147+
---
148+
123149
# How Workspace Admins Retry a Failed Reimbursement in Expensify
124150

125151
If you're a Workspace Admin, follow these steps:
@@ -175,13 +201,13 @@ No. The report returns to **Approved** status. A Workspace Admin must manually c
175201

176202
## How long does a retried reimbursement take to process?
177203

178-
Retried payments follow the same ACH processing timeline as the original payment.
204+
Retried payments follow the same processing timeline as the original payment. Domestic payments follow local processing timelines, and cross-border payments follow wire transfer timelines.
179205

180206
---
181207

182208
## What if a reimbursement failure message not listed here appears?
183209

184-
If the message appears as a raw return reason from Corpay and is unclear:
210+
If the message appears as a detailed return reason from the payment processor and is unclear:
185211

186212
- Workspace Admins can review the full message in the report chat.
187213
- If additional help is needed, contact Concierge with the exact error message.
@@ -190,9 +216,4 @@ If the message appears as a raw return reason from Corpay and is unclear:
190216

191217
## Does this article apply to all reimbursement failures?
192218

193-
No. This article covers ACH reimbursement failures processed through Corpay. It does not apply to:
194-
195-
- International wire payments
196-
- Non-ACH payment methods
197-
- Accounting sync issues
198-
- Bank connection setup errors
219+
This article applies to all employee reimbursement failures. Invoice payment failures are not currently displayed in the report history.

ios/NewExpensify/Info.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<key>CFBundlePackageType</key>
2424
<string>APPL</string>
2525
<key>CFBundleShortVersionString</key>
26-
<string>9.3.27</string>
26+
<string>9.3.28</string>
2727
<key>CFBundleSignature</key>
2828
<string>????</string>
2929
<key>CFBundleURLTypes</key>
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.3.27.4</string>
47+
<string>9.3.28.4</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

0 commit comments

Comments
 (0)