A web tool for finding and merging duplicate withdrawal/deposit pairs in Firefly III that represent the same transfer between accounts.
When importing transactions from multiple bank accounts, the same transfer often appears twice:
- A withdrawal from the source account
- A deposit to the destination account
This tool finds these matching pairs and merges them into a single transfer transaction.
- Search for matching transaction pairs by date range and account
- Match criteria: same amount, same currency, different accounts, within N business days
- One-click merge for individual pairs
- Bulk merge multiple selected pairs at once
- Session-based authentication with Firefly III Personal Access Token
docker compose up -ddocker run -p 8000:8000 --read-only --user 65534:65534 \
ghcr.io/engturtle/firefly-transaction-merger:latest| Variable | Description | Default |
|---|---|---|
SESSION_SECRET_KEY |
Secret key for session encryption. Set this for persistent sessions across restarts. | Random (generated at startup) |
DEBUG |
Enable debug logging (1, true, or yes) |
Disabled |
- Login - Enter your Firefly III URL and Personal Access Token
- Search - Set date range, optional account filter, and max business days apart
- Review - Check the matched pairs shown in the results table
- Merge - Click "Merge" on individual rows, or select multiple and click "Merge Selected"
- Go to your Firefly III instance
- Navigate to Options > Profile > OAuth
- Create a new Personal Access Token
- Copy the token (it's only shown once)
- Python 3.14+
- uv package manager
# Install dependencies
uv sync
# Run the development server
uv run uvicorn main:app --reload# Run all tests
uv run pytest
# Run with verbose output
uv run pytest -v
# Run with coverage report
uv run pytest --cov=matcher --cov-report=term-missingdocker build -t firefly-transaction-merger .This project was built with the help of: