The Expenses module enables you to manage and track your organization's business related expenses, whether they are goods, or services. Expense records also support billing them to your clients, so you can pass along the costs directly through your invoices. Effective use of the expense module can help you track and monitor your organization's cash flow, and keep up with your taxes.
When you select the Expenses module from the navigation menu on the left hand side of the screen, you will be taken to the table view listing and sorting all available expense records.
From the table view you can sort expense records by the various status filters on top of the table. You can use the Filter text box to search for an expense number, vendor, or amount. A More Actions menu to the right of each entry in the table shows a list of available management actions you can take against an expense record, such as editing, cloning to a new expense record, cloning to a new recurring expense record, archiving, or deleting.
Simply click on an expense number from the table to view/edit that expense.
The view/edit panel for an expense record has all the details about the record broken into four sections, as follows:
Note that when you view your reports, expenses will be categorized by the currency of the expense/vendor, not the currency selected under "Convert Currency". If you wish to consolidate your profit and loss totals under one currency, you should select your own currency for each expense record, and use the converted amount for the expense amount, leaving any reference to a foreign currency out of the record details.
The taxes section is where you control how taxes are applied to the expense.
Expense Tax Rates must first be enabled under Settings > Tax Settings for expense taxes to work (or it will say "Item tax rates are disabled").
The Taxes panel on the bottom right of the expense edit screen will let you choose one of these options:
Here's a video of enabling the Expense Tax Rates, adding a new Expense Category, and recording a new expense using these options:
You can use the More Actions dropdown menu (if on the expenses table view) or the Save dropdown arrow menu in the top right corner of the expense edit panel, to see a list of management actions that can be taken against the expense record:
These additional options will be visible only if Should be invoiced is checked:
The Documents tab supports uploading files such as documents, pictures, and more to allow you to share them with the client when attached to an invoice (if enabled) or with other users of the admin portal.
The following describe the lifecycle of an expense record
An expense's default state is Logged, when an expense is created. An expense is marked logged whether or not you have reported that you have paid the vendor for the expense yet.
An expense that has Should be Invoiced enabled, making it billable to a client, is automatically changed to a Pending state.
An expense record is automatically changed to Invoiced after the expense has been added to a client invoice. Note that an expense is marked Invoiced simply by being on an invoice, and its state doesn't change whether or not that invoice has been paid for by the client. The overview tab of the expense record's preview panel will link you to the invoice that expense is attached to.
An expense record can manually be archived, which simply hides it from view in the table or list of active expenses. The details of archived expenses are still included in reports. You can view archived expenses by changing filters in the table view, and you can use the "Restore" function to return an archived expense to its former state.
An expense record can manually be deleted, which will remove it from view, and remove it from any reports as well. Deleted expense records can be seen by changing your filters when viewing the table or list of expenses, and using the "Restore" function can return the deleted expense record to its former state.
This feature allows you to configure an e-mail address to accept attachments from vendors, clients and internal users which can then be processed using Mindee to perform data extraction and create expense records. Zugferd xml files are also supported and are able to be automatically parsed and converted into an expense.
The system works by configuring an e-mail address to accept attachments, the attachments (and the email body text) are stored on file and an expense record is created. The system will attempt to extract data from the document and insert it into the expense record.
The following settings are available:
To ensure delivery, you have to configure all used mailgun regions with a recieving configuration using store & notify.
Create and setup your mailgun account Prepare your DNS settings for inbound mail processing, by setting up necessary MX records Create a receiving route using store and notify 3a. Go to Receiving Section and click on "Create Route" 3b. Create your route by selecting your mailbox configured in invoiceninja and add notify endpoint /api/v1/mailgun_inbound_webhook
To ensure delivery you have to configure brevo inbound parsing according to: https://developers.brevo.com/docs/inbound-parse-webhooks
Create and setup your brevo account Prepare your DNS settings for inbound mail processing, by setting up necessary MX records Register the webhook via the brevo api to the following notify endpoint: /api/v1/brevo_inbound_webhook?token=brevo-api-token SetUp Postmark To ensure delivery you have to configure brevo inbound parsing according to: https://developers.brevo.com/docs/inbound-parse-webhooks
If you want to use your own mailbox, you have to either redirect the mail to a mailbox of one of the providers above or use a provider for inbound directly. We recommend to use one of these providers hosted on a subdomain f.ex. invoicing.xxx.com directly or to use the auto-generated mailbox of postmark when you are using redirect.
To parse a document IN can use OCR solutions like Mindee. Mindee offers to process documents and guess the contents using AI. Each account has 250 pages for free, which makes it very suiteable for small busineses using self-hosted.
Use the following .env variable to configure your mindee api key:
MINDEE_API_KEY=your-api-key
First of All, you have to create your Mindee Account (if you wanna use OCR), without it IN will only use standards like ZUGFeRD if the document supports it. Create an API Key and save it to the env file of your IN instance: MINDEE_API_KEY=API-KEY I suggest checking how many free pages are included in your free mindee subscription. Default should be 250, but this may varry. I you wanna change your local tracked contingent per month to avoid unnecessary payments to mindee, you can use the following envs to customize the behavior:
MINDEE_MONTHLY_LIMIT MINDEE_DAILY_LIMIT MINDEE_ACCOUNT_MONTHLY_LIMIT MINDEE_ACCOUNT_DAILY_LIMIT if the limit is exceeded mindee is treated as not configured. (ignored)
SetUp your account at mailgun/postmark/brevo and follow the steps to setup inbound mail parsing (each service does it differently) You can look at the original PR (#9042) , where I have documented more informations about each provider. I will now describe how I did it with brevo: a) Set an API-Key for the brevo endpoint within your env: INBOUND_WEBHOOK_TOKEN=XXX you can use somthing like: https://generate-random.org/api-key-generator b) Read and do this (setup your DNS and infos about it): https://developers.brevo.com/docs/inbound-parse-webhooks c) Create an API key in the Console d) Use this api-documentation to send the needed requests to setup your webhook: https://developers.brevo.com/reference/getwebhooks-1 => please append the following at the end of your url ?token=XXX (this is the api token from a) I highly suggest trying it first out if the webhook is working by using an url from https://webhook.site. This website will show you the contents of the webhooks beeing send, after you sended an email to the inbound webhook email. You can use the recieving url as the target for the webhooks created in d)
I am using gmail with google workspace, so i created a forward rules within admin.google.com to redirect all emails from xxx@my-domain.de to my internal email at brevo for recieving email at brevo and dont publishing the brevo email. You can also use the rules for redirect within the mailbox itself
a) Go To Settings->Expenses and enable the Inbound Mailbox b) Paste your brevo email into the reciever field (this has to be unique regarding the whole IN instance) c) Allow the senders you want to be able to send you expenses via mail. => I use enable my vendors and from my own company and added as whitelist also my personal email from my phone
a) Send an Email to the brevo inbound email b) Check if an expense got created c) If not: check if the request from brevo is present => this sometimes takes up to 5min d) If yes: check the logs for any errors and report them as an issue if you have any trouble resolving them
Want to contribute? Edit this page on GitHub!