Skip to main content
Per diem expenses in New Expensify simplify daily allowance tracking for business travel. Instead of collecting receipts for every meal, employees can claim standardized daily rates based on their travel destination.

What is Per Diem?

Per diem (Latin for “per day”) is a fixed daily allowance for:
  • Meals: Breakfast, lunch, dinner
  • Incidental expenses: Tips, small items
  • Lodging: In some configurations
Per diem rates are pre-configured by workspace administrators based on travel destinations and meal types.

Enabling Per Diem

Workspace admins must enable per diem:
  1. Go to Workspace Settings
  2. Navigate to Per Diem
  3. Toggle Enable per diem rates
  4. Configure rates and destinations
  5. Save settings
function WorkspacePerDiemPage({route}: WorkspacePerDiemPageProps) {
    const policyID = route.params.policyID;
    const policy = usePolicy(policyID);
    
    const [customUnit, allRatesArray, allSubRates] = useMemo(() => {
        const customUnits = getPerDiemCustomUnit(policy);
        const customUnitRates: Record<string, Rate> = customUnits?.rates ?? {};
        const allRates = Object.values(customUnitRates);
        const allSubRatesMemo = getSubRatesData(allRates);
        return [customUnits, allRates, allSubRatesMemo];
    }, [policy]);

    return (
        <ScreenWrapper>
            <HeaderWithBackButton
                title={translate('workspace.perDiem.title')}
            />
            <SelectionListWithModal
                sections={[{
                    data: allSubRates.map(rate => ({
                        destination: rate.destination,
                        subRateName: rate.subRateName,
                        rate: rate.rate,
                        currency: rate.currency,
                    }))
                }]}
            />
        </ScreenWrapper>
    );
}

Creating Per Diem Expenses

From the Create Menu

  1. Tap the green + button
  2. Select Submit expense or Track expense
  3. Choose the Per Diem tab
  4. Select your workspace (if multiple available)
  5. Enter the destination
  6. Choose the meal type or full day
  7. Select the date
  8. Review the calculated amount
  9. Submit the expense
function IOURequestStepDestination({
    route: {
        params: {iouType, reportID, transactionID, backTo},
    },
    transaction,
    openedFromStartPage,
}: IOURequestStepDestinationProps) {
    const [destination, setDestination] = useState(
        transaction?.comment?.destination ?? ''
    );
    
    const perDiemCustomUnit = getPerDiemCustomUnit(policy);
    const rates = perDiemCustomUnit?.rates ?? {};
    
    const onSubmit = useCallback(() => {
        // Find matching rate for destination
        const matchingRate = Object.values(rates).find(
            (rate) => rate.name === destination
        );
        
        if (matchingRate) {
            // Navigate to subrate selection
            Navigation.navigate(
                ROUTES.MONEY_REQUEST_STEP_PER_DIEM_SUBRATE.getRoute(
                    action,
                    iouType,
                    transactionID,
                    reportID,
                    backTo
                )
            );
        }
    }, [destination, rates]);

    return (
        <TextInput
            label={translate('common.destination')}
            value={destination}
            onChangeText={setDestination}
            onSubmitEditing={onSubmit}
        />
    );
}

From a Chat

  1. Open a workspace chat
  2. Tap Request money
  3. Select Per Diem from tabs
  4. Follow the creation flow
Per diem is only available if your workspace admin has enabled it and configured rates.

Per Diem Rates

Rate Structure

Per diem rates typically include: Destinations:
  • Cities or regions
  • Countries
  • Domestic vs. international
  • High-cost vs. standard locations
Sub-rates (meal types):
  • Breakfast only
  • Lunch only
  • Dinner only
  • Full day (all meals)
  • Partial day rates
type SubRateData = {
    pendingAction?: PendingAction;
    destination: string;
    subRateName: string;
    rate: number;
    currency: string;
    rateID: string;
    subRateID: string;
};

function getSubRatesData(customUnitRates: Rate[]) {
    const subRatesData: SubRateData[] = [];
    for (const rate of customUnitRates) {
        const subRates = rate.subRates;
        if (subRates) {
            for (const subRate of subRates) {
                subRatesData.push({
                    pendingAction: rate.pendingAction,
                    destination: rate.name ?? '',
                    subRateName: subRate.name,
                    rate: subRate.rate,
                    currency: rate.currency ?? CONST.CURRENCY.USD,
                    rateID: rate.customUnitRateID,
                    subRateID: subRate.id,
                });
            }
        }
    }
    return subRatesData;
}

Rate Examples

Sample rate table:
DestinationMeal TypeRate
New York, NYBreakfast$15
New York, NYLunch$25
New York, NYDinner$35
New York, NYFull Day$75
London, UKBreakfast£12
London, UKLunch£20
London, UKDinner£30
London, UKFull Day£62
Full day rates are often less than the sum of individual meals as an incentive to use the simpler option.

