[GH-ISSUE #1919] [Feedback]: Sankey Chart #49859

Open
opened 2026-04-30 11:49:09 -05:00 by GiteaMirror · 48 comments
Owner

Originally created by @shaankhosla on GitHub (Nov 16, 2023).
Original GitHub issue: https://github.com/actualbudget/actual/issues/1919

The Sankey chart in Actual Budget has been requested multiple times in the last couple of years and was re-released as an experimental feature in version 2026.5.0.

Please see this comment below for an overview of currently known bugs and requests for enhancements due to be implemented.

Feel free to add any feedback, bug reports or ideas for improvements.

Originally created by @shaankhosla on GitHub (Nov 16, 2023). Original GitHub issue: https://github.com/actualbudget/actual/issues/1919 The Sankey chart in Actual Budget has been requested multiple times in the last couple of years and was re-released as an experimental feature in version 2026.5.0. Please see [this comment](https://github.com/actualbudget/actual/issues/1919#issuecomment-4346791900) below for an overview of currently known bugs and requests for enhancements due to be implemented. Feel free to add any feedback, bug reports or ideas for improvements.
GiteaMirror added the feedbackexperimental feature labels 2026-04-30 11:49:14 -05:00
Author
Owner

@carkom commented on GitHub (Nov 17, 2023):

This is a cool graph, I love the idea!

It needs to add theme colors and privacy blocks to enable those features for this chart. Needs done on chart page as well as overview card. Cheers!

<!-- gh-comment-id:1816153857 --> @carkom commented on GitHub (Nov 17, 2023): This is a cool graph, I love the idea! It needs to add theme colors and privacy blocks to enable those features for this chart. Needs done on chart page as well as overview card. Cheers!
Author
Owner

@shaankhosla commented on GitHub (Nov 17, 2023):

Great points, agreed. I'll add those above.

<!-- gh-comment-id:1816475463 --> @shaankhosla commented on GitHub (Nov 17, 2023): Great points, agreed. I'll add those above.
Author
Owner

@Redbox3070 commented on GitHub (Nov 18, 2023):

Sick chart!
I would like to have percentage % on Budget instead of the absolute value in labels. Absolute value could be shown on hover.
I think the choice of displaying <1k was due to space constraints but is not that useful if most of your categories are below 1k. This one is a great example of more meaningful labels https://i.redd.it/x4xib51xxsv21.png

  • my largest payee is not displayed
    sankey
<!-- gh-comment-id:1817462968 --> @Redbox3070 commented on GitHub (Nov 18, 2023): Sick chart! I would like to have percentage % on Budget instead of the absolute value in labels. Absolute value could be shown on hover. I think the choice of displaying <1k was due to space constraints but is not that useful if most of your categories are below 1k. This one is a great example of more meaningful labels https://i.redd.it/x4xib51xxsv21.png * my largest payee is not displayed ![sankey](https://github.com/actualbudget/actual/assets/81518984/51bbf90c-991a-4fa2-949c-6186dfa8af95)
Author
Owner

@Akellade commented on GitHub (Nov 21, 2023):

It would be neat if there was a bit more control of the level of detail shown, For instance toggling showing the final categories
right now it's shown as :
Income categories > Budget > Outgoing Groups > Outgoing categories.
It's quite a good graph for hiding the outgoing categories or even income categories to just show how the budget was used at a higher level.

<!-- gh-comment-id:1820749941 --> @Akellade commented on GitHub (Nov 21, 2023): It would be neat if there was a bit more control of the level of detail shown, For instance toggling showing the final categories right now it's shown as : Income categories > Budget > Outgoing Groups > Outgoing categories. It's quite a good graph for hiding the outgoing categories or even income categories to just show how the budget was used at a higher level.
Author
Owner

@MatissJanis commented on GitHub (Nov 27, 2023):

Nice to haves:

  • add "unspent income" (for the lack of better naming) - a category group that captures the result of "income - expenses"; for example: I "hold for next month" a part of my income - currently this amount does not show up in the sankey graph
  • ability to show/hide the categories - leaving only the category group level visible (but maybe this won't be as pressing if we have grouping of small amounts under "other")
<!-- gh-comment-id:1828502076 --> @MatissJanis commented on GitHub (Nov 27, 2023): Nice to haves: - [ ] add "unspent income" (for the lack of better naming) - a category group that captures the result of "income - expenses"; for example: I "hold for next month" a part of my income - currently this amount does not show up in the sankey graph - [ ] ability to show/hide the categories - leaving only the category group level visible (but maybe this won't be as pressing if we have grouping of small amounts under "other")
Author
Owner

@MatissJanis commented on GitHub (Nov 27, 2023):

Bug (possibly applicable to other reports too):

payees not showing up when filtering

https://github.com/actualbudget/actual/assets/886567/6ccd29c5-a7f0-47d9-9475-a1def6b8d32a

<!-- gh-comment-id:1828505124 --> @MatissJanis commented on GitHub (Nov 27, 2023): Bug (possibly applicable to other reports too): payees not showing up when filtering https://github.com/actualbudget/actual/assets/886567/6ccd29c5-a7f0-47d9-9475-a1def6b8d32a
Author
Owner

@Teprifer commented on GitHub (Dec 2, 2023):

Looks nifty, thanks for working on this.

My 2 cents:
Bigger font for the labels, both category/sources and for the actual amount
Percentages beside label(or amount)

image

I notice the right side of budget the output doesn't extend the full way down, is this money added to the budget but not spent? If so I'd create a ghost category or a label to indicate this, as otherwise it looks like something is missing.
Ditto for indicating un-budgeted funds.

<!-- gh-comment-id:1837266571 --> @Teprifer commented on GitHub (Dec 2, 2023): Looks nifty, thanks for working on this. My 2 cents: Bigger font for the labels, both category/sources and for the actual amount Percentages beside label(or amount) ![image](https://github.com/actualbudget/actual/assets/34882928/2ec2eadd-1d5a-4155-addb-07065bac0335) I notice the right side of budget the output doesn't extend the full way down, is this money added to the budget but not spent? If so I'd create a ghost category or a label to indicate this, as otherwise it looks like something is missing. Ditto for indicating un-budgeted funds.
Author
Owner

@Teprifer commented on GitHub (Dec 3, 2023):

Feature request, option to end the graph at Category Group level. This will allow better scaling and a nice high level view.

<!-- gh-comment-id:1837313974 --> @Teprifer commented on GitHub (Dec 3, 2023): Feature request, option to end the graph at Category Group level. This will allow better scaling and a nice high level view.
Author
Owner

@leouzz commented on GitHub (Jan 5, 2024):

All the incoms should flow insider a container "income". Then incombe + residual budget (previous periodo) = budget... Then add 1 output "remaining budget" (not spent)

<!-- gh-comment-id:1879005160 --> @leouzz commented on GitHub (Jan 5, 2024): All the incoms should flow insider a container "income". Then incombe + residual budget (previous periodo) = budget... Then add 1 output "remaining budget" (not spent)
Author
Owner

@MatissJanis commented on GitHub (Jan 20, 2024):

@shaankhosla what's the plan with the sankey graph? If we can't get it in as a stable feature I'd be inclined to cut it. Experimental features aren't meant to live around forever.

<!-- gh-comment-id:1902247523 --> @MatissJanis commented on GitHub (Jan 20, 2024): @shaankhosla what's the plan with the sankey graph? If we can't get it in as a stable feature I'd be inclined to cut it. Experimental features aren't meant to live around forever.
Author
Owner

@youngcw commented on GitHub (Jan 21, 2024):

I think the only thing that needs an update would be the dark mode colors. Everything else seems to be just nice to have additions.

<!-- gh-comment-id:1902468971 --> @youngcw commented on GitHub (Jan 21, 2024): I think the only thing that needs an update would be the dark mode colors. Everything else seems to be just nice to have additions.
Author
Owner

@shaankhosla commented on GitHub (Jan 22, 2024):

Yep I agree, theme colors and the privacy blocks are critical. I'll work on adding those.

<!-- gh-comment-id:1904242104 --> @shaankhosla commented on GitHub (Jan 22, 2024): Yep I agree, theme colors and the privacy blocks are critical. I'll work on adding those.
Author
Owner

@egelmex commented on GitHub (Jan 23, 2024):

Enjoying the sankey report, it's really handy to see if my catagories are roughly sane, if one gets too big like I am throwing things in general I can see at a glance that it might need splitting. Came here to say privacy bloicks are not working, but looks like that's already known. Wanted to show off the feature but not the values .

<!-- gh-comment-id:1905832542 --> @egelmex commented on GitHub (Jan 23, 2024): Enjoying the sankey report, it's really handy to see if my catagories are roughly sane, if one gets too big like I am throwing things in general I can see at a glance that it might need splitting. Came here to say privacy bloicks are not working, but looks like that's already known. Wanted to show off the feature but not the values .
Author
Owner

@Redbox3070 commented on GitHub (Jan 25, 2024):

I have an issue, the income from my employer (payee "employer inc") goes to 2 different accounts ("account a", "account b") every month. Unfortunately on the sankey it only shows income that flows to "account b". My workaround is to set 2 different payees.

my largest payee is not displayed
sankey

I also believe that showing "<1k" makes the category breakdown cluttered and meaningless. The easiest solution would be to add decimal, "0.9k" uses the same space but is way more meaningful. Percentages would work well too.

<!-- gh-comment-id:1909672907 --> @Redbox3070 commented on GitHub (Jan 25, 2024): I have an issue, the income from my employer (payee "employer inc") goes to 2 different accounts ("account a", "account b") every month. Unfortunately on the sankey it only shows income that flows to "account b". My workaround is to set 2 different payees. > my largest payee is not displayed > ![sankey](https://private-user-images.githubusercontent.com/81518984/283991640-51bbf90c-991a-4fa2-949c-6186dfa8af95.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDYxNzE1OTUsIm5iZiI6MTcwNjE3MTI5NSwicGF0aCI6Ii84MTUxODk4NC8yODM5OTE2NDAtNTFiYmY5MGMtOTkxYS00ZmEyLTk0OWMtNjE4NmRmYThhZjk1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAxMjUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMTI1VDA4MjgxNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVhYWNjYjAxNDQ5YWJhMjdmN2NhMjVlZjA1YjhiNWFiNzljOWFjYzU5MTU2NjU4YTk3MDlhYWE3YjVlZThmODAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.GlQhKljuU_5_VGszYmq4PBHU5VZ5XqadB6seyArAX4k) I also believe that showing "<1k" makes the category breakdown cluttered and meaningless. The easiest solution would be to add decimal, "0.9k" uses the same space but is way more meaningful. Percentages would work well too.
Author
Owner

@jamescostian commented on GitHub (Feb 9, 2024):

Screenshot 2024-02-08 at 9 30 27 PM

I'm wondering if there's a small bug in how the expense categories are sorted. I have 2 expense groups and when it branches off of them to show the individual expense categories in the pic above, they mostly are sorted like "categories from the first group first (sorted by amount descending), then categories from the second group (sorted by amount descending)". However, the top red arrow shows a time when this trend is broken, making it seem like the real rule is "categories are sorted by amount spent, descending, with no care given to group". But looking at my next red arrow, we see 2 more lines that very clearly should be moved up by that logic.

But the bigger concern I have is missing data - I have 15 expense categories, yet the above sankey chart only shows 14. I'm not sure why. The missing category is a bit on the smaller side but there are smaller ones in its same expense group.

After some manual testing, I've found a way to get the 15th category to reveal itself - the final month dropdown cannot be set to this month or the month before, but the one before (December) or earlier, and the initial month dropdown has the same behavior but in reverse (my first entry is in May 2021, I must set the initial date to July 2021 or later). Using these settings allowed me to get this output (the category that was missing is the one the tip of the arrow just barely touches):

Screenshot 2024-02-08 at 9 41 19 PM

You also might notice another interesting artifact in the above screenshot - that previously missing category is actually a bit larger than the category above it. You can see it visually in this screenshot, and the numbers on the far right of the sankey chart confirm it. Yet, it is somehow sorted to be lower. Not sure how relevant this is, but fwiw, there are a non-trivial amount of deposits in that category in addition to expenses in it - perhaps it's getting confused there?

<!-- gh-comment-id:1935306080 --> @jamescostian commented on GitHub (Feb 9, 2024): <img width="242" alt="Screenshot 2024-02-08 at 9 30 27 PM" src="https://github.com/actualbudget/actual/assets/1456118/4b0b4ba8-e7c2-43e4-928b-7a1b3db8e15e"> I'm wondering if there's a small bug in how the expense categories are sorted. I have 2 expense groups and when it branches off of them to show the individual expense categories in the pic above, they mostly are sorted like "categories from the first group first (sorted by amount descending), then categories from the second group (sorted by amount descending)". However, the top red arrow shows a time when this trend is broken, making it seem like the real rule is "categories are sorted by amount spent, descending, with no care given to group". But looking at my next red arrow, we see 2 more lines that very clearly should be moved up by that logic. But the bigger concern I have is **missing data** - I have 15 expense categories, yet the above sankey chart only shows 14. I'm not sure why. The missing category is a bit on the smaller side but there are smaller ones in its same expense group. After some manual testing, I've found a way to get the 15th category to reveal itself - the final month dropdown cannot be set to this month or the month before, but the one before (December) or earlier, **and** the initial month dropdown has the same behavior but in reverse (my first entry is in May 2021, I must set the initial date to July 2021 or later). Using these settings allowed me to get this output (the category that was missing is the one the tip of the arrow just barely touches): <img width="167" alt="Screenshot 2024-02-08 at 9 41 19 PM" src="https://github.com/actualbudget/actual/assets/1456118/42c69826-bb0b-4cbe-bd12-9c852216b649"> You also might notice another interesting artifact in the above screenshot - that previously missing category is actually a bit _larger_ than the category above it. You can see it visually in this screenshot, and the numbers on the far right of the sankey chart confirm it. Yet, it is somehow sorted to be lower. Not sure how relevant this is, but fwiw, there are a non-trivial amount of deposits in that category in addition to expenses in it - perhaps it's getting confused there?
Author
Owner

@niko123456000 commented on GitHub (Feb 16, 2024):

I would like all the "income" to come from the Income category, instead of from the Payee. The reason is because my payee names are often different and it's a hassle trying to standardise the payee name of deposits just so it appears properly in the Sankey diagram. I think using the Category is a better way. Does anyone agree or have another suggestion?

<!-- gh-comment-id:1947956884 --> @niko123456000 commented on GitHub (Feb 16, 2024): I would like all the "income" to come from the Income *category*, instead of from the Payee. The reason is because my payee names are often different and it's a hassle trying to standardise the payee name of deposits just so it appears properly in the Sankey diagram. I think using the Category is a better way. Does anyone agree or have another suggestion?
Author
Owner

@Teprifer commented on GitHub (Feb 16, 2024):

I would like all the "income" to come from the Income category, instead of from the Payee. The reason is because my payee names are often different and it's a hassle trying to standardise the payee name of deposits just so it appears properly in the Sankey diagram. I think using the Category is a better way. Does anyone agree or have another suggestion?

I think it's a good idea, but needing to keep in mind some people may want to know the proportion of their income sources. Maybe a 'group income sources' toggle?

/ed/ Actually in hindsight for my comment, it doesn't make sense they aren't grouped by category in the first place given the rest is by category. If people want to represent different sources, they likely already have different categories.

<!-- gh-comment-id:1947976529 --> @Teprifer commented on GitHub (Feb 16, 2024): > I would like all the "income" to come from the Income _category_, instead of from the Payee. The reason is because my payee names are often different and it's a hassle trying to standardise the payee name of deposits just so it appears properly in the Sankey diagram. I think using the Category is a better way. Does anyone agree or have another suggestion? ~I think it's a good idea, but needing to keep in mind some people may want to know the proportion of their income sources. Maybe a 'group income sources' toggle?~ /ed/ Actually in hindsight for my comment, it doesn't make sense they aren't grouped by category in the first place given the rest is by category. If people want to represent different sources, they likely already have different categories.
Author
Owner

@MatissJanis commented on GitHub (Feb 25, 2024):

👋 This feature hasn't been worked on in a very long time. As per the new experimental feature flag policy - we'll be removing it soon unless someone picks it up again.

<!-- gh-comment-id:1962992699 --> @MatissJanis commented on GitHub (Feb 25, 2024): 👋 This feature hasn't been worked on in a very long time. As per the new [experimental feature flag policy](https://actualbudget.org/docs/contributing/project-details/feature-flags) - we'll be removing it soon unless someone picks it up again.
Author
Owner

@sandu-c commented on GitHub (Apr 7, 2024):

👋 This feature hasn't been worked on in a very long time. As per the new experimental feature flag policy - we'll be removing it soon unless someone picks it up again.

very sorry to hear that, this was an awesome report chart

<!-- gh-comment-id:2041462385 --> @sandu-c commented on GitHub (Apr 7, 2024): > 👋 This feature hasn't been worked on in a very long time. As per the new [experimental feature flag policy](https://actualbudget.org/docs/contributing/project-details/feature-flags) - we'll be removing it soon unless someone picks it up again. very sorry to hear that, this was an awesome report chart
Author
Owner

@SamRodkey commented on GitHub (Jun 1, 2024):

I miss this feature! I feel like it was the first report that actually helped me get a handle on the big picture!

<!-- gh-comment-id:2143464422 --> @SamRodkey commented on GitHub (Jun 1, 2024): I miss this feature! I feel like it was the first report that actually helped me get a handle on the big picture!
Author
Owner

@aChrisYouKnow commented on GitHub (Jun 3, 2024):

Fingers crossed someone can bring it back

<!-- gh-comment-id:2144203581 --> @aChrisYouKnow commented on GitHub (Jun 3, 2024): Fingers crossed someone can bring it back
Author
Owner

@Treawlony commented on GitHub (Nov 26, 2024):

For what it worth, I'd like to bump it too.

<!-- gh-comment-id:2501865261 --> @Treawlony commented on GitHub (Nov 26, 2024): For what it worth, I'd like to bump it too.
Author
Owner

@CrO2Cl2 commented on GitHub (Dec 8, 2024):

Bumping this feature up, this is such a great chart

<!-- gh-comment-id:2525747647 --> @CrO2Cl2 commented on GitHub (Dec 8, 2024): Bumping this feature up, this is such a great chart
Author
Owner

@dkhalife commented on GitHub (Dec 12, 2024):

I'm ramping up on the codebase and a big fan of this type of chart. I intend to reimplement this feature once I've learned enough about the codebase

<!-- gh-comment-id:2537756135 --> @dkhalife commented on GitHub (Dec 12, 2024): I'm ramping up on the codebase and a big fan of this type of chart. I intend to reimplement this feature once I've learned enough about the codebase
Author
Owner

@matt-fidd commented on GitHub (Apr 8, 2026):

@emiltb just in case you weren't following this issue already :)

it would be great if I could filter like normal, eg to take out transactions with certain tags, or from certain payees.

<!-- gh-comment-id:4203372249 --> @matt-fidd commented on GitHub (Apr 8, 2026): @emiltb just in case you weren't following this issue already :) it would be great if I could filter like normal, eg to take out transactions with certain tags, or from certain payees.
Author
Owner

@emiltb commented on GitHub (Apr 8, 2026):

@emiltb just in case you weren't following this issue already :)

it would be great if I could filter like normal, eg to take out transactions with certain tags, or from certain payees.

@matt-fidd Thank you, I made sure to subscribe to this, when I saw your comment on the PR yesterday.

I agree with regards to filtering transactions. There is a bit thinking that has to go into how to best present it to the user, as the applicable filters for transaction and budget are different, i.e. the budget does not have tags or payees. I removed a lot of filtering options initially, to make the options similar for Spent and Budgeted.

What is the preferred workflow for adapting to comments in here? Should I just make several smaller PRs with improvements, as feedback comes in? Or should I collect things into a larger PR, that we merge towards the end of the month?

<!-- gh-comment-id:4203971774 --> @emiltb commented on GitHub (Apr 8, 2026): > @emiltb just in case you weren't following this issue already :) > > > it would be great if I could filter like normal, eg to take out transactions with certain tags, or from certain payees. @matt-fidd Thank you, I made sure to subscribe to this, when I saw your comment on the PR yesterday. I agree with regards to filtering transactions. There is a bit thinking that has to go into how to best present it to the user, as the applicable filters for transaction and budget are different, i.e. the budget does not have tags or payees. I removed a lot of filtering options initially, to make the options similar for Spent and Budgeted. What is the preferred workflow for adapting to comments in here? Should I just make several smaller PRs with improvements, as feedback comes in? Or should I collect things into a larger PR, that we merge towards the end of the month?
Author
Owner

@matt-fidd commented on GitHub (Apr 8, 2026):

I agree with regards to filtering transactions. There is a bit thinking that has to go into how to best present it to the user, as the applicable filters for transaction and budget are different, i.e. the budget does not have tags or payees. I removed a lot of filtering options initially, to make the options similar for Spent and Budgeted.

What is the preferred workflow for adapting to comments in here? Should I just make several smaller PRs with improvements, as feedback comes in? Or should I collect things into a larger PR, that we merge towards the end of the month?

Makes sense, thanks for your work on this already, it's looking good!

We're easy either way. Smaller PRs are generally easier to review and test, so will get merged faster. Larger PRs move a bit slower, especially towards the end of the month.

<!-- gh-comment-id:4205021389 --> @matt-fidd commented on GitHub (Apr 8, 2026): > I agree with regards to filtering transactions. There is a bit thinking that has to go into how to best present it to the user, as the applicable filters for transaction and budget are different, i.e. the budget does not have tags or payees. I removed a lot of filtering options initially, to make the options similar for Spent and Budgeted. > > What is the preferred workflow for adapting to comments in here? Should I just make several smaller PRs with improvements, as feedback comes in? Or should I collect things into a larger PR, that we merge towards the end of the month? Makes sense, thanks for your work on this already, it's looking good! We're easy either way. Smaller PRs are generally easier to review and test, so will get merged faster. Larger PRs move a bit slower, especially towards the end of the month.
Author
Owner

@JTT900 commented on GitHub (Apr 11, 2026):

Could not find option to show values as percentages and keep absolute values on mouseover as mentioned in an earlier suggestion here.

<!-- gh-comment-id:4228271454 --> @JTT900 commented on GitHub (Apr 11, 2026): Could not find option to show values as percentages and keep absolute values on mouseover as mentioned in an earlier suggestion here.
Author
Owner

@emiltb commented on GitHub (Apr 11, 2026):

Could not find option to show values as percentages and keep absolute values on mouseover as mentioned in an earlier suggestion here.

I could see the usefulness of that. Note that the comment you are referencing is >2 years old from a previous PR.

I think there could be suggestions for more boolean toggles, but don't want to clutter the UI. I'm considering implementing a menu like the Options menu in Custom reports (obviously not the same options, but just to illustrate the concept).

Image

A toggle to view percentages instead of absolute values would fit well into that.

Another suggestion I saw somewhere, was to also include an income layer. If we do that, I think it needs to be implemented in two ways:

  • For the Spent mode, it should show which on-budget accounts that money were spent from, flowing into the 'Spent' node.
  • For the Budgeted mode, it should show which income categories flows into the 'Budgeted' node. There is a bit of trickery involved in getting this right, particularly in handling money held from previous month or for next month, when showing data across more than one month.

However, I think that showing the income layer should also be for the user to toggle. For me personally, 99% of the money i spend come from the same on-budget account, so showing that as part of the graph just takes up unnecessary space

<!-- gh-comment-id:4228947741 --> @emiltb commented on GitHub (Apr 11, 2026): > Could not find option to show values as percentages and keep absolute values on mouseover as mentioned in an earlier suggestion here. I could see the usefulness of that. Note that the comment you are referencing is >2 years old from a previous PR. I think there could be suggestions for more boolean toggles, but don't want to clutter the UI. I'm considering implementing a menu like the Options menu in Custom reports (obviously not the same options, but just to illustrate the concept). <img width="277" height="307" alt="Image" src="https://github.com/user-attachments/assets/488bc6f9-5ad6-4a20-9132-a30151760ece" /> A toggle to view percentages instead of absolute values would fit well into that. Another suggestion I saw somewhere, was to also include an income layer. If we do that, I think it needs to be implemented in two ways: * For the Spent mode, it should show which on-budget accounts that money were spent from, flowing into the 'Spent' node. * For the Budgeted mode, it should show which income categories flows into the 'Budgeted' node. There is a bit of trickery involved in getting this right, particularly in handling money held from previous month or for next month, when showing data across more than one month. However, I think that showing the income layer should also be for the user to toggle. For me personally, 99% of the money i spend come from the same on-budget account, so showing that as part of the graph just takes up unnecessary space
Author
Owner

@expeditus303 commented on GitHub (Apr 15, 2026):

For the Sankey chart to work well, it's essential to visualize the income flow as well.

Not just expenses. Without income as the starting node, the diagram loses much of its value as a cash flow visualization tool.

<!-- gh-comment-id:4254298658 --> @expeditus303 commented on GitHub (Apr 15, 2026): For the Sankey chart to work well, it's essential to visualize the income flow as well. Not just expenses. Without income as the starting node, the diagram loses much of its value as a cash flow visualization tool.
Author
Owner

@emiltb commented on GitHub (Apr 16, 2026):

For the Sankey chart to work well, it's essential to visualize the income flow as well.

Not just expenses. Without income as the starting node, the diagram loses much of its value as a cash flow visualization tool.

@expeditus303 Can you elaborate a bit about how you would like to see it implemented? Your comment is a bit vague in the context of the data available in Actual. I added some thoughts on it in a comment above, but I'm not sure if the suggested approaches are the best, or some other way would be more informative.

<!-- gh-comment-id:4257735299 --> @emiltb commented on GitHub (Apr 16, 2026): > For the Sankey chart to work well, it's essential to visualize the income flow as well. > > Not just expenses. Without income as the starting node, the diagram loses much of its value as a cash flow visualization tool. @expeditus303 Can you elaborate a bit about how you would like to see it implemented? Your comment is a bit vague in the context of the data available in Actual. I added some thoughts on it in a comment above, but I'm not sure if the suggested approaches are the best, or some other way would be more informative.
Author
Owner

@aChrisYouKnow commented on GitHub (Apr 16, 2026):

+1 to @expeditus303's comment on visualizing the income flow. The real value of Sankey charts for personal finance is having enough flexibility to define both the inputs and the outputs are for a given view.

For example, one view might show all income sources (salaries, investment proceeds, other income) flowing into broad buckets like taxes, retirement, healthcare, and discretionary spending, etc. A second chart might take just the discretionary spending bucket as the input (maybe in this case, a category group), and break it down into the individual categories (restaurants, groceries, subscriptions, etc). Or, maybe another chart would go directly from detailed input categories to detailed output categories and skip category groups.

This kind of drill down flexibility, combined with the filtering @matt-fidd mentioned above is what makes the Sankey chart feature super useful. Easy timeframe switching is also important; being able to see how the story changes when looking at last month's data, vs last years, vs all time, etc.

I've been wanting to switch away from Monarch to ActualBudget, but the Sankey charts were the main thing holding me back. Excited to see activity on this issue! Would be happy to test / provide feedback.

<!-- gh-comment-id:4260021429 --> @aChrisYouKnow commented on GitHub (Apr 16, 2026): +1 to @expeditus303's comment on visualizing the income flow. The real value of Sankey charts for personal finance is having enough flexibility to define both the inputs and the outputs are for a given view. For example, one view might show all income sources (salaries, investment proceeds, other income) flowing into broad buckets like taxes, retirement, healthcare, and discretionary spending, etc. A second chart might take just the discretionary spending bucket as the input (maybe in this case, a category group), and break it down into the individual categories (restaurants, groceries, subscriptions, etc). Or, maybe another chart would go directly from detailed input categories to detailed output categories and skip category groups. This kind of drill down flexibility, combined with the filtering @matt-fidd mentioned above is what makes the Sankey chart feature super useful. Easy timeframe switching is also important; being able to see how the story changes when looking at last month's data, vs last years, vs all time, etc. I've been wanting to switch away from Monarch to ActualBudget, but the Sankey charts were the main thing holding me back. Excited to see activity on this issue! Would be happy to test / provide feedback.
Author
Owner

@emiltb commented on GitHub (Apr 16, 2026):

@aChrisYouKnow I agree with many of the points you are making. I'm not sure all the things you mention can be done with how data is structured in Actual, but let's see how close we can come.

The filtering mentioned has already been implemented.

I could imagine allowing the users to select which of four layers they want to see:

  • Income categories
  • Accounts (the on-budget accounts should probably replace the single Spent node in this case)
  • Category groups
  • Categories

For example, one view might show all income sources (salaries, investment proceeds, other income) flowing into broad buckets like taxes, retirement,

Income flows into accounts and out from them, so I'm not sure a view of the flow directly from income category to spent category group makes sense. But that might also not be what you mean.

maybe another chart would go directly from detailed input categories to detailed output categories and skip category groups.

Again, money flows through accounts, so I'm not sure it makes sense to skip that layer.

If you could post some screenshots of examples from the app you mentioned, that would be helpful.

Easy timeframe switching is also important

Are you missing anything in this regard in the current implementation? It has exactly the same period selection options as other reports.

Note that you can view the most recent edition in the deployment preview from the last branch related to this, if you don't have the possibility of spinning up an edge image: https://deploy-preview-7476.demo.actualbudget.org/

Edit: I just had an idea for how to structure the data in order to achieve the flexibility you request. I will try something out in the weekend.

<!-- gh-comment-id:4260953559 --> @emiltb commented on GitHub (Apr 16, 2026): @aChrisYouKnow I agree with many of the points you are making. I'm not sure all the things you mention can be done with how data is structured in Actual, but let's see how close we can come. The filtering mentioned has already been implemented. I could imagine allowing the users to select which of four layers they want to see: - Income categories - Accounts (the on-budget accounts should probably replace the single Spent node in this case) - Category groups - Categories > For example, one view might show all income sources (salaries, investment proceeds, other income) flowing into broad buckets like taxes, retirement, Income flows into accounts and out from them, so I'm not sure a view of the flow directly from income category to spent category group makes sense. But that might also not be what you mean. > maybe another chart would go directly from detailed input categories to detailed output categories and skip category groups. Again, money flows through accounts, so I'm not sure it makes sense to skip that layer. If you could post some screenshots of examples from the app you mentioned, that would be helpful. > Easy timeframe switching is also important Are you missing anything in this regard in the current implementation? It has exactly the same period selection options as other reports. Note that you can view the most recent edition in the deployment preview from the last branch related to this, if you don't have the possibility of spinning up an edge image: https://deploy-preview-7476.demo.actualbudget.org/ Edit: I just had an idea for how to structure the data in order to achieve the flexibility you request. I will try something out in the weekend.
Author
Owner

@aChrisYouKnow commented on GitHub (Apr 16, 2026):

I started drafting this before I caught your updated edit @emiltb, however, here are some examples I put together. I didn't use screenshots from Monarch for privacy reasons, but I had AI generate some arbitrary example data.

Below are four sankey charts. You can paste the text into the 'inputs' box of https://sankeymatic.com/build/ and hit 'show' to visualize them.

The first contains only category groups. Each of these category groups could be subdivided into their individual categories.

Chart 1 Data:


Salary [58000] Annual Income
Other Deposits [1000] Annual Income
Investment income [3000] Annual Income
Side hustle [3000] Annual Income
Bank interest [2000] Annual Income

Annual Income [12300] Taxes
Annual Income [6000] Healthcare
Annual Income [24000] Living Expenses
Annual Income [5200] Retirement
Annual Income [6500] Food and Drink
Annual Income [1600] Shopping
Annual Income [3500] Transportation
Annual Income [1100] Charitable giving
Annual Income [1100] Entertainment
Annual Income [2700] Tech related
Annual Income [3000] Savings


Chart 1 Example output:

Image

The next shows what happens if you plot just the categories that make up Salary.
Chart 2 Data:


Take-home Salary [30500] Salary
Federal Tax [7500] Salary
State Tax [4800] Salary
Social Security [5000] Salary
Medicare [1200] Salary
HSA Contributions [2800] Salary
Retirement Fund [4800] Salary
Benefits [1400] Salary


Chart 2 Example output:

Image

Next is if you show the categories that makes up Transportation
Chart 3 Data:


Transportation [1500] Gas
Transportation [900] Vehicle Lease
Transportation [400] Vehicle Maintenance
Transportation [300] Parking
Transportation [240] Flights
Transportation [160] Tolls


Chart 3 Example output:

Image

These can all be combined into one, but it starts to get messy.
It getting messy is why it is important to be able to choose your inputs and outputs, and use filtering, to only see what you want to see


Chart 4 Data:


// ── Layer 1: Components flowing INTO Salary ──
Take-home Salary [30500] Salary
Federal Tax [7500] Salary
State Tax [4800] Salary
Social Security [5000] Salary
Medicare [1200] Salary
HSA Contributions [2800] Salary
Retirement Fund [4800] Salary
Benefits [1400] Salary

// ── Layer 2: Income sources flowing INTO Annual Income ──
Salary [58000] Annual Income
Other Deposits [1000] Annual Income
Investment income [3000] Annual Income
Side hustle [3000] Annual Income
Bank interest [2000] Annual Income

// ── Layer 3: Category groups flowing OUT of Annual Income ──
Annual Income [12300] Taxes
Annual Income [6000] Healthcare
Annual Income [24000] Living Expenses
Annual Income [5200] Retirement
Annual Income [6500] Food and Drink
Annual Income [1600] Shopping
Annual Income [3500] Transportation
Annual Income [1100] Charitable giving
Annual Income [1100] Entertainment
Annual Income [2700] Tech related
Annual Income [3000] Savings

// ── Layer 4: Transportation splitting into subcategories ──
Transportation [1500] Gas
Transportation [1000] Vehicle Lease
Transportation [500] Vehicle Maintenance
Transportation [300] Parking
Transportation [100] Flights
Transportation [100] Tolls


Chart 4 Example output: Image

Lastly being able to use filters to choose both the input side of the Sankey Chart, as well as the output side, and see if the amounts match up is a great double check of your transaction data. For example, all of the tax withholdings from my paycheck going in, should match all my tax payments plus any refunds on the outgoing side. These data show up in separate places, and should match. Any discrepancy in the input and output data of the Sankey Chart would ideally go into an "other" category that makes it easy to see what dollar amount of imbalance there is.

Let me know if that type of usage makes sense, or if any further examples would be helpful.

Thanks for the tip on the deployment preview option, I wasn't aware of that. I look forward to playing around with that more.

<!-- gh-comment-id:4263176053 --> @aChrisYouKnow commented on GitHub (Apr 16, 2026): I started drafting this before I caught your updated edit @emiltb, however, here are some examples I put together. I didn't use screenshots from Monarch for privacy reasons, but I had AI generate some arbitrary example data. Below are four sankey charts. You can paste the text into the 'inputs' box of https://sankeymatic.com/build/ and hit 'show' to visualize them. The first contains only category groups. Each of these category groups could be subdivided into their individual categories. Chart 1 Data: <hr> Salary [58000] Annual Income Other Deposits [1000] Annual Income Investment income [3000] Annual Income Side hustle [3000] Annual Income Bank interest [2000] Annual Income Annual Income [12300] Taxes Annual Income [6000] Healthcare Annual Income [24000] Living Expenses Annual Income [5200] Retirement Annual Income [6500] Food and Drink Annual Income [1600] Shopping Annual Income [3500] Transportation Annual Income [1100] Charitable giving Annual Income [1100] Entertainment Annual Income [2700] Tech related Annual Income [3000] Savings <hr> Chart 1 Example output: <img width="571" height="556" alt="Image" src="https://github.com/user-attachments/assets/41ea3497-1ebe-4d13-b4f6-768df53a2da2" /> <hr> The next shows what happens if you plot just the categories that make up Salary. Chart 2 Data: <hr> Take-home Salary [30500] Salary Federal Tax [7500] Salary State Tax [4800] Salary Social Security [5000] Salary Medicare [1200] Salary HSA Contributions [2800] Salary Retirement Fund [4800] Salary Benefits [1400] Salary <hr> Chart 2 Example output: <img width="585" height="556" alt="Image" src="https://github.com/user-attachments/assets/15e367a0-946d-4f81-b0b8-b4ffcc5b494c" /> <hr> Next is if you show the categories that makes up Transportation Chart 3 Data: <hr> Transportation [1500] Gas Transportation [900] Vehicle Lease Transportation [400] Vehicle Maintenance Transportation [300] Parking Transportation [240] Flights Transportation [160] Tolls <hr> Chart 3 Example output: <img width="585" height="555" alt="Image" src="https://github.com/user-attachments/assets/6b12ef4e-a8ec-43fb-a191-cf3f6bb91067" /> <hr> These can all be combined into one, but it starts to get messy. It getting messy is why it is important to be able to choose your inputs and outputs, and use filtering, to only see what you want to see <hr> Chart 4 Data: <hr> // ── Layer 1: Components flowing INTO Salary ── Take-home Salary [30500] Salary Federal Tax [7500] Salary State Tax [4800] Salary Social Security [5000] Salary Medicare [1200] Salary HSA Contributions [2800] Salary Retirement Fund [4800] Salary Benefits [1400] Salary // ── Layer 2: Income sources flowing INTO Annual Income ── Salary [58000] Annual Income Other Deposits [1000] Annual Income Investment income [3000] Annual Income Side hustle [3000] Annual Income Bank interest [2000] Annual Income // ── Layer 3: Category groups flowing OUT of Annual Income ── Annual Income [12300] Taxes Annual Income [6000] Healthcare Annual Income [24000] Living Expenses Annual Income [5200] Retirement Annual Income [6500] Food and Drink Annual Income [1600] Shopping Annual Income [3500] Transportation Annual Income [1100] Charitable giving Annual Income [1100] Entertainment Annual Income [2700] Tech related Annual Income [3000] Savings // ── Layer 4: Transportation splitting into subcategories ── Transportation [1500] Gas Transportation [1000] Vehicle Lease Transportation [500] Vehicle Maintenance Transportation [300] Parking Transportation [100] Flights Transportation [100] Tolls <hr> Chart 4 Example output: <img width="582" height="585" alt="Image" src="https://github.com/user-attachments/assets/9f5ed7a0-df50-4ccf-a38b-e1538da53929" /> <hr> Lastly being able to use filters to choose both the input side of the Sankey Chart, as well as the output side, and see if the amounts match up is a great double check of your transaction data. For example, all of the tax withholdings from my paycheck going in, should match all my tax payments plus any refunds on the outgoing side. These data show up in separate places, and should match. Any discrepancy in the input and output data of the Sankey Chart would ideally go into an "other" category that makes it easy to see what dollar amount of imbalance there is. Let me know if that type of usage makes sense, or if any further examples would be helpful. Thanks for the tip on the deployment preview option, I wasn't aware of that. I look forward to playing around with that more.
Author
Owner

@aChrisYouKnow commented on GitHub (Apr 17, 2026):

I should add that SankeyMATIC is open source as well, if anyone wanted to see how that implementation works: https://github.com/nowthis/sankeymatic

<!-- gh-comment-id:4267804701 --> @aChrisYouKnow commented on GitHub (Apr 17, 2026): I should add that SankeyMATIC is open source as well, if anyone wanted to see how that implementation works: https://github.com/nowthis/sankeymatic
Author
Owner

@emiltb commented on GitHub (Apr 17, 2026):

@aChrisYouKnow I see the points you are making. Thanks for the figures, that was helpful for inspiration. I'm working on restructuring the data to make it easier to work with different layers/node types. This should make it easier to include the entire flow from payees/income to categories.

I have something working right now, but it is not quite polished enough yet, to be put online :-)

The 'Spent' view can show the entire flow: Income payees > Income categories > Accounts > Category Groups > Categories.
Image

The 'Budgeted' view similarly shows: Income categories > Available income > Category Groups > Categories. It takes care of any money held from the month prior to the selected range or held for the month after the selected range and any overspent amounts, making sure that all income is accounted for in the graph for the selected period.
Image

Next up is making sure that the user can then select a subset range of levels (i.e. Income categories > Accounts > Category Groups or Category Groups > Categories), to "zoom in" on the part they are interested in. I just need to figure out a good way to do that in the UI.

For example, all of the tax withholdings from my paycheck going in, should match all my tax payments plus any refunds on the outgoing side. These data show up in separate places, and should match. Any discrepancy in the input and output data of the Sankey Chart would ideally go into an "other" category that makes it easy to see what dollar amount of imbalance there is.

Regarding this comment, I don't really think that can be done. As you say, they show up in different places and I don't think the data is available in Actual to match it up automatically. Also - I need to create 'Other' nodes in order to group small categories, otherwise the graph becomes unreadable on when there are too many.

<!-- gh-comment-id:4271668740 --> @emiltb commented on GitHub (Apr 17, 2026): @aChrisYouKnow I see the points you are making. Thanks for the figures, that was helpful for inspiration. I'm working on restructuring the data to make it easier to work with different layers/node types. This should make it easier to include the entire flow from payees/income to categories. I have something working right now, but it is not quite polished enough yet, to be put online :-) The 'Spent' view can show the entire flow: **Income payees > Income categories > Accounts > Category Groups > Categories**. <img width="1335" height="540" alt="Image" src="https://github.com/user-attachments/assets/63c69ab4-dd7b-4ed9-b1c5-7ed47d66b689" /> The 'Budgeted' view similarly shows: **Income categories > Available income > Category Groups > Categories**. It takes care of any money held from the month prior to the selected range or held for the month after the selected range and any overspent amounts, making sure that all income is accounted for in the graph for the selected period. <img width="1334" height="540" alt="Image" src="https://github.com/user-attachments/assets/0380e2de-a56d-4c92-8853-0152a9fdf157" /> Next up is making sure that the user can then select a subset range of levels (i.e. **Income categories > Accounts > Category Groups** or **Category Groups > Categories**), to "zoom in" on the part they are interested in. I just need to figure out a good way to do that in the UI. > For example, all of the tax withholdings from my paycheck going in, should match all my tax payments plus any refunds on the outgoing side. These data show up in separate places, and should match. Any discrepancy in the input and output data of the Sankey Chart would ideally go into an "other" category that makes it easy to see what dollar amount of imbalance there is. Regarding this comment, I don't really think that can be done. As you say, they show up in different places and I don't think the data is available in Actual to match it up automatically. Also - I need to create 'Other' nodes in order to group small categories, otherwise the graph becomes unreadable on when there are too many.
Author
Owner

@emiltb commented on GitHub (Apr 21, 2026):

I have opened a PR #7582 now (still needs to pass CI and other checks before a real review). But it has a deploy preview ready, where you can test the new functionality I have implemented: https://deploy-preview-7582.demo.actualbudget.org/

  • Now includes income payees and income categories
  • Allows the user to select a range of layers to show
  • Better handling of budget-variations (i.e. overspent, overbudgeted, left to budget amounts) as well as money kept from or held for next month.

I would be very happy to receive feedback on this, since it's basically a full rewrite of the underlying datamodel and everything that builds on that.

<!-- gh-comment-id:4292196850 --> @emiltb commented on GitHub (Apr 21, 2026): I have opened a PR #7582 now (still needs to pass CI and other checks before a real review). But it has a deploy preview ready, where you can test the new functionality I have implemented: https://deploy-preview-7582.demo.actualbudget.org/ - Now includes income payees and income categories - Allows the user to select a range of layers to show - Better handling of budget-variations (i.e. overspent, overbudgeted, left to budget amounts) as well as money kept from or held for next month. I would be very happy to receive feedback on this, since it's basically a full rewrite of the underlying datamodel and everything that builds on that.
Author
Owner

@calculuschild commented on GitHub (Apr 21, 2026):

Wild, I came searching for this functionality and see a PR was made literally minutes ago.

Hope this gets added!

<!-- gh-comment-id:4292585465 --> @calculuschild commented on GitHub (Apr 21, 2026): Wild, I came searching for this functionality and see a PR was made literally minutes ago. Hope this gets added!
Author
Owner

@JTT900 commented on GitHub (Apr 24, 2026):

After playing around with the demo it is looking really great, amazing work!
Hopefully there is a way to get your set levels or range to show without going into the report itself

<!-- gh-comment-id:4311559171 --> @JTT900 commented on GitHub (Apr 24, 2026): After playing around with the demo it is looking really great, amazing work! Hopefully there is a way to get your set levels or range to show without going into the report itself
Author
Owner

@x-rous commented on GitHub (Apr 26, 2026):

@emiltb does it support Category Group filtering?

Edit: I tested and it does, thanks a ton!

<!-- gh-comment-id:4321564318 --> @x-rous commented on GitHub (Apr 26, 2026): @emiltb does it support Category Group filtering? Edit: I tested and it does, thanks a ton!
Author
Owner

@emiltb commented on GitHub (Apr 26, 2026):

Hopefully there is a way to get your set levels or range to show without going into the report itself

Yes, that will be fixed in the 2026.5 release, so the dashboard card will reflect the layers in the report.

<!-- gh-comment-id:4321600073 --> @emiltb commented on GitHub (Apr 26, 2026): > Hopefully there is a way to get your set levels or range to show without going into the report itself Yes, that will be fixed in the 2026.5 release, so the dashboard card will reflect the layers in the report.
Author
Owner

@aChrisYouKnow commented on GitHub (Apr 26, 2026):

Sorry for the delay @emiltb. Spent some time playing with the update this weekend. I was trying to recreate this Sankey Chart:

Image

To do so I created the following new income categories under Budget:
Take-home Salary
Federal Tax
State Tax
Social Security
Medicare
HSA Contributions
Retirement Fund
Benefits
Other Deposits
Investment income
Side hustle
Bank interest

I created the following category groups:
Taxes
Healthcare
Living Expenses
Retirement
Food and Drink
Shopping
Transportation
Charitable giving
Entertainment
Tech related
Savings

Under each category group, I still needed a category, so I kept the name the same and added a -General for now.

Under Transportation, I added the following categories:
Gas
Vehicle Lease
Vehicle Maintenance
Parking
Flights
Tolls

I added the following transactions into a new account called Test-Account-01, and they can be found below
Test-Account-01.csv

I deleted all other April 2026 transactions, so the Test-Account-01 transactions would be the only ones in the Sankey Chart when choosing the range April 2026 to April 2026.

I chose this Sankey Chart view (Income category to Category):

Image

I expected to see a plot somewhat similar to the screenshot at the top of this comment. Instead I see this:

Image

Why is account still being showed if "Income category" is selected and not "Account"?

Also, why is Transportation showing up as "Other" instead of "Transportation?

Below is the view for Income category to category group:
Image

Overall, it seems very close. I think if the income category option did show the income categories, it would have everything I had hoped for. The filtering appears to work great. I can tag transactions and filter in and out on those tags, filter in or out on category groups. I think the only confusing behavior is the income group display. Is it possible to change it so the income category groups get displayed instead of the account name?

Thanks for all of your work on this!

Edit: here is the full ActualBudget data export file if you want to import it and recreate what I was looking at:

2026-04-26-Test Budget.zip

<!-- gh-comment-id:4322245233 --> @aChrisYouKnow commented on GitHub (Apr 26, 2026): Sorry for the delay @emiltb. Spent some time playing with the update this weekend. I was trying to recreate this Sankey Chart: <img width="668" height="671" alt="Image" src="https://github.com/user-attachments/assets/90f73e29-5797-40df-b9ae-3b13f2a91af0" /> To do so I created the following new income categories under Budget: Take-home Salary Federal Tax State Tax Social Security Medicare HSA Contributions Retirement Fund Benefits Other Deposits Investment income Side hustle Bank interest I created the following category groups: Taxes Healthcare Living Expenses Retirement Food and Drink Shopping Transportation Charitable giving Entertainment Tech related Savings Under each category group, I still needed a category, so I kept the name the same and added a -General for now. Under Transportation, I added the following categories: Gas Vehicle Lease Vehicle Maintenance Parking Flights Tolls I added the following transactions into a new account called Test-Account-01, and they can be found below [Test-Account-01.csv](https://github.com/user-attachments/files/27100498/Test-Account-01.csv) I deleted all other April 2026 transactions, so the Test-Account-01 transactions would be the only ones in the Sankey Chart when choosing the range April 2026 to April 2026. I chose this Sankey Chart view (Income category to Category): <img width="433" height="128" alt="Image" src="https://github.com/user-attachments/assets/7e8c9630-9758-4638-bb2a-1bbb1ae93872" /> I expected to see a plot somewhat similar to the screenshot at the top of this comment. Instead I see this: <img width="1160" height="499" alt="Image" src="https://github.com/user-attachments/assets/3918106c-8809-4587-8926-b1ac1db6eb50" /> Why is account still being showed if "Income category" is selected and not "Account"? Also, why is Transportation showing up as "Other" instead of "Transportation? Below is the view for Income category to category group: <img width="1166" height="499" alt="Image" src="https://github.com/user-attachments/assets/24244611-d099-4c6a-8c65-5578da9f8757" /> Overall, it seems very close. I think if the income category option did show the income categories, it would have everything I had hoped for. The filtering appears to work great. I can tag transactions and filter in and out on those tags, filter in or out on category groups. I think the only confusing behavior is the income group display. Is it possible to change it so the income category groups get displayed instead of the account name? Thanks for all of your work on this! Edit: here is the full ActualBudget data export file if you want to import it and recreate what I was looking at: [2026-04-26-Test Budget.zip](https://github.com/user-attachments/files/27100809/2026-04-26-Test.Budget.zip)
Author
Owner

@emiltb commented on GitHub (Apr 26, 2026):

@aChrisYouKnow Thanks for the test budget file. I just had a brief look, and something definitely looks wrong - I have not seen something like this in my testing. The Income Category group should appear to the left of the account, so the links would flow from income through the account and then to the categories that money are spent in. I don't know why the Income shows up as an output-node in your example and will need to do some digging. It should really show the income category towards the left, not the account.

Transportation shows up as Other, because you have a lot of categories and have selected "Show 15" in the settings on the top. If you hover your mouse over it, you can see which categories and amounts were collapsed into the single link.

Edit: The strange Spent graph you showed, occurred because the payee field is empty for all your transactions. Due to a bug in the code, the income transactions were treated as spent money instead of income in that case. I have submitted a fix, which makes sure that income is treated correctly, even if the payee field is blank.

<!-- gh-comment-id:4322425137 --> @emiltb commented on GitHub (Apr 26, 2026): @aChrisYouKnow Thanks for the test budget file. I just had a brief look, and something definitely looks wrong - I have not seen something like this in my testing. The Income Category group should appear to the left of the account, so the links would flow from income through the account and then to the categories that money are spent in. I don't know why the Income shows up as an output-node in your example and will need to do some digging. It should really show the income category towards the left, not the account. Transportation shows up as Other, because you have a lot of categories and have selected "Show 15" in the settings on the top. If you hover your mouse over it, you can see which categories and amounts were collapsed into the single link. **Edit:** The strange Spent graph you showed, occurred because the payee field is empty for all your transactions. Due to a bug in the code, the income transactions were treated as spent money instead of income in that case. I have submitted a fix, which makes sure that income is treated correctly, even if the payee field is blank.
Author
Owner

@aChrisYouKnow commented on GitHub (Apr 27, 2026):

Thanks @emiltb, confirmed the fix works.

As it stands now, it works great. Really well done.

One piece of optional feedback, if there was a way to remove the accounts chunk in the middle when going from "Income category" to "Category" (or even toggle it on or off somehow), that could save a decent amount of space, and also make it far less busy if someone had a lot of accounts. The idea would be that all income categories would flow into an "Income" node, and then out to the category groups. No need to split it up by account in the middle section if someone didn't care which particular accounts the funds flowed through, but rather just wanted to see the visualization of the inputs and the outputs. The option to have the accounts in the middle is really nice, but if the account section could be toggled on and off without too much extra work, that would be ideal.

[Edit: maybe the GUI for the above looks like three drop down menus. The first with Payee, Income Category, Account, Category Group. The second dropdown has Account, Category Group, Category, Skip/Blank/Empty. The third dropdown has Account, Category Group. That way someone can select if they want the Account section between Income Category and Category.]

Lastly, changing the page zoom in or out does a great job at changing the look of the Sankey Chart. Below are screenshots from 3 different zoom levels. Changing the zoom on the browser window to get the look you find most useful might be worthy of a brief user tip at the bottom of the page in case someone doesn't think to try that.

Image Image Image
<!-- gh-comment-id:4327992630 --> @aChrisYouKnow commented on GitHub (Apr 27, 2026): Thanks @emiltb, confirmed the fix works. As it stands now, it works great. Really well done. One piece of optional feedback, if there was a way to remove the accounts chunk in the middle when going from "Income category" to "Category" (or even toggle it on or off somehow), that could save a decent amount of space, and also make it far less busy if someone had a lot of accounts. The idea would be that all income categories would flow into an "Income" node, and then out to the category groups. No need to split it up by account in the middle section if someone didn't care which particular accounts the funds flowed through, but rather just wanted to see the visualization of the inputs and the outputs. The option to have the accounts in the middle is really nice, but if the account section could be toggled on and off without too much extra work, that would be ideal. [Edit: maybe the GUI for the above looks like three drop down menus. The first with Payee, Income Category, Account, Category Group. The second dropdown has Account, Category Group, Category, Skip/Blank/Empty. The third dropdown has Account, Category Group. That way someone can select if they want the Account section between Income Category and Category.] Lastly, changing the page zoom in or out does a great job at changing the look of the Sankey Chart. Below are screenshots from 3 different zoom levels. Changing the zoom on the browser window to get the look you find most useful might be worthy of a brief user tip at the bottom of the page in case someone doesn't think to try that. <img width="1087" height="383" alt="Image" src="https://github.com/user-attachments/assets/53d1a842-6b13-4343-9171-20de7cf9c7a9" /> <img width="1145" height="443" alt="Image" src="https://github.com/user-attachments/assets/0f651336-f71a-4d51-b785-54a9a0072992" /> <img width="1204" height="599" alt="Image" src="https://github.com/user-attachments/assets/1b6287ea-c77c-4d52-970b-0c26f5e36abb" />
Author
Owner

@matt-fidd commented on GitHub (Apr 27, 2026):

Thanks @emiltb, confirmed the fix works.

As it stands now, it works great. Really well done.

One piece of optional feedback, if there was a way to remove the accounts chunk in the middle when going from "Income category" to "Category" (or even toggle it on or off somehow), that could save a decent amount of space, and also make it far less busy if someone had a lot of accounts. The idea would be that all income categories would flow into an "Income" node, and then out to the category groups. No need to split it up by account in the middle section if someone didn't care which particular accounts the funds flowed through, but rather just wanted to see the visualization of the inputs and the outputs. The option to have the accounts in the middle is really nice, but if the account section could be toggled on and off without too much extra work, that would be ideal.

I'd love that, and it would make the spent view far more useful for me. All money flows into my current accounts, but out of my credit cards so the graph does not flow as you might expect. That would be fixed by being able to hide the accounts in the middle or replace with a unified income node

<!-- gh-comment-id:4328241887 --> @matt-fidd commented on GitHub (Apr 27, 2026): > Thanks @emiltb, confirmed the fix works. > > As it stands now, it works great. Really well done. > > One piece of optional feedback, if there was a way to remove the accounts chunk in the middle when going from "Income category" to "Category" (or even toggle it on or off somehow), that could save a decent amount of space, and also make it far less busy if someone had a lot of accounts. The idea would be that all income categories would flow into an "Income" node, and then out to the category groups. No need to split it up by account in the middle section if someone didn't care which particular accounts the funds flowed through, but rather just wanted to see the visualization of the inputs and the outputs. The option to have the accounts in the middle is really nice, but if the account section could be toggled on and off without too much extra work, that would be ideal. I'd love that, and it would make the spent view far more useful for me. All money flows into my current accounts, but out of my credit cards so the graph does not flow as you might expect. That would be fixed by being able to hide the accounts in the middle or replace with a unified income node
Author
Owner

@emiltb commented on GitHub (Apr 27, 2026):

Putting another toggle in the Options menu to group all accounts in a single Income node is not hard to do, and I can definitely see why that makes sense. I'll make sure to implement that.

Another thing that I am aware of, that needs more work is node layer placement (I mentioned it in one of the PR comments). Recharts Sankey graph does not support placing nodes at a fixed layer, so in some cases I add some extra, hidden nodes (i.e. to ensure that an account which has spending but no income ends up at the right layer). I'm pretty convinced that there are edge cases that are not covered right now, so if you have a budget which shows nodes that seem to be at the wrong layer or links that span between more than one layer, it will be very helpful if you can provide a test budget here.

Regarding the zoom level, I'm not sure what the best approach is. I thought about doing something with dynamic scaling and setting the Show N parameter, but would rather give the user full control on what they see. But I would like to find a solution which avoids the case in your first screenshot, @aChrisYouKnow, where the graph completes collapses and you can't see any nodes or links.

<!-- gh-comment-id:4328382135 --> @emiltb commented on GitHub (Apr 27, 2026): Putting another toggle in the Options menu to group all accounts in a single Income node is not hard to do, and I can definitely see why that makes sense. I'll make sure to implement that. Another thing that I am aware of, that needs more work is node layer placement (I mentioned it in one of the PR comments). Recharts Sankey graph does not support placing nodes at a fixed layer, so in some cases I add some extra, hidden nodes (i.e. to ensure that an account which has spending but no income ends up at the right layer). I'm pretty convinced that there are edge cases that are not covered right now, so if you have a budget which shows nodes that seem to be at the wrong layer or links that span between more than one layer, it will be very helpful if you can provide a test budget here. Regarding the zoom level, I'm not sure what the best approach is. I thought about doing something with dynamic scaling and setting the Show N parameter, but would rather give the user full control on what they see. But I would like to find a solution which avoids the case in your first screenshot, @aChrisYouKnow, where the graph completes collapses and you can't see any nodes or links.
Author
Owner

@aChrisYouKnow commented on GitHub (Apr 27, 2026):

@emiltb yea, the first screenshot is what I got to begin with, but changing the page zoom worked fine for me. A good enough solution in my book. I just wasn't sure if everyone would think to try that, so mentioning it in text at the bottom might be worthwhile.

<!-- gh-comment-id:4328825227 --> @aChrisYouKnow commented on GitHub (Apr 27, 2026): @emiltb yea, the first screenshot is what I got to begin with, but changing the page zoom worked fine for me. A good enough solution in my book. I just wasn't sure if everyone would think to try that, so mentioning it in text at the bottom might be worthwhile.
Author
Owner

@emiltb commented on GitHub (Apr 29, 2026):

Summary of feedback

Since I cannot edit the top post of this feedback thread, I'll use this comment to track progress on reported issues with the Sankey chart, until it is ready to move out of the experimental state.

Any bug reports and suggestions for improvements are very welcome. If possible, it is very helpful, if you can supply a test budget file, that covers the problem that you see along with a screenshot of the issue.

Known bugs

  • Node layer placement may in some cases be wrong (i.e. accounts not showing in the same layer as other accounts or links spanning more than one layer). There are probably edge cases that are not handled correctly here, so if you see this issue, please give an example.
  • Selecting a "Show N" value doesn't always produce N nodes in the Categories layer.
  • If the Budgeted graph contains an "Overbudgeted" node, it flows into "Available funds". This means that the amount in Available funds does not match the budget page. It would make more sense to make it flow directly into "Budgeted" instead, since an overbudgeted amount does not really come from funds that are available.
  • The graph becomes unreadable, when too many nodes are being shown in a limited vertical space.

Enhancements

  • Generalise grouping to Other nodes, to limit number of nodes per layer and avoid cluttering the graph. Right now only Categories will group to Other nodes, but this should be expanded to work for the remaining layers.
  • Fix the Mobile view, which right now will be unreadable in most cases. The general problem here is probably trying to show too much information. Some things can probably be reasonably resolved by scaling some elements down. But I also think I need to find a solution where it defaults to fewer layers, to not get all weird, and then let the user choose if they want to see other layers in the mobile view than the defaults. Feel free to comment, if you have ideas on how to best solve the mobile view.
  • Provide an option to group all accounts in the Spent view to a single "Income" node.

Miscellaneous

  • Write unit tests for the core graph functionality
<!-- gh-comment-id:4346791900 --> @emiltb commented on GitHub (Apr 29, 2026): # Summary of feedback Since I cannot edit the top post of this feedback thread, I'll use this comment to track progress on reported issues with the Sankey chart, until it is ready to move out of the experimental state. Any bug reports and suggestions for improvements are very welcome. If possible, it is very helpful, if you can supply a test budget file, that covers the problem that you see along with a screenshot of the issue. ### Known bugs - [ ] Node layer placement may in some cases be wrong (i.e. accounts not showing in the same layer as other accounts or links spanning more than one layer). There are probably edge cases that are not handled correctly here, so if you see this issue, please give an example. - [ ] Selecting a "Show N" value doesn't always produce N nodes in the Categories layer. - [ ] If the Budgeted graph contains an "Overbudgeted" node, it flows into "Available funds". This means that the amount in Available funds does not match the budget page. It would make more sense to make it flow directly into "Budgeted" instead, since an overbudgeted amount does not really come from funds that are available. - [ ] The graph becomes unreadable, when too many nodes are being shown in a limited vertical space. ### Enhancements - [ ] Generalise grouping to Other nodes, to limit number of nodes per layer and avoid cluttering the graph. Right now only Categories will group to Other nodes, but this should be expanded to work for the remaining layers. - [ ] Fix the Mobile view, which right now will be unreadable in most cases. The general problem here is probably trying to show too much information. Some things can probably be reasonably resolved by scaling some elements down. But I also think I need to find a solution where it defaults to fewer layers, to not get all weird, and then let the user choose if they want to see other layers in the mobile view than the defaults. Feel free to comment, if you have ideas on how to best solve the mobile view. - [ ] Provide an option to group all accounts in the Spent view to a single "Income" node. ### Miscellaneous - [ ] Write unit tests for the core graph functionality
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#49859