Deutsche Reisekostenabrechnung in Dynamics 365

TANSTAAFL: "there ain’t no such thing as a free lunch" from "The Moon Is a Harsh Mistress" by Robert A. Heinlein

Deutsche Reisekostenabrechnung in Dynamics 365

Travel expense reporting in Germany may be implemented in Dynamics 365 for Finance with literally no customizations. A special attention must be paid to the per diem calculation.


In general, per diem in Germany is an allowance for catering. Hotel bills are reimbursed in full. An employee of a German company – let’s call her Erika Mustermann – typically gets reimbursed for meals a fixed statutory amount per day. If she is paid above the legally prescribed daily rate, the difference would be subject to her income tax.

For domestic trips within Germany she becomes 28 Euro per day, yet this full rate is only applied from the second day on multi-day business trips. For the first and the last day Erika becomes only ½ of the daily ration  = €14:

Length of the trip Per diems rate 2020-2022
Less than 8 hours 0 EUR
More than 8, less than 24 hours 14 EUR
24 hours (a full calendar day) 28 EUR
First day (arrival) or last day (departure) 14 EUR

Erika is obliged to report every free meal sponsored by the employer or customer, reduce the daily allowance in accordance with the “20-40-40” rule:

Meal type Reduction Reduction amount
“Free” breakfast at the hotel 20% -€5,60
Free lunch at work 40% -€11,20
Dinner sponsored by the boss 40% -€11,20

The statutory per diem rates vary by country and sometimes specific to a city. The rates are regularly updated by the federal government and rounded to full euros: The “20-40-40” meal reduction rule also applies to destinations abroad, based on the full 24h rate.

In the following chapters 4 distinct realistic cases are explored, with the appropriate setup in Dynamics 365 for Finance:

  Narrative Per diems calculation

Case 1

“One-day training”

Erika attended a daily training nearby and was absent from 9:00 till 19:00. One lunch was provided by the training centre.
One day	€14,00
Reduction	-€11,20
Grand total	€2,80

Case 2

“3 days of training with hotel”

Same as before, but the business trip now took 3 days in total:

  • from 18:00 on Monday
  • whole Tuesday
  • until 19:00 on Wednesday.

This included 2 nights at a hotel without breakfast at €73,25. 2 lunches were served.

First day	€14,00
Day between	€28,00
Last day	€14,00
Reduction	-€11,20*2 = -€22,40
Total	€33,60
2 nights	€73,25*2 = €146,50
Grand total	€180,10

Case 3

„Hotel breakfast”

Same as before: 3 days in total, but the hotel bill included 2 breakfasts. The breakfasts are separately shown: €9 inkl. VAT 7% (e.g. bread) and 19% (e.g. coffee) each:
2 lunches were consumed for free at the training center. In addition, Erika invited a potential customer to a restaurant.
First day	€14,00
Day between	€28,00
Last day	€14,00
Reduction	-€11,20*2 -€5,60*2= -€33,60
Total	€22,40
2 nights	€73,25*2 = €146,50
2 breakfasts	€9*2 = €18,00
Hotel	€164,50
Dinner 	€115,00
Grand total	€301,90

Case 4

“Travelling abroad”

Erika went to Switzerland. On the same dates as above she flew to Geneva, resided 2 nights at the “President Wilson” and slowly consumed 2 exquisite breakfasts served on the Lac Leman shore.
First day	€44,00
Day between	€66,00
Last day	€44,00
Reduction	-€13,20*2 = -€26,40
Total	€127,60
2 nights	2*770,0 CHF = 1440,00 CHF
2 breakfasts	2*45,00 CHF = 90,00 CHF
2 city tax	2*4,75 CHF = 9,50 CHF
Hotel	1639,50 CHF ~= €1573,92

Domestic business travel – Case 1 “One-day training”

Let’s start setting up the system for the Case 1. First of all, we require a shared expense category PerDiem of the type “Allowance”. This expense category is then selected under local legal entity expense categories (Expense management > Setup >  General > Expense categories). In Germany the allowance excludes tax, i.e. the VAT may not be claimed:

The right per diem parameters (Expense management > Setup > General > Expense management parameters) for Germany can be read from the following screenshot:

In our second case the allowance is paid for every of the 3 calendar days and the Base per diem calculation on must be Calendar day with time.  The Meal reductions are self-explaining. The First and last day defaults are used to model the reduced rate on the days of arrival and departure. The Per diem rounding = Normal rounding, because we don’t round up cents to whole euros.

The Calculate meal reduction by may be set to either Meal type per day and Meal type per trip, since the breakfast weights less than lunch/dinner and the meal reduction amount stays the same for the first/last/middle day.

Per diems locations shall be created next. Every leg in on the business trip has to be given a “location” to deduct the right allowance for that country or city. The rate per location is assigned here: Expense management> Setup > Calculations and codes > Per diems. The fist and the last day assume a reduced allowance, this can be modelled by means of the Per diem rate tiers:

The reduction (€14/€28 = 50%) is the same for the day of arrival and the day of departure, therefore the most concise setting is Apply to = Both. On an overnight stay, the 8 hours threshold is ignored: in the above examples 2-4 the first day is eligible despite it only lasted 24:00-18:00 = 6 hours. Therefore we may not set Minimum hours = 8; the threshold can be enforced differently with a customized „Expense report policy“, see below.

We now can test Case 1, but first make sure that the Meal reduction, Breakfast, Lunch, Dinner, Location fields are activated in the Expense management > Setup > General > Display fields.

In Expense management > My expenses > Expense reports, add a new report, choose the location, add a new line PerDiem. The UI automatically switches to the detailed mode where you can enter the start and the end date/time of your trip and choose the Per diem location:

On the Per diems tab, set Lunch = 1. The reduction of €11,20 is applied as expected, and the total allowance amount becomes €2,80. To post the expense report an approval workflow has to be in place.

Remember, a one-day trip less than 8 hours does not count as business travel. The per diem rate tiers cannot be used to enforce it, but here are 2 possible alternatives:

  • solve it organizationally, establish “human-driven” approval rules
  • make a small extension to the class TrvRuleExpressionSetup to enable the total trip duration, the start and the end date as parameters in the expense policy definition:

public FromDate parmPerDiemFromDate(CompanyId _companyId, TableId _tableId, RecId _recId)
TrvExpTrans trvExpTrans = TrvExpTrans::find(_recId);
return DateTimeUtil::date(DateTimeUtil::applyTimeZoneOffset(trvExpTrans.DateFrom, DateTimeUtil::getUserPreferredTimeZone()));
public ToDate parmPerDiemToDate(CompanyId _companyId, TableId _tableId, RecId _recId)
TrvExpTrans trvExpTrans = TrvExpTrans::find(_recId);
return DateTimeUtil::date(DateTimeUtil::applyTimeZoneOffset(trvExpTrans.DateTo, DateTimeUtil::getUserPreferredTimeZone()));
public Hours parmPerDiemHours(CompanyId _companyId, TableId _tableId, RecId _recId)
TrvExpTrans trvExpTrans = TrvExpTrans::find(_recId);
return any2real(DateTimeUtil::getDifference(trvExpTrans.DateTo, trvExpTrans.DateFrom)/3600);


Here: German travel expenses in Dynamics 365 – Part 2

For Austrian expenses, check here: Configuring Austrian and Norwegian per diems in Dynamics 36