Selecting Destinations

When creating a per diem expense:

Destination Input

  1. Type the destination name
  2. Select from configured destinations:
    • Exact city matches
    • Region or country matches
    • Recently used destinations
  3. Choose the most specific option available

Destination Hierarchy

If multiple matches exist:
  • City-specific rates take precedence
  • Then regional rates
  • Then country-wide rates
  • Then default rates
If your destination isn’t listed, contact your workspace admin to add it.

Meal Type Selection

After selecting a destination:

Available Options

Individual meals:
  • Breakfast: Morning meal
  • Lunch: Midday meal
  • Dinner: Evening meal
Combined options:
  • Full day: All three meals
  • Multiple meals: Select multiple individually
function IOURequestStepSubrate({
    route: {
        params: {iouType, transactionID, reportID, backTo},
    },
    transaction,
}: IOURequestStepSubrateProps) {
    const perDiemCustomUnit = getPerDiemCustomUnit(policy);
    const destinationRateID = transaction?.comment?.customUnit?.customUnitRateID;
    const destinationRate = perDiemCustomUnit?.rates?.[destinationRateID];
    const subRates = destinationRate?.subRates ?? [];

    const selectSubrate = useCallback((subrateID: string) => {
        const selectedSubrate = subRates.find((sr) => sr.id === subrateID);
        if (!selectedSubrate) return;

        // Set the amount based on selected subrate
        setMoneyRequestAmount(
            transactionID,
            selectedSubrate.rate,
            destinationRate?.currency ?? CONST.CURRENCY.USD
        );

        // Navigate to confirmation
        Navigation.navigate(
            ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(
                CONST.IOU.ACTION.CREATE,
                iouType,
                transactionID,
                reportID
            )
        );
    }, [subRates, transactionID]);

    return (
        <SelectionList
            sections={[{
                data: subRates.map((subRate) => ({
                    text: subRate.name,
                    keyForList: subRate.id,
                    isSelected: false,
                }))
            }]}
            onSelectRow={({keyForList}) => selectSubrate(keyForList)}
        />
    );
}

Meal Time Ranges

Some configurations restrict meals by time:
  • Breakfast: 6:00 AM - 10:00 AM
  • Lunch: 11:00 AM - 2:00 PM
  • Dinner: 5:00 PM - 9:00 PM
Submitting meals outside allowed times may trigger violations or require approval.

Multi-Day Per Diem

For travel spanning multiple days:

Option 1: Multiple Expenses

Create separate expenses:
  1. One per diem expense per day
  2. Each with the appropriate date
  3. Same destination (if unchanged)
  4. Select full day or individual meals

Option 2: Bulk Creation

Some workspaces support:
  • Date range selection
  • Automatic per diem for each day
  • Single submission for entire trip
Bulk per diem creation depends on workspace configuration. Check with your admin.

Per Diem Adjustments

Partial Meals Provided

If meals are provided (conference, hotel, etc.):
  1. Select only meals you paid for
  2. Don’t claim provided meals
  3. Or choose a reduced rate if available
Example:
  • Hotel includes breakfast
  • Claim only lunch and dinner
  • Or use “Lunch + Dinner” combined rate

Reduced Rates

Some situations warrant reduced rates:
  • Travel day (departure/arrival)
  • Partial day travel
  • Meals provided by client
  • Company events with catering
Add notes to explain why you’re using a reduced rate to help approvers understand.

Per Diem E-Receipts

Per diem expenses generate electronic receipts:
function PerDiemEReceipt({
    transaction,
    isThumbnail = false,
}: PerDiemEReceiptProps) {
    const {
        amount,
        currency,
        created,
    } = getTransactionDetails(transaction) ?? {};
    
    const destination = transaction?.comment?.destination ?? '';
    const subRateName = transaction?.comment?.customUnit?.subRateName ?? '';

    return (
        <View style={styles.perDiemEReceipt}>
            <View style={styles.eReceiptIcon}>
                <Icon src={Calendar} />
            </View>
            <Text style={styles.eReceiptTitle}>
                {translate('eReceipt.perDiem')}
            </Text>
            <Text style={styles.eReceiptMerchant}>
                {destination}
            </Text>
            <Text style={styles.eReceiptDetail}>
                {subRateName}
            </Text>
            <Text style={styles.eReceiptAmount}>
                {convertToDisplayString(amount, currency)}
            </Text>
            <Text style={styles.eReceiptDate}>
                {created}
            </Text>
        </View>
    );
}
E-receipt includes:
  • Per diem icon/badge
  • Destination
  • Meal type
  • Date
  • Amount
  • Currency
Per diem e-receipts serve as proof of the allowance claim for audit purposes.

Editing Per Diem Expenses

Before Submission

