Skip to main content
Connect New Expensify to Sage Intacct for comprehensive expense management with support for entities, dimensions, departments, classes, locations, projects, and custom fields.

Prerequisites

Before connecting to Sage Intacct, ensure you have:
  • Sage Intacct administrator access
  • Web Services enabled in Sage Intacct
  • User credentials with API access
  • Entity ID (for multi-entity organizations)

Setup

1

Navigate to Accounting

Go to Workspace Settings > Accounting and select Sage Intacct
2

Review Prerequisites

Review the prerequisites checklist
3

Enter Credentials

Provide your Sage Intacct company ID, user ID, password, and entity ID
4

Select Entity

Choose the Sage Intacct entity to connect (for multi-entity setups)
5

Configure Settings

Set up import and export preferences

Connection Flow

Sage Intacct supports reusing connections:
// Source: src/components/ConnectToSageIntacctFlow/index.tsx
function ConnectToSageIntacctFlow({policyID}: ConnectToSageIntacctFlowProps) {
    const hasPoliciesConnectedToSageIntacct = !!getAdminPoliciesConnectedToSageIntacct().length;
    const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`);
    const shouldGoToEnterCredentials = isAuthenticationError(policy, CONST.POLICY.CONNECTIONS.NAME.SAGE_INTACCT);

    useEffect(() => {
        if (shouldGoToEnterCredentials) {
            Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_ENTER_CREDENTIALS.getRoute(policyID));
            return;
        }
        if (!hasPoliciesConnectedToSageIntacct) {
            Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PREREQUISITES.getRoute(policyID));
            return;
        }
        Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXISTING_CONNECTIONS.getRoute(policyID));
    }, []);
}
If you’ve already connected a Sage Intacct account, you can reuse those credentials across multiple workspaces.

Import Settings

Configure what data to import from Sage Intacct:
// Source: src/pages/workspace/accounting/intacct/import/SageIntacctImportPage.tsx
const sageIntacctConfig = policy?.connections?.intacct?.config;
const isExpenseType = sageIntacctConfig?.export.reimbursable === CONST.SAGE_INTACCT_REIMBURSABLE_EXPENSE_TYPE.EXPENSE_REPORT;

Expense Types / Accounts

Depending on your export configuration:
  • Expense Types: Imported when exporting as Expense Reports
  • Account Types: Imported when exporting as other transaction types
// Source: src/pages/workspace/accounting/intacct/import/SageIntacctImportPage.tsx
<ToggleSettingOptionRow
    title={translate(isExpenseType ? 'workspace.intacct.expenseTypes' : 'workspace.accounting.accounts')}
    subtitle={translate(isExpenseType ? 'workspace.intacct.expenseTypesDescription' : 'workspace.intacct.accountTypesDescription')}
    shouldPlaceSubtitleBelowSwitch
    wrapperStyle={[styles.mv3, styles.mh5]}
    isActive
    onToggle={() => {}}
    disabled
/>
Expense Types or Accounts are always imported and cannot be disabled. They serve as the base expense categories.

Billable

Enable billable tracking for client billing:
// Source: src/pages/workspace/accounting/intacct/import/SageIntacctImportPage.tsx
<ToggleSettingOptionRow
    title={translate('common.billable')}
    switchAccessibilityLabel={translate('common.billable')}
    shouldPlaceSubtitleBelowSwitch
    wrapperStyle={[styles.mv3, styles.mh5]}
    isActive={sageIntacctConfig?.mappings?.syncItems ?? false}
    onToggle={() => updateSageIntacctBillable(policyID, !sageIntacctConfig?.mappings?.syncItems)}
/>

Dimensions and Mappings

Configure Sage Intacct dimension mappings:
// Source: src/pages/workspace/accounting/intacct/import/SageIntacctImportPage.tsx
const mappingItems = Object.values(CONST.SAGE_INTACCT_CONFIG.MAPPINGS).map((mapping) => {
    const menuItemTitleKey = getDisplayTypeTranslationKey(sageIntacctConfig?.mappings?.[mapping]);
    return {
        description: Str.recapitalize(translate('workspace.intacct.mappingTitle', {mappingName: mapping})),
        action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_TOGGLE_MAPPINGS.getRoute(policyID, mapping)),
        title: menuItemTitleKey ? translate(menuItemTitleKey) : undefined,
        subscribedSettings: [mapping],
    };
});
Mapping options include:
  • Departments: Organizational departments
  • Classes: Classification codes
  • Locations: Physical or cost center locations
  • Projects: Project tracking
  • Customers: Customer assignments
  • Vendors: Vendor tracking
Each mapping can be:
  • Employee Default: Use employee’s default dimension
  • Tag: Expense-level selection
  • Report Field: Report-level assignment
  • Not Imported: Skip the dimension

Tax

For organizations with tax solutions configured:
// Source: src/pages/workspace/accounting/intacct/import/SageIntacctImportPage.tsx
{!!sageIntacctData?.taxSolutionIDs && sageIntacctData?.taxSolutionIDs?.length > 0 && (
    <MenuItemWithTopDescription
        title={
            sageIntacctConfig?.tax?.syncTax 
                ? sageIntacctConfig?.tax?.taxSolutionID || sageIntacctData?.taxSolutionIDs?.at(0) 
                : translate('workspace.accounting.notImported')
        }
        description={translate('common.tax')}
        shouldShowRightIcon
        onPress={() => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_IMPORT_TAX.getRoute(policyID))}
    />
)}
Select which tax solution to use for expense tax tracking.

User-Defined Dimensions

Sage Intacct supports custom user-defined dimensions (UDD):
// Source: src/pages/workspace/accounting/intacct/import/SageIntacctImportPage.tsx
<MenuItemWithTopDescription
    title={
        sageIntacctConfig?.mappings?.dimensions && sageIntacctConfig?.mappings?.dimensions?.length > 0
            ? translate('workspace.intacct.userDimensionsAdded', {count: sageIntacctConfig?.mappings?.dimensions?.length})
            : undefined
    }
    description={translate('workspace.intacct.userDefinedDimensions')}
    shouldShowRightIcon
    onPress={() => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_USER_DIMENSIONS.getRoute(policyID))}
/>
1

Add User Dimension

Navigate to Import > User-Defined Dimensions
2

Select Dimension Type

Choose from available UDD types in your Sage Intacct instance
3

Configure Mapping

Set how the dimension maps to Expensify (tags or report fields)
4

Set Employee Defaults

Optionally configure employee-specific dimension defaults

Export Settings

Configure how expenses export to Sage Intacct:
// Source: src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx
const sections = [
  {
    description: translate('workspace.sageIntacct.preferredExporter'),
    action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_PREFERRED_EXPORTER.getRoute(policyID)),
    title: exportConfig?.exporter,
    subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORTER],
  },
  {
    description: translate('workspace.sageIntacct.exportDate.label'),
    action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_EXPORT_DATE.getRoute(policyID)),
    title: exportConfig?.exportDate ? translate(`workspace.sageIntacct.exportDate.values.${exportConfig.exportDate}.label`) : undefined,
    subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.EXPORT_DATE],
  },
  {
    description: translate('workspace.accounting.exportOutOfPocket'),
    action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_REIMBURSABLE_EXPENSES.getRoute(policyID)),
    title: exportConfig?.reimbursable ? translate(`workspace.sageIntacct.reimbursableExpenses.values.${exportConfig.reimbursable}`) : undefined,
    subscribedSettings: [CONST.SAGE_INTACCT_CONFIG.REIMBURSABLE, CONST.SAGE_INTACCT_CONFIG.REIMBURSABLE_VENDOR],
  },
  {
    description: translate('workspace.accounting.exportCompanyCard'),
    action: () => Navigation.navigate(ROUTES.POLICY_ACCOUNTING_SAGE_INTACCT_NON_REIMBURSABLE_EXPENSES.getRoute(policyID)),
    title: exportConfig?.nonReimbursable ? translate(`workspace.sageIntacct.nonReimbursableExpenses.values.${exportConfig.nonReimbursable}`) : undefined,
    subscribedSettings: [
      CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE,
      CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_ACCOUNT,
      exportConfig?.nonReimbursable === CONST.SAGE_INTACCT_NON_REIMBURSABLE_EXPENSE_TYPE.VENDOR_BILL
        ? CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_VENDOR
        : CONST.SAGE_INTACCT_CONFIG.NON_REIMBURSABLE_CREDIT_CARD_VENDOR,
    ],
  },
];

Preferred Exporter

Select which workspace admin exports expenses to Sage Intacct.

Export Date

Choose the date for Sage Intacct transactions:
  • Date Created: When expense was created
  • Date Exported: When expense is exported
  • Date Submitted: When report was submitted

Reimbursable Expenses

Export out-of-pocket expenses as:
  • Expense Report: Standard employee expense reports
  • Vendor Bill: Accounts payable bills
  • Journal Entry: Direct accounting entries

Non-Reimbursable Expenses

Export company card expenses as:
  • Vendor Bill: Company card bills
  • Credit Card Charge: Direct credit card charges
  • Journal Entry: Accounting journal entries
Depending on the export type, configure:
  • Default Vendor: Vendor for non-employee expenses
  • Credit Card Account: Credit card account mapping

Advanced Settings

Configure automatic synchronization:
  • Sync frequency (hourly, daily, weekly)
  • What data to sync (categories, dimensions, employee records)
  • Error notifications
Choose between Cash or Accrual basis accounting for exports
Select the Sage Intacct account used for expense reimbursements

Entity Management

For multi-entity Sage Intacct organizations:
  1. Select Entity: Choose the entity during connection setup
  2. Entity-Specific Settings: Each workspace can connect to a different entity
  3. Top-Level Access: Some features require top-level access
The current entity name displays in page headers:
// Source: src/pages/workspace/accounting/intacct/import/SageIntacctImportPage.tsx
<ConnectionLayout
  headerTitle="workspace.accounting.import"
  headerSubtitle={getCurrentSageIntacctEntityName(policy, translate('workspace.common.topLevel'))}
/>

Card Reconciliation

Sage Intacct integration supports card reconciliation with auto-sync:
  • Automatically reconcile company card transactions
  • Match Expensify Card transactions to Sage Intacct
  • Configure reconciliation frequency and settings

Troubleshooting

Common Issues:
  • Authentication failed: Verify credentials and entity ID
  • Web Services disabled: Enable Web Services in Sage Intacct
  • Permission errors: Ensure user has API access and proper roles
  • Dimension sync errors: Check that dimensions exist and are active
  • Entity access issues: Verify you have access to the selected entity
If authentication fails:
  • Verify Company ID, User ID, and Password are correct
  • Check that Entity ID matches (for multi-entity orgs)
  • Ensure Web Services are enabled
  • Confirm user has Web Services permissions
For dimension-related issues:
  • Verify dimensions are active in Sage Intacct
  • Check employee dimension defaults
  • Ensure proper dimension permissions
  • Review dimension object definitions
If exports fail:
  • Check the preferred exporter has admin access
  • Verify export account mappings are correct
  • Ensure required dimensions are filled
  • Review Sage Intacct validation rules

Best Practices

  1. Test Thoroughly: Use a Sage Intacct test company for initial setup
  2. Document Mappings: Keep a record of dimension and account mappings
  3. Regular Reviews: Periodically review dimension and mapping configurations
  4. Employee Defaults: Set up employee dimension defaults in Sage Intacct
  5. Monitor Sync Status: Check connection status regularly for errors
  6. Coordinate with Finance: Work with your finance team on export settings

Support

For Sage Intacct integration assistance:
  • Contact Expensify Concierge for connection support
  • Work with your Sage Intacct administrator for permissions and setup
  • Refer to Sage Intacct documentation for platform-specific features

Build docs developers (and LLMs) love