German travel expenses in AX 2012 / Deutsche Reisekostenabrechnung 2015


You want to implement travel expense reporting for Germany in Dynamics AX out-of-the-box? Congratulations! You are about to deploy an exotic module (“Travel and expense”) on an undoubtedly exotic AX implementation project in an exotic country. Luckily enough, the requirements of the federal income law with its painstaking per diem regulations may be implemented in Dynamics AX 2012 R3 without significant customizations, let’s say, to 95%.
Let me start with a short introduction to the state of the law in 2015. If an employee of a German company – let’s call him Otto – got reimbursed for hotel or meals above a certain level, the value of goods or services received would be a subject to his income tax. Instead, Otto is given a by the company a fixed statutory per diem amount per day. For domestic trips inside Germany he gets 24 Euro per day, yet this rate is only applied to the 2nd day on multi-day business trips. For the first and the last day Otto only becomes the half of the daily ration ½ = €12.
No per diems are paid for a one-day business trip if it lasts less than 8 hours. This restriction does not apply to the first and the last day on a longer trip: he can start from home (or office) at 23:00 and come back in 26 hours on the 2nd calendar day – this still classifies as a 3 day business travel with €12 + €24 + €12 = €48 of allowance in total.
There is an additional “midnight rule” but we are going to neglect that. The only thing important on a several day trip is the night stop in-between.
In general, per diem in Germany is an allowance for catering. Hotel bills are reimbursed in full (with some limitations, see below), an invoice provided. Every free meal sponsored by the employer or customer, Otto has to report and reduce the daily allowance in accordance with the “20-40-40” rule:

  • “Free” breakfast at the hotel = 20% reduction = -€4.80
  • Free lunch at work = 40% reduction = -€9.60
  • Dinner sponsored by the boss = 40% reduction = -€9.60

The statutory per diem rates vary by country. The recent novelty in 2015 are rates specific to a city. Indeed, New York, London and Geneva are known to be notoriously expensive travel destinations, and the German state now accounts for that. The rates are usually yearly updated by the federal government and expressed in euro:
Here is an example for Switzerland, note the different ratio between the full and reduced daily allowance:


Full 24h day

“First/last day” or
  <8 hours

Hotel allowance





– Geneva




– the rest of Switzerland




The “hotel allowance” is applicable to an overnight stay if the employee fails to bring a proper hotel bill, which must be a very rare occasion.

The “20-40-40” meal reduction rule is also applied to destinations abroad, based on the full 24h rate.
If the meal is offered to Otto at a discounted price, but Otto still has to pay a small contribution from his pocket, this meal contribution may theoretically be claimed, but no more than €4.80 for breakfast or €9.60 for lunch/dinner, respectively. This seems to be a true exception. To handle it properly, an own category (not taxable by VAT) has to be created and a special expense policy has to be established to limit the meal price entered from above. This case is not explored here any further.
Let’s take a realistic example and start setting up Dynamics AX 2012 R3 CU8 for German per diems:



Per diem calculation

Case 1

“One-day training”

Otto attended a daily training and was absent from 9:00 till 19:00. One lunch was provided.

One day               €12.00

Reduction            €9.60

Grand total         €2.40

Case 2

“3 days of training with hotel”

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

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

This includes 2 nights at a hotel without breakfast.

 2 lunches were provided by the training center.

First day             €12.00

Day between      €24.00

Last day             €12.00

Total                  €48.00

2 nights                €107.00*2

Reduction            €19.20 (2*9.60)

Grand total         €242.80

Case 3

“Fine Dining”

Same as before: 3 days in total, 2 nights at the hotel including 2 breakfasts.

The breakfasts are separately shown on the hotel bill: €8 inkl. VAT 19% each.

2 lunches are consumed for free at the training center.

In addition, Otto invited a potential customer to a fine restaurant.

First day             €12.00

Day between      €24.00

Last day             €12.00

Total                  €48.00

2 nights              €99.00*2

(2 breakfasts      €8.00)

1 dinner              €115.00

Reduction           €28.80 (3*9.60)

Grand total        €332.20

Case 4

“Travelling abroad”

Otto goes to Switzerland.

On the same dates as above he flies to Geneva, resides for 2 nights at the “President Wilson” and slowly consumes 2 exquisite breakfasts served on the lakeshore.

First day             €41.00

Day between      €62.00

Last day             €41.00

Total                  €144.00

2 nights              770.00 CHF *2 +

(2 breakfasts      45.00 CHF*2)

2 city tax             4.75CHF *2

Hotel sub-total  1549.50 CHF

Reduction            €24.80 (2*62*20%)

Grand total         ~1527.84 EUR

(depending on the rate)

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 ”ePerDiem” of the type “Allowance”. This expense category is then selected under local legal entity expense categories and “Activated in journals” to make is available for expense entry:

This per diem category is not eligible value added tax recovery and given the tax group “tax free”.
The right per diem parameters for Germany can be read from the following screenshot:

