Questions: Recurring Transactions (with reconciliation); Milk, Fuel and Mileage Tracking; and Net Profit Calculation

81 views
Skip to first unread message

Moisés Simón

unread,
Oct 26, 2025, 7:39:04 PM (10 days ago) Oct 26
to Beancount
I'm reaching out for some advice on a few challenges I'm facing with
Beancount. To give some context, I don't have any formal accounting
education—everything I know is self-taught. I suspect many of my issues
stem from that, but I'm eager to learn and improve.

This is the first time I'm tracking my finances seriously, with specific
financial objectives in mind. I was previously using GNUCash, but I
found the UX for budgets and reporting suboptimal for my needs. I really
like the Fava UI in comparison—it's much more intuitive. Here are the
main areas where I'm seeking help:

- Automate recurring transactions (with reconciliation) and forecasting

This is the feature I'm missing most from GNUCash.

In GNUCash, I could set up recurring transactions using a mortgage
formula that automatically calculated principal + interest. When you
opened GNUCash, if a recurring transaction was due, you had the chance
to review and apply it. That way, if something like a phone bill was
higher than expected for some reason, you could modify it before
posting.

My main reason for tracking finances is to forecast: knowing how much
money I'll have at certain points, when I'll reach X amount, or if
there's a month where I need to keep extra in my regular account for
annual payments. How can I achieve something similar in Beancount? Are
there plugins, scripts, or best practices for automating recurring
entries and generating forecasts?

I have tried some of them but I feel they where too complicated or too
simple this is, they just don't have any mechanisim for reconcile
(beancount_periodic.recur/amortize) or the mechanism/setup is too
involved (beanahead).

- Buy milk from farmer.

rigth now I do transactions like:

,----
| 2025-01-01 event "Milk price" "0.6 EUR"
| 2025-01-01 price Milk 0.6 EUR
|
| 2025-02-27 txn "Milk"
| Expenses:Groceries 6 MILK
| Liabilities:Milk
|
| 2025-03-03 txn "Pay Milk January/February"
| Assets:Cash -50.00 EUR
| Liabilities:Milk
`----

But this results in Fava reporting a liability of something like -300 MILK and 170 EUR, which isn't ideal. Of course, I don't want to track my daily milk consumption in detail. I set a price for MILK because I don't want to manually add the @ price every time, like this:

,----
| 2025-02-27 txn "Milk"
| Expenses:Groceries 6 MILK @ 0.6 EUR
| Liabilities:Milk
`----

So, how can I fix this while still keeping track of how much I owe without cluttering reports with commodity quantities I don't care about?

- Keep track of fuel consumpution AND KM/EUR

Similar to the Milk issue but more involved. I have a car that can use
LPG or Gasoline (95 or 98). Rigth now I do:

