Automatically categorize your expenses by using OpenAI
Go to file
2024-04-19 13:23:56 +02:00
.github/workflows Add new image name 2023-05-24 17:31:31 +02:00
docs/img Initial commit 2023-05-23 22:44:53 +02:00
public Initial commit 2023-05-23 22:44:53 +02:00
src Improve error logging 2023-12-27 21:51:57 +01:00
.gitignore Initial commit 2023-05-23 22:44:53 +02:00
Dockerfile Initial commit 2023-05-23 22:44:53 +02:00
index.js Initial commit 2023-05-23 22:44:53 +02:00
LICENSE Initial commit 2023-05-23 22:44:53 +02:00
package-lock.json Switch used model from "text-davinci-003" to "gpt-3.5-turbo-instruct" because the davinci model will be disabled on 01. January 2024 2023-12-13 10:28:27 +01:00
package.json Initial commit 2023-05-23 22:44:53 +02:00 Update 2024-04-19 13:23:56 +02:00

Firefly III AI categorization

This project allows you to automatically categorize your expenses in Firefly III by using OpenAI.

Please fork me

Unfortunately i am not able to invest more time into maintaining this project.

Feel free to fork it and create a PR that adds a link to your fork in the README file.

How it works

It provides a webhook that you can set up to be called every time a new expense is added.

It will then generate a prompt for OpenAI, including your existing categories, the recipient and the description of the transaction.

OpenAI will, based on that prompt, guess the category for the transaction.

If it is one of your existing categories, the tool will set the category on the transaction and also add a tag to the transaction.

If it cannot detect the category, it will not update anything.


Please note that some details of the transactions will be sent to OpenAI as information to guess the category.

These are:

  • Transaction description
  • Name of transaction destination account
  • Names of all categories


1. Get a Firefly Personal Access Token

You can generate your own Personal Access Token on the Profile page. Login to your Firefly III instance, go to "Options" > "Profile" > "OAuth" and find "Personal Access Tokens". Create a new Personal Access Token by clicking on "Create New Token". Give it a recognizable name and press "Create". The Personal Access Token is pretty long. Use a tool like Notepad++ or Visual Studio Code to copy-and-paste it.

Step 1 Step 2 Step 3

2. Get an OpenAI API Key

The project needs to be configured with your OpenAI account's secret key.

When an API key is created you'll be able to copy the secret key and use it.

OpenAI screenshot

Note: OpenAI currently provides 5$ free credits for 3 months which is great since you wont have to provide your payment details to begin interacting with the API for the first time.

After that you have to enable billing in your account.

Tip: Make sure to set budget limits to prevent suprises at the end of the month.

3. Start the application via Docker

3.1 Docker Compose

Create a new file docker-compose.yml with this content (or add to existing docker-compose file):

version: '3.3'

    restart: always
      - "3000:3000"
      FIREFLY_URL: ""
      FIREFLY_PERSONAL_TOKEN: "eyabc123..."
      OPENAI_API_KEY: "sk-abc123..."

Make sure to set the environment variables correctly.

Run docker-compose up -d.

Now the application is running and accessible at port 3000.

3.2 Manually via Docker

Run this Docker command to start the application container. Edit the environment variables to match the credentials created before.

docker run -d \
-p 3000:3000 \
-e OPENAI_API_KEY=sk-abc123... \

4. Set up the webhook

After starting your container, you have to set up the webhook in Firefly that will automatically trigger the categorization everytime a new transaction comes in.

  • Login to your Firefly instance
  • In the sidebar go to "Automation" > "Webhooks"
  • Click "Create new webhook"
  • Give the webhook a title. For example "AI Categorizer"
  • Set "Trigger" to "After transaction creation" (should be the default)
  • Set "Response" to "Transaction details" (should be the default)
  • Set "Delivery" to "JSON" (should be the default)
  • Set "URL" to the URL where the application is reachable + "/webhook". For example if you are using docker-compose your URL could look like this: http://categorizer:3000/webhook
  • Click "Submit"

Step 1 Step 2 Step 3

Now you are ready and every new withdrawal transaction should be automatically categorized by OpenAI.

User Interface

The application comes with a minimal UI that allows you to monitor the classification queue and see the OpenAI prompts and responses. This UI is disabled by default.

To enable this UI set the environment variable ENABLE_UI to true.

After a restart of the application the UI can be accessed at http://localhost:3000/ (or any other URL that allows you to reach the container).

Adjust Tag name

The application automatically sets the tag "AI categorized" on every transaction that was processed and a category could be guessed.

You can configure the name of this tag by setting the environment variable FIREFLY_TAG accordingly.

Running on a different port

If you have to run the application on a different port than the default port 3000 set the environment variable PORT.

Full list of environment variables

  • FIREFLY_URL: The URL to your Firefly III instance. Example: (required)
  • FIREFLY_PERSONAL_TOKEN: A Firefly III Personal Access Token. (required)
  • OPENAI_API_KEY: The OpenAI API Key to authenticate against OpenAI. (required)
  • ENABLE_UI: If the user interface should be enabled. (Default: false)
  • FIREFLY_TAG: The tag to assign to the processed transactions. (Default: AI categorized)
  • PORT: The port where the application listens. (Default: 3000)