[GH-ISSUE #2994] [Feature] Age of Money Report #26993

Closed
opened 2026-04-18 03:24:18 -05:00 by GiteaMirror · 2 comments
Owner

Originally created by @samwightt on GitHub (Jul 7, 2024).
Original GitHub issue: https://github.com/actualbudget/actual/issues/2994

Verified feature request does not already exist?

  • I have searched and found no existing issue

💻

  • Would you like to implement this feature?

Pitch: what problem are you trying to solve?

In YNAB, there is a report called "Age of Money". This metric shows the age of the money you spend, ie. the difference between when the dollars arrived into your budget vs when you spent them. The Age of Money metric makes it easier to follow Rule 4 of YNAB, Age Your Money, which encourages you to live on last month's income.

This metric is very useful to YNAB users and isn't supported in Actual currently. This feature could be implemented as a report (similar to the monthly spending report) that shows the user's Age of Money over time.

How Age of Money works

From the best that I can figure out, Age of Money works like the below.

At a high level, the metric is calculated like this:

  1. Take the last ten transactions in the For Budget section with outflow. Exclude all income and transfers.
  2. Calculate the age of the money spent for each transaction in days.
  3. Average those transactions together.

This gives you the current age of money in days. To calculate the historical age of money, do this over a sliding 10-transaction window.

But how do you calculate the age of the money spent in a transaction? Doing so is a little complicated to explain, but not too difficult to implement:

  1. Get all of the transactions in the For Budget section that have income.
  2. Turn each transaction into a 'bucket'. The bucket's amount is the amount of the transaction. It's date is its transaction date.
  3. Sort the list of buckets by the date of the inflow, ascending.
  4. Now get all of the transactions with outflow (excluding transfers and income). Sort the transactions by transaction date in ascending order.
  5. Go over each of the transactions. For each of the transactions, do the following:
    1. Get the first bucket in the list of buckets (sorted by date in ascending order).
    2. Take money out of the bucket and add it to the transaction's outflow (moving it towards zero) until either the transaction's outflow is zero or until the bucket's amount is zero. FOR EXAMPLE: if a bucket had $50 and a transaction had -$25 outflow, we would take $25 out of the bucket and add it to the transaction. The transaction's outflow would now be zero ($-25 + $25 = 0) and the bucket would have $25 left. ANOTHER EXAMPLE: if a bucket had $5 and a transaction had -$50 outflow, we would take $5 from the bucket and add it to the transaction. The transaction's outflow would now be -$45 (-$50 + $5 = $-45) and the bucket's amount would now be $0.
    3. If the bucket's amount is zero, remove it from the bucket list.
    4. Continue steps 1, 2, and 3 until the transaction's outflow is zero.
    5. The transaction's age of money is the difference between its transaction date and the date of the bucket it took money from. If it took money from multiple buckets, it's the average differences.

Example:

Say we have an account with these transactions:

  • Transaction 1: Inflow of $10 on January 1st.
  • Transaction 2: Outflow of $5 on January 3rd.
  • Transaction 3: Inflow of $20 on January 4th.
  • Transaction 4: Outflow of $5 on January 5th.
  • Transaction 5: Outflow of $10 on January 5th.

We start by turning each inflow into a bucket:

  • Bucket 1: Amount is $10, date is January 1st.
  • Bucket 2: Amount is $20, date is January 4th.

Then we go over each transaction in chronological order:

  • Transaction 2: Outflow of $5.
    • This subtracts $5 from Bucket 1. Bucket 1's new amount is $5.
    • The age of this transaction is therefore 2 days (January 3rd - January 1st = 2 days)
  • Transaction 4: Outflow of $5.
    • This subtracts $5 from Bucket 1. Bucket 1 now has no money in it and is removed from the bucket list.
    • The age of this transaction is therefore 4 days (January 5th - January 1st = 4 days)
  • Transaction 5: Outflow of $10 on January 5th.
    • This subtracts $10 from Bucket 2. Bucket 2 now has $10 left in it.
    • The age of this transaction is 1 day (January 5th - January 4th = 1 day).

Our age of money is therefore 2.3 days ((1 + 4 + 2) / 3).

Displaying Age of Money

YNAB shows the age of money in the desktop app as a single number like this:

image

It shows Age of Money in the mobile apps as a graph over time. This would probably be easier to do in Actual.

image

Describe your ideal solution to this problem

Ideally this would be implemented as a new report in Actual, similar to the spending report. This would show the Age of Money of all the user's transactions over time. This could be displayed on a graph similar to the graph in the YNAB mobile apps.

It seems like YNAB's mobile apps display only one data point per month, so we could show the average days of money for the month (or possibly the age of money of the last 10 transactions in the month). Some experimenting might need to be done to determine which grouping is most useful, as the age of money might change daily.

Teaching and learning

This feature should be just as discoverable as other reports like the monthly spending report or the cash flow report. A short explanation at the bottom of the graph on the report page should explain what Age of Money does.

YNAB has lots of useful documentation on Age of Money, including a video on Rule 4. We could link to these resources to help explain what the report does.

Originally created by @samwightt on GitHub (Jul 7, 2024). Original GitHub issue: https://github.com/actualbudget/actual/issues/2994 ### Verified feature request does not already exist? - [X] I have searched and found no existing issue ### 💻 - [ ] Would you like to implement this feature? ### Pitch: what problem are you trying to solve? In YNAB, there is a report called "Age of Money". This metric shows the age of the money you spend, ie. the difference between when the dollars arrived into your budget vs when you spent them. The Age of Money metric makes it easier to follow [Rule 4 of YNAB, Age Your Money](https://www.ynab.com/guide/stop-living-paycheck-to-paycheck#chapter-six), which encourages you to live on last month's income. This metric is very useful to YNAB users and isn't supported in Actual currently. This feature could be implemented as a report (similar to the monthly spending report) that shows the user's Age of Money over time. ### How Age of Money works From the best that I can figure out, Age of Money works like the below. At a high level, the metric is calculated like this: 1. Take the last ten transactions in the For Budget section with outflow. **Exclude all income and transfers**. 2. Calculate the age of the money spent for each transaction in days. 3. Average those transactions together. This gives you the current age of money in days. To calculate the historical age of money, do this over a sliding 10-transaction window. But how do you calculate the age of the money spent in a transaction? Doing so is a little complicated to explain, but not too difficult to implement: 1. Get all of the transactions in the For Budget section that have income. 2. Turn each transaction into a 'bucket'. The bucket's amount is the amount of the transaction. It's date is its transaction date. 3. Sort the list of buckets by the date of the inflow, ascending. 4. Now get all of the transactions with outflow (excluding transfers and income). Sort the transactions by transaction date in ascending order. 5. Go over each of the transactions. For each of the transactions, do the following: 1. Get the first bucket in the list of buckets (sorted by date in ascending order). 2. Take money out of the bucket and add it to the transaction's outflow (moving it towards zero) until either the transaction's outflow is zero or until the bucket's amount is zero. FOR EXAMPLE: if a bucket had $50 and a transaction had -$25 outflow, we would take $25 out of the bucket and add it to the transaction. The transaction's outflow would now be zero ($-25 + $25 = 0) and the bucket would have $25 left. ANOTHER EXAMPLE: if a bucket had $5 and a transaction had -$50 outflow, we would take $5 from the bucket and add it to the transaction. The transaction's outflow would now be -$45 (-$50 + $5 = $-45) and the bucket's amount would now be $0. 3. If the bucket's amount is zero, remove it from the bucket list. 4. Continue steps 1, 2, and 3 until the transaction's outflow is zero. 5. The transaction's age of money is the difference between its transaction date and the date of the bucket it took money from. If it took money from multiple buckets, it's the average differences. #### Example: Say we have an account with these transactions: - Transaction 1: Inflow of $10 on January 1st. - Transaction 2: Outflow of $5 on January 3rd. - Transaction 3: Inflow of $20 on January 4th. - Transaction 4: Outflow of $5 on January 5th. - Transaction 5: Outflow of $10 on January 5th. We start by turning each inflow into a bucket: - Bucket 1: Amount is $10, date is January 1st. - Bucket 2: Amount is $20, date is January 4th. Then we go over each transaction in chronological order: - Transaction 2: Outflow of $5. - This subtracts $5 from Bucket 1. Bucket 1's new amount is $5. - The age of this transaction is therefore 2 days (January 3rd - January 1st = 2 days) - Transaction 4: Outflow of $5. - This subtracts $5 from Bucket 1. Bucket 1 now has no money in it and is removed from the bucket list. - The age of this transaction is therefore 4 days (January 5th - January 1st = 4 days) - Transaction 5: Outflow of $10 on January 5th. - This subtracts $10 from Bucket 2. Bucket 2 now has $10 left in it. - The age of this transaction is 1 day (January 5th - January 4th = 1 day). Our age of money is therefore 2.3 days ((1 + 4 + 2) / 3). ### Displaying Age of Money YNAB shows the age of money in the desktop app as a single number like this: <img width="224" alt="image" src="https://github.com/actualbudget/actual/assets/11824150/2cd5c1ff-2526-4136-89d3-15d5551f28f4"> It shows Age of Money in the mobile apps as a graph over time. This would probably be easier to do in Actual. ![image](https://github.com/actualbudget/actual/assets/11824150/537660d5-0bc0-4283-bae9-c414d86c2988) ### Describe your ideal solution to this problem Ideally this would be implemented as a new report in Actual, similar to the spending report. This would show the Age of Money of all the user's transactions over time. This could be displayed on a graph similar to the graph in the YNAB mobile apps. It seems like YNAB's mobile apps display only one data point per month, so we could show the average days of money for the month (or possibly the age of money of the last 10 transactions in the month). Some experimenting might need to be done to determine which grouping is most useful, as the age of money might change daily. ### Teaching and learning This feature should be just as discoverable as other reports like the monthly spending report or the cash flow report. A short explanation at the bottom of the graph on the report page should explain what Age of Money does. YNAB has lots of useful documentation on Age of Money, including [a video on Rule 4](https://www.youtube.com/watch?v=u99rIRnWctE&embeds_referring_euri=https%253A%252F%252Fwww.ynab.com%252F&feature=emb_title). We could link to these resources to help explain what the report does.
GiteaMirror added the reportsfeature labels 2026-04-18 03:24:18 -05:00
Author
Owner

@github-actions[bot] commented on GitHub (Jul 7, 2024):

Thanks for sharing your idea!

This repository uses lodash style issue management for enhancements. That means enhancement issues are automatically closed. This doesn’t mean we don’t accept feature requests, though! We will consider implementing ones that receive many upvotes, and we welcome contributions for any feature requests marked as needing votes (just post a comment first so we can help you make a successful contribution).

The enhancement backlog can be found here: https://github.com/actualbudget/actual/issues?q=label%3A%22needs+votes%22+sort%3Areactions-%2B1-desc+

Don’t forget to upvote the top comment with 👍!

<!-- gh-comment-id:2212302207 --> @github-actions[bot] commented on GitHub (Jul 7, 2024): :sparkles: Thanks for sharing your idea! :sparkles: This repository uses lodash style issue management for enhancements. That means enhancement issues are automatically closed. This doesn’t mean we don’t accept feature requests, though! We will consider implementing ones that receive many upvotes, and we welcome contributions for any feature requests marked as needing votes (just post a comment first so we can help you make a successful contribution). The enhancement backlog can be found here: https://github.com/actualbudget/actual/issues?q=label%3A%22needs+votes%22+sort%3Areactions-%2B1-desc+ Don’t forget to upvote the top comment with 👍! <!-- feature-auto-close-comment -->
Author
Owner

@github-actions[bot] commented on GitHub (Apr 7, 2026):

🎉 This feature has been implemented in #6685 and will be released in the next version. Thanks for sharing your idea! 🎉

<!-- gh-comment-id:4200062150 --> @github-actions[bot] commented on GitHub (Apr 7, 2026): :tada: This feature has been implemented in #6685 and will be released in the next version. Thanks for sharing your idea! :tada: <!-- feature-implemented-comment -->
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#26993