A friend paying back ₹1,500. A purchase you returned. A work expense reimbursed. Every one of those used to widen your budget by that much — even though the original spend had already eaten it. Money the budget had spent once got handed back to you to spend again.

Income now files under one of thirteen categories, in two groups.
The second group is still recorded and still shows in your income total. It just stops pretending you earned it. The list is fixed rather than something else to set up, and income you logged before today still counts as earnings — nobody's numbers moved when this shipped.

Income has a Category column, a multi-select filter, and a picker in the edit dialog — so a refund the bot read as salary is now a two-click correction rather than something you live with. It's in the CSV export too.

Log a refund and the reply says so: ↩️ Money coming back, not new income — your
budget is unchanged. And /status, /report and the cycle report all carry the
same line — what landed, what the budget is actually built on, and the gap
between them, named rather than left for you to work out.
Telegram and the dashboard now quote the same budget. They used to disagree, by exactly the refunds.

A recurring income rule picks from the income categories instead of the spending ones. A reimbursement that arrives every month stops inflating the budget every month.
/report no longer hides refunds while /status names them.