diff --git a/.env.example b/.env.example
index c4adc4f98b65..2bdda890b2ef 100644
--- a/.env.example
+++ b/.env.example
@@ -14,6 +14,7 @@ ONYX_METRICS=false
USE_THIRD_PARTY_SCRIPTS=false
EXPENSIFY_ACCOUNT_ID_ACCOUNTING=-1
+EXPENSIFY_ACCOUNT_ID_ACCOUNTS_PAYABLE=-1
EXPENSIFY_ACCOUNT_ID_ADMIN=-1
EXPENSIFY_ACCOUNT_ID_BILLS=-1
EXPENSIFY_ACCOUNT_ID_CHRONOS=-1
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 459a780ca8b4..f4f6a90ae6db 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -85,7 +85,7 @@ This is a checklist for PR authors. Please make sure to complete all tasks and c
- [ ] I verified that comments were added to code that is not self explanatory
- [ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
- [ ] I verified any copy / text shown in the product is localized by adding it to `src/languages/*` files and using the [translation method](https://github.com/Expensify/App/blob/4bd99402cebdf4d7394e0d1f260879ea238197eb/src/components/withLocalize.js#L60)
- - [ ] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
+ - [ ] If any non-english text was added/modified, I used [JaimeGPT](https://chatgpt.com/g/g-2dgOQl5VM-english-to-spanish-translator-aka-jaimegpt) to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
- [ ] I verified all numbers, amounts, dates and phone numbers shown in the product are using the [localization methods](https://github.com/Expensify/App/blob/4bd99402cebdf4d7394e0d1f260879ea238197eb/src/components/withLocalize.js#L60-L68)
- [ ] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
- [ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
diff --git a/.github/workflows/androidBump.yml b/.github/workflows/androidBump.yml
index 8a4f7d514208..b2276551852f 100644
--- a/.github/workflows/androidBump.yml
+++ b/.github/workflows/androidBump.yml
@@ -1,6 +1,7 @@
name: Android Rollout Bumper
on:
+ workflow_dispatch:
schedule:
# Runs at midnight every day
- cron: '0 0 * * *'
diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml
index 49f3d23ec02c..d7784e2f610b 100644
--- a/.github/workflows/buildAndroid.yml
+++ b/.github/workflows/buildAndroid.yml
@@ -54,8 +54,6 @@ jobs:
build:
name: Build Android app
runs-on: ubuntu-latest-xl
- env:
- RUBYOPT: '-rostruct'
outputs:
AAB_FILE_NAME: ${{ steps.build.outputs.AAB_FILE_NAME }}
APK_FILE_NAME: ${{ steps.build.outputs.APK_FILE_NAME }}
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 84492faa8f02..72c21249b2df 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -81,8 +81,6 @@ jobs:
name: Upload Android build to Google Play Store
needs: buildAndroid
runs-on: ubuntu-latest
- env:
- RUBYOPT: '-rostruct'
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -121,8 +119,6 @@ jobs:
needs: prep
if: ${{ github.ref == 'refs/heads/production' }}
runs-on: ubuntu-latest
- env:
- RUBYOPT: '-rostruct'
steps:
- name: Checkout
uses: actions/checkout@v4
diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml
index 1bba3e96735a..1ce493715b78 100644
--- a/.github/workflows/testBuild.yml
+++ b/.github/workflows/testBuild.yml
@@ -60,6 +60,24 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ postGitHubCommentBuildStarted:
+ runs-on: ubuntu-latest
+ needs: [validateActor, getBranchRef]
+ if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }}
+ steps:
+ - name: Add build start comment
+ uses: actions/github-script@v7
+ with:
+ github-token: ${{ github.token }}
+ script: |
+ const workflowURL = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
+ github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: process.env.PULL_REQUEST_NUMBER,
+ body: `🚧 @${{ github.actor }} has triggered a test build. You can view the [workflow run here](${workflowURL}).`
+ });
+
buildAndroid:
name: Build Android app for testing
uses: ./.github/workflows/buildAndroid.yml
@@ -75,8 +93,6 @@ jobs:
name: Upload Android app to S3
needs: [buildAndroid]
runs-on: ubuntu-latest
- env:
- RUBYOPT: '-rostruct'
outputs:
S3_APK_PATH: ${{ steps.exportS3Path.outputs.S3_APK_PATH }}
steps:
diff --git a/android/app/build.gradle b/android/app/build.gradle
index e1e83a4b1b74..46d9b09fe89f 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -110,8 +110,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
- versionCode 1009006204
- versionName "9.0.62-4"
+ versionCode 1009006503
+ versionName "9.0.65-3"
// Supported language variants must be declared here to avoid from being removed during the compilation.
// This also helps us to not include unnecessary language variants in the APK.
resConfigs "en", "es"
diff --git a/assets/images/simple-illustrations/simple-illustration__pillow.svg b/assets/images/simple-illustrations/simple-illustration__pillow.svg
new file mode 100644
index 000000000000..97a0811266ae
--- /dev/null
+++ b/assets/images/simple-illustrations/simple-illustration__pillow.svg
@@ -0,0 +1,28 @@
+
diff --git a/contributingGuides/PERFORMANCE_METRICS.md b/contributingGuides/PERFORMANCE_METRICS.md
index ecebbaae4e0e..9e942f21d918 100644
--- a/contributingGuides/PERFORMANCE_METRICS.md
+++ b/contributingGuides/PERFORMANCE_METRICS.md
@@ -14,7 +14,7 @@ Project is using Firebase for tracking these metrics. However, not all of them a
| `js_loaded` | âś… | The time it takes for the JavaScript bundle to load.
**Platforms:** Android, iOS | **Android:** Starts in the `onCreate` method.
**iOS:** Starts in the AppDelegate's `didFinishLaunchingWithOptions` method. | Stops at the first render of the app via native module on the JS side. |
| `_app_in_foreground` | âś… | The time when the app is running in the foreground and available to the user.
**Platforms:** Android, iOS | **Android:** Starts when the first activity to reach the foreground has its `onResume()` method called.
**iOS:** Starts when the application receives the `UIApplicationDidBecomeActiveNotification` notification. | **Android:** Stops when the last activity to leave the foreground has its `onStop()` method called.
**iOS:** Stops when it receives the `UIApplicationWillResignActiveNotification` notification. |
| `_app_in_background` | âś… | Time when the app is running in the background.
**Platforms:** Android, iOS | **Android:** Starts when the last activity to leave the foreground has its `onStop()` method called.
**iOS:** Starts when the application receives the `UIApplicationWillResignActiveNotification` notification. | **Android:** Stops when the first activity to reach the foreground has its `onResume()` method called.
**iOS:** Stops when it receives the `UIApplicationDidBecomeActiveNotification` notification. |
-| `sidebar_loaded` | ❌ | Time taken for the Sidebar to load.
**Platforms:** All | Starts when the Sidebar is mounted. | Stops when the LHN finishes laying out. |
+| `sidebar_loaded` | âś… | Time taken for the Sidebar to load.
**Platforms:** All | Starts when the Sidebar is mounted. | Stops when the LHN finishes laying out. |
| `calc_most_recent_last_modified_action` | âś… | Time taken to find the most recently modified report action or report.
**Platforms:** All | Starts when the app reconnects to the network | Ends when the app reconnects to the network and the most recent report action or report is found. |
| `open_search` | âś… | Time taken to open up the Search Router.
**Platforms:** All | Starts when the Search Router icon in LHN is pressed. | Stops when the list of available options finishes laying out. |
| `load_search_options` | âś… | Time taken to generate the list of options used in the Search Router.
**Platforms:** All | Starts when the `getSearchOptions` function is called. | Stops when the list of available options is generated. |
diff --git a/contributingGuides/STORYBOOK.md b/contributingGuides/STORYBOOK.md
index bef9c6518deb..93815bab3da9 100644
--- a/contributingGuides/STORYBOOK.md
+++ b/contributingGuides/STORYBOOK.md
@@ -62,7 +62,7 @@ export {
That will give us an interactive playground to test out various component attributes with the defaults we passed.
-![Storybook example](web/storybook-example.png)
+![Storybook example](/web/storybook-example.png)
Note that we did not need to write any of the descriptions for these props. This is because they are automatically generated from a React component's `propTypes`.
diff --git a/contributingGuides/STYLE.md b/contributingGuides/STYLE.md
index e6660d848129..c7f05e661bd2 100644
--- a/contributingGuides/STYLE.md
+++ b/contributingGuides/STYLE.md
@@ -477,20 +477,68 @@ if (ref.current && 'getBoundingClientRect' in ref.current) {
### Default value for inexistent IDs
- Use `'-1'` or `-1` when there is a possibility that the ID property of an Onyx value could be `null` or `undefined`.
+Use `CONST.DEFAULT_NUMBER_ID` when there is a possibility that the number ID property of an Onyx value could be `null` or `undefined`. **Do not default string IDs to any value!**
+
+> Why? The default number ID (currently set to `0`, which matches the backend’s default) is a falsy value. This makes it compatible with conditions that check if an ID is set, such as `if (!ownerAccountID) {`. Since it’s stored as a constant, it can easily be changed across the codebase if needed.
+>
+> However, defaulting string IDs to `'0'` breaks such conditions because `'0'` is a truthy value in JavaScript. Defaulting to `''` avoids this issue, but it can cause crashes or bugs if the ID is passed to Onyx. This is because `''` could accidentally subscribe to an entire Onyx collection instead of a single record.
+>
+> To address both problems, string IDs **should not have a default value**. This approach allows conditions like `if (!policyID) {` to work correctly, as `undefined` is a falsy value. At the same time, it prevents Onyx bugs: if `policyID` is used to subscribe to a specific Onyx record, a `policy_undefined` key will be used, and Onyx won’t return any records.
+>
+> In case you are confused or find a situation where you can't apply the rules mentioned above, please raise your question in the [`#expensify-open-source`](https://expensify.slack.com/archives/C01GTK53T8Q) Slack channel.
``` ts
// BAD
-const foo = report?.reportID ?? '';
-const bar = report?.reportID ?? '0';
-
-report ? report.reportID : '0';
-report ? report.reportID : '';
+const accountID = report?.ownerAccountID ?? -1;
+const policyID = report?.policyID ?? '-1';
+const managerID = report ? report.managerID : 0;
// GOOD
-const foo = report?.reportID ?? '-1';
+const accountID = report?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID;
+const policyID = report?.policyID;
+const managerID = report ? report.managerID : CONST.DEFAULT_NUMBER_ID;
+```
+
+Here are some common cases you may face when fixing your code to remove the old/bad default values.
+
+#### **Case 1**: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
+
+```diff
+-Report.getNewerActions(newestActionCurrentReport?.reportID ?? '-1', newestActionCurrentReport?.reportActionID ?? '-1');
++Report.getNewerActions(newestActionCurrentReport?.reportID, newestActionCurrentReport?.reportActionID);
+```
+
+> error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'. Type 'undefined' is not assignable to type 'string'.
+
+We need to change `Report.getNewerActions()` arguments to allow `undefined`. By doing that we could add a condition that return early if one of the parameters are falsy, preventing the code (which is expecting defined IDs) from executing.
+
+```diff
+-function getNewerActions(reportID: string, reportActionID: string) {
++function getNewerActions(reportID: string | undefined, reportActionID: string | undefined) {
++ if (!reportID || !reportActionID) {
++ return;
++ }
+```
+
+#### **Case 2**: Type 'undefined' cannot be used as an index type.
+
+```diff
+function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = false, updatedTransaction, isFromReviewDuplicates = false}: MoneyRequestViewProps) {
+ const [parentReportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`, {
+ canEvict: false,
+ });
+- const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];
++ const parentReportAction = parentReportActions?.[report?.parentReportActionID];
+```
+
+> error TS2538: Type 'undefined' cannot be used as an index type.
+
+This error is inside a component, so we can't simply use early return conditions here. Instead, we can check if `report?.parentReportActionID` is defined, if it is we can safely use it to find the record inside `parentReportActions`. If it's not defined, we just return `undefined`.
-report ? report.reportID : '-1';
+```diff
+function MoneyRequestView({report, shouldShowAnimatedBackground, readonly = false, updatedTransaction, isFromReviewDuplicates = false}: MoneyRequestViewProps) {
+- const parentReportAction = parentReportActions?.[report?.parentReportActionID ?? '-1'];
++ const parentReportAction = report?.parentReportActionID ? parentReportActions?.[report.parentReportActionID] : undefined;
```
### Extract complex types
diff --git a/desktop/main.ts b/desktop/main.ts
index 04aa3e1b478e..4f642d90da51 100644
--- a/desktop/main.ts
+++ b/desktop/main.ts
@@ -25,6 +25,14 @@ const {DESKTOP_SHORTCUT_ACCELERATOR, LOCALES} = CONST;
// geolocation api (window.navigator.geolocation.getCurrentPosition) to work on desktop.
// Source: https://github.com/electron/electron/blob/98cd16d336f512406eee3565be1cead86514db7b/docs/api/environment-variables.md#google_api_key
process.env.GOOGLE_API_KEY = CONFIG.GCP_GEOLOCATION_API_KEY;
+/**
+ * Suppresses Content Security Policy (CSP) console warnings related to 'unsafe-eval'.
+ * This is required because:
+ * 1. Webpack utilizes eval() for module bundling
+ * 2. The application requires 'unsafe-eval' in CSP to function properly
+ * Note: CSP warnings are expected and unavoidable in this context
+ */
+process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = CONFIG.ELECTRON_DISABLE_SECURITY_WARNINGS;
app.setName('New Expensify');
diff --git a/docs/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills.md b/docs/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills.md
index aff11c059d81..b231984f61e2 100644
--- a/docs/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills.md
+++ b/docs/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills.md
@@ -11,7 +11,7 @@ You can receive bills in three ways:
- Manual Upload: For physical bills, create a Bill in Expensify from the Reports page.
# Bill Pay Workflow
-1. When a vendor or supplier sends a bill to Expensify, the document is automatically SmartScanned, and a Bill is created. This Bill is managed by the primary domain contact, who can view it on the Reports page within their default group policy.
+1. When a vendor or supplier sends a bill to Expensify, the document is automatically SmartScanned, and a Bill is created. This Bill is managed by the primary domain contact, who can view it on the Reports page within their default group workspace.
2. Once the Bill is ready for processing, it follows the established approval workflow. As each person approves it, the Bill appears in the next approver’s Inbox. The final approver will pay the Bill using one of the available payment methods.
diff --git a/docs/articles/expensify-classic/connect-credit-cards/Personal-Credit-Cards.md b/docs/articles/expensify-classic/connect-credit-cards/Personal-Credit-Cards.md
index 05149ebf868e..36717a421c67 100644
--- a/docs/articles/expensify-classic/connect-credit-cards/Personal-Credit-Cards.md
+++ b/docs/articles/expensify-classic/connect-credit-cards/Personal-Credit-Cards.md
@@ -8,7 +8,7 @@ Welcome to the world of effortless expense tracking! Connecting your personal cr
## How to connect your personal card to import expenses
Importing your card or bank via Account Settings will:
Automatically sync your bank/card transactions with your Expensify account. These will merge seamlessly with any SmartScanned expenses in your account.
-Generate IRS-compliant eReceipts, provided your Policy Admin has enabled this feature.
+Generate IRS-compliant eReceipts, provided your Workspace Admin has enabled this feature.
Discover below the numerous ways to easily bring your personal card expenses into Expensify below.
### *Important terms to know:*
@@ -45,7 +45,7 @@ _Please note: an OFX file type will require no editing but not all banks' OFX fi
6. Set the date format to match your CSV and adjust the currency to match your bank account currency.
7. If you've previously imported expenses for the same card, choose the default layout of a previously uploaded spreadsheet.
8. Scroll down and select which columns map to the merchant, date and amount (as a number without a currency symbol) – these are required presets which must be assigned.
-9. If applicable, you can also map specific Categories and Tags as long as you don't have an integration connection to your default group policy. If you have an integration connected, you'll want to add the Categories and Tags to the expense after the expense is uploaded.
+9. If applicable, you can also map specific Categories and Tags as long as you don't have an integration connection to your default group workspace. If you have an integration connected, you'll want to add the Categories and Tags to the expense after the expense is uploaded.
10. Check the preview of your selection under *Output Preview*. If everything looks good, you can then select *Add Expenses*.
11. For checking accounts, you may need to "Flip Amount Sign" as transactions are often exported as negative amounts.
diff --git a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md
index 0fde76c8fa92..553171d73dde 100644
--- a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md
+++ b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md
@@ -29,9 +29,9 @@ Personal Liability: Users are allowed to delete company card expenses.
If you update the settings on an existing company card feed, the changes will apply to expenses imported after the date the setting is saved. The update will not affect previously imported expenses.
-## Preferred policy
+## Preferred workspace
-Setting a preferred policy for a company card feed will ensure that the imported transactions are added to a report on the policy you set. This setting is useful when members are on multiple policies and need to ensure their company card expenses are reported to a particular policy.
+Setting a preferred workspace for a company card feed will ensure that the imported transactions are added to a report on the workspace you set. This setting is useful when members are on multiple workspaces and need to ensure their company card expenses are reported to a particular workspace.
# How to use Scheduled Submit with company cards
All expenses must be placed on a report if they need to be approved; with Scheduled Submit, you no longer need to worry about the arduous task of employees creating their expenses, adding them to a report, and submitting them manually. All they need to do is SmartScan their receipts and Concierge will take care of the rest, on a variety of schedules that you can set according to your preferences!
@@ -41,11 +41,11 @@ Concierge won't automatically submit expenses on reports that have Expense Viola
An employee can add comments in the Expense Comment field or at the bottom of the report to clarify any details.
## Enable Scheduled Submit
-Scheduled Submit is enabled in the Group Policy by navigating to Settings > Policies > Group > Policy Name > Reports > Scheduled Submit
+Scheduled Submit is enabled in the Group Workspace by navigating to Settings > Workspaces > Group > Workspace Name > Reports > Scheduled Submit
Use the toggle to enable Scheduled Submit
Choose your desired frequency
-If Scheduled Submit is disabled on the group policy level (or set to a manual frequency), and you have noticed expense reports are still automatically submitted to the group policy, it's likely Scheduled Submit is enabled on the user’s Individual Policy settings.
+If Scheduled Submit is disabled on the group workspace level (or set to a manual frequency), and you have noticed expense reports are still automatically submitted to the group workspace, it's likely Scheduled Submit is enabled on the user’s Individual Workspace settings.
# How to connect company cards to an accounting integration
@@ -59,7 +59,7 @@ You're all done. After the account is set, exported expenses will be mapped to t
## Pooled GL account
To export credit card expenses to a pooled GL account:
-Go to Settings > Policies > Group > Policy Name > Connections > Accounting Integrations > Configure
+Go to Settings > Workspaces > Group > Workspace Name > Connections > Accounting Integrations > Configure
Select Credit Card / Charge Card / Bank Transaction as your Non-reimbursable export option.
Please review the Export Settings page for exporting Expense Reports to NetSuite
Select the Vendor/liability account you want to export all non-reimbursable expenses to.
@@ -86,7 +86,7 @@ It's important to note that eReceipts are not generated for lodging expenses. Mo
{% include faq-begin.md %}
## What plan/subscription is required in order to manage corporate cards?
-Group Policy (Collect or Control plan only)
+Group Workspace (Collect or Control plan only)
## When do my company card transactions import to Expensify?
Credit card transactions are imported to Expensify once they’re posted to the bank account. This usually takes 1-3 business days between the point of purchase and when the transactions populate in your account.
diff --git a/docs/articles/expensify-classic/connections/Deel.md b/docs/articles/expensify-classic/connections/Deel.md
index 12e616d9657f..bdc4b89206ca 100644
--- a/docs/articles/expensify-classic/connections/Deel.md
+++ b/docs/articles/expensify-classic/connections/Deel.md
@@ -5,7 +5,7 @@ description: Automatically sync expenses from Expensify to Deel
# Overview
-This guide is for business clients who want to set up policies and synchronize expenses from Expensify to Deel. This one-way synchronization ensures that Expensify becomes the definitive source for all employee expenses.
+This guide is for business clients who want to set up workspaces and synchronize expenses from Expensify to Deel. This one-way synchronization ensures that Expensify becomes the definitive source for all employee expenses.
If you are a contractor or employee working for a company using Expensify, please refer to:
@@ -16,7 +16,7 @@ If you are a contractor or employee working for a company using Expensify, pleas
By integrating Expensify with Deel, you can utilize Expensify’s approval workflows to ensure timely payment through Deel for your team.
-This process involves aligning user profiles and expense policies between Expensify and Deel. Once connected, Deel will scan for approved expenses from matched users included in selected workspaces for integration, allowing Deel to import these expenses for reimbursement.
+This process involves aligning user profiles and expense workspaces between Expensify and Deel. Once connected, Deel will scan for approved expenses from matched users included in selected workspaces for integration, allowing Deel to import these expenses for reimbursement.
This synchronization is one-way. Expenses and receipts logged and approved in Expensify will sync to Deel. Expenses logged in Deel will not sync to Expensify.
@@ -27,7 +27,7 @@ This synchronization is one-way. Expenses and receipts logged and approved in Ex
To establish a connection, make sure you have the following:
- Deel Organization Manager permissions
-- Expensify Admin permissions for policies you wish to integrate with Deel
+- Expensify Admin permissions for workspaces you wish to integrate with Deel
- A paid Expensify subscription to approve expenses and sync them to Deel
Expensify Admin permissions can be intricate. Refer to [Expensify’s Introduction to Integration]([https://example.com](https://integrations.expensify.com/Integration-Server/doc/#introduction)) for more details.
diff --git a/docs/articles/expensify-classic/connections/Greenhouse.md b/docs/articles/expensify-classic/connections/Greenhouse.md
index b44e5a090d17..282ba33fd607 100644
--- a/docs/articles/expensify-classic/connections/Greenhouse.md
+++ b/docs/articles/expensify-classic/connections/Greenhouse.md
@@ -38,6 +38,6 @@ Expensify's direct integration with Greenhouse allows you to automatically send
## In Expensify:
-1. Navigate to **Settings > Policies > Group > _[Workspace Name]_ > Members**
+1. Navigate to **Settings > Workspaces > Group > _[Workspace Name]_ > Members**
2. The candidate you just sent to Expensify should be listed in the workspace members list
3. If the Recruiter (or Recruiting Coordinator) field was filled in in Greenhouse, the candidate will already be configured to submit reports to that recruiter for approval. If no Recruiter was selected, then the candidate will submit based on the Expensify workspace approval settings.
diff --git a/docs/articles/expensify-classic/connections/QuickBooks-Time.md b/docs/articles/expensify-classic/connections/QuickBooks-Time.md
index 5bbd2c4b583c..bcc06e171d4f 100644
--- a/docs/articles/expensify-classic/connections/QuickBooks-Time.md
+++ b/docs/articles/expensify-classic/connections/QuickBooks-Time.md
@@ -1,6 +1,6 @@
---
title: Expensify and TSheets/QuickBooks Time Integration Guide
-description: This help document explains how to connect TSheets/QuickBooks Time to your Expensify policy
+description: This help document explains how to connect TSheets/QuickBooks Time to your Expensify workspace
---
# Overview
diff --git a/docs/articles/expensify-classic/connections/netsuite/Configure-Netsuite.md b/docs/articles/expensify-classic/connections/netsuite/Configure-Netsuite.md
index aecf21acfc3f..068e4dd5bca9 100644
--- a/docs/articles/expensify-classic/connections/netsuite/Configure-Netsuite.md
+++ b/docs/articles/expensify-classic/connections/netsuite/Configure-Netsuite.md
@@ -40,18 +40,18 @@ The three options for the date your report will export with are:
**Expense Reports:** Expensify transactions will export reimbursable expenses as expense reports by default, which will be posted to the payables account designated in NetSuite.
-**Vendor Bills:** Expensify transactions export as vendor bills in NetSuite and will be mapped to the subsidiary associated with the corresponding policy. Each report will be posted as payable to the vendor associated with the employee who submitted the report. You can also set an approval level in NetSuite for vendor bills.
+**Vendor Bills:** Expensify transactions export as vendor bills in NetSuite and will be mapped to the subsidiary associated with the corresponding workspace. Each report will be posted as payable to the vendor associated with the employee who submitted the report. You can also set an approval level in NetSuite for vendor bills.
-**Journal Entries:** Expensify transactions that are set to export as journal entries in NetSuite will be mapped to the subsidiary associated with this policy. All the transactions will be posted to the payable account specified in the policy. You can also set an approval level in NetSuite for the journal entries.
+**Journal Entries:** Expensify transactions that are set to export as journal entries in NetSuite will be mapped to the subsidiary associated with this workspace. All the transactions will be posted to the payable account specified in the workspace. You can also set an approval level in NetSuite for the journal entries.
- Journal entry forms by default do not contain a customer column, so it is not possible to export customers or projects with this export option
- The credit line and header level classifications are pulled from the employee record
## Export Settings for Non-Reimbursable Expenses
-**Vendor Bills:** Non-reimbursable expenses will be posted as a vendor bill payable to the default vendor specified in your policy's connection settings. If you centrally manage your company cards through Domains, you can export expenses from each card to a specific vendor in NetSuite. You can also set an approval level in NetSuite for the bills.
+**Vendor Bills:** Non-reimbursable expenses will be posted as a vendor bill payable to the default vendor specified in your workspace's connection settings. If you centrally manage your company cards through Domains, you can export expenses from each card to a specific vendor in NetSuite. You can also set an approval level in NetSuite for the bills.
-**Journal Entries:** Non-reimbursable expenses will be posted to the Journal Entries posting account selected in your policy's connection settings. If you centrally manage your company cards through Domains, you can export expenses from each card to a specific account in NetSuite.
+**Journal Entries:** Non-reimbursable expenses will be posted to the Journal Entries posting account selected in your workspace's connection settings. If you centrally manage your company cards through Domains, you can export expenses from each card to a specific account in NetSuite.
- Expensify Card expenses will always export as Journal Entries, even if you have Expense Reports or Vendor Bills configured for non-reimbursable expenses on the Export tab
- Journal entry forms do not contain a customer column, so it is not possible to export customers or projects with this export option
diff --git a/docs/articles/expensify-classic/connections/netsuite/Netsuite-Troubleshooting.md b/docs/articles/expensify-classic/connections/netsuite/Netsuite-Troubleshooting.md
index 01aa21a28b80..302277c3a45a 100644
--- a/docs/articles/expensify-classic/connections/netsuite/Netsuite-Troubleshooting.md
+++ b/docs/articles/expensify-classic/connections/netsuite/Netsuite-Troubleshooting.md
@@ -2,8 +2,6 @@
title: Netsuite Troubleshooting
description: Troubleshoot common NetSuite sync and export errors.
---
-
-# Overview of NetSuite Troubleshooting
Synchronizing and exporting data between Expensify and NetSuite can streamline your financial processes, but occasionally, users may encounter errors that prevent a smooth integration. These errors often arise from discrepancies in settings, missing data, or configuration issues within NetSuite or Expensify.
This troubleshooting guide aims to help you identify and resolve common sync and export errors, ensuring a seamless connection between your financial management systems. By following the step-by-step solutions provided for each specific error, you can quickly address issues and maintain accurate and efficient expense reporting and data management.
@@ -30,7 +28,7 @@ When exporting as a Vendor Bill, we pull from the vendor record, not the employe
**Journal Entries and Expense Reports:**
If you see this error when exporting a Journal Entry or Expense Report, it might be because the report submitter doesn’t have default settings for Departments, Classes, or Locations.
-**To fix this:**
+**To resolve:**
1. Go to **Lists > Employees** in NetSuite.
2. Click **"Edit"** next to the employee's name who submitted the report.
3. Scroll down to the **Classification** section.
@@ -41,28 +39,29 @@ If you see this error when exporting a Journal Entry or Expense Report, it might
# ExpensiError NS0012: Currency Does Not Exist In NetSuite
-**Scenario One:** When dealing with foreign transactions, Expensify sends the conversion rate and currency of the original expense to NetSuite. If the currency isn't listed in your NetSuite subsidiary, you'll see an error message saying the currency does not exist in NetSuite.
+## Scenario One
+When dealing with foreign transactions, Expensify sends the conversion rate and currency of the original expense to NetSuite. If the currency isn't listed in your NetSuite subsidiary, you'll see an error message saying the currency does not exist in NetSuite.
-**To fix this:**
+**To resolve:**
1. Ensure the currency in Expensify matches what's in your NetSuite subsidiary.
2. If you see an error saying 'The currency X does not exist in NetSuite', re-sync your connection to NetSuite through the workspace admin section in Expensify.
3. Try exporting again.
-**Scenario Two:** This error can happen if you’re using a non-OneWorld NetSuite instance and exporting a currency other than EUR, GBP, USD, or CAD.
+## Scenario Two
+This error can happen if you’re using a non-OneWorld NetSuite instance and exporting a currency other than EUR, GBP, USD, or CAD.
-**To fix this:**
+**To resolve:**
1. Head to NetSuite.
2. Go to **Setup > Enable Features**.
3. Check the **Multiple Currencies** box.
Once you've done this, you can add the offending currency by searching **New Currencies** in the NetSuite global search.
-
# ExpensiError NS0021: Invalid tax code reference key
This error usually indicates an issue with the Tax Group settings in NetSuite, which can arise from several sources.
-#### Tax Group to Tax Code Mapping
+## Tax Group to Tax Code Mapping
If a Tax Code on Sales Transactions is mapped to a Tax Group, an error will occur. To fix this, the Tax Code must be mapped to a Tax Code on Purchase Transactions instead.
To verify if a Tax Code is for Sales or Purchase transactions, view the relevant Tax Code(s).
@@ -78,9 +77,7 @@ Tax Groups can represent different types of taxes. For compatibility with Expens
#### Enable Tax Groups
Some subsidiaries require you to enable Tax Groups. Go to **Set Up Taxes** for the subsidiary's country and ensure the Tax Code lists include both Tax Codes and Tax Groups.
-
# ExpensiError NS0023: Employee Does Not Exist in NetSuite (Invalid Employee)
-
This can happen if the employee’s subsidiary in NetSuite doesn’t match what’s listed in Expensify.
## How to Fix ExpensiError NS0023
@@ -97,16 +94,13 @@ This can happen if the employee’s subsidiary in NetSuite doesn’t match what
- Ensure the email on the employee record in NetSuite matches the email address of the report submitter in Expensify.
- In NetSuite, make sure the employee's hire date is in the past and/or the termination date is in the future.
4. **Currency Match for Journal Entries:**
- - If exporting as Journal Entries, ensure the currency for the NetSuite employee record, NetSuite subsidiary, and Expensify policy all match.
- - In NetSuite, go to the **Human Resources** tab > **Expense Report Currencies**, and add the subsidiary/policy currency if necessary.
-
+ - If exporting as Journal Entries, ensure the currency for the NetSuite employee record, NetSuite subsidiary, and Expensify workspace all match.
+ - In NetSuite, go to the **Human Resources** tab > **Expense Report Currencies**, and add the subsidiary/workspace currency if necessary.
# ExpensiError NS0024: Invalid Customer or Project Tag
-
Employees must be listed as a resource on the customer/project in NetSuite to be able to apply it to an expense. If that isn’t set up in NetSuite, you can run into this error.
## How to Fix ExpensiError NS0024
-
1. **Ensure Employee Access:**
- In NetSuite, go to **Lists > Relationships > Customer/Projects**.
- Click **Edit** next to the desired Customer/Project.
@@ -124,9 +118,7 @@ Employees must be listed as a resource on the customer/project in NetSuite to be
- Go to **Settings > Workspaces > Group > [Workspace Name] > Connections > NetSuite > Configure > Advanced**.
- Enable **Cross-Subsidiary Customers/Projects** to remove the requirement for the employee's subsidiary and the customer's subsidiary to match.
-
# ExpensiError NS0034: This record already exists
-
This error occurs when the report in question was already exported to NetSuite.
## How to fix ExpensiError NS0034
@@ -141,9 +133,7 @@ This error occurs when the report in question was already exported to NetSuite.
5. **Re-export the Report from Expensify to NetSuite:**
- After deleting the report in NetSuite, re-export it from Expensify to NetSuite.
-
# ExpensiError NS0046: Billable Expenses Not Coded with a NetSuite Customer or Billable Project
-
NetSuite requires billable expenses to be assigned to a Customer or a Project that is configured as billable to a Customer. If this is not set up correctly in NetSuite, this error can occur.
## How to Fix ExpensiError NS0046
@@ -160,10 +150,8 @@ NetSuite requires billable expenses to be assigned to a Customer or a Project th
- Verify that there are no violations and that a value has been applied to the field.
5. Make any necessary adjustments to the billable expenses and try the export again.
-
# ExpensiError NS0059: A credit card account has not been selected for corporate card expenses.
-
-**To resolve this error:**
+**To resolve:**
1. Log into NetSuite as an admin.
2. Type "Page: Subsidiaries" in the global search box and select the subsidiary you will export to.
3. Under the Preferences tab of the subsidiary, locate the field: Default Account for Corporate Card Expenses.
@@ -179,9 +167,7 @@ NetSuite requires billable expenses to be assigned to a Customer or a Project th
For accounts without subsidiaries (non-OneWorld accounts), the default field is in your accounting preferences.
-
# ExpensiError NS0085: Expense Does Not Have Appropriate Permissions for Settings an Exchange Rate in NetSuite
-
This error occurs when the exchange rate settings in NetSuite aren't updated correctly.
## How to Fix ExpensiError NS0085
@@ -203,7 +189,6 @@ This error occurs when the exchange rate settings in NetSuite aren't updated cor
# ExpensiError NS0079: The Transaction Date is Not Within the Date Range of Your Accounting Period
-
The transaction date you specified is not within the date range of your accounting period. When the posting period settings in NetSuite are not configured to allow a transaction date outside the posting period, you can't export a report to the next open period, which is why you’ll run into this error.
## How to Fix ExpensiError NS0079
@@ -211,7 +196,7 @@ The transaction date you specified is not within the date range of your accounti
2. Under the General Ledger section, ensure the field Allow Transaction Date Outside of the Posting Period is set to Warn.
3. Then, choose whether to export your reports to the First Open Period or the Current Period.
-Additionally, ensure the Export to Next Open Period feature is enabled within Expensify:
+**Additionally, ensure the Export to Next Open Period feature is enabled within Expensify:**
1. Navigate to **Settings > Workspaces > Group > [Workspace Name] > Connections > Configure**.
2. Open the **Advanced tab**.
3. Confirm that the setting for **Export to Next Open Period** is enabled.
@@ -220,7 +205,6 @@ If any configuration settings are updated on the NetSuite connection, be sure to
# ExpensiError NS0055: The Vendor You are Trying to Export to Does Not Have Access to the Currency X
-
This error occurs when a vendor tied to a report in Expensify does not have access to a currency on the report in NetSuite. The vendor used in NetSuite depends on the type of expenses on the report you're exporting.
- For **reimbursable** (out-of-pocket) expenses, this is the report's submitter (the employee who submitted the report).
- For **non-reimbursable** (e.g., company card) expenses, this is the default vendor set via Settings > Workspaces > Group > [Workspace Name] > Connections > NetSuite > Configure.
@@ -246,13 +230,13 @@ To fix this, the vendor needs to be given access to the applicable currency:
5. Sync the NetSuite connection under **Settings > Workspaces > Group > [Workspace Name] > Connections > Sync Now**.
6. Export the report(s) again.
-#### For reports with Expensify Card expenses
+## ExpensiError NS0068: Reports with Expensify Card expenses
Expensify Card expenses export as Journal Entries. If you encounter this error when exporting a report with Expensify Card non-reimbursable expenses, ensure the field Created From has the Show checkbox checked for Journal Entries in NetSuite.
# ExpensiError NS0037: You do not have permission to set a value for element - “Receipt URL”
-**To resolve this error:**
+**To resolve:**
1. In NetSuite, go to Customization > Forms > Transaction Forms.
2. Search for the form type that the report is being exported as in NetSuite (Expense Report, Journal Entry, or Vendor Bill).
3. Click Edit next to the form that has the Preferred checkbox checked.
@@ -270,14 +254,12 @@ Expensify Card expenses export as Journal Entries. If you encounter this error w
# ExpensiError NS0042: Error creating vendor - this entity already exists
-
This error occurs when a vendor record already exists in NetSuite, but Expensify is still attempting to create a new one. This typically means that Expensify cannot find the existing vendor during export.
- The vendor record already exists in NetSuite, but there may be discrepancies preventing Expensify from recognizing it.
- The email on the NetSuite vendor record does not match the email of the report submitter in Expensify.
- The vendor record might not be associated with the correct subsidiary in NetSuite.
## How to Fix ExpensiError NS0042
-
Follow these steps to resolve the issue:
1. **Check Email Matching:**
- Ensure the email on the NetSuite vendor record matches the email of the report submitter in Expensify.
@@ -299,7 +281,6 @@ Follow these steps to resolve the issue:
# ExpensiError NS0109: Failed to login to NetSuite, please verify your credentials
-
This error indicates a problem with the tokens created for the connection between Expensify and NetSuite. The error message will say, "Login Error. Please check your credentials."
## How to Fix ExpensiError NS0109
@@ -308,7 +289,6 @@ This error indicates a problem with the tokens created for the connection betwee
# ExpensiError NS0123 Login Error: Please make sure that the Expensify integration is enabled
-
This error indicates that the Expensify integration is not enabled in NetSuite.
## How to Fix ExpensiError NS0123
@@ -321,10 +301,9 @@ This error indicates that the Expensify integration is not enabled in NetSuite.
Once the Expensify integration is enabled, try syncing the NetSuite connection again.
-
# ExpensiError NS0045: Expenses Not Categorized with a NetSuite Account
-**To resolve this error:**
+**To resolve:**
1. Log into NetSuite
2. Do a global search for the missing record.
- Ensure the expense category is active and correctly named.
@@ -335,7 +314,6 @@ Once the Expensify integration is enabled, try syncing the NetSuite connection a
# ExpensiError NS0061: Please Enter Value(s) for: Tax Code
-
This error typically occurs when attempting to export expense reports to a Canadian subsidiary in NetSuite for the first time and/or if your subsidiary in NetSuite has Tax enabled.
## How to Fix ExpensiError NS0061
@@ -348,12 +326,10 @@ To fix this, you need to enable Tax in the NetSuite configuration settings.
**Note:** Expenses created before Tax was enabled might need to have the newly imported taxes applied to them retroactively to be exported.
-
# Error creating employee: Your current role does not have permission to access this record.
-
This error indicates that the credentials or role used to connect NetSuite to Expensify do not have the necessary permissions within NetSuite. You can find setup instructions for configuring permissions in NetSuite [here](https://help.expensify.com/articles/expensify-classic/connections/netsuite/Connect-To-NetSuite#step-3-add-expensify-integration-role-to-a-user).
-**To resolve this error:**
+**To resolve:**
1. If permissions are configured correctly, confirm the report submitter exists in the subsidiary set on the workspace and that their Expensify email address matches the email on the NetSuite Employee Record.
2. If the above is true, try toggling off "Automatically create vendors/employees" under the Advanced tab of the NetSuite configuration window.
- Head to **Settings > Workspaces > Group > Workspace Name > Connections > NetSuite > Configure**
@@ -363,10 +339,9 @@ This error indicates that the credentials or role used to connect NetSuite to Ex
4. Export the report again.
# Elimination Settings for X Do Not Match
-
This error occurs when an Intercompany Payable account is set as the default in the Default Payable Account field in the NetSuite subsidiary preferences, and the Accounting Approval option is enabled for Expense Reports.
-**To resolve this error:**
+**To resolve:**
Set the Default Payable Account for Expense Reports on each subsidiary in NetSuite to ensure the correct payable account is active.
1. Navigate to Subsidiaries:
- Go to Setup > Company > Subsidiaries.
@@ -378,23 +353,21 @@ Set the Default Payable Account for Expense Reports on each subsidiary in NetSui
Repeat these steps for each subsidiary to ensure the settings are correct, and then sync Expensify to NetSuite to update the connection.
-# Why are reports exporting as `Accounting Approved` instead of `Paid in Full`?
+
+{% include faq-begin.md %}
+## Why are reports exporting as `Accounting Approved` instead of `Paid in Full`?
**This can occur for two reasons:**
- Missing Locations, Classes, or Departments in the Bill Payment Form
- Incorrect Settings in Expensify Workspace Configuration
-## Missing Locations, Classes, or Departments in Bill Payment Form
-
-If locations, classes, or departments are required in your accounting classifications but are not marked as 'Show' on the preferred bill payment form, this error can occur, and you will need to update the bill payment form in NetSuite:
+**Missing Locations, Classes, or Departments in Bill Payment Form:** If locations, classes, or departments are required in your accounting classifications but are not marked as 'Show' on the preferred bill payment form, this error can occur, and you will need to update the bill payment form in NetSuite:
1. Go to Customization > Forms > Transaction Forms.
2. Find your preferred (checkmarked) Bill Payment form.
3. Click Edit or Customize.
4. Under the Screen Fields > Main tab, check 'Show' near the department, class, and location options.
-## Incorrect Settings in Expensify Workspace Configuration
-
-To fix this, you'll want to confirm the NetSuite connection settings are set up correctly in Expensify:
+**Incorrect Settings in Expensify Workspace Configuration:** To fix this, you'll want to confirm the NetSuite connection settings are set up correctly in Expensify:
1. Head to **Settings > Workspaces > Group > Workspace Name > Connections > NetSuite > Configure > Advanced**
2. **Ensure the following settings are correct:**
- Sync Reimbursed Reports: Enabled and payment account chosen.
@@ -410,9 +383,7 @@ To fix this, you'll want to confirm the NetSuite connection settings are set up
Following these steps will help ensure that reports are exported as "Paid in Full" instead of "Accounting Approved."
-
-# Why are reports exporting as `Pending Approval`?
-
+## Why are reports exporting as `Pending Approval`?
If reports are exporting as "Pending Approval" instead of "Approved," you'll need to adjust the approval preferences in NetSuite.
**Exporting as Journal Entries/Vendor Bills:**
@@ -426,8 +397,7 @@ If reports are exporting as "Pending Approval" instead of "Approved," you'll nee
1. In NetSuite, navigate to Setup > Company > Enable Features.
2. On the "Employee" tab, uncheck "Approval Routing" to remove the approval requirement for Expense Reports created in NetSuite. Please note that this setting also applies to purchase orders.
-
-# How do I Change the Default Payable Account for Reimbursable Expenses in NetSuite?
+## How do I Change the Default Payable Account for Reimbursable Expenses in NetSuite?
NetSuite is set up with a default payable account that is credited each time reimbursable expenses are exported as Expense Reports to NetSuite (once approved by the supervisor and accounting). If you need to change this to credit a different account, follow the below steps:
@@ -445,7 +415,7 @@ NetSuite is set up with a default payable account that is credited each time rei
4. Click Save.
-# Why are my Company Card Expenses Exporting to the Wrong Account in NetSuite?
+## Why are my Company Card Expenses Exporting to the Wrong Account in NetSuite?
If your company card transactions are exporting to the wrong account in your accounting system, there are a couple of factors to check:
1. **Verify Card Mapping:**
@@ -462,3 +432,4 @@ Even if an expense was paid with the company card, it is considered a 'cash' exp
Less commonly, the issue may occur if the company card has been added to the user's personal settings. Expenses imported from a card linked at the individual account level will have a plain card icon.
+{% include faq-end.md %}
diff --git a/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md b/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md
index a6e19f8fd549..3fd1df0c0a1c 100644
--- a/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md
+++ b/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md
@@ -40,7 +40,6 @@ The following steps help you determine how data will be exported from Expensify
- Journal Entries - This is a single itemized journal entry for each Expensify report.
- _Non-reimbursable expenses_: Non-reimbursable expenses export to QuickBooks Online as:
- Credit Card expenses - Each expense will be exported as a bank transaction with its transaction date.
- - Note: The Expensify Card transactions will always export as Credit Card charges, even if the non-reimbursable setting is configured differently (such as a Vendor Bill.)
- Debit Card Expenses - Each expense will be exported as a bank transaction with its transaction date.
- Vendor Bills - A single detailed vendor bill is generated for each Expensify report.
- If the accounting period is closed, the vendor bill will be posted on the first day of the next open period. If you choose to export non-reimbursable expenses as Vendor Bills, you can assign a default vendor to the bill.
diff --git a/docs/articles/expensify-classic/domains/SAML-SSO.md b/docs/articles/expensify-classic/domains/SAML-SSO.md
index a6032afe8d24..da4bd5639120 100644
--- a/docs/articles/expensify-classic/domains/SAML-SSO.md
+++ b/docs/articles/expensify-classic/domains/SAML-SSO.md
@@ -88,7 +88,7 @@ Before getting started, you will need a verified domain and Control plan to set
6. The new trust is now created. Highlight the trust, then click *Edit claim rules* on the right.
7. Click *Add a Rule*.
8. The default option should be *Send LDAP Attributes as Claims*. Click Next.
-9. Depending upon how your Active Directory is set up, you may or may not have a useful email address associated with each user, or you may have a policy to use the UPN as the user attribute for authentication. If so, using the UPN user attribute may be appropriate for you. If not, you can use the email address attribute.
+9. Depending upon how your Active Directory is set up, you may or may not have a useful email address associated with each user, or you may have a workspace to use the UPN as the user attribute for authentication. If so, using the UPN user attribute may be appropriate for you. If not, you can use the email address attribute.
10. Give the rule a name like *Get email address from AD*. Choose Active Directory as the attribute store from the dropdown list. Choose your source user attribute to pass to Expensify that has users’ email address info in it, usually either *E-Mail-Address* or *User-Principal-Name*. Select the outgoing claim type as “E-Mail Address”. Click OK.
11. Add another rule; this time, we want to *Transform an Incoming Claim*. Click Next.
12. Name the rule *Send email address*. The Incoming claim type should be *E-Mail Address*. The outgoing claim type should be *Name ID*, and the outgoing name ID format should be *Email*. Click OK.
diff --git a/docs/articles/expensify-classic/expensify-billing/Change-Plan-Or-Subscription.md b/docs/articles/expensify-classic/expensify-billing/Change-Plan-Or-Subscription.md
index b245a26d10a0..0c0153522af3 100644
--- a/docs/articles/expensify-classic/expensify-billing/Change-Plan-Or-Subscription.md
+++ b/docs/articles/expensify-classic/expensify-billing/Change-Plan-Or-Subscription.md
@@ -80,7 +80,7 @@ Once you’ve successfully downgraded to a free Expensify account, your Workspac
## Will I be charged for a monthly subscription even if I don't use SmartScans?
Yes, the Monthly Subscription is prepaid and not based on activity, so you'll be charged regardless of usage.
-## I'm on a group policy; do I need the monthly subscription too?
-Probably not. Group policy members already have unlimited SmartScans, so there's usually no need to buy the subscription. However, you can use it for personal use if you leave your company's Workspace.
+## I'm on a group workspace; do I need the monthly subscription too?
+Probably not. Group workspace members already have unlimited SmartScans, so there's usually no need to buy the subscription. However, you can use it for personal use if you leave your company's Workspace.
{% include faq-end.md %}
diff --git a/docs/articles/expensify-classic/getting-started/Create-a-workspace-for-yourself.md b/docs/articles/expensify-classic/getting-started/Create-a-workspace-for-yourself.md
index 69dea87ad8ea..5d64a9de3df5 100644
--- a/docs/articles/expensify-classic/getting-started/Create-a-workspace-for-yourself.md
+++ b/docs/articles/expensify-classic/getting-started/Create-a-workspace-for-yourself.md
@@ -39,7 +39,7 @@ Here’s how to determine whether a personal or group workspace might be best fo
Hover over Settings, then click Workspaces.
Click the Individual tab on the left.
-
Select the policy type that best fits your needs.
+
Select the workspace type that best fits your needs.
Set up your workspace details including the workspace name, expense rules, categories, and more.
diff --git a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md
index bded231d1daa..66466b57c854 100644
--- a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md
+++ b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md
@@ -90,4 +90,4 @@ To view and pay bills:
When you have bills to pay you can click *View all bills* under the *Manage your bills* box and we’ll keep a neatly organized list of all of the bills you can pay via ACH directly from your Expensify account.
# You’re all set!
-Congrats, you are all set up! If you need any assistance with anything mentioned above, reach out to either your Concierge directly in *[new.expensify.com](https://new.expensify.com/concierge)*, or email concierge@expensify.com. Create a Collect or Control Policy, and we’ll automatically assign a dedicated Setup Specialist to you.
+Congrats, you are all set up! If you need any assistance with anything mentioned above, reach out to either your Concierge directly in *[new.expensify.com](https://new.expensify.com/concierge)*, or email concierge@expensify.com. Create a Collect or Control Workspace, and we’ll automatically assign a dedicated Setup Specialist to you.
diff --git a/docs/articles/expensify-classic/reports/Automatic-Receipt-Audit.md b/docs/articles/expensify-classic/reports/Automatic-Receipt-Audit.md
index f0d112b86e9f..61640ce69b77 100644
--- a/docs/articles/expensify-classic/reports/Automatic-Receipt-Audit.md
+++ b/docs/articles/expensify-classic/reports/Automatic-Receipt-Audit.md
@@ -17,5 +17,5 @@ All Expensify Control plans automatically come with Concierge Receipt Audit. If
**Can I disable Concierge Receipt Audit?**
-All Control plan policies automatically include Concierge Receipt Audit. At this time, it cannot be disabled.
+All Control plan workspaces automatically include Concierge Receipt Audit. At this time, it cannot be disabled.
{% include faq-end.md %}
diff --git a/docs/articles/expensify-classic/spending-insights/Custom-Templates.md b/docs/articles/expensify-classic/spending-insights/Custom-Templates.md
deleted file mode 100644
index 75d436471dbf..000000000000
--- a/docs/articles/expensify-classic/spending-insights/Custom-Templates.md
+++ /dev/null
@@ -1,207 +0,0 @@
----
-title: Custom Templates
-description: Custom Templates
----
-# Overview
-
-If you don't have a direct connection to your accounting system, as long as the system accepts a CSV file, you can easily export your expense data for upload to the system. Custom templates are great if you want to analyze the data in your favorite spreadsheet program.
-
-# How to use custom templates
-If you are a Group workspace admin you can create a custom template that will be available to all Workspace Admins on the workspace from **Settings > Workspaces > Group > _Workspace Name_ > Export Formats**.
-
-If you are using a free account you can create a custom template from **Settings > Account > Preferences > CSV Export Formats**.
-
-You can use your custom templates from the **Reports** page.
-1. Select the checkbox next to the report you’d like to export
-3. Click **Export to** at the top of the page
-4. Select your template from the dropdown
-
-# Formulas
-## Report level
-
-| Formula | Description |
-| -- | -- |
-| **Report title** | **the title of the report the expense is part of** |
-| {report:title} | would output "Expense Expenses to 2019-11-05" assuming that is the report's title.|
-| **Report ID** | **number is a unique number per report and can be used to identify specific reports**|
-| {report:id} | would output R00I7J3xs5fn assuming that is the report's ID.|
-| **Old Report ID** | **a unique number per report and can be used to identify specific reports as well. Every report has both an ID and an old ID - they're simply different ways of showing the same information in either [base10](https://community.expensify.com/home/leaving?allowTrusted=1&target=https%3A%2F%2Fwww.twinkl.co.uk%2Fteaching-wiki%2Fbase-10) or base62.** |
-| {report:oldID} | would output R3513250790654885 assuming that is the report's old ID.|
-| **Reimbursement ID** | **the unique number for a report that's been reimbursed via ACH in Expensify. The reimbursement ID is searchable on the Reports page and is found on your bank statement in the line-item detail for the reimbursed amount.**|
-| {report:reimbursementid} | would output 123456789109876 assuming that is the ID on the line-item detail for the reimbursed amount in your business bank account.|
-| **Report Total** | **the total amount of the expense report.**|
-| {report:total} | would output $325.34 assuming that is the report's total.|
-| **Type** | **is the type of report (either Expense Report, Invoice or Bill)**|
-| {report:type} | would output "Expense Report" assuming that is the report's type|
-| **Reimbursable Total** | **is the total amount that is reimbursable on the report.**|
-| {report:reimbursable} | would output $143.43 assuming the report's reimbursable total was 143.43 US Dollars.|
-| **Currency** | **is the currency to which all expenses on the report are being converted.**|
-| {report:currency} | would output USD assuming that the report total was calculated in US Dollars|
-|| Note - Currency accepts an optional three character currency code or NONE. If you want to do any math operations on the report total, you should use {report:total:nosymbol} to avoid an error. Please see Expense:Amount for more information on currencies.|
-| **Report Field** | **formula will output the value for a given Report Field which is created in the workspace settings.**|
-| {field:Employee ID} | would output 12456 , assuming "Employee ID" is the name of the Report Field and "123456" is the value of that field on the report.|
-| **Created date** | **the expense report was originally created by the user.**|
-| {report:created} | would output 2010-09-15 12:00:00 assuming the expense report was created on September 15th, 2010 at noon.|
-| {report:created:yyyy-MM-dd} | would output 2010-09-15 assuming the expense report was created on September 15, 2010.|
-| | Note - All Date Formulas accept an optional format string. The default if one is not provided is yyyy-MM-dd hh:mm:ss. For a full breakdown, check out the Date Formatting [here](https://community.expensify.com/discussion/5799/deep-dive-date-formating-for-formulas/p1?new=1).|
-| **StartDate** | **is the date of the earliest expense on the report.**|
-| {report:startdate} | would output 2010-09-15 assuming that is the date of the earliest expense on the report.|
-| **EndDate**| **is the date of the last expense on the report.**|
-| {report:enddate} | would output 2010-09-26 assuming that is the date of the last expense on the report.|
-| **Scheduled Submit Dates** | **the start and end dates of the Scheduled Submit reporting cycle.**|
-| {report:autoReporting:start} | would output 2010-09-15 assuming that is the start date of the automatic reporting cycle, when the automatic reporting frequency is not set to daily.|
-| {report:autoReporting:end} | would output 2010-09-26 assuming that is the end date of the automatic reporting cycle, when the automatic reporting frequency is not set to daily.|
-| **Submission Date** | **is the date that the report was submitted.**|
-| {report:submit:date} | would output 1986-09-15 12:00:00 assuming that the report was submitted on September 15, 1986, at noon.|
-| {report:submit:date:yyyy-MM-dd} | would output 1986-09-15 assuming that the report was submitted on September 15, 1986.|
-| | Note - All Date Formulas accept an optional format string. The default if one is not provided is yyyy-MM-dd hh:mm:ss. For a full breakdown, check out the Date Formatting |
-| **Approval Date** | **the date the report was approved. This formula can be used for export templates, but not for report titles.**|
-| {report:approve:date} | would output 2011-09-25 12:00:00 assuming that the report was approved on September 25, 2011, at noon.|
-| {report:approve:date:yyyy-MM-dd} | would output 2011-09-25 assuming that the report was approved on September 25, 2011.|
-| **Reimbursement Date** | **the date an expense report was reimbursed. This formula can be used for export templates, but not for report titles.**|
-| {report:achreimburse} | would output 2011-09-25 assuming that is the date the report was reimbursed via ACH Direct Deposit.|
-| {report:manualreimburse} | would output 2011-09-25 assuming that is the date the report was marked as reimbursed. |
-| **Export Date** | **is the date when the report is exported. This formula can be used for export templates, but not for report titles.**|
-| {report:dateexported} | would output 2013-09-15 12:00 assuming that the report was exported on September 15, 2013, at noon.|
-| {report:dateexported:yyyy-MM-dd} | would output 2013-09-15 assuming that the report was exported on September 15, 2013.|
-| **Expenses Count** | **is the number of total expenses on the report of this specific expense.**|
-| {report:expensescount} | would output 10 assuming that there were 10 expenses on the given report for this expense.|
-| **Workspace Name** | **is the name of the workspace applied to the report.**|
-| {report:policyname} | would output Sales assuming that the given report was under a workspace named Sales.|
-| **Status** | **is the current state of the report when it was exported**.|
-| {report:status} | would output Approved assuming that the report has been approved and not yet reimbursed.|
-| **Custom Fields** | |
-| {report:submit:from:customfield1} | would output the custom field 1 entry associated with the user who submitted the report. If John Smith’s Custom Field 1 contains 100, then this formula would output 100.|
-| {report:submit:from:customfield2} | would output the custom field 2 entry associated with the user who submitted the report. If John Smith’s Custom Field 2 contains 1234, then this formula would output 1234. |
-| **To** | **is the email address of the last person who the report was submitted to.**|
-| {report:submit:to} | would output alice@email.com if they are the current approver|
-| {report:submit:to:email\|frontPart} | would output alice.|
-| **Current user** | **To export the email of the currently logged in Expensify user**|
-| {user:email} | would output bob@example.com assuming that is the currently logged in Expensify user's email.|
-| **Submitter** | **"Sally Ride" with email "sride@email.com" is the submitter for the following examples**|
-| {report:submit:from:email}| sride@email.com|
-| {report:submit:from}| Sally Ride|
-| {report:submit:from:firstname}| Sally|
-| {report:submit:from:lastname}| Ride|
-| {report:submit:from:fullname}| Sally Ride |
-| | Note - If user's name is blank, then {report:submit:from} and {report:submit:from:email\|frontPart} will print the user's whole email.|
-
-`{report:submit:from:email|frontPart}` sride
-
-`{report:submit:from:email|domain}` email.com
-
-`{user:email|frontPart}` would output bob assuming that is the currently logged in Expensify user's email.
-
-## Expense level
-
-| Formula | Description |
-| -- | -- |
-| **Merchant** | **Merchant of the expense** |
-| {expense:merchant} | would output Sharons Coffee Shop and Grill assuming the expense is from Sharons Coffee Shop |
-| {expense:distance:count} | would output the total miles/kilometers of the expense.|
-| {expense:distance:rate} | would output the monetary rate allowed per mile/kilometer. |
-| {expense:distance:unit} | would output either mi or km depending on which unit is applied in the workspace settings. |
-| **Date** | **Related to the date listed on the expense** |
-| {expense:created:yyyy-MM-dd} | would output 2019-11-05 assuming the expense was created on November 5th, 2019 |
-| {expense:posted:yyyy-MM-dd} | would output 2023-07-24 assuming the expense was posted on July 24th, 2023 |
-| **Tax** | **The tax type and amount applied to the expense line item** |
-| {expense:tax:field} | would output VAT assuming this is the name of the tax field.|
-| {expense:tax:ratename} | would output the name of the tax rate that was used (ex: Standard). This will show custom if the chosen tax amount is manually entered and not chosen from the list of given options.|
-| {expense:tax:amount} | would output $2.00 assuming that is the amount of the tax on the expense.|
-| {expense:tax:percentage} | would output 20% assuming this is the amount of tax that was applied to the subtotal.|
-| {expense:tax:net} | would output $18.66 assuming this is the amount of the expense before tax was applied.|
-| {expense:tax:code} | would output the tax code that was set in the workspace settings.|
-| **Expense Amount** | **Related to the currency type and amount of the expense** |
-| {expense:amount} | would output $3.95 assuming the expense was for three dollars and ninety-five cents|
-| {expense:amount:isk} | would output ĂŤkr3.95 assuming the expense was for 3.95 Icelandic krĂłna.|
-| {expense:amount:nosymbol} | would output 3.95. Notice that there is no currency symbol in front of the expense amount because we designated none.|
-| {expense:exchrate} | would output the currency conversion rate used to convert the expense amount|
-| | Add an optional extra input that is either a three-letter currency code or nosymbol to denote the output's currency. The default if one isn't provided is USD.|
-| {expense:amount:originalcurrency} | This gives the amount of the expense in the currency in which it occurred before currency conversion |
-| {expense:amount:originalcurrency:nosymbol} | will export the expense in its original currency without the currency symbol. |
-| {expense:amount:negsign} | displays negative expenses with a minus sign in front rather wrapped in parenthesis. It would output -$3.95 assuming the expense was already a negative expense for three dollars and ninety-five cents. This formula does not convert a positive expense to a negative value.|
-| {expense:amount:unformatted} | displays expense amounts without commas. This removes commas from expenses that have an amount of more than 1000. It would output $10000 assuming the expense was for ten thousand dollars.|
-| {expense:debitamount} | displays the amount of the expense if the expense is positive. Nothing will be displayed in this column if the expense is negative. It would output $3.95 assuming the expense was for three dollars and ninety-five cents.|
-| {expense:creditamount} | displays the amount of the expense if the expense is negative. Nothing will be displayed in this column if the expense is positive. It would output -$3.95 assuming the expense was for negative three dollars and ninety-five cents.|
-| **For expenses imported via CDF/VCF feed only** ||
-| {expense:purchaseamount} | is the amount of the original purchase in the currency it was purchased in. Control plan users only.|
-| {expense:purchaseamount} | would output Irk 3.95 assuming the expense was for 3.95 Icelandic krĂłnur, no matter what currency your bank has translated it to.|
-| {expense:purchasecurrency} | would output Irk assuming the expense was incurred in Icelandic krĂłnur (before your bank converted it back to your home currency)|
-| **Original Amount** | **when import with a connected bank**|
-| {expense:originalamount} | is the amount of the expense imported from your bank or credit card feed. It would output $3.95 assuming the expense equated to $3.95 and you use US-based bank. You may add an optional extra input that is either a three-letter currency code or NONE to denote the output's currency.|
-| **Category** | **The category of the expense** |
-| {expense:category} | would output Employee Moral assuming that is the expenses' category.|
-| {expense:category:glcode} | would output the category gl code of the category selected.|
-| {expense:category:payrollcode} | outputs the payroll code information entered for the category that is applied to the expense. If the payroll code for the Mileage category was 39847, this would output simply 39847.|
-| **Attendees** | **Persons listed as attendees on the expense**|
-| {expense:attendees} | would output the name or email address entered in the Attendee field within the expense (ex. guest@domain.com). |
-| {expense:attendees:count} | would output the number of attendees that were added to the expense (ex. 2).8. Attendees - persons listed as attendees on the expense.|
-| **Tags** | Tags of the expense - in this example the name of the tag is "Department" |
-| {expense:tag} | would output Henry at Example Co. assuming that is the expenses' tag. |
-| **Multiple Tags** | Tags for companies that have multiple tags setup. |
-| {expense:tag:ntag-1} | outputs the first tag on the expense, if one is selected |
-| {expense:tag:ntag-3} | outputs the third tag on the expense, if one is selected |
-| **Description** | The description on the expense |
-| {expense:comment} |would output "office lunch" assuming that is the expenses' description.|
-| **Receipt** | |
-| {expense:receipt:type} | would output eReceipt if the receipt is an Expensify Guaranteed eReceipt.|
-| {expense:receipt:url} | would output a link to the receipt image page that anyone with access to the receipt in Expensify could view.|
-| {expense:receipt:url:direct} | would show the direct receipt image url for download. |
-| {expense:mcc} | would output 3351 assuming that is the expenses' MCC (Merchant Category Code of the expense).|
-| | Note, we only have the MCC for expenses that are automatically imported or imported from an OFX/QFX file. For those we don't have an MCC for the output would be (an empty string).|
-| **Card name/number expense type** | |
-| {expense:card} | Manual/Cash Expenses — would output Cash assuming the expense was manually entered using either the website or the mobile app.|
-| {expense:card} | Bank Card Expenses — would output user@company.com – 1234 assuming the expense was imported from a credit card feed.|
-| | Note - If you do not have access to the card that the expense was created on 'Unknown' will be displayed. If cards are assigned to users under Domain, then you'll need to be a Domain Admin to export the card number.|
-| **Expense ID** | |
-| {expense:id} | would output the unique number associated with each individual expense "4294967579".|
-| **Reimbursable state** | |
-| {expense:reimbursable} | would output "yes" or "no" depending on whether the expense is reimbursable or not.|
-| **Billable state** | |
-| {expense:billable} | would output "yes" or "no" depending on whether the expense is billable or not.
-| **Expense Number** | **is the ordinal number of the expense on its expense report.**|
-| {report:expense:number} | would output 2 assuming that the given expense was the second expense on its report.|
-| **GL codes** | |
-| {expense:category:glcode} | would output the GL code associated with the category of the expense. If the GL code for Meals is 45256 this would output simply 45256.|
-| {expense:tag:glcode} | would output the GL code associated with the tag of the expense. If the GL code for Client X is 08294 this would output simply 08294.|
-| {expense:tag:ntag-3:glcode} | would output the GL code associated with the third tag the user chooses. This is only for companies that have multiple tags setup.|
-
-## Date formats
-
-| Formula | Description |
-| -- | -- |
-| M/dd/yyyy | 5/23/2019|
-|MMMM dd, yyyy| May 23, 2019|
-|dd MMM yyyy| 23 May 2019|
-|yyyy/MM/dd| 2019/05/23|
-|dd MMM yyyy| 23 May 2019|
-|yyyy/MM/dd| 2019/05/23|
-|MMMM, yyyy| May, 2019|
-|yy/MM/dd| 19/05/23|
-|dd/MM/yy| 23/05/19|
-|yyyy| 2019|
-
-## Math formulas
-
-| Formula | Description |
-| -- | -- |
-| * | Multiplication {math: 3 * 4} output 12|
-| / | Division {math: 3 / 4 }output 0.75|
-| + | Addition {math: 3 + 4 }output |
-| - | Subtraction {math: 3 - 4 }output -1|
-| ^ | Exponent {math: 3 ^ 4 } output 81|
-| sqrt | The square root of a number. {sqrt:64} output 8|
-|| Note - You can also combine the value of any two numeric fields. For example, you can use {math: {expense:tag:glcode} + {expense:category:glcode}} to add the value of the Tag GL code with the Category GL code.|
-
-## Substring formulas
-This formula will output a subset of the string in question. It is important to remember that the count starts at 0 not 1.
-
-`{expense:merchant|substr:0:4}` would output "Star" for a merchant named Starbucks. This is because we are telling it to start at position 0 and be of 4 character length.
-
-`{expense:merchant|substr:4:5}` would output "bucks" for a merchant named Starbucks. This is because we are telling it to start at position 4 and be of 5 character length.
-
-# FAQs
-
-**Can I export one line per report?**
-
-No, the custom template always exports one line per expense. At the moment it is not possible to create a template that will export one line per report.
diff --git a/docs/articles/expensify-classic/spending-insights/Default-Export-Templates.md b/docs/articles/expensify-classic/spending-insights/Default-Export-Templates.md
deleted file mode 100644
index b89dca85df04..000000000000
--- a/docs/articles/expensify-classic/spending-insights/Default-Export-Templates.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: Default Export Templates
-description: Default Export Templates
----
-# Overview
-Use default export templates for exporting report data to a CSV format, for data analysis, or uploading to an accounting software.
-Below is a breakdown of the available default templates.
-# How to use default export templates
-- **All Data - Expense Level Export** - This export prints a line for each expense with all of the data associated with the expenses. This is useful if you want to see all of the data stored in Expensify for each expense.
-- **All Data - Report Level Export** - This export prints a line per report, giving a summary of the report data.
-- **Basic Export** - A simpler expense level export without as much detail. This exports the data visible on the PDF of the report. Basics such as date, amount, merchant, category, tag, reimbursable state, description, receipt URL, and original expense currency and amount.
-- **Canadian Multiple Tax Export** - Exports a line per expense with all available info on the taxes applied to the expenses on your report(s). This is useful if you need to see the tax spend.
-- **Category Export** - Exports category names with the total amount attributed to each category on the report. While you can also access this information on the Insights page, it can be convenient to export to a CSV to run further analysis in your favorite spreadsheet program.
-- **Per Diem Export** - This exports basic expense details only for the per diem expenses on the report. Useful for reviewing employee Per Diem spend.
-- **Tag Export** - Exports tag names into columns with the total amount attributed to each tag on the report.
-
-# How to export using a default template
-1. Navigate to your Reports page
-2. Select the reports you want to export (you can use the filters to help you find the reports you’re after)
-3. Click the **Export to** in the top right corner
-4. Select the export template you’d like to use
-
-{% include faq-begin.md %}
-## Why are my numbers exporting in a weird format?
-Do your numbers look something like this: 1.7976931348623157e+308? This means that your spreadsheet program is formatting long numbers in an exponential or scientific format. If that happens, you can correct it by changing the data to Plain Text or a Number in your spreadsheet program.
-## Why are my leading zeros missing?
-Is the export showing “1” instead of “01”? This means that your spreadsheet program is cutting off the leading zero. This is a common issue with viewing exported data in Excel. Unfortunately, we don’t have a good solution for this. We recommend checking your spreadsheet program’s help documents for suggestions for formatting.
-## I want a report that is not in the default list, how can I build that?
-For a guide on building your own custom template check out Exports > Custom Exports in the Help pages!
-
-{% include faq-end.md %}
diff --git a/docs/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports.md b/docs/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports.md
new file mode 100644
index 000000000000..eac2723e5c9c
--- /dev/null
+++ b/docs/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports.md
@@ -0,0 +1,294 @@
+---
+title: Export Expenses and Reports
+description: How to export expenses and reports using custom reports, PDF files, CSVs, and more
+---
+
+There are several methods you can use to export your expenses and reports, including:
+- Export as a PDF
+- Export as a CSV or to an accounting integration
+- Export using a default or custom export template
+
+# Export PDF
+
+1. Click the **Reports** tab.
+2. Open a report.
+3. Click **Details** in the top right of the report.
+4. Click the download icon.
+
+The PDF will be downloaded with all expenses, any attached receipts, and all report notes.
+
+# Export CSV or apply a template
+
+1. Click either the **Expenses** or **Reports** tab.
+2. On the left hand side, select the expenses/reports you’d like to export.
+3. Click **Export to** at the top right of the page.
+4. Choose the desired export option. You can use one of the default templates below, or you can create your own template. *Note: The default templates and the option to export to a connected accounting package are only available on the Reports page.*
+ - **All Data - Expense Level Export**: Prints a line for each expense with all of the data associated with the expenses. This is useful if you want to see all of the data stored in Expensify for each expense.
+ - **All Data - Report Level Export**: Prints a line per report, giving a summary of the report data.
+ - **Basic Export**: A simpler expense-level export of the data visible on the PDF report. Includes basics such as date, amount, merchant, category, tag, reimbursable state, description, receipt URL, and original expense currency and amount.
+ - **Canadian Multiple Tax Export**: Exports a line per expense with all available information on the taxes applied to the expenses on your report(s). This is useful if you need to see the tax spend.
+ - **Category Export**: Exports category names with the total amount attributed to each category on the report. While you can also access this information on the Insights page, it can be convenient to export to a CSV to run further analysis in your favorite spreadsheet program.
+ - **Per Diem Export**: Exports basic expense details for only the per diem expenses on the report. Useful for reviewing employee Per Diem spend.
+ - **Tag Export**: Exports tag names into columns with the total amount attributed to each tag on the report.
+
+# Create custom export templates
+
+If you don't have a direct connection to your accounting system, you can export your expense data to the system for upload as long as the system accepts a CSV file. You can then analyze the data in your favorite spreadsheet program.
+
+Custom export templates can be created and made available to all Workspace Admins for your workspace, or you can create a template that is just for your own use.
+
+## For a workspace
+
+{% include info.html %}
+Must be a Group Workspace Admin to complete this process.
+{% include end-info.html %}
+
+1. Hover over **Settings** and click **Workspaces**.
+2. Select the desired workspace.
+3. Click the **Export Formats** tab on the left.
+4. Click **New Export Format**.
+5. Enter a name for the export format.
+6. Select the format type (e.g., CSV, XLS for Excel, or CSV without BOM for MS Access)
+7. Enter a name and formula for each column (formulas provided below).
+8. Scroll below all of the columns and, if needed:
+ - Click **Add Column** to add a new column.
+ - Drag and drop the columns into a different order.
+ - Hover over a column and click the red X in the right corner to delete it.
+9. Check the Example Output at the bottom and click **Save Export Format** when all the columns are complete.
+
+## For personal use
+
+1. Hover over **Settings** and click **Account**.
+2. Click **Preferences**.
+3. Under CSV Export Formats, click **New Export Format**.
+4. Enter a name for the export format.
+5. Select the format type (e.g., CSV, XLS for Excel, or CSV without BOM for MS Access)
+6. Enter a name and formula for each column (formulas provided below).
+7. Scroll below all of the columns and, if needed:
+ - Click **Add Column** to add a new column.
+ - Drag and drop the columns into a different order.
+ - Hover over a column and click the red X in the right corner to delete it.
+8. Check the Example Output at the bottom and click **Save Export Format** when all the columns are complete.
+
+## Formulas
+
+Enter any of the following formulas into the Formula field for each column. Be sure to also include both brackets around the formula as shown in the table below.
+
+### Report level
+
+| Formula | Description |
+| -- | -- |
+| Report title | The title of the report the expense is part of. |
+| {report:title} | Would output "Expense Expenses to 2019-11-05" assuming that is the report's title.|
+| Report ID | Number is a unique number per report and can be used to identify specific reports.|
+| {report:id} | Would output R00I7J3xs5fn assuming that is the report's ID.|
+| Old Report ID | A unique number per report and can be used to identify specific reports as well. Every report has both an ID and an old ID - they're simply different ways of showing the same information in either [base10](https://community.expensify.com/home/leaving?allowTrusted=1&target=https%3A%2F%2Fwww.twinkl.co.uk%2Fteaching-wiki%2Fbase-10) or base62. |
+| {report:oldID} | Would output R3513250790654885 assuming that is the report's old ID.|
+| Reimbursement ID | The unique number for a report that's been reimbursed via ACH in Expensify. The reimbursement ID is searchable on the Reports page and is found on your bank statement in the line-item detail for the reimbursed amount.|
+| {report:reimbursementid} | Would output 123456789109876 assuming that is the ID on the line-item detail for the reimbursed amount in your business bank account.|
+| Report Total | The total amount of the expense report.|
+| {report:total} | Would output $325.34 assuming that is the report's total.|
+| Type | Is the type of report (either Expense Report, Invoice or Bill)|
+| {report:type} | Would output "Expense Report" assuming that is the report's type.|
+| Reimbursable Total | Is the total amount that is reimbursable on the report.|
+| {report:reimbursable} | Would output $143.43 assuming the report's reimbursable total was 143.43 US Dollars.|
+| Currency | Is the currency to which all expenses on the report are being converted.|
+| {report:currency} | Would output USD assuming that the report total was calculated in US dollars.|
+|| Note - Currency accepts an optional three character currency code or NONE. If you want to do any math operations on the report total, you should use {report:total:nosymbol} to avoid an error. Please see Expense:Amount for more information on currencies.|
+| Report Field | Formula will output the value for a given Report Field which is created in the workspace settings.|
+| {field:Employee ID} | Would output 12456 , assuming "Employee ID" is the name of the Report Field and "123456" is the value of that field on the report.|
+| Created date | The expense report was originally created by the user.|
+| {report:created} | Would output 2010-09-15 12:00:00 assuming the expense report was created on September 15th, 2010 at noon.|
+| {report:created:yyyy-MM-dd} | Would output 2010-09-15 assuming the expense report was created on September 15, 2010.|
+| | Note - All Date Formulas accept an optional format string. The default if one is not provided is yyyy-MM-dd hh:mm:ss. For a full breakdown, check out the Date Formatting [here](https://community.expensify.com/discussion/5799/deep-dive-date-formating-for-formulas/p1?new=1).|
+| StartDate | Is the date of the earliest expense on the report.|
+| {report:startdate} | Would output 2010-09-15 assuming that is the date of the earliest expense on the report.|
+| EndDate| Is the date of the last expense on the report.|
+| {report:enddate} | Would output 2010-09-26 assuming that is the date of the last expense on the report.|
+| Scheduled Submit Dates | The start and end dates of the Scheduled Submit reporting cycle.|
+| {report:autoReporting:start} | Would output 2010-09-15 assuming that is the start date of the automatic reporting cycle, when the automatic reporting frequency is not set to daily.|
+| {report:autoReporting:end} | Would output 2010-09-26 assuming that is the end date of the automatic reporting cycle, when the automatic reporting frequency is not set to daily.|
+| Submission Date | Is the date that the report was submitted.|
+| {report:submit:date} | Would output 1986-09-15 12:00:00 assuming that the report was submitted on September 15, 1986, at noon.|
+| {report:submit:date:yyyy-MM-dd} | Would output 1986-09-15 assuming that the report was submitted on September 15, 1986.|
+| | Note - All Date Formulas accept an optional format string. The default if one is not provided is yyyy-MM-dd hh:mm:ss. For a full breakdown, check out the Date Formatting.|
+| Approval Date | The date the report was approved. This formula can be used for export templates, but not for report titles.|
+| {report:approve:date} | Would output 2011-09-25 12:00:00 assuming that the report was approved on September 25, 2011, at noon.|
+| {report:approve:date:yyyy-MM-dd} | Would output 2011-09-25 assuming that the report was approved on September 25, 2011.|
+| Reimbursement Date | The date an expense report was reimbursed. This formula can be used for export templates, but not for report titles.|
+| {report:achreimburse} | Would output 2011-09-25 assuming that is the date the report was reimbursed via ACH Direct Deposit.|
+| {report:manualreimburse} | Would output 2011-09-25 assuming that is the date the report was marked as reimbursed. |
+| Export Date | Is the date when the report is exported. This formula can be used for export templates, but not for report titles.|
+| {report:dateexported} | Would output 2013-09-15 12:00 assuming that the report was exported on September 15, 2013, at noon.|
+| {report:dateexported:yyyy-MM-dd} | Would output 2013-09-15 assuming that the report was exported on September 15, 2013.|
+| Expenses Count | Is the number of total expenses on the report of this specific expense.|
+| {report:expensescount} | Would output 10 assuming that there were 10 expenses on the given report for this expense.|
+| Workspace Name | Is the name of the workspace applied to the report.|
+| {report:policyname} | Would output Sales assuming that the given report was under a workspace named Sales.|
+| Status | Is the current state of the report when it was exported.|
+| {report:status} | Would output Approved assuming that the report has been approved and not yet reimbursed.|
+| Custom Fields | |
+| {report:submit:from:customfield1} | Would output the custom field 1 entry associated with the user who submitted the report. If John Smith’s Custom Field 1 contains 100, then this formula would output 100.|
+| {report:submit:from:customfield2} | Would output the custom field 2 entry associated with the user who submitted the report. If John Smith’s Custom Field 2 contains 1234, then this formula would output 1234. |
+| To | Is the email address of the last person who the report was submitted to.|
+| {report:submit:to} | Would output alice@email.com if they are the current approver.|
+| {report:submit:to:email\|frontPart} | Would output alice.|
+| Current user | To export the email of the currently logged in Expensify user.|
+| {user:email} | Would output bob@example.com assuming that is the currently logged in Expensify user's email.|
+| Submitter | "Sally Ride" with email "sride@email.com" is the submitter for the following examples.|
+| {report:submit:from:email}| sride@email.com|
+| {report:submit:from}| Sally Ride|
+| {report:submit:from:firstname}| Sally|
+| {report:submit:from:lastname}| Ride|
+| {report:submit:from:fullname}| Sally Ride |
+| | Note - If user's name is blank, then {report:submit:from} and {report:submit:from:email\|frontPart} will print the user's whole email.|
+
+`{report:submit:from:email|frontPart}` sride
+
+`{report:submit:from:email|domain}` email.com
+
+`{user:email|frontPart}` would output bob assuming that is the currently logged in Expensify user's email.
+
+### Expense level
+
+| Formula | Description |
+| -- | -- |
+| Merchant | Merchant of the expense |
+| {expense:merchant} | Would output Sharons Coffee Shop and Grill assuming the expense is from Sharons Coffee Shop. |
+| {expense:distance:count} | Would output the total miles/kilometers of the expense.|
+| {expense:distance:rate} | Would output the monetary rate allowed per mile/kilometer. |
+| {expense:distance:unit} | Would output either mi or km depending on which unit is applied in the workspace settings. |
+| Date | Related to the date listed on the expense |
+| {expense:created:yyyy-MM-dd} | Would output 2019-11-05 assuming the expense was created on November 5th, 2019. |
+| {expense:posted:yyyy-MM-dd} | Would output 2023-07-24 assuming the expense was posted on July 24th, 2023. |
+| Tax | The tax type and amount applied to the expense line item. |
+| {expense:tax:field} | Would output VAT assuming this is the name of the tax field.|
+| {expense:tax:ratename} | Would output the name of the tax rate that was used (ex: Standard). This will show custom if the chosen tax amount is manually entered and not chosen from the list of given options.|
+| {expense:tax:amount} | Would output $2.00 assuming that is the amount of the tax on the expense.|
+| {expense:tax:percentage} | Would output 20% assuming this is the amount of tax that was applied to the subtotal.|
+| {expense:tax:net} | would output $18.66 assuming this is the amount of the expense before tax was applied.|
+| {expense:tax:code} | would output the tax code that was set in the workspace settings.|
+| Expense Amount | Related to the currency type and amount of the expense. |
+| {expense:amount} | Would output $3.95 assuming the expense was for three dollars and ninety-five cents.|
+| {expense:amount:isk} | Would output ĂŤkr3.95 assuming the expense was for 3.95 Icelandic krĂłna.|
+| {expense:amount:nosymbol} | Would output 3.95. Notice that there is no currency symbol in front of the expense amount because we designated none.|
+| {expense:exchrate} | Would output the currency conversion rate used to convert the expense amount|
+| | Add an optional extra input that is either a three-letter currency code or nosymbol to denote the output's currency. The default if one isn't provided is USD.|
+| {expense:amount:originalcurrency} | This gives the amount of the expense in the currency in which it occurred before currency conversion |
+| {expense:amount:originalcurrency:nosymbol} | Will export the expense in its original currency without the currency symbol. |
+| {expense:amount:negsign} | displays negative expenses with a minus sign in front rather wrapped in parenthesis. It would output -$3.95 assuming the expense was already a negative expense for three dollars and ninety-five cents. This formula does not convert a positive expense to a negative value.|
+| {expense:amount:unformatted} | Displays expense amounts without commas. This removes commas from expenses that have an amount of more than 1000. It would output $10000 assuming the expense was for ten thousand dollars.|
+| {expense:debitamount} | Displays the amount of the expense if the expense is positive. Nothing will be displayed in this column if the expense is negative. It would output $3.95 assuming the expense was for three dollars and ninety-five cents.|
+| {expense:creditamount} | Displays the amount of the expense if the expense is negative. Nothing will be displayed in this column if the expense is positive. It would output -$3.95 assuming the expense was for negative three dollars and ninety-five cents.|
+| For expenses imported via CDF/VCF feed only ||
+| {expense:purchaseamount} | Is the amount of the original purchase in the currency it was purchased in. Control plan users only.|
+| {expense:purchaseamount} | Would output Irk 3.95 assuming the expense was for 3.95 Icelandic krĂłnur, no matter what currency your bank has translated it to.|
+| {expense:purchasecurrency} | Would output Irk assuming the expense was incurred in Icelandic krĂłnur (before your bank converted it back to your home currency).|
+| Original Amount | When import with a connected bank.|
+| {expense:originalamount} | Is the amount of the expense imported from your bank or credit card feed. It would output $3.95 assuming the expense equated to $3.95 and you use US-based bank. You may add an optional extra input that is either a three-letter currency code or NONE to denote the output's currency.|
+| Category | The category of the expense. |
+| {expense:category} | Would output Employee Moral assuming that is the expenses' category.|
+| {expense:category:glcode} | Would output the category gl code of the category selected.|
+| {expense:category:payrollcode} | Outputs the payroll code information entered for the category that is applied to the expense. If the payroll code for the Mileage category was 39847, this would output simply 39847.|
+| Attendees | Persons listed as attendees on the expense.|
+| {expense:attendees} | Would output the name or email address entered in the Attendee field within the expense (ex. guest@domain.com). |
+| {expense:attendees:count} | Would output the number of attendees that were added to the expense (ex. 2).8. Attendees - persons listed as attendees on the expense.|
+| Tags | Tags of the expense - in this example the name of the tag is "Department." |
+| {expense:tag} | Would output Henry at Example Co. assuming that is the expenses' tag. |
+| Multiple Tags | Tags for companies that have multiple tags setup. |
+| {expense:tag:ntag-1} | Outputs the first tag on the expense, if one is selected. |
+| {expense:tag:ntag-3} | Outputs the third tag on the expense, if one is selected. |
+| Description | The description on the expense. |
+| {expense:comment} | Would output "office lunch" assuming that is the expenses' description.|
+| Receipt | |
+| {expense:receipt:type} | Would output eReceipt if the receipt is an Expensify Guaranteed eReceipt.|
+| {expense:receipt:url} | Would output a link to the receipt image page that anyone with access to the receipt in Expensify could view.|
+| {expense:receipt:url:direct} | Would show the direct receipt image url for download. |
+| {expense:mcc} | Would output 3351 assuming that is the expenses' MCC (Merchant Category Code of the expense).|
+| | Note, we only have the MCC for expenses that are automatically imported or imported from an OFX/QFX file. For those we don't have an MCC for the output would be (an empty string).|
+| Card name/number expense type | |
+| {expense:card} | Manual/Cash Expenses — would output Cash assuming the expense was manually entered using either the website or the mobile app.|
+| {expense:card} | Bank Card Expenses — would output user@company.com – 1234 assuming the expense was imported from a credit card feed.|
+| | Note - If you do not have access to the card that the expense was created on 'Unknown' will be displayed. If cards are assigned to users under Domain, then you'll need to be a Domain Admin to export the card number.|
+| Expense ID | |
+| {expense:id} | Would output the unique number associated with each individual expense "4294967579".|
+| Reimbursable state | |
+| {expense:reimbursable} | Would output "yes" or "no" depending on whether the expense is reimbursable or not.|
+| Billable state | |
+| {expense:billable} | Would output "yes" or "no" depending on whether the expense is billable or not.
+| Expense Number | Is the ordinal number of the expense on its expense report.|
+| {report:expense:number} | Would output 2 assuming that the given expense was the second expense on its report.|
+| GL codes | |
+| {expense:category:glcode} | Would output the GL code associated with the category of the expense. If the GL code for Meals is 45256 this would output simply 45256.|
+| {expense:tag:glcode} | Would output the GL code associated with the tag of the expense. If the GL code for Client X is 08294 this would output simply 08294.|
+| {expense:tag:ntag-3:glcode} | Would output the GL code associated with the third tag the user chooses. This is only for companies that have multiple tags setup.|
+
+### Date formats
+
+| Formula | Description |
+| -- | -- |
+| M/dd/yyyy | 5/23/2019|
+|MMMM dd, yyyy| May 23, 2019|
+|dd MMM yyyy| 23 May 2019|
+|yyyy/MM/dd| 2019/05/23|
+|dd MMM yyyy| 23 May 2019|
+|yyyy/MM/dd| 2019/05/23|
+|MMMM, yyyy| May, 2019|
+|yy/MM/dd| 19/05/23|
+|dd/MM/yy| 23/05/19|
+|yyyy| 2019|
+
+### Math formulas
+
+| Formula | Description |
+| -- | -- |
+| * | Multiplication {math: 3 * 4} output 12|
+| / | Division {math: 3 / 4 }output 0.75|
+| + | Addition {math: 3 + 4 }output |
+| - | Subtraction {math: 3 - 4 }output -1|
+| ^ | Exponent {math: 3 ^ 4 } output 81|
+| sqrt | The square root of a number. {sqrt:64} output 8|
+|| Note - You can also combine the value of any two numeric fields. For example, you can use {math: {expense:tag:glcode} + {expense:category:glcode}} to add the value of the Tag GL code with the Category GL code.|
+
+### Substring formulas
+
+This formula will output a subset of the string in question. It is important to remember that the count starts at 0 not 1.
+
+`{expense:merchant|substr:0:4}` would output "Star" for a merchant named Starbucks. This is because we are telling it to start at position 0 and be of 4 character length.
+
+`{expense:merchant|substr:4:5}` would output "bucks" for a merchant named Starbucks. This is because we are telling it to start at position 4 and be of 5 character length.
+
+{% include faq-begin.md %}
+
+**Can I export one line per report?**
+
+No, the custom template always exports one line per *expense*. At the moment, it is not possible to create a template that will export one line per report.
+
+**How do I print a report?**
+
+1. Click the **Reports** tab.
+2. Open a report.
+3. Click **Details** in the top right of the report.
+4. Click the Print icon.
+
+**Why isn’t my report exporting?**
+
+Big reports with a lot of expenses may cause the PDF download to fail due to images with large resolutions. In that case, try breaking the report into multiple smaller reports. A report must have at least one expense to be exported or saved as a PDF.
+
+**Can I download multiple PDFs at once?**
+
+No, you can’t download multiple reports as PDFs at the same time. If you’d like to export multiple reports, an alternative to consider is the CSV export option.
+
+**The data exported to Excel is showing incorrectly. How can I fix this?**
+
+When opening a CSV file export from Expensify in Excel, it’ll automatically register report IDs and transaction IDs as numbers and assign the number format to the report ID column. If a number is greater than a certain length, Excel will contract the number and display it in exponential form. To prevent this, the number needs to be imported as text, which can be done by opening Excel and clicking File > Import > select your CSV file. Follow the prompts, then on step 3, set the report ID/transactionID column to import as Text.
+
+**Why are my numbers exporting in a weird format?**
+
+Do your numbers look something like this: 1.7976931348623157e+308? This means that your spreadsheet program is formatting long numbers in an exponential or scientific format. If that happens, you can correct it by changing the data to Plain Text or a Number in your spreadsheet program.
+
+**Why are my leading zeros missing?**
+
+Is the export showing “1” instead of “01”? This means that your spreadsheet program is cutting off the leading zero. This is a common issue with viewing exported data in Excel. Unfortunately, we don’t have a good solution for this. We recommend checking your spreadsheet program’s help documents for formatting suggestions.
+
+{% include faq-end.md %}
diff --git a/docs/articles/expensify-classic/spending-insights/Other-Export-Options.md b/docs/articles/expensify-classic/spending-insights/Other-Export-Options.md
deleted file mode 100644
index 9d752dec3eb9..000000000000
--- a/docs/articles/expensify-classic/spending-insights/Other-Export-Options.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-title: Other Export Options
-description: Other Export Options
----
-
-# Overview
-Here’s a quick look at how to export your expense and report data into a spreadsheet, accounting package, or PDF. We’ll also show you how to print out your reports in a few easy steps.
-
-# How to export expenses and reports to a CSV or accounting package
-From the **Expenses** page, you can export individual expenses into a CSV. From the Reports page, you can export entire reports into a CSV or connected accounting package. Here’s how to do both:
-
-1. Go to either the Expenses or Reports page
-2. On the left hand side, select the expenses/reports you’d like to export
-3. Click **Export to** at the top right of the page
-4. Choose the desired export option
-
-You can use one of the [default templates](https://help.expensify.com/articles/expensify-classic/insights-and-custom-reporting/Default-Export-Templates) or [create your own template](https://help.expensify.com/articles/expensify-classic/insights-and-custom-reporting/Custom-Templates). The default templates and the option to export to a connected accounting package are only available on the **Reports** page. Visit the specific help page for your accounting package to learn more about how to get this set up.
-
-# How to export a report as a PDF
-1. Go to the **Reports** page
-2. Click into a report
-3. Click on **Details** in the top right of the report
-4. Click the **download icon** to generate a PDF
-
-The PDF will include all expenses, any attached receipts, and all report notes.
-
-# How to print a report
-1. Go to the Reports page
-2. Click into a report
-3. Click on **Details** in the top right of the report
-4. Click the **print icon**
-
-{% include faq-begin.md %}
-## Why isn’t my report exporting?
-Big reports with lots of expenses may cause the PDF download to fail due to images with large resolutions. In that case, try breaking the report into multiple smaller reports. Also, please note that a report must have at least one expense to be exported or saved as a PDF.
-## Can I download multiple PDFs at once?
-No, you can’t download multiple reports as PDFs at the same time. If you’d like to export multiple reports, an alternative to consider is the CSV export option.
-## The data exported to Excel is showing incorrectly. How can I fix this?
-When opening a CSV file export from Expensify in Excel, it’ll automatically register report IDs and transaction IDs as numbers and assign the number format to the report ID column. If a number is greater than a certain length, Excel will contract the number and display it in exponential form. To prevent this, the number needs to be imported as text, which can be done by opening Excel and clicking File > Import > select your CSV file > follow the prompts and on step 3 set the report ID/transactionID column to import as Text.
-
-{% include faq-end.md %}
diff --git a/docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md b/docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md
index 5d25670ac5ab..f48d069e21dc 100644
--- a/docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md
+++ b/docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md
@@ -1,8 +1,7 @@
---
title: Book with Expensify Travel
-description: Book flights, hotels, cars, trains, and more with Expensify Travel
+description: How to book flights, hotels, cars, trains, and more with Expensify Travel
---
-
Expensify Travel allows members to search and book flights, hotels, cars, and trains globally at the most competitive rates available.
@@ -38,52 +37,6 @@ The traveler is emailed an itinerary of the booking. Additionally,
The travel itinerary is also emailed to the traveler’s [copilots](https://help.expensify.com/articles/expensify-classic/copilots-and-delegates/Assign-or-remove-a-Copilot), if applicable.
{% include end-info.html %}
-
+# Edit or cancel travel arrangements
-
-Expensify Travel allows members to search and book flights, hotels, cars, and trains globally at the most competitive rates available.
-
-With Expensify Travel, you can:
-- Search and book travel arrangements all in one place
-- Book travel for yourself or for someone else
-- Get real-time support by chat or phone
-- Manage all your T&E expenses in Expensify
-- Create specific rules for booking travel
-- Enable approvals for out-of-policy trips
-- Book with any credit card on the market
-- Book with the Expensify Card to get cash back and automatically reconcile transactions
-
-There is a flat fee of $15 per trip booked. A single trip can include multiple bookings, such as a flight, a hotel, and a car rental.
-
-# Book travel
-
-{% include selector.html values="desktop, mobile" %}
-
-{% include option.html value="desktop" %}
-1. Click the + icon in the bottom left menu and select **Book travel**.
-2. Click **Book or manage travel**.
-3. Agree to the terms and conditions and click **Continue**.
-4. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains.
-5. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.).
-6. Select all the details for the arrangement you want to book.
-7. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking.
-{% include end-option.html %}
-
-{% include option.html value="mobile" %}
-1. Tap the + icon in the bottom menu and select **Book travel**.
-2. Tap **Book or manage travel**.
-3. Agree to the terms and conditions and tap **Continue**.
-4. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains.
-5. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.).
-6. Select all the details for the arrangement you want to book.
-7. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking.
-{% include end-option.html %}
-
-{% include end-selector.html %}
-
-The traveler is emailed an itinerary of the booking. Additionally,
-- Their travel details are added to a Trip chat room under their primary workspace.
-- An expense report for the trip is created.
-- If booked with an Expensify Card, the trip is automatically reconciled.
-
-
+Click **Get Support** on your emailed travel itinerary for real-time help with the booking. Any modifications, exchanges, or voidings made to a trip via support will incur a $25 booking change fee.
diff --git a/docs/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements.md b/docs/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements.md
deleted file mode 100644
index 7dc71c3220ca..000000000000
--- a/docs/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-title: Edit or cancel travel arrangements
-description: Modify travel arrangements booked with Expensify Travel
----
-
-
-Click **Get Support** on your emailed travel itinerary for real-time help with the booking. Any modifications, exchanges, or voidings made to a trip via support will incur a $25 booking change fee.
-
-
-
-
-
-You can review your travel arrangements any time by opening the Trip chat in your inbox. For example, if you booked a flight to San Francisco, a “Trip to San Francisco” chat will be automatically added to your chat inbox.
-
-To edit or cancel a travel arrangement,
-1. Click your profile image or icon in the bottom left menu.
-2. Scroll down and click **Workspaces** in the left menu.
-3. Select the workspace the travel is booked under.
-4. Tap into the booking to see more details.
-5. Click **Trip Support**.
-
-If there is an unexpected change to the itinerary (for example, a flight cancellation), Expensify’s travel partner **Spotnana** will reach out to the traveler to provide updates on those changes.
-
-{% include info.html %}
-You can click **Get Support** on your emailed travel itinerary for real-time help with the booking. Any modifications, exchanges, or voidings made to a trip via support will incur a $25 booking change fee.
-{% include end-info.html %}
-
-
diff --git a/docs/articles/expensify-classic/workspaces/Enable-and-set-up-expense-violations.md b/docs/articles/expensify-classic/workspaces/Enable-and-set-up-expense-violations.md
index 7c3d8077c14d..1d5814138f6e 100644
--- a/docs/articles/expensify-classic/workspaces/Enable-and-set-up-expense-violations.md
+++ b/docs/articles/expensify-classic/workspaces/Enable-and-set-up-expense-violations.md
@@ -29,7 +29,7 @@ If your workspace has automations set to automatically submit reports for approv
- **Receipt required amount**: How much a single expense can cost before a receipt is required
{% include info.html %}
-Expensify includes certain system mandatory violations that can't be disabled, even if your policy has violations turned off.
+Expensify includes certain system mandatory violations that can't be disabled, even if your workspace has violations turned off.
{% include end-info.html %}
# Set category rules
diff --git a/docs/articles/expensify-classic/workspaces/Set-up-your-individual-workspace.md b/docs/articles/expensify-classic/workspaces/Set-up-your-individual-workspace.md
index c8be9a2728d5..04f2688eee90 100644
--- a/docs/articles/expensify-classic/workspaces/Set-up-your-individual-workspace.md
+++ b/docs/articles/expensify-classic/workspaces/Set-up-your-individual-workspace.md
@@ -10,7 +10,7 @@ To set up your individual workspace,
1. Hover over Settings, then click **Workspaces**.
2. Click the **Individual** tab on the left.
-3. Select the policy type that best fits your needs.
+3. Select the workspace type that best fits your needs.
4. Set up your workspace details including the workspace name, expense rules, categories, and more.
{% include info.html %}
diff --git a/docs/articles/expensify-classic/workspaces/Tax-Tracking.md b/docs/articles/expensify-classic/workspaces/Tax-Tracking.md
index 7b859c5101b1..c47e5ed51f32 100644
--- a/docs/articles/expensify-classic/workspaces/Tax-Tracking.md
+++ b/docs/articles/expensify-classic/workspaces/Tax-Tracking.md
@@ -11,9 +11,9 @@ Expensify’s tax tracking feature allows you to:
# How to Enable Tax Tracking
Tax tracking can be enabled in the Tax section of the Workspace settings of any Workspace, whether group or individual.
## If Connected to an Accounting Integration
-If your group Workspace is connected to Xero, QuickBooks Online, Sage Intacct, or NetSuite, make sure to first enable tax via the connection configuration page (Settings > Policies > Group > [Workspace Name] > Connections > Configure) and then sync the connection. Your tax rates will be imported from the accounting system and indicated by its logo.
+If your group Workspace is connected to Xero, QuickBooks Online, Sage Intacct, or NetSuite, make sure to first enable tax via the connection configuration page (Settings > Workspaces > Group > [Workspace Name] > Connections > Configure) and then sync the connection. Your tax rates will be imported from the accounting system and indicated by its logo.
## Not Connected to an Accounting Integration
-If your Workspace is not connected to an accounting system, go to Settings > Policies > Group > [Workspace Name] > Tax to enable tax.
+If your Workspace is not connected to an accounting system, go to Settings > Workspaces > Group > [Workspace Name] > Tax to enable tax.
# Tracking Tax by Expense Category
To set a different tax rate for a specific expense type in the Workspace currency, go to Settings > Workspaces > Group > [Workspace Name] > Categories page. Click "Edit Rules" next to the desired category and set the "Category default tax". This will be applied to new expenses, overriding the default Workspace currency tax rate.
diff --git a/docs/articles/new-expensify/expenses-&-payments/Pay-an-expense.md b/docs/articles/new-expensify/expenses-&-payments/Pay-an-expense.md
new file mode 100644
index 000000000000..5d2b634e8032
--- /dev/null
+++ b/docs/articles/new-expensify/expenses-&-payments/Pay-an-expense.md
@@ -0,0 +1,65 @@
+---
+title: Pay Expenses
+description: Pay workspace expenses or expenses submitted by friends and family
+---
+
+
+# Pay expenses submitted to a workspace
+
+To pay expenses within Expensify, you’ll need to set up your [business bank account](https://help.expensify.com/articles/new-expensify/expenses-&-payments/Connect-a-Business-Bank-Account).
+The submitter must also connect a [personal bank account](https://help.expensify.com/articles/new-expensify/expenses-&-payments/Connect-a-Personal-Bank-Account) to receive the payment.
+
+To pay an expense,
+{% include selector.html values="desktop, mobile" %}
+{% include option.html value="desktop" %}
+1. You will receive an email and in-app notification prompting you to review and **Pay** the expense. If your default contact method is a phone number, you'll receive a text.
+2. Click the **Pay** button on the notification to be directed to New Expensify.
+3. Select a payment option.
+- **Pay with Expensify** to pay the total expense within Expensify. Follow the prompt to pay with a [business bank account](https://help.expensify.com/articles/new-expensify/expenses-&-payments/Connect-a-Business-Bank-Account).
+- **Pay Elsewhere** to pay outside Expensify.
+{% include end-option.html %}
+
+{% include option.html value="mobile" %}
+1. When an employee sends you an expense, you will receive an email and in-app notification prompting you to review and **Pay** the expense. If your default contact method is a phone number, you'll receive a text.
+2. Tap the **Pay** button on the notification to be directed to New Expensify.
+3. Select a payment option.
+- **Pay with Expensify** to pay the total expense within Expensify. Follow the prompt to pay with a [business bank account](https://help.expensify.com/articles/new-expensify/expenses-&-payments/Connect-a-Business-Bank-Account).
+- **Pay Elsewhere** to pay outside Expensify.
+{% include end-option.html %}
+{% include end-selector.html %}
+
+# Pay back friends and family
+
+You'll need to [set up your wallet](https://help.expensify.com/articles/new-expensify/expenses-&-payments/Set-up-your-wallet) to send and receive personal payments within Expensify. The wallet is currently available to customers in the US-only.
+
+To pay an expense,
+
+{% include selector.html values="desktop, mobile" %}
+{% include option.html value="desktop" %}
+1. You will receive an email or in-app notification when an individual sends you an expense. If your default contact method is a phone number, you'll receive a text.
+2. Click the **Pay** button to be directed to New Expensify.
+3. Review the expense details and click **Pay**.
+4. Select a payment option.
+- **Pay with Expensify** to pay the expense with your connected Wallet.
+- **Pay Elsewhere** to pay outside Expensify.
+{% include end-option.html %}
+
+{% include option.html value="mobile" %}
+1. You will receive an email or in-app notification when an individual sends you an expense. If your default contact method is a phone number, you'll receive a text.
+2. Tap the **Pay** button to be directed to New Expensify.
+3. Review the expense details and tap **Pay**.
+4. Select a payment option.
+- **Pay with Expensify** to pay the expense with your connected Wallet.
+- **Pay Elsewhere** to pay outside Expensify.
+{% include end-option.html %}
+{% include end-selector.html %}
+
+{% include faq-begin.md %}
+
+**Can I pay someone in another currency?**
+
+While you can record your expenses in different currencies, Expensify is configured to pay a U.S. personal or business bank account.
+
+{% include faq-end.md %}
+
+
diff --git a/docs/articles/new-expensify/expenses-&-payments/Pay-an-invoice.md b/docs/articles/new-expensify/expenses-&-payments/Pay-an-invoice.md
index 615fac731c41..4be5f9d739b5 100644
--- a/docs/articles/new-expensify/expenses-&-payments/Pay-an-invoice.md
+++ b/docs/articles/new-expensify/expenses-&-payments/Pay-an-invoice.md
@@ -10,7 +10,7 @@ Anyone who receives an Expensify invoice can pay it using Expensify—even if th
You'll receive an automated email or text notification when an invoice is sent to you for payment.
-To pay an invoice,
+# Pay an invoice
{% include selector.html values="desktop, mobile" %}
diff --git a/docs/redirects.csv b/docs/redirects.csv
index 4a08a683d08e..5c83d510ccb8 100644
--- a/docs/redirects.csv
+++ b/docs/redirects.csv
@@ -598,4 +598,8 @@ https://help.expensify.com/articles/expensify-classic/expenses/Track-mileage-exp
https://help.expensify.com/articles/expensify-classic/expenses/Track-per-diem-expenses,https://help.expensify.com/articles/expensify-classic/expenses/Add-an-expense
https://community.expensify.com/discussion/5116/faq-where-can-i-use-the-expensify-card,https://help.expensify.com/articles/new-expensify/expensify-card/Use-your-Expensify-Card#where-can-i-use-my-expensify-card
https://help.expensify.com/articles/other/Expensify-Lounge,https://help.expensify.com/Hidden/Expensify-Lounge
-https://help.expensify.com/articles/new-expensify/expenses-&-payments/Approve-and-pay-expenses,https://help.expensify.com/articles/new-expensify/expenses-&-payments/Approve-expenses
\ No newline at end of file
+https://help.expensify.com/articles/new-expensify/expenses-&-payments/Approve-and-pay-expenses,https://help.expensify.com/articles/new-expensify/expenses-&-payments/Approve-expenses
+https://help.expensify.com/articles/expensify-classic/spending-insights/Custom-Templates,https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports/
+https://help.expensify.com/articles/expensify-classic/spending-insights/Default-Export-Templates,https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports/
+https://help.expensify.com/articles/expensify-classic/spending-insights/Other-Export-Options,https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports/
+https://help.expensify.com/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements,https://help.expensify.com/articles/expensify-classic/travel/Book-with-Expensify-Travel
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
index 697923dcfc30..714b1ca68af2 100644
--- a/fastlane/Fastfile
+++ b/fastlane/Fastfile
@@ -244,12 +244,12 @@ platform :android do
ENV["SUPPLY_UPLOAD_MAX_RETRIES"]="5"
google_play_track_version_codes(
package_name: "org.me.mobiexpensifyg",
- json_key: './android/app/android-fastlane-json-key.json',
+ json_key: './android-fastlane-json-key.json',
track: 'internal'
)
upload_to_play_store(
package_name: "org.me.mobiexpensifyg",
- json_key: './android/app/android-fastlane-json-key.json',
+ json_key: './android-fastlane-json-key.json',
version_code: ENV["VERSION"].to_i,
track: 'internal',
track_promote_to: 'production',
@@ -265,11 +265,15 @@ platform :android do
desc "Submit HybridApp to 100% rollout on Google Play"
lane :complete_hybrid_rollout do
- productionVersionCode = google_play_track_version_codes(track: 'production')
+ productionVersionCodes = google_play_track_version_codes(
+ track: 'production',
+ package_name: "org.me.mobiexpensifyg",
+ json_key: './android-fastlane-json-key.json',
+ )
upload_to_play_store(
package_name: "org.me.mobiexpensifyg",
- json_key: './android/app/android-fastlane-json-key.json',
- version_code: productionVersionCode,
+ json_key: './android-fastlane-json-key.json',
+ version_code: productionVersionCodes.sort.last, # Get the latest version code
track: 'production',
rollout: '1',
skip_upload_apk: true,
@@ -283,11 +287,15 @@ platform :android do
desc "Update HybridApp rollout percentage on Google Play"
lane :update_hybrid_rollout do |options|
- productionVersionCode = google_play_track_version_codes(track: 'production')
+ productionVersionCodes = google_play_track_version_codes(
+ track: 'production',
+ package_name: "org.me.mobiexpensifyg",
+ json_key: './android/app/android-fastlane-json-key.json',
+ )
upload_to_play_store(
package_name: "org.me.mobiexpensifyg",
json_key: './android/app/android-fastlane-json-key.json',
- version_code: productionVersionCode,
+ version_code: productionVersionCodes.sort.last, # Get the latest version code
track: 'production',
rollout: options[:rollout],
skip_upload_apk: true,
@@ -584,7 +592,7 @@ platform :ios do
desc "Submit HybridApp to 100% rollout on App Store"
lane :complete_hybrid_rollout do
- api_token = Spaceship::ConnectAPI::Token.from_json_file("./ios/ios-fastlane-json-key.json")
+ api_token = Spaceship::ConnectAPI::Token.from_json_file("./ios-fastlane-json-key.json")
Spaceship::ConnectAPI.token = api_token
app = Spaceship::ConnectAPI::App.find("com.expensify.expensifylite")
@@ -596,7 +604,7 @@ platform :ios do
lane :submit_hybrid_for_rollout do
deliver(
app_identifier: "com.expensify.expensifylite",
- api_key_path: "./ios/ios-fastlane-json-key.json",
+ api_key_path: "./ios-fastlane-json-key.json",
# Skip HTML report verification
force: true,
diff --git a/help/_includes/search.html b/help/_includes/search.html
deleted file mode 100644
index 7b024ba8ec33..000000000000
--- a/help/_includes/search.html
+++ /dev/null
@@ -1,363 +0,0 @@
-