Indeed, 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 as opposed to an absolute trip duration in days. 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 is a must, because we don’t round up cents to whole euros.
The Calculate meal reduction by is a new field in CU8 (Cumulative Update 8 to AX2012 R3). Since breakfast weight less than lunch/dinner and the meal reduction amount stays the same for the first/last day, both the options Meal type per day and Meal type per trip work well. AX version prior to CU8 only supported the Meal type per trip option.
Per diems locations has to be created next, and the right rate has to be assigned to the German domestic location DEU. Every leg in on the business trip has to be given a “per diem location” to deduct the right allowance for that country or city.

The fist and the last day assume a reduced allowance, this can be modelled by means of the Per diem rate tiers. The reduction (€12/€24 = 50%) is the same for the day of arrival and the day of departure, therefore the right setting is Apply to = Both. A one day trip should be no less than 8 hours, but there is no such a restriction per calendar day on 3+ day trips, and the Minimum hours should be set here to zero in general. The 8 hours threshold can be enforced differently with an “Expense report policy”, see below.
We now can test case 1, but first make sure that the Meal reduction, Breakfast, Lunch, Dinner, Location, Country fields are activated in the T&E / Setup / Travel and expense entry / Display fields.

The sole user interface for expense report entry is the Dynamics AX Enterprise Portal (Employee profile). No expense entry is possible in the AX2012 rich client.
Create a new expense report, add a new line “ePerDiem”, enter the start and the end date/time of your trip and choose the location:

The Per diems block below is new in CU8. The previous versions did not track meal reductions per day, but only in total in the Breakfast, etc. fields above. Enter the free lunch provided by the training institution. The reduction of €9.60 is shown as required.