Edit any field:
  • Destination: Change location
  • Meal type: Select different meals
  • Date: Adjust travel date
  • Amount: Updates automatically based on rate

After Submission

Depending on policy:
  • May require approval to edit
  • Some fields become locked
  • Delete and recreate if needed
  • Contact approver for assistance
Changing destination or meal type may significantly alter the expense amount.

Per Diem Compliance

Policy Rules

Workspace policies may enforce:
  • Maximum days: Limit per diem claims
  • Approval required: Higher amounts need review
  • Documentation: Proof of travel required
  • Frequency limits: Prevent duplicate claims

Violation Detection

Common per diem violations: Duplicate per diems:
  • Same destination and date
  • Multiple full-day claims
  • Overlapping meal claims
Invalid dates:
  • Future dates
  • Dates outside travel period
  • Weekends (if not allowed)
Policy violations:
  • Exceeds maximum daily limit
  • Missing required approvals
  • Destination not approved
function validatePerDiemExpense(
    transaction: Transaction,
    policy: Policy,
    allTransactions: Transaction[]
): TransactionViolation[] {
    const violations: TransactionViolation[] = [];
    const destination = transaction.comment?.destination;
    const expenseDate = transaction.created;

    // Check for duplicates
    const duplicates = allTransactions.filter((t) => {
        return t.transactionID !== transaction.transactionID &&
               t.comment?.destination === destination &&
               isSameDay(t.created, expenseDate);
    });

    if (duplicates.length > 0) {
        violations.push({
            name: CONST.VIOLATIONS.DUPLICATE_PER_DIEM,
            type: CONST.VIOLATION_TYPES.ERROR,
            showInReview: true,
        });
    }

    return violations;
}

Admin Configuration

Workspace admins manage per diem rates:

Adding Destinations

  1. Navigate to Workspace Settings > Per Diem
  2. Click Add destination
  3. Enter destination name
  4. Set currency
  5. Add sub-rates (meal types)
  6. Save
function EditPerDiemAmountPage({
    route: {params: {policyID, rateID, subRateID}},
}: EditPerDiemAmountPageProps) {
    const policy = usePolicy(policyID);
    const [amount, setAmount] = useState('');

    const saveAmount = useCallback(() => {
        // Update per diem rate
        updateWorkspacePerDiemRate(
            policyID,
            rateID,
            subRateID,
            {
                rate: convertToBackendAmount(Number(amount)),
            }
        );
        Navigation.goBack();
    }, [policyID, rateID, subRateID, amount]);

    return (
        <ScreenWrapper>
            <MoneyRequestAmountForm
                amount={amount}
                onSubmitButtonPress={saveAmount}
            />
        </ScreenWrapper>
    );
}

Editing Rates

Modify existing rates:
  1. Select the destination
  2. Choose the meal type
  3. Update the amount
  4. Save changes

Importing Rates

Bulk import per diem rates:
  1. Download CSV template
  2. Fill in rates
  3. Upload CSV file
  4. Review and confirm
  5. Rates activate immediately
Use standard per diem rates (like GSA rates) as a starting point, then customize as needed.

Rate History

Track rate changes:
  • View historical rates
  • See effective dates
  • Compare rate changes over time
  • Audit rate modifications

Reporting and Analytics

Per Diem Reports

View summaries:
  • By employee: Individual usage
  • By destination: Most common locations
  • By date range: Trends over time
  • By department: Team comparisons

Export Data

Download per diem data:
  • CSV or Excel format
  • Filtered by criteria
  • Include all expense details
  • For accounting integration

Best Practices

1

Know your rates

Familiarize yourself with per diem rates for your common destinations.
2

Submit promptly

Create per diem expenses during or immediately after your trip.
3

Be accurate

Only claim meals you actually paid for out-of-pocket.
4

Add context

Include trip purpose and any special circumstances in notes.
5

Keep travel proof

Maintain records like flight confirmations to support per diem claims.

Troubleshooting

Destination Not Found

Solutions:
  • Check spelling
  • Try nearby city
  • Use country/region instead
  • Request admin to add destination

Wrong Amount Calculated

Check:
  • Correct destination selected
  • Right meal type chosen
  • Currency is accurate
  • Rate is current
Fix:
  • Reselect destination
  • Choose correct meal type
  • Contact admin if rate is outdated

Can’t Submit Per Diem

Common causes:
  • Per diem not enabled for workspace
  • No rates configured
  • Policy restrictions
  • Missing required fields
Resolution:
  • Verify workspace has per diem enabled
  • Check policy settings
  • Contact workspace admin
  • Fill all required fields

Next Steps

Create an Expense

Learn how to create expenses

Distance Tracking

Track mileage for travel

SmartScan

Scan receipts automatically

Split Expenses

Share costs with others

Build docs developers (and LLMs) love