From 32d135582c6c20e3fa5ab5f0e88ff9a47c9c8532 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Thu, 14 Sep 2023 16:43:09 +0200 Subject: [PATCH 01/55] delegate category selection to parent --- .../CategoryPicker/categoryPickerPropTypes.js | 16 ++++------ src/components/CategoryPicker/index.js | 30 ++++--------------- src/pages/iou/MoneyRequestCategoryPage.js | 27 +++++++++++++++-- 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/components/CategoryPicker/categoryPickerPropTypes.js b/src/components/CategoryPicker/categoryPickerPropTypes.js index b8e24c199a73..6f2800a5d98f 100644 --- a/src/components/CategoryPicker/categoryPickerPropTypes.js +++ b/src/components/CategoryPicker/categoryPickerPropTypes.js @@ -2,14 +2,11 @@ import PropTypes from 'prop-types'; import categoryPropTypes from '../categoryPropTypes'; const propTypes = { - /** The report ID of the IOU */ - reportID: PropTypes.string.isRequired, - /** The policyID we are getting categories for */ policyID: PropTypes.string, - /** The type of IOU report, i.e. bill, request, send */ - iouType: PropTypes.string.isRequired, + /** The selected category of an expense */ + selectedCategory: PropTypes.string, /* Onyx Props */ /** Collection of categories attached to a policy */ @@ -19,18 +16,15 @@ const propTypes = { /** Collection of recently used categories attached to a policy */ policyRecentlyUsedCategories: PropTypes.arrayOf(PropTypes.string), - /* Onyx Props */ - /** Holds data related to Money Request view state, rather than the underlying Money Request data. */ - iou: PropTypes.shape({ - category: PropTypes.string.isRequired, - }), + /** Callback to fire when a category is pressed */ + onSubmit: PropTypes.func.isRequired, }; const defaultProps = { policyID: '', + selectedCategory: '', policyCategories: {}, policyRecentlyUsedCategories: [], - iou: {}, }; export {propTypes, defaultProps}; diff --git a/src/components/CategoryPicker/index.js b/src/components/CategoryPicker/index.js index 91c7e82e7887..66ac0bf14d4a 100644 --- a/src/components/CategoryPicker/index.js +++ b/src/components/CategoryPicker/index.js @@ -5,15 +5,12 @@ import lodashGet from 'lodash/get'; import ONYXKEYS from '../../ONYXKEYS'; import {propTypes, defaultProps} from './categoryPickerPropTypes'; import styles from '../../styles/styles'; -import Navigation from '../../libs/Navigation/Navigation'; -import ROUTES from '../../ROUTES'; import CONST from '../../CONST'; -import * as IOU from '../../libs/actions/IOU'; import * as OptionsListUtils from '../../libs/OptionsListUtils'; import OptionsSelector from '../OptionsSelector'; import useLocalize from '../../hooks/useLocalize'; -function CategoryPicker({policyCategories, reportID, iouType, iou, policyRecentlyUsedCategories}) { +function CategoryPicker({selectedCategory, policyCategories, policyRecentlyUsedCategories, onSubmit}) { const {translate} = useLocalize(); const [searchValue, setSearchValue] = useState(''); @@ -21,18 +18,18 @@ function CategoryPicker({policyCategories, reportID, iouType, iou, policyRecentl const isCategoriesCountBelowThreshold = policyCategoriesCount < CONST.CATEGORY_LIST_THRESHOLD; const selectedOptions = useMemo(() => { - if (!iou.category) { + if (!selectedCategory) { return []; } return [ { - name: iou.category, + name: selectedCategory, enabled: true, accountID: null, }, ]; - }, [iou.category]); + }, [selectedCategory]); const initialFocusedIndex = useMemo(() => { if (isCategoriesCountBelowThreshold && selectedOptions.length > 0) { @@ -53,20 +50,6 @@ function CategoryPicker({policyCategories, reportID, iouType, iou, policyRecentl const headerMessage = OptionsListUtils.getHeaderMessage(lodashGet(sections, '[0].data.length', 0) > 0, false, searchValue); const shouldShowTextInput = !isCategoriesCountBelowThreshold; - const navigateBack = () => { - Navigation.goBack(ROUTES.getMoneyRequestConfirmationRoute(iouType, reportID)); - }; - - const updateCategory = (category) => { - if (category.searchText === iou.category) { - IOU.resetMoneyRequestCategory(); - } else { - IOU.setMoneyRequestCategory(category.searchText); - } - - navigateBack(); - }; - return ( ); } @@ -97,7 +80,4 @@ export default withOnyx({ policyRecentlyUsedCategories: { key: ({policyID}) => `${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${policyID}`, }, - iou: { - key: ONYXKEYS.IOU, - }, })(CategoryPicker); diff --git a/src/pages/iou/MoneyRequestCategoryPage.js b/src/pages/iou/MoneyRequestCategoryPage.js index 80b88a762609..adba5755496d 100644 --- a/src/pages/iou/MoneyRequestCategoryPage.js +++ b/src/pages/iou/MoneyRequestCategoryPage.js @@ -10,6 +10,7 @@ import HeaderWithBackButton from '../../components/HeaderWithBackButton'; import CategoryPicker from '../../components/CategoryPicker'; import ONYXKEYS from '../../ONYXKEYS'; import reportPropTypes from '../reportPropTypes'; +import * as IOU from '../../libs/actions/IOU'; const propTypes = { /** Navigation route context info provided by react navigation */ @@ -26,13 +27,20 @@ const propTypes = { /** The report currently being used */ report: reportPropTypes, + + /* Onyx Props */ + /** Holds data related to Money Request view state, rather than the underlying Money Request data. */ + iou: PropTypes.shape({ + category: PropTypes.string.isRequired, + }), }; const defaultProps = { report: {}, + iou: {}, }; -function MoneyRequestCategoryPage({route, report}) { +function MoneyRequestCategoryPage({route, report, iou}) { const {translate} = useLocalize(); const reportID = lodashGet(route, 'params.reportID', ''); @@ -42,6 +50,16 @@ function MoneyRequestCategoryPage({route, report}) { Navigation.goBack(ROUTES.getMoneyRequestConfirmationRoute(iouType, reportID)); }; + const updateCategory = (category) => { + if (category.searchText === iou.category) { + IOU.resetMoneyRequestCategory(); + } else { + IOU.setMoneyRequestCategory(category.searchText); + } + + Navigation.goBack(ROUTES.getMoneyRequestConfirmationRoute(iouType, reportID)); + }; + return ( ); @@ -69,4 +87,7 @@ export default withOnyx({ report: { key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT}${lodashGet(route, 'params.reportID', '')}`, }, + iou: { + key: ONYXKEYS.IOU, + }, })(MoneyRequestCategoryPage); From d7996869bf22815900c87a80f9ac9e68a1f27626 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Thu, 14 Sep 2023 16:44:05 +0200 Subject: [PATCH 02/55] implement edit request category page --- src/CONST.ts | 1 + src/pages/EditRequestCategoryPage.js | 49 ++++++++++++++++++++++++++++ src/pages/EditRequestPage.js | 26 ++++++++++++++- 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/pages/EditRequestCategoryPage.js diff --git a/src/CONST.ts b/src/CONST.ts index 1ef2f3e83246..7b6d1d1d36fb 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1349,6 +1349,7 @@ const CONST = { DATE: 'date', DESCRIPTION: 'description', MERCHANT: 'merchant', + CATEGORY: 'category', }, FOOTER: { EXPENSE_MANAGEMENT_URL: `${USE_EXPENSIFY_URL}/expense-management`, diff --git a/src/pages/EditRequestCategoryPage.js b/src/pages/EditRequestCategoryPage.js new file mode 100644 index 000000000000..ba94c2b40800 --- /dev/null +++ b/src/pages/EditRequestCategoryPage.js @@ -0,0 +1,49 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ScreenWrapper from '../components/ScreenWrapper'; +import HeaderWithBackButton from '../components/HeaderWithBackButton'; +import Navigation from '../libs/Navigation/Navigation'; +import useLocalize from '../hooks/useLocalize'; +import CategoryPicker from '../components/CategoryPicker'; + +const propTypes = { + /** Transaction default category value */ + defaultCategory: PropTypes.string.isRequired, + + /** The policyID we are getting categories for */ + policyID: PropTypes.string.isRequired, + + /** Callback to fire when the Save button is pressed */ + onSubmit: PropTypes.func.isRequired, +}; + +function EditRequestCategoryPage({defaultCategory, policyID, onSubmit}) { + const {translate} = useLocalize(); + + return ( + + + + + onSubmit({ + category: category.searchText, + }) + } + /> + + ); +} + +EditRequestCategoryPage.propTypes = propTypes; +EditRequestCategoryPage.displayName = 'EditRequestCategoryPage'; + +export default EditRequestCategoryPage; diff --git a/src/pages/EditRequestPage.js b/src/pages/EditRequestPage.js index 266515e29c2c..d4fc92c894d0 100644 --- a/src/pages/EditRequestPage.js +++ b/src/pages/EditRequestPage.js @@ -19,6 +19,7 @@ import reportPropTypes from './reportPropTypes'; import * as IOU from '../libs/actions/IOU'; import * as CurrencyUtils from '../libs/CurrencyUtils'; import FullPageNotFoundView from '../components/BlockingViews/FullPageNotFoundView'; +import EditRequestCategoryPage from './EditRequestCategoryPage'; const propTypes = { /** Route from navigation */ @@ -69,7 +70,13 @@ const defaultProps = { function EditRequestPage({report, route, parentReport, policy, session}) { const parentReportAction = ReportActionsUtils.getParentReportAction(report); const transaction = TransactionUtils.getLinkedTransaction(parentReportAction); - const {amount: transactionAmount, currency: transactionCurrency, comment: transactionDescription, merchant: transactionMerchant} = ReportUtils.getTransactionDetails(transaction); + const { + amount: transactionAmount, + currency: transactionCurrency, + comment: transactionDescription, + merchant: transactionMerchant, + category: transactionCategory, + } = ReportUtils.getTransactionDetails(transaction); const defaultCurrency = lodashGet(route, 'params.currency', '') || transactionCurrency; @@ -169,6 +176,23 @@ function EditRequestPage({report, route, parentReport, policy, session}) { ); } + if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.CATEGORY) { + return ( + { + let updatedCategory = transactionChanges.category; + // In case the same category has been selected, do reset of the category. + if (transactionCategory === updatedCategory) { + updatedCategory = ''; + } + editMoneyRequest({category: updatedCategory}); + }} + /> + ); + } + return ; } From da95354c9ad2a170f224a080e4651ef0a0ec2207 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Thu, 14 Sep 2023 16:46:25 +0200 Subject: [PATCH 03/55] preview and navigate to edit a category --- .../ReportActionItem/MoneyRequestView.js | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.js b/src/components/ReportActionItem/MoneyRequestView.js index a9264812b99d..7ad7dc0ce356 100644 --- a/src/components/ReportActionItem/MoneyRequestView.js +++ b/src/components/ReportActionItem/MoneyRequestView.js @@ -1,6 +1,7 @@ import React from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; +import _ from 'underscore'; import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; import reportPropTypes from '../../pages/reportPropTypes'; @@ -27,6 +28,7 @@ import Image from '../Image'; import ReportActionItemImage from './ReportActionItemImage'; import * as TransactionUtils from '../../libs/TransactionUtils'; import OfflineWithFeedback from '../OfflineWithFeedback'; +import categoryPropTypes from '../categoryPropTypes'; const propTypes = { /** The report currently being looked at */ @@ -35,6 +37,10 @@ const propTypes = { /** The expense report or iou report (only will have a value if this is a transaction thread) */ parentReport: iouReportPropTypes, + /* Onyx Props */ + /** Collection of categories attached to a policy */ + policyCategories: PropTypes.objectOf(categoryPropTypes), + /** The transaction associated with the transactionThread */ transaction: transactionPropTypes, @@ -46,6 +52,7 @@ const propTypes = { const defaultProps = { parentReport: {}, + policyCategories: {}, transaction: { amount: 0, currency: CONST.CURRENCY.USD, @@ -53,7 +60,7 @@ const defaultProps = { }, }; -function MoneyRequestView({report, parentReport, shouldShowHorizontalRule, transaction}) { +function MoneyRequestView({report, parentReport, policyCategories, shouldShowHorizontalRule, transaction}) { const {isSmallScreenWidth} = useWindowDimensions(); const {translate} = useLocalize(); @@ -65,6 +72,7 @@ function MoneyRequestView({report, parentReport, shouldShowHorizontalRule, trans currency: transactionCurrency, comment: transactionDescription, merchant: transactionMerchant, + category: transactionCategory, } = ReportUtils.getTransactionDetails(transaction); const isEmptyMerchant = transactionMerchant === '' || transactionMerchant === CONST.TRANSACTION.UNKNOWN_MERCHANT || transactionMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT; @@ -72,6 +80,7 @@ function MoneyRequestView({report, parentReport, shouldShowHorizontalRule, trans const isSettled = ReportUtils.isSettled(moneyRequestReport.reportID); const canEdit = ReportUtils.canEditMoneyRequest(parentReportAction); + const shouldShowCategory = !_.isEmpty(policyCategories) || !_.isEmpty(transactionCategory); let description = `${translate('iou.amount')} • ${translate('iou.cash')}`; if (isSettled) { @@ -165,6 +174,18 @@ function MoneyRequestView({report, parentReport, shouldShowHorizontalRule, trans subtitleTextStyle={styles.textLabelError} /> + {shouldShowCategory && ( + + Navigation.navigate(ROUTES.getEditRequestRoute(report.reportID, CONST.EDIT_REQUEST_FIELD.CATEGORY))} + /> + + )} {shouldShowHorizontalRule && } ); @@ -183,6 +204,9 @@ export default compose( policy: { key: ({report}) => `${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`, }, + policyCategories: { + key: ({report}) => `${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${report.policyID}`, + }, session: { key: ONYXKEYS.SESSION, }, From bfc59ba9dcf7275eb7cad57dac477d0576577190 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Thu, 14 Sep 2023 17:35:52 +0200 Subject: [PATCH 04/55] prepare api --- src/libs/TransactionUtils.js | 14 +++++++++++++- src/libs/actions/IOU.js | 13 +++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 4ca8b48d284e..73ba6a8116ef 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -141,6 +141,11 @@ function getUpdatedTransaction(transaction, transactionChanges, isFromExpenseRep shouldStopSmartscan = true; } + if (_.has(transactionChanges, 'category')) { + updatedTransaction.modifiedCategory = transactionChanges.category; + shouldStopSmartscan = true; + } + if (shouldStopSmartscan && _.has(transaction, 'receipt') && !_.isEmpty(transaction.receipt) && lodashGet(transaction, 'receipt.state') !== CONST.IOU.RECEIPT_STATE.OPEN) { updatedTransaction.receipt.state = CONST.IOU.RECEIPT_STATE.OPEN; } @@ -151,6 +156,7 @@ function getUpdatedTransaction(transaction, transactionChanges, isFromExpenseRep ...(_.has(transactionChanges, 'amount') && {amount: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), ...(_.has(transactionChanges, 'currency') && {currency: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), ...(_.has(transactionChanges, 'merchant') && {merchant: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), + ...(_.has(transactionChanges, 'category') && {category: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE}), }; return updatedTransaction; @@ -232,12 +238,18 @@ function getMerchant(transaction) { } /** - * Return the category from the transaction. This "category" field has no "modified" complement. + * Return the category from the transaction, return the modifiedCategory if present. * * @param {Object} transaction * @return {String} */ function getCategory(transaction) { + const modifiedCategory = lodashGet(transaction, 'modifiedCategory', null); + + if (!_.isNull(modifiedCategory)) { + return modifiedCategory; + } + return lodashGet(transaction, 'category', ''); } diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 8f18119203be..3e23bb596eee 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -1121,6 +1121,7 @@ function editMoneyRequest(transactionID, transactionThreadReportID, transactionC created: null, currency: null, merchant: null, + category: null, }, }, }, @@ -1156,6 +1157,18 @@ function editMoneyRequest(transactionID, transactionThreadReportID, transactionC }, ]; + // STEP 5: Use the modifiedCategory as a category on success + if (!_.isUndefined(updatedTransaction.modifiedCategory)) { + successData.push({ + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, + value: { + category: updatedTransaction.modifiedCategory, + modifiedCategory: null, + }, + }); + } + // STEP 6: Call the API endpoint const {created, amount, currency, comment, merchant, category} = ReportUtils.getTransactionDetails(updatedTransaction); API.write( From 7edcbbeff0207a614188090ef812cbfca1050938 Mon Sep 17 00:00:00 2001 From: Krishna Gupta Date: Fri, 15 Sep 2023 03:25:02 +0530 Subject: [PATCH 05/55] fix: autoFocus for payment input in safari. Signed-off-by: Krishna Gupta --- src/libs/Navigation/OnyxTabNavigator.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libs/Navigation/OnyxTabNavigator.js b/src/libs/Navigation/OnyxTabNavigator.js index dc68021bf515..56b820f5e05b 100644 --- a/src/libs/Navigation/OnyxTabNavigator.js +++ b/src/libs/Navigation/OnyxTabNavigator.js @@ -4,6 +4,8 @@ import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; import Tab from '../actions/Tab'; import ONYXKEYS from '../../ONYXKEYS'; +import * as Browser from '../Browser'; +import CONST from '../../CONST'; const propTypes = { /* ID of the tab component to be saved in onyx */ @@ -23,6 +25,10 @@ const defaultProps = { // eslint-disable-next-line rulesdir/no-inline-named-export export const TopTab = createMaterialTopTabNavigator(); +// Will set this for all platforms once issue below is fixed for native devices. +// https://github.com/Expensify/App/issues/27117 +const keyboardDismissModeProp = Browser.getBrowser() === CONST.BROWSER.SAFARI ? {keyboardDismissMode: 'none'} : {}; + // This takes all the same props as MaterialTopTabsNavigator: https://reactnavigation.org/docs/material-top-tab-navigator/#props, // except ID is now required, and it gets a `selectedTab` from Onyx function OnyxTabNavigator({id, selectedTab, children, ...rest}) { @@ -30,6 +36,8 @@ function OnyxTabNavigator({id, selectedTab, children, ...rest}) { Date: Fri, 15 Sep 2023 17:35:06 +0200 Subject: [PATCH 06/55] do not stop smart scan --- src/libs/TransactionUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 73ba6a8116ef..5fc6294aca91 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -143,7 +143,7 @@ function getUpdatedTransaction(transaction, transactionChanges, isFromExpenseRep if (_.has(transactionChanges, 'category')) { updatedTransaction.modifiedCategory = transactionChanges.category; - shouldStopSmartscan = true; + shouldStopSmartscan = false; } if (shouldStopSmartscan && _.has(transaction, 'receipt') && !_.isEmpty(transaction.receipt) && lodashGet(transaction, 'receipt.state') !== CONST.IOU.RECEIPT_STATE.OPEN) { From 636924f0928a253fd6a7efb4d271eba125afdcbc Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Fri, 15 Sep 2023 19:07:05 +0200 Subject: [PATCH 07/55] handle a selected category alone --- src/libs/OptionsListUtils.js | 12 ++++++++++++ tests/unit/OptionsListUtilsTest.js | 23 ++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 7629a1acc0a6..8027a30b34a1 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -666,6 +666,18 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt const numberOfCategories = _.size(categoriesValues); let indexOffset = 0; + if (numberOfCategories === 0 && selectedOptions.length > 0) { + categorySections.push({ + // "Selected" section + title: '', + shouldShow: false, + indexOffset, + data: getCategoryOptionTree(selectedOptions, true), + }); + + return categorySections; + } + if (!_.isEmpty(searchInputValue)) { const searchCategories = _.filter(categoriesValues, (category) => category.name.toLowerCase().includes(searchInputValue.toLowerCase())); diff --git a/tests/unit/OptionsListUtilsTest.js b/tests/unit/OptionsListUtilsTest.js index f1a251e4e433..ef90c767175e 100644 --- a/tests/unit/OptionsListUtilsTest.js +++ b/tests/unit/OptionsListUtilsTest.js @@ -660,6 +660,7 @@ describe('OptionsListUtils', () => { const selectedOptions = [ { name: 'Medical', + enabled: true, }, ]; const smallCategoriesList = { @@ -817,7 +818,7 @@ describe('OptionsListUtils', () => { keyForList: 'Medical', searchText: 'Medical', tooltipText: 'Medical', - isDisabled: true, + isDisabled: false, }, ], }, @@ -1000,6 +1001,23 @@ describe('OptionsListUtils', () => { data: [], }, ]; + const emptyCategoriesList = {}; + const emptySelectedResultList = [ + { + title: '', + shouldShow: false, + indexOffset: 0, + data: [ + { + text: 'Medical', + keyForList: 'Medical', + searchText: 'Medical', + tooltipText: 'Medical', + isDisabled: false, + }, + ], + }, + ]; const smallResult = OptionsListUtils.getNewChatOptions(REPORTS, PERSONAL_DETAILS, [], emptySearch, [], [], false, false, true, smallCategoriesList); expect(smallResult.categoryOptions).toStrictEqual(smallResultList); @@ -1054,6 +1072,9 @@ describe('OptionsListUtils', () => { recentlyUsedCategories, ); expect(largeWrongSearchResult.categoryOptions).toStrictEqual(largeWrongSearchResultList); + + const emptyResult = OptionsListUtils.getNewChatOptions(REPORTS, PERSONAL_DETAILS, [], search, selectedOptions, [], false, false, true, emptyCategoriesList); + expect(emptyResult.categoryOptions).toStrictEqual(emptySelectedResultList); }); it('getCategoryOptionTree()', () => { From ad08c251b2a62e4ce7566fcbf832860044d47609 Mon Sep 17 00:00:00 2001 From: Krishna Gupta Date: Sat, 16 Sep 2023 13:28:55 +0530 Subject: [PATCH 08/55] fix: removed check for safari only. Signed-off-by: Krishna Gupta --- src/libs/Navigation/OnyxTabNavigator.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/libs/Navigation/OnyxTabNavigator.js b/src/libs/Navigation/OnyxTabNavigator.js index 56b820f5e05b..2782054497b0 100644 --- a/src/libs/Navigation/OnyxTabNavigator.js +++ b/src/libs/Navigation/OnyxTabNavigator.js @@ -4,8 +4,6 @@ import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; import Tab from '../actions/Tab'; import ONYXKEYS from '../../ONYXKEYS'; -import * as Browser from '../Browser'; -import CONST from '../../CONST'; const propTypes = { /* ID of the tab component to be saved in onyx */ @@ -25,10 +23,6 @@ const defaultProps = { // eslint-disable-next-line rulesdir/no-inline-named-export export const TopTab = createMaterialTopTabNavigator(); -// Will set this for all platforms once issue below is fixed for native devices. -// https://github.com/Expensify/App/issues/27117 -const keyboardDismissModeProp = Browser.getBrowser() === CONST.BROWSER.SAFARI ? {keyboardDismissMode: 'none'} : {}; - // This takes all the same props as MaterialTopTabsNavigator: https://reactnavigation.org/docs/material-top-tab-navigator/#props, // except ID is now required, and it gets a `selectedTab` from Onyx function OnyxTabNavigator({id, selectedTab, children, ...rest}) { @@ -36,11 +30,10 @@ function OnyxTabNavigator({id, selectedTab, children, ...rest}) { { const state = event.data.state; From 812ea0568c93ef608a43f35013a0a9bef6eff8f5 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Mon, 18 Sep 2023 11:05:03 +0200 Subject: [PATCH 09/55] do not use modified category --- src/libs/TransactionUtils.js | 11 ++--------- src/libs/actions/IOU.js | 12 ------------ 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/src/libs/TransactionUtils.js b/src/libs/TransactionUtils.js index 5fc6294aca91..7e768e97b837 100644 --- a/src/libs/TransactionUtils.js +++ b/src/libs/TransactionUtils.js @@ -142,8 +142,7 @@ function getUpdatedTransaction(transaction, transactionChanges, isFromExpenseRep } if (_.has(transactionChanges, 'category')) { - updatedTransaction.modifiedCategory = transactionChanges.category; - shouldStopSmartscan = false; + updatedTransaction.category = transactionChanges.category; } if (shouldStopSmartscan && _.has(transaction, 'receipt') && !_.isEmpty(transaction.receipt) && lodashGet(transaction, 'receipt.state') !== CONST.IOU.RECEIPT_STATE.OPEN) { @@ -238,18 +237,12 @@ function getMerchant(transaction) { } /** - * Return the category from the transaction, return the modifiedCategory if present. + * Return the category from the transaction. This "category" field has no "modified" complement. * * @param {Object} transaction * @return {String} */ function getCategory(transaction) { - const modifiedCategory = lodashGet(transaction, 'modifiedCategory', null); - - if (!_.isNull(modifiedCategory)) { - return modifiedCategory; - } - return lodashGet(transaction, 'category', ''); } diff --git a/src/libs/actions/IOU.js b/src/libs/actions/IOU.js index 16722d4dc70b..9f1d67d1db1d 100644 --- a/src/libs/actions/IOU.js +++ b/src/libs/actions/IOU.js @@ -1160,18 +1160,6 @@ function editMoneyRequest(transactionID, transactionThreadReportID, transactionC }, ]; - // STEP 5: Use the modifiedCategory as a category on success - if (!_.isUndefined(updatedTransaction.modifiedCategory)) { - successData.push({ - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`, - value: { - category: updatedTransaction.modifiedCategory, - modifiedCategory: null, - }, - }); - } - // STEP 6: Call the API endpoint const {created, amount, currency, comment, merchant, category} = ReportUtils.getTransactionDetails(updatedTransaction); API.write( From 3dd7b5c14b2817594ef19f299b329262174ec61a Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Mon, 18 Sep 2023 15:11:26 +0200 Subject: [PATCH 10/55] create getRootParentReport helper --- src/libs/ReportUtils.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 9396ea921b61..7115de23d1a1 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1601,6 +1601,29 @@ function getParentReport(report) { return lodashGet(allReports, `${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`, {}); } +/** + * Returns the root parentReport if the given report is nested. + * Uses recursion to iterate any depth of nested reports. + * + * @param {Object} report + * @returns {Object} + */ +function getRootParentReport(report) { + if (!report) { + return {}; + } + + // Returns the founded root report, because it does not have a parentReportID + if (!report.parentReportID) { + return report; + } + + const parentReport = getReport(report.parentReportID); + + // Runs recursion to iterate a parent report + return getRootParentReport(parentReport); +} + /** * Get the title for a report. * @@ -3613,6 +3636,7 @@ export { isAllowedToComment, getBankAccountRoute, getParentReport, + getRootParentReport, getTaskParentReportActionIDInAssigneeReport, getReportPreviewMessage, getModifiedExpenseMessage, From d7b6b89b73d20413d809093843fa48941862921e Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Mon, 18 Sep 2023 15:12:17 +0200 Subject: [PATCH 11/55] improve conditions of MoneyRequestConfirmationList --- src/components/MoneyRequestConfirmationList.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index da98d324681e..d72860e78a48 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -191,13 +191,19 @@ function MoneyRequestConfirmationList(props) { const {unit, rate, currency} = props.mileageRate; const distance = lodashGet(transaction, 'routes.route0.distance', 0); const shouldCalculateDistanceAmount = props.isDistanceRequest && props.iouAmount === 0; - const shouldCategoryBeEditable = !_.isEmpty(props.policyCategories) && Permissions.canUseCategories(props.betas); + + // A flag for verifying that the current report is a sub-report of a workspace chat + const isPolicyExpenseChat = useMemo(() => ReportUtils.isPolicyExpenseChat(ReportUtils.getRootParentReport(ReportUtils.getReport(props.reportID))), [props.reportID]); + + // A flag for showing the categories field + const shouldShowCategories = isPolicyExpenseChat && Permissions.canUseCategories(props.betas) && !_.isEmpty(props.policyCategories); // Fetches the first tag list of the policy const tagListKey = _.first(_.keys(props.policyTags)); const tagList = lodashGet(props.policyTags, [tagListKey, 'tags'], []); const tagListName = lodashGet(props.policyTags, [tagListKey, 'name'], ''); - const canUseTags = Permissions.canUseTags(props.betas); + // A flag for showing the tags field + const shouldShowTags = isPolicyExpenseChat && Permissions.canUseTags(props.betas) && !_.isEmpty(tagList); const formattedAmount = CurrencyUtils.convertToDisplayString( shouldCalculateDistanceAmount ? DistanceRequestUtils.getDistanceRequestAmount(distance, unit, rate) : props.iouAmount, @@ -510,7 +516,7 @@ function MoneyRequestConfirmationList(props) { disabled={didConfirm || props.isReadOnly || !isTypeRequest} /> )} - {shouldCategoryBeEditable && ( + {shouldShowCategories && ( )} - {canUseTags && !!tagList && ( + {shouldShowTags && ( Date: Mon, 18 Sep 2023 15:14:09 +0200 Subject: [PATCH 12/55] improve conditions of MoneyRequestView --- .../ReportActionItem/MoneyRequestView.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.js b/src/components/ReportActionItem/MoneyRequestView.js index eb08639d8d8e..8232f8618f2c 100644 --- a/src/components/ReportActionItem/MoneyRequestView.js +++ b/src/components/ReportActionItem/MoneyRequestView.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useMemo} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; @@ -10,6 +10,7 @@ import ROUTES from '../../ROUTES'; import Navigation from '../../libs/Navigation/Navigation'; import withCurrentUserPersonalDetails, {withCurrentUserPersonalDetailsPropTypes} from '../withCurrentUserPersonalDetails'; import compose from '../../libs/compose'; +import Permissions from '../../libs/Permissions'; import MenuItemWithTopDescription from '../MenuItemWithTopDescription'; import styles from '../../styles/styles'; import * as ReportUtils from '../../libs/ReportUtils'; @@ -31,6 +32,9 @@ import OfflineWithFeedback from '../OfflineWithFeedback'; import categoryPropTypes from '../categoryPropTypes'; const propTypes = { + /** List of betas available to current user */ + betas: PropTypes.arrayOf(PropTypes.string), + /** The report currently being looked at */ report: reportPropTypes.isRequired, @@ -51,6 +55,7 @@ const propTypes = { }; const defaultProps = { + betas: [], parentReport: {}, policyCategories: {}, transaction: { @@ -60,7 +65,7 @@ const defaultProps = { }, }; -function MoneyRequestView({report, parentReport, policyCategories, shouldShowHorizontalRule, transaction}) { +function MoneyRequestView({betas, report, parentReport, policyCategories, shouldShowHorizontalRule, transaction}) { const {isSmallScreenWidth} = useWindowDimensions(); const {translate} = useLocalize(); @@ -80,7 +85,10 @@ function MoneyRequestView({report, parentReport, policyCategories, shouldShowHor const isSettled = ReportUtils.isSettled(moneyRequestReport.reportID); const canEdit = ReportUtils.canEditMoneyRequest(parentReportAction); - const shouldShowCategory = !_.isEmpty(policyCategories) || !_.isEmpty(transactionCategory); + // A flag for verifying that the current report is a sub-report of a workspace chat + const isPolicyExpenseChat = useMemo(() => ReportUtils.isPolicyExpenseChat(ReportUtils.getRootParentReport(report)), [report]); + // A flag for showing categories + const shouldShowCategory = isPolicyExpenseChat && Permissions.canUseCategories(betas) && (!_.isEmpty(policyCategories) || !_.isEmpty(transactionCategory)); let description = `${translate('iou.amount')} • ${translate('iou.cash')}`; if (isSettled) { @@ -201,6 +209,9 @@ MoneyRequestView.displayName = 'MoneyRequestView'; export default compose( withCurrentUserPersonalDetails, withOnyx({ + betas: { + key: ONYXKEYS.BETAS, + }, parentReport: { key: ({report}) => `${ONYXKEYS.COLLECTION.REPORT}${report.parentReportID}`, }, From f8b84a96161b61712069800d54da4312300ead1a Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Mon, 18 Sep 2023 18:21:04 +0200 Subject: [PATCH 13/55] improve options helpers --- src/libs/OptionsListUtils.js | 38 +++++++++++++- tests/unit/OptionsListUtilsTest.js | 84 ------------------------------ 2 files changed, 37 insertions(+), 85 deletions(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 8027a30b34a1..c38f99edac65 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -599,6 +599,32 @@ function isCurrentUser(userDetails) { return _.some(_.keys(loginList), (login) => login.toLowerCase() === userDetailsLogin.toLowerCase()); } +/** + * Calculates count of all enabled options + * + * @param {Object[]} options - an initial strings array + * @param {Boolean} options[].enabled - a flag to enable/disable option in a list + * @param {String} options[].name - a name of an option + * @returns {Boolean} + */ +function getEnabledCategoriesCount(options) { + return _.chain(options) + .filter((option) => Boolean(option.enabled)) + .value().length; +} + +/** + * Verifies that there is at least one enabled option + * + * @param {Object[]} options - an initial strings array + * @param {Boolean} options[].enabled - a flag to enable/disable option in a list + * @param {String} options[].name - a name of an option + * @returns {Boolean} + */ +function hasEnabledOptions(options) { + return _.some(options, (option) => Boolean(option.enabled)); +} + /** * Build the options for the category tree hierarchy via indents * @@ -612,6 +638,10 @@ function getCategoryOptionTree(options, isOneLine = false) { const optionCollection = {}; _.each(options, (option) => { + if (!option.enabled) { + return; + } + if (isOneLine) { if (_.has(optionCollection, option.name)) { return; @@ -662,7 +692,11 @@ function getCategoryOptionTree(options, isOneLine = false) { */ function getCategoryListSections(categories, recentlyUsedCategories, selectedOptions, searchInputValue, maxRecentReportsToShow) { const categorySections = []; - const categoriesValues = _.values(categories); + const categoriesValues = _.chain(categories) + .values() + .filter((category) => category.enabled) + .value(); + const numberOfCategories = _.size(categoriesValues); let indexOffset = 0; @@ -1342,6 +1376,8 @@ export { isSearchStringMatch, shouldOptionShowTooltip, getLastMessageTextForReport, + getEnabledCategoriesCount, + hasEnabledOptions, getCategoryOptionTree, formatMemberForList, }; diff --git a/tests/unit/OptionsListUtilsTest.js b/tests/unit/OptionsListUtilsTest.js index ef90c767175e..f10eecefaafd 100644 --- a/tests/unit/OptionsListUtilsTest.js +++ b/tests/unit/OptionsListUtilsTest.js @@ -687,13 +687,6 @@ describe('OptionsListUtils', () => { shouldShow: false, indexOffset: 0, data: [ - { - text: 'Taxi', - keyForList: 'Taxi', - searchText: 'Taxi', - tooltipText: 'Taxi', - isDisabled: true, - }, { text: 'Restaurant', keyForList: 'Restaurant', @@ -827,13 +820,6 @@ describe('OptionsListUtils', () => { shouldShow: true, indexOffset: 1, data: [ - { - text: 'Taxi', - keyForList: 'Taxi', - searchText: 'Taxi', - tooltipText: 'Taxi', - isDisabled: true, - }, { text: 'Restaurant', keyForList: 'Restaurant', @@ -848,13 +834,6 @@ describe('OptionsListUtils', () => { shouldShow: true, indexOffset: 3, data: [ - { - text: 'Taxi', - keyForList: 'Taxi', - searchText: 'Taxi', - tooltipText: 'Taxi', - isDisabled: true, - }, { text: 'Restaurant', keyForList: 'Restaurant', @@ -883,13 +862,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Milk', isDisabled: false, }, - { - text: ' Vegetables', - keyForList: 'Vegetables', - searchText: 'Food: Vegetables', - tooltipText: 'Vegetables', - isDisabled: true, - }, { text: 'Cars', keyForList: 'Cars', @@ -904,13 +876,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Audi', isDisabled: false, }, - { - text: ' BMW', - keyForList: 'BMW', - searchText: 'Cars: BMW', - tooltipText: 'BMW', - isDisabled: true, - }, { text: ' Mercedes-Benz', keyForList: 'Mercedes-Benz', @@ -939,13 +904,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Breakfast', isDisabled: false, }, - { - text: ' Dinner', - keyForList: 'Dinner', - searchText: 'Travel: Meals: Dinner', - tooltipText: 'Dinner', - isDisabled: true, - }, { text: ' Lunch', keyForList: 'Lunch', @@ -983,13 +941,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Food: Milk', isDisabled: false, }, - { - text: 'Food: Vegetables', - keyForList: 'Food: Vegetables', - searchText: 'Food: Vegetables', - tooltipText: 'Food: Vegetables', - isDisabled: true, - }, ], }, ]; @@ -1153,13 +1104,6 @@ describe('OptionsListUtils', () => { }, }; const result = [ - { - text: 'Taxi', - keyForList: 'Taxi', - searchText: 'Taxi', - tooltipText: 'Taxi', - isDisabled: true, - }, { text: 'Restaurant', keyForList: 'Restaurant', @@ -1188,13 +1132,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Milk', isDisabled: false, }, - { - text: ' Vegetables', - keyForList: 'Vegetables', - searchText: 'Food: Vegetables', - tooltipText: 'Vegetables', - isDisabled: true, - }, { text: 'Cars', keyForList: 'Cars', @@ -1209,13 +1146,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Audi', isDisabled: false, }, - { - text: ' BMW', - keyForList: 'BMW', - searchText: 'Cars: BMW', - tooltipText: 'BMW', - isDisabled: true, - }, { text: ' Mercedes-Benz', keyForList: 'Mercedes-Benz', @@ -1223,13 +1153,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Mercedes-Benz', isDisabled: false, }, - { - text: 'Medical', - keyForList: 'Medical', - searchText: 'Medical', - tooltipText: 'Medical', - isDisabled: true, - }, { text: 'Travel', keyForList: 'Travel', @@ -1251,13 +1174,6 @@ describe('OptionsListUtils', () => { tooltipText: 'Breakfast', isDisabled: false, }, - { - text: ' Dinner', - keyForList: 'Dinner', - searchText: 'Travel: Meals: Dinner', - tooltipText: 'Dinner', - isDisabled: true, - }, { text: ' Lunch', keyForList: 'Lunch', From b12a93ed40c9d0eb03c8be2c15769123d66ae2c2 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Mon, 18 Sep 2023 18:21:18 +0200 Subject: [PATCH 14/55] check enabled categories --- src/components/CategoryPicker/index.js | 2 +- src/components/MoneyRequestConfirmationList.js | 2 +- src/components/ReportActionItem/MoneyRequestView.js | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/CategoryPicker/index.js b/src/components/CategoryPicker/index.js index 66ac0bf14d4a..da7b77ca193e 100644 --- a/src/components/CategoryPicker/index.js +++ b/src/components/CategoryPicker/index.js @@ -14,7 +14,7 @@ function CategoryPicker({selectedCategory, policyCategories, policyRecentlyUsedC const {translate} = useLocalize(); const [searchValue, setSearchValue] = useState(''); - const policyCategoriesCount = _.size(policyCategories); + const policyCategoriesCount = OptionsListUtils.getEnabledCategoriesCount(_.values(policyCategories)); const isCategoriesCountBelowThreshold = policyCategoriesCount < CONST.CATEGORY_LIST_THRESHOLD; const selectedOptions = useMemo(() => { diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index d72860e78a48..7ed5ba0e1f09 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -196,7 +196,7 @@ function MoneyRequestConfirmationList(props) { const isPolicyExpenseChat = useMemo(() => ReportUtils.isPolicyExpenseChat(ReportUtils.getRootParentReport(ReportUtils.getReport(props.reportID))), [props.reportID]); // A flag for showing the categories field - const shouldShowCategories = isPolicyExpenseChat && Permissions.canUseCategories(props.betas) && !_.isEmpty(props.policyCategories); + const shouldShowCategories = isPolicyExpenseChat && Permissions.canUseCategories(props.betas) && OptionsListUtils.hasEnabledOptions(_.values(props.policyCategories)); // Fetches the first tag list of the policy const tagListKey = _.first(_.keys(props.policyTags)); diff --git a/src/components/ReportActionItem/MoneyRequestView.js b/src/components/ReportActionItem/MoneyRequestView.js index 8232f8618f2c..be937a834c42 100644 --- a/src/components/ReportActionItem/MoneyRequestView.js +++ b/src/components/ReportActionItem/MoneyRequestView.js @@ -14,6 +14,7 @@ import Permissions from '../../libs/Permissions'; import MenuItemWithTopDescription from '../MenuItemWithTopDescription'; import styles from '../../styles/styles'; import * as ReportUtils from '../../libs/ReportUtils'; +import * as OptionsListUtils from '../../libs/OptionsListUtils'; import * as ReportActionsUtils from '../../libs/ReportActionsUtils'; import * as StyleUtils from '../../styles/StyleUtils'; import CONST from '../../CONST'; @@ -88,7 +89,8 @@ function MoneyRequestView({betas, report, parentReport, policyCategories, should // A flag for verifying that the current report is a sub-report of a workspace chat const isPolicyExpenseChat = useMemo(() => ReportUtils.isPolicyExpenseChat(ReportUtils.getRootParentReport(report)), [report]); // A flag for showing categories - const shouldShowCategory = isPolicyExpenseChat && Permissions.canUseCategories(betas) && (!_.isEmpty(policyCategories) || !_.isEmpty(transactionCategory)); + const shouldShowCategory = + isPolicyExpenseChat && Permissions.canUseCategories(betas) && (!_.isEmpty(transactionCategory) || OptionsListUtils.hasEnabledOptions(_.values(policyCategories))); let description = `${translate('iou.amount')} • ${translate('iou.cash')}`; if (isSettled) { From 7a643bfdfca602541f070e8ea257e8c462e5808a Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Mon, 18 Sep 2023 18:45:44 +0200 Subject: [PATCH 15/55] fix billable condition --- src/components/MoneyRequestConfirmationList.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index da969dce1145..d60b2e5d44bf 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -204,8 +204,12 @@ function MoneyRequestConfirmationList(props) { const tagListKey = _.first(_.keys(props.policyTags)); const tagList = lodashGet(props.policyTags, [tagListKey, 'tags'], []); const tagListName = lodashGet(props.policyTags, [tagListKey, 'name'], ''); + const canUseTags = Permissions.canUseTags(props.betas); // A flag for showing the tags field - const shouldShowTags = isPolicyExpenseChat && Permissions.canUseTags(props.betas) && !_.isEmpty(tagList); + const shouldShowTags = isPolicyExpenseChat && canUseTags && !_.isEmpty(tagList); + + // A flag for showing the billable field + const shouldShowBillable = canUseTags && !lodashGet(props.policy, 'disabledFields.defaultBillable', true); const formattedAmount = CurrencyUtils.convertToDisplayString( shouldCalculateDistanceAmount ? DistanceRequestUtils.getDistanceRequestAmount(distance, unit, rate) : props.iouAmount, @@ -539,7 +543,7 @@ function MoneyRequestConfirmationList(props) { disabled={didConfirm || props.isReadOnly} /> )} - {canUseTags && !lodashGet(props.policy, 'disabledFields.defaultBillable', true) && ( + {shouldShowBillable && ( {translate('common.billable')} Date: Sat, 20 May 2023 14:12:19 -0400 Subject: [PATCH 16/55] Increase FlatList batch size --- src/components/InvertedFlatList/BaseInvertedFlatList.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/InvertedFlatList/BaseInvertedFlatList.js b/src/components/InvertedFlatList/BaseInvertedFlatList.js index d3fcda0ea5fd..0327e4e0b5b9 100644 --- a/src/components/InvertedFlatList/BaseInvertedFlatList.js +++ b/src/components/InvertedFlatList/BaseInvertedFlatList.js @@ -136,8 +136,10 @@ class BaseInvertedFlatList extends Component { // Native platforms do not need to measure items and work fine without this. // Web requires that items be measured or else crazy things happen when scrolling. getItemLayout={this.props.shouldMeasureItems ? this.getItemLayout : undefined} - // We keep this property very low so that chat switching remains fast - maxToRenderPerBatch={1} + // Keep batch size relatively small for responsiveness, but not too small as it will cause + // excessive rendering. See https://github.com/Expensify/App/pull/19345 for performance testing + // of this value. + maxToRenderPerBatch={10} windowSize={15} // Commenting the line below as it breaks the unread indicator test From d9dfaa734fcfa8151885810dac9c73872a83ab57 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Tue, 19 Sep 2023 11:29:48 +0200 Subject: [PATCH 17/55] sort prop types --- src/components/ReportActionItem/MoneyRequestView.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.js b/src/components/ReportActionItem/MoneyRequestView.js index 97eb23f80eeb..386d8090d7c4 100644 --- a/src/components/ReportActionItem/MoneyRequestView.js +++ b/src/components/ReportActionItem/MoneyRequestView.js @@ -33,6 +33,10 @@ import OfflineWithFeedback from '../OfflineWithFeedback'; import categoryPropTypes from '../categoryPropTypes'; const propTypes = { + /** Whether we should display the horizontal rule below the component */ + shouldShowHorizontalRule: PropTypes.bool.isRequired, + + /* Onyx Props */ /** List of betas available to current user */ betas: PropTypes.arrayOf(PropTypes.string), @@ -42,16 +46,12 @@ const propTypes = { /** The expense report or iou report (only will have a value if this is a transaction thread) */ parentReport: iouReportPropTypes, - /* Onyx Props */ /** Collection of categories attached to a policy */ policyCategories: PropTypes.objectOf(categoryPropTypes), /** The transaction associated with the transactionThread */ transaction: transactionPropTypes, - /** Whether we should display the horizontal rule below the component */ - shouldShowHorizontalRule: PropTypes.bool.isRequired, - ...withCurrentUserPersonalDetailsPropTypes, }; From 4f875ea1641b11fa676b5bafbd3c0f3facd2d1fc Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Tue, 19 Sep 2023 11:37:24 +0200 Subject: [PATCH 18/55] simplify helpers --- src/libs/OptionsListUtils.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 5e44babe1083..ff318d4fd1e5 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -605,9 +605,7 @@ function isCurrentUser(userDetails) { * @returns {Boolean} */ function getEnabledCategoriesCount(options) { - return _.chain(options) - .filter((option) => Boolean(option.enabled)) - .value().length; + return _.filter(options, (option) => option.enabled).length; } /** @@ -619,7 +617,7 @@ function getEnabledCategoriesCount(options) { * @returns {Boolean} */ function hasEnabledOptions(options) { - return _.some(options, (option) => Boolean(option.enabled)); + return _.some(options, (option) => option.enabled); } /** From d962ce18928ab774f8f50e26a77c97f5d9e3b96e Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Tue, 19 Sep 2023 11:37:41 +0200 Subject: [PATCH 19/55] create a handler --- src/pages/EditRequestCategoryPage.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/pages/EditRequestCategoryPage.js b/src/pages/EditRequestCategoryPage.js index ba94c2b40800..b1ee6f3384f6 100644 --- a/src/pages/EditRequestCategoryPage.js +++ b/src/pages/EditRequestCategoryPage.js @@ -20,6 +20,12 @@ const propTypes = { function EditRequestCategoryPage({defaultCategory, policyID, onSubmit}) { const {translate} = useLocalize(); + const selectCategory = (category) => { + onSubmit({ + category: category.searchText, + }); + }; + return ( - onSubmit({ - category: category.searchText, - }) - } + onSubmit={selectCategory} /> ); From 72bd7e84f032a9c053adfba33a58e9b30ba710ed Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Tue, 19 Sep 2023 11:46:59 +0200 Subject: [PATCH 20/55] reuse iuo props --- src/pages/iou/MoneyRequestCategoryPage.js | 9 ++++----- src/pages/iou/propTypes/index.js | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/pages/iou/MoneyRequestCategoryPage.js b/src/pages/iou/MoneyRequestCategoryPage.js index adba5755496d..92934a505a04 100644 --- a/src/pages/iou/MoneyRequestCategoryPage.js +++ b/src/pages/iou/MoneyRequestCategoryPage.js @@ -11,6 +11,7 @@ import CategoryPicker from '../../components/CategoryPicker'; import ONYXKEYS from '../../ONYXKEYS'; import reportPropTypes from '../reportPropTypes'; import * as IOU from '../../libs/actions/IOU'; +import {iouPropTypes, iouDefaultProps} from './propTypes'; const propTypes = { /** Navigation route context info provided by react navigation */ @@ -25,19 +26,17 @@ const propTypes = { }), }).isRequired, + /* Onyx Props */ /** The report currently being used */ report: reportPropTypes, - /* Onyx Props */ /** Holds data related to Money Request view state, rather than the underlying Money Request data. */ - iou: PropTypes.shape({ - category: PropTypes.string.isRequired, - }), + iou: iouPropTypes, }; const defaultProps = { report: {}, - iou: {}, + iou: iouDefaultProps, }; function MoneyRequestCategoryPage({route, report, iou}) { diff --git a/src/pages/iou/propTypes/index.js b/src/pages/iou/propTypes/index.js index 5ecd00d11876..586f8424a2c2 100644 --- a/src/pages/iou/propTypes/index.js +++ b/src/pages/iou/propTypes/index.js @@ -18,6 +18,9 @@ const iouPropTypes = PropTypes.shape({ /** The merchant name */ merchant: PropTypes.string, + /** The category name */ + category: PropTypes.string, + /** The tag */ tag: PropTypes.string, @@ -37,6 +40,7 @@ const iouDefaultProps = { currency: CONST.CURRENCY.USD, comment: '', merchant: '', + category: '', tag: '', created: '', participants: [], From 37d67702d350aaa6dca47ae274e8e4e1529562eb Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Tue, 19 Sep 2023 11:57:36 +0200 Subject: [PATCH 21/55] clarify props --- src/components/ReportActionItem/MoneyRequestView.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.js b/src/components/ReportActionItem/MoneyRequestView.js index 386d8090d7c4..0aba850b2145 100644 --- a/src/components/ReportActionItem/MoneyRequestView.js +++ b/src/components/ReportActionItem/MoneyRequestView.js @@ -33,6 +33,9 @@ import OfflineWithFeedback from '../OfflineWithFeedback'; import categoryPropTypes from '../categoryPropTypes'; const propTypes = { + /** The report currently being looked at */ + report: reportPropTypes.isRequired, + /** Whether we should display the horizontal rule below the component */ shouldShowHorizontalRule: PropTypes.bool.isRequired, @@ -40,9 +43,6 @@ const propTypes = { /** List of betas available to current user */ betas: PropTypes.arrayOf(PropTypes.string), - /** The report currently being looked at */ - report: reportPropTypes.isRequired, - /** The expense report or iou report (only will have a value if this is a transaction thread) */ parentReport: iouReportPropTypes, From 3353869cc4725020a9205be609395b42ce7b0af9 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Tue, 19 Sep 2023 11:58:04 +0200 Subject: [PATCH 22/55] clarify return type --- src/libs/OptionsListUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index ff318d4fd1e5..6c17bad76dd5 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -602,7 +602,7 @@ function isCurrentUser(userDetails) { * @param {Object[]} options - an initial strings array * @param {Boolean} options[].enabled - a flag to enable/disable option in a list * @param {String} options[].name - a name of an option - * @returns {Boolean} + * @returns {Number} */ function getEnabledCategoriesCount(options) { return _.filter(options, (option) => option.enabled).length; From 46764751277a61d9f145785fe06479c2b83d0848 Mon Sep 17 00:00:00 2001 From: Ana Margarida Silva Date: Tue, 19 Sep 2023 16:54:36 +0100 Subject: [PATCH 23/55] feat: support missing report when requesting money from FAB This was once implemented by @rezkiy37 but it was mistakenly in another PR --- .../MoneyRequestParticipantsPage.js | 18 +++++++++++++++--- .../MoneyRequestParticipantsSelector.js | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsPage.js b/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsPage.js index 1d9f12a9cdbb..f0ec28336f5a 100644 --- a/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsPage.js +++ b/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsPage.js @@ -62,7 +62,19 @@ function MoneyRequestParticipantsPage({iou, selectedTab, route}) { setHeaderTitle(_.isEmpty(iou.participants) ? translate('tabSelector.manual') : translate('iou.split')); }, [iou.participants, isDistanceRequest, translate]); - const navigateToNextStep = (moneyRequestType) => { + const navigateToRequestStep = (moneyRequestType, option) => { + if (option.reportID) { + isNewReportIDSelectedLocally.current = true; + IOU.setMoneyRequestId(`${moneyRequestType}${option.reportID}`); + Navigation.navigate(ROUTES.getMoneyRequestConfirmationRoute(moneyRequestType, option.reportID)); + return; + } + + IOU.setMoneyRequestId(moneyRequestType); + Navigation.navigate(ROUTES.getMoneyRequestConfirmationRoute(moneyRequestType, reportID.current)); + }; + + const navigateToSplitStep = (moneyRequestType) => { IOU.setMoneyRequestId(moneyRequestType); Navigation.navigate(ROUTES.getMoneyRequestConfirmationRoute(moneyRequestType, reportID.current)); }; @@ -112,8 +124,8 @@ function MoneyRequestParticipantsPage({iou, selectedTab, route}) { ref={(el) => (optionsSelectorRef.current = el)} participants={iou.participants} onAddParticipants={IOU.setMoneyRequestParticipants} - navigateToRequest={() => navigateToNextStep(CONST.IOU.MONEY_REQUEST_TYPE.REQUEST)} - navigateToSplit={() => navigateToNextStep(CONST.IOU.MONEY_REQUEST_TYPE.SPLIT)} + navigateToRequest={(option) => navigateToRequestStep(CONST.IOU.MONEY_REQUEST_TYPE.REQUEST, option)} + navigateToSplit={() => navigateToSplitStep(CONST.IOU.MONEY_REQUEST_TYPE.SPLIT)} safeAreaPaddingBottomStyle={safeAreaPaddingBottomStyle} iouType={iouType.current} isDistanceRequest={isDistanceRequest} diff --git a/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsSelector.js b/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsSelector.js index 9ff787ebe21b..cf69e6477d3a 100755 --- a/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsSelector.js +++ b/src/pages/iou/steps/MoneyRequstParticipantsPage/MoneyRequestParticipantsSelector.js @@ -150,7 +150,7 @@ function MoneyRequestParticipantsSelector({ */ const addSingleParticipant = (option) => { onAddParticipants([{accountID: option.accountID, login: option.login, isPolicyExpenseChat: option.isPolicyExpenseChat, reportID: option.reportID, selected: true}]); - navigateToRequest(); + navigateToRequest(option); }; /** From abd2d25dbdd9cf3e699a6d0d944e06e24dfc30f3 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Wed, 20 Sep 2023 11:43:50 +0200 Subject: [PATCH 24/55] re-test From 5b2e89ce4520a9967a009d5e72ee0f951680a45a Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 15:49:36 +0530 Subject: [PATCH 25/55] delete existing routes --- docs/_data/_routes.yml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/docs/_data/_routes.yml b/docs/_data/_routes.yml index 32c8a5211ee2..85593156a4b1 100644 --- a/docs/_data/_routes.yml +++ b/docs/_data/_routes.yml @@ -2,25 +2,3 @@ home: href: home title: Welcome to ExpensifyHelp! description: Find the answers to all of your questions about receipts, expenses, corporate cards, or anything else in the spend management universe. - -# Hubs are comprised of sections and articles. Sections contain multiple related articles, but there can be standalone articles as well -hubs: - - href: split-bills - title: Split bills - description: With only a couple of clicks, split bills with your friends or coworkers. - icon: /assets/images/paper-airplane.svg - - - href: request-money - title: Request money - icon: /assets/images/money-case.svg - description: Request money for work expenses, bills, or a night out with friends. - - - href: playbooks - title: Playbooks - icon: /assets/images/playbook.svg - description: Best practices for how to best deploy Expensify for your business - - - href: other - title: Other - description: Everything else you're looking for is right here. - icon: /assets/images/lightbulb.svg From 3ef926c395c204779c891d80c77b2d84d1a0903a Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 15:49:49 +0530 Subject: [PATCH 26/55] delete existing hubs --- docs/hubs/other.html | 6 ------ docs/hubs/playbooks.html | 6 ------ docs/hubs/request-money.html | 6 ------ docs/hubs/split-bills.html | 6 ------ 4 files changed, 24 deletions(-) delete mode 100644 docs/hubs/other.html delete mode 100644 docs/hubs/playbooks.html delete mode 100644 docs/hubs/request-money.html delete mode 100644 docs/hubs/split-bills.html diff --git a/docs/hubs/other.html b/docs/hubs/other.html deleted file mode 100644 index 7d6d7f204062..000000000000 --- a/docs/hubs/other.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: default -title: Other ---- - -{% include hub.html %} diff --git a/docs/hubs/playbooks.html b/docs/hubs/playbooks.html deleted file mode 100644 index 0f15922fd061..000000000000 --- a/docs/hubs/playbooks.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: default -title: Playbooks ---- - -{% include hub.html %} diff --git a/docs/hubs/request-money.html b/docs/hubs/request-money.html deleted file mode 100644 index e3ef68f5c050..000000000000 --- a/docs/hubs/request-money.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: default -title: Request money ---- - -{% include hub.html %} diff --git a/docs/hubs/split-bills.html b/docs/hubs/split-bills.html deleted file mode 100644 index 6464ab62ef07..000000000000 --- a/docs/hubs/split-bills.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: default -title: Split bills ---- - -{% include hub.html %} From 08ebea74c228e5c6c6bb093847ce8ab5897ec5d6 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 15:51:05 +0530 Subject: [PATCH 27/55] delete existing articles --- ...e-Share-for-ExpensifyApproved!-Partners.md | 16 --- .../other/Enable-Location-Access-on-Web.md | 55 ---------- docs/articles/other/Everything-About-Chat.md | 87 --------------- .../other/Expensify-Chat-For-Admins.md | 26 ----- ...Expensify-Chat-For-Conference-Attendees.md | 35 ------ .../Expensify-Chat-For-Conference-Speakers.md | 39 ------- docs/articles/other/Expensify-Lounge.md | 66 ------------ docs/articles/other/Insights.md | 100 ------------------ docs/articles/other/Referral-Program.md | 53 ---------- .../other/Your-Expensify-Account-Manager.md | 36 ------- .../other/Your-Expensify-Partner-Manager.md | 34 ------ 11 files changed, 547 deletions(-) delete mode 100644 docs/articles/other/Card-Revenue-Share-for-ExpensifyApproved!-Partners.md delete mode 100644 docs/articles/other/Enable-Location-Access-on-Web.md delete mode 100644 docs/articles/other/Everything-About-Chat.md delete mode 100644 docs/articles/other/Expensify-Chat-For-Admins.md delete mode 100644 docs/articles/other/Expensify-Chat-For-Conference-Attendees.md delete mode 100644 docs/articles/other/Expensify-Chat-For-Conference-Speakers.md delete mode 100644 docs/articles/other/Expensify-Lounge.md delete mode 100644 docs/articles/other/Insights.md delete mode 100644 docs/articles/other/Referral-Program.md delete mode 100644 docs/articles/other/Your-Expensify-Account-Manager.md delete mode 100644 docs/articles/other/Your-Expensify-Partner-Manager.md diff --git a/docs/articles/other/Card-Revenue-Share-for-ExpensifyApproved!-Partners.md b/docs/articles/other/Card-Revenue-Share-for-ExpensifyApproved!-Partners.md deleted file mode 100644 index 44614d506d49..000000000000 --- a/docs/articles/other/Card-Revenue-Share-for-ExpensifyApproved!-Partners.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Expensify Card revenue share for ExpensifyApproved! partners -description: Earn money when your clients adopt the Expensify Card ---- - - -Start making more with us! We're thrilled to announce a new incentive for our US-based ExpensifyApproved! partner accountants. You can now earn additional income for your firm every time your client uses their Expensify Card. **In short, your firm gets 0.5% of your clients’ total Expensify Card spend as cash back**. The more your clients spend, the more cashback your firm receives!
-
This program is currently only available to US-based ExpensifyApproved! partner accountants. - -# How-to -To benefit from this program, all you need to do is ensure that you are listed as a domain admin on your client's Expensify account. If you're not currently a domain admin, your client can follow the instructions outlined in [our help article](https://community.expensify.com/discussion/5749/how-to-add-and-remove-domain-admins#:~:text=Domain%20Admins%20have%20total%20control,a%20member%20of%20the%20domain.) to assign you this role. -# FAQ -- What if my firm is not permitted to accept revenue share from our clients?
-
We understand that different firms may have different policies. If your firm is unable to accept this revenue share, you can pass the revenue share back to your client to give them an additional 0.5% of cash back using your own internal payment tools.

-- What if my firm does not wish to participate in the program?
-
Please reach out to your assigned partner manager at new.expensify.com to inform them you would not like to accept the revenue share nor do you want to pass the revenue share to your clients. diff --git a/docs/articles/other/Enable-Location-Access-on-Web.md b/docs/articles/other/Enable-Location-Access-on-Web.md deleted file mode 100644 index 6cc0d19e4cde..000000000000 --- a/docs/articles/other/Enable-Location-Access-on-Web.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Enable Location Access on Web -description: How to enable location access for Expensify websites on your browser ---- - - -# About - -If you'd like to use features that rely on your current location you will need to enable location permissions for Expensify. You can find instructions for how to enable location settings on the three most common web browsers below. If your browser is not in the list then please do a web search for your browser and "enable location settings". - -# How-to - - -### Chrome -1. Open Chrome -2. At the top right, click the three-dot Menu > Settings -3. Click "Privacy and Security" and then "Site Settings" -4. Click Location -5. Check the "Not allowed to see your location" list to make sure expensify.com and new.expensify.com are not listed. If they are, click the delete icon next to them to allow location access - -[Chrome help page](https://support.google.com/chrome/answer/142065) - -### Firefox - -1. Open Firefox -2. In the URL bar enter "about:preferences" -3. On the left hand side select "Privacy & Security" -4. Scroll down to Permissions -5. Click on Settings next to Location -6. If location access is blocked for expensify.com or new.expensify.com, you can update it here to allow access - -[Firefox help page](https://support.mozilla.org/en-US/kb/permissions-manager-give-ability-store-passwords-set-cookies-more) - -### Safari -1. In the top menu bar click Safari -2. Then select Settings > Websites -3. Click Location on the left hand side -4. If expensify.com or new.expensify.com have "Deny" set as their access, update it to "Ask" or "Allow" - -Ask: The site must ask if it can use your location. -Deny: The site can’t use your location. -Allow: The site can always use your location. - -[Safari help page](https://support.apple.com/guide/safari/websites-ibrwe2159f50/mac) diff --git a/docs/articles/other/Everything-About-Chat.md b/docs/articles/other/Everything-About-Chat.md deleted file mode 100644 index d52932daa5ff..000000000000 --- a/docs/articles/other/Everything-About-Chat.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Everything About Chat -description: Everything you need to know about Expensify's Chat Features! ---- - - - -# What is Expensify Chat? -Expensify Chat is an ideal way to collaborate on expenses or payment requests by communicating in real-time with your accountant, clients, employees, or, friends. - -With Expensify Chat, you can start a conversation about that missing receipt your employee forgot to submit or chat about splitting that electric bill with your roommates. Through eChat, you can even request money from your friends after a night out on the town! - -# How to use Chat in Expensify -Download NewExpensify from the [App Store](https://apps.apple.com/us/app/expensify-cash/id1530278510) or [Google Play](https://play.google.com/store/apps/details?id=com.expensify.chat) to use the chat function. You can also access your account at new.expensify.com from your favorite web browser. - -After downloading the app, log into your new.expensify.com account (you’ll use the same login information as your Expensify Classic account). From there, you can customize your profile and start chatting immediately. - - -## Start Chatting -Select **New Chat** to chat one-on-one or **New Group** to start a group chat. -## Workspace Chat Rooms -In addition to 1:1 and group chat, members of a Workspace or Policy will have access to two additional rooms; the #announce and #admins rooms. -All workspace members are added to the #announce room by default. The #announce room lets you share important company announcements and have conversations between workspace members. - -All workspace admins can access the #admins room. Use the #admins room to collaborate with the other admins on your policy, and chat with your dedicated Expensify Onboarding Guide. If you have a subscription of 10 or more users, you're automatically assigned an Account Manager. You can ask for help and collaborate with your Account Manager in this same #admins room. Anytime someone on your team, your dedicated setup specialist, or your dedicated account manager makes any changes to your Workspace settings, that update is logged in the #admins room. -## How to format text - -- To italicize your message, place an underscore on both sides of the text: *text* -- To bold your message, place an asterisk on both sides of the text: **text** -- To strikethrough your message, place a tilde on both sides of the text: ~~text~~ -- To turn your message into code, place a backtick on both sides of the text: `text` -- To turn your text into a blockquote, add an angled bracket (>) in front of the text: - >your text -- To turn your message into a heading, place a number sign (#) in front of the text: -# Heading -- To turn your entire message into code block, place three backticks on both sides of the text: -``` -here's some text -and even more text -``` - -# FAQs -## How do I add more than one person to a chat? -Start by clicking the green chat **+** button and select **New Group**. Search for the people you want to invite and check the circle to the far right. Once you’ve selected everyone you want in the group chat, click the **Create Group** button at the bottom of your screen. - -## Can I add people to an existing Group chat? -Adding people to an existing group chat isn’t possible right now, so you’ll want to make a new group chat instead. - -## Someone I don’t recognize is in my #admins room for my workspace; who is it? -After creating your workspace, you’ll have a dedicated Expensify specialist who will help you onboard and answer your questions. You can chat with them directly in the #admins room or request a call to talk to them over the phone. Later, once you've finished onboarding, if you have a subscription of 10 or more users, a dedicated Account Manager is added to your #admins room for ongoing product support. - -## Can I force a chat to stay at the top of the chats list? -You sure can! Click on the chat you want to keep at the top of the list, and then click the small **pin** icon. If you want to unpin a chat, just click the **pin** icon again. - -# Deep Dive -## Chat display, aka Priority Mode -The way your chats display in the left-hand menu is customizable. We offer two different options; Most Recent mode and _#focus_ mode. - -- Most Recent mode will display all chats by default, sort them by the most recent, and keep your pinned chats at the top of the list. -- #focus mode will display only unread and pinned chats, and will sort them alphabetically. This setting is perfect for when you need to cut distractions and focus on a crucial project. - -You can find your display mode by clicking on your User Icon > Preferences > Priority Mode. - -## Inviting someone to Expensify Chat -If the person you want to chat with doesn’t appear in your contact list, simply type their email or phone number to invite them to chat! From there, they will receive an email with instructions and a link to create an account. - -Once they click the link, a new.expensify.com account is set up for them automatically (if they don't have one already), and they can start chatting with you immediately! - -## Flagging content as offensive -In order to maintain a safe community for our users, Expensify provides tools to report offensive content and unwanted behavior in Expensify Chat. If you see a message (or attachment/image) from another user that you’d like our moderators to review, you can flag it by clicking the flag icon in the message context menu (on desktop) or holding down on the message and selecting “Flag as offensive” (on mobile). - -![Moderation Context Menu](https://help.expensify.com/assets/images/moderation-context-menu.png){:width="100%"} - -Once the flag is selected, you will be asked to categorize the message (such as spam, bullying, and harassment). Select what you feel best represents the issue is with the content, and you’re done - the message will be sent off to our internal team for review. - -![Moderation Flagging Options](https://help.expensify.com/assets/images/moderation-flag-page.png){:width="100%"} - -Depending on the severity of the offense, messages can be hidden (with an option to reveal) or fully removed, and in extreme cases, the sender of the message can be temporarily or permanently blocked from posting. - -You will receive a whisper from Concierge any time your content has been flagged, as well as when you have successfully flagged a piece of content. - -![Moderation Reportee Whisper](https://help.expensify.com/assets/images/moderation-reportee-whisper.png){:width="100%"} -![Moderation Reporter Whisper](https://help.expensify.com/assets/images/moderation-reporter-whisper.png){:width="100%"} - -*Note: Any message sent in public chat rooms are automatically reviewed by an automated system looking for offensive content and sent to our moderators for final decisions if it is found.* - - diff --git a/docs/articles/other/Expensify-Chat-For-Admins.md b/docs/articles/other/Expensify-Chat-For-Admins.md deleted file mode 100644 index 247b2b0e03d0..000000000000 --- a/docs/articles/other/Expensify-Chat-For-Admins.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Expensify Chat for Admins -description: Best Practices for Admins settings up Expensify Chat ---- - -## Overview -Expensify Chat is an incredible way to build a community and foster long-term relationships between event producers and attendees, or attendees with each other. Admins are a huge factor in the success of the connections built in Expensify Chat during the events, as they are generally the drivers of the conference schedule, and help ensure safety and respect is upheld by all attendees both on and offline. - -## Getting Started -We’ve rounded up some resources to get you set up on Expensify Chat and ready to start connecting with your session attendees: -- [How to get set up and start using Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-use-chat-in-expensify) -- [How to format text in Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text) -- [How to flag content and/or users for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) - -## Admin Best Practices -In order to get the most out of Expensify Chat, we created a list of best practices for admins to review in order to use the tool to its fullest capabilities. - -**During the conference:** -- At a minimum, send 3 announcements throughout the day to create awareness of any sessions, activations, contests, or parties you want to promote. -- Communicate with the Expensify Team in the #admins room if you see anything you have questions about or are unsure of to make sure we’re resolving issues together ASAP. -- As an admin, It’s up to you to help keep your conference community safe and respectful. [Flag any content for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) that does not fit your culture and values to keep chatrooms a positive experience for everyone involved. - -**After the conference:** -- The rooms will all stay open after the conference ends, so encourage speakers to keep engaging as long as the conversation is going in their session room. -- Continue sharing photos and videos from the event or anything fun in #social as part of a wrap up for everyone. -- Use the #announce room to give attendees a sneak preview of your next event. diff --git a/docs/articles/other/Expensify-Chat-For-Conference-Attendees.md b/docs/articles/other/Expensify-Chat-For-Conference-Attendees.md deleted file mode 100644 index 3d30237dca5a..000000000000 --- a/docs/articles/other/Expensify-Chat-For-Conference-Attendees.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Expensify Chat for Conference Attendees -description: Best Practices for Conference Attendees ---- - -## Overview -Expensify Chat is the best way to meet and network with other event attendees. No more hunting down your contacts by walking the floor or trying to find someone in crowds at a party. Instead, you can use Expensify Chat to network and collaborate with others throughout the conference. - -To help get you set up for a great event, we’ve created a guide to help you get the most out of using Expensify Chat at the event you’re attending. - -## Getting Started -We’ve rounded up some resources to get you set up on Expensify Chat and ready to start connecting with your fellow attendees: - -- [How to get set up and start using Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-use-chat-in-expensify) -- [How to format text in Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text) -- [How to flag content and/or users for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) - -## Chat Best Practices -To get the most out of your experience at your conference and engage people in a meaningful conversation that will fulfill your goals instead of turning people off, here are some tips on what to do and not to do as an event attendee using Expensify Chat: - -**Do:** -- Chat about non-business topics like where the best coffee is around the event, what great lunch options are available, or where the parties are happening that night! -- Share pictures of your travel before the event to hype everyone up, during the event if you met that person you’ve been meaning to see for years, or a fun pic from a party. -- Try to create fun groups with your fellow attendees around common interests like touring a local sight, going for a morning run, or trying a famous restaurant. - -**Don't:** -- Pitch your services in public rooms like #social or speaking session rooms. -- Start a first message with a stranger with a sales pitch. -- Discuss controversial topics such as politics, religion, or anything you wouldn’t say on a first date. -- In general just remember that you are still here for business, your profile is public, and you’re representing yourself & company, so do not say anything you wouldn’t feel comfortable sharing in a business setting. - -**Pro-Tips:** -Get active in Chat early and often by having real conversations around thought leadership or non-business discussions to stand out from the crowd! Also if you’re in a session and are afraid to ask a question, just ask in the chat room to make sure you can discuss it with the speaker after the session ends. - -By following these tips you’ll ensure that your messages will not be [flagged for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) and you will not mess it up for the rest of us. diff --git a/docs/articles/other/Expensify-Chat-For-Conference-Speakers.md b/docs/articles/other/Expensify-Chat-For-Conference-Speakers.md deleted file mode 100644 index 5bd52425d92b..000000000000 --- a/docs/articles/other/Expensify-Chat-For-Conference-Speakers.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Expensify Chat for Conference Speakers -description: Best Practices for Conference Speakers ---- - -## Overview -Are you a speaker at an event? Great! We're delighted to provide you with an extraordinary opportunity to connect with your session attendees using Expensify Chat — before, during, and after the event. Expensify Chat offers a powerful platform for introducing yourself and your topic, fostering engaging discussions about your presentation, and maintaining the conversation with attendees even after your session is over. - -## Getting Started -We’ve rounded up some resources to get you set up on Expensify Chat and ready to start connecting with your session attendees: - -- [How to get set up and start using Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-use-chat-in-expensify) -- [How to format text in Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text) -- [How to flag content and/or users for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) - -## Setting Up a Chatroom for Your Session: Checklist -To make the most of Expensify Chat for your session, here's a handy checklist: -- Confirm that your session has an Expensify Chat room, and have the URL link ready to share with attendees in advance. - - You can find the link by clicking on the avatar for your chatroom > “Share Code” > “Copy URL to dashboard” -- Join the chat room as soon as it's ready to begin engaging with your audience right from the start. -- Consider having a session moderator with you on the day to assist with questions and discussions while you're presenting. -- Include the QR code for your session's chat room in your presentation slides. Displaying it prominently on every slide ensures that attendees can easily join the chat throughout your presentation. - -## Tips to Enhance Engagement Around Your Session -By following these steps and utilizing Expensify Chat, you can elevate your session to promote valuable interactions with your audience, and leave a lasting impact beyond the conference. We can't wait to see your sessions thrive with the power of Expensify Chat! - -**Before the event:** -- Share your session's QR code or URL on your social media platforms, your website or other platforms to encourage attendees to join the conversation early on. -- Encourage attendees to ask questions in the chat room before the event, enabling you to tailor your session and address their specific interests. - -**During the event:** -- Keep your QR code readily available during the conference by saving it as a photo on your phone or setting it as your locked screen image. This way, you can easily share it with others you meet. -- Guide your audience back to the QR code and encourage them to ask questions, fostering interactive discussions. - -**After the event:** -- Continue engaging with attendees by responding to their questions and comments, helping you expand your audience and sustain interest. -- Share your presentation slides after the event as well as any photos from your session, allowing attendees to review and share your content with their networks if they want to. - -If you have any questions on how Expensify Chat works, head to our guide [here](https://help.expensify.com/articles/other/Everything-About-Chat). diff --git a/docs/articles/other/Expensify-Lounge.md b/docs/articles/other/Expensify-Lounge.md deleted file mode 100644 index 01a2d7a9e250..000000000000 --- a/docs/articles/other/Expensify-Lounge.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Welcome to the Expensify Lounge! -description: How to get the most out of the Expensify Lounge. ---- - - -# What is the Expensify Lounge? -The Expensify Lounge is a place where people go to Get Shit Done. It's a beautiful environment with great coffee and a group of people to collaborate with. Check out this guide on how to best utilize the Expensify Lounge! - -# The Two Rules -### Rule #1 - Get Shit Done - -The Lounge is a space for people to get work done. It is optimized to be the perfect environment for you to focus on your work, collaborate with others, and advance your most wild and creative ideas. To make this a reality, we ask our members to keep the following in mind: - -- **#focus** - Use the space for how it was designed and do not distract from others' focus. The space is beautiful, social, and collaborative, but it was created to help our members work effectively. -- **#urgency** - Working remotely is great, but there's nothing like real-time collaboration with your colleagues. Use the lounge to meet with co-workers IRL to continue the progress on whatever it is you're working on. -- **#results** - Don't mistake time for effort or effort for output. Upon arrival, visualize what you want to accomplish, and don't leave until it's done. - -## Rule #2 - Don’t Ruin it for Everyone Else - -We want this place to be incredible, innovative, and always elvoving. To achieve that, we have some general guidelines: - -- **#writeitdown** - If you can help others learn from you, do so. Write a blog post, a document, or a post in Expensify Chat to share with others. This includes making the Expensify Lounge a better space. Feel free to write down any improvements so we can make it better. -- **#showup** - If you are in the lounge, be fully present. Meet others, and collaborate in social rooms. The point is to build a community of people who are focused on getting shit done; you’ll get out what you put in. -- **#oneteam** - Providing an inclusive community is our priority, and we do not tolerate any form of discrimination. Aim to go out of your way to include people who want to be included. -- **#nocreeps** - Do not make people feel uncomfortable with your words or actions. If you are made to feel uncomfortable or notice this happening to someone else, you can use the escalation process outlined in the FAQ section. - -# How to Use the Expensify Lounge -Keeping those two rules in mind, below is a guide on how our members can get the most out of the lounge. - -### Rule #1 - Getting Shit Done -- **Order drinks from Concierge** - [Write Concierge here](https://new.expensify.com/concierge) to ask lounge questions or order beverages. Concierge will bring your order directly to you! -- **Using an office** - Offices are first come, first serve. If an office is open, feel free to use it! Please keep office use to under an hour. We currently do not allow reserving offices. -- **Lounge hours** - The lounge will be open from 8am-6pm PT, Monday through Friday and closed on some major holidays. You can review our Google Maps profile to check our holiday hours. -- **Make the lounge better** - Make any suggestions to improve the lounge experience in [#announce - Expensify Lounge](https://new.expensify.com/r/8292963527436014). - -## Rule #2 - Not Ruining it for Everyone Else -- **Offices are for calls** - Please do not occupy an office unless you have a call or collaborative meeting happening, and don't stay in an office for longer than an hour. -- **Respect other people** - Please do not be too loud or distracting while others are trying to work. While collaborating in Expensify Chat, be respectful of others’ viewpoints and keep a positive environment. -- **Stay home if you’re sick** - If you feel sick, please do not visit the lounge, or consider wearing a mask in public areas. -- **If you see something, say something** - If you are made to feel uncomfortable or witness others being made uncomfortable, let Concierge know. If this is happening in Expensify Chat, use our moderation tools (outlined below in the FAQ) to apply the applicable level of moderation. - -We’re so happy you are here to live rich, have fun, and save the world with us. Now, go enjoy the Expensify Lounge, and let's Get Shit Done! - -# FAQs - -#### What is Concierge? - -Concierge is our automated system that answers member questions in real-time. Questions regarding the local lounge will be routed directly to the lounge's Concierge. You can send Concierge a message if you have a drink request or general questions. They’ll take care of everything for you! - -#### Who is invited to the Expensify Lounge? - -Everyone is invited to the Expensify Lounge! Whether you're an existing customer, or you're someone looking for a great space to Get Shit Done, we'd love to have you. - -#### How do I escalate something that's making me or someone else uncomfortable? - -If you see something in Expensify Chat that should be escalated, you can use the escalation feature to mark a chat as: -- **Spam or Inconsiderate**: This will send a whisper to the sender of the message warning them of the violation, and the message will have a flag applied to it which will be visible to all users. Concierge will not review these flags. -- **Intimidating or Bullying**: The message will be immediately hidden, and the content will be reviewed by our team. After reviewing the message, and it's confirmed intimidation or bullying, the message will be permanently hidden and we'll communicate the violation to the sender of the message. -- **Harassment or Assault**: The message will be immediately hidden and reviewed by our team. The user will be sent a message to warning them of the violation, and Concierge can block the user if that's deemed necessary. - -If you witness something in-person, please write to Concierge referencing which lounge you are in, and they will escalate the issue appropriately. - -#### Where are other Expensify Lounge locations? - -Right now, we only have the San Francisco Lounge, but be on the lookout for more coming soon! diff --git a/docs/articles/other/Insights.md b/docs/articles/other/Insights.md deleted file mode 100644 index 682c2a251228..000000000000 --- a/docs/articles/other/Insights.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Custom Reporting and Insights -description: How to get the most out of the Custom Reporing and Insights ---- - -{% raw %} -# What is Custom Reporting and Insights? -The Insights dashboard allows you to monitor all aspects of company spend across categories, employees, projects, departments, and more. You can see trends in real time, forecast company budgets, and build unlimited custom reports with help from our trained specialist team. - -![Insights Pie Chart](https://help.expensify.com/assets/images/insights-chart.png){:width="100%"} -## Review your Insights data - -1. Navigate to your [Insights page](https://www.expensify.com/expenses?param={"fromInsightsTab":true,"viewMode":"charts"}), located in the left hand menu -2. Select a specific date range (the default view has the current month pre-selected) -3. Use the filter options to select the categories, tags, employees etc that you want insights on -4. Make sure that View in the top right corner is set to the pie chart icon -5. You can view any dataset in more detail by clicking in the “View Raw Data” column - -## Export your Insights data - -1. Switch the View in the top right corner of the [Insights page](https://www.expensify.com/expenses?param={"fromInsightsTab":true,"viewMode":"charts"}) to the lists icon -2. Select the expenses you want to export, either by selecting individual expenses, or checking the select all box (next to Date at the top) -3. Select **Export To** in the top right hand corner to download the report as a .csv file - -## Create a Custom Export Report for your Expenses - -1. Navigate to **Settings > Account > Preferences > scroll down to CSV Export Formats** -2. Build up a report using these [formulas](https://community.expensify.com/discussion/5795/deep-dive-expense-level-formula/p1?new=1) -3. Click the **Custom Export** button on the Insights page and your Account Manager will help get you started on building up your report - -## Create a Custom Export Report for your Policy - -1. Navigate to **Settings > Policies > Group > [Policy Name] > Export Formats** -2. Build up a report using these [formulas](https://community.expensify.com/discussion/5795/deep-dive-expense-level-formula/p1?new=1) -3. If you need any help, click the **Support** button on the top left to contact your Account Manager - -# FAQs - -#### Can I share my custom export report? - -If you would like to create a custom export report that can be shared with other policy admins, you can create these by navigating to the **[Settings > Policies > Group > [Policy Name] > Export Formats](https://www.expensify.com/admin_policies?param={"section":"group"})** page. Custom export reports created under **Settings > Account > Preferences** page are only available to the member who created them. - -#### Can I put expenses from different policies on the same report? - -Custom export reports created under Settings > Account > Preferences page are able to export expenses from multiple policies, and custom export formats created under Settings > Policies > Group > [Policy Name] > Export Formats are for expenses reported under that policy only. - -#### Are there any default export reports available? - -Yes! We have [seven default reports](https://community.expensify.com/discussion/5602/deep-dive-default-export-templates) available to export directly from the Reports page: - -- **All Data** - Expense Level Export** - the name says it all! This is for the people who want ALL the details from their expense reports. We're talking Tax, Merchant Category Codes, Approvers - you name it, this report's got it! -- **All Data** - Report Level Export - this is the report for those who don't need to see each individual expense but want to see a line by line breakdown at a report level - submitter, total amount, report ID - that kind of stuff -- **Basic Export** - this is the best way to get a simple breakdown of all your expenses - just the basics -- **Canadian Multiple Tax Export** - tax, GST, PST...if you need to know tax then this is the export you want! -- **Category Export** - want to see a breakdown of your expenses by Category? This is the export you -- **Per Diem Export** - the name says it all -- **Tag Export** - much like the Category Export, but for Tags - -*To note: these reports will be emailed directly to your email address rather than downloaded on your computer.* - -#### How many expenses can I export in one report? -The custom export reports are best for small-to-medium chunks of data. If you want to export large amounts of data, we recommend you use a [default export report](https://community.expensify.com/discussion/5602/deep-dive-default-export-templates) that you can run from the Reports page. - -#### What other kinds of export reports can my Account Manager help me create? - -We’ve built a huge variety of custom reports for customers, so make sure to reach out to your Account Manager for more details. Some examples of custom reports we’ve build for customers before are: - -- Accrual Report -- Aged Approval Reports -- Attendee Reporting -- Audit Report -- Candidate Spend -- Category Spend Report -- Department/Project Spend Report -- Duplication Report -- Duty of Care -- Efficiency -- Employee Bank Account Status -- Employee Details -- Employee Roles -- Expense Authorizations by Country -- Expense Reports by Country -- Expense Reports not posted to finance system -- Foreign Currency Transaction -- Fringe Benefit Tax Report -- HR Report -- Invoice Billed Transaction Reconciliation -- Mileage Reports -- Out of Pocket Expenses for Reimbursement -- Per Diem Report -- Reconciliation: Accounting, Bank Statement, Billed Transaction -- Rejected Report -- Travel Rule Class -- Travel Spend -- Unposted Cash Advance Report -- Unposted Procurement Aging Report -- Unposted Travel Aging Report -- Vendor Spend -- … or anything you can imagine! -{% endraw %} \ No newline at end of file diff --git a/docs/articles/other/Referral-Program.md b/docs/articles/other/Referral-Program.md deleted file mode 100644 index 1faff1c9ec4f..000000000000 --- a/docs/articles/other/Referral-Program.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Expensify Referral Program -description: Send your joining link, submit a receipt or invoice, and we'll pay you if your referral adopts Expensify. ---- - - -# About - -Expensify has grown thanks to our users who love Expensify so much that they tell their friends, colleagues, managers, and fellow business founders to use it, too. - -As a thank you, every time you bring a new user into the platform who directly or indirectly leads to the adoption of a paid annual plan on Expensify, you will earn $250. - -# How to get paid for referring people to Expensify - -1. Submit a report or invoice, or share your referral link with anyone you know who is spending too much time on expenses, or works at a company that could benefit from using Expensify. - -2. You will get $250 for any referred business that commits to an annual subscription, has 2 or more active users, and makes two monthly payments. - -That’s right! You can refer anyone working at any company you know. - -If their company goes on to become an Expensify customer with an annual subscription, and you are the earliest recorded referrer of a user on that company’s paid Expensify Policy, you'll get paid a referral reward. - -The best way to start is to submit any receipt to your manager (you'll get paid back and set yourself up for $250 if they start a subscription: win-win!) - -Referral rewards for the Spring/Summer 2023 campaign will be paid by direct deposit. - -# FAQ - -- **How will I know if I am the first person to refer a company to Expensify?** - -Successful referrers are notified after their referral pays for 2 months of an annual subscription. We will check for the earliest recorded referrer of a user on the policy, and if that is you, then we will let you know. - -- **How will you pay me if I am successful?** - -In the Spring 2023 campaign, Expensify will be paying successful referrers via direct deposit to the Deposit-Only account you have on file. Referral payouts will happen once a month for the duration of the campaign. If you do not have a Deposit-Only account at the time of your referral payout, your deposit will be processed in the next batch. - -Learn how to add a Deposit-Only account [here](https://community.expensify.com/discussion/4641/how-to-add-a-deposit-only-bank-account-both-personal-and-business). - -- **I’m outside of the US, how do I get paid?** - -While our referral payouts are in USD, you will be able to get paid via a Wise Borderless account. Learn more [here](https://community.expensify.com/discussion/5940/how-to-get-reimbursed-outside-the-us-with-wise-for-non-us-employees). - -- **My referral wasn’t counted! How can I appeal?** - -Expensify reserves the right to modify the terms of the referral program at any time, and pays out referral bonuses for eligible companies at its own discretion. - -Please send a message to concierge@expensify.com with the billing owner of the company you have referred and our team will review the referral and get back to you. - -- **Where can I find my referral link?** - -Expensify members who are opted-in for our newsletters will have received an email containing their unique referral link. - -On the mobile app, go to **Settings** > **Invite a Friend** > **Share Invite Link** to retrieve your referral link. diff --git a/docs/articles/other/Your-Expensify-Account-Manager.md b/docs/articles/other/Your-Expensify-Account-Manager.md deleted file mode 100644 index 70e0435e00e1..000000000000 --- a/docs/articles/other/Your-Expensify-Account-Manager.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Your Expensify Account Manager -description: Everything you need to know about Having an Expensify account manager ---- - - - -# What is an account manager? -An account manager is a dedicated point of contact to support policy admins with questions about their Expensify account. They are available to help you and other policy admins review your account, advise on best practices, and make changes to your policy on your behalf whenever you need a hand. They will actively monitor open technical issues and be proactive with recommendations to increase efficiency and minimize time spent on expense management. - -Unlike Concierge, an account manager’s support will not be real-time, 24 hours a day. A benefit of Concierge is that you get real-time support every day. Your account manager will be super responsive when online, but anything sent when they’re offline will not be responded to until they’re online again. - -For real-time responses and simple troubleshooting issues, you can always message our general support by writing to Concierge via the in-product chat or by emailing concierge@expensify.com. - -# How do I know if I have an account manager? -If you are a policy admin or domain admin, you will also hear from your account manager as soon as one gets assigned to your company. If you'd like a reminder who your account manager is, just click the Support link on the left side of Expensify - you'll see your account manager's name and photo, with an option to contact them for help. - -## How do I contact my account manager? -We make it easy to contact your account manager: - -1. Log in to your Expensify account, click "Support" along the left side of the page, and click the “Account Manager” option -2. Reply to (or click the chat link on) any email you get from your account manager -3. Sign in to new.expensify.com and go to the #admins room for any of your policies. Your account manager is in your #admin rooms ready to help you, so you can ask for help here and your account manager will respond in the chat. - -# FAQs -## Who gets an account manager? -Every customer with 10 or more paid subscribers is automatically assigned a dedicated account manager. If you have fewer than 10 active users each month, you can still get an account manager by increasing your subscription to 10 or more users, To get assigned an account manager immediately, log into your Expensify account and go to Settings > Policies > Group, then click Subscription and increase your subscription size to 10 or more. - -## How do I know if my account manager is online? -You will be able to see if they are online via their status, which will either say something like “online” or have their working hours. - -## What if I’m unable to reach my account manager? -If for some reason, you’re unable to reach your account manager, perhaps because they’re offline, then you can always reach out to Concierge for assistance. Your account manager will always get back to you when they’re online again. - -## Can I get on a call with my account manager? -Of course! You can ask your account manager to schedule a call whenever you think one might be helpful. We usually find that the most effective calls are those that deal with general setup questions. For technical troubleshooting, we typically recommend chat as that allows your account manager time to look into the issue, test things on their end, and, if needed, consult the wider Expensify technical team. It also allows you to easily refer back to instructions and links. diff --git a/docs/articles/other/Your-Expensify-Partner-Manager.md b/docs/articles/other/Your-Expensify-Partner-Manager.md deleted file mode 100644 index 9a68fbfd8b39..000000000000 --- a/docs/articles/other/Your-Expensify-Partner-Manager.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Your Expensify Partner Manager -description: Everything you need to know about your Expensify Partner Manager ---- - - -# What is a Partner Manager? -A Partner Manager is a dedicated point of contact to support our ExpensifyApproved! Accountants with questions about their Expensify account. Partner Managers support our accounting partners by providing recommendations for client's accounts, assisting with firm-wide training, and ensuring partners receive the full benefits of our partnership program. They will actively monitor open technical issues and be proactive with recommendations to increase efficiency and minimize time spent on expense management. - -Unlike Concierge, a Partner Manager’s support will not be real-time, 24 hours a day. A benefit of Concierge is that you get real-time support every day. Your partner manager will be super responsive when online, but anything sent when they’re offline will not be responded to until they’re online again. - -For real-time responses and simple troubleshooting issues, you can always message our general support by writing to Concierge via the in-product chat or by emailing concierge@expensify.com. - -# How do I know if I have a Partner Manager? -For your firm to be assigned a Partner Manager, you must complete the [ExpensifyApproved! University](https://use.expensify.com/accountants) training course. Every external accountant or bookkeeper who completes the training is automatically enrolled in our program and receives all the benefits, including access to the Partner Manager. So everyone at your firm must complete the training to receive the maximum benefit. - -You can check to see if you’ve completed the course and enrolled in the ExpensifyApproved! Accountants program simply by logging into your Expensify account. In the bottom left-hand corner of the website, you will see the ExpensifyApproved! logo. - -# How do I contact my Partner Manager? -You can contact your Partner Manager by: -- Signing in to new.expensify.com and searching for your Partner Manager -- Replying to or clicking the chat link on any email you get from your Partner Manager - -# FAQs -## How do I know if my Partner Manager is online? -You will be able to see if they are online via their status in new.expensify.com, which will either say “online” or have their working hours. - -## What if I’m unable to reach my Partner Manager? -If you’re unable to contact your Partner Manager (i.e., they're out of office for the day) you can reach out to Concierge for assistance. Your Partner Manager will get back to you when they’re online again. - -## Can I get on a call with my Partner Manager? -Of course! You can ask your Partner Manager to schedule a call whenever you think one might be helpful. Partner Managers can discuss client onboarding strategies, firm wide training, and client setups. - -We recommend continuing to work with Concierge for **general support questions**, as this team is always online and available to help immediately. From 8a3f8292db2b828768f36b8e985f75cf79454529 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 15:51:22 +0530 Subject: [PATCH 28/55] delete existing articles --- ...Expensify-Chat-Playbook-for-Conferences.md | 93 ------ ...ok-for-Small-to-Medium-Sized-Businesses.md | 283 ------------------ ...book-for-US-Based-Bootstrapped-Startups.md | 91 ------ ...laybook-for-US-based-VC-Backed-Startups.md | 208 ------------- 4 files changed, 675 deletions(-) delete mode 100644 docs/articles/playbooks/Expensify-Chat-Playbook-for-Conferences.md delete mode 100644 docs/articles/playbooks/Expensify-Playbook-for-Small-to-Medium-Sized-Businesses.md delete mode 100644 docs/articles/playbooks/Expensify-Playbook-for-US-Based-Bootstrapped-Startups.md delete mode 100644 docs/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups.md diff --git a/docs/articles/playbooks/Expensify-Chat-Playbook-for-Conferences.md b/docs/articles/playbooks/Expensify-Chat-Playbook-for-Conferences.md deleted file mode 100644 index 8f806bb03146..000000000000 --- a/docs/articles/playbooks/Expensify-Chat-Playbook-for-Conferences.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Expensify Chat Playbook for Conferences -description: Best practices for how to deploy Expensify Chat for your conference ---- -## Overview -To help make setting up Expensify Chat for your event and your attendees super simple, we’ve created a guide for all of the technical setup details. - -## Who you are -As a conference organizer, you’re expected to amaze and inspire attendees. You want attendees to get to the right place on time, engage with the speakers, and create relationships with each other that last long after the conference is done. Enter Expensify Chat, a free feature that allows attendees to interact with organizers and other attendees in realtime. With Expensify Chat, you can: - -- Communicate logistics and key information -- Foster conference wide attendee networking -- Organize conversations by topic and audience -- Continue conversations long after the event itself -- Digitize attendee social interaction -- Create an inclusive environment for virtual attendees - -Sounds good? Great! In order to ensure your team, your speakers, and your attendees have the best experience possible, we’ve created a guide on how to use Expensify Chat at your event. - -*Let’s get started!* - - -## Support -Connect with your dedicated account manager in any new.expensify.com #admins room. Your account manager is excited to brainstorm the best ways to make the most out of your event and work through any questions you have about the setup steps below. - -We also have a number of [moderation tools](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) available to admins to help make sure your event is seamless, safe, and fun! - -## Step by step instructions for setting up your conference on Expensify Chat -Based on our experience running conferences atop Expensify Chat, we recommend the following simple steps: - -### Step 1: Create your event workspace in Expensify -To create your event workspace in Expensify: -1. In [new.expensify.com](https://new.expensify.com): “+” > “New workspace” -1. Name the workspace (e.g. “ExpensiCon”) - -### Step 2: Set up all the Expensify Chat rooms you want to feature at your event -**Protip**: Your Expensify account manager can complete this step with you. Chat them in #admins on new.expensify.com to coordinate! - -To create a new chat room: -1. Go to [new.expensify.com](https://new.expensify.com) -1. Go to “+” > New room -1. Name the room (e.g. “#social”) -1. Select the workspace created in step 1 -1. Select “Public” visibility -1. Repeat for each room - -For an easy-to-follow event, we recommend creating these chat rooms: - -- **#social** - This room will include all attendees, speakers, and members of your organizing team. You can use this room to discuss social events, happy hours, dinners, or encourage attendees to mingle, share photos and connect. -- **#announcements** - This room will be used as your main announcement channel, and should only be used by organizers to announce schedule updates or anything important that your attendees need to know. Everyone in your policy will be invited to this channel, but chatting in here isn’t encouraged so to keep the noise to a minimum. -- **Create an individual room for each session** - Attendees will be able to engage with the speaker/session leader and can ask questions about their content either before/during/after the session. -- **Create a room with your Expensify account manager/s** - We can use this room to coordinate using Expensify Chat before, during, and after the event. - -**Protip** Check out our [moderation tools](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) to help flag comments deemed to be spam, inconsiderate, intimidating, bullying, harassment, assault. On any comment just click the flag icon to moderate conversation. - -### Step 3: Add chat room QR codes to the applicable session slide deck -Gather QR codes: -1. Go to [new.expensify.com](https://new.expensify.com) -1. Click into a room and click the room name or avatar in the top header -1. Go into Share Code -1. Screenshot the QR code to add to your deck - -Add the QR code to every slide so that if folks forget to scan the QR code at the beginning of the presentation, they can still join the discussion. - -### Step 4: Plan out your messaging and cadence before the event begins -Expensify Chat is a great place to provide updates leading up to your event -- share news, get folks excited about speakers, and let attendees know of crucial event information like recommended attire, travel info, and more. For example, you might consider: - -**Prep your announcements:** -- Create a document containing drafts of the key messages you intend to send throughout the day. -- If your event's agenda is broken up into hourly blocks, create a separate section for each hour of the event, to make it easy to find the correct section at the right time. -- Start each day with a review of the daily agenda, such as a bullet list summarizing what's happening hour by hour. - -**Post your updates:** -- Designate a team member to post each update in #announce at the designated time. -- Each hour, send a message listing exactly what is happening next – if there are multiple sessions happening simultaneously, list out each, along with a description of the session, a reminder of where it's located, and (most importantly) a link to the chat room for that session -- Write the messages in [markdown format](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text), such that they can be copy/pasted directly into Expensify Chat for sending. - - If there is some formatting issue upon posting, no problem: just edit the comment after sending, and it'll be fixed for everyone. -- We’d also recommend posting your updates on new lines so that if someone has a question about a certain item they can ask in a thread pertaining to that topic, rather than in one consolidated block. - -**Protip**: Your account manager can help you create this document, and would be happy to send each message at the appointed time for you. - -### Step 5: Share Expensify Chat How-To Resources with Speakers, Attendees, Admins -We’ve created a few helpful best practice docs for your speakers, admins, and attendees to help navigate using Expensify Chat at your event. Feel free to share the links below with them! - -- [Expensify Chat for Conference Attendees](https://help.expensify.com/articles/other/Expensify-Chat-For-Conference-Attendees) -- [Expensify Chat for Conference Speakers](https://help.expensify.com/articles/other/Expensify-Chat-For-Conference-Speakers) -- [Expensify Chat for Admins](https://help.expensify.com/articles/other/Expensify-Chat-For-Admins) - -### Step 6: Follow up with attendees after the event -Continue the connections by using Expensify Chat to keep your conference community connected. Encourage attendees to share photos, their favorite memories, funny stories, and more. - -## Conclusion -Once you have completed the above steps you are ready to host your conference on Expensify Chat! Let your account manager know any questions you have over in your [new.expensify.com](https://new.expensify.com) #admins room and start driving activity in your Expensify Chat rooms. Once you’ve reviewed this doc you should have the foundations in place, so a great next step is to start training your speakers on how to use Expensify Chat for their sessions. Coordinate with your account manager to make sure everything goes smoothly! diff --git a/docs/articles/playbooks/Expensify-Playbook-for-Small-to-Medium-Sized-Businesses.md b/docs/articles/playbooks/Expensify-Playbook-for-Small-to-Medium-Sized-Businesses.md deleted file mode 100644 index a4004dbe1b88..000000000000 --- a/docs/articles/playbooks/Expensify-Playbook-for-Small-to-Medium-Sized-Businesses.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -title: Expensify Playbook for Small to Medium-Sized Businesses -description: Best practices for how to deploy Expensify for your business ---- -## Overview -This guide provides practical tips and recommendations for small businesses with 100 to 250 employees to effectively use Expensify to improve spend visibility, facilitate employee reimbursements, and reduce the risk of fraudulent expenses. - -- See our [US-based VC-Backed Startups](https://help.expensify.com/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups) if you are more concerned with top-line revenue growth - -## Who you are -As a small to medium-sized business owner, your main aim is to achieve success and grow your business. To achieve your goals, it is crucial that you make worthwhile investments in both your workforce and your business processes. This means providing your employees with the resources they need to generate revenue effectively, while also adopting measures to guarantee that expenses are compliant. - -## Step-by-step instructions for setting up Expensify -This playbook is built on best practices we’ve developed after processing expenses for tens of thousands of companies around the world. As such, use this playbook as your starting point, knowing that you can customize Expensify to suit your business needs. Every company is different, and your dedicated Setup Specialist is always one chat away with any questions you may have. - -### Step 1: Create your Expensify account -If you don't already have one, go to *[new.expensify.com](https://new.expensify.com)* and sign up for an account with your work email address. The account is free so don’t worry about the cost at this stage. - -> _Employees really appreciate how easy it is to use, and the fact that the reimbursement drops right into their bank account. Since most employees are submitting expenses from their phones, the ease of use of the app is critical_ -> -> **Robyn Gresham** -> Senior Accounting Systems Manager at SunCommon - -### Step 2: Create a Control Policy -There are three policy types, but for your small business needs we recommend the *Control Plan* for the following reasons: - -- *The Control Plan* is designed for organizations with a high volume of employee expense submissions, who also rely on compliance controls -- The ease of use and mobile-first design of the Control plan can increase employee adoption and participation, leading to better expense tracking and management. -- The plan integrates with a variety of tools, including accounting software and payroll systems, providing a seamless and integrated experience -- Accounting integrations include QuickBooks Online, Xero, NetSuite, and Sage Intacct, with indirect support from Microsoft Dynamics and any other accounting solution you work with - -We recommend creating one single policy for your US entity. This allows you to centrally manage all employees in one “group” while enforcing compliance controls and syncing with your accounting package accordingly. - -To create your Control Policy: - -1. Go to *Settings > Policies* -2. Select *Group* and click the button that says *New Policy* -3. Click *Select* under Control - -The Control Plan also gives you access to a dedicated Setup Specialist. You can find yours by looking at your policy's *#admins* room in *[new.expensify.com](https://new.expensify.com)*, and in your company’s policy settings in the *Overview* tab, where you can chat with them and schedule an onboarding call to walk through any setup questions. The Control Plan bundled with the Expensify Card is only *$9 per user per month* (not taking into account cash back your earn) when you commit annually. That’s a 75% discount off the unbundled price point if you choose to use a different Corporate Card (or no) provider. - -### Step 3: Connect your accounting system -As a small to medium-sized business, it's important to maintain proper spend management to ensure the success and stability of your organization. This requires paying close attention to your expenses, streamlining your financial processes, and making sure that your financial information is accurate, compliant, and transparent. Include best practices such as: - -- Every purchase is categorized into the correct account in your chart of accounts -- Receipts are sent to the accounting package to ensure visibility across the organization and to auditors -- Every expense is accounted for and added to your accounting system on time for your monthly accounts reconciliation. - -You do this by synchronizing Expensify and your accounting package as follows: - -1. Click *Settings > Policies* -2. Navigate to the *Connections* tab -3. Select your accounting system -4. Follow the prompts to connect your accounting package - -Check out the links below for more information on how to connect to your accounting solution: -- *[QuickBooks Online](https://community.expensify.com/discussion/4833/how-to-connect-your-policy-to-quickbooks-online)* -- *[Xero](https://community.expensify.com/discussion/5282/how-to-connect-your-policy-to-xero)* -- *[NetSuite](https://community.expensify.com/discussion/5212/how-to-connect-your-policy-to-netsuite-token-based-authentication)* -- *[Sage Intacct](https://community.expensify.com/discussion/4777/how-to-connect-to-sage-intacct-user-based-permissions-expense-reports)* -- *[Other Accounting System](https://community.expensify.com/discussion/5271/how-to-set-up-an-indirect-accounting-integration) - - -*“Employees really appreciate how easy it is to use, and the fact that the reimbursement drops right into their bank account. Since most employees are submitting expenses from their phones, the ease of use of the app is critical.”* -- Robyn Gresham, Senior Accounting Systems Manager at SunCommon - -### Step 4: Set category-specific compliance controls -Head over to the *Categories* tab to set compliance controls on your newly imported list of categories. More specifically, we recommend the following: - -1. First, enable *People Must Categorize Expenses*. Employees must select a category for each expense, otherwise, in most cases, it’s more work on you and our accounting connections will simply reject any attempt to export. -2. For more high-risk, travel-related categories, we recommend setting more strict compliance controls. For example, “Meals & Entertainment” should be set with the following: - - Receipts Required - - Descriptions Required, with Description Hints set - - Travel: “What is the business purpose of this expense?” - - Meals: “Could you share the business purpose, and tag attendees?” - - Entertainment: “Could you share the business purpose, and tag attendees?” -3. Disable any irrelevant expense categories that aren’t associated with employee spend -4. Configure *auto-categorization*, located just below your category list in the same tab. The section is titled *Default Categories*. Just find the right category, and match it with the presented category groups to allow for MCC (merchant category code) automated category selection with every imported connected card transaction. - -### Step 5: Make sure tags are required, or defaults are set -Tags in Expensify often relate to departments, projects/customers, classes, and so on. And in some cases they are *required* to be selected on every transactions. And in others, something like *departments* is a static field, meaning we could set it as an employee default and not enforce the tag selection with each expense. - -*Make Tags Required* -In the tags tab in your policy settings, you’ll notice the option to enable the “Required” field. This makes it so any time an employee doesn’t assign a tag to an expense, we’ll flag a violation on it and notify both the employee and the approver. - -- *Note:* In general, we take prior selection into account, so anytime you select a tag in Expensify, we’ll pre-populate that same field for any subsequent expense. It’s completely interchangeable, and there for convenience. - -*Set Tags as an Employee Default* -Separately, if your policy is connected to NetSuite or Sage Intacct, you can set departments, for example, as an employee default. All that means is we’ll apply the department (for example) that’s assigned to the employee record in your accounting package and apply that to every exported transaction, eliminating the need for the employee to have to manually select a department for each expense. - -### Step 6: Set rules for all expenses regardless of categorization -In the Expenses tab in your group Control policy, you’ll notice a *Violations* section designed to enforce top-level compliance controls that apply to every expense, for every employee in your policy. We recommend the following confiuration: - -*Max Expense Age: 90 days (or leave it blank)* -This will enable Expensify to catch employee reimbursement requests that are far too outdated for reimbursement, and present them as a violations. If you’d prefer a different time window, you can edit it accordingly - -*Max Expense Amount: $2,000 (or leave it blank)* -This is essentially like setting a daily or individual expense limitation on any employee, regardless of whether the transaction is reimbursable or non-reimbursable.This rule will enables Expensify to present larger expenses with a violation to notify both the submitter and approvers. - -*Receipt Required Amount: $75* -Receipts are important, and in most cases you prefer an itemized receipt. However, Expensify will generate an IRS-compliant electronic receipt (not itemized) for every expense not tied to hotels expense. For this reason, it’s important to enforce a rule where anytime an employee is on the road, and making business-related purchases at hotel (which happens a lot!), they are required to attach a physical receipt. - -![Expense Basics](https://help.expensify.com/assets/images/playbook-expense-basics.png){:width="100%"} - -At this point, you’ve set enough compliance controls around categorical spend and general expenses for all employees, such that you can put trust in our solution to audit all expenses up front so you don’t have to. Next, let’s dive into how we can comfortably take on more automation, while relying on compliance controls to capture bad behavior (or better yet, instill best practices in our employees). - -### Step 7: Set up scheduled submit -For an efficient company, we recommend setting up [Scheduled Submit](https://community.expensify.com/discussion/4476/how-to-enable-scheduled-submit-for-a-group-policy) on a *Daily* frequency: - -- Click *Settings > Policies* -- From here, select your group collect policy -- Within your policy settings, select the *Reports* tab -- You’ll notice *Scheduled Submit* is located directly under *Report Basics* -- Choose *Daily* - -Between Expensify's SmartScan technology, automatic categorization, and [DoubleCheck](https://community.expensify.com/discussion/5738/deep-dive-how-does-concierge-receipt-audit-work) features, your employees shouldn't need to do anything more than swipe their Expensify Card or take a photo of their receipt. - -Expenses with violations will stay behind for the employee to fix, while expenses that are “in-policy” will move into an approver’s queue to mitigate any potential for delays. Scheduled Submit will ensure all expenses are submitted automatically for approval. - -![Scheduled submit](https://help.expensify.com/assets/images/playbook-scheduled-submit.png){:width="100%"} - -> _We spent twice as much time and effort on expenses without getting nearly as accurate of results as with Expensify._ -> -> Kevin Valuska -> AP/AR at Road Trippers - -### Step 8: Connect your business bank account (US only) -If you’re located in the US, you can utilize Expensify’s payment processing and reimbursement features. - -*Note:* Before you begin, you’ll need the following to validate your business bank account: - -1. Your bank account credentials -2. A form of ID (a driver’s license or passport) -3. Your business tax ID number, your business’ address and your website URL - -Let’s walk through the process of linking your business bank account: - -1. Go to *Settings > Account*, and select the *Payments* tab -2. Select *Add Verified Bank Account* -3. From here, we’ll ask you to use your online banking credentials to connect to your bank (Note that this must be the account owner or admin credentials) -- Alternatively, you can go the more manual route by selecting “Connect Manually” -4. Once that’s done, we’ll collect all of the necessary information on your business, such as your legal business name and address -5. We’ll then collect your personal information, and a photo ID to confirm your identity - -You only need to do this once: you are fully set up for not only reimbursing expense reports, but issuing Expensify Cards, collecting customer invoice payments online (if applicable), as well as paying supplier bills online. - -### Step 9: Invite employees and set an approval workflow -*Select an Approval Mode* -We recommend you select *Advanced Approval* as your Approval Mode to set up a middle-management layer of a approval. If you have a single layer of approval, we recommend selecting [Submit & Approve](https://community.expensify.com/discussion/5643/deep-dive-submit-and-approve). But if *Advanced Approval* if your jam, keep reading! - -*Import your employees in bulk via CSV* -Given the amount of employees you have, it’s best you import employees in bulk via CSV. You can learn more about using a CSV file to bulk upload employees with *Advanced Approval [here](https://community.expensify.com/discussion/5735/deep-dive-the-ins-and-outs-of-advanced-approval)* - -![Bulk import your employees](https://help.expensify.com/assets/images/playbook-impoort-employees.png){:width="100%"} - -*Manually Approve All Reports* -In most cases, at this stage, approvers prefer to review all expenses for a few reasons. 1) We want to make sure expense coding is accurate, and 2) We want to make sure there are no bad actors before we export transactions to our accounting system. - -In this case we recommend setting *Manually approve all expenses over: $0* - -### Step 10: Configure Auto-Approval -Knowing you have all the control you need to review reports, we recommend configuring auto-approval for *all reports*. Why? Because you’ve already put reports through an entire approval workflow, and manually triggering reimbursement is an unnecessary action at this stage. - -1. Navigate to *Settings > Policies > Group > [Policy Name] > Reimbursement* -2. Set your *Manual Reimbursement threshold to $20,0000* - -### Step 11: Enable Domains and set up your corporate card feed for employees -Expensify is optimized to work with corporate cards from all banks – or even better, use our own perfectly integrated *[Expensify Card](https://use.expensify.com/company-credit-card)*. The first step for connecting to any bank you use for corporate cards, and the Expensify Card is to validate your company’s domain in Domain settings. - -To do this: - -- Click *Settings* -- Then select *Domains* - -#### If you have an existing corporate card -Expensify supports direct card feeds from most financial institutions. Setting up a corporate card feed will pull in the transactions from the connected cards on a daily basis. To set this up, do the following: - -1. Go to *Company Cards >* Select your bank - - If you don’t see your financial institution in the list of banks we support, you can review an alternative solution in the Feature Deep Dives section below -2. Next, enter your bank account login credentials. - - To successfully connect to your bank, we’ll need the *master admin (primary) account* login credentials. -3. Next, assign the corporate cards to your employees by selecting the employee’s email address and the corresponding card number from the two drop-down menus under the *Assign a Card* section -4. Set a transaction start date (this is really important to avoid pulling in multiple outdated historical expenses that you don’t want employees to submit) - -![If you have existing corporate cards](https://help.expensify.com/assets/images/playbook-existing-corporate-card.png){:width="100%"} - -As mentioned above, we’ll be able to pull in transactions as they post (daily) and handle receipt matching for you and your employees. One benefit of the Expensify Card for your company is being able to see transactions at the point of purchase which provides you with real-time compliance. We even send users push notifications to SmartScan their receipt when it’s required and generate IRS-compliant e-receipts as a backup wherever applicable. - -#### If you don't have a corporate card, use the Expensify Card (US only) -Expensify provides a corporate card with the following features: - -- Up to 2% cash back (up to 4% in your first 3 months!) -- [SmartLimits](https://community.expensify.com/discussion/4851/deep-dive-what-are-unapproved-expense-limits#latest) to control what each individual cardholder can spend -- A stable, unbreakable real-time connection (third-party bank feeds can run into connectivity issues) -- Receipt compliance - informing notifications (eg. add a receipt!) for users *as soon as the card is swiped* -- A 50% discount on the price of all Expensify plans -- Multiple discounts and savings on a host of partner tech suppliers -- Good Karma - 10% of all card interchange we earn goes directly to the Expensify.org Social Justice Community funds - -The Expensify Card is recommended as the most efficient way to manage your company's spending. - -Here’s how to enable it: - -1. There are *two ways* you can [apply for the Expensify Card](https://community.expensify.com/discussion/4874/how-to-apply-for-the-expensify-card) - - *Via your Inbox* - - *Via Domain Settings* - Go to Settings > Domain > Company Cards > Enable Expensify Card -2. Assign the cards to your employees -3. Set *SmartLimits*: - - *Employees* - We recommend a low limit for most employees, roughly double the size of the maximum daily spend – such as $1000. - - *Execs* - We recommend a higher limit for executives, roughly 10x the limit of a non-executive employee (eg, $10,000). - -Once the Expensify Cards have been assigned, each employee will be prompted to enter their mailing address so they can receive their physical card. In the meantime, a virtual card will be ready to use immediately. - -If you have an accounting system we directly integrate with, check out how we take automation a step further with [Continuous Reconciliation](https://community.expensify.com/discussion/7335/faq-what-is-the-expensify-card-auto-reconciliation-process). We’ll create an Expensify Card clearing and liability account for you. Each time settlement occurs, we’ll take the total amount of your purchases and create a journal entry that credits the settlement account and debits the liability account - saving you hours of manual reconciliation work at the end of your statement period. - -### Step 12: Set up Bill Pay and Invoicing -As a small business, managing bills and invoices can be a complex and time-consuming task. Whether you receive bills from vendors or need to invoice clients, it's important to have a solution that makes the process simple, efficient, and cost-effective. - -Here are some of the key benefits of using Expensify for bill payments and invoicing: -- Flexible payment options: Expensify allows you to pay your bills via ACH, credit card, or check, so you can choose the option that works best for you (US businesses only). -- Free, No Fees: The bill pay and invoicing features come included with every policy and workspace, so you won't need to pay any additional fees. -- Integration with your business bank account: With your business bank account verified, you can easily link your finances to receive payment from customers when invoices are paid. - -Let’s first chat through how Bill Pay works - -1. Have your vendors send their invoices to yourdomain.com@expensify.cash. -- This email address comes with every account, so no need to activate it anywhere. -2. Once the invoicehas been received, we’ll create a bill to pay for your review directly in Expensify -3. At the top of the bill, you’ll notice a Pay button. Once you click that, you’ll see options including ACH, credit/debit card, along with mailing a physical check. - -Similarly, you can send bills directly from Expensify as well. - -1. From the *Reports* tab, select the down arrow next to *New Report* and select *Bill* -2. Next, enter the Supplier’s email address, the Merchant name, the total amount, and the date -3. At this point, you can also upload an attachment to further validate the bill if necessary -4. Click *Submit*, we’ll forward the newly created bill directly to your Supplier. - -![Send bills directly from Expensify](https://help.expensify.com/assets/images/playbook-new-bill.png){:width="100%"} - -Reports, invoices, and bills are largely the same, in theory, just with different rules. As such, creating a customer invoice is just like creating an expense report and even a bill. - -1. From the *Reports* tab, select the down arrow next to *New Report* and select *Invoice*. -2. Add all of the expenses/transactions tied to the Invoice -3. Enter the recipient’s email address, a memo if needed, and a due date for when it needs to get paid, and click *Send* - -You’ll notice it’s a slightly different flow from creating a Bill. Here, you are adding the transactions tied to the Invoice, and establishing a due date for when it needs to get paid. If you need to apply any markups, you can do so from your policy settings under the Invoices tab. Your customers can pay their invoice in Expensify via ACH, or Check, or Credit Card. - -### Step 13: Run monthly, quarterly and annual reporting -At this stage, reporting is important and given that Expensify is the primary point of entry for all employee spend, we make reporting visually appealing and wildly customizable. - -1. Head to the *Expenses* tab on the far left of your left-hand navigation -2. Select the pie chart icon on the right top right corner -3. Configure the filters to your preference - -We recommend reporting: - -- *Monthly* - for spend analysis on your GLs, active projects and department spend -- *Quarterly* - for budget comparison reporting. Pull up your BI tool and compare your active budgets with your spend reporting here in Expensify -- *Annually* - Run annual spend trend reports with month-over-month spend analysis, and prepare yourself for the upcoming fiscal year. - -![Expenses!](https://help.expensify.com/assets/images/playbook-expenses.png){:width="100%"} - -### Step 14: Set your Subscription Size and Add a Payment card -Our pricing model is unique in the sense that you are in full control of your billing. Meaning, you have the ability to set a minimum number of employees you know will be active each month and you can choose which level of commitment fits best. We recommend setting your subscription to *Annual* to get an additional 50% off on your monthly Expensify bill. In the end, you've spent enough time getting your company fully set up with Expensify, and you've seen how well it supports you and your employees. Committing annually just makes sense. - -To set your subscription, head to: - -1. Settings > Policies -2. Select *Group* -3. Scroll down to *Subscription* -4. Select *Annual Subscription* -5. Enter the number of employees you know will be active each month -6. Enable *Auto-Renew* and *Auto-Increase Subscription Size* - -Now that we’ve gone through all of the steps for setting up your account, let’s make it official so there are no interruptions in service as your employees begin using Expensify. We handle payments for our service via a paymentcard, and to add one: - -1. Go to *Account > Settings > Payments* -2. Select *Add Payment Card* -3. Enter your name, card number, postal code, expiration and CVV -4. Click *Accept Terms* - -## You’re all set! -Congrats, you are all set up! If you need any assistance with anything mentioned above or would like to understand other features available in Expensify, reach out to your Setup Specialist directly in *[new.expensify.com](https://new.expensify.com)*. Don’t have one yet? Create a Control Policy, and we’ll automatically assign a dedicated Setup Specialist to you. diff --git a/docs/articles/playbooks/Expensify-Playbook-for-US-Based-Bootstrapped-Startups.md b/docs/articles/playbooks/Expensify-Playbook-for-US-Based-Bootstrapped-Startups.md deleted file mode 100644 index 089ad16834ac..000000000000 --- a/docs/articles/playbooks/Expensify-Playbook-for-US-Based-Bootstrapped-Startups.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Expensify Playbook for US-Based Bootstrapped Startups -description: Best practices for how to deploy Expensify for your business ---- - -This playbook details best practices on how Bootstrapped Startups with less than 5 employees can use Expensify to prioritize product development while capturing business-related receipts for future reimbursement. -- See our *[Playbook for VC-Backed Startups](https://help.expensify.com/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups)* if you have taken venture capital investment and are more concerned with prioritizing top-line revenue growth than achieving near-term profitability -- See our *[Playbook for Small to Medium-Sized Businesses](https://help.expensify.com/articles/playbooks/Expensify-Playbook-for-Small-to-Medium-Sized-Businesses)* if you are more concerned with maintaining profitability than growing top-line revenue. - -# Who you are -As a bootstrapped startup, you have surrounded yourself with a small handful of people you trust, and are focused on developing your concept to officially launch and possibly take to outside investors. You are likely running your business with your own money, and possibly a small amount of funding from friends and family. You are either paying yourself a little, or not at all, but at this stage, the company isn’t profitable. And for now, you are capturing receipts so that you can reimburse yourself for startup costs when you either take on investment or start to turn a profit. - -# Step-by-step instructions for setting up Expensify -This playbook is built based on best practices we’ve developed after processing expenses for tens of thousands of companies around the world. As such, use this playbook as your starting point, knowing that you can customize Expensify to suit your business needs. Every company is different, and we’re always one chat away with any questions you may have. - -## Step 1: Create your Expensify account -If you don't already have one, go to *[new.expensify.com](https://new.expensify.com)* and sign up for an account with your business email address. - -## Step 2: Create a Free Plan Workspace -There are three plans (Free, Collect, and Control), but for your needs, we recommend the *Free Plan* for the following reasons: - -- You are looking to capture receipts, but you don’t need to submit expenses to anyone for approval or reimbursement -- You are a small, highly collaborative group and project-oriented Chat functionality can help you stay organized -- When your business produces enough cash that you can pay yourself, you might want to reimburse yourself for the expenses you’ve captured - -To create your Free Plan Workspace: - -1. Go to *[new.expensify.com](https://new.expensify.com)* -2. Select *New Workspace* -3. Select the avatar in the top left corner -4. Click on the workspace name and rename it -5. Express yourself by adding an avatar image, preferably an image of yourself - -The Free Plan also gives you direct access to lightning-fast 24/7 support via Concierge. Within *[new.expensify.com](https://new.expensify.com/concierge)*, you can start a direct message (DM) with Concierge anytime. - -## Step 3: Invite Your Team -As a bootstrapped startup, you communicate with your team all day. Similarly, if you are a co-founder, you will have multiple people that will need to capture receipts for your project. - -1. Click on your avatar -2. Select *Workspaces* -3. Click on your workspace -4. Select *Members* -5. Click *Invite*, and enter each team member’s email address - -By inviting your team, all members of your team will have access to unlimited receipt capture via SmartScan, and you’ll all have access to our free chat tool, which makes it easy to chat about your project and the expenses you’ve captured to help accelerate your project. - -## Step 4: Link Your Business Bank Account (Optional) -If you have a business bank account at this stage, congrats! You might be better suited to check out our Seed Stage playbook. If you are located in the US, you can unlock many great features by linking your US-based business bank account such as paying bills via Expensify, along with the Expensify Card. - -Here’s how to set it up: - -1. Click on your *avatar* -2. Select *Workspaces* -3. Click on your workspace name -4. At the bottom, select *Bank account* -5. Select your bank and enter your online login credentials - -Once this is done, you are all set to begin the process of enabling the Expensify Card. Not just for you, but if you have a co-founder, you can also issue them a card. - -## Step 5: Get the Expensify Card -If you linked your business bank account in the previous step, you are immediately eligible for the Expensify Card. The Expensify Card is included with your Free Plan workspace, it earns you up to 2% cash back (up to 4% in your first 3 months!), and they are all stored in your team’s workspace. It’s easy to apply and it takes minutes! - -Here’s how to enable the Expensify Card: - -1. Click on your *avatar* -2. Select *Workspaces* -3. Click on your workspace -4. Select *Cards* -5. Next, you’ll be redirected to expensify.com -6. Set a SmartLimit > $0 -7. We’ll also ask you for your mailing address to send you a physical Expensify Card - -You’ll be issued a virtual card that you can use immediately, however, in 1-3 business days your Expensify Card will arrive. You can use the Expensify Card anywhere Visa is accepted. - -## Step 6: View and Pay Bills -Whether it’s online services or vendors you work with to grow your project, you likely have bills to pay. And now that you have your business bank account linked, you can easily pay bills directly from Expensify. Seeing as these are project-related expenses, we’ll capture them for you for future reference directly within your project’s workspace. - -There’s no actual setup required. Your free plan comes with a _yourdomain.com@expensify.com_ email address. Just have all of your vendors send bills to that email address. - -To view and pay bills: - -1. Click on your *avatar* -2. Select *Workspaces* -3. Click on your workspace -4. Select *Bills* - -When you have bills to pay you can click *View all bills* under the *Manage your bills* box and we’ll keep a neatly organized list of all of the bills you can pay via ACH directly from your Expensify account. - -# You’re all set! -Congrats, you are all set up! If you need any assistance with anything mentioned above, reach out to either your Concierge directly in *[new.expensify.com](https://new.expensify.com/concierge)*, or email concierge@expensify.com. Create a Collect or Control Policy, and we’ll automatically assign a dedicated Setup Specialist to you. - diff --git a/docs/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups.md b/docs/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups.md deleted file mode 100644 index 501d2f1538ef..000000000000 --- a/docs/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups.md +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: Expensify Playbook for US-Based VC-Backed Startups -description: Best practices for how to deploy Expensify for your business ---- -This playbook details best practices on how Seed to Series A startups with under 100 employees can use Expensify to prioritize top-line revenue growth while managing spend responsibly. - -- See our Playbook for Bootstrapped Businesses if you haven't taken any VC money yet. -- See our Playbook for Small Businesses if you are more concerned with maintaining profitability than growing top-line revenue. [Coming soon…] -- See our Playbook for Midsize Businesses if you are series B or beyond, or have more than 100 employees. [Coming soon…] - -# Who you are -As a VC-backed business focused on growth and efficiency, you are looking for a product that puts smart automation in your hands. You prioritize top-line revenue growth over cash conservation, understanding that you’ll need to spend in order to grow. As a result, you want to enable your employees by putting spending power in their hands responsibly so there are appropriate compliance controls in place that scale with the business growth. Not only that, you want to decrease the amount of time you spend at the end of each month reimbursing employees, reconciling spend, and closing your books. - -# Step-by-step instructions for setting up Expensify -This playbook is built based on best practices we’ve developed after processing expenses for tens of thousands of companies around the world. As such, use this playbook as your starting point, knowing that you can customize Expensify to suit your business needs. Every company is different, and we’re always one chat away with any questions you may have. - -## Step 1: Create your Expensify account -If you don't already have one, go to *[new.expensify.com](https://new.expensify.com)* and sign up for an account with your work email address. The account is free so don’t worry about the cost at this stage. - -## Step 2: Create a Control Policy -There are three policy types, but for your needs we recommend the Control Policy for the following reasons: - -- You can cap spend on certain expense types, and set compliance controls so Expensify’s built-in Concierge Audit Tracking can detect violations on your behalf -- As a growing business with VC-funding, the Control plan will scale with you as your team grows and you start to introduce more sophisticated approval workflows - -To create your Control Policy: - -1. Go to *Settings > Policies* -2. Select *Group* and click the button that says *New Policy* -3. Click *Select* under Control - -The Control plan also gives you access to a dedicated Setup Specialist. You can find yours by looking at your policy's #admins room at *[new.expensify.com](https://new.expensify.com)*, and chatting with them there. The Control plan is bundled with the Expensify Card is $9 per user per month when you commit annually, which is a 75% discount off our standard unbundled price point. The Control plan also gives you access to a dedicated Setup Specialist. You can find yours by looking at your policy's *#admins* room in *[new.expensify.com](https://new.expensify.com)*, and chat with them there. - -## Step 3: Connect your accounting system -As a VC-backed company, your investors will want to see that your books are managed properly. That means making sure that: - -- Every purchase is categorized into the correct account in your chart of accounts -- Every expense is accounted for and added to your accounting system - -You do this by synchronizing Expensify and your accounting package as follows: - -1. Click *Settings > Policies* -2. Navigate to the *Connections* tab -3. Select your accounting system - - If you don’t see your accounting solution in the list of integrations we support, you can review an alternative solution in the Feature Deep Dives section below. -4. Follow the prompts to connect your accounting package - - Detailed instructions on connecting your accounting package are linked on the Connections page -5. Once connected, your categories will sync, and you’re ready to set Category Rules - -_“Expensify syncs seamlessly with QuickBooks, supports our web-based, paperless workflow, and offers internal controls, so it was the natural choice.”_ - _- Laura Redmond, CEO of Redmond Accounting_ - -## Step 4: Set up category rules -[Category rules](https://community.expensify.com/discussion/4638/how-to-enable-category-specific-rules-and-descriptions) are how you provide employees hints and requirements to make sure purchases stay within reasonable ranges and are documented appropriately for approval. For your company size and stage, we recommend the following: - -1. Click *Settings > Policies* -2. Navigate to the *Categories* tab where you’ll see all the categories you just imported from your accounting package -3. To set a rule for a specific category, click *“Edit Rules”* -4. The Edit Rules section will provide several expense category rules that tie to specific general ledger categories. While the individual rules might change slightly from business to business, and the exact category name will depend on your specific chart of accounts, we recommend these settings for VC backed startups: - - Set a $75 daily limit on meals and entertainment purchases - - Though we recommend [Expensify Guaranteed eReceipts](https://community.expensify.com/discussion/5542/deep-dive-what-are-ereceipts) for most purchases, for large purchases or those in categories most often associated with fraud, we recommend scanned receipts for extra protection: - - For any purchase over $1000 - - For all lodging purchases, regardless of size - - For any meal over $50/person - - For all office supplies - - For all software purchases - - For all airfare purchases - - Require manual explanations for certain high risk categories: - - For airfare expenses a description of the expense mandatory for the employee to include the purpose of the travel - - Require a description for all rideshare and taxi expenses, ensuring employees are listing a purpose for the expense - -Setting up these category rules allows you to concentrate on growth versus needing to micromanage your employees' spending. -## Step 5: Set up scheduled submit -For an efficiency-focused company, we recommend setting up [Scheduled Submit](https://community.expensify.com/discussion/4476/how-to-enable-scheduled-submit-for-a-group-policy) on a Daily frequency: - -1. Click *Settings > Policies* -2. From here, select your group Control policy -3. Within your policy settings, select the *Reports* tab -4. You’ll notice *Scheduled Submit* is located directly under *Report Basics* -5. Choose *Daily* - -Between Expensify's SmartScan technology, direct corporate card feed import, automatic categorization, and [DoubleCheck](https://community.expensify.com/discussion/5738/deep-dive-how-does-concierge-receipt-audit-work) features, your employees shouldn't need to do anything more than swipe their Expensify Card or scan their receipt. - -Scheduled Submit will ensure all expenses are submitted automatically. Any expenses that do not fall within the rules you’ve set up for your policy will be escalated to you for manual review. - -_“Our employees just SmartScan a receipt as soon as they receive it, and regardless of what currency it's in, we process the expense and issue reimbursement automatically.”_ -_- Amina Mobasher, Accountant at Ideo.org_ - -## Step 6: Connect your business bank account -If you’re located in the US, you can utilize Expensify’s payment processing and reimbursement features. - -*Note:* Before you begin, you’ll need the following to validate your business bank account: - -- Your bank account credentials -- A form of ID (a driver’s license or passport) -- Your business tax ID number, your business’ address and your website URL - -Let’s walk through the process of linking your business bank account: - -1. Go to *Settings > Account*, and select the *Payments* tab -2. Select *Add Verified Bank Account* -3. From here, we’ll ask you to use your online banking credentials to connect to your bank - - Alternatively, you can go the more manual route by selecting “Connect Manually” -4. Once that’s done, we’ll collect all of the necessary information on your business, such as your legal business name and address -5. We’ll then collect your personal information, and a photo ID to confirm your identity - -You only need to do this once. You are fully set up for not only reimbursing expense reports, but issuing Expensify Cards, collecting invoice payments online, as well as paying bills online. - -## Step 7: Invite employees -Next, you’ll want to invite your employees to the company policy you created. You can invite employees under *Settings > Policies > Policy Name > People*. From there, you can add employees one of three ways: - -- [Unique Policy Link](https://community.expensify.com/discussion/4643/how-to-invite-people-to-your-policy-using-a-join-link) - Each policy has a unique policy invite link, which is located at the top of the People tab in your policy settings. Simply share that link with anyone you’d like to add to your policy. -- [Manually](https://community.expensify.com/discussion/4975/how-to-invite-users-to-your-policy-manually-or-in-bulk/p1?new=1) - Enter employee email addresses manually by clicking the green Invite button in the People tab of your policy -- [Google SSO](https://community.expensify.com/discussion/4774/how-to-enable-google-apps-sso-with-your-expensify-group-policy) - Or, if you have a Google Workspace configured, you can synchronize your policy's people list to match your Google Workspace employee list. - -In the next section, we’ll go through how to configure approval routing but it’s important to remember that you’ll always have these 3 options to utilize, specifically the unique policy link and manual invites as your team continues to grow. - -## Step 8: Set up an approval workflow -Now, let’s set up some approval rules for your business as well as the ideal approval workflow that employee reports will follow after report submission: - -1. Go to *Settings > Policies*, and select the *People* tab. -2. From there, select [Submit & Approve](https://community.expensify.com/discussion/5643/deep-dive-submit-and-approve) - this will automatically add you as the approver, which ensures that any expenses that fall outside of the rules you set for your policy are brought to your attention. - - *Note*: If you are over 50 employees, please ask your Guide about the benefits of setting up an Advanced Approval workflow. -3. Next, enable manual approval for *expenses over $1000*. - - *Note*: We do not recommend configuring random report auditing for companies of your stage and scale. -4. Next, enable *Workflow Enforcement*. - - This ensures that employees are required to submit to you and not to someone else. -5. Disable *Prevent Self-Approval*. This is a more powerful feature recommended for companies with advanced compliance requirements, but generally isn't recommended for a company of your scale. - -Thanks to our [Concierge Receipt audit technology](https://community.expensify.com/discussion/5738/deep-dive-how-does-concierge-receipt-audit-work), once you set up an approval workflow, most expenses will be audited automatically and won’t require manual review. Your time is valuable, so you should focus it on reviewing only the expenses that fall outside of your policy’s rules. - -## Step 9: Set up your corporate card and assign cards to employees -Expensify is optimized to work with corporate cards from all banks – or even better, use our own perfectly integrated Expensify Card. - -### If you have an existing corporate card -Expensify supports direct card feeds from most financial institutions. Setting up a corporate card feed will pull in the transactions from the connected cards on a daily basis. To set this up, do the following: - -1. Go to *Settings > Domains > Company Cards >* Select your bank - - If you don’t see your financial institution in the list of banks we support, you can review an alternative solution in the Feature Deep Dives section below -2. Next, enter your bank account login credentials. - - To successfully connect to your bank, we’ll need the *master admin (primary) account* login credentials. -3. Next, assign the corporate cards to your employees by selecting the employee’s email address and the corresponding card number from the two drop-down menus under the *Assign a Card* section -4. Set a transaction start date - - If you don’t have a backlog of transactions you’d like to account for, feel free to skip this step. - -As mentioned above, we’ll be able to pull in transactions as they post (daily) and handle receipt matching for you and your employees. However, with the Expensify Card, we’re able to bring in transactions at the point of sale which provides you with real-time compliance. Next, let’s dive into how to set up the Expensify Card and the benefits of using the Expensify Card. - -### If you don't have a corporate card, use the Expensify Card -Expensify provides a corporate card with the following features: - -- Up to 2% cash back (up to 4% in your first 3 months!) -- [SmartLimits](https://community.expensify.com/discussion/4851/deep-dive-what-are-unapproved-expense-limits#latest) -- A stable, unbreakable connection (third-party bank feeds can run into connectivity issues) - -The Expensify Card is recommended as the most efficient way to manage your company's spending. - -Here’s how to enable it: - -1. There are *two ways* you can [apply for the Expensify Card](https://community.expensify.com/discussion/4874/how-to-apply-for-the-expensify-card) - - *Via your Inbox* - - *Via Domain Settings* - Go to Settings > Domain > Company Cards > Enable Expensify Card -2. Assign the cards to your employees -3. Set *SmartLimits*: - - *Employees* - We recommend a low limit for most employees, roughly double the size of the maximum daily spend – such as $1000. - - *Execs* - We recommend a higher limit for executives, roughly 10x the limit of a non-executive employee (eg, $10,000). - -Once the Expensify Cards have been assigned, each employee will be prompted to enter their mailing address so they can receive their physical card. In the meantime, a virtual card will be ready to use immediately. - -If you have an accounting system we directly integrate with, check out how we take automation a step further with [Auto-Reconciliation](https://community.expensify.com/discussion/7335/faq-what-is-the-expensify-card-auto-reconciliation-process). We’ll create an Expensify Card clearing and liability account for you. Each time settlement occurs, we’ll take the total amount of your purchases and create a journal entry that credits the settlement account and debits the liability account - saving you hours of manual reconciliation work at the end of your statement period. - -_“Moving from our other bank and getting Expensify cards into the hands of employees was super easy. I also love how simple it is to adjust credit limits and the auto reconciliation with the daily settlement.”_ -_- Robin Gresham, Senior Accounting Systems Manager at SunCommon_ - -## Step 10: Set up Bill Pay and Invoicing -As a VC-backed startup, you might have vendors you work with that send you bills. And in most cases, you probably use some third party to pay those bills if you aren’t cutting checks the old fashioned way. Similarly, you probably have clients you invoice from time to time. As an all-in-one solution, we’re here to make bill payments and invoicing easy, and every policy and workspace comes with bill pay and invoicing - at no additional cost. Since you have your business bank account verified, you can either pay your bills via ACH. Alternatively, you can pay via credit card or by check. - -Let’s first chat through how Bill Pay works - -1. Have your vendors submit bills to domain.com@expensify.cash. - - This email address comes with every account, so no need to activate it anywhere. -2. Once the bill has been received, we’ll create the bill for your review directly in Expensify -3. At the top of the bill/invoice, you’ll notice a Pay button. Once you click that, you’ll see options including ACH, credit/debit card, along with mailing a physical check. - -Similarly, you can send bills directly from Expensify as well. - -1. From the *Reports* tab, select the down arrow next to *New Report* and select *Bill* -2. Next, enter in the Supplier’s email address, the Merchant name, total amount and date -3. At this point, you can also enter in an attachment to further validate the bill if necessary -4. Click *Submit*, we’ll forward the newly created bill directly to your Supplier. - -Reports, invoices and bills - they are largely the same in theory, just with different rules. As such, creating an invoice is just like creating an expense report and even a Bill. - -1. From the *Reports* tab, select the down arrow next to *New Report* and select *Invoice*. -2. Add all of the expenses/transactions tied to the Invoice -3. Enter the recipient’s email address, a memo if needed, and a due date for when it needs to get paid, and click *Send* - -You’ll notice it’s a slightly different flow from creating a Bill. Here, you are adding the transactions tied to the Invoice, and establishing a due date for when it needs to get paid. If you need to apply any markups, you can do so from your policy settings under the Invoices tab. - -## Step 11: Add a billing card -Now that we’ve gone through all of the steps for setting up your account, let’s make it official so there are no interruptions in service as your employees begin using Expensify. We handle billing via a billing card, and to add one: - -1. Go to *Account > Settings > Payments* -2. Select *Add Payment Card* -3. Enter your name, card number, postal code, expiration and CVV -4. Click *Accept Terms* - -# You’re all set! -Congrats, you are all set up! If you need any assistance with anything mentioned above, reach out to either your Setup Specialist or your Account Manager directly in *[new.expensify.com](https://new.expensify.com)*. Don’t have one yet? Create a Control Policy, and we’ll automatically assign a dedicated Setup Specialist to you. From fcb7bd0d0bca3a7fd5411031f6ec8cd7a2582f3a Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 15:51:28 +0530 Subject: [PATCH 29/55] delete existing articles --- .../request-money/Request-and-Split-Bills.md | 38 ------------------- 1 file changed, 38 deletions(-) delete mode 100644 docs/articles/request-money/Request-and-Split-Bills.md diff --git a/docs/articles/request-money/Request-and-Split-Bills.md b/docs/articles/request-money/Request-and-Split-Bills.md deleted file mode 100644 index bb27cd75c742..000000000000 --- a/docs/articles/request-money/Request-and-Split-Bills.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Request Money and Split Bills with Friends -description: Everything you need to know about Requesting Money and Splitting Bills with Friends! ---- - - - -# How do these Payment Features work? -Our suite of money movement features enables you to request money owed by an individual or split a bill with a group. - -**Request Money** lets your friends pay you back directly in Expensify. When you send a payment request to a friend, Expensify will display the amount owed and the option to pay the corresponding request in a chat between you. - -**Split Bill** allows you to split payments between friends and ensures the person who settled the tab gets paid back. - -These two features ensure you can live in the moment and settle up afterward. - -# How to Request Money -- Select the Green **+** button and choose **Request Money** -- Select the relevant option: - - **Manual:** Enter the merchant and amount manually. - - **Scan:** Take a photo of the receipt to have the merchant and amount auto-filled. - - **Distance:** Enter the details of your trip, plus any stops along the way, and the mileage and amount will be automatically calculated. -- Search for the user or enter their email! -- Enter a reason for the request (optional) -- Click **Request!** -- If you change your mind, all you have to do is click **Cancel** -- The user will be able to **Settle up outside of Expensify** or pay you via **Venmo** or **PayPal.me** - -# How to Split a Bill -- Select the Green **+** button and choose **Split Bill** -- Enter the total amount for the bill and click **Next** -- Search for users or enter their emails and **Select** -- Enter a reason for the split -- The split is then shared equally between the attendees - -# FAQs -## Can I request money from more than one person at a time? -If you need to request money for more than one person at a time, you’ll want to use the Split Bill feature. The Request Money option is for one-to-one payments between two people. From 97d4b249dcb2ffc5abd730ffd03688074015bd2e Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 15:52:18 +0530 Subject: [PATCH 30/55] delete existing articles --- .../paying-friends/Request-and-Split-Bills.md | 35 ----------- .../split-bills/workspaces/The-Free-Plan.md | 62 ------------------- 2 files changed, 97 deletions(-) delete mode 100644 docs/articles/split-bills/paying-friends/Request-and-Split-Bills.md delete mode 100644 docs/articles/split-bills/workspaces/The-Free-Plan.md diff --git a/docs/articles/split-bills/paying-friends/Request-and-Split-Bills.md b/docs/articles/split-bills/paying-friends/Request-and-Split-Bills.md deleted file mode 100644 index a2c63cf6f8f7..000000000000 --- a/docs/articles/split-bills/paying-friends/Request-and-Split-Bills.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Request Money and Split Bills with Friends -description: Everything you need to know about Requesting Money and Splitting Bills with Friends! ---- - - - -# How do these Payment Features work? -Our suite of money movement features enables you to request money owed by an individual or split a bill with a group. - -**Request Money** lets your friends pay you back directly in Expensify. When you send a payment request to a friend, Expensify will display the amount owed and the option to pay the corresponding request in a chat between you. - -**Split Bill** allows you to split payments between friends and ensures the person who settled the tab gets paid back. - -These two features ensure you can live in the moment and settle up afterward. - -# How to Request Money -- Select the Green **+** button and choose **Request Money** -- Enter the amount **$** they owe and click **Next** -- Search for the user or enter their email! -- Enter a reason for the request (optional) -- Click **Request!** -- If you change your mind, all you have to do is click **Cancel** -- The user will be able to **Settle up outside of Expensify** or pay you via **Venmo** or **PayPal.me** - -# How to Split a Bill -- Select the Green **+** button and choose **Split Bill** -- Enter the total amount for the bill and click **Next** -- Search for users or enter their emails and **Select** -- Enter a reason for the split -- The split is then shared equally between the attendees - -# FAQs -## Can I request money from more than one person at a time? -If you need to request money for more than one person at a time, you’ll want to use the Split Bill feature. The Request Money option is for one-to-one payments between two people. diff --git a/docs/articles/split-bills/workspaces/The-Free-Plan.md b/docs/articles/split-bills/workspaces/The-Free-Plan.md deleted file mode 100644 index 45c9d09d4777..000000000000 --- a/docs/articles/split-bills/workspaces/The-Free-Plan.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: The Free Plan -description: Everything you need to know about Expensify's Free Plan! ---- - - - -# What is the Free Plan? -The free plan is ideal for start-ups and small businesses to manage expenses. With the Free Plan, a workspace admin can set their team up with Expensify Cards, reimburse cash expenses, send invoices, and manage bills, all for free! You will have total visibility and control over all spending associated with your workspace in real time. - -# Features Included with the Free Plan -- Expensify Cards for all employees -- Invoicing -- Bill Pay -- Unlimited receipt scanning for everyone in the company -- Free next-day ACH reimbursements for cash expenses -- Up to 4% [cash back](https://community.expensify.com/discussion/8454/4-cash-back-on-the-expensify-card-is-here-to-stay) -- Free corporate travel booking - -# Setting Up the Free Plan -- Navigate to new.expensify.com, enter your company email address, and set a password -- Click the **green “+”** button and select **_New workspace_** - -Once you’ve created your Workspace, you will receive a message from Concierge encouraging you to chat with your Setup Specialist. Click the link in the message, and your designated Setup Specialist will guide you through how to configure your company setup. - -Once you’ve completed your company setup, you should have completed the following tasks: - -- Connected a business bank account (Settings menu > Click **_Bank account_** and follow the prompts). -- Invited members to the workspace -- Assigned Expensify Cards - -# Inviting Members to the Free Plan: -- Navigate to the Settings Menu and click **_Members_** to invite your team. You can invite employees one at a time, or you can invite multiple users by listing out their email addresses separated by a comma -- To use the Expensify Card, you must invite them to your workspace via your company email address (i.e., admin@companyemail.com and NOT admin@gmail.com). - -# Managing the Free Plan -To access your workspace settings, click your profile icon and then on your workspace name. - -This settings menu allows you to manage your workspace members, issue additional Expensify Cards, and utilize this plan’s various bill pay and payment options. - -# FAQs -## Do I need a business bank account to use the Free Plan? - -You will need a US business checking account if you want to enable the Expensify Card and set up direct ACH reimbursement. -You will need to take a few steps to verify your business bank account and connect it to Expensify. You will also need to set aside some time and have your ID ready. -If you're not in the US, you can still use the Free Plan, but the Expensify Card and direct reimbursement will not be available. - -## Can my workspace have more than one Admin? - -The Expensify Workplace only allows for one admin (the workspace creator). - -## Scheduled Submit is set to weekly on the Free Plan. Can I change this? - -No, expense reports on the Free Plan submit weekly, and there is no way to customize approval settings. - -## With the Free Plan, can I add my own categories? - -Categories are standardized on the Free Plan and can’t be edited. Custom categories and tags or accounting system integration are available on a paid plan. - -## With the Free Plan, can I export reports using a custom format? - -The Free Plan offers standard report export formats. You'll need to upgrade to a paid plan to create a custom export format. From 575948c4425126673d1115dc1b0068ca1f7846f2 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 16:41:34 +0530 Subject: [PATCH 31/55] add routes for new hubs and platforms --- docs/_data/_routes.yml | 140 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 139 insertions(+), 1 deletion(-) diff --git a/docs/_data/_routes.yml b/docs/_data/_routes.yml index 85593156a4b1..20582b6b8c7e 100644 --- a/docs/_data/_routes.yml +++ b/docs/_data/_routes.yml @@ -1,4 +1,142 @@ home: href: home title: Welcome to ExpensifyHelp! - description: Find the answers to all of your questions about receipts, expenses, corporate cards, or anything else in the spend management universe. + description: Questions? Find the answers by clicking a Category or using the search bar located in the left-hand menu. + +platforms: + - href: expensify-classic + title: Expensify Classic + hub-title: Expensify Classic - Help & Resources + url: expensify.com + description: Your account settings will look something like this + image: /assets/images/paper-airplane.svg + + # Hubs are comprised of sections and articles. Sections contain multiple related articles, but there can be standalone articles as well + hubs: + - href: account-settings + title: Account Settings + icon: /assets/images/gears.svg + description: With only a couple of clicks, split bills with your friends or coworkers. + + - href: bank-accounts-and-credit-cards + title: Bank Accounts & Credit Cards + icon: /assets/images/bank-card.svg + description: Request money for work expenses, bills, or a night out with friends. + + - href: billing-and-subscriptions + title: Billing & Subscriptions + icon: /assets/images/money-wings.svg + description: Best practices for how to best deploy Expensify for your business + + - href: expense-and-report-features + title: Expense & Report Features + icon: /assets/images/money-receipt.svg + description: Everything else you're looking for is right here. + + - href: expensify-card + title: Expensify Card + icon: /assets/images/hand-card.svg + description: Request money for work expenses, bills, or a night out with friends. + + - href: exports + title: Exports + icon: /assets/images/monitor.svg + description: Best practices for how to best deploy Expensify for your business + + - href: get-paid-back + title: Get Paid Back + description: Everything else you're looking for is right here. + icon: /assets/images/money-into-wallet.svg + + - href: getting-started + title: Getting Started + description: Everything else you're looking for is right here. + icon: /assets/images/accounting.svg + + - href: integrations + title: Integrations + description: Everything else you're looking for is right here. + icon: /assets/images/workflow.svg + + - href: manage-employees-and-report-approvals + title: Manage Employees & Report Approvals + icon: /assets/images/envelope-receipt.svg + description: Everything else you're looking for is right here. + + - href: policy-and-domain-settings + title: Policy & Domain Setting + icon: /assets/images/shield.svg + description: Everything else you're looking for is right here. + + - href: send-payments + title: Send Payments + icon: /assets/images/money-wings.svg + description: Everything else you're looking for is right here. + + - href: new-expensify + title: New Expensify + hub-title: New Expensify - Help & Resources + url: new.expensify.com + description: Your account settings will look something like this + image: /assets/images/paper-airplane.svg + + hubs: + - href: account-settings + title: Account Settings + icon: /assets/images/gears.svg + description: With only a couple of clicks, split bills with your friends or coworkers. + + - href: bank-accounts-and-credit-cards + title: Bank Accounts & Credit Cards + icon: /assets/images/bank-card.svg + description: description + + - href: billing-and-plan-types + title: Billing & Plan Types + icon: /assets/images/money-wings.svg + description: description + + - href: expense-and-report-features + title: Expense & Report Features + icon: /assets/images/money-receipt.svg + description: description + + - href: expensify-card + title: Expensify Card + icon: /assets/images/hand-card.svg + description: description + + - href: exports + title: Exports + icon: /assets/images/monitor.svg + description: description + + - href: get-paid-back + title: Get Paid Back + icon: /assets/images/money-into-wallet.svg + description: description + + - href: getting-started + title: Getting Started + icon: /assets/images/accounting.svg + description: description + + - href: integrations + title: Integrations + icon: /assets/images/workflow.svg + description: description + + - href: manage-employees-and-report-approvals + title: Manage Employees & Report Approvals + icon: /assets/images/envelope-receipt.svg + description: description + + - href: send-payments + title: Send Payments + icon: /assets/images/money-wings.svg + description: description. + + - href: workspace-and-domain-settings + title: Workspace & Domain Settings + icon: /assets/images/shield.svg + description: description. From 5cdc7fb71431e3d592999d49efba4e9beb43e462 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Wed, 20 Sep 2023 14:59:46 +0200 Subject: [PATCH 32/55] clarify comment --- src/libs/ReportUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.js b/src/libs/ReportUtils.js index 553cb0243f52..ed2e85a4ff11 100644 --- a/src/libs/ReportUtils.js +++ b/src/libs/ReportUtils.js @@ -1649,7 +1649,7 @@ function getRootParentReport(report) { return {}; } - // Returns the founded root report, because it does not have a parentReportID + // Returns the current report as the root report, because it does not have a parentReportID if (!report.parentReportID) { return report; } From ce2907d21401cf6c713940e209d8539316e642f6 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Wed, 20 Sep 2023 15:06:46 +0200 Subject: [PATCH 33/55] perform conditions --- src/components/ReportActionItem/MoneyRequestView.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/MoneyRequestView.js b/src/components/ReportActionItem/MoneyRequestView.js index d8ec67ae59da..178cab75a0c2 100644 --- a/src/components/ReportActionItem/MoneyRequestView.js +++ b/src/components/ReportActionItem/MoneyRequestView.js @@ -1,8 +1,8 @@ import React, {useMemo} from 'react'; import {View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; -import _ from 'underscore'; import lodashGet from 'lodash/get'; +import lodashValues from 'lodash/values'; import PropTypes from 'prop-types'; import reportPropTypes from '../../pages/reportPropTypes'; import ONYXKEYS from '../../ONYXKEYS'; @@ -90,8 +90,7 @@ function MoneyRequestView({betas, report, parentReport, policyCategories, should // A flag for verifying that the current report is a sub-report of a workspace chat const isPolicyExpenseChat = useMemo(() => ReportUtils.isPolicyExpenseChat(ReportUtils.getRootParentReport(report)), [report]); // A flag for showing categories - const shouldShowCategory = - isPolicyExpenseChat && Permissions.canUseCategories(betas) && (!_.isEmpty(transactionCategory) || OptionsListUtils.hasEnabledOptions(_.values(policyCategories))); + const shouldShowCategory = isPolicyExpenseChat && Permissions.canUseCategories(betas) && (transactionCategory || OptionsListUtils.hasEnabledOptions(lodashValues(policyCategories))); let description = `${translate('iou.amount')} • ${translate('iou.cash')}`; if (isSettled) { From 63fa6e289218f6bb43d83fe081160cd54550b504 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:01:08 +0530 Subject: [PATCH 34/55] add platforms and hubs to routes using script --- .github/scripts/createDocsRoutes.js | 50 +++++++++++++++++++---------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index 0fc9aa33ff27..2049aed7247a 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -2,7 +2,7 @@ const yaml = require('js-yaml'); const fs = require('fs'); const _ = require('underscore'); -const warn = 'Number of hubs in _routes.yml does not match number of hubs in docs/articles. Please update _routes.yml with hub info.'; +const getNumberOfRoutesNotMatchingError = (platform) => `Number of hubs in _routes.yml does not match number of hubs in docs/${platform}/articles. Please update _routes.yml with hub info.`; const disclaimer = '# This file is auto-generated. Do not edit it directly. Use npm run createDocsRoutes instead.\n'; const docsDir = `${process.cwd()}/docs`; const routes = yaml.load(fs.readFileSync(`${docsDir}/_data/_routes.yml`, 'utf8')); @@ -28,7 +28,7 @@ function getArticleObj(filename) { } /** - * If the articlea / sections exist in the hub, then push the entry to the array. + * If the article / sections exist in the hub, then push the entry to the array. * Otherwise, create the array and push the entry to it. * @param {*} hubs - The hubs array * @param {*} hub - The hub we are iterating @@ -45,19 +45,40 @@ function pushOrCreateEntry(hubs, hub, key, entry) { } function run() { - const hubs = fs.readdirSync(`${docsDir}/articles`); - if (hubs.length !== routes.hubs.length) { - // If new hubs have been added without metadata addition to _routes.yml - console.error(warn); - process.exit(1); + const newExpensifyHubs = fs.readdirSync(`${docsDir}/articles/new-expensify`); + const expensifyClassicHubs = fs.readdirSync(`${docsDir}/articles/expensify-classic`); + + const newExpensifyRoute = routes.platforms.find((platform) => platform.href === "new-expensify"); + const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === "expensify-classic"); + + if (newExpensifyHubs.length !== newExpensifyRoute.hubs.length) { + console.error(getNumberOfRoutesNotMatchingError("new-expensify")); + return 1; } + + if (expensifyClassicHubs.length !== expensifyClassicRoute.hubs.length) { + console.error(getNumberOfRoutesNotMatchingError("expensify-classic")); + return 1; + } + + createHubsWithArticles(expensifyClassicHubs, "expensify-classic", expensifyClassicRoute.hubs); + createHubsWithArticles(newExpensifyHubs, "new-expensify", newExpensifyRoute.hubs); + + // Convert the object to YAML and write it to the file + let yamlString = yaml.dump(routes); + yamlString = disclaimer + yamlString; + fs.writeFileSync(`${docsDir}/_data/routes.yml`, yamlString); +} + + +function createHubsWithArticles(hubs, platformName, routeHubs) { _.each(hubs, (hub) => { // Iterate through each directory in articles - fs.readdirSync(`${docsDir}/articles/${hub}`).forEach((fileOrFolder) => { + fs.readdirSync(`${docsDir}/articles/${platformName}/${hub}`).forEach((fileOrFolder) => { // If the directory content is a markdown file, then it is an article if (fileOrFolder.endsWith('.md')) { const articleObj = getArticleObj(fileOrFolder); - pushOrCreateEntry(routes.hubs, hub, 'articles', articleObj); + pushOrCreateEntry(routeHubs, hub, 'articles', articleObj); return; } @@ -66,27 +87,22 @@ function run() { const articles = []; // Each subfolder will be a section containing articles - fs.readdirSync(`${docsDir}/articles/${hub}/${section}`).forEach((subArticle) => { + fs.readdirSync(`${docsDir}/articles/${platformName}/${hub}/${section}`).forEach((subArticle) => { articles.push(getArticleObj(subArticle)); }); - pushOrCreateEntry(routes.hubs, hub, 'sections', { + pushOrCreateEntry(routeHubs, hub, 'sections', { href: section, title: toTitleCase(section.replaceAll('-', ' ')), articles, }); }); }); - - // Convert the object to YAML and write it to the file - let yamlString = yaml.dump(routes); - yamlString = disclaimer + yamlString; - fs.writeFileSync(`${docsDir}/_data/routes.yml`, yamlString); } try { run(); } catch (error) { console.error('A problem occurred while trying to read the directories.', error); - process.exit(1); + return 1; } From aa6972bb5f81c89d3ab2949863ea83ea6e6e3d97 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:01:56 +0530 Subject: [PATCH 35/55] change variablename --- .github/scripts/createDocsRoutes.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index 2049aed7247a..76349bab1cc6 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -2,7 +2,7 @@ const yaml = require('js-yaml'); const fs = require('fs'); const _ = require('underscore'); -const getNumberOfRoutesNotMatchingError = (platform) => `Number of hubs in _routes.yml does not match number of hubs in docs/${platform}/articles. Please update _routes.yml with hub info.`; +const warn = (platform) => `Number of hubs in _routes.yml does not match number of hubs in docs/${platform}/articles. Please update _routes.yml with hub info.`; const disclaimer = '# This file is auto-generated. Do not edit it directly. Use npm run createDocsRoutes instead.\n'; const docsDir = `${process.cwd()}/docs`; const routes = yaml.load(fs.readFileSync(`${docsDir}/_data/_routes.yml`, 'utf8')); @@ -52,12 +52,12 @@ function run() { const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === "expensify-classic"); if (newExpensifyHubs.length !== newExpensifyRoute.hubs.length) { - console.error(getNumberOfRoutesNotMatchingError("new-expensify")); + console.error(warn("new-expensify")); return 1; } if (expensifyClassicHubs.length !== expensifyClassicRoute.hubs.length) { - console.error(getNumberOfRoutesNotMatchingError("expensify-classic")); + console.error(warn("expensify-classic")); return 1; } From 2309991ba566ac20d91316d7530e0538cecb379e Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:02:15 +0530 Subject: [PATCH 36/55] refactor --- .github/scripts/createDocsRoutes.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index 76349bab1cc6..ff3c80f3e402 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -51,13 +51,13 @@ function run() { const newExpensifyRoute = routes.platforms.find((platform) => platform.href === "new-expensify"); const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === "expensify-classic"); - if (newExpensifyHubs.length !== newExpensifyRoute.hubs.length) { - console.error(warn("new-expensify")); + if (expensifyClassicHubs.length !== expensifyClassicRoute.hubs.length) { + console.error(warn("expensify-classic")); return 1; } - if (expensifyClassicHubs.length !== expensifyClassicRoute.hubs.length) { - console.error(warn("expensify-classic")); + if (newExpensifyHubs.length !== newExpensifyRoute.hubs.length) { + console.error(warn("new-expensify")); return 1; } From fe063d51b354a465fb6d3b5e69785cd511f2a657 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:18:32 +0530 Subject: [PATCH 37/55] fix: improve readability --- .github/scripts/createDocsRoutes.js | 31 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index ff3c80f3e402..d74b00172fcf 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -6,6 +6,10 @@ const warn = (platform) => `Number of hubs in _routes.yml does not match number const disclaimer = '# This file is auto-generated. Do not edit it directly. Use npm run createDocsRoutes instead.\n'; const docsDir = `${process.cwd()}/docs`; const routes = yaml.load(fs.readFileSync(`${docsDir}/_data/_routes.yml`, 'utf8')); +const platformNames = { + expensifyClassic: 'expensify-classic', + newExpensify: 'new-expensify', +}; /** * @param {String} str - The string to convert to title case @@ -45,24 +49,24 @@ function pushOrCreateEntry(hubs, hub, key, entry) { } function run() { - const newExpensifyHubs = fs.readdirSync(`${docsDir}/articles/new-expensify`); - const expensifyClassicHubs = fs.readdirSync(`${docsDir}/articles/expensify-classic`); + const expensifyClassicArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.expensifyClassic}`); + const newExpensifyArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.newExpensify}`); - const newExpensifyRoute = routes.platforms.find((platform) => platform.href === "new-expensify"); - const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === "expensify-classic"); + const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === platformNames.expensifyClassic); + const newExpensifyRoute = routes.platforms.find((platform) => platform.href === platformNames.newExpensify); - if (expensifyClassicHubs.length !== expensifyClassicRoute.hubs.length) { - console.error(warn("expensify-classic")); + if (expensifyClassicArticleHubs.length !== expensifyClassicRoute.hubs.length) { + console.error(warn(platformNames.expensifyClassic)); return 1; } - if (newExpensifyHubs.length !== newExpensifyRoute.hubs.length) { - console.error(warn("new-expensify")); + if (newExpensifyArticleHubs.length !== newExpensifyRoute.hubs.length) { + console.error(warn(platformNames.newExpensify)); return 1; } - createHubsWithArticles(expensifyClassicHubs, "expensify-classic", expensifyClassicRoute.hubs); - createHubsWithArticles(newExpensifyHubs, "new-expensify", newExpensifyRoute.hubs); + createHubsWithArticles(expensifyClassicArticleHubs, platformNames.expensifyClassic, expensifyClassicRoute.hubs); + createHubsWithArticles(newExpensifyArticleHubs, platformNames.newExpensify, newExpensifyRoute.hubs); // Convert the object to YAML and write it to the file let yamlString = yaml.dump(routes); @@ -70,7 +74,12 @@ function run() { fs.writeFileSync(`${docsDir}/_data/routes.yml`, yamlString); } - +/** + * Add articles and sections to hubs + * @param {Array} hubs - The hubs inside docs/articles/ for a platform + * @param {String} platformName - Expensify Classic or New Expensify + * @param {Array} routeHubs - The hubs insude docs/data/_routes.yml for a platform + */ function createHubsWithArticles(hubs, platformName, routeHubs) { _.each(hubs, (hub) => { // Iterate through each directory in articles From ce58e36ca393db55cf19d553f7944aeee7fd0c5d Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:21:47 +0530 Subject: [PATCH 38/55] add expensify classic hubs --- docs/expensify-classic/hubs/account-settings.html | 6 ++++++ .../hubs/bank-accounts-and-credit-cards.html | 6 ++++++ docs/expensify-classic/hubs/billing-and-subscriptions.html | 6 ++++++ .../expensify-classic/hubs/expense-and-report-features.html | 6 ++++++ docs/expensify-classic/hubs/expensify-card.html | 6 ++++++ docs/expensify-classic/hubs/exports.html | 6 ++++++ docs/expensify-classic/hubs/get-paid-back.html | 6 ++++++ docs/expensify-classic/hubs/getting-started.html | 6 ++++++ docs/expensify-classic/hubs/index.html | 6 ++++++ docs/expensify-classic/hubs/integrations.html | 6 ++++++ .../hubs/manage-employees-and-report-approvals.html | 6 ++++++ docs/expensify-classic/hubs/policy-and-domain-settings.html | 6 ++++++ docs/expensify-classic/hubs/send-payments.html | 6 ++++++ 13 files changed, 78 insertions(+) create mode 100644 docs/expensify-classic/hubs/account-settings.html create mode 100644 docs/expensify-classic/hubs/bank-accounts-and-credit-cards.html create mode 100644 docs/expensify-classic/hubs/billing-and-subscriptions.html create mode 100644 docs/expensify-classic/hubs/expense-and-report-features.html create mode 100644 docs/expensify-classic/hubs/expensify-card.html create mode 100644 docs/expensify-classic/hubs/exports.html create mode 100644 docs/expensify-classic/hubs/get-paid-back.html create mode 100644 docs/expensify-classic/hubs/getting-started.html create mode 100644 docs/expensify-classic/hubs/index.html create mode 100644 docs/expensify-classic/hubs/integrations.html create mode 100644 docs/expensify-classic/hubs/manage-employees-and-report-approvals.html create mode 100644 docs/expensify-classic/hubs/policy-and-domain-settings.html create mode 100644 docs/expensify-classic/hubs/send-payments.html diff --git a/docs/expensify-classic/hubs/account-settings.html b/docs/expensify-classic/hubs/account-settings.html new file mode 100644 index 000000000000..434761a6c4fa --- /dev/null +++ b/docs/expensify-classic/hubs/account-settings.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Account Settings +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/bank-accounts-and-credit-cards.html b/docs/expensify-classic/hubs/bank-accounts-and-credit-cards.html new file mode 100644 index 000000000000..2f91f0913d6e --- /dev/null +++ b/docs/expensify-classic/hubs/bank-accounts-and-credit-cards.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Bank Accounts & Credit Cards +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/billing-and-subscriptions.html b/docs/expensify-classic/hubs/billing-and-subscriptions.html new file mode 100644 index 000000000000..05dc38835b51 --- /dev/null +++ b/docs/expensify-classic/hubs/billing-and-subscriptions.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Billing & Subscriptions +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/expense-and-report-features.html b/docs/expensify-classic/hubs/expense-and-report-features.html new file mode 100644 index 000000000000..44afa4b18b51 --- /dev/null +++ b/docs/expensify-classic/hubs/expense-and-report-features.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Expense & Report Settings +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/expensify-card.html b/docs/expensify-classic/hubs/expensify-card.html new file mode 100644 index 000000000000..3afd8ac662e7 --- /dev/null +++ b/docs/expensify-classic/hubs/expensify-card.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Expensify Card +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/exports.html b/docs/expensify-classic/hubs/exports.html new file mode 100644 index 000000000000..16c96cb51d01 --- /dev/null +++ b/docs/expensify-classic/hubs/exports.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Exports +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/get-paid-back.html b/docs/expensify-classic/hubs/get-paid-back.html new file mode 100644 index 000000000000..1f84c1510b92 --- /dev/null +++ b/docs/expensify-classic/hubs/get-paid-back.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Get Paid Back +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/getting-started.html b/docs/expensify-classic/hubs/getting-started.html new file mode 100644 index 000000000000..14ca13d0c2e8 --- /dev/null +++ b/docs/expensify-classic/hubs/getting-started.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Getting Started +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/index.html b/docs/expensify-classic/hubs/index.html new file mode 100644 index 000000000000..05c7b52bfa2d --- /dev/null +++ b/docs/expensify-classic/hubs/index.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Expensify Classic +--- + +{% include platform.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/integrations.html b/docs/expensify-classic/hubs/integrations.html new file mode 100644 index 000000000000..d1f173534c8a --- /dev/null +++ b/docs/expensify-classic/hubs/integrations.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Integrations +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/manage-employees-and-report-approvals.html b/docs/expensify-classic/hubs/manage-employees-and-report-approvals.html new file mode 100644 index 000000000000..788e445ebc91 --- /dev/null +++ b/docs/expensify-classic/hubs/manage-employees-and-report-approvals.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Manage Employees And Report Approvals +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/policy-and-domain-settings.html b/docs/expensify-classic/hubs/policy-and-domain-settings.html new file mode 100644 index 000000000000..ffd514fcb6fa --- /dev/null +++ b/docs/expensify-classic/hubs/policy-and-domain-settings.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Policy And Domain Settings +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/expensify-classic/hubs/send-payments.html b/docs/expensify-classic/hubs/send-payments.html new file mode 100644 index 000000000000..c8275af5c353 --- /dev/null +++ b/docs/expensify-classic/hubs/send-payments.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Send Payments +--- + +{% include hub.html %} \ No newline at end of file From 2a3e8ea52f01dfa49d1c7392cc5be424a5dee69f Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:22:05 +0530 Subject: [PATCH 39/55] add new expensify hubs --- docs/new-expensify/hubs/account-settings.html | 6 ++++++ docs/new-expensify/hubs/bank-accounts-and-credit-cards.html | 6 ++++++ docs/new-expensify/hubs/billing-and-plan-types.html | 6 ++++++ docs/new-expensify/hubs/expense-and-report-features.html | 6 ++++++ docs/new-expensify/hubs/expensify-card.html | 6 ++++++ docs/new-expensify/hubs/exports.html | 0 docs/new-expensify/hubs/get-paid-back.html | 6 ++++++ docs/new-expensify/hubs/getting-started.html | 6 ++++++ docs/new-expensify/hubs/index.html | 6 ++++++ docs/new-expensify/hubs/integrations.html | 6 ++++++ .../hubs/manage-employees-and-report-approvals.html | 6 ++++++ docs/new-expensify/hubs/send-payments.html | 6 ++++++ docs/new-expensify/hubs/workspace-and-domain-settings.html | 6 ++++++ 13 files changed, 72 insertions(+) create mode 100644 docs/new-expensify/hubs/account-settings.html create mode 100644 docs/new-expensify/hubs/bank-accounts-and-credit-cards.html create mode 100644 docs/new-expensify/hubs/billing-and-plan-types.html create mode 100644 docs/new-expensify/hubs/expense-and-report-features.html create mode 100644 docs/new-expensify/hubs/expensify-card.html create mode 100644 docs/new-expensify/hubs/exports.html create mode 100644 docs/new-expensify/hubs/get-paid-back.html create mode 100644 docs/new-expensify/hubs/getting-started.html create mode 100644 docs/new-expensify/hubs/index.html create mode 100644 docs/new-expensify/hubs/integrations.html create mode 100644 docs/new-expensify/hubs/manage-employees-and-report-approvals.html create mode 100644 docs/new-expensify/hubs/send-payments.html create mode 100644 docs/new-expensify/hubs/workspace-and-domain-settings.html diff --git a/docs/new-expensify/hubs/account-settings.html b/docs/new-expensify/hubs/account-settings.html new file mode 100644 index 000000000000..434761a6c4fa --- /dev/null +++ b/docs/new-expensify/hubs/account-settings.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Account Settings +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/bank-accounts-and-credit-cards.html b/docs/new-expensify/hubs/bank-accounts-and-credit-cards.html new file mode 100644 index 000000000000..2f91f0913d6e --- /dev/null +++ b/docs/new-expensify/hubs/bank-accounts-and-credit-cards.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Bank Accounts & Credit Cards +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/billing-and-plan-types.html b/docs/new-expensify/hubs/billing-and-plan-types.html new file mode 100644 index 000000000000..b49b2b62b1d6 --- /dev/null +++ b/docs/new-expensify/hubs/billing-and-plan-types.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Billing & Plan Types +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/expense-and-report-features.html b/docs/new-expensify/hubs/expense-and-report-features.html new file mode 100644 index 000000000000..0057ae0fa46c --- /dev/null +++ b/docs/new-expensify/hubs/expense-and-report-features.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Expense and Report Features +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/expensify-card.html b/docs/new-expensify/hubs/expensify-card.html new file mode 100644 index 000000000000..3afd8ac662e7 --- /dev/null +++ b/docs/new-expensify/hubs/expensify-card.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Expensify Card +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/exports.html b/docs/new-expensify/hubs/exports.html new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/docs/new-expensify/hubs/get-paid-back.html b/docs/new-expensify/hubs/get-paid-back.html new file mode 100644 index 000000000000..1f84c1510b92 --- /dev/null +++ b/docs/new-expensify/hubs/get-paid-back.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Get Paid Back +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/getting-started.html b/docs/new-expensify/hubs/getting-started.html new file mode 100644 index 000000000000..14ca13d0c2e8 --- /dev/null +++ b/docs/new-expensify/hubs/getting-started.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Getting Started +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/index.html b/docs/new-expensify/hubs/index.html new file mode 100644 index 000000000000..de046b16e755 --- /dev/null +++ b/docs/new-expensify/hubs/index.html @@ -0,0 +1,6 @@ +--- +layout: default +title: New Expensify +--- + +{% include platform.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/integrations.html b/docs/new-expensify/hubs/integrations.html new file mode 100644 index 000000000000..d1f173534c8a --- /dev/null +++ b/docs/new-expensify/hubs/integrations.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Integrations +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/manage-employees-and-report-approvals.html b/docs/new-expensify/hubs/manage-employees-and-report-approvals.html new file mode 100644 index 000000000000..31e992f32d5d --- /dev/null +++ b/docs/new-expensify/hubs/manage-employees-and-report-approvals.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Manage Employees & Report Approvals +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/send-payments.html b/docs/new-expensify/hubs/send-payments.html new file mode 100644 index 000000000000..c8275af5c353 --- /dev/null +++ b/docs/new-expensify/hubs/send-payments.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Send Payments +--- + +{% include hub.html %} \ No newline at end of file diff --git a/docs/new-expensify/hubs/workspace-and-domain-settings.html b/docs/new-expensify/hubs/workspace-and-domain-settings.html new file mode 100644 index 000000000000..c4e5d06d6b8a --- /dev/null +++ b/docs/new-expensify/hubs/workspace-and-domain-settings.html @@ -0,0 +1,6 @@ +--- +layout: default +title: Workspace & Domain Settings +--- + +{% include hub.html %} \ No newline at end of file From 85d8a0bfa8c7d4d288389dfca3665a1f3259ee14 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:23:06 +0530 Subject: [PATCH 40/55] add expensify classic articles --- .../account-settings/Account-Access.md | 5 + .../account-settings/Close-Account.md | 5 + .../account-settings/Merge-Accounts.md | 5 + .../account-settings/Preferences.md | 5 + .../account-settings/Profile-Settings.md | 5 + .../Business-Bank-Accounts-AUS.md | 5 + .../Business-Bank-Accounts-USD.md | 5 + .../Deposit-Accounts-AUS.md | 5 + .../Deposit-Accounts-USD.md | 5 + .../Global-Reimbursement.md | 5 + .../Personal-Credit-Cards.md | 5 + .../company-cards/ANZ.md | 6 + .../company-cards/Brex.md | 5 + .../company-cards/CSV-Import.md | 5 + .../company-cards/Commercial-Card-Feeds.md | 5 + .../company-cards/Connect-Company-Cards.md | 5 + .../company-cards/Direct-Bank-Connections.md | 5 + .../company-cards/Export-To-GL-Accounts.md | 5 + .../company-cards/Reconciliation.md | 5 + .../company-cards/Troubleshooting.md | 5 + .../Annual-Subscription.md | 5 + .../Billing-Owner.md | 5 + .../Change-Plan-Or-Subscription.md | 5 + .../Consolidated-Domain-Billing.md | 5 + .../billing-and-subscriptions/Free-Trial.md | 5 + .../Individual-Subscription.md | 5 + .../billing-and-subscriptions/Overview.md | 5 + .../Pay-Per-Use-Subscription.md | 5 + .../billing-and-subscriptions/Payment-Card.md | 5 + .../billing-and-subscriptions/Tax-Exempt.md | 5 + .../Attendee-Tracking.md | 5 + .../expense-and-report-features/Currency.md | 5 + .../Expense-Rules.md | 5 + .../Expense-Types.md | 5 + .../Report-Comments.md | 5 + .../The-Expenses-Page.md | 5 + .../The-Reports-Page.md | 5 + .../expensify-card/Auto-Reconciliation.md | 5 + .../expensify-card/CPA-Card.md | 5 + .../expensify-card/Card-Settings.md | 5 + .../Connect-To-Indirect-Integration.md | 5 + .../expensify-card/File-A-Dispute.md | 5 + .../expensify-card/Get-The-Card.md | 5 + .../expensify-card/Statements.md | 5 + .../expensify-card/The-Reports-Page.md | 5 + .../exports/Custom-Templates.md | 5 + .../exports/Default-Export-Templates.md | 5 + .../expensify-classic/exports/Insights.md | 100 +++++++ .../exports/The-Reports-Page.md | 5 + .../get-paid-back/Mileage.md | 5 + .../get-paid-back/Per-Diem.md | 5 + .../get-paid-back/Third-Party-Payments.md | 5 + .../expensify-classic/get-paid-back/Trips.md | 5 + .../get-paid-back/expenses/Apply-Tax.md | 5 + .../get-paid-back/expenses/Create-Expenses.md | 5 + .../get-paid-back/expenses/Merge-Expenses.md | 5 + .../get-paid-back/expenses/Upload-Receipts.md | 5 + .../get-paid-back/reports/Create-A-Report.md | 5 + .../get-paid-back/reports/Reimbursements.md | 5 + .../getting-started/Best-Practices.md | 5 + .../getting-started/Employees.md | 5 + .../getting-started/Individual-Users.md | 5 + .../getting-started/Invite-Employees.md | 5 + .../getting-started/Plan-Types.md | 5 + .../getting-started/Policy-Admins.md | 5 + .../getting-started/Referral-Program.md | 53 ++++ .../getting-started/Security.md | 5 + .../Support/Your-Expensify-Account-Manager.md | 36 +++ .../getting-started/Using-The-App.md | 5 + ...e-Share-For-Expensify-Approved-Partners.md | 16 + .../Your-Expensify-Partner-Manager.md | 34 +++ ...ok-For-Small-To-Medium-Sized-Businesses.md | 283 ++++++++++++++++++ ...book-For-US-Based-Bootstrapped-Startups.md | 90 ++++++ ...laybook-For-US-Based-VC-Backed-Startups.md | 208 +++++++++++++ .../getting-started/tips-and-tricks.md | 5 + .../Enable-Location-Access-On-Web.md | 55 ++++ .../accounting-integrations/Bill-dot-com.md | 5 + .../accounting-integrations/FinancalForce.md | 5 + .../accounting-integrations/NetSuite.md | 5 + .../QuickBooks-Desktop.md | 5 + .../QuickBooks-Online.md | 5 + .../accounting-integrations/Sage-Intacct.md | 5 + .../accounting-integrations/Xero.md | 5 + .../integrations/hr-integrations/ADP.md | 5 + .../hr-integrations/Greenhouse.md | 5 + .../integrations/hr-integrations/Gusto.md | 5 + .../hr-integrations/QuickBooks-Time.md | 5 + .../integrations/hr-integrations/Rippling.md | 5 + .../integrations/hr-integrations/Workday.md | 5 + .../integrations/hr-integrations/Zenefits.md | 5 + .../other-integrations/Google-Apps-SSO.md | 5 + .../integrations/travel-integrations/Bolt.md | 5 + .../travel-integrations/Egencia.md | 5 + .../travel-integrations/Global-VaTax.md | 5 + .../integrations/travel-integrations/Grab.md | 5 + .../travel-integrations/Hotel-Tonight.md | 5 + .../integrations/travel-integrations/Kayak.md | 5 + .../integrations/travel-integrations/Lyft.md | 5 + .../travel-integrations/TrainLine.md | 5 + .../travel-integrations/TravelPerk.md | 5 + .../travel-integrations/Trip-Actions.md | 5 + .../travel-integrations/TripCatcher.md | 5 + .../integrations/travel-integrations/Uber.md | 5 + .../Adding-Users.md | 5 + .../Approval-Workflows.md | 5 + .../Approving-Reports.md | 5 + .../User-Roles.md | 5 + .../Vacation-Delegate.md | 8 + .../policy-and-domain-settings/Admins.md | 5 + .../policy-and-domain-settings/Categories.md | 5 + .../Domain-Admins.md | 5 + .../Domain-Members.md | 5 + .../Domains-Overview.md | 5 + .../policy-and-domain-settings/Expenses.md | 5 + .../policy-and-domain-settings/Invoicing.md | 5 + .../policy-and-domain-settings/Overview.md | 5 + .../policy-and-domain-settings/Per-Diem.md | 5 + .../Reimbursement.md | 5 + .../policy-and-domain-settings/Reports.md | 5 + .../policy-and-domain-settings/SAML.md | 5 + .../policy-and-domain-settings/Tags.md | 5 + .../policy-and-domain-settings/Tax.md | 5 + .../policy-and-domain-settings/Trips.md | 5 + .../send-payments/Pay-Bills.md | 5 + .../send-payments/Pay-Invoices.md | 5 + .../send-payments/Reimbursing-Reports.md | 5 + .../send-payments/Third-Party-Payments.md | 8 + 127 files changed, 1472 insertions(+) create mode 100644 docs/articles/expensify-classic/account-settings/Account-Access.md create mode 100644 docs/articles/expensify-classic/account-settings/Close-Account.md create mode 100644 docs/articles/expensify-classic/account-settings/Merge-Accounts.md create mode 100644 docs/articles/expensify-classic/account-settings/Preferences.md create mode 100644 docs/articles/expensify-classic/account-settings/Profile-Settings.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-AUS.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-USD.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-AUS.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-USD.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/Global-Reimbursement.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/Personal-Credit-Cards.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/ANZ.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Brex.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/CSV-Import.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Commercial-Card-Feeds.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Connect-Company-Cards.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Direct-Bank-Connections.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Export-To-GL-Accounts.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Reconciliation.md create mode 100644 docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Annual-Subscription.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Billing-Owner.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Change-Plan-Or-Subscription.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Consolidated-Domain-Billing.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Free-Trial.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Individual-Subscription.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Overview.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Pay-Per-Use-Subscription.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Payment-Card.md create mode 100644 docs/articles/expensify-classic/billing-and-subscriptions/Tax-Exempt.md create mode 100644 docs/articles/expensify-classic/expense-and-report-features/Attendee-Tracking.md create mode 100644 docs/articles/expensify-classic/expense-and-report-features/Currency.md create mode 100644 docs/articles/expensify-classic/expense-and-report-features/Expense-Rules.md create mode 100644 docs/articles/expensify-classic/expense-and-report-features/Expense-Types.md create mode 100644 docs/articles/expensify-classic/expense-and-report-features/Report-Comments.md create mode 100644 docs/articles/expensify-classic/expense-and-report-features/The-Expenses-Page.md create mode 100644 docs/articles/expensify-classic/expense-and-report-features/The-Reports-Page.md create mode 100644 docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md create mode 100644 docs/articles/expensify-classic/expensify-card/CPA-Card.md create mode 100644 docs/articles/expensify-classic/expensify-card/Card-Settings.md create mode 100644 docs/articles/expensify-classic/expensify-card/Connect-To-Indirect-Integration.md create mode 100644 docs/articles/expensify-classic/expensify-card/File-A-Dispute.md create mode 100644 docs/articles/expensify-classic/expensify-card/Get-The-Card.md create mode 100644 docs/articles/expensify-classic/expensify-card/Statements.md create mode 100644 docs/articles/expensify-classic/expensify-card/The-Reports-Page.md create mode 100644 docs/articles/expensify-classic/exports/Custom-Templates.md create mode 100644 docs/articles/expensify-classic/exports/Default-Export-Templates.md create mode 100644 docs/articles/expensify-classic/exports/Insights.md create mode 100644 docs/articles/expensify-classic/exports/The-Reports-Page.md create mode 100644 docs/articles/expensify-classic/get-paid-back/Mileage.md create mode 100644 docs/articles/expensify-classic/get-paid-back/Per-Diem.md create mode 100644 docs/articles/expensify-classic/get-paid-back/Third-Party-Payments.md create mode 100644 docs/articles/expensify-classic/get-paid-back/Trips.md create mode 100644 docs/articles/expensify-classic/get-paid-back/expenses/Apply-Tax.md create mode 100644 docs/articles/expensify-classic/get-paid-back/expenses/Create-Expenses.md create mode 100644 docs/articles/expensify-classic/get-paid-back/expenses/Merge-Expenses.md create mode 100644 docs/articles/expensify-classic/get-paid-back/expenses/Upload-Receipts.md create mode 100644 docs/articles/expensify-classic/get-paid-back/reports/Create-A-Report.md create mode 100644 docs/articles/expensify-classic/get-paid-back/reports/Reimbursements.md create mode 100644 docs/articles/expensify-classic/getting-started/Best-Practices.md create mode 100644 docs/articles/expensify-classic/getting-started/Employees.md create mode 100644 docs/articles/expensify-classic/getting-started/Individual-Users.md create mode 100644 docs/articles/expensify-classic/getting-started/Invite-Employees.md create mode 100644 docs/articles/expensify-classic/getting-started/Plan-Types.md create mode 100644 docs/articles/expensify-classic/getting-started/Policy-Admins.md create mode 100644 docs/articles/expensify-classic/getting-started/Referral-Program.md create mode 100644 docs/articles/expensify-classic/getting-started/Security.md create mode 100644 docs/articles/expensify-classic/getting-started/Support/Your-Expensify-Account-Manager.md create mode 100644 docs/articles/expensify-classic/getting-started/Using-The-App.md create mode 100644 docs/articles/expensify-classic/getting-started/approved-accountants/Card-Revenue-Share-For-Expensify-Approved-Partners.md create mode 100644 docs/articles/expensify-classic/getting-started/approved-accountants/Your-Expensify-Partner-Manager.md create mode 100644 docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md create mode 100644 docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md create mode 100644 docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md create mode 100644 docs/articles/expensify-classic/getting-started/tips-and-tricks.md create mode 100644 docs/articles/expensify-classic/getting-started/tips-and-tricks/Enable-Location-Access-On-Web.md create mode 100644 docs/articles/expensify-classic/integrations/accounting-integrations/Bill-dot-com.md create mode 100644 docs/articles/expensify-classic/integrations/accounting-integrations/FinancalForce.md create mode 100644 docs/articles/expensify-classic/integrations/accounting-integrations/NetSuite.md create mode 100644 docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Desktop.md create mode 100644 docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Online.md create mode 100644 docs/articles/expensify-classic/integrations/accounting-integrations/Sage-Intacct.md create mode 100644 docs/articles/expensify-classic/integrations/accounting-integrations/Xero.md create mode 100644 docs/articles/expensify-classic/integrations/hr-integrations/ADP.md create mode 100644 docs/articles/expensify-classic/integrations/hr-integrations/Greenhouse.md create mode 100644 docs/articles/expensify-classic/integrations/hr-integrations/Gusto.md create mode 100644 docs/articles/expensify-classic/integrations/hr-integrations/QuickBooks-Time.md create mode 100644 docs/articles/expensify-classic/integrations/hr-integrations/Rippling.md create mode 100644 docs/articles/expensify-classic/integrations/hr-integrations/Workday.md create mode 100644 docs/articles/expensify-classic/integrations/hr-integrations/Zenefits.md create mode 100644 docs/articles/expensify-classic/integrations/other-integrations/Google-Apps-SSO.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Bolt.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Egencia.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Grab.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Hotel-Tonight.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Kayak.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Lyft.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/TrainLine.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/TravelPerk.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Trip-Actions.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/TripCatcher.md create mode 100644 docs/articles/expensify-classic/integrations/travel-integrations/Uber.md create mode 100644 docs/articles/expensify-classic/manage-employees-and-report-approvals/Adding-Users.md create mode 100644 docs/articles/expensify-classic/manage-employees-and-report-approvals/Approval-Workflows.md create mode 100644 docs/articles/expensify-classic/manage-employees-and-report-approvals/Approving-Reports.md create mode 100644 docs/articles/expensify-classic/manage-employees-and-report-approvals/User-Roles.md create mode 100644 docs/articles/expensify-classic/manage-employees-and-report-approvals/Vacation-Delegate.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Admins.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Categories.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Domain-Admins.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Domain-Members.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Domains-Overview.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Invoicing.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Overview.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Per-Diem.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Reimbursement.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Reports.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/SAML.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Tags.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Tax.md create mode 100644 docs/articles/expensify-classic/policy-and-domain-settings/Trips.md create mode 100644 docs/articles/expensify-classic/send-payments/Pay-Bills.md create mode 100644 docs/articles/expensify-classic/send-payments/Pay-Invoices.md create mode 100644 docs/articles/expensify-classic/send-payments/Reimbursing-Reports.md create mode 100644 docs/articles/expensify-classic/send-payments/Third-Party-Payments.md diff --git a/docs/articles/expensify-classic/account-settings/Account-Access.md b/docs/articles/expensify-classic/account-settings/Account-Access.md new file mode 100644 index 000000000000..f04b45c42639 --- /dev/null +++ b/docs/articles/expensify-classic/account-settings/Account-Access.md @@ -0,0 +1,5 @@ +--- +title: Account Access +description: Account Access +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/account-settings/Close-Account.md b/docs/articles/expensify-classic/account-settings/Close-Account.md new file mode 100644 index 000000000000..cf5052fa56f1 --- /dev/null +++ b/docs/articles/expensify-classic/account-settings/Close-Account.md @@ -0,0 +1,5 @@ +--- +title: Close Account +description: Close Account +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/account-settings/Merge-Accounts.md b/docs/articles/expensify-classic/account-settings/Merge-Accounts.md new file mode 100644 index 000000000000..1c5f22478e17 --- /dev/null +++ b/docs/articles/expensify-classic/account-settings/Merge-Accounts.md @@ -0,0 +1,5 @@ +--- +title: Merge Accounts +description: Merge Accounts +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/account-settings/Preferences.md b/docs/articles/expensify-classic/account-settings/Preferences.md new file mode 100644 index 000000000000..a3e53e1177a1 --- /dev/null +++ b/docs/articles/expensify-classic/account-settings/Preferences.md @@ -0,0 +1,5 @@ +--- +title: Preferences +description: Preferences +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/account-settings/Profile-Settings.md b/docs/articles/expensify-classic/account-settings/Profile-Settings.md new file mode 100644 index 000000000000..bdc18036a46e --- /dev/null +++ b/docs/articles/expensify-classic/account-settings/Profile-Settings.md @@ -0,0 +1,5 @@ +--- +title: Profile Settings +description: Profile Settings +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-AUS.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-AUS.md new file mode 100644 index 000000000000..44488defcd67 --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-AUS.md @@ -0,0 +1,5 @@ +--- +title: Business Bank Accounts - AUS +description: Business Bank Accounts - AUS +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-USD.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-USD.md new file mode 100644 index 000000000000..218d6dcd1efa --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Business-Bank-Accounts-USD.md @@ -0,0 +1,5 @@ +--- +title: Business Bank Accounts - USD +description: Business Bank Accounts - USD +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-AUS.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-AUS.md new file mode 100644 index 000000000000..dba02f6fc52c --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-AUS.md @@ -0,0 +1,5 @@ +--- +title: Deposit Accounts - AUS +description: Deposit Accounts - AUS +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-USD.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-USD.md new file mode 100644 index 000000000000..8d3fe6e51484 --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Deposit-Accounts-USD.md @@ -0,0 +1,5 @@ +--- +title: Deposit Accounts - USD +description: Deposit Accounts - USD +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Global-Reimbursement.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Global-Reimbursement.md new file mode 100644 index 000000000000..40bdfb7741ab --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Global-Reimbursement.md @@ -0,0 +1,5 @@ +--- +title: Global Reimbursement +description: Global Reimbursement +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Personal-Credit-Cards.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Personal-Credit-Cards.md new file mode 100644 index 000000000000..016ca90ee7f7 --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/Personal-Credit-Cards.md @@ -0,0 +1,5 @@ +--- +title: Personal Credit Cards +description: Personal Credit Cards +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/ANZ.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/ANZ.md new file mode 100644 index 000000000000..6bfc7b14c09a --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/ANZ.md @@ -0,0 +1,6 @@ +--- +title: ANZ +description: A guide to integrate with your ANZ card +--- +## Resources Coming Soon! +Coming Soon!! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Brex.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Brex.md new file mode 100644 index 000000000000..7d5ad7bf0315 --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Brex.md @@ -0,0 +1,5 @@ +--- +title: Brex +description: Brex +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/CSV-Import.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/CSV-Import.md new file mode 100644 index 000000000000..db68d4431a3a --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/CSV-Import.md @@ -0,0 +1,5 @@ +--- +title: CSV Import +description: CSV Import +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Commercial-Card-Feeds.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Commercial-Card-Feeds.md new file mode 100644 index 000000000000..e49d0d61855c --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Commercial-Card-Feeds.md @@ -0,0 +1,5 @@ +--- +title: Commercial Card Feeds +description: Commercial Card Feeds +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Connect-Company-Cards.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Connect-Company-Cards.md new file mode 100644 index 000000000000..ecd4fc0a6538 --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Connect-Company-Cards.md @@ -0,0 +1,5 @@ +--- +title: Connect Company Cards +description: Connect Company Cards +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Direct-Bank-Connections.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Direct-Bank-Connections.md new file mode 100644 index 000000000000..6775b2684b61 --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Direct-Bank-Connections.md @@ -0,0 +1,5 @@ +--- +title: Direct Bank Connections +description: Direct Bank Connections +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Export-To-GL-Accounts.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Export-To-GL-Accounts.md new file mode 100644 index 000000000000..58485888b921 --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Export-To-GL-Accounts.md @@ -0,0 +1,5 @@ +--- +title: Export to GL Accounts +description: Export to GL Accounts +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Reconciliation.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Reconciliation.md new file mode 100644 index 000000000000..be400ee2c13c --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Reconciliation.md @@ -0,0 +1,5 @@ +--- +title: Reconciliation +description: Reconciliation +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md new file mode 100644 index 000000000000..d9e0d1bb994b --- /dev/null +++ b/docs/articles/expensify-classic/bank-accounts-and-credit-cards/company-cards/Troubleshooting.md @@ -0,0 +1,5 @@ +--- +title: Troubleshooting +description: Troubleshooting +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Annual-Subscription.md b/docs/articles/expensify-classic/billing-and-subscriptions/Annual-Subscription.md new file mode 100644 index 000000000000..c80a0d57400d --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Annual-Subscription.md @@ -0,0 +1,5 @@ +--- +title: Annual Subscription +description: Annual Subscription +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Billing-Owner.md b/docs/articles/expensify-classic/billing-and-subscriptions/Billing-Owner.md new file mode 100644 index 000000000000..590fbc78007e --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Billing-Owner.md @@ -0,0 +1,5 @@ +--- +title: Billing-Owner +description: Billing-Owner +--- +## Resources Coming Soon! \ No newline at end of file diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Change-Plan-Or-Subscription.md b/docs/articles/expensify-classic/billing-and-subscriptions/Change-Plan-Or-Subscription.md new file mode 100644 index 000000000000..2f593625a7d5 --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Change-Plan-Or-Subscription.md @@ -0,0 +1,5 @@ +--- +title: Change Plan or Subscription +description: Change Plan or Subscription +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Consolidated-Domain-Billing.md b/docs/articles/expensify-classic/billing-and-subscriptions/Consolidated-Domain-Billing.md new file mode 100644 index 000000000000..de6ec4a4a466 --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Consolidated-Domain-Billing.md @@ -0,0 +1,5 @@ +--- +title: Consolidated Domain Billing +description: Consolidated Domain Billing +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Free-Trial.md b/docs/articles/expensify-classic/billing-and-subscriptions/Free-Trial.md new file mode 100644 index 000000000000..8a7b7edd19d9 --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Free-Trial.md @@ -0,0 +1,5 @@ +--- +title: Free Trial +description: Free Trial +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Individual-Subscription.md b/docs/articles/expensify-classic/billing-and-subscriptions/Individual-Subscription.md new file mode 100644 index 000000000000..d6be489a1146 --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Individual-Subscription.md @@ -0,0 +1,5 @@ +--- +title: Individual Subscription +description: Individual Subscription +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Overview.md b/docs/articles/expensify-classic/billing-and-subscriptions/Overview.md new file mode 100644 index 000000000000..3352c72167cd --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Overview.md @@ -0,0 +1,5 @@ +--- +title: Overview +description: Overview +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Pay-Per-Use-Subscription.md b/docs/articles/expensify-classic/billing-and-subscriptions/Pay-Per-Use-Subscription.md new file mode 100644 index 000000000000..be431a287557 --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Pay-Per-Use-Subscription.md @@ -0,0 +1,5 @@ +--- +title: Pay-per-use Subscription +description: Pay-per-use Subscription +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Payment-Card.md b/docs/articles/expensify-classic/billing-and-subscriptions/Payment-Card.md new file mode 100644 index 000000000000..91c5d4e91eda --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Payment-Card.md @@ -0,0 +1,5 @@ +--- +title: Payment Card +description: Payment Card +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/billing-and-subscriptions/Tax-Exempt.md b/docs/articles/expensify-classic/billing-and-subscriptions/Tax-Exempt.md new file mode 100644 index 000000000000..c8f781cbd59b --- /dev/null +++ b/docs/articles/expensify-classic/billing-and-subscriptions/Tax-Exempt.md @@ -0,0 +1,5 @@ +--- +title: Tax Exempt +description: Tax Exempt +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expense-and-report-features/Attendee-Tracking.md b/docs/articles/expensify-classic/expense-and-report-features/Attendee-Tracking.md new file mode 100644 index 000000000000..bc7fbdfe84aa --- /dev/null +++ b/docs/articles/expensify-classic/expense-and-report-features/Attendee-Tracking.md @@ -0,0 +1,5 @@ +--- +title: Attendee Tracking +description: Attendee Tracking +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expense-and-report-features/Currency.md b/docs/articles/expensify-classic/expense-and-report-features/Currency.md new file mode 100644 index 000000000000..611365aa5013 --- /dev/null +++ b/docs/articles/expensify-classic/expense-and-report-features/Currency.md @@ -0,0 +1,5 @@ +--- +title: Currency +description: Currency +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expense-and-report-features/Expense-Rules.md b/docs/articles/expensify-classic/expense-and-report-features/Expense-Rules.md new file mode 100644 index 000000000000..81c664497e14 --- /dev/null +++ b/docs/articles/expensify-classic/expense-and-report-features/Expense-Rules.md @@ -0,0 +1,5 @@ +--- +title: Expense Rules +description: Expense Rules +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expense-and-report-features/Expense-Types.md b/docs/articles/expensify-classic/expense-and-report-features/Expense-Types.md new file mode 100644 index 000000000000..a75209e4dfb1 --- /dev/null +++ b/docs/articles/expensify-classic/expense-and-report-features/Expense-Types.md @@ -0,0 +1,5 @@ +--- +title: Expense Types +description: Expense Types +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expense-and-report-features/Report-Comments.md b/docs/articles/expensify-classic/expense-and-report-features/Report-Comments.md new file mode 100644 index 000000000000..3938c02bd333 --- /dev/null +++ b/docs/articles/expensify-classic/expense-and-report-features/Report-Comments.md @@ -0,0 +1,5 @@ +--- +title: Report Comments +description: Report Comments +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expense-and-report-features/The-Expenses-Page.md b/docs/articles/expensify-classic/expense-and-report-features/The-Expenses-Page.md new file mode 100644 index 000000000000..f202587568e5 --- /dev/null +++ b/docs/articles/expensify-classic/expense-and-report-features/The-Expenses-Page.md @@ -0,0 +1,5 @@ +--- +title: The Expenses Page +description: The Expenses Page +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expense-and-report-features/The-Reports-Page.md b/docs/articles/expensify-classic/expense-and-report-features/The-Reports-Page.md new file mode 100644 index 000000000000..37da613e750a --- /dev/null +++ b/docs/articles/expensify-classic/expense-and-report-features/The-Reports-Page.md @@ -0,0 +1,5 @@ +--- +title: The Reports Page +description: The Reports Page +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md b/docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md new file mode 100644 index 000000000000..e1d1a990b166 --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/Auto-Reconciliation.md @@ -0,0 +1,5 @@ +--- +title: Auto-reconciliation +description: Auto-reconciliation +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/CPA-Card.md b/docs/articles/expensify-classic/expensify-card/CPA-Card.md new file mode 100644 index 000000000000..9f4c47a6a402 --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/CPA-Card.md @@ -0,0 +1,5 @@ +--- +title: CPA Card +description: CPA Card +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/Card-Settings.md b/docs/articles/expensify-classic/expensify-card/Card-Settings.md new file mode 100644 index 000000000000..ff9a959d38aa --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/Card-Settings.md @@ -0,0 +1,5 @@ +--- +title: Card Settings +description: Card Settings +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/Connect-To-Indirect-Integration.md b/docs/articles/expensify-classic/expensify-card/Connect-To-Indirect-Integration.md new file mode 100644 index 000000000000..0e05269f6501 --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/Connect-To-Indirect-Integration.md @@ -0,0 +1,5 @@ +--- +title: Connect to Indirect Integration +description: Connect to Indirect Integration +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/File-A-Dispute.md b/docs/articles/expensify-classic/expensify-card/File-A-Dispute.md new file mode 100644 index 000000000000..296999410687 --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/File-A-Dispute.md @@ -0,0 +1,5 @@ +--- +title: File a Dispute +description: File a Dispute +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/Get-The-Card.md b/docs/articles/expensify-classic/expensify-card/Get-The-Card.md new file mode 100644 index 000000000000..9c8e804f6363 --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/Get-The-Card.md @@ -0,0 +1,5 @@ +--- +title: Get the Card +description: Get the Card +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/Statements.md b/docs/articles/expensify-classic/expensify-card/Statements.md new file mode 100644 index 000000000000..602fa610dd0b --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/Statements.md @@ -0,0 +1,5 @@ +--- +title: Statements +description: Statements +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/expensify-card/The-Reports-Page.md b/docs/articles/expensify-classic/expensify-card/The-Reports-Page.md new file mode 100644 index 000000000000..37da613e750a --- /dev/null +++ b/docs/articles/expensify-classic/expensify-card/The-Reports-Page.md @@ -0,0 +1,5 @@ +--- +title: The Reports Page +description: The Reports Page +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/exports/Custom-Templates.md b/docs/articles/expensify-classic/exports/Custom-Templates.md new file mode 100644 index 000000000000..5dcfe58b09f5 --- /dev/null +++ b/docs/articles/expensify-classic/exports/Custom-Templates.md @@ -0,0 +1,5 @@ +--- +title: Custom Templates +description: Custom Templates +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/exports/Default-Export-Templates.md b/docs/articles/expensify-classic/exports/Default-Export-Templates.md new file mode 100644 index 000000000000..4dcb624698af --- /dev/null +++ b/docs/articles/expensify-classic/exports/Default-Export-Templates.md @@ -0,0 +1,5 @@ +--- +title: Default Export Templates +description: Default Export Templates +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/exports/Insights.md b/docs/articles/expensify-classic/exports/Insights.md new file mode 100644 index 000000000000..682c2a251228 --- /dev/null +++ b/docs/articles/expensify-classic/exports/Insights.md @@ -0,0 +1,100 @@ +--- +title: Custom Reporting and Insights +description: How to get the most out of the Custom Reporing and Insights +--- + +{% raw %} +# What is Custom Reporting and Insights? +The Insights dashboard allows you to monitor all aspects of company spend across categories, employees, projects, departments, and more. You can see trends in real time, forecast company budgets, and build unlimited custom reports with help from our trained specialist team. + +![Insights Pie Chart](https://help.expensify.com/assets/images/insights-chart.png){:width="100%"} +## Review your Insights data + +1. Navigate to your [Insights page](https://www.expensify.com/expenses?param={"fromInsightsTab":true,"viewMode":"charts"}), located in the left hand menu +2. Select a specific date range (the default view has the current month pre-selected) +3. Use the filter options to select the categories, tags, employees etc that you want insights on +4. Make sure that View in the top right corner is set to the pie chart icon +5. You can view any dataset in more detail by clicking in the “View Raw Data” column + +## Export your Insights data + +1. Switch the View in the top right corner of the [Insights page](https://www.expensify.com/expenses?param={"fromInsightsTab":true,"viewMode":"charts"}) to the lists icon +2. Select the expenses you want to export, either by selecting individual expenses, or checking the select all box (next to Date at the top) +3. Select **Export To** in the top right hand corner to download the report as a .csv file + +## Create a Custom Export Report for your Expenses + +1. Navigate to **Settings > Account > Preferences > scroll down to CSV Export Formats** +2. Build up a report using these [formulas](https://community.expensify.com/discussion/5795/deep-dive-expense-level-formula/p1?new=1) +3. Click the **Custom Export** button on the Insights page and your Account Manager will help get you started on building up your report + +## Create a Custom Export Report for your Policy + +1. Navigate to **Settings > Policies > Group > [Policy Name] > Export Formats** +2. Build up a report using these [formulas](https://community.expensify.com/discussion/5795/deep-dive-expense-level-formula/p1?new=1) +3. If you need any help, click the **Support** button on the top left to contact your Account Manager + +# FAQs + +#### Can I share my custom export report? + +If you would like to create a custom export report that can be shared with other policy admins, you can create these by navigating to the **[Settings > Policies > Group > [Policy Name] > Export Formats](https://www.expensify.com/admin_policies?param={"section":"group"})** page. Custom export reports created under **Settings > Account > Preferences** page are only available to the member who created them. + +#### Can I put expenses from different policies on the same report? + +Custom export reports created under Settings > Account > Preferences page are able to export expenses from multiple policies, and custom export formats created under Settings > Policies > Group > [Policy Name] > Export Formats are for expenses reported under that policy only. + +#### Are there any default export reports available? + +Yes! We have [seven default reports](https://community.expensify.com/discussion/5602/deep-dive-default-export-templates) available to export directly from the Reports page: + +- **All Data** - Expense Level Export** - the name says it all! This is for the people who want ALL the details from their expense reports. We're talking Tax, Merchant Category Codes, Approvers - you name it, this report's got it! +- **All Data** - Report Level Export - this is the report for those who don't need to see each individual expense but want to see a line by line breakdown at a report level - submitter, total amount, report ID - that kind of stuff +- **Basic Export** - this is the best way to get a simple breakdown of all your expenses - just the basics +- **Canadian Multiple Tax Export** - tax, GST, PST...if you need to know tax then this is the export you want! +- **Category Export** - want to see a breakdown of your expenses by Category? This is the export you +- **Per Diem Export** - the name says it all +- **Tag Export** - much like the Category Export, but for Tags + +*To note: these reports will be emailed directly to your email address rather than downloaded on your computer.* + +#### How many expenses can I export in one report? +The custom export reports are best for small-to-medium chunks of data. If you want to export large amounts of data, we recommend you use a [default export report](https://community.expensify.com/discussion/5602/deep-dive-default-export-templates) that you can run from the Reports page. + +#### What other kinds of export reports can my Account Manager help me create? + +We’ve built a huge variety of custom reports for customers, so make sure to reach out to your Account Manager for more details. Some examples of custom reports we’ve build for customers before are: + +- Accrual Report +- Aged Approval Reports +- Attendee Reporting +- Audit Report +- Candidate Spend +- Category Spend Report +- Department/Project Spend Report +- Duplication Report +- Duty of Care +- Efficiency +- Employee Bank Account Status +- Employee Details +- Employee Roles +- Expense Authorizations by Country +- Expense Reports by Country +- Expense Reports not posted to finance system +- Foreign Currency Transaction +- Fringe Benefit Tax Report +- HR Report +- Invoice Billed Transaction Reconciliation +- Mileage Reports +- Out of Pocket Expenses for Reimbursement +- Per Diem Report +- Reconciliation: Accounting, Bank Statement, Billed Transaction +- Rejected Report +- Travel Rule Class +- Travel Spend +- Unposted Cash Advance Report +- Unposted Procurement Aging Report +- Unposted Travel Aging Report +- Vendor Spend +- … or anything you can imagine! +{% endraw %} \ No newline at end of file diff --git a/docs/articles/expensify-classic/exports/The-Reports-Page.md b/docs/articles/expensify-classic/exports/The-Reports-Page.md new file mode 100644 index 000000000000..37da613e750a --- /dev/null +++ b/docs/articles/expensify-classic/exports/The-Reports-Page.md @@ -0,0 +1,5 @@ +--- +title: The Reports Page +description: The Reports Page +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/Mileage.md b/docs/articles/expensify-classic/get-paid-back/Mileage.md new file mode 100644 index 000000000000..381bc28626f9 --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/Mileage.md @@ -0,0 +1,5 @@ +--- +title: Mileage +description: Mileage +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/Per-Diem.md b/docs/articles/expensify-classic/get-paid-back/Per-Diem.md new file mode 100644 index 000000000000..e5a57fc62bdf --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/Per-Diem.md @@ -0,0 +1,5 @@ +--- +title: Per Diem +description: Per Diem +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/Third-Party-Payments.md b/docs/articles/expensify-classic/get-paid-back/Third-Party-Payments.md new file mode 100644 index 000000000000..d472e54778e1 --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/Third-Party-Payments.md @@ -0,0 +1,5 @@ +--- +title: Third Party Payments +description: Third Party Payments +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/Trips.md b/docs/articles/expensify-classic/get-paid-back/Trips.md new file mode 100644 index 000000000000..3499865c4ee9 --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/Trips.md @@ -0,0 +1,5 @@ +--- +title: Trips +description: Trips +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/expenses/Apply-Tax.md b/docs/articles/expensify-classic/get-paid-back/expenses/Apply-Tax.md new file mode 100644 index 000000000000..224b622cec3f --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/expenses/Apply-Tax.md @@ -0,0 +1,5 @@ +--- +title: Apply Tax +description: Apply Tax +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/expenses/Create-Expenses.md b/docs/articles/expensify-classic/get-paid-back/expenses/Create-Expenses.md new file mode 100644 index 000000000000..8f4d035e1fe7 --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/expenses/Create-Expenses.md @@ -0,0 +1,5 @@ +--- +title: Create Expenses +description: Create Expenses +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/expenses/Merge-Expenses.md b/docs/articles/expensify-classic/get-paid-back/expenses/Merge-Expenses.md new file mode 100644 index 000000000000..c628244c9b2e --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/expenses/Merge-Expenses.md @@ -0,0 +1,5 @@ +--- +title: Merge Expenses +description: Merge Expenses +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/expenses/Upload-Receipts.md b/docs/articles/expensify-classic/get-paid-back/expenses/Upload-Receipts.md new file mode 100644 index 000000000000..2091b5f3e7f0 --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/expenses/Upload-Receipts.md @@ -0,0 +1,5 @@ +--- +title: Upload Receipts +description: Upload Receipts +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/reports/Create-A-Report.md b/docs/articles/expensify-classic/get-paid-back/reports/Create-A-Report.md new file mode 100644 index 000000000000..e6cc65290e73 --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/reports/Create-A-Report.md @@ -0,0 +1,5 @@ +--- +title: Create a Report +description: Create a Report +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/get-paid-back/reports/Reimbursements.md b/docs/articles/expensify-classic/get-paid-back/reports/Reimbursements.md new file mode 100644 index 000000000000..91c4459d2ebd --- /dev/null +++ b/docs/articles/expensify-classic/get-paid-back/reports/Reimbursements.md @@ -0,0 +1,5 @@ +--- +title: Reimbursements +description: Reimbursements +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Best-Practices.md b/docs/articles/expensify-classic/getting-started/Best-Practices.md new file mode 100644 index 000000000000..16b284ae60df --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Best-Practices.md @@ -0,0 +1,5 @@ +--- +title: Best Practices +description: Best Practices +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Employees.md b/docs/articles/expensify-classic/getting-started/Employees.md new file mode 100644 index 000000000000..f139c40be926 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Employees.md @@ -0,0 +1,5 @@ +--- +title: Employees +description: Employees +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Individual-Users.md b/docs/articles/expensify-classic/getting-started/Individual-Users.md new file mode 100644 index 000000000000..2e152ea515d7 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Individual-Users.md @@ -0,0 +1,5 @@ +--- +title: Individual Users +description: Individual Users +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Invite-Employees.md b/docs/articles/expensify-classic/getting-started/Invite-Employees.md new file mode 100644 index 000000000000..5cdb8eb086b0 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Invite-Employees.md @@ -0,0 +1,5 @@ +--- +title: Invite Employees +description: Invite Employees +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Plan-Types.md b/docs/articles/expensify-classic/getting-started/Plan-Types.md new file mode 100644 index 000000000000..7bb725a1aa35 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Plan-Types.md @@ -0,0 +1,5 @@ +--- +title: Plan-Types +description: Plan-Types +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Policy-Admins.md b/docs/articles/expensify-classic/getting-started/Policy-Admins.md new file mode 100644 index 000000000000..91d56b0c4f71 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Policy-Admins.md @@ -0,0 +1,5 @@ +--- +title: Policy Admins +description: Policy Admins +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Referral-Program.md b/docs/articles/expensify-classic/getting-started/Referral-Program.md new file mode 100644 index 000000000000..683e93d0277a --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Referral-Program.md @@ -0,0 +1,53 @@ +--- +title: Expensify Referral Program +description: Send your joining link, submit a receipt or invoice, and we'll pay you if your referral adopts Expensify. +--- + + +# About + +Expensify has grown thanks to our users who love Expensify so much that they tell their friends, colleagues, managers, and fellow business founders to use it, too. + +As a thank you, every time you bring a new user into the platform who directly or indirectly leads to the adoption of a paid annual plan on Expensify, you will earn $250. + +# How to get paid for referring people to Expensify + +1. Submit a report or invoice, or share your referral link with anyone you know who is spending too much time on expenses, or works at a company that could benefit from using Expensify. + +2. You will get $250 for any referred business that commits to an annual subscription, has 2 or more active users, and makes two monthly payments. + +That’s right! You can refer anyone working at any company you know. + +If their company goes on to become an Expensify customer with an annual subscription, and you are the earliest recorded referrer of a user on that company’s paid Expensify Policy, you'll get paid a referral reward. + +The best way to start is to submit any receipt to your manager (you'll get paid back and set yourself up for $250 if they start a subscription: win-win!) + +Referral rewards for the Spring/Summer 2023 campaign will be paid by direct deposit. + +# FAQ + +- **How will I know if I am the first person to refer a company to Expensify?** + +Successful referrers are notified after their referral pays for 2 months of an annual subscription. We will check for the earliest recorded referrer of a user on the policy, and if that is you, then we will let you know. + +- **How will you pay me if I am successful?** + +In the Spring 2023 campaign, Expensify will be paying successful referrers via direct deposit to the Deposit-Only account you have on file. Referral payouts will happen once a month for the duration of the campaign. If you do not have a Deposit-Only account at the time of your referral payout, your deposit will be processed in the next batch. + +Learn how to add a Deposit-Only account [here](https://community.expensify.com/discussion/4641/how-to-add-a-deposit-only-bank-account-both-personal-and-business). + +- **I’m outside of the US, how do I get paid?** + +While our referral payouts are in USD, you will be able to get paid via a Wise Borderless account. Learn more [here](https://community.expensify.com/discussion/5940/how-to-get-reimbursed-outside-the-us-with-wise-for-non-us-employees). + +- **My referral wasn’t counted! How can I appeal?** + +Expensify reserves the right to modify the terms of the referral program at any time, and pays out referral bonuses for eligible companies at its own discretion. + +Please send a message to concierge@expensify.com with the billing owner of the company you have referred and our team will review the referral and get back to you. + +- **Where can I find my referral link?** + +Expensify members who are opted-in for our newsletters will have received an email containing their unique referral link. + +On the mobile app, go to **Settings** > **Invite a Friend** > **Share Invite Link** to retrieve your referral link. diff --git a/docs/articles/expensify-classic/getting-started/Security.md b/docs/articles/expensify-classic/getting-started/Security.md new file mode 100644 index 000000000000..41451e2ba958 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Security.md @@ -0,0 +1,5 @@ +--- +title: Security +description: Security +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/Support/Your-Expensify-Account-Manager.md b/docs/articles/expensify-classic/getting-started/Support/Your-Expensify-Account-Manager.md new file mode 100644 index 000000000000..3ef47337a74c --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Support/Your-Expensify-Account-Manager.md @@ -0,0 +1,36 @@ +--- +title: Your Expensify Account Manager +description: Everything you need to know about Having an Expensify account manager +--- + + + +# What is an account manager? +An account manager is a dedicated point of contact to support policy admins with questions about their Expensify account. They are available to help you and other policy admins review your account, advise on best practices, and make changes to your policy on your behalf whenever you need a hand. They will actively monitor open technical issues and be proactive with recommendations to increase efficiency and minimize time spent on expense management. + +Unlike Concierge, an account manager’s support will not be real-time, 24 hours a day. A benefit of Concierge is that you get real-time support every day. Your account manager will be super responsive when online, but anything sent when they’re offline will not be responded to until they’re online again. + +For real-time responses and simple troubleshooting issues, you can always message our general support by writing to Concierge via the in-product chat or by emailing concierge@expensify.com. + +# How do I know if I have an account manager? +If you are a policy admin or domain admin, you will also hear from your account manager as soon as one gets assigned to your company. If you'd like a reminder who your account manager is, just click the Support link on the left side of Expensify - you'll see your account manager's name and photo, with an option to contact them for help. + +## How do I contact my account manager? +We make it easy to contact your account manager: + +1. Log in to your Expensify account, click "Support" along the left side of the page, and click the “Account Manager” option +2. Reply to (or click the chat link on) any email you get from your account manager +3. Sign in to new.expensify.com and go to the #admins room for any of your policies. Your account manager is in your #admin rooms ready to help you, so you can ask for help here and your account manager will respond in the chat. + +# FAQs +## Who gets an account manager? +Every customer with 10 or more paid subscribers is automatically assigned a dedicated account manager. If you have fewer than 10 active users each month, you can still get an account manager by increasing your subscription to 10 or more users, To get assigned an account manager immediately, log into your Expensify account and go to Settings > Policies > Group, then click Subscription and increase your subscription size to 10 or more. + +## How do I know if my account manager is online? +You will be able to see if they are online via their status, which will either say something like “online” or have their working hours. + +## What if I’m unable to reach my account manager? +If for some reason, you’re unable to reach your account manager, perhaps because they’re offline, then you can always reach out to Concierge for assistance. Your account manager will always get back to you when they’re online again. + +## Can I get on a call with my account manager? +Of course! You can ask your account manager to schedule a call whenever you think one might be helpful. We usually find that the most effective calls are those that deal with general setup questions. For technical troubleshooting, we typically recommend chat as that allows your account manager time to look into the issue, test things on their end, and, if needed, consult the wider Expensify technical team. It also allows you to easily refer back to instructions and links. \ No newline at end of file diff --git a/docs/articles/expensify-classic/getting-started/Using-The-App.md b/docs/articles/expensify-classic/getting-started/Using-The-App.md new file mode 100644 index 000000000000..37767ea9d78d --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/Using-The-App.md @@ -0,0 +1,5 @@ +--- +title: Using the App +description: Using the App +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/approved-accountants/Card-Revenue-Share-For-Expensify-Approved-Partners.md b/docs/articles/expensify-classic/getting-started/approved-accountants/Card-Revenue-Share-For-Expensify-Approved-Partners.md new file mode 100644 index 000000000000..b18531d43200 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/approved-accountants/Card-Revenue-Share-For-Expensify-Approved-Partners.md @@ -0,0 +1,16 @@ +--- +title: Expensify Card revenue share for ExpensifyApproved! partners +description: Earn money when your clients adopt the Expensify Card +--- + + +Start making more with us! We're thrilled to announce a new incentive for our US-based ExpensifyApproved! partner accountants. You can now earn additional income for your firm every time your client uses their Expensify Card. **In short, your firm gets 0.5% of your clients’ total Expensify Card spend as cash back**. The more your clients spend, the more cashback your firm receives!
+
This program is currently only available to US-based ExpensifyApproved! partner accountants. + +# How-to +To benefit from this program, all you need to do is ensure that you are listed as a domain admin on your client's Expensify account. If you're not currently a domain admin, your client can follow the instructions outlined in [our help article](https://community.expensify.com/discussion/5749/how-to-add-and-remove-domain-admins#:~:text=Domain%20Admins%20have%20total%20control,a%20member%20of%20the%20domain.) to assign you this role. +# FAQ +- What if my firm is not permitted to accept revenue share from our clients?
+
We understand that different firms may have different policies. If your firm is unable to accept this revenue share, you can pass the revenue share back to your client to give them an additional 0.5% of cash back using your own internal payment tools.

+- What if my firm does not wish to participate in the program?
+
Please reach out to your assigned partner manager at new.expensify.com to inform them you would not like to accept the revenue share nor do you want to pass the revenue share to your clients. \ No newline at end of file diff --git a/docs/articles/expensify-classic/getting-started/approved-accountants/Your-Expensify-Partner-Manager.md b/docs/articles/expensify-classic/getting-started/approved-accountants/Your-Expensify-Partner-Manager.md new file mode 100644 index 000000000000..c7a5dc5a04ab --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/approved-accountants/Your-Expensify-Partner-Manager.md @@ -0,0 +1,34 @@ +--- +title: Your Expensify Partner Manager +description: Everything you need to know about your Expensify Partner Manager +--- + + +# What is a Partner Manager? +A Partner Manager is a dedicated point of contact to support our ExpensifyApproved! Accountants with questions about their Expensify account. Partner Managers support our accounting partners by providing recommendations for client's accounts, assisting with firm-wide training, and ensuring partners receive the full benefits of our partnership program. They will actively monitor open technical issues and be proactive with recommendations to increase efficiency and minimize time spent on expense management. + +Unlike Concierge, a Partner Manager’s support will not be real-time, 24 hours a day. A benefit of Concierge is that you get real-time support every day. Your partner manager will be super responsive when online, but anything sent when they’re offline will not be responded to until they’re online again. + +For real-time responses and simple troubleshooting issues, you can always message our general support by writing to Concierge via the in-product chat or by emailing concierge@expensify.com. + +# How do I know if I have a Partner Manager? +For your firm to be assigned a Partner Manager, you must complete the [ExpensifyApproved! University](https://use.expensify.com/accountants) training course. Every external accountant or bookkeeper who completes the training is automatically enrolled in our program and receives all the benefits, including access to the Partner Manager. So everyone at your firm must complete the training to receive the maximum benefit. + +You can check to see if you’ve completed the course and enrolled in the ExpensifyApproved! Accountants program simply by logging into your Expensify account. In the bottom left-hand corner of the website, you will see the ExpensifyApproved! logo. + +# How do I contact my Partner Manager? +You can contact your Partner Manager by: +- Signing in to new.expensify.com and searching for your Partner Manager +- Replying to or clicking the chat link on any email you get from your Partner Manager + +# FAQs +## How do I know if my Partner Manager is online? +You will be able to see if they are online via their status in new.expensify.com, which will either say “online” or have their working hours. + +## What if I’m unable to reach my Partner Manager? +If you’re unable to contact your Partner Manager (i.e., they're out of office for the day) you can reach out to Concierge for assistance. Your Partner Manager will get back to you when they’re online again. + +## Can I get on a call with my Partner Manager? +Of course! You can ask your Partner Manager to schedule a call whenever you think one might be helpful. Partner Managers can discuss client onboarding strategies, firm wide training, and client setups. + +We recommend continuing to work with Concierge for **general support questions**, as this team is always online and available to help immediately. \ No newline at end of file diff --git a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md new file mode 100644 index 000000000000..2b95a1d13fde --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md @@ -0,0 +1,283 @@ +--- +title: Expensify Playbook for Small to Medium-Sized Businesses +description: Best practices for how to deploy Expensify for your business +--- +## Overview +This guide provides practical tips and recommendations for small businesses with 100 to 250 employees to effectively use Expensify to improve spend visibility, facilitate employee reimbursements, and reduce the risk of fraudulent expenses. + +- See our [US-based VC-Backed Startups](https://help.expensify.com/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups) if you are more concerned with top-line revenue growth + +## Who you are +As a small to medium-sized business owner, your main aim is to achieve success and grow your business. To achieve your goals, it is crucial that you make worthwhile investments in both your workforce and your business processes. This means providing your employees with the resources they need to generate revenue effectively, while also adopting measures to guarantee that expenses are compliant. + +## Step-by-step instructions for setting up Expensify +This playbook is built on best practices we’ve developed after processing expenses for tens of thousands of companies around the world. As such, use this playbook as your starting point, knowing that you can customize Expensify to suit your business needs. Every company is different, and your dedicated Setup Specialist is always one chat away with any questions you may have. + +### Step 1: Create your Expensify account +If you don't already have one, go to *[new.expensify.com](https://new.expensify.com)* and sign up for an account with your work email address. The account is free so don’t worry about the cost at this stage. + +> _Employees really appreciate how easy it is to use, and the fact that the reimbursement drops right into their bank account. Since most employees are submitting expenses from their phones, the ease of use of the app is critical_ +> +> **Robyn Gresham** +> Senior Accounting Systems Manager at SunCommon + +### Step 2: Create a Control Policy +There are three policy types, but for your small business needs we recommend the *Control Plan* for the following reasons: + +- *The Control Plan* is designed for organizations with a high volume of employee expense submissions, who also rely on compliance controls +- The ease of use and mobile-first design of the Control plan can increase employee adoption and participation, leading to better expense tracking and management. +- The plan integrates with a variety of tools, including accounting software and payroll systems, providing a seamless and integrated experience +- Accounting integrations include QuickBooks Online, Xero, NetSuite, and Sage Intacct, with indirect support from Microsoft Dynamics and any other accounting solution you work with + +We recommend creating one single policy for your US entity. This allows you to centrally manage all employees in one “group” while enforcing compliance controls and syncing with your accounting package accordingly. + +To create your Control Policy: + +1. Go to *Settings > Policies* +2. Select *Group* and click the button that says *New Policy* +3. Click *Select* under Control + +The Control Plan also gives you access to a dedicated Setup Specialist. You can find yours by looking at your policy's *#admins* room in *[new.expensify.com](https://new.expensify.com)*, and in your company’s policy settings in the *Overview* tab, where you can chat with them and schedule an onboarding call to walk through any setup questions. The Control Plan bundled with the Expensify Card is only *$9 per user per month* (not taking into account cash back your earn) when you commit annually. That’s a 75% discount off the unbundled price point if you choose to use a different Corporate Card (or no) provider. + +### Step 3: Connect your accounting system +As a small to medium-sized business, it's important to maintain proper spend management to ensure the success and stability of your organization. This requires paying close attention to your expenses, streamlining your financial processes, and making sure that your financial information is accurate, compliant, and transparent. Include best practices such as: + +- Every purchase is categorized into the correct account in your chart of accounts +- Receipts are sent to the accounting package to ensure visibility across the organization and to auditors +- Every expense is accounted for and added to your accounting system on time for your monthly accounts reconciliation. + +You do this by synchronizing Expensify and your accounting package as follows: + +1. Click *Settings > Policies* +2. Navigate to the *Connections* tab +3. Select your accounting system +4. Follow the prompts to connect your accounting package + +Check out the links below for more information on how to connect to your accounting solution: +- *[QuickBooks Online](https://community.expensify.com/discussion/4833/how-to-connect-your-policy-to-quickbooks-online)* +- *[Xero](https://community.expensify.com/discussion/5282/how-to-connect-your-policy-to-xero)* +- *[NetSuite](https://community.expensify.com/discussion/5212/how-to-connect-your-policy-to-netsuite-token-based-authentication)* +- *[Sage Intacct](https://community.expensify.com/discussion/4777/how-to-connect-to-sage-intacct-user-based-permissions-expense-reports)* +- *[Other Accounting System](https://community.expensify.com/discussion/5271/how-to-set-up-an-indirect-accounting-integration) + + +*“Employees really appreciate how easy it is to use, and the fact that the reimbursement drops right into their bank account. Since most employees are submitting expenses from their phones, the ease of use of the app is critical.”* +- Robyn Gresham, Senior Accounting Systems Manager at SunCommon + +### Step 4: Set category-specific compliance controls +Head over to the *Categories* tab to set compliance controls on your newly imported list of categories. More specifically, we recommend the following: + +1. First, enable *People Must Categorize Expenses*. Employees must select a category for each expense, otherwise, in most cases, it’s more work on you and our accounting connections will simply reject any attempt to export. +2. For more high-risk, travel-related categories, we recommend setting more strict compliance controls. For example, “Meals & Entertainment” should be set with the following: + - Receipts Required + - Descriptions Required, with Description Hints set + - Travel: “What is the business purpose of this expense?” + - Meals: “Could you share the business purpose, and tag attendees?” + - Entertainment: “Could you share the business purpose, and tag attendees?” +3. Disable any irrelevant expense categories that aren’t associated with employee spend +4. Configure *auto-categorization*, located just below your category list in the same tab. The section is titled *Default Categories*. Just find the right category, and match it with the presented category groups to allow for MCC (merchant category code) automated category selection with every imported connected card transaction. + +### Step 5: Make sure tags are required, or defaults are set +Tags in Expensify often relate to departments, projects/customers, classes, and so on. And in some cases they are *required* to be selected on every transactions. And in others, something like *departments* is a static field, meaning we could set it as an employee default and not enforce the tag selection with each expense. + +*Make Tags Required* +In the tags tab in your policy settings, you’ll notice the option to enable the “Required” field. This makes it so any time an employee doesn’t assign a tag to an expense, we’ll flag a violation on it and notify both the employee and the approver. + +- *Note:* In general, we take prior selection into account, so anytime you select a tag in Expensify, we’ll pre-populate that same field for any subsequent expense. It’s completely interchangeable, and there for convenience. + +*Set Tags as an Employee Default* +Separately, if your policy is connected to NetSuite or Sage Intacct, you can set departments, for example, as an employee default. All that means is we’ll apply the department (for example) that’s assigned to the employee record in your accounting package and apply that to every exported transaction, eliminating the need for the employee to have to manually select a department for each expense. + +### Step 6: Set rules for all expenses regardless of categorization +In the Expenses tab in your group Control policy, you’ll notice a *Violations* section designed to enforce top-level compliance controls that apply to every expense, for every employee in your policy. We recommend the following confiuration: + +*Max Expense Age: 90 days (or leave it blank)* +This will enable Expensify to catch employee reimbursement requests that are far too outdated for reimbursement, and present them as a violations. If you’d prefer a different time window, you can edit it accordingly + +*Max Expense Amount: $2,000 (or leave it blank)* +This is essentially like setting a daily or individual expense limitation on any employee, regardless of whether the transaction is reimbursable or non-reimbursable.This rule will enables Expensify to present larger expenses with a violation to notify both the submitter and approvers. + +*Receipt Required Amount: $75* +Receipts are important, and in most cases you prefer an itemized receipt. However, Expensify will generate an IRS-compliant electronic receipt (not itemized) for every expense not tied to hotels expense. For this reason, it’s important to enforce a rule where anytime an employee is on the road, and making business-related purchases at hotel (which happens a lot!), they are required to attach a physical receipt. + +![Expense Basics](https://help.expensify.com/assets/images/playbook-expense-basics.png){:width="100%"} + +At this point, you’ve set enough compliance controls around categorical spend and general expenses for all employees, such that you can put trust in our solution to audit all expenses up front so you don’t have to. Next, let’s dive into how we can comfortably take on more automation, while relying on compliance controls to capture bad behavior (or better yet, instill best practices in our employees). + +### Step 7: Set up scheduled submit +For an efficient company, we recommend setting up [Scheduled Submit](https://community.expensify.com/discussion/4476/how-to-enable-scheduled-submit-for-a-group-policy) on a *Daily* frequency: + +- Click *Settings > Policies* +- From here, select your group collect policy +- Within your policy settings, select the *Reports* tab +- You’ll notice *Scheduled Submit* is located directly under *Report Basics* +- Choose *Daily* + +Between Expensify's SmartScan technology, automatic categorization, and [DoubleCheck](https://community.expensify.com/discussion/5738/deep-dive-how-does-concierge-receipt-audit-work) features, your employees shouldn't need to do anything more than swipe their Expensify Card or take a photo of their receipt. + +Expenses with violations will stay behind for the employee to fix, while expenses that are “in-policy” will move into an approver’s queue to mitigate any potential for delays. Scheduled Submit will ensure all expenses are submitted automatically for approval. + +![Scheduled submit](https://help.expensify.com/assets/images/playbook-scheduled-submit.png){:width="100%"} + +> _We spent twice as much time and effort on expenses without getting nearly as accurate of results as with Expensify._ +> +> Kevin Valuska +> AP/AR at Road Trippers + +### Step 8: Connect your business bank account (US only) +If you’re located in the US, you can utilize Expensify’s payment processing and reimbursement features. + +*Note:* Before you begin, you’ll need the following to validate your business bank account: + +1. Your bank account credentials +2. A form of ID (a driver’s license or passport) +3. Your business tax ID number, your business’ address and your website URL + +Let’s walk through the process of linking your business bank account: + +1. Go to *Settings > Account*, and select the *Payments* tab +2. Select *Add Verified Bank Account* +3. From here, we’ll ask you to use your online banking credentials to connect to your bank (Note that this must be the account owner or admin credentials) +- Alternatively, you can go the more manual route by selecting “Connect Manually” +4. Once that’s done, we’ll collect all of the necessary information on your business, such as your legal business name and address +5. We’ll then collect your personal information, and a photo ID to confirm your identity + +You only need to do this once: you are fully set up for not only reimbursing expense reports, but issuing Expensify Cards, collecting customer invoice payments online (if applicable), as well as paying supplier bills online. + +### Step 9: Invite employees and set an approval workflow +*Select an Approval Mode* +We recommend you select *Advanced Approval* as your Approval Mode to set up a middle-management layer of a approval. If you have a single layer of approval, we recommend selecting [Submit & Approve](https://community.expensify.com/discussion/5643/deep-dive-submit-and-approve). But if *Advanced Approval* if your jam, keep reading! + +*Import your employees in bulk via CSV* +Given the amount of employees you have, it’s best you import employees in bulk via CSV. You can learn more about using a CSV file to bulk upload employees with *Advanced Approval [here](https://community.expensify.com/discussion/5735/deep-dive-the-ins-and-outs-of-advanced-approval)* + +![Bulk import your employees](https://help.expensify.com/assets/images/playbook-impoort-employees.png){:width="100%"} + +*Manually Approve All Reports* +In most cases, at this stage, approvers prefer to review all expenses for a few reasons. 1) We want to make sure expense coding is accurate, and 2) We want to make sure there are no bad actors before we export transactions to our accounting system. + +In this case we recommend setting *Manually approve all expenses over: $0* + +### Step 10: Configure Auto-Approval +Knowing you have all the control you need to review reports, we recommend configuring auto-approval for *all reports*. Why? Because you’ve already put reports through an entire approval workflow, and manually triggering reimbursement is an unnecessary action at this stage. + +1. Navigate to *Settings > Policies > Group > [Policy Name] > Reimbursement* +2. Set your *Manual Reimbursement threshold to $20,0000* + +### Step 11: Enable Domains and set up your corporate card feed for employees +Expensify is optimized to work with corporate cards from all banks – or even better, use our own perfectly integrated *[Expensify Card](https://use.expensify.com/company-credit-card)*. The first step for connecting to any bank you use for corporate cards, and the Expensify Card is to validate your company’s domain in Domain settings. + +To do this: + +- Click *Settings* +- Then select *Domains* + +#### If you have an existing corporate card +Expensify supports direct card feeds from most financial institutions. Setting up a corporate card feed will pull in the transactions from the connected cards on a daily basis. To set this up, do the following: + +1. Go to *Company Cards >* Select your bank + - If you don’t see your financial institution in the list of banks we support, you can review an alternative solution in the Feature Deep Dives section below +2. Next, enter your bank account login credentials. + - To successfully connect to your bank, we’ll need the *master admin (primary) account* login credentials. +3. Next, assign the corporate cards to your employees by selecting the employee’s email address and the corresponding card number from the two drop-down menus under the *Assign a Card* section +4. Set a transaction start date (this is really important to avoid pulling in multiple outdated historical expenses that you don’t want employees to submit) + +![If you have existing corporate cards](https://help.expensify.com/assets/images/playbook-existing-corporate-card.png){:width="100%"} + +As mentioned above, we’ll be able to pull in transactions as they post (daily) and handle receipt matching for you and your employees. One benefit of the Expensify Card for your company is being able to see transactions at the point of purchase which provides you with real-time compliance. We even send users push notifications to SmartScan their receipt when it’s required and generate IRS-compliant e-receipts as a backup wherever applicable. + +#### If you don't have a corporate card, use the Expensify Card (US only) +Expensify provides a corporate card with the following features: + +- Up to 2% cash back (up to 4% in your first 3 months!) +- [SmartLimits](https://community.expensify.com/discussion/4851/deep-dive-what-are-unapproved-expense-limits#latest) to control what each individual cardholder can spend +- A stable, unbreakable real-time connection (third-party bank feeds can run into connectivity issues) +- Receipt compliance - informing notifications (eg. add a receipt!) for users *as soon as the card is swiped* +- A 50% discount on the price of all Expensify plans +- Multiple discounts and savings on a host of partner tech suppliers +- Good Karma - 10% of all card interchange we earn goes directly to the Expensify.org Social Justice Community funds + +The Expensify Card is recommended as the most efficient way to manage your company's spending. + +Here’s how to enable it: + +1. There are *two ways* you can [apply for the Expensify Card](https://community.expensify.com/discussion/4874/how-to-apply-for-the-expensify-card) + - *Via your Inbox* + - *Via Domain Settings* - Go to Settings > Domain > Company Cards > Enable Expensify Card +2. Assign the cards to your employees +3. Set *SmartLimits*: + - *Employees* - We recommend a low limit for most employees, roughly double the size of the maximum daily spend – such as $1000. + - *Execs* - We recommend a higher limit for executives, roughly 10x the limit of a non-executive employee (eg, $10,000). + +Once the Expensify Cards have been assigned, each employee will be prompted to enter their mailing address so they can receive their physical card. In the meantime, a virtual card will be ready to use immediately. + +If you have an accounting system we directly integrate with, check out how we take automation a step further with [Continuous Reconciliation](https://community.expensify.com/discussion/7335/faq-what-is-the-expensify-card-auto-reconciliation-process). We’ll create an Expensify Card clearing and liability account for you. Each time settlement occurs, we’ll take the total amount of your purchases and create a journal entry that credits the settlement account and debits the liability account - saving you hours of manual reconciliation work at the end of your statement period. + +### Step 12: Set up Bill Pay and Invoicing +As a small business, managing bills and invoices can be a complex and time-consuming task. Whether you receive bills from vendors or need to invoice clients, it's important to have a solution that makes the process simple, efficient, and cost-effective. + +Here are some of the key benefits of using Expensify for bill payments and invoicing: +- Flexible payment options: Expensify allows you to pay your bills via ACH, credit card, or check, so you can choose the option that works best for you (US businesses only). +- Free, No Fees: The bill pay and invoicing features come included with every policy and workspace, so you won't need to pay any additional fees. +- Integration with your business bank account: With your business bank account verified, you can easily link your finances to receive payment from customers when invoices are paid. + +Let’s first chat through how Bill Pay works + +1. Have your vendors send their invoices to yourdomain.com@expensify.cash. +- This email address comes with every account, so no need to activate it anywhere. +2. Once the invoicehas been received, we’ll create a bill to pay for your review directly in Expensify +3. At the top of the bill, you’ll notice a Pay button. Once you click that, you’ll see options including ACH, credit/debit card, along with mailing a physical check. + +Similarly, you can send bills directly from Expensify as well. + +1. From the *Reports* tab, select the down arrow next to *New Report* and select *Bill* +2. Next, enter the Supplier’s email address, the Merchant name, the total amount, and the date +3. At this point, you can also upload an attachment to further validate the bill if necessary +4. Click *Submit*, we’ll forward the newly created bill directly to your Supplier. + +![Send bills directly from Expensify](https://help.expensify.com/assets/images/playbook-new-bill.png){:width="100%"} + +Reports, invoices, and bills are largely the same, in theory, just with different rules. As such, creating a customer invoice is just like creating an expense report and even a bill. + +1. From the *Reports* tab, select the down arrow next to *New Report* and select *Invoice*. +2. Add all of the expenses/transactions tied to the Invoice +3. Enter the recipient’s email address, a memo if needed, and a due date for when it needs to get paid, and click *Send* + +You’ll notice it’s a slightly different flow from creating a Bill. Here, you are adding the transactions tied to the Invoice, and establishing a due date for when it needs to get paid. If you need to apply any markups, you can do so from your policy settings under the Invoices tab. Your customers can pay their invoice in Expensify via ACH, or Check, or Credit Card. + +### Step 13: Run monthly, quarterly and annual reporting +At this stage, reporting is important and given that Expensify is the primary point of entry for all employee spend, we make reporting visually appealing and wildly customizable. + +1. Head to the *Expenses* tab on the far left of your left-hand navigation +2. Select the pie chart icon on the right top right corner +3. Configure the filters to your preference + +We recommend reporting: + +- *Monthly* - for spend analysis on your GLs, active projects and department spend +- *Quarterly* - for budget comparison reporting. Pull up your BI tool and compare your active budgets with your spend reporting here in Expensify +- *Annually* - Run annual spend trend reports with month-over-month spend analysis, and prepare yourself for the upcoming fiscal year. + +![Expenses!](https://help.expensify.com/assets/images/playbook-expenses.png){:width="100%"} + +### Step 14: Set your Subscription Size and Add a Payment card +Our pricing model is unique in the sense that you are in full control of your billing. Meaning, you have the ability to set a minimum number of employees you know will be active each month and you can choose which level of commitment fits best. We recommend setting your subscription to *Annual* to get an additional 50% off on your monthly Expensify bill. In the end, you've spent enough time getting your company fully set up with Expensify, and you've seen how well it supports you and your employees. Committing annually just makes sense. + +To set your subscription, head to: + +1. Settings > Policies +2. Select *Group* +3. Scroll down to *Subscription* +4. Select *Annual Subscription* +5. Enter the number of employees you know will be active each month +6. Enable *Auto-Renew* and *Auto-Increase Subscription Size* + +Now that we’ve gone through all of the steps for setting up your account, let’s make it official so there are no interruptions in service as your employees begin using Expensify. We handle payments for our service via a paymentcard, and to add one: + +1. Go to *Account > Settings > Payments* +2. Select *Add Payment Card* +3. Enter your name, card number, postal code, expiration and CVV +4. Click *Accept Terms* + +## You’re all set! +Congrats, you are all set up! If you need any assistance with anything mentioned above or would like to understand other features available in Expensify, reach out to your Setup Specialist directly in *[new.expensify.com](https://new.expensify.com)*. Don’t have one yet? Create a Control Policy, and we’ll automatically assign a dedicated Setup Specialist to you. diff --git a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md new file mode 100644 index 000000000000..86c6a583c758 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-Bootstrapped-Startups.md @@ -0,0 +1,90 @@ +--- +title: Expensify Playbook for US-Based Bootstrapped Startups +description: Best practices for how to deploy Expensify for your business +--- + +This playbook details best practices on how Bootstrapped Startups with less than 5 employees can use Expensify to prioritize product development while capturing business-related receipts for future reimbursement. +- See our *[Playbook for VC-Backed Startups](https://help.expensify.com/articles/playbooks/Expensify-Playbook-for-US-based-VC-Backed-Startups)* if you have taken venture capital investment and are more concerned with prioritizing top-line revenue growth than achieving near-term profitability +- See our *[Playbook for Small to Medium-Sized Businesses](https://help.expensify.com/articles/playbooks/Expensify-Playbook-for-Small-to-Medium-Sized-Businesses)* if you are more concerned with maintaining profitability than growing top-line revenue. + +# Who you are +As a bootstrapped startup, you have surrounded yourself with a small handful of people you trust, and are focused on developing your concept to officially launch and possibly take to outside investors. You are likely running your business with your own money, and possibly a small amount of funding from friends and family. You are either paying yourself a little, or not at all, but at this stage, the company isn’t profitable. And for now, you are capturing receipts so that you can reimburse yourself for startup costs when you either take on investment or start to turn a profit. + +# Step-by-step instructions for setting up Expensify +This playbook is built based on best practices we’ve developed after processing expenses for tens of thousands of companies around the world. As such, use this playbook as your starting point, knowing that you can customize Expensify to suit your business needs. Every company is different, and we’re always one chat away with any questions you may have. + +## Step 1: Create your Expensify account +If you don't already have one, go to *[new.expensify.com](https://new.expensify.com)* and sign up for an account with your business email address. + +## Step 2: Create a Free Plan Workspace +There are three plans (Free, Collect, and Control), but for your needs, we recommend the *Free Plan* for the following reasons: + +- You are looking to capture receipts, but you don’t need to submit expenses to anyone for approval or reimbursement +- You are a small, highly collaborative group and project-oriented Chat functionality can help you stay organized +- When your business produces enough cash that you can pay yourself, you might want to reimburse yourself for the expenses you’ve captured + +To create your Free Plan Workspace: + +1. Go to *[new.expensify.com](https://new.expensify.com)* +2. Select *New Workspace* +3. Select the avatar in the top left corner +4. Click on the workspace name and rename it +5. Express yourself by adding an avatar image, preferably an image of yourself + +The Free Plan also gives you direct access to lightning-fast 24/7 support via Concierge. Within *[new.expensify.com](https://new.expensify.com/concierge)*, you can start a direct message (DM) with Concierge anytime. + +## Step 3: Invite Your Team +As a bootstrapped startup, you communicate with your team all day. Similarly, if you are a co-founder, you will have multiple people that will need to capture receipts for your project. + +1. Click on your avatar +2. Select *Workspaces* +3. Click on your workspace +4. Select *Members* +5. Click *Invite*, and enter each team member’s email address + +By inviting your team, all members of your team will have access to unlimited receipt capture via SmartScan, and you’ll all have access to our free chat tool, which makes it easy to chat about your project and the expenses you’ve captured to help accelerate your project. + +## Step 4: Link Your Business Bank Account (Optional) +If you have a business bank account at this stage, congrats! You might be better suited to check out our Seed Stage playbook. If you are located in the US, you can unlock many great features by linking your US-based business bank account such as paying bills via Expensify, along with the Expensify Card. + +Here’s how to set it up: + +1. Click on your *avatar* +2. Select *Workspaces* +3. Click on your workspace name +4. At the bottom, select *Bank account* +5. Select your bank and enter your online login credentials + +Once this is done, you are all set to begin the process of enabling the Expensify Card. Not just for you, but if you have a co-founder, you can also issue them a card. + +## Step 5: Get the Expensify Card +If you linked your business bank account in the previous step, you are immediately eligible for the Expensify Card. The Expensify Card is included with your Free Plan workspace, it earns you up to 2% cash back (up to 4% in your first 3 months!), and they are all stored in your team’s workspace. It’s easy to apply and it takes minutes! + +Here’s how to enable the Expensify Card: + +1. Click on your *avatar* +2. Select *Workspaces* +3. Click on your workspace +4. Select *Cards* +5. Next, you’ll be redirected to expensify.com +6. Set a SmartLimit > $0 +7. We’ll also ask you for your mailing address to send you a physical Expensify Card + +You’ll be issued a virtual card that you can use immediately, however, in 1-3 business days your Expensify Card will arrive. You can use the Expensify Card anywhere Visa is accepted. + +## Step 6: View and Pay Bills +Whether it’s online services or vendors you work with to grow your project, you likely have bills to pay. And now that you have your business bank account linked, you can easily pay bills directly from Expensify. Seeing as these are project-related expenses, we’ll capture them for you for future reference directly within your project’s workspace. + +There’s no actual setup required. Your free plan comes with a _yourdomain.com@expensify.com_ email address. Just have all of your vendors send bills to that email address. + +To view and pay bills: + +1. Click on your *avatar* +2. Select *Workspaces* +3. Click on your workspace +4. Select *Bills* + +When you have bills to pay you can click *View all bills* under the *Manage your bills* box and we’ll keep a neatly organized list of all of the bills you can pay via ACH directly from your Expensify account. + +# You’re all set! +Congrats, you are all set up! If you need any assistance with anything mentioned above, reach out to either your Concierge directly in *[new.expensify.com](https://new.expensify.com/concierge)*, or email concierge@expensify.com. Create a Collect or Control Policy, and we’ll automatically assign a dedicated Setup Specialist to you. diff --git a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md new file mode 100644 index 000000000000..501d2f1538ef --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md @@ -0,0 +1,208 @@ +--- +title: Expensify Playbook for US-Based VC-Backed Startups +description: Best practices for how to deploy Expensify for your business +--- +This playbook details best practices on how Seed to Series A startups with under 100 employees can use Expensify to prioritize top-line revenue growth while managing spend responsibly. + +- See our Playbook for Bootstrapped Businesses if you haven't taken any VC money yet. +- See our Playbook for Small Businesses if you are more concerned with maintaining profitability than growing top-line revenue. [Coming soon…] +- See our Playbook for Midsize Businesses if you are series B or beyond, or have more than 100 employees. [Coming soon…] + +# Who you are +As a VC-backed business focused on growth and efficiency, you are looking for a product that puts smart automation in your hands. You prioritize top-line revenue growth over cash conservation, understanding that you’ll need to spend in order to grow. As a result, you want to enable your employees by putting spending power in their hands responsibly so there are appropriate compliance controls in place that scale with the business growth. Not only that, you want to decrease the amount of time you spend at the end of each month reimbursing employees, reconciling spend, and closing your books. + +# Step-by-step instructions for setting up Expensify +This playbook is built based on best practices we’ve developed after processing expenses for tens of thousands of companies around the world. As such, use this playbook as your starting point, knowing that you can customize Expensify to suit your business needs. Every company is different, and we’re always one chat away with any questions you may have. + +## Step 1: Create your Expensify account +If you don't already have one, go to *[new.expensify.com](https://new.expensify.com)* and sign up for an account with your work email address. The account is free so don’t worry about the cost at this stage. + +## Step 2: Create a Control Policy +There are three policy types, but for your needs we recommend the Control Policy for the following reasons: + +- You can cap spend on certain expense types, and set compliance controls so Expensify’s built-in Concierge Audit Tracking can detect violations on your behalf +- As a growing business with VC-funding, the Control plan will scale with you as your team grows and you start to introduce more sophisticated approval workflows + +To create your Control Policy: + +1. Go to *Settings > Policies* +2. Select *Group* and click the button that says *New Policy* +3. Click *Select* under Control + +The Control plan also gives you access to a dedicated Setup Specialist. You can find yours by looking at your policy's #admins room at *[new.expensify.com](https://new.expensify.com)*, and chatting with them there. The Control plan is bundled with the Expensify Card is $9 per user per month when you commit annually, which is a 75% discount off our standard unbundled price point. The Control plan also gives you access to a dedicated Setup Specialist. You can find yours by looking at your policy's *#admins* room in *[new.expensify.com](https://new.expensify.com)*, and chat with them there. + +## Step 3: Connect your accounting system +As a VC-backed company, your investors will want to see that your books are managed properly. That means making sure that: + +- Every purchase is categorized into the correct account in your chart of accounts +- Every expense is accounted for and added to your accounting system + +You do this by synchronizing Expensify and your accounting package as follows: + +1. Click *Settings > Policies* +2. Navigate to the *Connections* tab +3. Select your accounting system + - If you don’t see your accounting solution in the list of integrations we support, you can review an alternative solution in the Feature Deep Dives section below. +4. Follow the prompts to connect your accounting package + - Detailed instructions on connecting your accounting package are linked on the Connections page +5. Once connected, your categories will sync, and you’re ready to set Category Rules + +_“Expensify syncs seamlessly with QuickBooks, supports our web-based, paperless workflow, and offers internal controls, so it was the natural choice.”_ + _- Laura Redmond, CEO of Redmond Accounting_ + +## Step 4: Set up category rules +[Category rules](https://community.expensify.com/discussion/4638/how-to-enable-category-specific-rules-and-descriptions) are how you provide employees hints and requirements to make sure purchases stay within reasonable ranges and are documented appropriately for approval. For your company size and stage, we recommend the following: + +1. Click *Settings > Policies* +2. Navigate to the *Categories* tab where you’ll see all the categories you just imported from your accounting package +3. To set a rule for a specific category, click *“Edit Rules”* +4. The Edit Rules section will provide several expense category rules that tie to specific general ledger categories. While the individual rules might change slightly from business to business, and the exact category name will depend on your specific chart of accounts, we recommend these settings for VC backed startups: + - Set a $75 daily limit on meals and entertainment purchases + - Though we recommend [Expensify Guaranteed eReceipts](https://community.expensify.com/discussion/5542/deep-dive-what-are-ereceipts) for most purchases, for large purchases or those in categories most often associated with fraud, we recommend scanned receipts for extra protection: + - For any purchase over $1000 + - For all lodging purchases, regardless of size + - For any meal over $50/person + - For all office supplies + - For all software purchases + - For all airfare purchases + - Require manual explanations for certain high risk categories: + - For airfare expenses a description of the expense mandatory for the employee to include the purpose of the travel + - Require a description for all rideshare and taxi expenses, ensuring employees are listing a purpose for the expense + +Setting up these category rules allows you to concentrate on growth versus needing to micromanage your employees' spending. +## Step 5: Set up scheduled submit +For an efficiency-focused company, we recommend setting up [Scheduled Submit](https://community.expensify.com/discussion/4476/how-to-enable-scheduled-submit-for-a-group-policy) on a Daily frequency: + +1. Click *Settings > Policies* +2. From here, select your group Control policy +3. Within your policy settings, select the *Reports* tab +4. You’ll notice *Scheduled Submit* is located directly under *Report Basics* +5. Choose *Daily* + +Between Expensify's SmartScan technology, direct corporate card feed import, automatic categorization, and [DoubleCheck](https://community.expensify.com/discussion/5738/deep-dive-how-does-concierge-receipt-audit-work) features, your employees shouldn't need to do anything more than swipe their Expensify Card or scan their receipt. + +Scheduled Submit will ensure all expenses are submitted automatically. Any expenses that do not fall within the rules you’ve set up for your policy will be escalated to you for manual review. + +_“Our employees just SmartScan a receipt as soon as they receive it, and regardless of what currency it's in, we process the expense and issue reimbursement automatically.”_ +_- Amina Mobasher, Accountant at Ideo.org_ + +## Step 6: Connect your business bank account +If you’re located in the US, you can utilize Expensify’s payment processing and reimbursement features. + +*Note:* Before you begin, you’ll need the following to validate your business bank account: + +- Your bank account credentials +- A form of ID (a driver’s license or passport) +- Your business tax ID number, your business’ address and your website URL + +Let’s walk through the process of linking your business bank account: + +1. Go to *Settings > Account*, and select the *Payments* tab +2. Select *Add Verified Bank Account* +3. From here, we’ll ask you to use your online banking credentials to connect to your bank + - Alternatively, you can go the more manual route by selecting “Connect Manually” +4. Once that’s done, we’ll collect all of the necessary information on your business, such as your legal business name and address +5. We’ll then collect your personal information, and a photo ID to confirm your identity + +You only need to do this once. You are fully set up for not only reimbursing expense reports, but issuing Expensify Cards, collecting invoice payments online, as well as paying bills online. + +## Step 7: Invite employees +Next, you’ll want to invite your employees to the company policy you created. You can invite employees under *Settings > Policies > Policy Name > People*. From there, you can add employees one of three ways: + +- [Unique Policy Link](https://community.expensify.com/discussion/4643/how-to-invite-people-to-your-policy-using-a-join-link) - Each policy has a unique policy invite link, which is located at the top of the People tab in your policy settings. Simply share that link with anyone you’d like to add to your policy. +- [Manually](https://community.expensify.com/discussion/4975/how-to-invite-users-to-your-policy-manually-or-in-bulk/p1?new=1) - Enter employee email addresses manually by clicking the green Invite button in the People tab of your policy +- [Google SSO](https://community.expensify.com/discussion/4774/how-to-enable-google-apps-sso-with-your-expensify-group-policy) - Or, if you have a Google Workspace configured, you can synchronize your policy's people list to match your Google Workspace employee list. + +In the next section, we’ll go through how to configure approval routing but it’s important to remember that you’ll always have these 3 options to utilize, specifically the unique policy link and manual invites as your team continues to grow. + +## Step 8: Set up an approval workflow +Now, let’s set up some approval rules for your business as well as the ideal approval workflow that employee reports will follow after report submission: + +1. Go to *Settings > Policies*, and select the *People* tab. +2. From there, select [Submit & Approve](https://community.expensify.com/discussion/5643/deep-dive-submit-and-approve) - this will automatically add you as the approver, which ensures that any expenses that fall outside of the rules you set for your policy are brought to your attention. + - *Note*: If you are over 50 employees, please ask your Guide about the benefits of setting up an Advanced Approval workflow. +3. Next, enable manual approval for *expenses over $1000*. + - *Note*: We do not recommend configuring random report auditing for companies of your stage and scale. +4. Next, enable *Workflow Enforcement*. + - This ensures that employees are required to submit to you and not to someone else. +5. Disable *Prevent Self-Approval*. This is a more powerful feature recommended for companies with advanced compliance requirements, but generally isn't recommended for a company of your scale. + +Thanks to our [Concierge Receipt audit technology](https://community.expensify.com/discussion/5738/deep-dive-how-does-concierge-receipt-audit-work), once you set up an approval workflow, most expenses will be audited automatically and won’t require manual review. Your time is valuable, so you should focus it on reviewing only the expenses that fall outside of your policy’s rules. + +## Step 9: Set up your corporate card and assign cards to employees +Expensify is optimized to work with corporate cards from all banks – or even better, use our own perfectly integrated Expensify Card. + +### If you have an existing corporate card +Expensify supports direct card feeds from most financial institutions. Setting up a corporate card feed will pull in the transactions from the connected cards on a daily basis. To set this up, do the following: + +1. Go to *Settings > Domains > Company Cards >* Select your bank + - If you don’t see your financial institution in the list of banks we support, you can review an alternative solution in the Feature Deep Dives section below +2. Next, enter your bank account login credentials. + - To successfully connect to your bank, we’ll need the *master admin (primary) account* login credentials. +3. Next, assign the corporate cards to your employees by selecting the employee’s email address and the corresponding card number from the two drop-down menus under the *Assign a Card* section +4. Set a transaction start date + - If you don’t have a backlog of transactions you’d like to account for, feel free to skip this step. + +As mentioned above, we’ll be able to pull in transactions as they post (daily) and handle receipt matching for you and your employees. However, with the Expensify Card, we’re able to bring in transactions at the point of sale which provides you with real-time compliance. Next, let’s dive into how to set up the Expensify Card and the benefits of using the Expensify Card. + +### If you don't have a corporate card, use the Expensify Card +Expensify provides a corporate card with the following features: + +- Up to 2% cash back (up to 4% in your first 3 months!) +- [SmartLimits](https://community.expensify.com/discussion/4851/deep-dive-what-are-unapproved-expense-limits#latest) +- A stable, unbreakable connection (third-party bank feeds can run into connectivity issues) + +The Expensify Card is recommended as the most efficient way to manage your company's spending. + +Here’s how to enable it: + +1. There are *two ways* you can [apply for the Expensify Card](https://community.expensify.com/discussion/4874/how-to-apply-for-the-expensify-card) + - *Via your Inbox* + - *Via Domain Settings* - Go to Settings > Domain > Company Cards > Enable Expensify Card +2. Assign the cards to your employees +3. Set *SmartLimits*: + - *Employees* - We recommend a low limit for most employees, roughly double the size of the maximum daily spend – such as $1000. + - *Execs* - We recommend a higher limit for executives, roughly 10x the limit of a non-executive employee (eg, $10,000). + +Once the Expensify Cards have been assigned, each employee will be prompted to enter their mailing address so they can receive their physical card. In the meantime, a virtual card will be ready to use immediately. + +If you have an accounting system we directly integrate with, check out how we take automation a step further with [Auto-Reconciliation](https://community.expensify.com/discussion/7335/faq-what-is-the-expensify-card-auto-reconciliation-process). We’ll create an Expensify Card clearing and liability account for you. Each time settlement occurs, we’ll take the total amount of your purchases and create a journal entry that credits the settlement account and debits the liability account - saving you hours of manual reconciliation work at the end of your statement period. + +_“Moving from our other bank and getting Expensify cards into the hands of employees was super easy. I also love how simple it is to adjust credit limits and the auto reconciliation with the daily settlement.”_ +_- Robin Gresham, Senior Accounting Systems Manager at SunCommon_ + +## Step 10: Set up Bill Pay and Invoicing +As a VC-backed startup, you might have vendors you work with that send you bills. And in most cases, you probably use some third party to pay those bills if you aren’t cutting checks the old fashioned way. Similarly, you probably have clients you invoice from time to time. As an all-in-one solution, we’re here to make bill payments and invoicing easy, and every policy and workspace comes with bill pay and invoicing - at no additional cost. Since you have your business bank account verified, you can either pay your bills via ACH. Alternatively, you can pay via credit card or by check. + +Let’s first chat through how Bill Pay works + +1. Have your vendors submit bills to domain.com@expensify.cash. + - This email address comes with every account, so no need to activate it anywhere. +2. Once the bill has been received, we’ll create the bill for your review directly in Expensify +3. At the top of the bill/invoice, you’ll notice a Pay button. Once you click that, you’ll see options including ACH, credit/debit card, along with mailing a physical check. + +Similarly, you can send bills directly from Expensify as well. + +1. From the *Reports* tab, select the down arrow next to *New Report* and select *Bill* +2. Next, enter in the Supplier’s email address, the Merchant name, total amount and date +3. At this point, you can also enter in an attachment to further validate the bill if necessary +4. Click *Submit*, we’ll forward the newly created bill directly to your Supplier. + +Reports, invoices and bills - they are largely the same in theory, just with different rules. As such, creating an invoice is just like creating an expense report and even a Bill. + +1. From the *Reports* tab, select the down arrow next to *New Report* and select *Invoice*. +2. Add all of the expenses/transactions tied to the Invoice +3. Enter the recipient’s email address, a memo if needed, and a due date for when it needs to get paid, and click *Send* + +You’ll notice it’s a slightly different flow from creating a Bill. Here, you are adding the transactions tied to the Invoice, and establishing a due date for when it needs to get paid. If you need to apply any markups, you can do so from your policy settings under the Invoices tab. + +## Step 11: Add a billing card +Now that we’ve gone through all of the steps for setting up your account, let’s make it official so there are no interruptions in service as your employees begin using Expensify. We handle billing via a billing card, and to add one: + +1. Go to *Account > Settings > Payments* +2. Select *Add Payment Card* +3. Enter your name, card number, postal code, expiration and CVV +4. Click *Accept Terms* + +# You’re all set! +Congrats, you are all set up! If you need any assistance with anything mentioned above, reach out to either your Setup Specialist or your Account Manager directly in *[new.expensify.com](https://new.expensify.com)*. Don’t have one yet? Create a Control Policy, and we’ll automatically assign a dedicated Setup Specialist to you. diff --git a/docs/articles/expensify-classic/getting-started/tips-and-tricks.md b/docs/articles/expensify-classic/getting-started/tips-and-tricks.md new file mode 100644 index 000000000000..d85c7f3a0cb9 --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/tips-and-tricks.md @@ -0,0 +1,5 @@ +--- +title: Tips and Tricks +description: Tips and Tricks +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/getting-started/tips-and-tricks/Enable-Location-Access-On-Web.md b/docs/articles/expensify-classic/getting-started/tips-and-tricks/Enable-Location-Access-On-Web.md new file mode 100644 index 000000000000..649212b00f7b --- /dev/null +++ b/docs/articles/expensify-classic/getting-started/tips-and-tricks/Enable-Location-Access-On-Web.md @@ -0,0 +1,55 @@ +--- +title: Enable Location Access on Web +description: How to enable location access for Expensify websites on your browser +--- + + +# About + +If you'd like to use features that rely on your current location you will need to enable location permissions for Expensify. You can find instructions for how to enable location settings on the three most common web browsers below. If your browser is not in the list then please do a web search for your browser and "enable location settings". + +# How-to + + +### Chrome +1. Open Chrome +2. At the top right, click the three-dot Menu > Settings +3. Click "Privacy and Security" and then "Site Settings" +4. Click Location +5. Check the "Not allowed to see your location" list to make sure expensify.com and new.expensify.com are not listed. If they are, click the delete icon next to them to allow location access + +[Chrome help page](https://support.google.com/chrome/answer/142065) + +### Firefox + +1. Open Firefox +2. In the URL bar enter "about:preferences" +3. On the left hand side select "Privacy & Security" +4. Scroll down to Permissions +5. Click on Settings next to Location +6. If location access is blocked for expensify.com or new.expensify.com, you can update it here to allow access + +[Firefox help page](https://support.mozilla.org/en-US/kb/permissions-manager-give-ability-store-passwords-set-cookies-more) + +### Safari +1. In the top menu bar click Safari +2. Then select Settings > Websites +3. Click Location on the left hand side +4. If expensify.com or new.expensify.com have "Deny" set as their access, update it to "Ask" or "Allow" + +Ask: The site must ask if it can use your location. +Deny: The site can’t use your location. +Allow: The site can always use your location. + +[Safari help page](https://support.apple.com/guide/safari/websites-ibrwe2159f50/mac) \ No newline at end of file diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/Bill-dot-com.md b/docs/articles/expensify-classic/integrations/accounting-integrations/Bill-dot-com.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/Bill-dot-com.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/FinancalForce.md b/docs/articles/expensify-classic/integrations/accounting-integrations/FinancalForce.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/FinancalForce.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/NetSuite.md b/docs/articles/expensify-classic/integrations/accounting-integrations/NetSuite.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/NetSuite.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Desktop.md b/docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Desktop.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Desktop.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Online.md b/docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Online.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/QuickBooks-Online.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/Sage-Intacct.md b/docs/articles/expensify-classic/integrations/accounting-integrations/Sage-Intacct.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/Sage-Intacct.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/accounting-integrations/Xero.md b/docs/articles/expensify-classic/integrations/accounting-integrations/Xero.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/accounting-integrations/Xero.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/hr-integrations/ADP.md b/docs/articles/expensify-classic/integrations/hr-integrations/ADP.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/hr-integrations/ADP.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/hr-integrations/Greenhouse.md b/docs/articles/expensify-classic/integrations/hr-integrations/Greenhouse.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/hr-integrations/Greenhouse.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/hr-integrations/Gusto.md b/docs/articles/expensify-classic/integrations/hr-integrations/Gusto.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/hr-integrations/Gusto.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/hr-integrations/QuickBooks-Time.md b/docs/articles/expensify-classic/integrations/hr-integrations/QuickBooks-Time.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/hr-integrations/QuickBooks-Time.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/hr-integrations/Rippling.md b/docs/articles/expensify-classic/integrations/hr-integrations/Rippling.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/hr-integrations/Rippling.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/hr-integrations/Workday.md b/docs/articles/expensify-classic/integrations/hr-integrations/Workday.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/hr-integrations/Workday.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/hr-integrations/Zenefits.md b/docs/articles/expensify-classic/integrations/hr-integrations/Zenefits.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/hr-integrations/Zenefits.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/other-integrations/Google-Apps-SSO.md b/docs/articles/expensify-classic/integrations/other-integrations/Google-Apps-SSO.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/other-integrations/Google-Apps-SSO.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Bolt.md b/docs/articles/expensify-classic/integrations/travel-integrations/Bolt.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Bolt.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Egencia.md b/docs/articles/expensify-classic/integrations/travel-integrations/Egencia.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Egencia.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md b/docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Global-VaTax.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Grab.md b/docs/articles/expensify-classic/integrations/travel-integrations/Grab.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Grab.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Hotel-Tonight.md b/docs/articles/expensify-classic/integrations/travel-integrations/Hotel-Tonight.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Hotel-Tonight.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Kayak.md b/docs/articles/expensify-classic/integrations/travel-integrations/Kayak.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Kayak.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Lyft.md b/docs/articles/expensify-classic/integrations/travel-integrations/Lyft.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Lyft.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/TrainLine.md b/docs/articles/expensify-classic/integrations/travel-integrations/TrainLine.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/TrainLine.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/TravelPerk.md b/docs/articles/expensify-classic/integrations/travel-integrations/TravelPerk.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/TravelPerk.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Trip-Actions.md b/docs/articles/expensify-classic/integrations/travel-integrations/Trip-Actions.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Trip-Actions.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/TripCatcher.md b/docs/articles/expensify-classic/integrations/travel-integrations/TripCatcher.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/TripCatcher.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/integrations/travel-integrations/Uber.md b/docs/articles/expensify-classic/integrations/travel-integrations/Uber.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/integrations/travel-integrations/Uber.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/manage-employees-and-report-approvals/Adding-Users.md b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Adding-Users.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Adding-Users.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/manage-employees-and-report-approvals/Approval-Workflows.md b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Approval-Workflows.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Approval-Workflows.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/manage-employees-and-report-approvals/Approving-Reports.md b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Approving-Reports.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Approving-Reports.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/manage-employees-and-report-approvals/User-Roles.md b/docs/articles/expensify-classic/manage-employees-and-report-approvals/User-Roles.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/manage-employees-and-report-approvals/User-Roles.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/manage-employees-and-report-approvals/Vacation-Delegate.md b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Vacation-Delegate.md new file mode 100644 index 000000000000..e10e0fafb77d --- /dev/null +++ b/docs/articles/expensify-classic/manage-employees-and-report-approvals/Vacation-Delegate.md @@ -0,0 +1,8 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! + + +Kayak.md Lyft.md TrainLine.md TravelPerk.md Trip Actions.md TripCatcher.md Uber.md \ No newline at end of file diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Admins.md b/docs/articles/expensify-classic/policy-and-domain-settings/Admins.md new file mode 100644 index 000000000000..8c1267068d6b --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Admins.md @@ -0,0 +1,5 @@ +--- +title: Admins +description: Admins +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Categories.md b/docs/articles/expensify-classic/policy-and-domain-settings/Categories.md new file mode 100644 index 000000000000..00ade2b9d04f --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Categories.md @@ -0,0 +1,5 @@ +--- +title: Categories +description: Categories +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Domain-Admins.md b/docs/articles/expensify-classic/policy-and-domain-settings/Domain-Admins.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Domain-Admins.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Domain-Members.md b/docs/articles/expensify-classic/policy-and-domain-settings/Domain-Members.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Domain-Members.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Domains-Overview.md b/docs/articles/expensify-classic/policy-and-domain-settings/Domains-Overview.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Domains-Overview.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md b/docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Expenses.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Invoicing.md b/docs/articles/expensify-classic/policy-and-domain-settings/Invoicing.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Invoicing.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Overview.md b/docs/articles/expensify-classic/policy-and-domain-settings/Overview.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Overview.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Per-Diem.md b/docs/articles/expensify-classic/policy-and-domain-settings/Per-Diem.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Per-Diem.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Reimbursement.md b/docs/articles/expensify-classic/policy-and-domain-settings/Reimbursement.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Reimbursement.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Reports.md b/docs/articles/expensify-classic/policy-and-domain-settings/Reports.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Reports.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/SAML.md b/docs/articles/expensify-classic/policy-and-domain-settings/SAML.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/SAML.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Tags.md b/docs/articles/expensify-classic/policy-and-domain-settings/Tags.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Tags.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Tax.md b/docs/articles/expensify-classic/policy-and-domain-settings/Tax.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Tax.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/policy-and-domain-settings/Trips.md b/docs/articles/expensify-classic/policy-and-domain-settings/Trips.md new file mode 100644 index 000000000000..4c91b7095a4a --- /dev/null +++ b/docs/articles/expensify-classic/policy-and-domain-settings/Trips.md @@ -0,0 +1,5 @@ +--- +title: Coming Soon +description: Coming Soon +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/send-payments/Pay-Bills.md b/docs/articles/expensify-classic/send-payments/Pay-Bills.md new file mode 100644 index 000000000000..e319196eb4bd --- /dev/null +++ b/docs/articles/expensify-classic/send-payments/Pay-Bills.md @@ -0,0 +1,5 @@ +--- +title: Pay Bills +description: Pay Bills +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/send-payments/Pay-Invoices.md b/docs/articles/expensify-classic/send-payments/Pay-Invoices.md new file mode 100644 index 000000000000..0ea4d28a731a --- /dev/null +++ b/docs/articles/expensify-classic/send-payments/Pay-Invoices.md @@ -0,0 +1,5 @@ +--- +title: Pay Invoices +description: Pay Invoices +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/send-payments/Reimbursing-Reports.md b/docs/articles/expensify-classic/send-payments/Reimbursing-Reports.md new file mode 100644 index 000000000000..6c3309310ba8 --- /dev/null +++ b/docs/articles/expensify-classic/send-payments/Reimbursing-Reports.md @@ -0,0 +1,5 @@ +--- +title: Reimbursing Reports +description: Reimbursing Reports +--- +## Resources Coming Soon! diff --git a/docs/articles/expensify-classic/send-payments/Third-Party-Payments.md b/docs/articles/expensify-classic/send-payments/Third-Party-Payments.md new file mode 100644 index 000000000000..4b1166cc9c00 --- /dev/null +++ b/docs/articles/expensify-classic/send-payments/Third-Party-Payments.md @@ -0,0 +1,8 @@ +--- +title: Third Party Payments +description: Third Party Payments +--- +## Resources Coming Soon! + + + \ No newline at end of file From c00f4e48ba7180ee97b29e83599bd604c059ff58 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:23:25 +0530 Subject: [PATCH 41/55] add new expensify articles --- .../billing-and-plan-types/The-Free-Plan.md | 62 +++++++++++++ .../get-paid-back/Request-Money.md | 5 + .../getting-started/Expensify-Lounge.md | 66 +++++++++++++ .../getting-started/Referral-Program.md | 53 +++++++++++ .../chat/Everything-About-Chat.md | 85 +++++++++++++++++ .../chat/Expensify-Chat-For-Admins.md | 27 ++++++ ...Expensify-Chat-For-Conference-Attendees.md | 35 +++++++ .../Expensify-Chat-For-Conference-Speakers.md | 39 ++++++++ ...Expensify-Chat-Playbook-For-Conferences.md | 93 +++++++++++++++++++ .../QuickBooks-Online.md | 5 + 10 files changed, 470 insertions(+) create mode 100644 docs/articles/new-expensify/billing-and-plan-types/The-Free-Plan.md create mode 100644 docs/articles/new-expensify/get-paid-back/Request-Money.md create mode 100644 docs/articles/new-expensify/getting-started/Expensify-Lounge.md create mode 100644 docs/articles/new-expensify/getting-started/Referral-Program.md create mode 100644 docs/articles/new-expensify/getting-started/chat/Everything-About-Chat.md create mode 100644 docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Admins.md create mode 100644 docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Attendees.md create mode 100644 docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Speakers.md create mode 100644 docs/articles/new-expensify/getting-started/chat/Expensify-Chat-Playbook-For-Conferences.md create mode 100644 docs/articles/new-expensify/integrations/accounting-integrations/QuickBooks-Online.md diff --git a/docs/articles/new-expensify/billing-and-plan-types/The-Free-Plan.md b/docs/articles/new-expensify/billing-and-plan-types/The-Free-Plan.md new file mode 100644 index 000000000000..0a8d6b3493e0 --- /dev/null +++ b/docs/articles/new-expensify/billing-and-plan-types/The-Free-Plan.md @@ -0,0 +1,62 @@ +--- +title: The Free Plan +description: Everything you need to know about Expensify's Free Plan! +--- + + + +# What is the Free Plan? +The free plan is ideal for start-ups and small businesses to manage expenses. With the Free Plan, a workspace admin can set their team up with Expensify Cards, reimburse cash expenses, send invoices, and manage bills, all for free! You will have total visibility and control over all spending associated with your workspace in real time. + +# Features Included with the Free Plan +- Expensify Cards for all employees +- Invoicing +- Bill Pay +- Unlimited receipt scanning for everyone in the company +- Free next-day ACH reimbursements for cash expenses +- Up to 4% [cash back](https://community.expensify.com/discussion/8454/4-cash-back-on-the-expensify-card-is-here-to-stay) +- Free corporate travel booking + +# Setting Up the Free Plan +- Navigate to new.expensify.com, enter your company email address, and set a password +- Click the **green “+”** button and select **_New workspace_** + +Once you’ve created your Workspace, you will receive a message from Concierge encouraging you to chat with your Setup Specialist. Click the link in the message, and your designated Setup Specialist will guide you through how to configure your company setup. + +Once you’ve completed your company setup, you should have completed the following tasks: + +- Connected a business bank account (Settings menu > Click **_Bank account_** and follow the prompts). +- Invited members to the workspace +- Assigned Expensify Cards + +# Inviting Members to the Free Plan: +- Navigate to the Settings Menu and click **_Members_** to invite your team. You can invite employees one at a time, or you can invite multiple users by listing out their email addresses separated by a comma +- To use the Expensify Card, you must invite them to your workspace via your company email address (i.e., admin@companyemail.com and NOT admin@gmail.com). + +# Managing the Free Plan +To access your workspace settings, click your profile icon and then on your workspace name. + +This settings menu allows you to manage your workspace members, issue additional Expensify Cards, and utilize this plan’s various bill pay and payment options. + +# FAQs +## Do I need a business bank account to use the Free Plan? + +You will need a US business checking account if you want to enable the Expensify Card and set up direct ACH reimbursement. +You will need to take a few steps to verify your business bank account and connect it to Expensify. You will also need to set aside some time and have your ID ready. +If you're not in the US, you can still use the Free Plan, but the Expensify Card and direct reimbursement will not be available. + +## Can my workspace have more than one Admin? + +The Expensify Workplace only allows for one admin (the workspace creator). + +## Scheduled Submit is set to weekly on the Free Plan. Can I change this? + +No, expense reports on the Free Plan submit weekly, and there is no way to customize approval settings. + +## With the Free Plan, can I add my own categories? + +Categories are standardized on the Free Plan and can’t be edited. Custom categories and tags or accounting system integration are available on a paid plan. + +## With the Free Plan, can I export reports using a custom format? + +The Free Plan offers standard report export formats. You'll need to upgrade to a paid plan to create a custom export format. \ No newline at end of file diff --git a/docs/articles/new-expensify/get-paid-back/Request-Money.md b/docs/articles/new-expensify/get-paid-back/Request-Money.md new file mode 100644 index 000000000000..55a3f3c8172e --- /dev/null +++ b/docs/articles/new-expensify/get-paid-back/Request-Money.md @@ -0,0 +1,5 @@ +--- +title: Request Money +description: Request Money +--- +## Resources Coming Soon! diff --git a/docs/articles/new-expensify/getting-started/Expensify-Lounge.md b/docs/articles/new-expensify/getting-started/Expensify-Lounge.md new file mode 100644 index 000000000000..01a2d7a9e250 --- /dev/null +++ b/docs/articles/new-expensify/getting-started/Expensify-Lounge.md @@ -0,0 +1,66 @@ +--- +title: Welcome to the Expensify Lounge! +description: How to get the most out of the Expensify Lounge. +--- + + +# What is the Expensify Lounge? +The Expensify Lounge is a place where people go to Get Shit Done. It's a beautiful environment with great coffee and a group of people to collaborate with. Check out this guide on how to best utilize the Expensify Lounge! + +# The Two Rules +### Rule #1 - Get Shit Done + +The Lounge is a space for people to get work done. It is optimized to be the perfect environment for you to focus on your work, collaborate with others, and advance your most wild and creative ideas. To make this a reality, we ask our members to keep the following in mind: + +- **#focus** - Use the space for how it was designed and do not distract from others' focus. The space is beautiful, social, and collaborative, but it was created to help our members work effectively. +- **#urgency** - Working remotely is great, but there's nothing like real-time collaboration with your colleagues. Use the lounge to meet with co-workers IRL to continue the progress on whatever it is you're working on. +- **#results** - Don't mistake time for effort or effort for output. Upon arrival, visualize what you want to accomplish, and don't leave until it's done. + +## Rule #2 - Don’t Ruin it for Everyone Else + +We want this place to be incredible, innovative, and always elvoving. To achieve that, we have some general guidelines: + +- **#writeitdown** - If you can help others learn from you, do so. Write a blog post, a document, or a post in Expensify Chat to share with others. This includes making the Expensify Lounge a better space. Feel free to write down any improvements so we can make it better. +- **#showup** - If you are in the lounge, be fully present. Meet others, and collaborate in social rooms. The point is to build a community of people who are focused on getting shit done; you’ll get out what you put in. +- **#oneteam** - Providing an inclusive community is our priority, and we do not tolerate any form of discrimination. Aim to go out of your way to include people who want to be included. +- **#nocreeps** - Do not make people feel uncomfortable with your words or actions. If you are made to feel uncomfortable or notice this happening to someone else, you can use the escalation process outlined in the FAQ section. + +# How to Use the Expensify Lounge +Keeping those two rules in mind, below is a guide on how our members can get the most out of the lounge. + +### Rule #1 - Getting Shit Done +- **Order drinks from Concierge** - [Write Concierge here](https://new.expensify.com/concierge) to ask lounge questions or order beverages. Concierge will bring your order directly to you! +- **Using an office** - Offices are first come, first serve. If an office is open, feel free to use it! Please keep office use to under an hour. We currently do not allow reserving offices. +- **Lounge hours** - The lounge will be open from 8am-6pm PT, Monday through Friday and closed on some major holidays. You can review our Google Maps profile to check our holiday hours. +- **Make the lounge better** - Make any suggestions to improve the lounge experience in [#announce - Expensify Lounge](https://new.expensify.com/r/8292963527436014). + +## Rule #2 - Not Ruining it for Everyone Else +- **Offices are for calls** - Please do not occupy an office unless you have a call or collaborative meeting happening, and don't stay in an office for longer than an hour. +- **Respect other people** - Please do not be too loud or distracting while others are trying to work. While collaborating in Expensify Chat, be respectful of others’ viewpoints and keep a positive environment. +- **Stay home if you’re sick** - If you feel sick, please do not visit the lounge, or consider wearing a mask in public areas. +- **If you see something, say something** - If you are made to feel uncomfortable or witness others being made uncomfortable, let Concierge know. If this is happening in Expensify Chat, use our moderation tools (outlined below in the FAQ) to apply the applicable level of moderation. + +We’re so happy you are here to live rich, have fun, and save the world with us. Now, go enjoy the Expensify Lounge, and let's Get Shit Done! + +# FAQs + +#### What is Concierge? + +Concierge is our automated system that answers member questions in real-time. Questions regarding the local lounge will be routed directly to the lounge's Concierge. You can send Concierge a message if you have a drink request or general questions. They’ll take care of everything for you! + +#### Who is invited to the Expensify Lounge? + +Everyone is invited to the Expensify Lounge! Whether you're an existing customer, or you're someone looking for a great space to Get Shit Done, we'd love to have you. + +#### How do I escalate something that's making me or someone else uncomfortable? + +If you see something in Expensify Chat that should be escalated, you can use the escalation feature to mark a chat as: +- **Spam or Inconsiderate**: This will send a whisper to the sender of the message warning them of the violation, and the message will have a flag applied to it which will be visible to all users. Concierge will not review these flags. +- **Intimidating or Bullying**: The message will be immediately hidden, and the content will be reviewed by our team. After reviewing the message, and it's confirmed intimidation or bullying, the message will be permanently hidden and we'll communicate the violation to the sender of the message. +- **Harassment or Assault**: The message will be immediately hidden and reviewed by our team. The user will be sent a message to warning them of the violation, and Concierge can block the user if that's deemed necessary. + +If you witness something in-person, please write to Concierge referencing which lounge you are in, and they will escalate the issue appropriately. + +#### Where are other Expensify Lounge locations? + +Right now, we only have the San Francisco Lounge, but be on the lookout for more coming soon! diff --git a/docs/articles/new-expensify/getting-started/Referral-Program.md b/docs/articles/new-expensify/getting-started/Referral-Program.md new file mode 100644 index 000000000000..683e93d0277a --- /dev/null +++ b/docs/articles/new-expensify/getting-started/Referral-Program.md @@ -0,0 +1,53 @@ +--- +title: Expensify Referral Program +description: Send your joining link, submit a receipt or invoice, and we'll pay you if your referral adopts Expensify. +--- + + +# About + +Expensify has grown thanks to our users who love Expensify so much that they tell their friends, colleagues, managers, and fellow business founders to use it, too. + +As a thank you, every time you bring a new user into the platform who directly or indirectly leads to the adoption of a paid annual plan on Expensify, you will earn $250. + +# How to get paid for referring people to Expensify + +1. Submit a report or invoice, or share your referral link with anyone you know who is spending too much time on expenses, or works at a company that could benefit from using Expensify. + +2. You will get $250 for any referred business that commits to an annual subscription, has 2 or more active users, and makes two monthly payments. + +That’s right! You can refer anyone working at any company you know. + +If their company goes on to become an Expensify customer with an annual subscription, and you are the earliest recorded referrer of a user on that company’s paid Expensify Policy, you'll get paid a referral reward. + +The best way to start is to submit any receipt to your manager (you'll get paid back and set yourself up for $250 if they start a subscription: win-win!) + +Referral rewards for the Spring/Summer 2023 campaign will be paid by direct deposit. + +# FAQ + +- **How will I know if I am the first person to refer a company to Expensify?** + +Successful referrers are notified after their referral pays for 2 months of an annual subscription. We will check for the earliest recorded referrer of a user on the policy, and if that is you, then we will let you know. + +- **How will you pay me if I am successful?** + +In the Spring 2023 campaign, Expensify will be paying successful referrers via direct deposit to the Deposit-Only account you have on file. Referral payouts will happen once a month for the duration of the campaign. If you do not have a Deposit-Only account at the time of your referral payout, your deposit will be processed in the next batch. + +Learn how to add a Deposit-Only account [here](https://community.expensify.com/discussion/4641/how-to-add-a-deposit-only-bank-account-both-personal-and-business). + +- **I’m outside of the US, how do I get paid?** + +While our referral payouts are in USD, you will be able to get paid via a Wise Borderless account. Learn more [here](https://community.expensify.com/discussion/5940/how-to-get-reimbursed-outside-the-us-with-wise-for-non-us-employees). + +- **My referral wasn’t counted! How can I appeal?** + +Expensify reserves the right to modify the terms of the referral program at any time, and pays out referral bonuses for eligible companies at its own discretion. + +Please send a message to concierge@expensify.com with the billing owner of the company you have referred and our team will review the referral and get back to you. + +- **Where can I find my referral link?** + +Expensify members who are opted-in for our newsletters will have received an email containing their unique referral link. + +On the mobile app, go to **Settings** > **Invite a Friend** > **Share Invite Link** to retrieve your referral link. diff --git a/docs/articles/new-expensify/getting-started/chat/Everything-About-Chat.md b/docs/articles/new-expensify/getting-started/chat/Everything-About-Chat.md new file mode 100644 index 000000000000..9f73d1c759c2 --- /dev/null +++ b/docs/articles/new-expensify/getting-started/chat/Everything-About-Chat.md @@ -0,0 +1,85 @@ +--- +title: Everything About Chat +description: Everything you need to know about Expensify's Chat Features! +--- + + + +# What is Expensify Chat? +Expensify Chat is an ideal way to collaborate on expenses or payment requests by communicating in real-time with your accountant, clients, employees, or, friends. + +With Expensify Chat, you can start a conversation about that missing receipt your employee forgot to submit or chat about splitting that electric bill with your roommates. Through eChat, you can even request money from your friends after a night out on the town! + +# How to use Chat in Expensify +Download NewExpensify from the [App Store](https://apps.apple.com/us/app/expensify-cash/id1530278510) or [Google Play](https://play.google.com/store/apps/details?id=com.expensify.chat) to use the chat function. You can also access your account at new.expensify.com from your favorite web browser. + +After downloading the app, log into your new.expensify.com account (you’ll use the same login information as your Expensify Classic account). From there, you can customize your profile and start chatting immediately. + + +## Start Chatting +Select **New Chat** to chat one-on-one or **New Group** to start a group chat. +## Workspace Chat Rooms +In addition to 1:1 and group chat, members of a Workspace or Policy will have access to two additional rooms; the #announce and #admins rooms. +All workspace members are added to the #announce room by default. The #announce room lets you share important company announcements and have conversations between workspace members. + +All workspace admins can access the #admins room. Use the #admins room to collaborate with the other admins on your policy, and chat with your dedicated Expensify Onboarding Guide. If you have a subscription of 10 or more users, you're automatically assigned an Account Manager. You can ask for help and collaborate with your Account Manager in this same #admins room. Anytime someone on your team, your dedicated setup specialist, or your dedicated account manager makes any changes to your Workspace settings, that update is logged in the #admins room. +## How to format text + +- To italicize your message, place an underscore on both sides of the text: *text* +- To bold your message, place an asterisk on both sides of the text: **text** +- To strikethrough your message, place a tilde on both sides of the text: ~~text~~ +- To turn your message into code, place a backtick on both sides of the text: `text` +- To turn your text into a blockquote, add an angled bracket (>) in front of the text: + >your text +- To turn your message into a heading, place a number sign (#) in front of the text: +# Heading +- To turn your entire message into code block, place three backticks on both sides of the text: +``` +here's some text +and even more text +``` + +# FAQs +## How do I add more than one person to a chat? +Start by clicking the green chat **+** button and select **New Group**. Search for the people you want to invite and check the circle to the far right. Once you’ve selected everyone you want in the group chat, click the **Create Group** button at the bottom of your screen. + +## Can I add people to an existing Group chat? +Adding people to an existing group chat isn’t possible right now, so you’ll want to make a new group chat instead. + +## Someone I don’t recognize is in my #admins room for my workspace; who is it? +After creating your workspace, you’ll have a dedicated Expensify specialist who will help you onboard and answer your questions. You can chat with them directly in the #admins room or request a call to talk to them over the phone. Later, once you've finished onboarding, if you have a subscription of 10 or more users, a dedicated Account Manager is added to your #admins room for ongoing product support. + +## Can I force a chat to stay at the top of the chats list? +You sure can! Click on the chat you want to keep at the top of the list, and then click the small **pin** icon. If you want to unpin a chat, just click the **pin** icon again. + +# Deep Dive +## Chat display, aka Priority Mode +The way your chats display in the left-hand menu is customizable. We offer two different options; Most Recent mode and _#focus_ mode. + +- Most Recent mode will display all chats by default, sort them by the most recent, and keep your pinned chats at the top of the list. +- #focus mode will display only unread and pinned chats, and will sort them alphabetically. This setting is perfect for when you need to cut distractions and focus on a crucial project. + +You can find your display mode by clicking on your User Icon > Preferences > Priority Mode. + +## Inviting someone to Expensify Chat +If the person you want to chat with doesn’t appear in your contact list, simply type their email or phone number to invite them to chat! From there, they will receive an email with instructions and a link to create an account. + +Once they click the link, a new.expensify.com account is set up for them automatically (if they don't have one already), and they can start chatting with you immediately! + +## Flagging content as offensive +In order to maintain a safe community for our users, Expensify provides tools to report offensive content and unwanted behavior in Expensify Chat. If you see a message (or attachment/image) from another user that you’d like our moderators to review, you can flag it by clicking the flag icon in the message context menu (on desktop) or holding down on the message and selecting “Flag as offensive” (on mobile). + +![Moderation Context Menu](https://help.expensify.com/assets/images/moderation-context-menu.png){:width="100%"} + +Once the flag is selected, you will be asked to categorize the message (such as spam, bullying, and harassment). Select what you feel best represents the issue is with the content, and you’re done - the message will be sent off to our internal team for review. + +![Moderation Flagging Options](https://help.expensify.com/assets/images/moderation-flag-page.png){:width="100%"} + +Depending on the severity of the offense, messages can be hidden (with an option to reveal) or fully removed, and in extreme cases, the sender of the message can be temporarily or permanently blocked from posting. + +You will receive a whisper from Concierge any time your content has been flagged, as well as when you have successfully flagged a piece of content. + +![Moderation Reportee Whisper](https://help.expensify.com/assets/images/moderation-reportee-whisper.png){:width="100%"} +![Moderation Reporter Whisper](https://help.expensify.com/assets/images/moderation-reporter-whisper.png){:width="100%"} + +*Note: Any message sent in public chat rooms are automatically reviewed by an automated system looking for offensive content and sent to our moderators for final decisions if it is found.* diff --git a/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Admins.md b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Admins.md new file mode 100644 index 000000000000..31de150d5b5e --- /dev/null +++ b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Admins.md @@ -0,0 +1,27 @@ +--- +title: Expensify Chat for Admins +description: Best Practices for Admins settings up Expensify Chat +--- + +## Overview +Expensify Chat is an incredible way to build a community and foster long-term relationships between event producers and attendees, or attendees with each other. Admins are a huge factor in the success of the connections built in Expensify Chat during the events, as they are generally the drivers of the conference schedule, and help ensure safety and respect is upheld by all attendees both on and offline. + +## Getting Started +We’ve rounded up some resources to get you set up on Expensify Chat and ready to start connecting with your session attendees: +- [How to get set up and start using Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-use-chat-in-expensify) +- [How to format text in Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text) +- [How to flag content and/or users for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) + +## Admin Best Practices +In order to get the most out of Expensify Chat, we created a list of best practices for admins to review in order to use the tool to its fullest capabilities. + +**During the conference:** +- At a minimum, send 3 announcements throughout the day to create awareness of any sessions, activations, contests, or parties you want to promote. +- Communicate with the Expensify Team in the #admins room if you see anything you have questions about or are unsure of to make sure we’re resolving issues together ASAP. +- As an admin, It’s up to you to help keep your conference community safe and respectful. [Flag any content for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) that does not fit your culture and values to keep chatrooms a positive experience for everyone involved. + +**After the conference:** +- The rooms will all stay open after the conference ends, so encourage speakers to keep engaging as long as the conversation is going in their session room. +- Continue sharing photos and videos from the event or anything fun in #social as part of a wrap up for everyone. +- Use the #announce room to give attendees a sneak preview of your next event. +- \ No newline at end of file diff --git a/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Attendees.md b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Attendees.md new file mode 100644 index 000000000000..3d30237dca5a --- /dev/null +++ b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Attendees.md @@ -0,0 +1,35 @@ +--- +title: Expensify Chat for Conference Attendees +description: Best Practices for Conference Attendees +--- + +## Overview +Expensify Chat is the best way to meet and network with other event attendees. No more hunting down your contacts by walking the floor or trying to find someone in crowds at a party. Instead, you can use Expensify Chat to network and collaborate with others throughout the conference. + +To help get you set up for a great event, we’ve created a guide to help you get the most out of using Expensify Chat at the event you’re attending. + +## Getting Started +We’ve rounded up some resources to get you set up on Expensify Chat and ready to start connecting with your fellow attendees: + +- [How to get set up and start using Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-use-chat-in-expensify) +- [How to format text in Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text) +- [How to flag content and/or users for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) + +## Chat Best Practices +To get the most out of your experience at your conference and engage people in a meaningful conversation that will fulfill your goals instead of turning people off, here are some tips on what to do and not to do as an event attendee using Expensify Chat: + +**Do:** +- Chat about non-business topics like where the best coffee is around the event, what great lunch options are available, or where the parties are happening that night! +- Share pictures of your travel before the event to hype everyone up, during the event if you met that person you’ve been meaning to see for years, or a fun pic from a party. +- Try to create fun groups with your fellow attendees around common interests like touring a local sight, going for a morning run, or trying a famous restaurant. + +**Don't:** +- Pitch your services in public rooms like #social or speaking session rooms. +- Start a first message with a stranger with a sales pitch. +- Discuss controversial topics such as politics, religion, or anything you wouldn’t say on a first date. +- In general just remember that you are still here for business, your profile is public, and you’re representing yourself & company, so do not say anything you wouldn’t feel comfortable sharing in a business setting. + +**Pro-Tips:** +Get active in Chat early and often by having real conversations around thought leadership or non-business discussions to stand out from the crowd! Also if you’re in a session and are afraid to ask a question, just ask in the chat room to make sure you can discuss it with the speaker after the session ends. + +By following these tips you’ll ensure that your messages will not be [flagged for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) and you will not mess it up for the rest of us. diff --git a/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Speakers.md b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Speakers.md new file mode 100644 index 000000000000..5bd52425d92b --- /dev/null +++ b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-For-Conference-Speakers.md @@ -0,0 +1,39 @@ +--- +title: Expensify Chat for Conference Speakers +description: Best Practices for Conference Speakers +--- + +## Overview +Are you a speaker at an event? Great! We're delighted to provide you with an extraordinary opportunity to connect with your session attendees using Expensify Chat — before, during, and after the event. Expensify Chat offers a powerful platform for introducing yourself and your topic, fostering engaging discussions about your presentation, and maintaining the conversation with attendees even after your session is over. + +## Getting Started +We’ve rounded up some resources to get you set up on Expensify Chat and ready to start connecting with your session attendees: + +- [How to get set up and start using Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-use-chat-in-expensify) +- [How to format text in Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text) +- [How to flag content and/or users for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) + +## Setting Up a Chatroom for Your Session: Checklist +To make the most of Expensify Chat for your session, here's a handy checklist: +- Confirm that your session has an Expensify Chat room, and have the URL link ready to share with attendees in advance. + - You can find the link by clicking on the avatar for your chatroom > “Share Code” > “Copy URL to dashboard” +- Join the chat room as soon as it's ready to begin engaging with your audience right from the start. +- Consider having a session moderator with you on the day to assist with questions and discussions while you're presenting. +- Include the QR code for your session's chat room in your presentation slides. Displaying it prominently on every slide ensures that attendees can easily join the chat throughout your presentation. + +## Tips to Enhance Engagement Around Your Session +By following these steps and utilizing Expensify Chat, you can elevate your session to promote valuable interactions with your audience, and leave a lasting impact beyond the conference. We can't wait to see your sessions thrive with the power of Expensify Chat! + +**Before the event:** +- Share your session's QR code or URL on your social media platforms, your website or other platforms to encourage attendees to join the conversation early on. +- Encourage attendees to ask questions in the chat room before the event, enabling you to tailor your session and address their specific interests. + +**During the event:** +- Keep your QR code readily available during the conference by saving it as a photo on your phone or setting it as your locked screen image. This way, you can easily share it with others you meet. +- Guide your audience back to the QR code and encourage them to ask questions, fostering interactive discussions. + +**After the event:** +- Continue engaging with attendees by responding to their questions and comments, helping you expand your audience and sustain interest. +- Share your presentation slides after the event as well as any photos from your session, allowing attendees to review and share your content with their networks if they want to. + +If you have any questions on how Expensify Chat works, head to our guide [here](https://help.expensify.com/articles/other/Everything-About-Chat). diff --git a/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-Playbook-For-Conferences.md b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-Playbook-For-Conferences.md new file mode 100644 index 000000000000..8f806bb03146 --- /dev/null +++ b/docs/articles/new-expensify/getting-started/chat/Expensify-Chat-Playbook-For-Conferences.md @@ -0,0 +1,93 @@ +--- +title: Expensify Chat Playbook for Conferences +description: Best practices for how to deploy Expensify Chat for your conference +--- +## Overview +To help make setting up Expensify Chat for your event and your attendees super simple, we’ve created a guide for all of the technical setup details. + +## Who you are +As a conference organizer, you’re expected to amaze and inspire attendees. You want attendees to get to the right place on time, engage with the speakers, and create relationships with each other that last long after the conference is done. Enter Expensify Chat, a free feature that allows attendees to interact with organizers and other attendees in realtime. With Expensify Chat, you can: + +- Communicate logistics and key information +- Foster conference wide attendee networking +- Organize conversations by topic and audience +- Continue conversations long after the event itself +- Digitize attendee social interaction +- Create an inclusive environment for virtual attendees + +Sounds good? Great! In order to ensure your team, your speakers, and your attendees have the best experience possible, we’ve created a guide on how to use Expensify Chat at your event. + +*Let’s get started!* + + +## Support +Connect with your dedicated account manager in any new.expensify.com #admins room. Your account manager is excited to brainstorm the best ways to make the most out of your event and work through any questions you have about the setup steps below. + +We also have a number of [moderation tools](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) available to admins to help make sure your event is seamless, safe, and fun! + +## Step by step instructions for setting up your conference on Expensify Chat +Based on our experience running conferences atop Expensify Chat, we recommend the following simple steps: + +### Step 1: Create your event workspace in Expensify +To create your event workspace in Expensify: +1. In [new.expensify.com](https://new.expensify.com): “+” > “New workspace” +1. Name the workspace (e.g. “ExpensiCon”) + +### Step 2: Set up all the Expensify Chat rooms you want to feature at your event +**Protip**: Your Expensify account manager can complete this step with you. Chat them in #admins on new.expensify.com to coordinate! + +To create a new chat room: +1. Go to [new.expensify.com](https://new.expensify.com) +1. Go to “+” > New room +1. Name the room (e.g. “#social”) +1. Select the workspace created in step 1 +1. Select “Public” visibility +1. Repeat for each room + +For an easy-to-follow event, we recommend creating these chat rooms: + +- **#social** - This room will include all attendees, speakers, and members of your organizing team. You can use this room to discuss social events, happy hours, dinners, or encourage attendees to mingle, share photos and connect. +- **#announcements** - This room will be used as your main announcement channel, and should only be used by organizers to announce schedule updates or anything important that your attendees need to know. Everyone in your policy will be invited to this channel, but chatting in here isn’t encouraged so to keep the noise to a minimum. +- **Create an individual room for each session** - Attendees will be able to engage with the speaker/session leader and can ask questions about their content either before/during/after the session. +- **Create a room with your Expensify account manager/s** - We can use this room to coordinate using Expensify Chat before, during, and after the event. + +**Protip** Check out our [moderation tools](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) to help flag comments deemed to be spam, inconsiderate, intimidating, bullying, harassment, assault. On any comment just click the flag icon to moderate conversation. + +### Step 3: Add chat room QR codes to the applicable session slide deck +Gather QR codes: +1. Go to [new.expensify.com](https://new.expensify.com) +1. Click into a room and click the room name or avatar in the top header +1. Go into Share Code +1. Screenshot the QR code to add to your deck + +Add the QR code to every slide so that if folks forget to scan the QR code at the beginning of the presentation, they can still join the discussion. + +### Step 4: Plan out your messaging and cadence before the event begins +Expensify Chat is a great place to provide updates leading up to your event -- share news, get folks excited about speakers, and let attendees know of crucial event information like recommended attire, travel info, and more. For example, you might consider: + +**Prep your announcements:** +- Create a document containing drafts of the key messages you intend to send throughout the day. +- If your event's agenda is broken up into hourly blocks, create a separate section for each hour of the event, to make it easy to find the correct section at the right time. +- Start each day with a review of the daily agenda, such as a bullet list summarizing what's happening hour by hour. + +**Post your updates:** +- Designate a team member to post each update in #announce at the designated time. +- Each hour, send a message listing exactly what is happening next – if there are multiple sessions happening simultaneously, list out each, along with a description of the session, a reminder of where it's located, and (most importantly) a link to the chat room for that session +- Write the messages in [markdown format](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text), such that they can be copy/pasted directly into Expensify Chat for sending. + - If there is some formatting issue upon posting, no problem: just edit the comment after sending, and it'll be fixed for everyone. +- We’d also recommend posting your updates on new lines so that if someone has a question about a certain item they can ask in a thread pertaining to that topic, rather than in one consolidated block. + +**Protip**: Your account manager can help you create this document, and would be happy to send each message at the appointed time for you. + +### Step 5: Share Expensify Chat How-To Resources with Speakers, Attendees, Admins +We’ve created a few helpful best practice docs for your speakers, admins, and attendees to help navigate using Expensify Chat at your event. Feel free to share the links below with them! + +- [Expensify Chat for Conference Attendees](https://help.expensify.com/articles/other/Expensify-Chat-For-Conference-Attendees) +- [Expensify Chat for Conference Speakers](https://help.expensify.com/articles/other/Expensify-Chat-For-Conference-Speakers) +- [Expensify Chat for Admins](https://help.expensify.com/articles/other/Expensify-Chat-For-Admins) + +### Step 6: Follow up with attendees after the event +Continue the connections by using Expensify Chat to keep your conference community connected. Encourage attendees to share photos, their favorite memories, funny stories, and more. + +## Conclusion +Once you have completed the above steps you are ready to host your conference on Expensify Chat! Let your account manager know any questions you have over in your [new.expensify.com](https://new.expensify.com) #admins room and start driving activity in your Expensify Chat rooms. Once you’ve reviewed this doc you should have the foundations in place, so a great next step is to start training your speakers on how to use Expensify Chat for their sessions. Coordinate with your account manager to make sure everything goes smoothly! diff --git a/docs/articles/new-expensify/integrations/accounting-integrations/QuickBooks-Online.md b/docs/articles/new-expensify/integrations/accounting-integrations/QuickBooks-Online.md new file mode 100644 index 000000000000..ed4d127d5c26 --- /dev/null +++ b/docs/articles/new-expensify/integrations/accounting-integrations/QuickBooks-Online.md @@ -0,0 +1,5 @@ +--- +title: QuickBooks Online +description: QuickBooks Online +--- +## Resources Coming Soon! From 09266bea52f1f45abff4e844083972b768621525 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:27:36 +0530 Subject: [PATCH 42/55] add coming soon articles for new expensify --- docs/articles/new-expensify/account-settings/Coming-Soon.md | 4 ++++ .../bank-accounts-and-credit-cards/Coming-Soon.md | 4 ++++ .../new-expensify/expense-and-report-features/Coming-Soon.md | 4 ++++ docs/articles/new-expensify/expensify-card/Coming-Soon.md | 4 ++++ docs/articles/new-expensify/exports/Coming-Soon.md | 4 ++++ .../manage-employees-and-report-approvals/Coming-Soon.md | 4 ++++ docs/articles/new-expensify/send-payments/Coming-Soon.md | 4 ++++ .../workspace-and-domain-settings/Coming-Soon.md | 4 ++++ 8 files changed, 32 insertions(+) create mode 100644 docs/articles/new-expensify/account-settings/Coming-Soon.md create mode 100644 docs/articles/new-expensify/bank-accounts-and-credit-cards/Coming-Soon.md create mode 100644 docs/articles/new-expensify/expense-and-report-features/Coming-Soon.md create mode 100644 docs/articles/new-expensify/expensify-card/Coming-Soon.md create mode 100644 docs/articles/new-expensify/exports/Coming-Soon.md create mode 100644 docs/articles/new-expensify/manage-employees-and-report-approvals/Coming-Soon.md create mode 100644 docs/articles/new-expensify/send-payments/Coming-Soon.md create mode 100644 docs/articles/new-expensify/workspace-and-domain-settings/Coming-Soon.md diff --git a/docs/articles/new-expensify/account-settings/Coming-Soon.md b/docs/articles/new-expensify/account-settings/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/account-settings/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- diff --git a/docs/articles/new-expensify/bank-accounts-and-credit-cards/Coming-Soon.md b/docs/articles/new-expensify/bank-accounts-and-credit-cards/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/bank-accounts-and-credit-cards/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- diff --git a/docs/articles/new-expensify/expense-and-report-features/Coming-Soon.md b/docs/articles/new-expensify/expense-and-report-features/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/expense-and-report-features/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- diff --git a/docs/articles/new-expensify/expensify-card/Coming-Soon.md b/docs/articles/new-expensify/expensify-card/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/expensify-card/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- diff --git a/docs/articles/new-expensify/exports/Coming-Soon.md b/docs/articles/new-expensify/exports/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/exports/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- diff --git a/docs/articles/new-expensify/manage-employees-and-report-approvals/Coming-Soon.md b/docs/articles/new-expensify/manage-employees-and-report-approvals/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/manage-employees-and-report-approvals/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- diff --git a/docs/articles/new-expensify/send-payments/Coming-Soon.md b/docs/articles/new-expensify/send-payments/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/send-payments/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- diff --git a/docs/articles/new-expensify/workspace-and-domain-settings/Coming-Soon.md b/docs/articles/new-expensify/workspace-and-domain-settings/Coming-Soon.md new file mode 100644 index 000000000000..6b85bb0364b5 --- /dev/null +++ b/docs/articles/new-expensify/workspace-and-domain-settings/Coming-Soon.md @@ -0,0 +1,4 @@ +--- +title: Coming Soon +description: Coming Soon +--- From 247055e11ca33db21cee76119a86249df1614c18 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 20:56:34 +0530 Subject: [PATCH 43/55] fix lint --- .github/scripts/createDocsRoutes.js | 52 ++++++++++++++--------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index d74b00172fcf..a9a3e1462225 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -48,32 +48,6 @@ function pushOrCreateEntry(hubs, hub, key, entry) { } } -function run() { - const expensifyClassicArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.expensifyClassic}`); - const newExpensifyArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.newExpensify}`); - - const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === platformNames.expensifyClassic); - const newExpensifyRoute = routes.platforms.find((platform) => platform.href === platformNames.newExpensify); - - if (expensifyClassicArticleHubs.length !== expensifyClassicRoute.hubs.length) { - console.error(warn(platformNames.expensifyClassic)); - return 1; - } - - if (newExpensifyArticleHubs.length !== newExpensifyRoute.hubs.length) { - console.error(warn(platformNames.newExpensify)); - return 1; - } - - createHubsWithArticles(expensifyClassicArticleHubs, platformNames.expensifyClassic, expensifyClassicRoute.hubs); - createHubsWithArticles(newExpensifyArticleHubs, platformNames.newExpensify, newExpensifyRoute.hubs); - - // Convert the object to YAML and write it to the file - let yamlString = yaml.dump(routes); - yamlString = disclaimer + yamlString; - fs.writeFileSync(`${docsDir}/_data/routes.yml`, yamlString); -} - /** * Add articles and sections to hubs * @param {Array} hubs - The hubs inside docs/articles/ for a platform @@ -109,6 +83,32 @@ function createHubsWithArticles(hubs, platformName, routeHubs) { }); } +function run() { + const expensifyClassicArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.expensifyClassic}`); + const newExpensifyArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.newExpensify}`); + + const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === platformNames.expensifyClassic); + const newExpensifyRoute = routes.platforms.find((platform) => platform.href === platformNames.newExpensify); + + if (expensifyClassicArticleHubs.length !== expensifyClassicRoute.hubs.length) { + console.error(warn(platformNames.expensifyClassic)); + return 1; + } + + if (newExpensifyArticleHubs.length !== newExpensifyRoute.hubs.length) { + console.error(warn(platformNames.newExpensify)); + return 1; + } + + createHubsWithArticles(expensifyClassicArticleHubs, platformNames.expensifyClassic, expensifyClassicRoute.hubs); + createHubsWithArticles(newExpensifyArticleHubs, platformNames.newExpensify, newExpensifyRoute.hubs); + + // Convert the object to YAML and write it to the file + let yamlString = yaml.dump(routes); + yamlString = disclaimer + yamlString; + fs.writeFileSync(`${docsDir}/_data/routes.yml`, yamlString); +} + try { run(); } catch (error) { From 7cf684df33c6860f53dcf8585b9bf422e5c5d7b8 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 21:06:45 +0530 Subject: [PATCH 44/55] fix lint --- .github/scripts/createDocsRoutes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index a9a3e1462225..f12615ba2184 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -87,8 +87,8 @@ function run() { const expensifyClassicArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.expensifyClassic}`); const newExpensifyArticleHubs = fs.readdirSync(`${docsDir}/articles/${platformNames.newExpensify}`); - const expensifyClassicRoute = routes.platforms.find((platform) => platform.href === platformNames.expensifyClassic); - const newExpensifyRoute = routes.platforms.find((platform) => platform.href === platformNames.newExpensify); + const expensifyClassicRoute = _.find(routes.platforms, (platform) => platform.href === platformNames.expensifyClassic); + const newExpensifyRoute = _.find(routes.platforms, (platform) => platform.href === platformNames.newExpensify); if (expensifyClassicArticleHubs.length !== expensifyClassicRoute.hubs.length) { console.error(warn(platformNames.expensifyClassic)); From 4909cb20567c69bdcbf3307f6fb7fd6af23ac5a9 Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Wed, 20 Sep 2023 21:07:47 +0530 Subject: [PATCH 45/55] rename --- .github/scripts/createDocsRoutes.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index f12615ba2184..8f984826ad93 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -2,7 +2,7 @@ const yaml = require('js-yaml'); const fs = require('fs'); const _ = require('underscore'); -const warn = (platform) => `Number of hubs in _routes.yml does not match number of hubs in docs/${platform}/articles. Please update _routes.yml with hub info.`; +const warnMessage = (platform) => `Number of hubs in _routes.yml does not match number of hubs in docs/${platform}/articles. Please update _routes.yml with hub info.`; const disclaimer = '# This file is auto-generated. Do not edit it directly. Use npm run createDocsRoutes instead.\n'; const docsDir = `${process.cwd()}/docs`; const routes = yaml.load(fs.readFileSync(`${docsDir}/_data/_routes.yml`, 'utf8')); @@ -91,12 +91,12 @@ function run() { const newExpensifyRoute = _.find(routes.platforms, (platform) => platform.href === platformNames.newExpensify); if (expensifyClassicArticleHubs.length !== expensifyClassicRoute.hubs.length) { - console.error(warn(platformNames.expensifyClassic)); + console.error(warnMessage(platformNames.expensifyClassic)); return 1; } if (newExpensifyArticleHubs.length !== newExpensifyRoute.hubs.length) { - console.error(warn(platformNames.newExpensify)); + console.error(warnMessage(platformNames.newExpensify)); return 1; } From 9adef6e47a56810e721b930566928dd08532710c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Wed, 20 Sep 2023 20:19:27 +0200 Subject: [PATCH 46/55] add ForwardRef note to STYLE.md --- contributingGuides/STYLE.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/contributingGuides/STYLE.md b/contributingGuides/STYLE.md index b615104f6aab..0a88ecd7bda8 100644 --- a/contributingGuides/STYLE.md +++ b/contributingGuides/STYLE.md @@ -491,6 +491,19 @@ When writing a function component you must ALWAYS add a `displayName` property a export default Avatar; ``` +## Forwarding refs + +When forwarding a ref define named component and pass it directly to the `forwardRef`. By doing this we remove potential extra layer in React tree in form of anonymous component. + +```javascript + function FancyInput(props, ref) { + ... + return + } + + export default React.forwardRef(FancyInput) +``` + ## Stateless components vs Pure Components vs Class based components vs Render Props - When to use what? Class components are DEPRECATED. Use function components and React hooks. From 93d58d5a95ae621c85f51e6aa41756973d513da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Wed, 20 Sep 2023 20:23:52 +0200 Subject: [PATCH 47/55] add changes to ForwardRef section in TS_CHEATSHEET --- contributingGuides/TS_CHEATSHEET.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/contributingGuides/TS_CHEATSHEET.md b/contributingGuides/TS_CHEATSHEET.md index df6d70b5ae90..1e330dafb7cf 100644 --- a/contributingGuides/TS_CHEATSHEET.md +++ b/contributingGuides/TS_CHEATSHEET.md @@ -43,7 +43,9 @@ - [1.2](#forwardRef) **`forwardRef`** ```ts - import { forwardRef, useRef, ReactNode } from "react"; + // CustomTextInput.tsx + + import { forwardRef, useRef, ReactNode, ForwardedRef } from "react"; import { TextInput, View } from "react-native"; export type CustomTextInputProps = { @@ -51,16 +53,18 @@ children?: ReactNode; }; - const CustomTextInput = forwardRef( - (props, ref) => { - return ( - - - {props.children} - - ); - } - ); + function CustomTextInput(props: CustomTextInputProps, ref: ForwardedRef) { + return ( + + + {props.children} + + ); + }; + + export default forwardRef(CustomTextInput); + + // ParentComponent.tsx function ParentComponent() { const ref = useRef(); From ceee888aac987759cb98395bcae4aaccc942c2ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Wed, 20 Sep 2023 20:27:31 +0200 Subject: [PATCH 48/55] add generic component annotation to forwardRef section in TS_CHEATSHEET --- contributingGuides/TS_CHEATSHEET.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contributingGuides/TS_CHEATSHEET.md b/contributingGuides/TS_CHEATSHEET.md index 1e330dafb7cf..199127acda97 100644 --- a/contributingGuides/TS_CHEATSHEET.md +++ b/contributingGuides/TS_CHEATSHEET.md @@ -48,12 +48,12 @@ import { forwardRef, useRef, ReactNode, ForwardedRef } from "react"; import { TextInput, View } from "react-native"; - export type CustomTextInputProps = { - label: string; + export type CustomTextInputProps = { + label: T; children?: ReactNode; }; - function CustomTextInput(props: CustomTextInputProps, ref: ForwardedRef) { + function CustomTextInput(props: CustomTextInputProps, ref: ForwardedRef) { return ( From aed5aa94232abe7e049b389fe5eb793ec5356456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Wed, 20 Sep 2023 20:30:41 +0200 Subject: [PATCH 49/55] Revert "add generic component annotation to forwardRef section in TS_CHEATSHEET" This reverts commit ceee888aac987759cb98395bcae4aaccc942c2ff. --- contributingGuides/TS_CHEATSHEET.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contributingGuides/TS_CHEATSHEET.md b/contributingGuides/TS_CHEATSHEET.md index 199127acda97..1e330dafb7cf 100644 --- a/contributingGuides/TS_CHEATSHEET.md +++ b/contributingGuides/TS_CHEATSHEET.md @@ -48,12 +48,12 @@ import { forwardRef, useRef, ReactNode, ForwardedRef } from "react"; import { TextInput, View } from "react-native"; - export type CustomTextInputProps = { - label: T; + export type CustomTextInputProps = { + label: string; children?: ReactNode; }; - function CustomTextInput(props: CustomTextInputProps, ref: ForwardedRef) { + function CustomTextInput(props: CustomTextInputProps, ref: ForwardedRef) { return ( From 8a6d44c35d1880afa2b08d7a8a826917cb0fd11d Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 21 Sep 2023 04:50:41 +0530 Subject: [PATCH 50/55] replace return with exit() --- .github/scripts/createDocsRoutes.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index 8f984826ad93..abb8e7692a05 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -92,12 +92,12 @@ function run() { if (expensifyClassicArticleHubs.length !== expensifyClassicRoute.hubs.length) { console.error(warnMessage(platformNames.expensifyClassic)); - return 1; + exit(1); } if (newExpensifyArticleHubs.length !== newExpensifyRoute.hubs.length) { console.error(warnMessage(platformNames.newExpensify)); - return 1; + exit(1); } createHubsWithArticles(expensifyClassicArticleHubs, platformNames.expensifyClassic, expensifyClassicRoute.hubs); @@ -113,5 +113,5 @@ try { run(); } catch (error) { console.error('A problem occurred while trying to read the directories.', error); - return 1; + exit(1); } From ed0267c654674722b3cb363b5f8181b14cebc83e Mon Sep 17 00:00:00 2001 From: Rushat Gabhane Date: Thu, 21 Sep 2023 05:01:24 +0530 Subject: [PATCH 51/55] fix lint --- .github/scripts/createDocsRoutes.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/scripts/createDocsRoutes.js b/.github/scripts/createDocsRoutes.js index abb8e7692a05..39cd98383de1 100644 --- a/.github/scripts/createDocsRoutes.js +++ b/.github/scripts/createDocsRoutes.js @@ -92,12 +92,12 @@ function run() { if (expensifyClassicArticleHubs.length !== expensifyClassicRoute.hubs.length) { console.error(warnMessage(platformNames.expensifyClassic)); - exit(1); + process.exit(1); } if (newExpensifyArticleHubs.length !== newExpensifyRoute.hubs.length) { console.error(warnMessage(platformNames.newExpensify)); - exit(1); + process.exit(1); } createHubsWithArticles(expensifyClassicArticleHubs, platformNames.expensifyClassic, expensifyClassicRoute.hubs); @@ -113,5 +113,5 @@ try { run(); } catch (error) { console.error('A problem occurred while trying to read the directories.', error); - exit(1); + process.exit(1); } From ecca4974e395322e049379ec08d5e853d18beab4 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Thu, 21 Sep 2023 12:26:14 +0500 Subject: [PATCH 52/55] fix: hover not shown when scroll on same item --- src/components/Hoverable/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Hoverable/index.js b/src/components/Hoverable/index.js index 7dd918f15cf4..38ea64952a2c 100644 --- a/src/components/Hoverable/index.js +++ b/src/components/Hoverable/index.js @@ -46,7 +46,6 @@ class Hoverable extends Component { * If the user has started scrolling and the isHoveredRef is true, then we should set the hover state to false. * This is to hide the existing hover and reaction bar. */ - this.isHoveredRef = false; this.setState({isHovered: false}, this.props.onHoverOut); } this.isScrollingRef = scrolling; From 2c1608392cf2f5b73520031659cf0f59e7a6721e Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Thu, 21 Sep 2023 10:38:39 +0200 Subject: [PATCH 53/55] Set batch size to 1 only on web --- src/components/InvertedFlatList/BaseInvertedFlatList.js | 4 ---- src/components/InvertedFlatList/index.js | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/InvertedFlatList/BaseInvertedFlatList.js b/src/components/InvertedFlatList/BaseInvertedFlatList.js index 0327e4e0b5b9..0bfffb733052 100644 --- a/src/components/InvertedFlatList/BaseInvertedFlatList.js +++ b/src/components/InvertedFlatList/BaseInvertedFlatList.js @@ -136,10 +136,6 @@ class BaseInvertedFlatList extends Component { // Native platforms do not need to measure items and work fine without this. // Web requires that items be measured or else crazy things happen when scrolling. getItemLayout={this.props.shouldMeasureItems ? this.getItemLayout : undefined} - // Keep batch size relatively small for responsiveness, but not too small as it will cause - // excessive rendering. See https://github.com/Expensify/App/pull/19345 for performance testing - // of this value. - maxToRenderPerBatch={10} windowSize={15} // Commenting the line below as it breaks the unread indicator test diff --git a/src/components/InvertedFlatList/index.js b/src/components/InvertedFlatList/index.js index 74409e9a0fe0..d46cd5801605 100644 --- a/src/components/InvertedFlatList/index.js +++ b/src/components/InvertedFlatList/index.js @@ -119,6 +119,9 @@ function InvertedFlatList(props) { shouldMeasureItems contentContainerStyle={StyleSheet.compose(contentContainerStyle, styles.justifyContentEnd)} onScroll={handleScroll} + // We need to keep batch size to one to workaround a bug in react-native-web. + // This can be removed once https://github.com/Expensify/App/pull/24482 is merged. + maxToRenderPerBatch={1} /> ); } From f19d5ab1216bc03360c5c4eeebb82ca70b9ff1e5 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Thu, 21 Sep 2023 10:52:24 +0200 Subject: [PATCH 54/55] Add curly option to ESLint config for Typescript --- .eslintrc.js | 5 +++-- src/components/MapView/MapView.tsx | 4 +++- src/libs/Growl.ts | 8 ++++++-- src/libs/isInputAutoFilled.ts | 4 +++- src/libs/requireParameters.ts | 4 +++- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3c144064eb62..b5b4add538f6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -24,7 +24,7 @@ const restrictedImportPatterns = [ ]; module.exports = { - extends: ['expensify', 'plugin:storybook/recommended', 'plugin:react-hooks/recommended', 'prettier', 'plugin:react-native-a11y/basic'], + extends: ['expensify', 'plugin:storybook/recommended', 'plugin:react-hooks/recommended', 'plugin:react-native-a11y/basic', 'prettier'], plugins: ['react-hooks', 'react-native-a11y'], parser: 'babel-eslint', ignorePatterns: ['!.*', 'src/vendor', '.github/actions/**/index.js', 'desktop/dist/*.js', 'dist/*.js', 'node_modules/.bin/**', 'node_modules/.cache/**', '.git/**'], @@ -46,7 +46,6 @@ module.exports = { touchables: ['PressableWithoutFeedback', 'PressableWithFeedback'], }, ], - curly: 'error', }, }, { @@ -76,6 +75,7 @@ module.exports = { patterns: restrictedImportPatterns, }, ], + curly: 'error', }, }, { @@ -162,6 +162,7 @@ module.exports = { patterns: restrictedImportPatterns, }, ], + curly: 'error', }, }, { diff --git a/src/components/MapView/MapView.tsx b/src/components/MapView/MapView.tsx index 7a2248ffafb9..d9f51e111a43 100644 --- a/src/components/MapView/MapView.tsx +++ b/src/components/MapView/MapView.tsx @@ -54,7 +54,9 @@ const MapView = forwardRef(({accessToken, style, ma }, [accessToken]); const setMapIdle = (e: MapState) => { - if (e.gestures.isGestureActive) return; + if (e.gestures.isGestureActive) { + return; + } setIsIdle(true); if (onMapReady) { onMapReady(); diff --git a/src/libs/Growl.ts b/src/libs/Growl.ts index 99c728f0a210..33d7311973cb 100644 --- a/src/libs/Growl.ts +++ b/src/libs/Growl.ts @@ -12,7 +12,9 @@ const isReadyPromise = new Promise((resolve) => { }); function setIsReady() { - if (!resolveIsReadyPromise) return; + if (!resolveIsReadyPromise) { + return; + } resolveIsReadyPromise(); } @@ -21,7 +23,9 @@ function setIsReady() { */ function show(bodyText: string, type: string, duration: number = CONST.GROWL.DURATION) { isReadyPromise.then(() => { - if (!growlRef?.current?.show) return; + if (!growlRef?.current?.show) { + return; + } growlRef.current.show(bodyText, type, duration); }); } diff --git a/src/libs/isInputAutoFilled.ts b/src/libs/isInputAutoFilled.ts index 0abe634001e4..e1b9942b0e78 100644 --- a/src/libs/isInputAutoFilled.ts +++ b/src/libs/isInputAutoFilled.ts @@ -4,7 +4,9 @@ import isSelectorSupported from './isSelectorSupported'; * Check the input is auto filled or not */ export default function isInputAutoFilled(input: Element): boolean { - if (!input?.matches) return false; + if (!input?.matches) { + return false; + } if (isSelectorSupported(':autofill')) { return input.matches(':-webkit-autofill') || input.matches(':autofill'); } diff --git a/src/libs/requireParameters.ts b/src/libs/requireParameters.ts index 098a6d114430..ebeb55e254e0 100644 --- a/src/libs/requireParameters.ts +++ b/src/libs/requireParameters.ts @@ -14,7 +14,9 @@ export default function requireParameters(parameterNames: string[], parameters: const propertiesToRedact = ['authToken', 'password', 'partnerUserSecret', 'twoFactorAuthCode']; const parametersCopy = {...parameters}; Object.keys(parametersCopy).forEach((key) => { - if (!propertiesToRedact.includes(key.toString())) return; + if (!propertiesToRedact.includes(key.toString())) { + return; + } parametersCopy[key] = ''; }); From 8753fa362c0889c3356e58936cb3f89b6a64dbd1 Mon Sep 17 00:00:00 2001 From: Mykhailo Kravchenko Date: Thu, 21 Sep 2023 11:56:50 +0200 Subject: [PATCH 55/55] update name of a method --- tests/unit/OptionsListUtilsTest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/OptionsListUtilsTest.js b/tests/unit/OptionsListUtilsTest.js index 6bc8b1b01528..6f20e48835fd 100644 --- a/tests/unit/OptionsListUtilsTest.js +++ b/tests/unit/OptionsListUtilsTest.js @@ -1024,7 +1024,7 @@ describe('OptionsListUtils', () => { ); expect(largeWrongSearchResult.categoryOptions).toStrictEqual(largeWrongSearchResultList); - const emptyResult = OptionsListUtils.getNewChatOptions(REPORTS, PERSONAL_DETAILS, [], search, selectedOptions, [], false, false, true, emptyCategoriesList); + const emptyResult = OptionsListUtils.getFilteredOptions(REPORTS, PERSONAL_DETAILS, [], search, selectedOptions, [], false, false, true, emptyCategoriesList); expect(emptyResult.categoryOptions).toStrictEqual(emptySelectedResultList); });