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

Open
opened 2026-04-18 02:46:25 -05:00 by GiteaMirror · 36 comments
Owner

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

Known issues:

  • In cases where there are many income payees, expense groups, or expense categories, the Sankey chart can look a bit wonky, and not fully fit in the component.

Upcoming additions:

  • Group together small nodes into an "Other" category at each level. This will fix the issue mentioned above regarding too many small nodes.
  • Add theme colors
  • Privacy blocks
Originally created by @shaankhosla on GitHub (Nov 16, 2023). Original GitHub issue: https://github.com/actualbudget/actual/issues/1919 Known issues: - [ ] In cases where there are many income payees, expense groups, or expense categories, the Sankey chart can look a bit wonky, and not fully fit in the component. Upcoming additions: - [ ] Group together small nodes into an "Other" category at each level. This will fix the issue mentioned above regarding too many small nodes. - [ ] Add theme colors - [ ] Privacy blocks
GiteaMirror added the feedbackexperimental feature labels 2026-04-18 02:46:25 -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.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#26531