,----
| 2025-07-27 balance Equity:Hacks:Expenses:Coche:Kilometraje 154043.6 KM
|
| 2025-07-27 * "Fuel"
| time: "06:06:39"
| Expenses:Car:Fuel 15.91 LPG @@ 15.58 EUR
| Expenses:Car:Fuel 12.43 G95 @@ 20.00 EUR
| Equity:Hacks:Car:Fuel
| Assets:Cash EUR
|
| 2025-07-27 * "LPG: Marino"
| Expenses:Car:Fuel 25.32 LPG @@ 24.03 EUR
| Equity:Hacks:Expenses:Car:Mileage 255 KM @@ 25.32 LPG
| Equity:Hacks:Car:Fuel
| Assets:Cash EUR
`----

This feels too cumbersome, and I'm adding stuff to Equity that probably shouldn't be there. I want to track mileage, add maintenance events for the car, and calculate costs like EUR per KM so I can budget for long trips. What's a cleaner way to handle this in Beancount without hacks?

- Net Profit Liabilities and Expenses

I have a mortgage on my main house (it's my only one and not an investment).

As far as I can tell, net profit is calculated without accounting for principal payments on the mortgage because those are treated as Liabilities, not Expenses. This doesn't make much sense for personal finance tracking. How can I adjust this? Or, alternatively, how can I calculate what money I really have available (Income - Expenses - Payments on Liabilities)?

Thank you in advance for any insights, examples, or resources you can share. I'm happy to provide more details if needed.

redst...@gmail.com

unread,
Oct 27, 2025, 5:05:09 AM (10 days ago) Oct 27
to Beancount

Hi,
I don’t use forecasting myself, and there are probably plugins and scripts other uses, but here are some quick answers outside that.

In GNUCash, I could set up recurring transactions using a mortgage
formula that automatically calculated principal + interest. When you

Here’s the trivial script I use. When importing from your bank, manually replace your mortgage transaction with the output of this script. Or automate it if you have fancy importers setup.

  • Buy milk from farmer.

Simplified:

2025-03-03 txn "Pay Milk January/February" Assets:Csah -50 EUR Expenses:Groceries:Milk

Or if expense spreading matters, I use my plugin:

2025-03-03 txn "Pay Milk January/February" Assets:Csah -50 EUR Expenses:Groceries:Milk 25 EUR effective_date: 2025-01-01 Expenses:Groceries:Milk 25 EUR effective_date: 2025-02-01

I have a car that can use LPG or Gasoline (95 or 98). Rigth now I do:

Use metadata:

2024-06-01 * "Gasoline" odometer: 66,324 gallons: 11.567 Liabilities:Credit-Cards:Credit-Card -50 USD Expenses:Car:Koeninsegg:Fuel

You can then write a simple plugin to compute fuel efficiency and such. I use it for oil changes as well.

  • Net Profit Liabilities and Expenses I have a mortgage on my main house (it’s my only
    one and not an investment).

As far as I can tell, net profit is calculated without accounting for principal
payments on the mortgage because those are treated as Liabilities, not Expenses. This
doesn’t make much sense for personal finance tracking. How can I adjust this? Or,
alternatively, how can I calculate what money I really have available (Income -
Expenses - Payments on Liabilities)?

Payments are typically booked as such:

2025-10-12 * "Mortgage Payment" Assets:Banks: -1000 USD Expenses:House:Mortgage:Interest 800 USD Liabilities:Mortgage 200 USD

So money flows from Assets:Bank to Liabilities:Mortgage and Expenses:Interest. There’s nothing you should have to do: your net profit and net worth should all compute correctly as expected.

Alan H

unread,
Oct 27, 2025, 10:23:45 PM (9 days ago) Oct 27
to Beancount
Red's answer is straight forward and clear so I certainly won't cover any duplicate ground.

For tracking recurring and reconciliation I use a (modified) beancount_periodic plugin that posts computed transactions for mortgages with the flag as '"#" not "*" then to reconcile, in fava I open the transaction and change the flag, then I  roll the base month of the original computing posting forwards one month. This is simple and low effort. The trick is that my plugin computes the postings from metadata and balances so there isn't an issue with the recurring transaction 'hardcoding' anything that is in error.

NOTE I am the lender in this example ...

; set a value for zyx_loan_rate
2025-01-01 event xyz_loan_rate "0.095"
; Compute interested automatically
2025-01-01 # "Interest Charges [MONTHLY]"
bal_acc_loan: "Assets:Loans:Secured:XYZ-CA"
event_int_rate: "xyz_loan_rate"
expr_i: "R(div(mul(gcu(loan,'CAD'),int_rate),12),2)"
;
Income:Loans:Secured:XYZ-CA 0 CAD
expr: "-i"
Assets:Loans:Secured:XYZ-CA 0 CAD
expr: "i"

There's another recurring transaction that records the payment by the beneficiary and everything tracks itself quite nicely - statements are a simple query, etc.

The plugin is a little rough (the computation is done by creating a dict context with the noted events and balances referenced in the metadata that is passed to an eval) but it works for me.

Alan

Marcus Read

unread,
Oct 28, 2025, 12:00:04 PM (8 days ago) Oct 28
to bean...@googlegroups.com
Hi Moisés

I would have suggested beanahead for regular transactions, forecasting and reconciliation - although note you seem to have come across it already. As the author I'd be interested to know why you thought it was too involved and I'd certainly welcome any suggestions.

Cheers
Marcus

--
You received this message because you are subscribed to the Google Groups "Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email to beancount+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/beancount/59517c6b-8041-4e4e-8e1c-7a7177c3e80cn%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages