Skip to main content

Overview

BudgetView’s multi-wallet management feature allows you to organize your finances across multiple accounts. Track balances, view transaction summaries, and analyze spending patterns for each wallet independently.

Unlimited Wallets

Create as many wallets as you need to organize different accounts

Real-Time Balances

Track income, expenses, and net balance for each wallet

BCV Conversion

Automatic conversion to Venezuelan Bolivars using live BCV rates

Period Filtering

Filter wallet data by 7 days, current month, last month, or custom ranges

Key Features

Wallet Creation

Create wallets with descriptive names (up to 13 characters) to identify your different accounts:
1

Click 'Nueva billetera'

Access the wallet creation dialog from the wallets page.
2

Enter wallet name

Provide a descriptive name like “Principal”, “Ahorros”, or “Negocios”.
3

Save

The wallet is created and immediately available for transactions.

Balance Tracking

Each wallet displays comprehensive balance information:
type WalletSummary = {
  id: string
  name: string
  balance: number        // Net balance (income - expenses)
  income: number         // Total income
  expense: number        // Total expenses
  transactionCount: number
  positiveCount: number  // Number of income transactions
  negativeCount: number  // Number of expense transactions
  status: "Activa" | "Sin movimientos"
}

Period Filters

Analyze wallet performance across different time periods:
View transactions from the past week for quick recent activity analysis.

BCV Currency Conversion

All wallet amounts are automatically converted to Venezuelan Bolivars using the official BCV exchange rate:
const formatBcvAmount = (usdAmount: number) => {
  if (!bcvRate || usdAmount === 0) {
    return null
  }
  return formatCurrency(usdAmount * bcvRate, "VES")
}
The BCV rate is fetched from https://ve.dolarapi.com/v1/dolares/oficial and updates automatically.

Wallet Summary Cards

The wallets page displays three key metric cards:

Balance Total

Combined balance across all wallets with BCV conversion

Total Billeteras

Total number of wallets you’ve created

Movimientos

Count of positive and negative transactions across all wallets

Individual Wallet Cards

Each wallet is displayed in a detailed card showing:
  • Wallet Name & Status: Active or inactive based on recent transactions
  • Balance: Current net balance in USD and VES
  • Income & Expenses: Total amounts for each type with BCV conversion
  • Transaction Counts: Number of positive and negative transactions
  • Action Buttons: Edit name or delete wallet

Wallet Status Indicators

status: wallet.transactionCount > 0 ? "Activa" : "Sin movimientos"
Wallets with associated transactions cannot be deleted. Remove all transactions first.

Data Aggregation

Wallet balances are calculated by aggregating transactions from the transacciones table:
for (const tx of transactions) {
  const amount = Number(tx.monto ?? 0)
  if (tx.tipo === "ingreso") {
    wallet.income += amount
    wallet.balance += amount
    wallet.positiveCount += 1
  } else if (tx.tipo === "gasto") {
    wallet.expense += amount
    wallet.balance -= amount
    wallet.negativeCount += 1
  }
  wallet.transactionCount += 1
  wallet.status = "Activa"
}

Edit Wallet

Update wallet names to keep your accounts organized:
1

Click Edit

Select the edit button on any wallet card.
2

Update Name

Modify the wallet name (max 13 characters).
3

Save Changes

The wallet name updates immediately across the application.

Delete Wallet

Remove wallets you no longer need:
Important Restrictions:
  • Wallets with associated transactions cannot be deleted
  • You must first reassign or delete all transactions
  • This action cannot be undone
// Check for linked transactions before deletion
const { count } = await supabase
  .from("transacciones")
  .select("id", { count: "exact", head: true })
  .eq("billetera_id", walletId)

if (count > 0) {
  throw new Error("Cannot delete wallet with transactions")
}

Real-Time Updates

Wallets automatically refresh when transactions are added, edited, or deleted:
// Broadcast wallet updates
window.dispatchEvent(new CustomEvent("wallets:updated"))

// Listen for updates from other components
window.addEventListener("wallet:changed", handleWalletChanged)

Best Practices

Create wallets for different purposes: personal, business, savings, investments.
Choose clear, concise names that instantly identify the account’s purpose.
Use period filters to review wallet performance monthly or quarterly.
Keep track of exchange rate fluctuations for accurate VES valuations.

Technical Implementation

Wallets are stored in the billeteras table with the following schema:
CREATE TABLE billeteras (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  nombre VARCHAR(13) NOT NULL,
  usuario_id UUID NOT NULL REFERENCES auth.users(id),
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);
Wallet IDs are referenced in the transacciones table via the billetera_id foreign key.

Build docs developers (and LLMs) love