Securo Database Models: Complete Guide to the Core SQLAlchemy ORM Architecture

Securo uses a single SQLAlchemy declarative base with 25+ core models spanning users, workspaces, financial entities, and automation rules, all defined in backend/app/models/.

The Securo finance platform's persistence layer is built entirely on SQLAlchemy ORM, with a unified declarative base (Base) defined in app.core.database. Every core SQLAlchemy database model in Securo inherits from this base, representing users, workspaces, transactions, and the full spectrum of financial metadata needed for multi-tenant personal and business accounting.


User and Identity Management Models

Authentication and authorization in Securo center on two primary models in backend/app/models/user.py and backend/app/models/passkey.py.

User

The User model serves as the central identity for authentication via FastAPI-Users. It stores preferences, two-factor authentication settings, and maintains relationships to all user-owned entities throughout the system.

Key relationships include one-to-many links to Workspace (via ownership), Passkey, and indirect associations to all financial data through workspace membership.

Passkey

The Passkey model stores WebAuthn credentials attached to a user for password-less login. This enables modern, phishing-resistant authentication as implemented in backend/app/models/passkey.py.


Workspace and Access Control Models

Multi-tenancy and collaboration are handled through three interconnected models in backend/app/models/workspace.py and backend/app/models/group.py.

Workspace

The Workspace model acts as a container for a set of accounts, categories, and transactions. It supports personal versus business kinds and includes archival and management flags for lifecycle control.

WorkspaceMember

WorkspaceMember functions as a junction table linking User ↔ Workspace with role definitions (owner/editor/viewer) and audit fields. This model enforces granular access control within shared financial environments.

Group

The Group model represents collaborative collections of users and financial entities—such as shared households or business teams. Complementing this is GroupSettlement (backend/app/models/group_settlement.py), which tracks settlement balances between group members.


Core Financial Entity Models

The heart of Securo's data model consists of accounts, transactions, and their supporting entities.

Account

In backend/app/models/account.py, the Account model represents financial accounts including bank accounts, cash holdings, and credit cards. It handles currency denominations, balance tracking, and visibility settings within its parent workspace.

Transaction

The Transaction model in backend/app/models/transaction.py is the core ledger entry. It stores amount, dates, description, and maintains foreign keys to accounts, payees, categories, and optional splits.

TransactionSplit

TransactionSplit (backend/app/models/transaction_split.py) allows a single transaction to be divided among multiple categories and amounts—essential for detailed expense tracking where a single purchase spans multiple budget categories.

TransactionAttachment

TransactionAttachment (backend/app/models/transaction_attachment.py) provides optional file or image linking to transactions, typically used for receipt storage and expense documentation.

Payee

The Payee model in backend/app/models/payee.py represents counter-parties for transactions—individuals, merchants, or organizations—with optional tax-ID data for business accounting compliance.


Classification and Budgeting Models

Organizational structure for financial data is enforced through hierarchical category systems and budget enforcement.

Category

In backend/app/models/category.py, the Category model provides hierarchical classification for transactions. Each category links to both a user and a workspace, enabling personalized organizational schemes.

CategoryGroup

CategoryGroup (backend/app/models/category_group.py) creates logical groupings of categories, primarily useful for consolidated budgeting and reporting views.

Budget

The Budget model in backend/app/models/budget.py defines monetary caps for a category or category group over a specified time period, enabling spending limit enforcement.

Goal

Goal (backend/app/models/goal.py) implements user-defined financial targets such as savings goals with integrated progress tracking against actual balances.


Asset and Investment Models

Non-cash financial holdings are modeled through four related entities.

Asset, AssetGroup, AssetTransaction, AssetValue

Together these models in backend/app/models/asset.py, asset_group.py, asset_transaction.py, and asset_value.py represent:

  • Asset: Individual non-cash holdings (stocks, bonds, real estate)
  • AssetGroup: Logical collection of related assets
  • AssetTransaction: Purchase, sale, and adjustment entries for assets
  • AssetValue: Historical valuation snapshots enabling performance tracking and reporting

Automation and Integration Models

Securo supports extensive automation through scheduled transactions and rule-based processing.

RecurringTransaction

In backend/app/models/recurring_transaction.py, RecurringTransaction serves as a template for automatically generated transactions on defined schedules—managing subscription tracking and predictable expenses.

Rule

