A modular, pipeline‑driven finance analytics SaaS built with Django & PostgreSQL
FinanceApp is a full‑stack personal finance analytics platform designed to ingest messy real‑world bank CSVs, clean and normalise the data, and present clear financial insights through dashboards, charts, and transaction management tools.
This is Version 1, focused on correctness, stability, modularity, and a clean user experience. The architecture is intentionally scalable, with a dedicated ingestion pipeline, logging system, and multi‑app layout.
📸Screenshots

📹Demo Video
🔐 Secure User Accounts (accounts app)
User registration, login, logout
Profile management
Per‑user data isolation
CSRF‑protected forms
Redirect‑safe authentication flow
Add, edit, delete transactions
Category normalisation
Clean currency formatting
Paginated transaction list
Per‑user transaction storage in PostgreSQL
Monthly summaries
Category totals
Date‑range analytics
Chart rendering (via chart.py)
Clean UI templates for dashboards and charts
📥 CSV Upload & Ingestion Pipeline
This is the heart of SaaS FinanceApp. FinanceApp includes a two‑stage ingestion pipeline:
A production‑grade cleaning engine that:
Handles messy CSV exports
Normalises dates into ISO format
Converts amounts into floats
Cleans categories (title‑case, typo fixes)
A safe importer that:
Accepts cleaned, validated rows
Saves them to PostgreSQL
Reports any remaining issues
Guarantees no type errors or crashes
Integrates with Django ORM cleanly
The project is structured into multiple Django apps, each with a clear responsibility:
accounts/ → Authentication, profiles
apps/
analytics/ → Transactions, dashboards, CSV ingestion
logs/ → Logging system (analytics, pipeline, security)
pipeline/ → Future pipeline engine (categorizer, cleaner, normalizer)
uploads/ → Generic upload system (future expansion)
csv_data/ → Test CSVs
finance_app/ → Project-level config (settings, URLs, WSGI)
settings/ → Environment-specific settings (base/dev/prod)
templates/ → Global templates (login, register, base layout)
🗄️ Database
FinanceApp uses PostgreSQL in development and production.
Environment variables (from .env):
DB_NAME=finance_app
DB_USER=postgres
DB_PASSWORD=yourpassword
DB_HOST=localhost
DB_PORT=5432
A dedicated logging subsystem with:
- analytics_logger.py
- pipeline_logger.py
- security_logger.py
- base.py
This allows:
- pipeline step logging
- error tracking
- security event logging
- analytics access logging
When uploading a messy CSV, the app might show:
Some rows were skipped during cleaning:
["Row 1: Invalid amount ' £2'",
"Row 14: Invalid date format 'date'",
"Row 15: Invalid amount '£2500'",
"Row 35: Missing date"]
Valid rows are imported cleanly and appear in the dashboard.
git clone https://github.com/reory/finance_app.git
cd finance_app
python -m venv venv
source venv/Scripts\activate # Windows
source venv\bin\activate # Mac/Linux
pip install -r requirements.txt
DEBUG=True
SECRET_KEY=your-secret-key
DB_NAME=finance_app
DB_USER=postgres
DB_PASSWORD=yourpassword
DB_HOST=localhost
DB_PORT=5432
python manage.py migrate
python manage.py runserver
🎯 Version 1 Goals Achieved
Modular Django architecture
PostgreSQL-backed data storage
Robust CSV ingestion pipeline
Clean UI for transactions
Dashboard analytics
Logging system
Authentication system
Error‑tolerant CSV cleaning
This is a complete, functional SaaS foundation.
🧪 Testing
This project includes a small, focused test suite that covers the critical paths of the backend:
CSV Cleaner – validates incoming CSV rows and rejects invalid data
CSV Importer – safely writes cleaned rows into the database
Transaction Model – ensures the ORM model stores values correctly
Schema & Field Validation – confirms required fields are present and correctly mapped
These tests ensure that the ingestion pipeline is stable, predictable, and safe to extend
▶️ Run the Pytest suite:
pytest -q
🛣️ Roadmap
[] Category inference
[] Duplicate transaction detection
[] Chart visualisations (Altair, Chart.js, or Plotly)
[] Export to CSV
[] Multi‑currency support
[] Bank‑specific import presets
[] Dashboard widgets
[] API endpoints (REST or GraphQL)
[] Background tasks (Celery or RQ)
🏁 Final Notes
This app manages real‑world data, provides meaningful analytics, and is built with clean, maintainable Django architecture.