Skip to content

Configuration

Paisa stores its configuration in paisa.yaml. You can edit it from the web interface or as a text file. Paisa looks for it in this order:

  1. The path in the PAISA_CONFIG environment variable.
  2. The path passed with --config.
  3. The current working directory.
  4. paisa/paisa.yaml inside the user's Documents folder.

If no file exists, Paisa creates paisa/paisa.yaml in Documents. The defaults use INR and en-IN; change the currency, locale, and financial-year start when they do not match your location.

Basic settings

These are the settings most people change first:

Setting Purpose Example
default_currency Currency used for totals and conversions INR
locale Number and date formatting en-IN
financial_year_starting_month First month of the financial year 4
ledger_cli Ledger engine used to read journals ledger
journal_path Main journal file /home/john/Documents/paisa/main.ledger
db_path SQLite database file /home/john/Documents/paisa/paisa.db

The web interface can edit the same settings.

Account patterns

Several features accept a list of accounts. Use a full name such as Assets:Equity:APPLE, * to match descendants such as Assets:Equity:*, or negation such as !Expenses:Tax. Do not mix positive and negated patterns in the same list.

Budgets and goals

budget.rollover controls whether unused budget carries into the next month. The goals section defines retirement and savings goals, including their accounts, target, date, contribution, and expected return assumptions. See Budgets and Goals before changing these values.

Investments and tax

Use commodities for price providers and tax categories, allocation_targets for portfolio targets, and schedule_al for Schedule AL account groups. Related guides cover commodities and prices, allocation targets, and Schedule AL.

Import and prediction

import_templates stores reusable statement templates. Merchant-to-account rules live under prediction.merchant_rules and take precedence over general prediction history. See Import statements and Account suggestions for the workflow.

Authentication

user_accounts protects the web interface with usernames and passwords. The UI stores new or changed passwords as Argon2id hashes and upgrades legacy sha256: credentials after a successful login. See Authentication for the security boundaries and HTTPS requirements.

Credit cards

Each credit_cards entry connects statement dates, due dates, limits, and card details to an existing liability account. See Credit cards for an annotated example.

Complete example

The example below collects the available settings in one place. Copy only the sections you need and adjust their values for your journal.

# Path to your journal file. It can be absolute or relative to the
# configuration file. The main journal file can refer other files using
# `include` as long as all the files are in the same or sub directory
# REQUIRED
journal_path: /home/john/Documents/paisa/main.ledger

# Path to your database file. It can be absolute or relative to the
# configuration file. The database file will be created if it does not exist.
# REQUIRED
db_path: /home/john/Documents/paisa/paisa.db

# Path to your sheets directory. It can be absolute or relative to the
# configuration file. The sheets directory will be created if it does not exist.
# By default it will be created in the same directory as the journal file.
# OPTIONAL, DEFAULT: same directory as journal file.
sheets_directory: sheets

# The ledger client to use
# OPTIONAL, DEFAULT: ledger, ENUM: ledger, hledger, beancount
ledger_cli: ledger

# The default currency to use. NOTE: Paisa tries to convert other
# currencies to default currency, so make sure it's possible to
# convert to default currency by specifying the exchange rate.
#
# OPTIONAL, DEFAULT: INR
default_currency: INR

# The precision to show in UI. NOTE: This applies only to the UI, not
# to the entries in journal.
#
# OPTIONAL, DEFAULT: 0
display_precision: 0

# The column to align the amount in the editor.
#
# OPTIONAL, DEFAULT: 52
amount_alignment_column: 52

# The locale used to format numbers. The list of locales supported
# depends on your browser. It's known to work well with en-US and en-IN.
#
# OPTIONAL, DEFAULT: en-IN
locale: en-IN

# The time zone used to parse and format dates. If not set, system
# time zone will be used. Example values are Asia/Kolkata,
# America/New_York, etc
#
# OPTIONAL, DEFAULT: system timezone
time_zone: ""

# First month of the financial year. This can be set to 1 to follow
# January to December.
#
# OPTIONAL, DEFAULT: 4
financial_year_starting_month: 4

# First day of the week. This can be set to 1 to follow Monday to
# Sunday. 0 represents Sunday, 1 represents Monday and so on.
#
# OPTIONAL, DEFAULT: 0
week_starting_day: 0

# When strict mode is enabled, all the accounts and commodities should
# be defined before use. This is same as --pedantic flag in ledger and
# --strict flag in hledger. Doesn't apply to beancount.
#
# OPTIONAL, ENUM: yes, no DEFAULT: no
strict: "no"

## Budget
budget:
  # Rollover unspent money to next month
  # OPTIONAL, ENUM: yes, no DEFAULT: yes
  rollover: "yes"

## Goals
goals:
  # Retirement goals
  retirement:
    # Goal name
    # REQUIRED
    - name: Retirement
      # Goal icon
      # REQUIRED
      icon: mdi:palm-tree
      # Safe Withdrawal Rate
      # OPTIONAL, DEFAULT: 4
      swr: 2
      # List of expense accounts
      # OPTIONAL, DEFAULT: Expenses:*
      expenses:
        - Expenses:Clothing
        - Expenses:Education
        - Expenses:Entertainment
        - Expenses:Food
        - Expenses:Gift
        - Expenses:Insurance
        - Expenses:Misc
        - Expenses:Restaurant
        - Expenses:Shopping
        - Expenses:Utilities
      # List of accounts where you keep retirement savings
      # OPTIONAL, DEFAULT: Assets:*
      savings:
        - Assets:Equity:*
        - Assets:Debt:*
      # By default, average of last 3 year expenses will be used to
      # calculate your yearly expenses. This can be overridden by setting
      # this configuration to positive value
      # OPTIONAL, DEFAULT: 0
      yearly_expenses: 0
  savings:
    # Goal name
    # REQUIRED
    - name: House
      # Goal icon
      # REQUIRED
      icon: fluent-emoji-high-contrast:house-with-garden
      # Goal target amount
      # REQUIRED
      target: 100000
      # Goal target date
      # OPTIONAL (either target_date or payment_per_period can be specified)
      target_date: "2030-01-01"
      # Expected rate of returns
      # OPTIONAL
      payment_per_period: 0
      # Expected rate of returns
      # OPTIONAL, REQUIRED if target_date or payment_per_period is set
      rate: 5
      # List of accounts where you keep the goal's savings
      # REQUIRED
      accounts:
        - Assets:Equity:**