The Rule model in backend/app/models/rule.py implements an automation rule engine with condition → action logic. Rules can automatically tag, categorize, or move transactions based on pattern matching.

Collection

Collection (backend/app/models/collection.py) provides user-defined groupings of transactions for bulk actions or specialized reporting, independent of categorization.


Banking and External Integration Models

Financial institution connectivity is abstracted through dedicated credential and metadata models.

BankConnection

BankConnection in backend/app/models/bank_connection.py stores OAuth and API credentials for linked financial institutions, managing secure access to external account data.

Institution

The Institution model (backend/app/models/institution.py) maintains metadata about financial institutions including name, type, and supported feature flags for connection management.

FxRate

FxRate (backend/app/models/fx_rate.py) stores foreign-exchange rate snapshots used for currency conversion calculations across multi-currency workspaces.

CreditCardBill

CreditCardBill in backend/app/models/credit_card_bill.py represents monthly credit-card statements linked to specific accounts, enabling statement reconciliation workflows.


System and Audit Models

Operational support is provided through logging and configuration models.

ImportLog

ImportLog (backend/app/models/import_log.py) records data import operations from formats like CSV and OFX, supporting audit trails and troubleshooting workflows.

AppSettings

The AppSettings model in backend/app/models/app_settings.py stores global configuration in the database—including feature flags and deployment-specific parameters.


Practical Model Usage Example

The following service-layer function demonstrates canonical usage of Securo's core SQLAlchemy database models for creating a transaction:

from sqlalchemy.ext.asyncio import AsyncSession
from app.models.transaction import Transaction
from app.models.account import Account
from app.models.payee import Payee
from uuid import uuid4
import datetime

async def create_transaction(
    db: AsyncSession,
    *, 
    workspace_id: uuid.UUID,
    account_id: uuid.UUID,
    payee_id: uuid.UUID,
    amount: int,
    description: str,
) -> Transaction:
    # Fetch related entities (simplified)

    account = await db.get(Account, account_id)
    payee = await db.get(Payee, payee_id)

    tx = Transaction(
        id=uuid4(),
        workspace_id=workspace_id,
        account_id=account.id,
        payee_id=payee.id,
        amount=amount,
        description=description,
        date=datetime.date.today(),
        currency=account.currency,
    )
    db.add(tx)
    await db.commit()
    await db.refresh(tx)
    return tx

This pattern illustrates direct use of declarative models with automatic handling of column defaults and relationships as defined in the source files.


Summary

  • All Securo database models inherit from a single SQLAlchemy declarative base in app.core.database
  • User-centric models (User, Passkey, Workspace, WorkspaceMember) handle authentication and multi-tenant access control
  • Financial core models (Account, Transaction, TransactionSplit, Payee) implement double-entry ledger functionality
  • Classification models (Category, CategoryGroup, Budget, Goal) enable organizational structure and spending controls
  • Asset models (Asset, AssetGroup, AssetTransaction, AssetValue) support investment tracking with historical valuations
  • Automation models (RecurringTransaction, Rule, Collection) provide scheduled and conditional transaction processing
  • Integration models (BankConnection, Institution, FxRate, CreditCardBill) abstract external financial data sources

Frequently Asked Questions

How does Securo handle multi-tenant data isolation?

Securo implements multi-tenancy through the Workspace model as the primary isolation boundary. All financial entities—including Account, Transaction, and Category—carry a workspace_id foreign key. The WorkspaceMember junction table enforces role-based access control (owner/editor/viewer) within each workspace, ensuring users only access data from workspaces where they have explicit membership.

Where is the SQLAlchemy Base class defined in Securo?

The declarative Base class is defined in backend/app/core/database.py alongside the engine configuration and session management utilities. All ORM models across the backend/app/models/ package import and inherit from this single base, ensuring consistent metadata and table naming conventions throughout the application.

What model handles transaction categorization and splits?

Transaction categorization uses the Category model with optional hierarchical relationships. For transactions spanning multiple purposes, TransactionSplit (backend/app/models/transaction_split.py) enables division of a single transaction amount across multiple categories with independent amounts, while preserving a single source transaction record for reconciliation and audit purposes.

Does Securo support automated transaction processing?

Yes, through two complementary models: RecurringTransaction generates transactions on defined schedules for predictable items like subscriptions, while Rule (backend/app/models/rule.py) implements conditional automation that can tag, categorize, or move existing transactions based on pattern-matching criteria evaluated at import time or on demand.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →