Skip to main content

Overview

Wallets in BudgetView help you organize your finances by separating different accounts (e.g., checking, savings, cash). Each wallet tracks its own balance, income, and expenses independently.
Maximum Name Length: Wallet names are limited to 13 characters to ensure they display properly across all devices.

Creating a New Wallet

Follow these steps to create your first wallet:
1

Navigate to Wallets

Go to the Billeteras page from your dashboard sidebar.
2

Click New Wallet

Click the Nueva billetera button in the top-right corner.
The button appears next to “Volver al dashboard” in the header area.
3

Enter Wallet Details

In the dialog that appears:
  • Name: Enter a descriptive name (e.g., “Principal”, “Ahorros”, “Efectivo”)
  • Maximum 13 characters allowed
  • Required field
// Validation in source code
const trimmed = walletName.trim()
if (!trimmed) {
  setFormError("El nombre es obligatorio.")
  return
}
if (trimmed.length > NAME_MAX_LENGTH) {
  setFormError(`El nombre no puede tener más de ${NAME_MAX_LENGTH} caracteres.`)
  return
}
4

Save the Wallet

Click Crear billetera to save. The wallet is created and immediately appears in your list.
The system automatically associates the wallet with your user account via usuario_id.

Understanding Wallet Metrics

Each wallet card displays comprehensive financial metrics:

Balance

Net balance calculated as: Income - ExpensesDisplayed in both USD and VES (using BCV exchange rate)

Status

  • Activa: Wallet has at least one transaction
  • Sin movimientos: No transactions recorded yet

Transaction Counts

Shows breakdown of:
  • Total transactions
  • Positive movements (income)
  • Negative movements (expenses)

Income & Expenses

Separate totals for:
  • Ingresos: All income transactions
  • Gastos: All expense transactions

How Balances are Calculated

The system aggregates all transactions for the selected period:
for (const tx of transactions) {
  if (!tx.billetera_id || !tx.tipo || !tx.fecha_transaccion) continue
  const amount = Number(tx.monto ?? 0)
  if (Number.isNaN(amount)) continue
  const record = aggregates.get(tx.billetera_id)
  if (!record) continue

  if (tx.tipo === "ingreso") {
    record.income += amount
    record.balance += amount
    record.positiveCount += 1
  } else if (tx.tipo === "gasto") {
    record.expense += amount
    record.balance -= amount
    record.negativeCount += 1
  }
  record.transactionCount += 1
  record.status = "Activa"
}

Filtering by Time Period

You can view wallet performance over different time periods:
Shows transactions from the last week, useful for tracking recent spending.
case "7days": {
  const start = new Date(now)
  start.setDate(now.getDate() - 6)
  return { start: startOfDay(start), end: endOfDay(now) }
}

Editing a Wallet

To rename an existing wallet:
1

Find the Wallet

Locate the wallet card in the “Mis billeteras” section.
2

Click Edit

Click the Editar button on the wallet card.
3

Update the Name

Modify the wallet name in the dialog (same 13-character limit applies).
4

Save Changes

Click Guardar cambios to update the wallet.
const { error: updateError } = await supabase
  .from("billeteras")
  .update({ nombre: trimmed })
  .eq("id", editingWalletId)

Deleting a Wallet

Important: You cannot delete a wallet that has associated transactions. Delete all transactions first, or keep the wallet for historical records.
1

Click Delete

Click the Eliminar button on the wallet card.
2

Confirm Deletion

A confirmation dialog appears. Review the wallet name carefully.The system checks for associated transactions:
const { count, error: countError } = await supabase
  .from("transacciones")
  .select("id", { count: "exact", head: true })
  .eq("billetera_id", walletPendingDelete.id)
if (countError) throw countError

if ((count ?? 0) > 0) {
  setDeleteError("No puedes eliminar una billetera con transacciones asociadas.")
  return
}
3

Complete Deletion

If the wallet has no transactions, click Eliminar to permanently delete it.
This action cannot be undone. The wallet is removed from the database immediately.

Currency Conversion (BCV Rate)

All wallets display amounts in both USD and VES:
  • Primary currency: USD (stored in database)
  • Secondary display: VES (Bolívares) using the official BCV exchange rate
The BCV rate is fetched automatically:
export async function fetchBcvRate(signal?: AbortSignal): Promise<ExchangeRate | null> {
  try {
    const response = await fetch("https://ve.dolarapi.com/v1/dolares/oficial", {
      signal,
      cache: "no-store",
    })
    const data = await response.json()
    const average = typeof data?.promedio === "number" ? data.promedio : Number(data?.promedio)
    return { currency: "VES", rate: average }
  } catch (error) {
    console.error("Error fetching BCV rate", error)
    return null
  }
}
The BCV rate updates automatically. If the rate is unavailable, only USD amounts display.

Summary Dashboard Cards

The top of the Wallets page shows three key metrics:

Balance Total

Sum of all wallet balances across your account.Color: Green (emerald)

Total Billeteras

Count of all wallets you’ve created.Color: Blue

Movimientos

Breakdown of positive vs. negative transactions.Format: {positive} positivas · {negative} negativasColor: Purple

Best Practices

Keep wallet names under 13 characters for optimal display. Examples:
  • ✅ “Principal”
  • ✅ “Ahorros”
  • ✅ “Efectivo”
  • ❌ “Cuenta bancaria personal principal”
Create separate wallets for different financial accounts:
  • Checking account
  • Savings account
  • Cash on hand
  • Credit card (track as negative balance)
Use the period filters to:
  • Review last 7 days for recent spending
  • Check “This Month” for current budget tracking
  • Analyze “Last Month” for monthly financial summaries
If you close an account, consider keeping the wallet for historical transaction records rather than deleting it.

Troubleshooting

Possible causes:
  • Name is empty or only whitespace
  • Name exceeds 13 characters
  • Not logged in (session expired)
Solution: Check that your name is 1-13 characters and try again. If the issue persists, refresh the page to restore your session.
Cause: The wallet has associated transactions.Solution:
  1. Navigate to Transacciones
  2. Delete all transactions linked to this wallet
  3. Return to Billeteras and try deleting again
Alternatively, keep the wallet for historical records.
Cause: The external BCV API may be temporarily unavailable.Impact: You’ll only see USD amounts until the rate becomes available again.Solution: The system automatically retries. VES amounts will appear once the API responds.
Possible causes:
  • Wrong period filter selected
  • Transactions recorded in a different wallet
  • Recent transaction not yet saved
Solution:
  1. Check the period filter (try “This Month” or “Last 7 Days”)
  2. Verify transactions are assigned to the correct wallet
  3. Refresh the page to reload all data

Tracking Transactions

Learn how to record income and expenses for each wallet

Setting Budgets

Create spending limits by category across all wallets

Currency Conversion

Understand how USD/VES conversion works

Exporting Data

Export wallet data to CSV, JSON, or PDF formats

Build docs developers (and LLMs) love