Skip to main content
New Expensify includes integrated travel features powered by Spotnana, allowing you to book flights, hotels, and rental cars while automatically creating expense reports for your trips.

Key Features

New Expensify travel management offers:

Book Travel

Book flights, hotels, and rental cars in one place

Manage Trips

View and manage all your upcoming and past trips

Auto-Expense

Travel expenses automatically added to reports

Policy Compliance

Ensure travel bookings comply with company policies

Benefits

Save Money

Access negotiated corporate rates and compare prices across providers to find the best deals:
// Source: src/pages/Travel/ManageTrips.tsx
const tripsFeatures: FeatureListItem[] = [
  {
    icon: illustrations.PiggyBank,
    translationKey: 'travel.features.saveMoney',
  },
  {
    icon: illustrations.TravelAlerts,
    translationKey: 'travel.features.alerts',
  },
];

Travel Alerts

Receive real-time notifications about:
  • Flight delays and cancellations
  • Gate changes
  • Check-in reminders
  • Trip updates

Seamless Expense Management

Travel expenses are automatically:
  • Added to your expense reports
  • Categorized correctly
  • Attached with receipts and details
  • Ready for submission and approval

Getting Started

1

Accept Terms

Review and accept the Spotnana travel terms and conditions
2

Set Up Profile

Add your traveler information (name, date of birth, contact details)
3

Add Payment Method

Link a payment method for booking travel
4

Book Your First Trip

Search for and book flights, hotels, or rental cars

Travel Access

Travel features are workspace-specific. Access travel through:
// Source: src/pages/Travel/MyTripsPage.tsx
function MyTripsPage({route}: MyTripsPageProps) {
    const policyID = route.params?.policyID;
    const {translate} = useLocalize();

    return (
        <AccessOrNotFoundWrapper policyID={policyID}>
            <ScreenWrapper
                includeSafeAreaPaddingBottom={false}
                shouldEnablePickerAvoiding={false}
                shouldEnableMaxHeight
                testID="MyTripsPage"
                shouldShowOfflineIndicatorInWideScreen
            >
                <HeaderWithBackButton
                    title={translate('travel.header')}
                    shouldShowBackButton
                />
                <ManageTrips policyID={policyID} />
            </ScreenWrapper>
        </AccessOrNotFoundWrapper>
    );
}
You must have access to a workspace with travel features enabled. Contact your workspace admin if you need travel access.

Accepting Terms

Before using travel features, accept the Spotnana terms:
// Source: src/libs/actions/Travel.ts
/**
 * Accept Spotnana terms and conditions to receive a proper token used for authenticating further actions
 */
function acceptSpotnanaTerms(domain?: string, policyID?: string) {
    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.NVP_TRAVEL_SETTINGS | typeof ONYXKEYS.TRAVEL_PROVISIONING>> = [
        {
            onyxMethod: 'merge',
            key: ONYXKEYS.NVP_TRAVEL_SETTINGS,
            value: {
                hasAcceptedTerms: true,
            },
        },
        {
            onyxMethod: 'merge',
            key: ONYXKEYS.TRAVEL_PROVISIONING,
            value: {
                isLoading: true,
                errors: null,
            },
        },
    ];

    const successData: Array<OnyxUpdate<typeof ONYXKEYS.TRAVEL_PROVISIONING | typeof ONYXKEYS.COLLECTION.POLICY>> = [
        {
            onyxMethod: 'merge',
            key: ONYXKEYS.TRAVEL_PROVISIONING,
            value: {
                isLoading: false,
            },
        },
        {
            onyxMethod: Onyx.METHOD.MERGE,
            key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`,
            value: {
                travelSettings: {
                    hasAcceptedTerms: true,
                },
            },
        },
    ];

    return API.makeRequestWithSideEffects(SIDE_EFFECT_REQUEST_COMMANDS.ACCEPT_SPOTNANA_TERMS, params, {optimisticData, successData, failureData});
}

Requesting Travel Access

If travel isn’t available for your workspace, request access:
// Source: src/libs/actions/Travel.ts
function requestTravelAccess() {
    const optimisticData: Array<OnyxUpdate<typeof ONYXKEYS.NVP_TRAVEL_SETTINGS>> = [
        {
            onyxMethod: 'merge',
            key: ONYXKEYS.NVP_TRAVEL_SETTINGS,
            value: {
                lastTravelSignupRequestTime: Date.now(),
            },
        },
    ];
    API.write(WRITE_COMMANDS.TRAVEL_SIGNUP_REQUEST, null, {optimisticData});
}
Travel access requests are reviewed by your workspace administrator. You’ll be notified when access is granted.

Book a Demo

Want to see travel features in action? Book a demo:
// Source: src/pages/Travel/ManageTrips.tsx
const navigateToBookTravelDemo = () => {
    Linking.openURL(CONST.BOOK_TRAVEL_DEMO_URL);
};

<Button
    text={translate('travel.bookDemo')}
    onPress={navigateToBookTravelDemo}
    accessibilityLabel={translate('travel.bookDemo')}
    style={[styles.w100, styles.mb3]}
    large
/>

Travel Components

The travel interface includes:

Feature List

Highlights key travel benefits:
// Source: src/pages/Travel/ManageTrips.tsx
<FeatureList
    menuItems={tripsFeatures}
    title={translate('travel.title')}
    subtitle={translate('travel.subtitle')}
    illustration={LottieAnimations.TripsEmptyState}
    illustrationStyle={[styles.mv4]}
    illustrationBackgroundColor={colors.blue600}
    titleStyles={styles.textHeadlineH1}
    contentPaddingOnLargeScreens={styles.p5}
/>

Book Travel Button

Quick access to book travel:
// Source: src/pages/Travel/ManageTrips.tsx
<BookTravelButton
    text={translate('travel.bookTravel')}
    shouldRenderErrorMessageBelowButton
    setShouldScrollToBottom={setShouldScrollToBottom}
    activePolicyID={policyID}
    large
/>

Travel Policies

Workspace administrators can configure travel policies:
  • Approval requirements for bookings
  • Spending limits by category (flights, hotels, cars)
  • Preferred vendors and airlines
  • Class of service restrictions
  • Advance booking requirements
Bookings that don’t comply with workspace travel policies may require additional approval or may be rejected.

Payment Methods

Supported payment methods for travel:
  • Company Credit Cards: Use workspace-linked cards
  • Personal Credit Cards: Personal cards for reimbursement
  • Expensify Card: Use your Expensify Card for instant categorization

Trip Types

Book different types of travel:

Flights

Domestic and international flights with all major airlines

Hotels

Hotels and accommodations worldwide

Rental Cars

Rental cars from major providers

Mobile Support

Access travel features on mobile:
  • Book travel on iOS and Android
  • Receive push notifications for trip updates
  • View trip details offline
  • Check in for flights
  • Access boarding passes

Integration with Expenses

Travel bookings automatically create expenses:
  1. Book Travel: Complete your booking in Expensify
  2. Auto-Expense: Expense automatically added to a report
  3. Receipt Attached: Booking confirmation attached as receipt
  4. Ready to Submit: Expense ready for submission when trip completes
  5. Approval: Follows your workspace approval workflow

Support

Need help with travel?
  • Contact Expensify Concierge for booking assistance
  • Check trip details in the My Trips page
  • Review booking confirmations in your email
  • Contact Spotnana support for travel-specific issues

Build docs developers (and LLMs) love