p0-recurring-transactions

drafttype/backlog

p0 — Recurring transactions

Problem

Monthly bills (PLN electricity, internet, subscriptions) require manual entry every month. Easy to forget; throws off month-to-month comparisons when one cycle slips.

Outcome

Mark a transaction as recurring with a cadence (monthly / weekly / custom) and auto-generate the next occurrence on its due date. Allow editing or skipping a single occurrence without breaking the series.

Acceptance

  • Transaction form has a "Recurring" toggle with cadence + end-date (optional)
  • New transactionTemplateModel (already in src/lib/models/!) extended/used as the series record
  • Background job (server action triggered on dashboard load? cron route?) materializes due occurrences as concrete transactionModel rows
  • Editing an occurrence does not edit the series; explicit "edit series" affordance
  • Skip one / pause series / end series controls

Open questions

  • Materialization trigger: lazy on-read vs. eager via a scheduled API route hit by an external cron? Lazy is simpler but harder to reason about for dashboards; eager needs ops (Vercel cron or external).
  • Interaction with offline outbox — auto-generated rows must not double-create if the device was offline at the cadence boundary.

Implications

If skipped

  • Monthly bills stay manual (PLN, internet, subscriptions). Missed months skew category totals and month-over-month comparisons; you keep paying the cognitive tax of re-entering the same rows or reconciling in a spreadsheet.

Why this priority

  • p0 — recurring spend is a large share of personal cash flow. Automating series materialization is a table-stakes finance feature that directly affects data quality on the dashboard and home page; deferring it leaves a visible gap in “track everything here.”

When shipped

  • Predictable bills appear on schedule; one-off edits to a single occurrence do not break the series.

Source

docs/todo.md — High Priority › Transaction Management. Estimated 4-6h there.