Since the meal reduction amounts are not relative to the reduced daily allowance rate, by entering additionally Breakfast = 1 your reduction is going to exceed the maximum allowance: €12 – €4.80 – €9.60 = €12 – €14.40 = -€2.40.
According to the letter of the BMF, the German Federal Ministry of Finance (, a reduction may not exceed 100% and the daily allowance is just set to zero, but Dynamics AX gives here an error. This warning has to be removed by a small customization in the method
\Data Dictionary\Tables\TrvExpTrans\Methods\perDiem which will simply turn the per diem amount to 0.

Save the expense line and enjoy the expected result:

To finally approve and post the expense report an approval workflow has to be in place. This workflow most probably will be looking for an approver upwards in the managerial hierarchy under consideration of the proper signing limit:

Beware of the bug 2746305 in all version prior to CU8: “The expense report workflow using managerial hierarchy cannot assign to a user beyond the first level in the hierarchy”. A standalone hotfix KB 3009953 exists for this bug.

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 customization to enable the total trip duration, the start and the end date as parameters in the expense policy definition.

This expense policy will be applied to the expense category type “other”:

to produce an error message if the user erroneously tries to enter a short 1-day trip (for example, just from 09:00 to 16:00). To support this scenario, the class TrvRuleExpressionSetup has to be extended by 3 parm-methods.

Domestic business travel – case 2 “3 days of training with hotel”

The 2nd case requires a receipt, a bill for the accommodation at a hotel. The VAT from domestic invoices may be recovered, and we need a country-specific setup for the VAT (T&E / Setup / Taxes / Tax configurations) where the host country is associated with a tax group containing both full (19%) and reduced (7%) tax codes:

There is also such thing as a city tax. A city tax is imposed by a commune and is not a subject to the VAT (no tax on tax). Currently it is only levied by the tax authority in Berlin, and does not apply to business travel. Therefore, we can neglect this and don’t have to enforce an itemization of the hotel bill by the “pure” room rate and the city tax.
Set up an additional category “eHotel” of the type “Hotel”, assign the reduced 7% tax group to this category. Let the user enter a line against his category as an amount including tax, and select the Country/region = DEU. The VAT is derived automatically by the system: €14.00:

The per diems line is entered as follows:

with the total reimbursable amount as intended:

Domestic business travel – case 3 “Fine dining”

This time the hotel served breakfast to Otto. The breakfast must presented on the invoice separately, since any meal at the restaurant is taxed at the full rate of 19%, whereas the accommodation is subsidized through the reduced VAT of 7%.
One can hardly get a decent breakfast in Germany for 4.80 EUR, and in Switzerland breakfast would cost not 48 EUR * 20% = 9.60 EUR but probably around 20 CHF ~= 19 EUR. In practical terms, to get off with as little damage as possible, Otto has to strip the hotel bill of the breakfast and record no reduction for breakfast. There is still no need for the itemization of the hotel bill.
The fine dining with the customer is tolerated by the BMF, but it should be at a reasonable cost. The statutory definition of “reasonable” in 2015 is no more than €60 per person. This so-called “entertainment” may not reduce the corporate tax base, but the VAT may be recovered. Until recently the BMF used to only return 70% of the VAT, but after an intervention of the European Union the VAT amount may now be recovered in full.
We require a new expense category of the type “Meal” with the full VAT rate assigned. To enforce the “reasonable price” rule, an expense validation policy may be set up:
Amount < Number of guests * €60
The policy screen in AX does not allow for complex formulas with multiplication, but we hope that Otto is not going to throw a wedding party for a hundred of guests, and we are able to set up an exhaustive list for any party with a number of guests between 2 and 10-20:

The first condition additionally enforces an obligatory entry of the invited guests. The system will show an error unless the button Guests… is clicked in the “eMeals” line:

Try and see what happens if bier costs 20 euros more.
Here is the total impact of the Otto’s activities, as expected:

Domestic business travel – case 4 “Travelling abroad”

As we have learned already, daily allowances are country-specific. The reduced domestic rate for Germany is 50%, but the reduced foreign rates are close to 66% (but not exactly):


Full 24h day

“First/last day”






Switzerland, Geneva




Rest of Switzerland




The reduced rates are rounded by the government to whole euros. To match the reduced foreign rate, I use a tailored percentage. It should approximate the daily rate with a deviation less than €0.01:
41/62 = 0,66129… => 62.00 * 66.13% = 41.0006 ~= 41.00
32/48 = 0,66666… => 62.00 * 66.66% = 31.9968 ~= 32.00
The respective setup of per diems and tiers per location is shown on the following screenshot:

Note that the rates are updated by the BMF every year and have to be regularly re-imported with validity dates. This is also true for the calculated percentage for first/last day.
The meals reduction in AX now takes the rates for the location “Switzerland-Geneva” into account:

The foreign VAT on the hotel bill is not recoverable, the selection of the right country code ensures no VAT is going to be deducted. The amount paid in Swiss francs is converted to euro at the intrinsic System exchange rate type the AX (see System administration / Setup / System parameters) on the given day. Again, breakfasts have to be subtracted from the total bill amount:

Newly in 2015, a special challenge is posed by roundtrips across foreign cities with different rates as explained here on a case of the USA:
The legs have to be entered in AX in separate expense report lines, because the only place to specify the location driving the rate is the line, there are no per diem sub-lines in AX. This makes erroneously the first day of the leg an “arrival” and the last – a “departure” day. This is not entirely correct, because the days “in the middle” are eligible to the full 24h-rate of the destination reached by 24:00 o’clock on the respective date.
Indeed, “2/3 Los Angeles rate” + “2/3 Miami rate” is not the same as “1 Miami rate”. This may be helped by dummy locations without any reduction for the first and last day.


Comments (5)

  1. TSA says:

    Hallo Eugen

    thanks for the great article first of all!

    Case 1

    i am running on 6.3.1000.309 (CU8) but i cannot Choose type Allowance in the shared categories but i could choose perDiem…(which will work for alle cases)

    when trying to set up the policies for the 8 hour Minimum i do not get the fields Expense line.From date/To date/ Hours on the conditions and the same happends for

    Case 3

    i miss the field Expense line.Number of guests there

    what do i have to do?

    Thanks beforehand

  2. Eugen Glasow says:

    Grüß Gott,

    Yes, the right name for the type is "Per diem". The From date/To date/Hours are customized parameters of my own, here is the code:




    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);



    The "Number of guests" is a standard feature, but it is only visible on "MEALS" policies.

    Best regards,

    E. G.

  3. Eugen Glasow says:

    Update: the check for 60 Euro per guest is not relevant. I misunderstood the German law. Quite in contrary, a business lunch should be MORE than 60 euro to become “extraordinary” and be recognized as a corporate tax reduction above the usual per diem amount. However, it becomes taxable for the employee as a fringe benefit.

    "Beträgt der Gesamtwert der vom Arbeitgeber unmittelbar oder mittelbar gewährten Speisen und Getränke nicht mehr als 60 EUR, handelt es sich um eine übliche Bewirtung. Es gilt folgende lohnsteuerliche Behandlung:

    Beim Arbeitnehmer wird auf die Besteuerung des hieraus resultierenden geldwerten Vorteils verzichtet, wenn der Arbeitnehmer seinerseits für die dienstliche Reisetätigkeit dem Grunde nach eine Verpflegungspauschale als Werbungskosten geltend machen kann. Gleichzeitig sieht der Gesetzgeber eine tageweise Kürzung des Werbungskostenabzugs für Verpflegungsmehraufwand vor, wenn dem Arbeitnehmer anlässlich oder während einer Auswärtstätigkeit vom Arbeitgeber oder auf dessen Veranlassung von einem Dritten eine Mahlzeit zur Verfügung gestellt wird."…/reisekostenerstattung-durch-den-arbeitgeber-443-uebliche-mahlzeiten-bis-60eur-kuerzung-der-verpflegungspauschale_idesk_PI10413_HI5502985.html

  4. Max on the road says:

    It looks to me like I should kill my GmbH, and just do business our of my US Inc. Much more sensible tax regulations to deal with.

    This per diem, and travel expense handling process is in itself silly enough to tilt things over.

  5. Eugen Glasow says:

    Yes and no, Max. Per diems mean a reduced effort for processing restaurant bills. You don't capture them one by one but just enter one line: start date, end date – done! There are also some exotic countries where you normally earn money on per diems, for example Ukraine or Hungary. What is really painful are the long prescribed depreciation periods, i.e. the rigid German fixed asset life time. This can cost you real money.

Skip to main content