HelmKeep

Balances & Transactions

Note: The balance system is optional. Financial tracking can be enabled or disabled per household in the settings. When disabled, tasks can still be managed without monetary rewards.

How Balances Work

HelmKeep uses a transaction-based ledger system. Every member has a balance that is the sum of all their transactions. The balance is also stored as a materialized field for quick access, and it is kept synchronized with the transaction records.

Balance changes only happen through explicit transactions — task approvals, allowance payments, and manual adjustments — ensuring a complete audit trail.

Earning from Tasks

When a task with a reward amount is approved, the reward is automatically credited to the completing member's balance. This happens atomically — the task approval and balance credit occur in a single transaction to prevent inconsistencies.

Allowances

Allowances are recurring payments made to members on a schedule. Members with the balances.allowance.manage permission can configure allowances for each member. Options include:

  • Weekly: Payment every week
  • Biweekly: Payment every two weeks
  • Monthly: Payment once a month

Each member can have one allowance configuration. The allowance processor runs on a schedule and idempotently credits the correct amount, ensuring no duplicate payments.

Balance Adjustments

Members with the balances.adjust permission can make manual adjustments to any member's balance. Adjustments create a transaction record with a reason, maintaining the full audit trail. Use this for corrections, bonuses, or deductions.

Transaction History

The Balances page shows a complete transaction history for each member. Every entry includes the amount, type (task reward, allowance, adjustment), date, and any associated notes. Members can view their own transaction history; those with the balances.view permission can see all members' histories.

HelmKeep

This documentation covers all features as of the current release. If you have questions or find something missing, please open an issue on GitHub.