## Schedule AL
# OPTIONAL, DEFAULT: []
schedule_al:
  # Code
  # REQUIRED, ENUM: immovable, metal, art, vehicle, bank, share,
  # insurance, loan, cash, liability
  - code: metal
    accounts:
      - Assets:Gold
  - code: bank
    accounts:
      - Assets:Checking
      - Assets:Debt:Cash:FD
  - code: share
    accounts:
      - Assets:Equity:*
  - code: insurance
    accounts:
      - Assets:Debt:Insurance

## Allocation Target
# OPTIONAL, DEFAULT: []
allocation_targets:
  - name: Debt
    target: 30
    accounts:
      - Assets:Debt:*
      - Assets:Checking
  - name: Equity
    target: 60
    accounts:
      - Assets:Equity:*
  - name: Equity Foreign
    target: 20
    accounts:
      - Assets:Equity:NASDAQ
  - name: Equity Index
    target: 20
    accounts:
      - Assets:Equity:NIFTY
  - name: Equity Active
    target: 20
    accounts:
      - Assets:Equity:PPFAS
  - name: Others
    target: 10
    accounts:
      - Assets:Gold
      - Assets:RealEstate

## Commodities
# OPTIONAL, DEFAULT: []
commodities:
  - name: NASDAQ
    # Required, ENUM: mutualfund, stock, nps, unknown
    type: mutualfund
    price:
      # Required, ENUM: in-mfapi, com-yahoo, com-purifiedbytes-nps, co-alphavantage
      provider: in-mfapi
      # differs based on provider
      code: 145552
    harvest: 1095
    # Optional, ENUM: equity65, equity35, debt, unlisted_equity
    tax_category: debt
  - name: NIFTY
    type: mutualfund
    price:
      provider: in-mfapi
      code: 120716
    harvest: 365
    tax_category: equity65
  - name: APPLE
    type: stock
    price:
      provider: com-yahoo
      code: AAPL
    harvest: 1095
    tax_category: equity65

## Import Templates
# OPTIONAL, DEFAULT: []
import_templates:
  - name: SBI Account Statement
    # Required
    content: |
      {{#if (isDate ROW.A "D MMM YYYY")}}
        {{date ROW.A "D MMM YYYY"}} {{ROW.C}}
        {{#if (isBlank ROW.F)}}
          {{predictAccount prefix="Expenses"}}      {{amount ROW.E}} INR
          Assets:Checking:SBI
        {{else}}
          Assets:Checking:SBI                       {{amount ROW.F}} INR
          {{predictAccount prefix="Income"}}
        {{/if}}
      {{/if}}
    # Should be a valid handlebar template

## Prediction
# OPTIONAL, DEFAULT: empty merchant_rules
prediction:
  merchant_rules:
    # Grouped merchant list shorthand:
    - account: "Expenses:Groceries"
      merchants:
        - "supermarket central"
        - "fresh mart"
        - "corner grocery"
        - "quick commerce"

    - account: "Expenses:Groceries:Vegetables"
      merchants:
        - "green farm market"
        - "city produce"
        - "fresh vegetables"

    # Singular merchant rule (also supported for backward compatibility):
    - merchant: "swiggy instamart"
      account: "Expenses:Groceries"

    # Merchant text is matched after normalization. The import template prefix
    # still hard-filters the account, so an Expenses rule is ignored for
    # prefix="Income".

## Accounts: account customization
# OPTIONAL, DEFAULT: []
accounts:
  - name: Liabilities:CreditCard:IDFC
    # Required, name of the account
    icon: arcticons:idfc-first-bank
    # Optional, use the UI to select the icon.

## List of user accounts.
# If the list is empty, then no authentication will be performed.
# Remote/network-exposed Paisa instances should always be hosted behind HTTPS.
# Passwords in UI configuration are stored using Argon2id ($argon2id$...).
# Legacy sha256:... credentials remain fully backwards-compatible and are
# opportunistically upgraded to Argon2id upon successful authentication.
#
# OPTIONAL, DEFAULT: []
user_accounts:
  - username: john.doe
    # Required. When updated via the UI or API, password values are hashed with Argon2id.
    password: $argon2id$v=19$m=65536,t=3,p=2$c2FsdHNhbHRzYWx0c2FsdA$aGFzaGhhc2hoYXNoaGFzaGhhc2hoYXNoaGFzaGhhc2g

## List of credit cards
# OPTIONAL, DEFAULT: []
credit_cards:
  - account: Liabilities:CreditCard:Freedom
    # Required, account name
    credit_limit: 150000
    # Required, credit limit of the card
    statement_end_day: 8
    # Required, the day of the month when the statement is generated
    due_day: 20
    # Required, the day of the month when the payment is due
    network: visa
    # Required, the network of the card
    number: "0007"
    # Required, the last 4 digits of the card number
    expiration_date: "2029-05-01"
    # Required, the expiration date of the card