diff --git a/.github/workflows/cherryPick.yml b/.github/workflows/cherryPick.yml index b2a55876e19b..b4cd2d71a3f8 100644 --- a/.github/workflows/cherryPick.yml +++ b/.github/workflows/cherryPick.yml @@ -95,34 +95,42 @@ jobs: if: fromJSON(steps.cherryPick.outputs.HAS_CONFLICTS) id: createPullRequest run: | - gh pr create \ - --title "🍒 Cherry pick PR #${{ github.event.inputs.PULL_REQUEST_NUMBER }} to staging 🍒" \ - --body \ - "🍒 Cherry pick https://github.com/Expensify/App/pull/${{ github.event.inputs.PULL_REQUEST_NUMBER }} to staging 🍒 - This PR had conflicts when we tried to cherry-pick it to staging. You'll need to manually perform the cherry-pick, using the following steps: + AUTHOR_CHECKLIST=$(sed -n '/### PR Author Checklist/,$p' .github/PULL_REQUEST_TEMPLATE.md) + + PR_DESCRIPTION=$(cat < - - - - - - diff --git a/contributingGuides/REASSURE_PERFORMANCE_TEST.md b/contributingGuides/REASSURE_PERFORMANCE_TEST.md index 0de450b78875..0e3f856819a9 100644 --- a/contributingGuides/REASSURE_PERFORMANCE_TEST.md +++ b/contributingGuides/REASSURE_PERFORMANCE_TEST.md @@ -26,9 +26,9 @@ We use Reassure for monitoring performance regression. It helps us check if our ## Running tests locally - Checkout your base environment, eg. `git checkout main`. -- Collect baseline metrics with `npx reassure --baseline`. +- Collect baseline metrics with `npm run perf-test -- --baseline`. - Apply any desired changes (for testing purposes you can eg. try to slow down a list). -- Collect current metrics with `npx reassure`. +- Collect current metrics with `npm run perf-test`. - Open up the resulting `output.md` / `output.json` (see console output) to compare the results. - With all that information, Reassure can present the render duration times as statistically significant or meaningless. diff --git a/desktop/ELECTRON_EVENTS.ts b/desktop/ELECTRON_EVENTS.ts index b06794567c7d..99f275ab996b 100644 --- a/desktop/ELECTRON_EVENTS.ts +++ b/desktop/ELECTRON_EVENTS.ts @@ -14,6 +14,7 @@ const ELECTRON_EVENTS = { DOWNLOAD_FAILED: 'download-started', DOWNLOAD_CANCELED: 'download-canceled', SILENT_UPDATE: 'silent-update', + OPEN_LOCATION_SETTING: 'open-location-setting', } as const; export default ELECTRON_EVENTS; diff --git a/desktop/contextBridge.ts b/desktop/contextBridge.ts index 74b91c4634a1..13a752e0d6aa 100644 --- a/desktop/contextBridge.ts +++ b/desktop/contextBridge.ts @@ -18,6 +18,7 @@ const WHITELIST_CHANNELS_RENDERER_TO_MAIN = [ ELECTRON_EVENTS.LOCALE_UPDATED, ELECTRON_EVENTS.DOWNLOAD, ELECTRON_EVENTS.SILENT_UPDATE, + ELECTRON_EVENTS.OPEN_LOCATION_SETTING, ] as const; const WHITELIST_CHANNELS_MAIN_TO_RENDERER = [ diff --git a/desktop/main.ts b/desktop/main.ts index 4f642d90da51..2b296d84f6a3 100644 --- a/desktop/main.ts +++ b/desktop/main.ts @@ -1,3 +1,4 @@ +import {exec} from 'child_process'; import {app, BrowserWindow, clipboard, dialog, ipcMain, Menu, shell} from 'electron'; import type {BaseWindow, BrowserView, MenuItem, MenuItemConstructorOptions, WebContents, WebviewTag} from 'electron'; import contextMenu from 'electron-context-menu'; @@ -6,7 +7,7 @@ import type {ElectronLog} from 'electron-log'; import {autoUpdater} from 'electron-updater'; import {machineId} from 'node-machine-id'; import checkForUpdates from '@libs/checkForUpdates'; -import * as Localize from '@libs/Localize'; +import {translate} from '@libs/Localize'; import CONFIG from '@src/CONFIG'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; @@ -71,9 +72,9 @@ function pasteAsPlainText(browserWindow: BrowserWindow | BrowserView | WebviewTa function createContextMenu(preferredLocale: Locale = LOCALES.DEFAULT): () => void { return contextMenu({ labels: { - cut: Localize.translate(preferredLocale, 'desktopApplicationMenu.cut'), - paste: Localize.translate(preferredLocale, 'desktopApplicationMenu.paste'), - copy: Localize.translate(preferredLocale, 'desktopApplicationMenu.copy'), + cut: translate(preferredLocale, 'desktopApplicationMenu.cut'), + paste: translate(preferredLocale, 'desktopApplicationMenu.paste'), + copy: translate(preferredLocale, 'desktopApplicationMenu.copy'), }, append: (defaultActions, parameters, browserWindow) => [ { @@ -81,10 +82,10 @@ function createContextMenu(preferredLocale: Locale = LOCALES.DEFAULT): () => voi visible: parameters.isEditable && parameters.editFlags.canPaste, role: 'pasteAndMatchStyle', accelerator: DESKTOP_SHORTCUT_ACCELERATOR.PASTE_AND_MATCH_STYLE, - label: Localize.translate(preferredLocale, 'desktopApplicationMenu.pasteAndMatchStyle'), + label: translate(preferredLocale, 'desktopApplicationMenu.pasteAndMatchStyle'), }, { - label: Localize.translate(preferredLocale, 'desktopApplicationMenu.pasteAsPlainText'), + label: translate(preferredLocale, 'desktopApplicationMenu.pasteAsPlainText'), visible: parameters.isEditable && parameters.editFlags.canPaste && clipboard.readText().length > 0, accelerator: DESKTOP_SHORTCUT_ACCELERATOR.PASTE_AS_PLAIN_TEXT, click: () => pasteAsPlainText(browserWindow), @@ -126,7 +127,7 @@ let hasUpdate = false; let downloadedVersion: string; let isSilentUpdating = false; -// Note that we have to subscribe to this separately and cannot use Localize.translateLocal, +// Note that we have to subscribe to this separately and cannot use translateLocal, // because the only way code can be shared between the main and renderer processes at runtime is via the context bridge // So we track preferredLocale separately via ELECTRON_EVENTS.LOCALE_UPDATED const preferredLocale: Locale = CONST.LOCALES.DEFAULT; @@ -165,23 +166,23 @@ const manuallyCheckForUpdates = (menuItem?: MenuItem, browserWindow?: BaseWindow if (downloadPromise) { dialog.showMessageBox(browserWindow, { type: 'info', - message: Localize.translate(preferredLocale, 'checkForUpdatesModal.available.title'), - detail: Localize.translate(preferredLocale, 'checkForUpdatesModal.available.message', {isSilentUpdating}), - buttons: [Localize.translate(preferredLocale, 'checkForUpdatesModal.available.soundsGood')], + message: translate(preferredLocale, 'checkForUpdatesModal.available.title'), + detail: translate(preferredLocale, 'checkForUpdatesModal.available.message', {isSilentUpdating}), + buttons: [translate(preferredLocale, 'checkForUpdatesModal.available.soundsGood')], }); } else if (result && 'error' in result && result.error) { dialog.showMessageBox(browserWindow, { type: 'error', - message: Localize.translate(preferredLocale, 'checkForUpdatesModal.error.title'), - detail: Localize.translate(preferredLocale, 'checkForUpdatesModal.error.message'), - buttons: [Localize.translate(preferredLocale, 'checkForUpdatesModal.notAvailable.okay')], + message: translate(preferredLocale, 'checkForUpdatesModal.error.title'), + detail: translate(preferredLocale, 'checkForUpdatesModal.error.message'), + buttons: [translate(preferredLocale, 'checkForUpdatesModal.notAvailable.okay')], }); } else { dialog.showMessageBox(browserWindow, { type: 'info', - message: Localize.translate(preferredLocale, 'checkForUpdatesModal.notAvailable.title'), - detail: Localize.translate(preferredLocale, 'checkForUpdatesModal.notAvailable.message'), - buttons: [Localize.translate(preferredLocale, 'checkForUpdatesModal.notAvailable.okay')], + message: translate(preferredLocale, 'checkForUpdatesModal.notAvailable.title'), + detail: translate(preferredLocale, 'checkForUpdatesModal.notAvailable.message'), + buttons: [translate(preferredLocale, 'checkForUpdatesModal.notAvailable.okay')], cancelId: 2, }); } @@ -242,7 +243,7 @@ const localizeMenuItems = (submenu: MenuItemConstructorOptions[], updatedLocale: submenu.map((menu) => { const newMenu: MenuItemConstructorOptions = {...menu}; if (menu.id) { - const labelTranslation = Localize.translate(updatedLocale, `desktopApplicationMenu.${menu.id}` as TranslationPaths); + const labelTranslation = translate(updatedLocale, `desktopApplicationMenu.${menu.id}` as TranslationPaths); if (labelTranslation) { newMenu.label = labelTranslation; } @@ -310,7 +311,25 @@ const mainWindow = (): Promise => { }); ipcMain.handle(ELECTRON_EVENTS.REQUEST_DEVICE_ID, () => machineId()); + ipcMain.handle(ELECTRON_EVENTS.OPEN_LOCATION_SETTING, () => { + if (process.platform !== 'darwin') { + // Platform not supported for location settings + return Promise.resolve(undefined); + } + return new Promise((resolve, reject) => { + const command = 'open x-apple.systempreferences:com.apple.preference.security?Privacy_Location'; + + exec(command, (error) => { + if (error) { + console.error('Error opening location settings:', error); + reject(error); + return; + } + resolve(undefined); + }); + }); + }); /* * The default origin of our Electron app is app://- instead of https://new.expensify.com or https://staging.new.expensify.com * This causes CORS errors because the referer and origin headers are wrong and the API responds with an Access-Control-Allow-Origin that doesn't match app://- @@ -353,14 +372,14 @@ const mainWindow = (): Promise => { const initialMenuTemplate: MenuItemConstructorOptions[] = [ { id: 'mainMenu', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.mainMenu`), + label: translate(preferredLocale, `desktopApplicationMenu.mainMenu`), submenu: [ {id: 'about', role: 'about'}, - {id: 'update', label: Localize.translate(preferredLocale, `desktopApplicationMenu.update`), click: quitAndInstallWithUpdate, visible: false}, - {id: 'checkForUpdates', label: Localize.translate(preferredLocale, `desktopApplicationMenu.checkForUpdates`), click: manuallyCheckForUpdates}, + {id: 'update', label: translate(preferredLocale, `desktopApplicationMenu.update`), click: quitAndInstallWithUpdate, visible: false}, + {id: 'checkForUpdates', label: translate(preferredLocale, `desktopApplicationMenu.checkForUpdates`), click: manuallyCheckForUpdates}, { id: 'viewShortcuts', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.viewShortcuts`), + label: translate(preferredLocale, `desktopApplicationMenu.viewShortcuts`), accelerator: 'CmdOrCtrl+J', click: () => { showKeyboardShortcutsPage(browserWindow); @@ -378,12 +397,12 @@ const mainWindow = (): Promise => { }, { id: 'fileMenu', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.fileMenu`), + label: translate(preferredLocale, `desktopApplicationMenu.fileMenu`), submenu: [{id: 'closeWindow', role: 'close', accelerator: 'Cmd+w'}], }, { id: 'editMenu', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.editMenu`), + label: translate(preferredLocale, `desktopApplicationMenu.editMenu`), submenu: [ {id: 'undo', role: 'undo'}, {id: 'redo', role: 'redo'}, @@ -406,7 +425,7 @@ const mainWindow = (): Promise => { {type: 'separator'}, { id: 'speechSubmenu', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.speechSubmenu`), + label: translate(preferredLocale, `desktopApplicationMenu.speechSubmenu`), submenu: [ {id: 'startSpeaking', role: 'startSpeaking'}, {id: 'stopSpeaking', role: 'stopSpeaking'}, @@ -416,7 +435,7 @@ const mainWindow = (): Promise => { }, { id: 'viewMenu', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.viewMenu`), + label: translate(preferredLocale, `desktopApplicationMenu.viewMenu`), submenu: [ {id: 'reload', role: 'reload'}, {id: 'forceReload', role: 'forceReload'}, @@ -431,7 +450,7 @@ const mainWindow = (): Promise => { }, { id: 'historyMenu', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.historyMenu`), + label: translate(preferredLocale, `desktopApplicationMenu.historyMenu`), submenu: [ { id: 'back', @@ -472,33 +491,33 @@ const mainWindow = (): Promise => { }, { id: 'helpMenu', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.helpMenu`), + label: translate(preferredLocale, `desktopApplicationMenu.helpMenu`), role: 'help', submenu: [ { id: 'learnMore', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.learnMore`), + label: translate(preferredLocale, `desktopApplicationMenu.learnMore`), click: () => { shell.openExternal(CONST.MENU_HELP_URLS.LEARN_MORE); }, }, { id: 'documentation', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.documentation`), + label: translate(preferredLocale, `desktopApplicationMenu.documentation`), click: () => { shell.openExternal(CONST.MENU_HELP_URLS.DOCUMENTATION); }, }, { id: 'communityDiscussions', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.communityDiscussions`), + label: translate(preferredLocale, `desktopApplicationMenu.communityDiscussions`), click: () => { shell.openExternal(CONST.MENU_HELP_URLS.COMMUNITY_DISCUSSIONS); }, }, { id: 'searchIssues', - label: Localize.translate(preferredLocale, `desktopApplicationMenu.searchIssues`), + label: translate(preferredLocale, `desktopApplicationMenu.searchIssues`), click: () => { shell.openExternal(CONST.MENU_HELP_URLS.SEARCH_ISSUES); }, 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 0c0153522af3..f27c883ad82c 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 @@ -1,86 +1,106 @@ --- -title: Changing your workspace plan -description: How to change your plan or subscription +title: Changing Your Workspace Plan +description: How to change your Expensify plan or subscription --- -# Overview -Expensify offers various plans depending on your needs: Track, Submit, Collect, Control, and Free. Your choice of plan depends on whether you want to manage your expenses individually or for a group or company. You may need to upgrade from an individual plan to a group plan if you recently hired additional employees that need should be added to a Group Workspace, or you need access to Expensify's features that are only available on a paid plan. - -# How to change a subscription on an Individual Plan -## Change Individual Plan -### Web -1. Go to **Settings > Workspaces > Individual > [Your Individual Workspace]** -1. Click on **Plan** and select **Switch** under the plan you want to switch to -### Mobile -Open the Expensify app and: -1. Tap the hamburger icon (three lines) on the top left -1. Tap **Settings** -1. Tap **View All** under your Workspace -1. Select the Workspace you want to change under the "Individual" tab -1. Tap **Current Plan** under **Plan** -1. Find the **Switch** option under the plan you're not currently using + +Expensify offers several plans based on your needs: **Track, Submit, Collect, Control,** and **Free**. Your choice depends on whether you manage expenses individually or for a group or company. You may need to upgrade if you hire employees who need access to a **Group Workspace** or require features exclusive to paid plans. + +--- + +# Changing a Subscription on an Individual Plan + +**Web:** +1. Go to **Settings > Workspaces > Individual > [Your Individual Workspace]**. +2. Click **Plan** and select **Switch** under your desired plan. + +**Mobile:** +1. Open the Expensify app. +2. Tap the **hamburger menu** (three lines) on the top left. +3. Tap **Settings**. +4. Tap **View All** under your Workspace. +5. Select the Workspace under the **Individual** tab. +6. Tap **Current Plan** under **Plan**. +7. Tap **Switch** under the plan you're not currently using. + ## Upgrade to a Group Plan -To upgrade to a group plan, you will need to create a Group Workspace by heading to **Settings > Workspaces > Group** and choosing a Collect or Control plan. +1. Go to **Settings > Workspaces > Group**. +2. Select a **Collect** or **Control** plan. -# How to change a subscription on a Group Plan -## Change Group Plan -## Web -1. Go to **Settings > Workspaces > Group > [Your Group Workspace]** -1. Click on **Plan** and select **Switch** under the plan you want to switch to. +--- -## Mobile -1. In the Expensify mobile app, navigate to **Settings > Workspaces > [Your Workspace] > Current Plan > Switch**. +# Changing a Subscription on a Group Plan -## Adjust subscription size -When you first create a subscription, you can manually set your size by entering a number in the Subscription Size field of your subscription settings by heading to **Settings > Workspaces > Group > Subscription**. +**Web:** +1. Go to **Settings > Workspaces > Group > [Your Group Workspace]**. +2. Click **Plan** and select **Switch** under your desired plan. -If you choose not to set a size yourself, it will be calculated automatically for your first bill based on your depending on which scenario below fits your use case: -- If you’ve never had activity in Expensify, your subscription size is set automatically to match the number of active users you had your first month of using Expensify on your Annual Subscription. This means you’ll see the number update automatically after your first billing. -- For existing Workspaces switching to an annual subscription, the subscription size is set to the number of active users on your last month’s billing history. +**Mobile:** +1. Open the Expensify app. +2. Navigate to **Settings > Workspaces > [Your Workspace] > Current Plan > Switch**. -## Auto increase subscription size -This feature manages your subscription by automatically increasing the count whenever there is activity that exceeds your subscription size. Whenever your subscription size is increased, you will start a new 12-month commitment for the new subscription size in full. +--- -To enable automatically increasing your subscription size, head to **Settings > Workspaces > Group > Subscription** and toggle this feature on. +## Adjust Subscription Size +1. Go to **Settings > Workspaces > Group > Subscription**. +2. Enter the desired number in the **Subscription Size** field. + - If left blank, your subscription size will be set automatically: + - **New Workspaces**: Based on active users in the first month. + - **Existing Workspaces Switching to Annual**: Based on the last month's active users. -## Auto renew -By default, your subscription is set to automatically renew after a year. To disable this, head to **Settings > Workspaces > Subscription** and use the toggle to turn this feature off before your current subscription ends. +## Auto-Increase Subscription Size +1. Go to **Settings > Workspaces > Group > Subscription**. +2. Toggle **Auto Increase Subscription Size** on. +3. When enabled, your subscription size will adjust automatically based on usage, triggering a new 12-month commitment for the updated size. -If Auto Renew is disabled then the last bill at the annual rate will be issued on the date listed under the Auto Renew settings. +## Auto-Renew Subscription +1. Go to **Settings > Workspaces > Subscription**. +2. Toggle **Auto Renew** off before your current subscription ends if you do not want it to renew. + - If **Auto Renew** is disabled, your final bill at the annual rate will be issued on the date listed under **Auto Renew Settings**. -# How to downgrade to a free account from an Individual Plan -## Web -1. Log in to your account through a web browser. -1. Go to **Settings > Workspaces > Individual > Subscription**. -1. Click "Cancel Subscription" to end your Monthly Subscription. +--- -Note: Your subscription is a pre-purchase for 30 days of unlimited SmartScanning. This means that when you cancel, you do not get a refund and instead get to use the remainder of the month of unlimited SmartScanning you purchased. +# Downgrading to a Free Account from an Individual Plan -## App Store -If you subscribed via iOS, you must cancel your monthly subscription through the App Store by heading to App Store > click on your ID > Subscriptions. You can't cancel it directly in Expensify. +**Web:** +1. Log in via a web browser. +2. Go to **Settings > Workspaces > Individual > Subscription**. +3. Click **Cancel Subscription**. + - **Note**: The subscription is prepaid for 30 days of unlimited **SmartScanning**. No refunds are issued, but you retain access until the period ends. -# How to downgrade to a free account from a Group Plan -## Pay-per-use -If you have a Group Workspace and use Pay-Per-Use billing, you can downgrade by going to **Settings > Workspaces > Group** and clicking the cog button next to your Workspace name, then choosing **Delete**. +**App Store (iOS Users):** +1. Go to the **App Store**. +2. Tap your **Apple ID** > **Subscriptions**. +3. Cancel your Expensify subscription. + - **Note**: This cannot be done within Expensify. -Note: Deleting a Workspace removes its configurations and Workspace members but not their Expensify accounts. +--- -When deleting your final paid Workspace, if any Workspace members have been active that month (this means anybody who created, edited, submitted, approved, exported, or deleted a report) you will be billed for their activity as part of the downgrade flow. +# Downgrading to a Free Account from a Group Plan -## Annual subscription -If you recently started an annual subscription, you can downgrade for a full refund before the second bill. If you meet the criteria below, you can request a refund by going to **Settings > Your Account > Billing** in the web app: -- Own Collect or Control Group Workspaces -- Have only been billed for a single month -- Have not cleared a balance in the past +## Pay-Per-Use Plan +1. Go to **Settings > Workspaces > Group**. +2. Click the **cog icon** next to your Workspace name. +3. Select **Delete**. + - **Note**: Deleting a Workspace removes its settings and members but does not delete their Expensify accounts. + - If any members were active that month (submitted, approved, or edited reports), you will be billed for their usage. -Note: Refunds apply to Collect or Control Group Workspaces with one month of billing and no previous balance. +## Annual Subscription +1. If eligible for a refund, go to **Settings > Your Account > Billing**. +2. Click **Request a Refund** if: + - You own a **Collect** or **Control** Group Workspace. + - You have only been billed once. + - You have no outstanding balance. -Once you’ve successfully downgraded to a free Expensify account, your Workspace will be deleted and you will see a refund line item added to your Billing History. +Once downgraded, your Workspace will be deleted, and a refund line item will appear in your **Billing History**. + +--- + +# FAQ -{% include faq-begin.md %} ## 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 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. +Yes, monthly subscriptions are prepaid and not usage-based, so you will be charged regardless of activity. + +## I'm on a Group Workspace. Do I need the monthly subscription too? +No, Group Workspace members already have unlimited **SmartScans**. However, you can keep a subscription for personal use if you leave your company's Workspace. -{% include faq-end.md %} diff --git a/docs/articles/expensify-classic/expensify-billing/Tax-Exempt.md b/docs/articles/expensify-classic/expensify-billing/Tax-Exempt.md index a91454b4965b..808b88b0440a 100644 --- a/docs/articles/expensify-classic/expensify-billing/Tax-Exempt.md +++ b/docs/articles/expensify-classic/expensify-billing/Tax-Exempt.md @@ -1,24 +1,31 @@ --- title: Tax Exempt -description: Tax-exempt status in Expensify for organizations recognized by the IRS or local tax authorities. +description: How to request tax-exempt status for your Expensify account if your organization is recognized by the IRS or other local tax authorities. --- -# Overview -If your organization is recognized by the IRS or other local tax authorities as tax-exempt, that means you don’t need to pay any tax on your Expensify monthly bill. Please follow these instructions to request tax-exempt status. -# How to request tax-exempt status in Expensify -1. Go to **Settings > Account > Payments**. -1. Click on the option that says **Request Tax-Exempt Status**. -1. After you've requested tax-exempt status, Concierge (our support service) will start a conversation with you. They will ask you to upload a PDF of your tax-exempt documentation. This document should include your VAT number (or "RUT" in Chile). You can use one of the following documents: 501(c), ST-119, or a foreign tax-exempt declaration. -1. Our team will review your document and let you know if we need any more information. -1. Once everything is verified, we'll update your account accordingly. + +If your organization is recognized as **tax-exempt** by the IRS or other local tax authorities, you can request tax-exempt status in Expensify to avoid tax charges on your monthly bill. Follow these steps to submit your request. + +--- + +# Request Tax-Exempt Status + +1. Go to **Settings > Account > Payments**. +2. Click **Request Tax-Exempt Status**. +3. Concierge will reach out to you for documentation. Upload a PDF of your tax-exempt certification. Your document should include your **VAT number** (or **RUT** in Chile). Accepted documents include: + - **501(c)** (for U.S. organizations) + - **ST-119** + - **Foreign tax-exempt declaration** +4. Our team will review your submission and request any additional information if needed. +5. Once verified, your account will be updated, and tax will no longer be applied to future billing. ![Click the request tax exempt status button]({{site.url}}/assets/images/Tax Exempt - Classic.png){:width="100%"} -Once your account is marked as tax-exempt, the corresponding state tax will no longer be applied to future billing. +If you need to **remove** your tax-exempt status, contact your **Account Manager** or **Concierge**. + +--- -If you need to remove your tax-exempt status, let your Account Manager know or contact Concierge. +# FAQ -{% include faq-begin.md %} -## What happens to my past Expensify bills that incorrectly had tax added to them? -Expensify can provide a refund for the tax you were charged on your previous bills. Please let your Account Manager know or contact Concierge if this is the case. +## Will Expensify refund past tax charges? -{% include faq-end.md %} +Yes! If tax was incorrectly applied to your past bills, Expensify can issue a refund. Contact your **Account Manager** or **Concierge** to request a refund. diff --git a/docs/articles/expensify-classic/expensify-card/Admin-Card-Settings-and-Features.md b/docs/articles/expensify-classic/expensify-card/Admin-Card-Settings-and-Features.md index b9938b058ef6..1b656e274d89 100644 --- a/docs/articles/expensify-classic/expensify-card/Admin-Card-Settings-and-Features.md +++ b/docs/articles/expensify-classic/expensify-card/Admin-Card-Settings-and-Features.md @@ -1,134 +1,147 @@ --- -title: Admin Card Settings and Features +title: Admin Card Settings and Features description: A deep dive into the available controls and settings for the Expensify Card. --- -# Expensify Visa® Commercial Card Overview -The Expensify Visa® Commercial Card offers various settings to help admins manage expenses and card usage efficiently. Here’s how to use these features: - -## Smart Limits -Smart Limits allow you to set custom spending limits for each Expensify cardholder or default limits for groups. Setting a Smart Limit activates an Expensify card for your user and issues a virtual card for immediate use. -#### Set Limits for Individual Cardholders -As a Domain Admin, you can set or edit Custom Smart Limits for a card: -1. Go to _**Settings > Domains > Domain Name > Company Cards**_. -2. Click **Edit Limit** to set the limit. +# Expensify Visa® Commercial Card Overview +The Expensify Visa® Commercial Card includes various settings to help admins manage expenses and card usage efficiently. -This limit restricts the amount of unapproved (unsubmitted and processing) expenses a cardholder can incur. Once the limit is reached, the cardholder cannot use their card until they submit outstanding expenses and have their card spend approved. If you set the Smart Limit to $0, the user’s card cannot be used. +## Set and Manage Smart Limits +Smart Limits allow you to control spending for each Expensify cardholder or set default limits for groups. Enabling a Smart Limit activates an Expensify Card and issues a virtual card for immediate use. -#### Set Default Group Limits -Domain Admins can set or edit custom Smart Limits for a domain group: +### Set Limits for Individual Cardholders +As a Domain Admin, you can set or edit Custom Smart Limits: +1. Go to **Settings > Domains > [Domain Name] > Company Cards**. +2. Click **Edit Limit** and enter the desired amount. -1. Go to _**Settings > Domains > Domain Name > Groups**_. -2. Click on the limit in-line for your chosen group and amend the value. +- The limit controls how much unapproved spending a cardholder can accumulate. +- Once the limit is reached, the cardholder must submit expenses for approval before making new transactions. +- Setting a Smart Limit of $0 disables the card. -This limit applies to all members of the Domain Group who do not have an individual limit set via _**Settings > Domains > Domain Name > Company Cards**_. +### Set Default Group Limits +To set or update default Smart Limits for a domain group: +1. Go to **Settings > Domains > [Domain Name] > Groups**. +2. Click the in-line limit for your chosen group and adjust the value. -#### Refreshing Smart Limits -To let cardholders continue spending, you can approve their pending expenses via the Reconciliation tab. This frees up their limit, allowing them to use their card again. +This applies to all group members who do not have an individual limit. -To check an unapproved card balance and approve expenses: -1. Click on **Reconciliation** and enter a date range. -2. Click on the Unapproved total to see what needs approval. -3. You can add to a new report or approve an existing report from here. +### Refreshing Smart Limits +To enable further spending, approve pending expenses: +1. Go to **Reconciliation**, enter a date range, and click **Run**. +2. Click the **Unapproved Total** to review pending expenses. +3. Approve expenses or add them to a report. You can also increase a Smart Limit at any time by clicking **Edit Limit**. -### Understanding Your Domain Limit -To ensure you have the most accurate Domain Limit for your company, follow these steps: +--- -1. **Connect Your Bank Account:** Go to _**Settings > Account > Payments > Add Verified Bank Account**_ and connect via Plaid. +## Check and Adjust Your Domain Limit +Ensure your Domain Limit is accurate by following these steps: -2. **Request a Custom Limit:** If your bank isn’t supported or you’re experiencing connection issues, you can request a custom limit at _**Settings > Domains > Domain Name > Company Cards > Request Limit Increase**_. Note that you’ll need to provide three months of unredacted bank statements for review by our risk management team. +1. **Connect Your Bank Account:** Go to **Settings > Account > Payments > Add Verified Bank Account** and connect via Plaid. +2. **Request a Custom Limit:** If Plaid does not support your bank, request a limit increase at **Settings > Domains > [Domain Name] > Company Cards > Request Limit Increase**. + - You’ll need to upload three months of unredacted bank statements. ### Factors Affecting Your Domain Limit -Your Domain Limit may fluctuate due to several factors: +Your Domain Limit may change due to: +- **Available Funds:** Expensify monitors balances via Plaid. A sudden drop in funds within 24 hours can lower your limit. +- **Pending Expenses:** Large pending transactions reduce your available balance. +- **Processing Settlements:** Settlements take about three business days, dynamically adjusting your Domain Limit. -- **Available Funds in Your Verified Business Bank Account:** We regularly monitor balances via Plaid. A sudden decrease in balance within the last 24 hours may impact your limit. For accounts with 'sweep' functionality, maintain a sufficient balance even when sweeping daily. +**Note:** If your Domain Limit is $0, cardholders cannot make purchases. -- **Pending Expenses:** Check the Reconciliation Dashboard for large pending expenses that could affect your available balance. Your Domain Limit automatically adjusts to include pending expenses. - -- **Processing Settlements:** Settlements typically take about three business days to process and clear. Multiple large settlements over consecutive days may affect your Domain Limit, which updates dynamically once settlements are cleared. - -Please note: If your Domain Limit is reduced to $0, cardholders cannot make purchases, even if they have higher Smart Limits set on their individual cards. +--- -## Reconciling Expenses and Settlements -Reconciling expenses ensures your financial records are accurate and up-to-date. Follow these steps to review and reconcile expenses associated with your Expensify Cards: +## Reconcile Expenses and Settlements +### Reconcile Expenses +1. Go to **Settings > Domains > [Domain Name] > Company Cards > Reconciliation > Expenses**. +2. Enter start and end dates, then click **Run**. +3. Review the **Imported Total**, which shows all Expensify Card transactions for the period. +4. Click totals to view associated expenses. + +### Reconcile Settlements +1. Log into Expensify. +2. Click **Settings > Domains > [Domain Name] > Company Cards > Reconciliation > Settlements**. +3. Use **Search** to generate a statement for a specific period. +4. Click **Download CSV** to review settlement details, including: + - **Date & Posted Date** + - **Entry ID & Transaction ID** + - **Amount & Merchant** + - **Cardholder & Business Account** +5. To reconcile pre-authorizations, use the **Transaction ID** column in the CSV file. -#### How to Reconcile Expenses: -1. Go to _**Settings > Domains > Domain Name > Company Cards > Reconciliation > Expenses**_. -2. Enter your start and end dates, then click *Run*. -3. The Imported Total will display all Expensify Card transactions for the period. -4. You'll see a list of all Expensify Cards, the total spend on each card, and a snapshot of expenses that have been approved and have not been approved (Approved Total and Unapproved Total, respectively). -5. Click on the amounts to view the associated expenses. +--- -#### How to Reconcile Settlements: -A settlement is the payment to Expensify for purchases made using the Expensify Cards. The program can settle on either a daily or monthly basis. Note that not all transactions in a settlement will be approved when running reconciliation. +## Manage Settlement Settings +### Set a Preferred Workspace +Create a dedicated workspace for card expenses and use **Scheduled Submit** to automatically add expenses to reports. -1. Log into the Expensify web app. -2. Click _**Settings > Domains > Domain Name > Company Cards > Reconciliation > `Settlements**_. -3. Use the Search function to generate a statement for the specific period you need. +### Change the Settlement Account +1. Go to **Settings > Domains > [Domain Name] > Company Cards > Settings**. +2. Select a new verified business bank account from the **Settlement Account** dropdown. +3. Click **Save**. -The search results will include the following info for each entry: -- **Date:** When a purchase was made or funds were debited for payments. -- **Posted Date:** When the purchase transaction is posted. -- **Entry ID:** A unique number grouping card payments and transactions settled by those payments. -- **Amount:** The amount debited from the Business Bank Account for payments. -- **Merchant:** The business where a purchase was made. -- **Card:** Refers to the Expensify Card number and cardholder’s email address. -- **Business Account:** The business bank account connected to Expensify that the settlement is paid from. -- **Transaction ID:** A special ID that helps Expensify support locate transactions if there’s an issue. +### Change the Settlement Frequency +By default, settlements occur daily. You can switch to monthly settlements if needed. -Review the individual transactions (debits) and the payments (credits) that settled them. Each cardholder will have a virtual and a physical card listed, handled the same way for settlements, reconciliation, and exporting. +#### Monthly Settlement Requirements: +- The account must not have had a negative balance in the last 90 days. +- An initial settlement will process any outstanding spending before switching. +- The settlement date will be the day you switch moving forward. -4. Click **Download CSV** for reconciliation. This will list everything you see on the screen. -5. To reconcile pre-authorizations, use the Transaction ID column in the CSV file to locate the original purchase. -6. Review account payments: You’ll see payments made from the accounts listed under _**Settings > Account > Payments > Bank Accounts**_. Payment data won’t show for deleted accounts. +#### Steps to Change the Settlement Frequency: +1. Go to **Settings > Domains > [Domain Name] > Company Cards > Settings**. +2. Click **Settlement Frequency** and select **Monthly**. +3. Click **Save**. -Use the Reconciliation Dashboard to confirm the status of expenses missing from your accounting system. It allows you to view both approved and unapproved expenses within your selected date range that haven’t been exported yet. +--- -### Set a Preferred Workspace -Many customers find it helpful to separate their company card expenses from other types of expenses for easier coding. To do this, create a separate workspace specifically for card expenses. +## Declined Expensify Card Transactions +Enable **Receive real-time alerts** to get notified about declined transactions: +1. Open the mobile app. +2. Tap the menu icon (**≡**) and go to **Settings**. +3. Toggle **Receive real-time alerts** on. -**Using a Preferred Workspace:** -Combine this feature with Scheduled Submit to automatically add new card expenses to reports connected to your card-specific workspace. +### Common Reasons for Declines +#### Insufficient Card Limit +The transaction exceeds the card's limit. Check your balance under **Settings > Account > Credit Card Import**. -### Change the Settlement Account -You can change your settlement account to any verified business bank account in Expensify. If your current bank account is closing, make sure to set up a replacement as soon as possible. +#### Card Not Activated or Canceled +Ensure the card is active. -#### Steps to Select a Different Settlement Account: -1. Go to _**Settings > Domains > Domain Name > Company Cards > Settings**_ tab. -2. Use the Expensify Card settlement account dropdown to select a new account. -3. Click **Save**. +#### Incorrect Card Information +Mistyped CVC, ZIP, or expiration date will result in a decline. -### Change the Settlement Frequency -By default, Expensify Cards settle daily. However, you can switch to monthly settlements. +#### Suspicious Activity +Expensify may block flagged transactions. -#### Monthly Settlement Requirements: - - The settlement account must not have had a negative balance in the last 90 days. - - There will be an initial settlement for any outstanding spending before the switch. - - The settlement date going forward will be the date you switch (e.g., if you switch on September 15th, future settlements will be on the 15th of each month). +#### Merchant in a Restricted Country +Transactions from restricted countries will be declined. -#### Steps to Change the Settlement Frequency: -1. Go to _**Settings > Domains > Domain Name > Company Cards > Settings**_ tab. -2. Click the **Settlement Frequency** dropdown and select **Monthly**. -3. Click **Save** to confirm the change. +--- -### Declined Expensify Card Transactions -If you have 'Receive real-time alerts' enabled, you'll get a notification explaining why a transaction was declined. To enable alerts: -1. Open the mobile app. -2. Click the three-bar icon in the upper-left corner. -3. Go to Settings. -4. Toggle 'Receive real-time alerts' on. +# FAQ -If you or your employees notice any unfamiliar purchases or need a new card, go to _**Settings > Account > Credit Card Import**_ and click on **Request a New Card**. +## Who can access the Reconciliation tab? +Only **Domain Admins** can access the Reconciliation tool. -#### Common Reasons for Declines: -- **Insufficient Card Limit:** If a transaction exceeds your card's limit, it will be declined. Always check your balance under _**Settings > Account > Credit Card Import**_ on the web or mobile app. Approve pending expenses to free up your limit. +## Who can view and process company card transactions? +- **Domain Admins** can view all company card transactions, including unreported ones, via the Reconciliation tool. +- **Workspace Admins** can only view reported expenses in a workspace. If they lack domain access, they cannot see transactions that haven’t been added to a report. -- **Card Not Activated or Canceled:** Transactions won't process if the card hasn't been activated or has been canceled. +## What do I do if company card expenses are missing? +1. Use the **Reconciliation** tool to locate the missing expense: + - Select the date range for the expense. + - View the specific card to check the data. +2. If the expense isn’t listed, click **Update** next to the card under the **Card List** tab to pull in missing transactions. +3. If the expense still doesn’t appear, contact Concierge with these details: + - Merchant name + - Date + - Amount + - Last four digits of the card number -- **Incorrect Card Information:** Entering incorrect card details, such as the CVC, ZIP, or expiration date, will lead to declines. +**Note:** Only posted transactions will be imported. -- **Suspicious Activity:** Expensify may block transactions if unusual activity is detected. This could be due to irregular spending patterns, risky vendors, or multiple rapid transactions. Check your Expensify Home page to approve unusual merchants. If further review is needed, Expensify will perform a manual due diligence check and lock your cards temporarily. +--- -- **Merchant in a Restricted Country:** Transactions will be declined if the merchant is in a restricted country. +**Still have questions?** Reach out to Concierge for further assistance. diff --git a/docs/articles/expensify-classic/expensify-card/Cardholder-Settings-and-Features.md b/docs/articles/expensify-classic/expensify-card/Cardholder-Settings-and-Features.md index ee03a18033ea..2c2302916bc1 100644 --- a/docs/articles/expensify-classic/expensify-card/Cardholder-Settings-and-Features.md +++ b/docs/articles/expensify-classic/expensify-card/Cardholder-Settings-and-Features.md @@ -6,56 +6,79 @@ description: Expensify Card Settings for Employees # Using Your Expensify Visa® Commercial Card ### Activate Your Card -You can start using your card immediately upon receipt by logging into your Expensify account, heading to your Home tab, and following the prompts on the _**Activate your Expensify Card**_ task. +To activate your card: +1. Log into your Expensify account. +2. Go to your **Home tab**. +3. Follow the prompts on the **Activate your Expensify Card** task. +Once activated, you can start using your card immediately! -### Review your Card's Smart Limit -Check your card’s Smart Limit via _**Settings > Account > Credit Card Import**_: -- This limit is the total amount of unapproved expenses you can have on the card. -- If a purchase is more than your card's Smart Limit, it will be declined. +### Review Your Card's Smart Limit +You can check your card’s **Smart Limit** by navigating to **Settings > Account > Credit Card Import**. +- The **Smart Limit** is the total amount of unapproved expenses you can have on your card. +- If a purchase exceeds your card's Smart Limit, it will be declined. -## Managing Expenses -- **Submit Expenses Promptly**: Submit your expenses regularly to restore your full limit. Contact your admin if you need a limit adjustment. -- **Using Your Card**: Swipe your Expensify Card like any other card. You’ll receive instant alerts on your phone for SmartScan receipts. SmartScanned receipts will merge automatically with card expenses. -- **eReceipts**: If your organization doesn’t require itemized receipts, Expensify will generate IRS-compliant eReceipts for all non-lodging transactions. -- **Reporting Expenses**: Report and submit Expensify Card expenses as usual. Approved expenses refresh your Smart Limit. +--- + +## Managing Your Expenses + +- **Submit Expenses Promptly**: Regularly submit your expenses to restore your full limit. If needed, contact your admin for a limit adjustment. +- **Using Your Card**: Swipe your Expensify Card like any other. You'll get instant alerts for **SmartScan receipts**, which will automatically merge with your card expenses. +- **eReceipts**: If your organization doesn't require itemized receipts, Expensify will generate IRS-compliant **eReceipts** for all non-lodging transactions. +- **Reporting Expenses**: Submit your **Expensify Card expenses** as usual. Once approved, your **Smart Limit** will be refreshed. + +--- ## Enabling Notifications -Download the Expensify mobile app and enable push notifications to stay updated on spending activity and potential fraud. -#### For iPhone: -1. Open the Expensify app and tap the three-bar icon in the upper-left corner. -2. Tap _**Settings > enable Receive real-time alerts**_. -3. Accept the confirmation to access your iPhone’s notification settings for Expensify. -4. Turn on **Allow Notifications** and select your notification types. +Stay updated on your spending activity and potential fraud by enabling **push notifications** in the Expensify mobile app. + +### For iPhone: +1. Open the Expensify app. +2. Tap the **three-bar icon** in the top-left corner. +3. Go to **Settings > Enable Receive real-time alerts**. +4. Confirm the prompt to access your iPhone's notification settings. +5. Turn on **Allow Notifications** and choose your preferred notification types. -#### For Android: -1. Go to _**Settings > Apps and Notifications**_. -2. Find and open Expensify and enable notifications. -3. Customize your alerts based on your phone model. +### For Android: +1. Go to **Settings > Apps and Notifications**. +2. Find and open **Expensify**. +3. Enable notifications and customize the alerts based on your device model. + +--- ## Using Your Virtual Card -- **Access Details**: You can view your virtual card details (card number, expiration date, CVC) via _**Settings > Account > Credit Card Import > Show Details**_. The virtual and physical cards share the same limit. -- **Purchases**: Use the virtual card for online, in-app, and in-person payments when linked to a mobile wallet (Apple Pay or Google Pay). -#### Adding to a Digital Wallet -To add your Expensify Card to a digital wallet, follow the steps below: - 1. Tap the three-bar icon in the upper-left corner. - 2. Tap _**Settings > Connected Cards**_. - 3. Tap **Add to Apple Wallet** or **Add to Gpay**, depending on your device. - 4. Complete the steps as prompted. +### Accessing Virtual Card Details +To view your virtual card details (card number, expiration date, CVC), go to **Settings > Account > Credit Card Import > Show Details**. +Note: The virtual and physical cards share the same **Smart Limit**. + +### Making Purchases +Use the virtual card for **online, in-app, or in-person** payments when linked to a mobile wallet (e.g., **Apple Pay** or **Google Pay**). + +### Adding to a Digital Wallet +1. Tap the **three-bar icon** in the top-left corner. +2. Go to **Settings > Connected Cards**. +3. Tap **Add to Apple Wallet** or **Add to Google Pay**, depending on your device. +4. Follow the steps to complete the setup. + +--- ## Handling Declines -- **Real-Time Alerts**: Enable real-time alerts in the mobile app (_**Settings > toggle Receive real-time alerts**_) to get notifications for declines. -- **Common Decline Reasons**: - - **Insufficient Limit**: Transactions exceeding the available limit will be declined. You can check your limit in _**Settings > Connected Cards**_ or _**Settings > Account > Credit Card Import**_. - - **Inactive or Disabled Card**: Ensure your card is active and not disabled by your Domain Admin. - - **Incorrect Information**: Entering incorrect card details (CVC, ZIP, expiration date) will result in declines. - - **Suspicious Activity**: Transactions may be blocked for unusual or suspicious activity. Check the Expensify Home page to approve unusual merchants. Suspicious spending may prompt a manual due diligence check, during which your cards will be locked. - - **Restricted Country**: Transactions from restricted countries will be declined. -{% include faq-begin.md %} +### Real-Time Decline Alerts +To get alerts for declined transactions: +1. Go to **Settings > Toggle Receive real-time alerts** in the mobile app. + +### Common Decline Reasons +- **Insufficient Limit**: Transactions exceeding your available limit will be declined. Check your limit in **Settings > Connected Cards** or **Settings > Account > Credit Card Import**. +- **Inactive or Disabled Card**: Ensure your card is active and not disabled by your Domain Admin. +- **Incorrect Information**: Declines may occur due to incorrect card details (e.g., CVC, ZIP code, expiration date). +- **Suspicious Activity**: Transactions may be blocked if flagged as suspicious. You can approve unusual merchants via your **Expensify Home page**. Suspicious activity may result in a manual review, and your cards could be locked temporarily. +- **Restricted Country**: Transactions from restricted countries will be declined. + +--- -## I still haven't received my Expensify Card. What should I do? -For more information on why your card hasn't arrived, you can check out this resource on [Requesting a Card](https://help.expensify.com/articles/expensify-classic/expensify-card/Request-the-Card#what-if-i-havent-received-my-card-after-multiple-weeks). +## FAQ -{% include faq-end.md %} +## I haven’t received my Expensify Card. What should I do? +For help with a missing card, visit our guide on [Requesting a Card](https://help.expensify.com/articles/expensify-classic/expensify-card/Request-the-Card#what-if-i-havent-received-my-card-after-multiple-weeks). diff --git a/docs/articles/expensify-classic/expensify-card/Change-Expensify-Card-limit.md b/docs/articles/expensify-classic/expensify-card/Change-Expensify-Card-limit.md index 81ce761f84f4..e04fb2cdff77 100644 --- a/docs/articles/expensify-classic/expensify-card/Change-Expensify-Card-limit.md +++ b/docs/articles/expensify-classic/expensify-card/Change-Expensify-Card-limit.md @@ -2,24 +2,30 @@ title: Change Expensify Card limit description: Increase or decrease the limit for an Expensify Card or for a group --- -
-You can set Expensify Card limits for each group in your organization, or you can set the limit per card. +You can set a limit for each individual **Expensify Card** or for a group within your organization. Here's how to do both: -# Set a limit per card +## Set a Limit per Card -1. Hover over Settings, then click **Domains**. -2. Click the name of the domain. +1. Hover over **Settings** and click **Domains**. +2. Select the name of the domain you want to modify. 3. Next to the card, click **Edit Limit**. -4. Ensure the Custom Smart Limit toggle is enabled to be able to set a specific card limit. Otherwise, the card limit will be determined by the limit set for the group that the employee is in. -5. In the Limit Amount field, enter the desired limit. If set to $0, the card will be disabled for use until the limit is increased. -6. Click **Save**. +4. Make sure the **Custom Smart Limit** toggle is ON. This allows you to set a specific limit for the card. If it's OFF, the card’s limit will default to the group limit. +5. In the **Limit Amount** field, enter the desired limit: + - **$0** disables the card until the limit is increased. +6. Click **Save**. -# Set a limit per group +## Set a Limit per Group -1. Hover over Settings, then click **Domains**. -2. Click the name of the domain. -3. Click the **Groups** tab on the left. -4. Click the Expensify Card Smart Limit field for the card and enter the desired limit. +1. Hover over **Settings** and click **Domains**. +2. Select the name of the domain. +3. Click the **Groups** tab on the left side. +4. In the **Expensify Card Smart Limit** field, enter the desired limit for the group. -
+# FAQ + +**What happens if I set the limit to $0?** +Setting the limit to $0 will disable the card, meaning it cannot be used until the limit is increased. + +**Can I set different limits for different employees?** +Yes, you can set individual card limits by enabling the **Custom Smart Limit** toggle. Without this, the employee's card will follow the group’s limit. diff --git a/docs/articles/expensify-classic/expensify-card/Deactivate-or-cancel-an-Expensify-Card.md b/docs/articles/expensify-classic/expensify-card/Deactivate-or-cancel-an-Expensify-Card.md index 7a704f024ce7..1056929c4726 100644 --- a/docs/articles/expensify-classic/expensify-card/Deactivate-or-cancel-an-Expensify-Card.md +++ b/docs/articles/expensify-classic/expensify-card/Deactivate-or-cancel-an-Expensify-Card.md @@ -2,43 +2,46 @@ title: Deactivate or cancel an Expensify Card description: Close an Expensify Card --- -
A cardholder can cancel an Expensify Card themselves, or a Domain Admin can deactivate it. You may want to cancel or deactivate a card: - After a fraudulent or suspicious charge - When an Expensify Card is lost or damaged - After an employee leaves the company -# Cardholders +--- + +## For Cardholders -To cancel an Expensify Card assigned to you, +To cancel your Expensify Card: -1. Hover over Settings, then click **Account**. -2. Click the **Credit Card Import** tab. -3. Click **Request a New Card** next to the card. -4. Choose a reason. -5. Confirm your address details for shipping a new card. -6. Consult this [guide](https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-A-Transaction) for how to dispute fraudulent transactions (where relevant). - -# Domain Admins +1. Hover over **Settings**, then click **Account**. +2. Click the **Credit Card Import** tab. +3. Click **Request a New Card** next to your Expensify Card. +4. Select a reason for the cancellation. +5. Confirm your address for shipping the new card. +6. If needed, follow this [guide](https://help.expensify.com/articles/expensify-classic/expensify-card/Dispute-A-Transaction) to dispute any fraudulent charges. -To deactivate an employee's Expensify Card as a Domain Admin, +--- -1. Hover over Settings, then click **Domains**. -2. Click the name of the domain. -3. Next to the card, click **Edit Limit**. -4. Ensure the Custom Smart Limit toggle is enabled to be able to set a specific card limit. Otherwise, the card limit will be determined by the limit set for the group that the employee is in. -5. In the Limit Amount field, set the limit to $0. The card will be disabled for use until the limit is increased. -6. Click **Save**. +## For Domain Admins -Note: If you have concerns about fraudulent access to a Domain Admin's user account, please message Concierge or email concierge@expensify.com immediately. If necessary, our support team can manually suspend Expensify cards outside of the Expensify Domain as a temporary measure if your account is compromised. +To deactivate an employee's Expensify Card: -# Terminating an old Expensify Card after upgrading to the new Expensify Visa® Commercial Card +1. Hover over **Settings**, then click **Domains**. +2. Click the name of the domain. +3. Next to the card, click **Edit Limit**. +4. Enable the **Custom Smart Limit** toggle to set a specific card limit. If not enabled, the card limit will match the group limit. +5. Set the **Limit Amount** to $0. This disables the card until the limit is increased. +6. Click **Save**. -To terminate old Expensify Cards that have since been upgraded, +**Important:** If you suspect fraudulent access to a Domain Admin account, immediately contact Concierge via the in-app chat or email at concierge@expensify.com. If necessary, we can manually suspend cards outside of the Expensify Domain temporarily. -1. Hover over Settings, then click **Domains**. -2. Click the name of the domain. -3. Next to the card, click **Terminate**. +--- + +## Terminating an Old Expensify Card After Upgrading -
+To terminate old Expensify Cards after upgrading to the new Expensify Visa® Commercial Card: + +1. Hover over **Settings**, then click **Domains**. +2. Click the name of the domain. +3. Next to the card, click **Terminate**. diff --git a/docs/articles/expensify-classic/expensify-card/Dispute-A-Transaction.md b/docs/articles/expensify-classic/expensify-card/Dispute-A-Transaction.md index cb86c340dc81..1a585a73be1c 100644 --- a/docs/articles/expensify-classic/expensify-card/Dispute-A-Transaction.md +++ b/docs/articles/expensify-classic/expensify-card/Dispute-A-Transaction.md @@ -1,62 +1,80 @@ --- -title: Expensify Card - Transaction Disputes & Fraud -description: Understand how to dispute an Expensify Card transaction. +title: Expensify Card - Transaction Disputes & Fraud +description: Learn how to dispute a transaction on your Expensify Card and how to protect yourself from fraud. --- + # Disputing Expensify Card Transactions -While using your Expensify Visa® Commercial Card, you might encounter transaction errors, such as: -- Unauthorized transaction activity -- Incorrect transaction amounts. -- Duplicate charges for a single transaction. -- Missing merchant refunds. -When that happens, you may need to file a dispute for one or more transactions. +If you notice issues with a transaction on your Expensify Visa® Commercial Card, you may need to file a dispute. Common transaction errors include: + +- Unauthorized charges +- Incorrect transaction amounts +- Duplicate charges +- Missing merchant refunds + +When a dispute is necessary, follow the steps below to resolve it. + +## How to Dispute a Transaction + +If you find an error on your Expensify Card transaction, contact us right away at [concierge@expensify.com](mailto:concierge@expensify.com). We’ll ask you a few questions to understand the situation, then start a dispute on your behalf with our card processor. -## Disputing a Transaction -If you notice a transaction error on your Expensify Card, contact us immediately at concierge@expensify.com. We will ask a few questions to understand the situation better, and file a dispute with our card processor on your behalf. +## Common Types of Disputes -## Types of Disputes -The most common types of disputes are: -- Unauthorized or fraudulent disputes +Here are the most common reasons for disputes: + +- Unauthorized or fraudulent transactions - Service disputes -### Unauthorized or fraudulent disputes -- Charges made after your card was lost or stolen. -- Unauthorized charges while your card is in your possession (indicating compromised information). -- Continued charges for a canceled recurring subscription. +### Unauthorized or Fraudulent Transactions -**If there are transactions made with your Expensify Card you don't recognize, you'll want to do the following right away:** -1. Cancel your card by going to _**Settings > Account > Credit Card Import > Request A New Card**_. -2. Enable Two-Factor Authentication (2FA) for added security under _**Settings > Account > Account Details > Two Factor Authentication**_. +These types of disputes occur when: -### Service Disputes -- Received damaged or defective merchandise. -- Charged for merchandise that was never received. -- Double-charged for a purchase made with another method (e.g., cash). -- Made a return but didn't receive a refund. -- Multiple charges for a single transaction. -- Charges settled for an incorrect amount. - -For service disputes, contacting the merchant is often the quickest way to resolve the dispute. - -## Simplifying the Dispute Process -To ensure a smooth dispute process, please: -- Provide detailed information about the disputed charge, including why you're disputing it and any steps you've taken to address the issue. -- If you recognize the merchant but not the charge, contact the merchant directly. -- Include supporting documentation (e.g., receipts, cancellation confirmations) when submitting your dispute to increase the chances of a favorable resolution (recommended but not required). -- Make sure the transaction isn't pending (pending transactions cannot be disputed). +- Charges are made after your card is lost or stolen +- There are unauthorized charges while your card is still in your possession (indicating possible compromised card information) +- Recurring charges continue after a subscription is canceled + +**To protect your account from further unauthorized charges:** + +1. **Cancel your card**: + Go to **Settings** > **Account** > **Credit Card Import** > **Request A New Card**. +2. **Enable Two-Factor Authentication (2FA)**: + Activate 2FA for added security under **Settings** > **Account** > **Account Details** > **Two-Factor Authentication**. + +### Service Disputes + +These disputes involve issues with the product or service, such as: + +- Damaged or defective merchandise +- Merchandise that was never received +- Double charges (e.g., you paid with another method, like cash) +- No refund after returning an item +- Multiple charges for a single transaction +- Charges made for the wrong amount + +For service-related disputes, contact the merchant first. This is usually the fastest way to resolve the issue. + +## Tips for a Smooth Dispute Process + +To ensure your dispute is resolved quickly: + +- Provide detailed information about the transaction and the issue. Explain why you're disputing the charge and any steps you’ve taken to address it. +- If you recognize the merchant but not the charge, contact the merchant first. +- Include supporting documents, like receipts or cancellation confirmations. While not required, they can help increase the chances of a successful resolution. +- Ensure the transaction isn’t pending, as pending charges cannot be disputed. + +## FAQ + +### **How does Expensify protect me from fraud?** -{% include faq-begin.md %} +You’ll receive real-time push notifications for every card charge, allowing you to spot any issues immediately. Expensify also uses advanced algorithms to detect and block suspicious activity. -## **How am I protected from fraud using the Expensify Card?** -Real-time push notifications alert you of every card charge upfront, helping identify potential issues immediately. Expensify also leverages sophisticated algorithms to detect and/or block unusual card activity. +If you spot any suspicious transactions, you can dispute them by contacting Concierge via the Expensify app or by emailing [concierge@expensify.com](mailto:concierge@expensify.com). You can also cancel your Expensify Card directly within our platform. -Expensify cardholders can dispute suspicious transactions directly via Concierge, either within the Expensify app or by emailing [concierge@expensify.com](mailto:concierge@expensify.com). Cardholders can also cancel their Expensify Card anytime within our platform. +### **How long does the dispute process take?** -## **How long does the dispute process take?** -The dispute process generally takes up to 90 days. It depends on the type of dispute. +The dispute process typically takes up to 90 days, depending on the type of dispute. -## **Can I cancel a dispute?** -Contact Concierge if you've filed a dispute and want to cancel it. You might do this if you recognize a previously reported unauthorized charge or if the merchant has already resolved the issue. +### **Can I cancel a dispute?** -{% include faq-end.md %} +Yes. If you've filed a dispute and wish to cancel it, contact Concierge. This may happen if you recognize a previously unauthorized charge or if the merchant has already resolved the issue. diff --git a/docs/articles/expensify-classic/expensify-card/Expensify-Card-Statements.md b/docs/articles/expensify-classic/expensify-card/Expensify-Card-Statements.md new file mode 100644 index 000000000000..6b8aa740e6e0 --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/Expensify-Card-Statements.md @@ -0,0 +1,90 @@ +--- +title: Expensify Card Statements +description: Learn how to access and manage your Expensify Card statements and settlements. +--- + +The Expensify Card provides detailed statements that help you track transactions and settlements with ease. This guide explains how to access, export, and manage your statements while understanding key details like settlement frequency and outstanding balances. + +# Accessing Your Statement +To view your Expensify Card statement: +1. Ensure your domain uses the Expensify Card and has a validated Business Bank Account. +2. Navigate to **Settings > Domains > [Your Domain Name] > Company Cards**. +3. Click the **Reconciliation** tab and select **Settlements**. +4. Your statement will display: + - **Transactions (Debits)**: Individual card purchases (transactions may take up to 1-2 business days to appear). + - **Settlements (Credits)**: Payments made to cover transactions. + +--- + +# Key Information in the Statement +Each statement includes the following details: +- **Date**: The posted date of each transaction and payment. +- **Entry ID**: A unique identifier grouping payments and transactions. +- **Withdrawn Amount**: The total debited from your Business Bank Account. +- **Transaction Amount**: The purchase amount for each transaction. +- **User Email**: The email address of the cardholder. +- **Transaction ID**: A unique identifier for each transaction. + +![Expanded card settlement that shows the various items that make up each card settlement.](https://help.expensify.com/assets/images/ExpensifyHelp_SettlementExpanded.png){:width="100%"} + +**Note:** Statements only include payments from active Business Bank Accounts under **Settings > Account > Payments > Business Accounts**. Payments from deleted accounts will not appear. + +--- +# Exporting Statements +To download a statement: +1. Log in to Expensify. +2. Go to **Settings > Domains > Company Cards**. +3. Click the **Reconciliation** tab and select **Settlements**. +4. Enter the start and end dates. +5. Click **Search** to view the statement. +6. Click **Download** to export it as a CSV file. + +![Click the Download CSV button in the middle of the page to export your card settlements.](https://help.expensify.com/assets/images/ExpensifyHelp_SettlementExport.png){:width="100%"} + +--- +# Expensify Card Settlement Frequency +You can choose between two settlement options: +- **Daily Settlement**: Your balance is paid in full every business day. +- **Monthly Settlement**: Your balance is settled once per month on a predetermined date (available for Plaid-connected accounts with no recent negative balances). + +**Updating Settlement Frequency:** +1. Go to **Settings > Domains > [Your Domain Name] > Company Cards**. +2. Click the **Settings** tab. +3. Select either **Daily** or **Monthly** from the dropdown menu. +4. Click **Save** to confirm. + +**Note:** You cannot choose a specific settlement date beyond the available daily or monthly options. + +--- +# How Settlement Works +- On your scheduled settlement date, Expensify calculates the total of all posted transactions. +- The total settlement amount is withdrawn from your Verified Business Bank Account, resetting your card balance to $0. +- To change your settlement frequency or bank account: + 1. Go to **Settings > Domains > [Your Domain Name] > Company Cards**. + 2. Click the **Settings** tab. + 3. Select new options from the dropdown menu. + 4. Click **Save** to confirm. + +![Change your card settlement account or settlement frequency via the dropdown menus in the middle of the screen.](https://help.expensify.com/assets/images/ExpensifyHelp_CardSettings.png){:width="100%"} + +--- +# FAQ + +## Can I pay my balance early if I’ve reached my Domain Limit? +- **Monthly Settlement**: Click **Settle Now** to manually initiate payment. +- **Daily Settlement**: Balances settle automatically. + +## Will our Domain Limit change if our Verified Bank Account balance increases? +Yes, your limit may adjust based on cash balance, spending patterns, and Expensify usage history. If your bank account is connected via Plaid, updates occur within 24 hours of a fund transfer. + +## How is the "Amount Owed" on the card list calculated? +It includes all pending and posted transactions since the last settlement. Only posted transactions are included in the actual settlement withdrawal. + +## How can I view unsettled expenses? +1. Check the date of your last settlement. +2. Go to **Settings > Domains > Company Cards > Reconciliation**. +3. Click the **Expenses** tab. +4. Set the start date to the day after the last settled expenses and the end date to today. +5. The **Imported Total** will display the outstanding amount, with a breakdown of individual expenses available. + +For additional support, contact Concierge via Expensify. diff --git "a/docs/articles/expensify-classic/expensify-card/Set-Up-the-Expensify-Visa\302\256-Commercial-Card-for-your-Company.md" "b/docs/articles/expensify-classic/expensify-card/Set-Up-the-Expensify-Visa\302\256-Commercial-Card-for-your-Company.md" index 8f6a3f1a908d..d5b9f3febf7e 100644 --- "a/docs/articles/expensify-classic/expensify-card/Set-Up-the-Expensify-Visa\302\256-Commercial-Card-for-your-Company.md" +++ "b/docs/articles/expensify-classic/expensify-card/Set-Up-the-Expensify-Visa\302\256-Commercial-Card-for-your-Company.md" @@ -1,69 +1,83 @@ --- -title: Set Up the Expensify Visa® Commercial Card for your Company -description: Details on setting up the Expensify Card for your company as an admin +title: Set Up the Expensify Visa® Commercial Card for Your Company +description: Step-by-step guide for admins to set up the Expensify Card for their organization. --- + # Overview -If you’re an admin interested in rolling out the Expensify Visa® Commercial Card for your organization, you’re in the right place. This article will cover how to qualify and apply for the Expensify Card program and begin issuing cards to your employees. +If you're an admin looking to roll out the Expensify Visa® Commercial Card for your organization, you're in the right place. This guide will walk you through the steps to qualify, apply for, and issue the Expensify Card to your employees. + +# How to Qualify for the Expensify Card Program + +Before you can apply for the Expensify Card, make sure you meet the following prerequisites: + +1. **Email Address**: The email associated with your Expensify account must be from a private domain. +2. **Claim Your Domain**: You must claim your private domain in Expensify. +3. **US Business Bank Account**: You need to add and verify a US business bank account to your Expensify account. + +### Claim Your Domain + +To claim a domain, you must be a workspace admin and use a company email address matching the domain you want to claim. After setting up your account and workspace, go to **Settings > Domains** to claim your domain. + +### Add and Verify Your US Business Bank Account -# How to qualify for the Expensify Card program +To add your business bank account, go to **Settings > Account > Payments** and click **Add Verified Bank Account**. Follow the setup steps and complete the verification process. -There are three prerequisites to consider before applying for the Expensify Card: +# How to Apply for the Expensify Card -1. The email address associated with your account must be on a private domain -2. You must claim your private domain in Expensify -3. You must add and verify a US business bank account to your Expensify account - -To claim a domain, you must be a workspace admin with a company email address matching the domain you want to claim. After you create an account and set up a workspace, head to **Settings > Domains** to claim your domain. +Once your domain is claimed and your business bank account is verified, you can apply for the Expensify Card. You can apply in multiple ways via the web: -You can add a business bank account by navigating to **Settings > Account > Payments** and clicking Add Verified Bank Account. Follow the setup steps and complete the verification process as required. +### From the Home Page -# How to apply for the Expensify Card +1. Log into your Expensify account. +2. Go to your account's home page. +3. Find the task titled “Introducing the Expensify Card” and click **Enable my Expensify Cards** to start the application. -Once you’ve claimed your domain and added a verified US business bank account, you can apply for the Expensify Card. There are multiple ways to apply for the card from the web: +### From the Company Cards Page -## From the home page +1. Log into your Expensify account. +2. Go to **Settings > Domains > _Domain Name_ > Company Cards**. +3. Click **Get the Card**. -1. Log into your Expensify account using your preferred web browser -2. Head to your account’s home page -3. On the task that says “Introducing the Expensify Card,” click **Enable my Expensify Cards** to get started +Once your application is received, we'll review it and send you a confirmation email with next steps. -## From the Company Cards page +# How to Issue Cards -1. Log into your Expensify account using your preferred web browser -2. Head to **Settings > Domains > _Domain Name_ > Company Cards** -3. Click **Get the Card** +After approval, it’s time to set card limits for your employees. When you set a limit, the employee will receive an email and see a task on their home page asking for their shipping address. Once they enter the details, their physical card will be shipped, and a virtual card will be created for immediate use. -After we receive your application, we’ll review it ASAP and send you a confirmation email with the next steps once we have them. +### Set a Card Limit for an Employee -# How to issue cards +1. Go to **Settings > Domains > _Domain Name_ > Company Cards**. +2. Click **Edit Limit** next to the employee who needs a card. +3. Set a limit greater than $0 to issue the card. -After you’ve been approved, it’s time to set limits for your employees. Setting a limit triggers an email and task on the home page requesting the employee’s shipping address. Once they enter their details, a card will be shipped to them. We’ll also create a virtual card for the employee that can be used immediately. +### Set Limits for a Group of Employees -To set a limit, head over to the Company Cards UI via **Settings > Domains > _Domain Name_ > Company Cards**. Click the **Edit Limit** button next to members who need a card assigned, and set a non-$0 to issue them a card. +If you have a validated domain, you can set limits for multiple employees at once: -If you have a validated domain, you can set a limit for multiple members by setting a limit for an entire domain group via **Settings > Domains > _Domain Name_ > Groups**. Keep in mind that custom limits that are set on an individual basis will override the group limit. +1. Go to **Settings > Domains > _Domain Name_ > Groups**. +2. Set a limit for the entire group. -The Company Cards page will act as a hub to view all employees who have been issued a card and where you can view and edit the individual card limits. You’ll also be able to see anyone who has requested a card but doesn’t have one yet. +Keep in mind that individual limits will override group limits. -{% include faq-begin.md %} +The **Company Cards** page serves as a hub for managing card limits and viewing all employees with cards. You can also see who has requested a card but hasn’t received one yet. -## Are there foreign transaction fees? +# FAQ -There are no foreign transaction fees when using your Expensify Card for international purchases. +## Are There Foreign Transaction Fees? -## How does the Expensify Card affect my or my company's credit score? +No, there are no foreign transaction fees for international purchases made with your Expensify Card. -Applying for or using the Expensify Card will never have any positive or negative effect on your personal credit score or your business's credit score. We do not consider your or your business' credit score when determining approval and your card limit. +## Does the Expensify Card Affect My Credit Score? -## How much does the Expensify Card cost? +Using the Expensify Card has no impact on your personal or business credit score. Your credit score is not considered when determining card approval or limit. -The Expensify Card is a free corporate card, and no fees are associated with it. In addition, if you use the Expensify Card, you can save money on your Expensify subscription (based on how much of your approved spend occurs on the Expensify Card, compared with other approved spend, in each month). +## What Are the Costs of the Expensify Card? -## If I have staff outside the US, can they use the Expensify Card? +The Expensify Card is free. There are no fees associated with it. Additionally, using the card can help you save money on your Expensify subscription based on your approved spend. -As long as the verified bank account used to apply for the Expensify Card is a US bank account, your cardholders can be anywhere in the world. +## Can My Staff Outside the US Use the Expensify Card? -Otherwise, the Expensify Card is not available for customers using non-US banks. With that said, launching international support is a top priority for us. Let us know if you’re interested in contacting support, and we’ll reach out as soon as the Expensify Card is available outside the United States. +Yes, as long as your business bank account is US-based, your cardholders can be located anywhere in the world. -{% include faq-end.md %} +Currently, the Expensify Card is not available for customers with non-US bank accounts, but international support is a priority. Contact support if you're interested in being notified when it becomes available. diff --git a/docs/articles/expensify-classic/expensify-card/Statements.md b/docs/articles/expensify-classic/expensify-card/Statements.md deleted file mode 100644 index eb797f0cee4b..000000000000 --- a/docs/articles/expensify-classic/expensify-card/Statements.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: — Expensify Card Statements and Settlements -description: Understand how to access your Expensify Card Statement ---- - -## Expensify Card Statements -Expensify offers several settlement types and a detailed statement of transactions and settlements. - -### Accessing the Statement -- If your domain uses the Expensify Card and you have a validated Business Bank Account, access the statement at _**Settings > Domains > Company Cards > Reconciliation Tab > Settlements**_. -- The statement shows individual transactions (debits) and their corresponding settlements (credits). - -### Key Information in the Statement -- **Date:** Debit date for card payments; purchase date for transactions. -- **Entry ID:** Unique ID grouping card payments and transactions. -- **Withdrawn Amount:** Amount debited from the Business Bank Account for card payments. -- **Transaction Amount:** Expense purchase amount for card transactions. -- **User Email:** Cardholder’s Expensify email address. -- **Transaction ID:** Unique ID for locating transactions and assisting support. - -![Expanded card settlement that shows the various items that make up each card settlement.](https://help.expensify.com/assets/images/ExpensifyHelp_SettlementExpanded.png){:width="100%"} - -**Note:** The statement only includes payments from existing Business Bank Accounts under **Settings > Account > Payments > Business Accounts**. Deleted accounts' payments won't appear. - -## Exporting Statements -1. Log in to the web app and go to **Settings > Domains > Company Cards**. -2. Click the **Reconciliation** tab and select **Settlements**. -3. Enter the start and end dates for your statement. -4. Click **Search** to view the statement. -5. Click **Download** to export it as a CSV. - -![Click the Download CSV button in the middle of the page to export your card settlements.](https://help.expensify.com/assets/images/ExpensifyHelp_SettlementExport.png){:width="100%"} - -## Expensify Card Settlement Frequency -- **Daily Settlement:** Balance paid in full every business day with an itemized debit each day. -- **Monthly Settlement:** Balance settled monthly on a predetermined date with one itemized debit per month (available for Plaid-connected accounts with no recent negative balance). - -## How Settlement Works -- Each business day or on your monthly settlement date, the total of posted transactions is calculated. -- The settlement amount is withdrawn from the Verified Business Bank Account linked to the primary domain admin, resetting your card balance to $0. -- To change your settlement frequency or bank account, go to _**Settings > Domains > [Domain Name] > Company Cards**_, click the **Settings** tab, and select the new options from the dropdown menu. Click **Save** to confirm. - -![Change your card settlement account or settlement frequency via the dropdown menus in the middle of the screen.](https://help.expensify.com/assets/images/ExpensifyHelp_CardSettings.png){:width="100%"} - - -# FAQ - -## Can you pay your balance early if you’ve reached your Domain Limit? -- For Monthly Settlement, use the “Settle Now” button to manually initiate settlement. -- For Daily Settlement, balances settle automatically with no additional action required. - -## Will our domain limit change if our Verified Bank Account has a higher balance? -Domain limits may change based on cash balance, spending patterns, and history with Expensify. If your bank account is connected through Plaid, expect changes within 24 hours of transferring funds. - -## How is the “Amount Owed” figure on the card list calculated? -It includes all pending and posted transactions since the last settlement date. The settlement amount withdrawn only includes posted transactions. - -## How do I view all unsettled expenses? -1. Note the dates of expenses in your last settlement. -2. Go to the **Expenses** tab on the Reconciliation Dashboard. -3. Set the start date after the last settled expenses and the end date to today. -4. The **Imported Total** shows the outstanding amount, and you can click to view individual expenses. diff --git a/docs/articles/expensify-classic/expensify-card/Unlimited-Virtual-Cards.md b/docs/articles/expensify-classic/expensify-card/Unlimited-Virtual-Cards.md index 5b0f0c1c2879..d2fb3a558926 100644 --- a/docs/articles/expensify-classic/expensify-card/Unlimited-Virtual-Cards.md +++ b/docs/articles/expensify-classic/expensify-card/Unlimited-Virtual-Cards.md @@ -1,87 +1,87 @@ --- -title: Unlimited Virtual Cards -description: Learn more about virtual cards and how they can help your business gain efficiency and insight into company spending. +title: Unlimited Virtual Cards +description: Learn about virtual cards and how they help businesses improve efficiency and gain better control over company spending. --- # Overview -For admins to issue virtual cards, your company **must upgrade to Expensify’s new Expensify Visa® Commercial Card.** +To issue virtual cards, your company must upgrade to the **Expensify Visa® Commercial Card**. -Once upgraded to the new Expensify Card, admins can issue an unlimited number of virtual cards with a fixed or monthly limit for specific company purchases or recurring subscription payments _(e.g., Marketing purchases, Advertising, Travel, Amazon Web Services, etc.)._ +Once upgraded, admins can issue an **unlimited number of virtual cards** with either a fixed or monthly limit for specific purchases or recurring subscriptions (e.g., Marketing, Advertising, Travel, AWS, etc.). -This feature supports businesses that require tighter controls on company spending. Customers can set fixed or monthly spending limits for each virtual card. +Virtual cards are ideal for businesses that need **tight control over spending**. You can set individual spending limits for each virtual card. -Use virtual cards if your company needs or wants: +Use virtual cards if your company needs: -- To use one card per vendor or subscription, -- To issue cards for one-time purchases with a fixed amount, -- To issue cards for events or trips, -- To issue cards with a low limit that renews monthly, +- One card per vendor or subscription +- Cards for one-time purchases with a fixed amount +- Cards for events or trips +- Cards with a low limit that renews monthly -Admins can also name each virtual card, making it easy to categorize and assign them to specific accounts upon creation. Naming the card ensures a clear and organized overview of expenses within the Expensify platform. +Admins can name each card for easy tracking and organization. This makes it simple to categorize expenses in the Expensify platform. -# Set up virtual cards +# Set up Virtual Cards -After adopting the new Expensify Card, domain admins can issue virtual cards to any employee using an email matching your domain. Once created and assigned, the card will be visible under the name given to the card. +After upgrading to the Expensify Card, domain admins can issue virtual cards to any employee with an email matching your company domain. Once assigned, the virtual card will appear under the card's assigned name. **To assign a virtual card:** -Head to **Settings** > **Domains** > [**Company Cards**](https://www.expensify.com/domain_companycards) and click the **Issue Virtual Cards** button. From there: +1. Go to **Settings** > **Domains** > [**Company Cards**](https://www.expensify.com/domain_companycards). +2. Click **Issue Virtual Cards**. +3. Enter a card name (e.g., "Google Ads"). +4. Select a domain member to assign the card to. +5. Set a card limit. +6. Choose **Limit Type** (Fixed or Monthly). +7. Click **Issue Card**. -1. Enter a card name (i.e., "Google Ads"). -2. Select a domain member to assign the card to. -3. Enter a card limit. -4. Select a **Limit Type** of _Fixed_ or _Monthly_. -5. Click **Issue Card**. +![The Issue Virtual Cards modal is open in the middle of the screen. There are four options to set; Card Name, Assignee, Card Limit, and Limit type. A cancel (left) and save (right) button are at the bottom right of the modal.]({{site.url}}/assets/images/AdminissuedVirtualCards.png) -![The Issue Virtual Cards modal is open in the middle of the screen. There are four options to set; Card Name, Assignee, Card Limit, and Limit type. A cancel (left) and save (right) button are at the bottom right of the modal.]({{site.url}}/assets/images/AdminissuedVirtualCards.png){:width="100%"} +# Edit Virtual Cards -# Edit virtual cards - -Domain admin can update the details of a virtual card on the [Company Cards](https://www.expensify.com/domain_companycards) page. +Domain admins can edit the details of any virtual card on the [Company Cards](https://www.expensify.com/domain_companycards) page. **To edit a virtual card:** -1. Click the **Edit** button to the right of the card. -2. Change the editable details. -3. Click **Edit Card** to save the changes. +1. Click the **Edit** button next to the card. +2. Update the details as needed. +3. Click **Edit Card** to save changes. -# Terminate a virtual card +# Terminate a Virtual Card -Domain admin can also terminate a virtual card on the [Company Cards](https://www.expensify.com/domain_companycards) page by setting the limit to $0. +Admins can terminate a virtual card by setting the limit to **$0**. **To terminate a virtual card:** -1. Click the **Edit** button to the right of the card. -2. Set the limit to $0. +1. Click the **Edit** button next to the card. +2. Set the limit to **$0**. 3. Click **Save**. -4. Refresh your web page, and the card will be removed from the list. +4. Refresh the page, and the card will be removed from the list. -{% include faq-begin.md %} +# FAQ -## What is the difference between a fixed limit and a monthly limit? +## What’s the difference between a fixed limit and a monthly limit? -There are two different limit types that are best suited for their intended purpose. -- _Fixed-limit_ spend cards are ideal for one-time expenses or providing employees with access to a card for a designated purchase. -- _Monthly_ limit spend cards are perfect for managing recurring expenses such as subscriptions and memberships. +- **Fixed-limit cards** are ideal for one-time purchases or specific purchases with a set amount. +- **Monthly-limit cards** are best for recurring expenses like subscriptions or memberships. -A virtual card with either of these limit types doesn't share its limit with any other cards, including the cardholder's smart limit cards. +Both limit types are independent of other cards, including any smart limit cards. ## Where can employees see their virtual cards? -Employees can see their assigned virtual cards by navigating to **Settings** > **Account** > [**Credit Cards Import**](https://www.expensify.com/settings?param=%7B%22section%22:%22creditcards%22%7D) in their account. - -On this page, employees can see the remaining card limit, the type of card (e.g., fixed or monthly), and the name given to the card. +Employees can view their assigned virtual cards by going to **Settings** > **Account** > [**Credit Cards Import**](https://www.expensify.com/settings?param=%7B%22section%22:%22creditcards%22%7D) in their account. -When the employee needs to use the card, they’ll click the **Show Details** button to expose the card details for making purchases. +Here, they can see: -_Note: If the employee doesn’t have Two-Factor Authentication (2FA) enabled when they display the card details, they’ll be prompted to enable it. Enabling 2FA for their account provides the best protection from fraud and is **required** to dispute virtual card expenses._ +- Remaining card limit +- Card type (e.g., fixed or monthly) +- The name of the card -## What do I do when there is fraud on one of our virtual cards? +To view card details, they’ll click **Show Details**. -If you or an employee loses their virtual card, experiences fraud, or suspects the card details are no longer secure, please [request a new card](https://help.expensify.com/articles/expensify-classic/expensify-card/Request-the-Card) immediately. A domain admin can also set the limit for the card to $0 to terminate the specific card immediately if the employee cannot take action. +_Note: If the employee hasn’t enabled Two-Factor Authentication (2FA), they will be prompted to enable it before displaying card details. 2FA is required for disputing virtual card charges._ -When the employee requests a new card, the compromised card will be terminated immediately. This is best practice for any Expensify Card, and if fraud is suspected, action should be taken as soon as possible to reduce the company's financial impact. +## What should I do if there’s fraud on one of our virtual cards? -{% include faq-end.md %} +If a virtual card is lost, compromised, or you suspect fraud, request a new card immediately. The domain admin can set the card limit to **$0** to terminate it if the employee is unavailable. +When a new card is requested, the old card is immediately deactivated. Always act quickly in the case of fraud to minimize financial impact. 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 index 8b258e4ac982..7eec775a1911 100644 --- a/docs/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports.md +++ b/docs/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports.md @@ -3,11 +3,13 @@ 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: +There are several methods you can use to export your expenses and reports on the Expensify Classic web app, including: - Export as a PDF - Export as a CSV or to an accounting integration - Export using a default or custom export template +Please note that it is currently not possible to export these files using the Expensify Classic mobile app. + # Export PDF 1. Click the **Reports** tab. @@ -255,6 +257,8 @@ Functions can be applied to any formula using the `|` symbol and the function na | {expense:merchant\|substr:4:5} | would output "bucks" for a merchant named Starbucks.| | {report:policyname\|substr:20} | would output "Sally's Expenses" for a report on a workspace named "Control Workspace - Sally's Expenses"| | {report:policyname\|substr:20\|frontpart} | would output "Sally's"| +| domain | Get the domain name from an email address; the part after the `@` sign.| +| {report:submit:from:email\|domain} | email.com if alice@email.com was the submitter| {% include faq-begin.md %} @@ -262,6 +266,10 @@ Functions can be applied to any formula using the `|` symbol and the function na 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. +**Can I export to CSV or PDF on my mobile app?** + +No, expenses can only be exported using the web app. + **How do I print a report?** 1. Click the **Reports** tab. diff --git a/docs/articles/new-expensify/connections/netsuite/Configure-Netsuite.md b/docs/articles/new-expensify/connections/netsuite/Configure-Netsuite.md index 5f5a54818330..4734a85bf67f 100644 --- a/docs/articles/new-expensify/connections/netsuite/Configure-Netsuite.md +++ b/docs/articles/new-expensify/connections/netsuite/Configure-Netsuite.md @@ -1,163 +1,138 @@ --- title: Configure NetSuite -description: Configure the Import, Export, and Advanced settings for Expensify's integration with NetSuite +description: Learn how to configure the Import, Export, and Advanced settings for Expensify's integration with NetSuite. order: 2 --- -# Best practices using NetSuite +Expensify’s integration with NetSuite streamlines expense management by automatically syncing expense reports. This reduces manual entry, minimizes errors, and provides real-time visibility into spending. With this integration, you can: -Using Expensify with NetSuite brings a seamless, efficient approach to managing expenses. With automatic syncing, expense reports flow directly into NetSuite, reducing manual entry and errors while giving real-time visibility into spending. This integration speeds up approvals, simplifies reimbursements, and provides clear insights for smarter budgeting and compliance. Together, Expensify and NetSuite make expense management faster, more accurate, and stress-free. +- Speed up approvals and reimbursements. +- Gain clear insights for budgeting and compliance. +- Ensure seamless data flow between Expensify and NetSuite. -# Accessing the NetSuite configuration settings +# Accessing NetSuite Configuration Settings -NetSuite is connected at the workspace level, and each workspace can have a unique configuration that dictates how the connection functions. To access the connection settings: +NetSuite is connected at the workspace level, and each workspace can have a unique configuration. -1. Click Settings in the bottom left menu. -2. Scroll down and click **Workspaces** in the left menu. -3. Select the workspace you want to access settings for. +To access the configuration settings: + +1. Click **Settings** in the bottom left menu. +2. Select **Workspaces** from the left menu. +3. Choose the workspace you want to configure. 4. Click **Accounting** in the left menu. -# Step 1: Configure import settings - -The following steps help you determine how data will be imported from NetSuite to Expensify. - -1. From the Accounting tab of your workspace settings, click on **Import**. -2. In the right-hand menu, review each of the following import settings: - - _Categories_: Your NetSuite Expense Categories are automatically imported into Expensify as categories. This is enabled by default and cannot be disabled. - - _Department, Classes, and Locations_: The NetSuite connection allows you to import each independently and utilize tags, report fields, or employee defaults as the coding method. - - Tags are applied at the expense level and apply to a single expense. - - Report Fields are applied at the report header level and apply to all expenses on the report. - - The employee default is applied when the expense is exported to NetSuite and comes from the default on the submitter’s employee record in NetSuite. - - _Customers and Projects_: The NetSuite connection allows you to import customers and projects into Expensify as Tags or Report Fields. - -_Cross-subsidiary customers/projects_: Enable to import Customers and Projects across all NetSuite subsidiaries to a single Expensify workspace. This setting requires you to enable “Intercompany Time and Expense” in NetSuite. To enable that feature in NetSuite, go to **Setup > Company > Setup Tasks: Enable Features > Advanced Features**. - -_Tax_: Enable to import NetSuite Tax Groups and configure further on the Taxes tab of your workspace settings menu. - -_Custom Segments and Records_: Enable to import segments and records are tags or report fields. - - If configuring Custom Records as Report Fields, use the Field ID on the Transactions tab (under **Custom Segments > Transactions**). - - If configuring Custom Records as Tags, use the Field ID on the Transaction Columns tab (under **Custom Segments > Transaction Columns**). - - Don’t use the “Filtered by” feature available for Custom Segments. Expensify can’t make these dependent on other fields. If you do have a filter selected, we suggest switching that filter in NetSuite to “Subsidiary” and enabling all subsidiaries to ensure you don’t receive any errors upon exporting reports. - -_Custom Lists_: Enable to import lists as tags or reports fields. -3. Sync the connection by closing the right-hand menu and clicking the **three-dot icon** > **Sync Now** option. Once the sync completes, you should see the values for any enabled tags or report fields in the corresponding Tag or Report Field tabs in the workspace settings menu. - -{% include info.html %} -When you’re done configuring the settings, or anytime you make changes in the future, sync the NetSuite connection. This will ensure changes are saved and updated across both systems. -{% include end-info.html %} +--- -# Step 2: Configure export settings +## Step 1: Configure Import Settings -The following steps help you determine how data will be exported from Expensify to NetSuite. +To determine how data is imported from NetSuite to Expensify: -1. From the Accounting tab of your workspace settings, click on **Export**. -2. In the right-hand menu, review each of the following export settings: - - _Preferred exporter_: Any workspace admin can export reports to NetSuite. For automatic export, Concierge will export on behalf of the preferred exporter. The preferred exporter will also be notified of any expense reports that fail to export to NetSuite due to an error. - - _Export date_: You can choose which date to use for the records created in NetSuite. There are three date options: - - _Date of last expense_: This will use the date of the most recent expense on the report. - - _Submitted date_: The date the employee submitted the report. - - _Exported date_: The date you export the report to NetSuite. - - _Export out-of-pocket expenses as_: - - _Expense Reports_: Out-of-pocket expenses will be exported as expense reports, which will be posted to the payables account designated in NetSuite. - - _Vendor Bills_: Out-of-pocket expenses will be exported to NetSuite as vendor bills. 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_: Out-of-pocket expenses will be exported to NetSuite as journal entries. 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. - - By default, journal entry forms do not contain a customer column, so it is not possible to export customers or projects with this export option. Also, the credit line and header-level classifications are pulled from the employee record. - - _Export company card expenses as_: - - _Expense Reports_: To export company card expenses as expense reports, you must configure your default corporate cards in NetSuite. - - _Vendor Bills_: Company card expenses will be posted as a vendor bill payable to the default vendor specified in your workspace Accounting settings. You can also set an approval level in NetSuite for the bills. - - _Journal Entries_: Company Card expenses will be posted to the Journal Entries posting account selected in your workspace Accounting settings. - - Important Notes: - - 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 - - The credit line and header level classifications are pulled from the employee record - - _Export invoices to_: Select the Accounts Receivable account where you want your Invoice reports to export. In NetSuite, the invoices are linked to the customer, corresponding to the email address where the invoice was sent. - - _Invoice item_: Choose whether Expensify creates an "Expensify invoice line item" for you upon export (if one doesn’t exist already) or select an existing invoice item. - - _Export foreign currency amount_: Enabling this feature allows you to send the original amount of the expense rather than the converted total when exporting to NetSuite. This option is only available when exporting out-of-pocket expenses as Expense Reports. - - _Export to next open period_: When this feature is enabled and you try exporting an expense report to a closed NetSuite period, we will automatically export to the next open period instead of returning an error. -3. Sync the connection by closing the right-hand menu and clicking the **three-dot icon** > **Sync Now** option. +1. Go to **Accounting** > **Import**. +2. Review and configure the following settings: -# Step 3: Configure advanced settings + - **Categories**: NetSuite Expense Categories are automatically imported. + - **Departments, Classes, and Locations**: Import options include Tags, Report Fields, or Employee Defaults. + - **Customers and Projects**: Choose to import them as Tags or Report Fields. + - *Cross-Subsidiary Customers/Projects*: Enable this to import data across all NetSuite subsidiaries. Ensure "Intercompany Time and Expense" is enabled in NetSuite under **Setup > Company > Enable Features > Advanced Features**. + - **Tax**: Import NetSuite Tax Groups and configure in the Taxes tab. + - **Custom Segments and Records**: Import segments and records as Tags or Report Fields. + - Use the correct Field ID from NetSuite’s Transactions tab. + - Avoid using the “Filtered by” feature in Custom Segments. + - **Custom Lists**: Enable to import lists as Tags or Report Fields. -The following steps help you determine the advanced settings for your NetSuite connection. +3. Click the **three-dot icon** > **Sync Now** to update settings. +4. After configuring settings, sync the NetSuite connection to apply changes. -1. From the Accounting tab of your workspace settings, click on **Advanced**. -2. In the right-hand menu, review each of the following advanced settings: - - _Auto-sync_: When enabled, the connection will sync daily to ensure that the data shared between the two systems is up-to-date. We strongly recommend keeping auto-sync enabled. The following will occur when auto-sync is enabled: - - When an expense report reaches its final state in Expensify, it will be automatically exported to NetSuite. The final state will either be reimbursement (if you reimburse members through Expensify) or final approval (if you reimburse members outside of Expensify). - - If Sync Reimbursed Reports is enabled, then we will sync the reimbursement status of reports between Expensify and NetSuite. - - _Sync reimbursed reports_: Any time a report is paid using Expensify ACH, the corresponding bill payment will be created in the NetSuite. - - _Reimbursments account_: Select the account that matches the default account for Bill Payments in your NetSuite account. - - _Collections account_: When exporting invoices, once marked as Paid, the payment is marked against the account selected. - - _Invite employees and set approvals_: Enabling this feature will invite all employees from the connected NetSuite subsidiary to your Expensify workspace. Once imported, Expensify will email them to let them know they’ve been added to a workspace. - This feature invites employees and enables a custom set of approval workflow options, which you can manage in Expensify Classic. (Click Switch to Expensify Classic from the Settings menu.) - - _Auto create employees/vendors_: With this feature enabled, Expensify will automatically create a new employee or vendor in NetSuite (if one doesn’t already exist) using the name and email of the report submitter. - - _Enable newly imported categories_: Toggle to enable this feature and anytime a new Expense Category is created in NetSuite, it will be imported into Expensify as an enabled category. Otherwise, it will import disabled and employees will be unable to see it as an option to code to an expense. - - _Setting approval levels_: You can set the NetSuite approval level for each different export type; Expense report, Vendor bill, and Journal entry. - - Note: If you have Approval Routing selected in your accounting preference, this will override the selections in Expensify. If you do not wish to use Approval Routing in NetSuite, go to **Setup > Accounting > Accounting Preferences > Approval Routing** and ensure Vendor Bills and Journal Entries are not selected. - - _Custom form ID_: By default, Expensify creates entries using the preferred transaction form set in NetSuite. Enabling this setting allows you to designate a specific transaction form. - - _Out-of-pocket expense_: - - _Company card expense_: -3. Sync the connection by closing the right-hand menu and clicking the **three-dot icon** > **Sync Now** option. +--- -{% include faq-begin.md %} +## Step 2: Configure Export Settings -## I added tags in NetSuite (departments, classes, or locations) how do I get them into my workspace? +To determine how data is exported from Expensify to NetSuite: -New departments, classes, and locations must be added in NetSuite first before they can be added as options to code to expenses in Expensify. After adding them in NetSuite, sync your connection to import the new options. +1. Go to **Accounting** > **Export**. +2. Review and configure the following settings: -Once imported, you can turn specific tags on or off under **Settings > Workspaces > [Workspace Name] > Tags**. You can turn specific report fields on or off under **Settings > Workspaces > [Workspace Name] > Report Fields**. + - **Preferred Exporter**: Select an admin to handle exports. + - **Export Date Options**: + - *Date of Last Expense* + - *Submitted Date* + - *Exported Date* + - **Export Out-of-Pocket Expenses As**: + - *Expense Reports* + - *Vendor Bills* + - *Journal Entries* (Note: Customers/projects cannot be exported with this option.) + - **Export Company Card Expenses As**: + - *Expense Reports*, *Vendor Bills*, or *Journal Entries*. + - Expensify Card expenses always export as Journal Entries. + - **Export Invoices To**: Choose an Accounts Receivable account. + - **Invoice Item**: Select or create an invoice line item. + - **Export Foreign Currency Amount**: Enable to export original expense amounts. + - **Export to Next Open Period**: Automatically exports expenses to the next open NetSuite period if the current one is closed. -## Is it possible to automate inviting my employees and their approver from NetSuite into Expensify? +3. Click the **three-dot icon** > **Sync Now** to update settings. -Yes, you can automatically import your employees and set their approval workflow with your connection between NetSuite and Expensify. +--- -Enabling this feature will invite all employees from the connected NetSuite subsidiary to your Expensify workspace. Once imported, Expensify will email them to let them know they’ve been added to a workspace. +## Step 3: Configure Advanced Settings -In addition to inviting employees, this feature enables a custom set of approval workflow options, which you can manage in Expensify Classic. (Click Switch to Expensify Classic from the Settings menu.) Your options for approval include: +To manage additional integration features: -- **Basic Approval:** This is a single level of approval, where all users submit directly to a Final Approver. The Final Approver defaults to the workspace owner but can be edited on the people page. -- **Manager Approval (default):** Two levels of approval route reports first to an employee’s NetSuite expense approver or supervisor, and second to a workspace-wide Final Approver. By NetSuite convention, Expensify will map to the supervisor if no expense approver exists. The Final Approver defaults to the workspace owner but can be edited on the people page. -- **Configure Manually:** Employees will be imported, but all levels of approval must be manually configured on the workspace’s People settings page. If you enable this setting, it’s recommended you review the newly imported employees and managers on the **Settings > Workspaces > Group > [Workspace Name] > People** page. +1. Go to **Accounting** > **Advanced**. +2. Review and configure the following settings: + - **Auto-Sync**: Enable for daily syncing. + - **Sync Reimbursed Reports**: Automatically updates reimbursement status between Expensify and NetSuite. + - **Invite Employees & Set Approvals**: Imports employees and sets approval workflows. + - **Auto Create Employees/Vendors**: Creates a NetSuite employee/vendor record if one doesn’t exist. + - **Enable Newly Imported Categories**: Automatically enables new Expense Categories from NetSuite. + - **Approval Levels**: Set NetSuite approval levels for Expense Reports, Vendor Bills, and Journal Entries. + - **Custom Form ID**: Use a specific NetSuite transaction form instead of the default. -## I notice that company card expenses export to NetSuite right away when I approve a report, but reimbursable expenses don’t, why is that? +3. Click the **three-dot icon** > **Sync Now** to apply changes. -When Auto Sync is enabled and you reimburse employees through Expensify, we help you automatically send finalized expenses to NetSuite. The timing of the export depends on the type of expense. +--- -- **If you reimburse members through Expensify:** Reimbursing an expense report will trigger auto-export to NetSuite. When the expense report is exported to NetSuite, a corresponding bill payment will also be created in NetSuite. -- **If you reimburse members outside of Expensify:** Expense reports will be exported to NetSuite at the time of final approval. After you mark the report as paid in NetSuite, the reimbursed status will be synced back to Expensify the next time the integration syncs. +# FAQ -## How do I configure my default corporate cards in NetSuite? +## How do I import new tags (departments, classes, locations) from NetSuite? -To export company card expenses as expense reports, you must configure your default corporate cards in NetSuite. +1. Add new tags in NetSuite. +2. Sync the NetSuite connection in Expensify. +3. Enable or disable tags under **Settings > Workspaces > [Workspace Name] > Tags**. -To do this, you must select the correct card on the NetSuite employee records (for individual accounts) or the subsidiary record (If you use a non-One World account, the default is found in your accounting preferences). +## Can I automate employee invitations and approval workflows from NetSuite? -To update your expense report transaction form in NetSuite: +Yes, enabling the feature will: +- Import employees from the connected NetSuite subsidiary. +- Notify them via email. +- Allow workflow configuration in Expensify Classic (**Settings > Workspaces > People**). -1. Go to **Customization > Forms > Transaction Forms.** -2. Click **Edit** next to the preferred expense report form. -3. Go to the **Screen Fields > Main** tab. -4. Check “Show” for "Account for Corporate Card Expenses." -5. Go to the **Screen Fields > Expenses** tab. -6. Check “Show” for "Corporate Card." +## Why do company card expenses export immediately, but reimbursable expenses don’t? -You can also select the default account on your employee record to use individual corporate cards for each employee. Make sure you add this field to your employee entity form in NetSuite. If you have multiple cards assigned to a single employee, you cannot export to each account. You can only have a single default per employee record. +- **Reimbursable expenses** export upon reimbursement in Expensify. +- **Company card expenses** export upon approval. +- If Auto-Sync is enabled, reimbursement status updates automatically. -## My custom segments created before 2019.1 weren’t created with a unified ID, what change can I make to import them into Expensify?” +## How do I configure corporate card exports in NetSuite? - Note that as of 2019.1, any new custom segments that you create automatically use the unified ID, and the "Use as Field ID" box is not visible. If you are editing a custom segment definition that was created before 2019.1, the "Use as Field ID" box is available. To use a unified ID for the entire custom segment definition, check the "Use as Field ID" box. When the box is checked, no field ID fields or columns are shown on the Application & Sourcing subtabs because one ID is used for all fields. +1. Select the correct corporate card under **Customization > Forms > Transaction Forms**. +2. Enable "Show" for "Account for Corporate Card Expenses" and "Corporate Card" fields. +3. Set the default card account on employee records. -## How does Auto-sync work with reimbursed reports? +## Why can’t I import custom segments created before 2019.1? -If a report is reimbursed via ACH or marked as reimbursed in Expensify and then exported to NetSuite, the report is automatically marked as paid in NetSuite. +Check the "Use as Field ID" box in NetSuite. This assigns a unified ID to older segments. -If a report is exported to NetSuite and then marked as paid in NetSuite, it will automatically be marked as reimbursed in Expensify during the next sync. +## How does Auto-Sync work with reimbursed reports? -## Will enabling auto-sync affect existing approved and reimbursed reports? +- If a report is reimbursed in Expensify, NetSuite marks it as paid. +- If a report is marked as paid in NetSuite, Expensify updates the status during the next sync. -Auto-sync will only export newly approved reports to NetSuite. Reports that were approved or reimbursed before enabling auto-sync will need to be manually exported to sync them to NetSuite. +## Will enabling Auto-Sync affect existing reports? -## When using multi-currency features in NetSuite, can expenses be exported with any currency? +No, only newly approved reports will auto-export. Manually export older reports if needed. -When using multi-currency features with NetSuite, remember these points: +## How does multi-currency exporting work in NetSuite? - - **Employee/Vendor currency:** The currency set for a NetSuite vendor or employee record must match the subsidiary currency for whichever subsidiary you export that user's reports to. A currency mismatch will cause export errors. - - **Bank Account Currency:** When synchronizing bill payments, your bank account’s currency must match the subsidiary’s currency. Failure to do so will result in an “Invalid Account” error. -{% include faq-end.md %} +- Employee/vendor currency must match the subsidiary currency. +- The bank account currency must match the subsidiary currency for bill payments. diff --git a/docs/articles/new-expensify/connections/quickbooks-desktop/Connect-to-QuickBooks-Desktop.md b/docs/articles/new-expensify/connections/quickbooks-desktop/Connect-to-QuickBooks-Desktop.md new file mode 100644 index 000000000000..b5f13d353bea --- /dev/null +++ b/docs/articles/new-expensify/connections/quickbooks-desktop/Connect-to-QuickBooks-Desktop.md @@ -0,0 +1,86 @@ +--- +title: QuickBooks Desktop +description: Easily connect Expensify to QuickBooks Desktop for streamlined expense management and accounting. +order: 1 +--- + +QuickBooks Desktop is accounting software developed by Intuit, designed for small and medium-sized businesses to manage financial tasks. Connecting Expensify to QuickBooks Desktop makes expense management seamless. + +This guide walks you through connecting Expensify to QuickBooks Desktop, ensuring a smooth integration for managing your business expenses efficiently. + +--- + +# Connect to QuickBooks Desktop + +{% include info.html %} +To connect QuickBooks Desktop to Expensify, you must log into QuickBooks Desktop as an Admin. The company file you want to connect must be the only one open. +{% include end-info.html %} + +1. In Expensify, 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 to connect to QuickBooks Desktop. +4. Click **More features** in the left menu. +5. In the **Integrate** section, enable the **Accounting** toggle. +6. Click **Accounting** in the left menu. +7. Click **Set up** next to QuickBooks Desktop. +8. Click **Copy** to copy the link. Paste this link into the computer running QuickBooks Desktop. +9. Select your QuickBooks Desktop version. + + ![QuickBooks Desktop version selection](https://help.expensify.com/assets/images/QBO_desktop_02.png){:width="100%"} + +10. Download the Web Connector and follow the installation instructions. +11. Open the Web Connector. +12. When prompted during setup, download the config file and open it using File Explorer. This will automatically load the application into the QuickBooks Web Connector. + +{% include info.html %} +Ensure the correct company file is open in QuickBooks Desktop and is the only one open. +{% include end-info.html %} + +13. In QuickBooks Desktop, select **Yes, always allow access, even when QuickBooks is not running**, then click **Continue**. + + ![QuickBooks Desktop access permission](https://help.expensify.com/assets/images/QBO_desktop_04.png){:width="100%"} + +14. Click **OK**, then click **Yes**. + + ![QuickBooks Desktop confirmation](https://help.expensify.com/assets/images/QBO_desktop_05.png){:width="100%"} + +15. Click **Copy** to copy the password. + + ![Copy Web Connector password](https://help.expensify.com/assets/images/QBO_desktop_06.png){:width="100%"} + +16. Paste the password into the Password field of the Web Connector and press **Enter**. + + ![Paste password in Web Connector](https://help.expensify.com/assets/images/QBO_desktop_08.png){:width="100%"} + +17. Click **Yes** to save the password. The new connection will appear in the Web Connector. + + ![Save Web Connector password](https://help.expensify.com/assets/images/QBO_desktop_07.png){:width="100%"} + +{% include info.html %} +Securely save this password in a trusted password manager. You'll need it for future configuration updates or troubleshooting. +{% include end-info.html %} + +--- + +# FAQ + +## What are the hardware and software requirements for QuickBooks Desktop connector? + +- **Hardware requirements**: Ensure the host machine meets [Intuit's recommended specifications](https://quickbooks.intuit.com/learn-support/en-us/help-article/install-products/system-requirements-quickbooks-desktop-2022/L9664spDA_US_en_US). +- **Software requirements**: Windows 10 or 11 with the latest service packs installed. Users have run the connector on older Windows versions, but we don't officially support them. The Web Connector doesn't run on Mac OS. + +## What versions of QuickBooks Desktop are supported? + +Expensify follows [Intuit’s service discontinuation policy](https://quickbooks.intuit.com/learn-support/en-us/help-article/feature-preferences/quickbooks-desktop-service-discontinuation-policy/L17cXxlie_US_en_US) and supports these versions: + +- **Latest three versions** of QuickBooks Desktop (US, Canada) +- **Version tiers**: Accountant, Pro, Pro Plus, Premier, Premier Plus, Enterprise +- **Special editions**: Contractor, Manufacturing and Wholesale, Accountant, Professional Services, Nonprofit + +## Can multiple QuickBooks Desktop Connectors be installed on the same machine? + +Yes. Install one connector per company file. You can install multiple connectors to sync multiple company files to Expensify from one computer. Ensure you're logged into the correct QuickBooks company file when syncing. + +## Can I export negative expenses? + +Generally, yes. However, if you select **Check** as your export option, the report’s total cannot be negative. This also applies to non-reimbursable expenses exported as debit card transactions. Because QuickBooks Desktop doesn't support debit cards, transactions export as a non-reimbursable check, which must have a positive total amount. diff --git a/docs/articles/new-expensify/connections/quickbooks-desktop/QuickBooks-Desktop-Troubleshooting.md b/docs/articles/new-expensify/connections/quickbooks-desktop/QuickBooks-Desktop-Troubleshooting.md new file mode 100644 index 000000000000..67cf43373ffd --- /dev/null +++ b/docs/articles/new-expensify/connections/quickbooks-desktop/QuickBooks-Desktop-Troubleshooting.md @@ -0,0 +1,125 @@ +--- +title: QuickBooks Desktop troubleshooting +description: Resolve common QuickBooks Desktop integration issues with Expensify, including Web Connector, authentication, import, and export errors. +order: 3 +--- + +This article provides step-by-step solutions for common QuickBooks Desktop issues encountered when syncing with Expensify. Follow these troubleshooting steps to quickly address and resolve connectivity, authentication, import, and export problems. + +--- + +# The Web Connector cannot be reached + +These errors usually indicate a connection issue between Expensify and QuickBooks. + +## How to resolve + +1. Ensure QuickBooks Desktop and the Web Connector are running. +2. Install the Web Connector in the same location as QuickBooks (local desktop or remote server). + +If the error persists: + +1. Completely close the Web Connector (use Task Manager if needed). +2. Right-click the Web Connector icon and select **Run as administrator**. +3. Sync your Expensify workspace again. + +If issues continue: + +1. Quit and reopen QuickBooks Desktop. +2. In Expensify, go to **Settings > Workspaces**. +3. Select your workspace connected to QuickBooks Desktop. +4. Click **Accounting**. +5. Click the three vertical dots next to **QuickBooks Desktop**. +6. Click **Sync now**. +7. If unresolved, reinstall the Web Connector using the provided link. + +--- + +# Connection or authentication issues + +These errors usually indicate a credential issue. + +## How to resolve + +1. Ensure QuickBooks Desktop is open with the correct company file. +2. Ensure the QuickBooks Web Connector is open and online. +3. Close any open dialogue boxes in QuickBooks Desktop and retry syncing or exporting. +4. Check permissions: log in to QuickBooks Desktop as Admin (single-user mode). +5. Go to **Edit > Preferences > Integrated Applications > Company Preferences**. + +![Company Preferences](https://help.expensify.com/assets/images/quickbooks-desktop-company-preferences.png){:width="100%"} + +6. Select the Web Connector and click **Properties**. + +![Web Connector Properties](https://help.expensify.com/assets/images/quickbooks-desktop-access-rights.png){:width="100%"} + +7. Check **Allow this application to login automatically** and click **OK**. +8. Close all QuickBooks windows. + +If unresolved, contact Concierge with: + +- QuickBooks Desktop version. +- Location of QuickBooks and company file (local or remote). +- Location of Web Connector (local or remote). +- Provider of remote environment (if applicable, e.g., RightNetworks). + +--- + +# Import issues or missing categories/tags + +These issues indicate the integration needs updating or QuickBooks version incompatibility. + +## How to resolve + +1. Re-sync the connection from **Workspace Accounting** settings. +2. Verify configuration in QuickBooks. Expensify imports chart of accounts as categories or export account options, and imports projects, customers, and tags as tags. + +If unresolved, contact Concierge with details and QuickBooks screenshots. + +--- + +# Export or "can't find category/class/location/account" issues + +These errors usually generate a system message in Workspace Chat indicating the issue. + +## How to resolve + +1. Re-sync the connection from **Workspace Accounting** settings. +2. Re-apply coding to expenses and re-export reports. +3. Verify your QuickBooks Desktop version supports the selected export option ([check compatibility](https://quickbooks.intuit.com/desktop/)). + +If unresolved, contact Concierge with Report ID, context, and Expensify error screenshot. + +--- + +# “Oops!” error when syncing or exporting + +These errors can often be temporary or false alarms. + +## How to resolve + +1. Check if the sync/export was successful. +2. Retry syncing or exporting if unsuccessful. + +If persistent, download QuickBooks Desktop logs via Web Connector (**View Logs**) and contact Concierge. + +{% include info.html %} +If using a remote server (e.g., RightNetworks), contact their support for logs. +{% include end-info.html %} + +--- + +# Reports not exporting to QuickBooks Desktop + +Usually caused by the Web Connector or QuickBooks company file being closed during export. + +## How to resolve + +1. Ensure the Web Connector and QuickBooks Desktop company file are open. +2. In Web Connector, verify **Last Status** is "Ok". + +![Web Connector Status](https://help.expensify.com/assets/images/quickbooks-desktop-web-connector.png){:width="100%"} + +3. Check Workspace Chat in Expensify to confirm successful export. + +If unresolved, contact Concierge with Expensify Report ID and Web Connector screenshot. diff --git a/docs/articles/new-expensify/expenses-&-payments/create-per-diem-expense.md b/docs/articles/new-expensify/expenses-&-payments/Create-Per-Diem-expenses.md similarity index 62% rename from docs/articles/new-expensify/expenses-&-payments/create-per-diem-expense.md rename to docs/articles/new-expensify/expenses-&-payments/Create-Per-Diem-expenses.md index 2a0677969417..9b1174cffb9e 100644 --- a/docs/articles/new-expensify/expenses-&-payments/create-per-diem-expense.md +++ b/docs/articles/new-expensify/expenses-&-payments/Create-Per-Diem-expenses.md @@ -1,46 +1,9 @@ --- -title: Configure and submit Per Diem expenses +title: How to create a Per Diem expense description: Learn how to create and submit a Per Diem expense, including selecting a workspace, destination, time details, and sub-rates. ---
-# Configuring Per Diem in a workspace - -Per Diem is available as a feature under the **Spend** section within **More Features** in the workspace settings. Once enabled, it will appear as a dedicated menu item in the workspace settings LHN. - -## Uploading and exporting Per Diem rates - -Admins can manage Per Diem rates by uploading or exporting data. - -- To upload rates, use the **Import spreadsheet** option. -- To download existing rates, use the **Download CSV** option. - -Both options are accessible from the **three-dot menu** in the page header. - -## Editing or deleting Per Diem rates - -Each Per Diem rate is listed as an individual line item. Admins can: - -- Select a **single** rate or **multiple** rates. -- Edit a rate by clicking on it and adjusting the details. -- Delete rates using the **"X selected" drop-down menu**. - -## Setting the default Per Diem category - -Admins can assign a default category to Per Diem expenses: - -1. Click the **Settings** button in the top-right corner. -2. In the right-hand panel, select **Default category**. -3. Choose from the available categories. - -# FAQ - -## Why don’t I see the Per Diem option when submitting an expense? -The Per Diem option is only available if you are a member of a workspace with Per Diem enabled. If you are submitting an expense outside a workspace (such as in a group chat or DM), the option will not appear. - -## Can I bulk-edit or delete Per Diem rates? -Yes, you can select multiple rates at once and apply bulk actions such as editing or deleting. - # How to create a Per Diem expense If your workspace has **Per Diem** enabled, you can create a Per Diem expense directly from the **Submit Expense** flow. Follow the steps below to complete the process. diff --git a/docs/articles/new-expensify/workspaces/Require-tags-and-categories-for-expenses.md b/docs/articles/new-expensify/workspaces/Require-tags-and-categories-for-expenses.md index f2fd6970f5af..ebeec8f609c8 100644 --- a/docs/articles/new-expensify/workspaces/Require-tags-and-categories-for-expenses.md +++ b/docs/articles/new-expensify/workspaces/Require-tags-and-categories-for-expenses.md @@ -1,41 +1,46 @@ --- -title: Require tags and categories for expenses -description: Make tags and/or categories required for all expenses +title: Require Tags and Categories for Expenses +description: Learn how to make Tags and Categories mandatory for all expenses in a Workspace. --- -
- -To require workspace members to add tags and/or categories to their expenses, - -{% include selector.html values="desktop, mobile" %} - -{% include option.html value="desktop" %} -1. Click your profile image or icon in the bottom left menu. -2. Scroll down and click **Workspaces** in the left menu. -3. Select a workspace. -4. Click **Tags** or **Categories** in the left menu. -5. Click **Settings** at the top right of the page. -6. Enable the “Members must tag/categorize all expenses" toggle. -7. If desired, repeat steps 4-6 for tags or categories (whichever you haven’t done yet). -{% include end-option.html %} - -{% include option.html value="mobile" %} -1. Tap your profile image or icon in the bottom menu. -2. Tap **Workspaces**. -3. Select a workspace. + +To ensure expenses are properly categorized, you can require Workspace members to add tags and categories before submitting them. This guide walks you through enabling this setting on both desktop and mobile and managing default spend categories for smarter expense tracking. + +# Require Tags or Categories for Workspace Expenses + +**Desktop:** +1. Click **Settings** in the bottom left menu. +2. Scroll down and click **Workspaces**. +3. Select a Workspace. +4. Click **Tags** or **Categories**. +5. Click **Settings** at the top right. +6. Enable the **“Members must tag or categorize all expenses”** toggle. +7. If needed, repeat steps 4-6 for the other option (tags or categories). + +**Mobile:** +1. Tap **Settings** in the bottom menu. +2. Tap **Workspaces**. +3. Select a Workspace. 4. Tap **Tags** or **Categories**. -5. Tap **Settings** at the top right of the page. -6. Enable the “Members must tag/categorize all expenses" toggle. -7. If desired, repeat steps 4-6 for tags or categories (whichever you haven’t done yet). -{% include end-option.html %} +5. Tap **Settings** at the top right. +6. Enable the **“Members must tag or categorize all expenses”** toggle. +7. If needed, repeat steps 4-6 for the other option (tags or categories). -{% include end-selector.html %} +![Workspace Categories Setting with Required Toggle Highlighted]({{site.url}}/assets/images/Workspace_category_toggle.png){:width="100%"} + +Once enabled, the **Tag** or **Category** field will be marked as **required** on all expenses. + +> **Note:** If Tags or Categories are required, expenses can still be submitted without them. However, the submitter and approver will see an orange dot on the expense, indicating that the required Tag or Category is missing. + +--- -![In the Workspace, Categories setting, the right-hand panel is open and the toggle to require categories on expenses is highlighted.]({{site.url}}/assets/images/Workspace_category_toggle.png){:width="100%"} - -This will highlight the tag and/or category field as required on all expenses. +# Default Spend Categories +Expensify learns how you categorize certain merchants over time and automatically applies that category to future expenses from the same merchant. You can always change the category, and Expensify will learn your corrections over time. -{% include info.html %} -Expenses will still be able to be submitted without a tag and/or category even if they are set as required. The submitter and approver will see an orange dot on the expense details alerting them that the tag/category is missing. -{% include end-info.html %} +## Manage Default Spend Categories +1. Click **Settings** in the bottom menu. +2. Click **Workspaces**. +3. Select a Workspace. +4. Click **Categories**. +5. Click **Settings** at the top right. +6. Click on any of the default categories and select one of your categories from there. -
diff --git a/docs/new-expensify/hubs/connections/quickbooks-desktop.html b/docs/new-expensify/hubs/connections/quickbooks-desktop.html new file mode 100644 index 000000000000..86641ee60b7d --- /dev/null +++ b/docs/new-expensify/hubs/connections/quickbooks-desktop.html @@ -0,0 +1,5 @@ +--- +layout: default +--- + +{% include section.html %} diff --git a/docs/redirects.csv b/docs/redirects.csv index 01cc3cda36c7..4ffa6334f6e9 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -639,6 +639,7 @@ https://help.expensify.com/articles/expensify-classic/travel/Approve-travel-expe https://help.expensify.com/articles/expensify-classic/travel/Book-with-Expensify-Travel.md,https://help.expensify.com/articles/new-expensify/travel/Book-with-Expensify-Travel https://help.expensify.com/articles/expensify-classic/travel/Configure-travel-policy-and-preferences.md,https://help.expensify.com/articles/new-expensify/travel/Configure-travel-policy-and-preferences https://help.expensify.com/articles/expensify-classic/travel/Track-Travel-Analytics.md,https://help.expensify.com/articles/new-expensify/travel/Track-Travel-Analytics +https://help.expensify.com/articles/new-expensify/expenses-&-payments/create-per-diem-expense,https://help.expensify.com/articles/new-expensify/expenses-&-payments/Create-Per-Diem-expense https://help.expensify.com/articles/expensify-classic/connections/ADP,https://help.expensify.com/articles/expensify-classic/connections/Connect-to-ADP https://help.expensify.com/articles/new-expensify/connect-credit-cards/company-cards/Commercial-feeds,https://help.expensify.com/articles/new-expensify/connect-credit-cards/Commercial-feeds https://help.expensify.com/articles/new-expensify/connect-credit-cards/company-cards/Company-Card-Settings,https://help.expensify.com/articles/new-expensify/connect-credit-cards/Company-Card-Settings @@ -659,3 +660,4 @@ https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments https://help.expensify.com/articles/expensify-classic/expenses/Add-Invoices-in-Bulk,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Send-and-Pay-Invoices https://help.expensify.com/articles/expensify-classic/expenses/Send-and-Receive-Payment-for-Invoices,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Send-and-Pay-Invoices https://help.expensify.com/articles/expensify-classic/expenses/Create-Expense-Rules,https://help.expensify.com/articles/expensify-classic/expenses/Expense-Rules +https://help.expensify.com/articles/expensify-classic/expensify-card/Statements,https://help.expensify.com/articles/expensify-classic/expensify-card/Expensify-Card-Statements diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index d3f4b3c9f014..8a63ead6c69e 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -44,7 +44,7 @@ CFBundleVersion - 9.1.9.2 + 9.1.9.6 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 8a54dd93f46b..ed5e0ecd5508 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9.1.9.2 + 9.1.9.6 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 389d98f59290..8ee2634c68f2 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -13,7 +13,7 @@ CFBundleShortVersionString 9.1.9 CFBundleVersion - 9.1.9.2 + 9.1.9.6 NSExtension NSExtensionPointIdentifier diff --git a/package-lock.json b/package-lock.json index ae4309c11311..8d50253a07e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.1.9-2", + "version": "9.1.9-6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.1.9-2", + "version": "9.1.9-6", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index af3ebb966980..2c49a32f6883 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.1.9-2", + "version": "9.1.9-6", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", diff --git a/patches/@react-navigation+core+6.4.11+004+side-pane.patch b/patches/@react-navigation+core+6.4.11+004+side-pane.patch deleted file mode 100644 index 995c37eedd04..000000000000 --- a/patches/@react-navigation+core+6.4.11+004+side-pane.patch +++ /dev/null @@ -1,92 +0,0 @@ -diff --git a/node_modules/@react-navigation/core/lib/module/useDescriptors.js b/node_modules/@react-navigation/core/lib/module/useDescriptors.js -index 76fdab1..75f315c 100644 ---- a/node_modules/@react-navigation/core/lib/module/useDescriptors.js -+++ b/node_modules/@react-navigation/core/lib/module/useDescriptors.js -@@ -112,6 +112,19 @@ export default function useDescriptors(_ref, convertCustomScreenOptions) { - } - return o; - }); -+ const SidePane = customOptions.sidePane; -+ let element = /*#__PURE__*/React.createElement(React.Fragment, { -+ children: [/*#__PURE__*/React.createElement(SceneView, { -+ navigation: navigation, -+ route: route, -+ screen: screen, -+ routeState: state.routes[i].state, -+ getState: getState, -+ setState: setState, -+ options: customOptions, -+ clearOptions: clearOptions -+ }), SidePane && /*#__PURE__*/React.createElement(SidePane, {})] -+ }); - acc[route.key] = { - route, - // @ts-expect-error: it's missing action helpers, fix later -@@ -123,17 +136,10 @@ export default function useDescriptors(_ref, convertCustomScreenOptions) { - }, /*#__PURE__*/React.createElement(NavigationContext.Provider, { - value: navigation - }, /*#__PURE__*/React.createElement(NavigationRouteContext.Provider, { -- value: route -- }, /*#__PURE__*/React.createElement(SceneView, { -- navigation: navigation, -- route: route, -- screen: screen, -- routeState: state.routes[i].state, -- getState: getState, -- setState: setState, -- options: mergedOptions, -- clearOptions: clearOptions -- })))); -+ value: route, -+ children: element -+ }, -+ ))); - }, - options: mergedOptions - }; -diff --git a/node_modules/@react-navigation/core/src/useDescriptors.tsx b/node_modules/@react-navigation/core/src/useDescriptors.tsx -index 2e4ee0f..11ece43 100644 ---- a/node_modules/@react-navigation/core/src/useDescriptors.tsx -+++ b/node_modules/@react-navigation/core/src/useDescriptors.tsx -@@ -238,6 +238,23 @@ export default function useDescriptors< - return o; - }); - -+ const SidePane = (customOptions as any).sidePane; -+ let element = ( -+ <> -+ -+ {SidePane && } -+ -+ ); -+ - acc[route.key] = { - route, - // @ts-expect-error: it's missing action helpers, fix later -@@ -247,16 +264,7 @@ export default function useDescriptors< - - - -- -+ {element} - - - diff --git a/src/App.tsx b/src/App.tsx index f3d37fe87c0b..8dd2631a6b7d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -42,10 +42,17 @@ import type {Route} from './ROUTES'; import './setup/backgroundTask'; import {SplashScreenStateContextProvider} from './SplashScreenStateContext'; -/** Values passed to our top-level React Native component by HybridApp. Will always be undefined in "pure" NewDot builds. */ +/** + * Properties passed to the top-level React Native component by HybridApp. + * These will always be `undefined` in "pure" NewDot builds. + */ type AppProps = { - /** URL containing all necessary data to run React Native app (e.g. login data) */ + /** The URL specifying the initial navigation destination when the app opens */ url?: Route; + /** Serialized configuration data required to initialize the React Native app (e.g. authentication details) */ + hybridAppSettings?: string; + /** A timestamp indicating when the initial properties were last updated, used to detect changes */ + timestamp?: string; }; LogBox.ignoreLogs([ @@ -61,14 +68,18 @@ const fill = {flex: 1}; const StrictModeWrapper = CONFIG.USE_REACT_STRICT_MODE_IN_DEV ? React.StrictMode : ({children}: {children: React.ReactElement}) => children; -function App({url}: AppProps) { +function App({url, hybridAppSettings, timestamp}: AppProps) { useDefaultDragAndDrop(); OnyxUpdateManager(); return ( - + button.\n' + + '1. Click the green *+* button.\n' + '2. Choose *Create expense*.\n' + '3. Enter an amount or scan a receipt.\n' + '4. Add your reimburser to the request.\n' + @@ -179,7 +179,7 @@ const combinedTrackSubmitOnboardingEmployerOrSubmitMessage: OnboardingMessage = '\n' + 'Here’s how to submit an expense:\n' + '\n' + - '1. Press the button.\n' + + '1. Click the green *+* button.\n' + '2. Choose *Create expense*.\n' + '3. Enter an amount or scan a receipt.\n' + '4. Add your reimburser to the request.\n' + @@ -203,7 +203,7 @@ const onboardingPersonalSpendMessage: OnboardingMessage = { '\n' + 'Here’s how to track an expense:\n' + '\n' + - '1. Press the button.\n' + + '1. Click the green *+* button.\n' + '2. Choose *Create expense*.\n' + '3. Enter an amount or scan a receipt.\n' + '4. Choose your *personal* space.\n' + @@ -226,7 +226,7 @@ const combinedTrackSubmitOnboardingPersonalSpendMessage: OnboardingMessage = { '\n' + 'Here’s how to track an expense:\n' + '\n' + - '1. Press the button.\n' + + '1. Click the green *+* button.\n' + '2. Choose *Create expense*.\n' + '3. Enter an amount or scan a receipt.\n' + '4. Choose your *personal* space.\n' + @@ -1062,6 +1062,7 @@ const CONST = { ADMIN_DOMAINS_URL: 'admin_domains', INBOX: 'inbox', POLICY_CONNECTIONS_URL: (policyID: string) => `policy?param={"policyID":"${policyID}"}#connections`, + SIGN_OUT: 'signout', }, EXPENSIFY_POLICY_DOMAIN, @@ -1463,6 +1464,7 @@ const CONST = { USE_DEBOUNCED_STATE_DELAY: 300, LIST_SCROLLING_DEBOUNCE_TIME: 200, PUSHER_PING_PONG: 'pusher_ping_pong', + LOCATION_UPDATE_INTERVAL: 5000, }, PRIORITY_MODE: { GSD: 'gsd', @@ -1503,6 +1505,10 @@ const CONST = { DRAFT: 'draft', BACKUP: 'backup', }, + LIABILITY_TYPE: { + RESTRICT: 'corporate', + ALLOW: 'personal', + }, }, MCC_GROUPS: { @@ -3263,7 +3269,7 @@ const CONST = { EMOJI_NAME: /:[\p{L}0-9_+-]+:/gu, EMOJI_SUGGESTIONS: /:[\p{L}0-9_+-]{1,40}$/u, AFTER_FIRST_LINE_BREAK: /\n.*/g, - LINE_BREAK: /\r\n|\r|\n/g, + LINE_BREAK: /\r\n|\r|\n|\u2028/g, CODE_2FA: /^\d{6}$/, ATTACHMENT_ID: /chat-attachments\/(\d+)/, HAS_COLON_ONLY_AT_THE_BEGINNING: /^:[^:]+$/, @@ -5331,7 +5337,7 @@ const CONST = { '\n' + 'Here’s how to start a chat:\n' + '\n' + - '1. Press the button.\n' + + '1. Click the green *+* button.\n' + '2. Choose *Start chat*.\n' + '3. Enter emails or phone numbers.\n' + '\n' + @@ -5348,7 +5354,7 @@ const CONST = { '\n' + 'Here’s how to request money:\n' + '\n' + - '1. Press the button.\n' + + '1. Click the green *+* button.\n' + '2. Choose *Start chat*.\n' + '3. Enter any email, SMS, or name of who you want to split with.\n' + '4. From within the chat, click the *+* button on the message bar, and click *Split expense*.\n' + @@ -5382,7 +5388,7 @@ const CONST = { '\n' + 'Here’s how to submit an expense:\n' + '\n' + - '1. Press the button.\n' + + '1. Click the green *+* button.\n' + '2. Choose *Create expense*.\n' + '3. Enter an amount or scan a receipt.\n' + '4. Add your reimburser to the request.\n' + @@ -6696,11 +6702,6 @@ const CONST = { }, }, - HYBRID_APP: { - REORDERING_REACT_NATIVE_ACTIVITY_TO_FRONT: 'reorderingReactNativeActivityToFront', - SINGLE_NEW_DOT_ENTRY: 'singleNewDotEntry', - }, - MIGRATED_USER_WELCOME_MODAL: 'migratedUserWelcomeModal', BASE_LIST_ITEM_TEST_ID: 'base-list-item-', diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index 72cbcee20e34..2572883b1849 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -480,7 +480,7 @@ const ONYXKEYS = { TRAVEL_PROVISIONING: 'travelProvisioning', /** Stores the information about the state of side panel */ - NVP_SIDE_PANE: 'nvp_sidePaneExpanded', + NVP_SIDE_PANE: 'nvp_sidePane', /** Collection Keys */ COLLECTION: { diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 09fe7c4abcfd..6d197d350cb0 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -151,7 +151,7 @@ const ROUTES = { SETTINGS_PRIORITY_MODE: 'settings/preferences/priority-mode', SETTINGS_LANGUAGE: 'settings/preferences/language', SETTINGS_THEME: 'settings/preferences/theme', - SETTINGS_WORKSPACES: 'settings/workspaces', + SETTINGS_WORKSPACES: {route: 'settings/workspaces', getRoute: (backTo?: string) => getUrlWithBackToParam('settings/workspaces', backTo)}, SETTINGS_SECURITY: 'settings/security', SETTINGS_CLOSE: 'settings/security/closeAccount', SETTINGS_ADD_DELEGATE: 'settings/security/delegate', diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx index 87607b0cae7b..4373dae8ac73 100644 --- a/src/components/AttachmentModal.tsx +++ b/src/components/AttachmentModal.tsx @@ -514,7 +514,6 @@ function AttachmentModal({ } }} propagateSwipe - swipeDirection={shouldUseNarrowLayout ? CONST.SWIPE_DIRECTION.RIGHT : undefined} initialFocus={() => { if (!submitRef.current) { return false; diff --git a/src/components/BookTravelButton.tsx b/src/components/BookTravelButton.tsx index eb4e04fefb80..83d41ed4a7a8 100644 --- a/src/components/BookTravelButton.tsx +++ b/src/components/BookTravelButton.tsx @@ -35,8 +35,9 @@ function BookTravelButton({text}: BookTravelButtonProps) { const policy = usePolicy(activePolicyID); const [errorMessage, setErrorMessage] = useState(''); const [travelSettings] = useOnyx(ONYXKEYS.NVP_TRAVEL_SETTINGS); - const [account] = useOnyx(ONYXKEYS.ACCOUNT); - const primaryLogin = account?.primaryLogin; + const [primaryLogin] = useOnyx(ONYXKEYS.ACCOUNT, {selector: (account) => account?.primaryLogin}); + const [sessionEmail] = useOnyx(ONYXKEYS.SESSION, {selector: (session) => session?.email}); + const primaryContactMethod = primaryLogin ?? sessionEmail ?? ''; const {setRootStatusBarEnabled} = useContext(CustomStatusBarAndBackgroundContext); // Flag indicating whether NewDot was launched exclusively for Travel, @@ -47,7 +48,7 @@ function BookTravelButton({text}: BookTravelButtonProps) { setErrorMessage(''); // The primary login of the user is where Spotnana sends the emails with booking confirmations, itinerary etc. It can't be a phone number. - if (!primaryLogin || Str.isSMSLogin(primaryLogin)) { + if (!primaryContactMethod || Str.isSMSLogin(primaryContactMethod)) { setErrorMessage(translate('travel.phoneError')); return; } @@ -75,7 +76,7 @@ function BookTravelButton({text}: BookTravelButtonProps) { // Close NewDot if it was opened only for Travel, as its purpose is now fulfilled. Log.info('[HybridApp] Returning to OldDot after opening TravelDot'); - NativeModules.HybridAppModule.closeReactNativeApp(false, false); + NativeModules.HybridAppModule.closeReactNativeApp({shouldSignOut: false, shouldSetNVP: false}); setRootStatusBarEnabled(false); }) ?.catch(() => { @@ -97,7 +98,7 @@ function BookTravelButton({text}: BookTravelButtonProps) { Navigation.navigate(ROUTES.TRAVEL_DOMAIN_SELECTOR); } } - }, [policy, wasNewDotLaunchedJustForTravel, travelSettings, translate, primaryLogin, setRootStatusBarEnabled]); + }, [policy, wasNewDotLaunchedJustForTravel, travelSettings, translate, primaryContactMethod, setRootStatusBarEnabled]); return ( <> diff --git a/src/components/ConfirmContent.tsx b/src/components/ConfirmContent.tsx index 3bfb5a146d05..ec2c6d57c21f 100644 --- a/src/components/ConfirmContent.tsx +++ b/src/components/ConfirmContent.tsx @@ -98,6 +98,9 @@ type ConfirmContentProps = { /** Whether the modal is visibile */ isVisible: boolean; + + /** Whether the confirm button is loading */ + isConfirmLoading?: boolean; }; function ConfirmContent({ @@ -127,6 +130,7 @@ function ConfirmContent({ titleContainerStyles, shouldReverseStackedButtons = false, isVisible, + isConfirmLoading, }: ConfirmContentProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); @@ -209,6 +213,7 @@ function ConfirmContent({ text={confirmText || translate('common.yes')} accessibilityLabel={confirmText || translate('common.yes')} isDisabled={isOffline && shouldDisableConfirmButtonWhenOffline} + isLoading={isConfirmLoading} /> {shouldShowCancelButton && !shouldReverseStackedButtons && (