Expenses
Keep track of your expenses and include them in your invoices
- Record all your expenses and show them in a table view
- The data can be searched- and filtered (see screenshots)
- All (billable) expenses will be automatically included in your invoices
- Negative amounts allow for complex bookings, budget and invoice adjustments
- Manage expenses via API
- Export expenses in: Excel, PDF, HTML
- Support for custom-fields
- Include expenses in Kimai export module
- Import expenses from Kimai 1
Expenses will be assigned to free configurable categories and each category has:
- name
- visibility flag
- default cost
- color
- help text (will be shown when creating an expense)
- description (will be copied into the expense description upon selection)
Each expense has the following fields:
- a date-time
- category (see above)
- user
- project (and customer)
- activity (optional)
- description (free text field)
- the cost (can be hidden for default user, if you use default cost via category)
- an amount (see it as multiplier, use 1 if you want to charge the cost only)
- a billable flag (non-billable expenses will not be added to your invoices)
- an export flag (to make sure, that each expense will be invoiced only once)
If turned on, Expenses count towards budgets and revenue statistics.
Expense summaries are displayed on the detail pages for customer, project and activity.
Usage
Users with sufficient permissions can access the expense administration screen at /en/expenses/
.
During installation, a default Demo
category is created to help you get started with adding expenses. You can rename it after completing your first test.
Categories
Expenses are organized into categories. An expense category serves three main purposes:
- It groups related expenses.
- It sets default values for calculations.
- It allows configuration of a price per unit.
When defining costs, you can pre-set how much will be calculated for a single expense item.
For example, if you set 10
as the Cost
and the user enters 5
as the Quantity
, the total expense will amount to 50
.
If you want users to input the actual price themselves, you can set the cost to 1
.
Price vs Amount
Each expense consists of two fields:
- Quantity (visible to all users)
- Amount (visible only to Admins)
Regular users can view and edit the Quantity
field. However, only Admins have permission to directly edit an expense’s Amount
.
The usual case is that most categories have a fixed price and your users only enter a quantity
. But:
If you want users to input the actual price themselves, you set the category cost to 1
.
In that case the quantity
represents the amount on the receipt.
Example
The following example illustrates this process:
The category Driving distance
is designed to track travel routes between the office and a client location. The cost is set at 0.30
per kilometer.
Now, let’s assume a user creates an expense using the new Driving distance
category and enters a quantity of 74
, as shown in the screenshot below:
In this case, the entered quantity of 74
kilometers is multiplied by the cost of 0.30
, resulting in a total amount of 22.20 €
.
Invoices
Expenses are automatically included in your invoices, so it may be helpful to differentiate between expenses and timesheets.
- The invoice template variable
${entry.type}
indicates the type of entry. Its value will beexpense
. This can be used in tools like Excel withIF
formulas or conditional formatting. - The variable
${entry.category}
contains the expense category name.
Budgets
As initially written:
If turned on, Expenses count towards budgets and revenue statistics.
At System > Settings in the Expenses
category you find a setting called If activated: adds expenses to consumed budgets
.
Switch it on and all expenses will be deducted from your budgets.
Filter and search
The search supports filtering by the fields:
daterange
customer
project
activity
expense category
user
billable
exported
The free search term will query the field:
description
Additionally, you can filter for custom fields by using a search phrase like location:homeoffice
.
This would find all entries with the custom field location
matching the term homeoffice
.
The search terms will be found within the full value, so searching for office
would find:
I love working in my office
Office
This office is beautiful
Our offices are very noisy
Attention: checkboxes have the values 0
(not checked) and 1
(checked).
You can mix the search term and use multiple meta-field queries:
location:homeoffice hello
- find all entries matching the search termhello
with the custom fieldlocation
matching the termhomeoffice
location:homeoffice contract:fulltime
- find all entries with the custom field combination:location
matchinghomeoffice
andcontract
matchingfulltime
expired:0
finds all items whoseexpired
checkbox isoff
There are also special operators, which can be used in conjunction with custom fields (since Kimai 1.19.1):
- The
location:
) will find all entries whose value in thelocation
field is either empty or not existing - The
~
search term (e.g.location:~
) will find all entries that are missing the custom field (created before the field was created) - The
*
search term (e.g.location:*
) will find all entries that have any value in thelocation
field (basically the opposite of~
)
Permissions
Permission Name | Description |
---|---|
view_expense |
allows access to the expenses screen |
edit_expense |
edit existing expenses |
edit_expense_cost |
edit the cost of a single expense (deactivate this, if you want to provide default costs via the category) |
export_expense |
export expenses |
create_expense |
create new expenses |
delete_expense |
delete existing expenses |
manage_expense_category |
manage expense types |
edit_exported_expense |
allow to edit and delete exported expenses |
Pre-defined permissions are assigned to all default user roles.
The following restrictions are in place for accessing other user’s data:
- can only be seen by users who own the
view_other_timesheet
- users that own the
view_expense
permission but NOTview_other_timesheet
will only see own expenses - the visible data for non-admin users (permission
view_all_data
) is limited by team assignments
Read how to assign these permissions to your user roles in the permission documentation.