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:
Go to Workspace Settings
Navigate to Per Diem
Toggle Enable per diem rates
Configure rates and destinations
Save settings
src/pages/workspace/perDiem/WorkspacePerDiemPage.tsx
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
Tap the green + button
Select Submit expense or Track expense
Choose the Per Diem tab
Select your workspace (if multiple available)
Enter the destination
Choose the meal type or full day
Select the date
Review the calculated amount
Submit the expense
src/pages/iou/request/step/IOURequestStepDestination.tsx
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
Open a workspace chat
Tap Request money
Select Per Diem from tabs
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
src/pages/workspace/perDiem/WorkspacePerDiemPage.tsx
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:
Destination Meal Type Rate New York, NY Breakfast $15 New York, NY Lunch $25 New York, NY Dinner $35 New York, NY Full Day $75 London, UK Breakfast £12 London, UK Lunch £20 London, UK Dinner £30 London, UK Full 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:
Type the destination name
Select from configured destinations:
Exact city matches
Region or country matches
Recently used destinations
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
src/pages/iou/request/step/IOURequestStepSubrate.tsx
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:
One per diem expense per day
Each with the appropriate date
Same destination (if unchanged)
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.):
Select only meals you paid for
Don’t claim provided meals
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:
src/components/PerDiemEReceipt.tsx
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
src/libs/Violations/ViolationsUtils.ts
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
Navigate to Workspace Settings > Per Diem
Click Add destination
Enter destination name
Set currency
Add sub-rates (meal types)
Save
src/pages/workspace/perDiem/EditPerDiemAmountPage.tsx
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:
Select the destination
Choose the meal type
Update the amount
Save changes
Importing Rates
Bulk import per diem rates:
Download CSV template
Fill in rates
Upload CSV file
Review and confirm
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
Know your rates
Familiarize yourself with per diem rates for your common destinations.
Submit promptly
Create per diem expenses during or immediately after your trip.
Be accurate
Only claim meals you actually paid for out-of-pocket.
Add context
Include trip purpose and any special circumstances in notes.
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