Cushion: Financial Resilience, Reimagined
Inspiration
Imagine working hard, paying your bills, and doing everything you're supposed to do financially, only to have one unexpected expense turn your entire life upside down.
Unfortunately, for many Canadians, this isn't just hypothetical.
According to the Financial Consumer Agency of Canada, 48% of Canadians had no emergency savings in 2025. Even more concerning, 53% struggled to keep up with their financial commitments, while 50% had to dip into their savings because of economic conditions. The consequences don't stop there: a 2025 survey found that among respondents affected by unexpected bills, 59% ended up going into debt.
But here's the problem: how many people actually know how long their savings would last if something unexpected happened? How much would they need to save to feel secure? And what would they do if their income suddenly disappeared? Financial uncertainty creates stress and anxiety. Sometimes, the hardest part isn't even the expense itself; it's not knowing whether you'll be okay afterward.
That's why we created Cushion. When life throws you off balance, we've got you and your finances cushioned.
What it does
Cushion starts with an account’s recorded income, spending, bills, and savings buffer. It also examines patterns over time, including recent income and spending changes, balance trends, and past months below zero.
Users can test a scenario, such as income falling to 55% for six months, then review the interpreted inputs before applying it. Cushion calculates the effect on runway and buffer, and provides an emergency-fund goal and a backup plan to explore possible next steps.
Users can also browse an account directory and see portfolio-level counts under illustrative scenarios. Potential cuts, extra income, and upfront funds remain editable planning choices; Cushion does not assume they are available.
How we built it
Cushion uses a React and Vite frontend with a Python and FastAPI backend. A deterministic financial engine calculates baselines, applies shocks, estimates runway, and builds goal and backup plans.
Gemini can translate a plain-language scenario into structured inputs and explain the resulting plan. It does not calculate financial outcomes. Users can review assumptions before applying a scenario, and manual controls keep the core workflow usable without AI.
The current analysis uses relabelled historical Czech PKDD’99 financial data. It is not Canadian customer data.
Challenges we ran into
Averages alone can hide meaningful changes in an account’s history. We worked to add time-based signals while keeping the underlying calculations understandable.
We also had to distinguish recorded facts from assumptions. For example, a cash withdrawal does not tell us whether the money went to an optional expense, and the dataset does not provide a complete grocery budget. Cushion asks users for missing estimates rather than inventing them.
Another challenge was giving AI a useful role without letting generated text drive the financial math. We kept the calculations in a deterministic engine and made scenario inputs reviewable.
Accomplishments that we’re proud of
- Built an end-to-end flow from account history to scenario testing and planning.
- Added historical comparisons and peer context alongside typical account values.
- Made shock assumptions visible and gave users a chance to review them before applying a scenario.
- Kept financial calculations separate from AI-generated interpretation and explanation.
- Created a portfolio view for exploring how illustrative scenarios affect groups of accounts.
What we learned
We learned that useful financial analysis is not just about calculating a number. It also depends on showing where that number came from, what assumptions went into it, and what the data cannot tell us.
We also learned that responsible AI can mean giving it a bounded role: helping users express and understand a scenario, while keeping consequential calculations transparent and testable.
What’s next for Cushion
- Evaluate the workflow with users and improve the language based on their feedback.
- Validate the analysis on appropriate, locally relevant data before drawing conclusions about Canadian households.
- Expand time-based analysis and make its limitations and uncertainty clearer.
- Improve accessibility and make it easier for users to adjust assumptions and compare scenarios.
Try it out!
- Source code: https://github.com/r05200/sheridan-datathon