BracketWise
Designing & Architecting a Tax-Optimization Engine

Overview
BracketWise is a financial planning tool built for Canadians with mixed income; such as freelancers who also have T4 employment, investors with capital gains, or anyone navigating more than one income stream.
Unlike tax filing software, which works backward from what already happened, BracketWise is a forward-looking optimization engine. It calculates liability across tax brackets, accounts for dual-income CPP obligations, and models FHSA, RRSP, and TFSA contributions against available cash flow. By transitioning from historical summaries to predictive modeling, the platform enables precise financial decision-making before the tax year concludes.
-
Impact
- Lowers the barrier to sophisticated tax planning by translating complex CRA regulatory logic into an intuitive, budget-aware tool, allowing users to make data-backed financial decisions with confidence.
- Provides instant optimization paths for mixed-income earners, by automating complex multi-stream tax calculations,
- Resolvs the self-referential nature of tax-sheltered contributions, capturing tax-saving opportunities that standard calculators consistently miss.
-
Hats Worn
- Product Management: Problem framing, scope sequencing, MVP prioritization, feature tradeoff decisions
- UX Research: Domain research, pain point mapping, competitive analysis, algorithmic verification against CRA rules
- System Architecture: Tax engine design, 5-pass optimization logic, data flow, React implementation
- UI/UX Design: Design system tokens, information architecture, data visualization, copywriting
-
Tools
Claude + Gemini for research and cross-validation, Figma for UX design, ChatGPT for brand identity, Claude Code + GitHub Copilot for implementation
-
Timeline
Less than 3 weeks, from Ideation to Implementation
-
Team
Sole Designer + Researcher
-
Platform
Responsive Web App, SaaS
How Design+AI Powered This Build
Instead of using AI as a shortcut, I built a system centered on cross-model validation and primary-source grounding. This allowed me to compress research and development cycles without sacrificing the precision required for financial software.
- Logic Verification: I ran tax rules through Claude and Gemini at the same time. If they gave me different answers, I knew something was wrong. I treated those disagreements as a signal to stop and check the official CRA documents myself. This "dual-check" was non-negotiable for a financial tool.
- Brand & Visuals: I used ChatGPT to brainstorm the brand identity, logo directions, and color palettes.
- System Architecture: I used Claude Code to build the calculation engine and GitHub Copilot to help refine the UI components. I treated the AI like a pair-programmer: it drafted the architecture and code, but I remained the one auditing the logic and performance.
This approach allowed me to build a production-grade application in two weeks without sacrificing quality. My role was to manage the AI, verify its outputs, and make the final decisions. It’s a workflow I intend to bring into future product roles: using AI to compress cycles while keeping the human in control of the rigor.
The Problem Landscape
The Core Tension: Reporting vs. Planning
Most Canadians manage their taxes through a "historical" lens. They wait for tax slips to arrive, plug them into software, and see what the result is. This is retrospective reporting.
BracketWise flips this. It assumes the tax year is an active, strategic timeline. The core tension is that current financial tools are designed to report on the past, but the user's primary need is to optimize the future. By the time a user sees their tax liability on a filing platform, the window to leverage tax-advantaged accounts (FHSA/RRSP/TFSA) has already closed.
Defining the Technical Complexity
The challenge of building BracketWise was not UI—it was logic convergence. To build a tool that actually works, I had to architect a system that accounts for the recursive nature of Canadian tax law. For instance, contributing to an RRSP lowers your taxable income, which changes your marginal bracket, which changes how much tax you owe, which changes your cash flow, which changes how much you can contribute.
I solved this by building a 5-pass cyclical optimization loop. Instead of a simple "if/else" statement, the engine iterates through these variables until the result stabilizes. This is the difference between a "calculator" and an "optimization engine."
The "Mixed-Income" Blind Spot
The market is increasingly populated by earners who do not fit the "standard T4" mold. This user group faces three specific systemic hurdles that current software ignores:
- The Dual-CPP Trap: Freelancers earning mixed income are often penalized by CPP obligations on both employment and self-employment income, often triggering an unexpected tax bill in April.
- The Cash-Flow Constraint: Optimization is usually taught in a vacuum (e.g., "Max out your RRSP!"). But for a user with limited monthly cash, "maxing out" is often physically impossible. The real problem isn't "what is the maximum contribution," but "what is the optimal contribution I can afford right now?"
- The Contribution Sequence: There is no standard advice on the order of operations between FHSA, RRSP, and TFSA. Without an engine, users often default to the wrong account, missing out on lifetime savings.
Moving from retrospective reporting to predictive modeling by architecting a recursive optimization engine
Logic Validation & Data Integrity
Building an accurate tax engine required more than a functional UI; it demanded algorithmic reliability. To ensure the calculation engine produced precise outputs, I engineered a strict validation framework using dual-model parallel cross-checking against official CRA regulations.
- Convert CRA rules to variables
- Map fiscal year brackets
- Codify deductions and credits
- Establish rule dependencies
- Trace full 5-pass recursive loop
- Validate calculation steps
- Audit all state transitions
- Verify convergence stability
- Cross check: Claude vs. Gemini
- CRA docs as final arbiter
- Run complex test cases
- Halt on any logic discrepancy
- Edge case analysis
Architecture Diagram
I developed a comprehensive system map detailing how data moves through the platform. The architecture separates standard mandatory contributions (tax, EI and dual-tier CPP) from the core Optimization Engine, which runs a -pass recursive loop to balance RRSP headroom against available cash and FHSA limits.
UX Strategy
Contextual Onboarding & Trust
The Problem:
At the start of a financial tool, users face two major hurdles: they don't understand why they need to provide complex data (like CRA limits), and they hesitate to enter real numbers due to privacy fears. Standard pop-ups often skip the necessary context or overwhelm users with massive legal disclaimers, leading to drop-offs and bad data inputs.
The Solution:
I designed a 4-step onboarding overlay that tackles both education and privacy simultaneously. It explicitly explains the value of the required data and features a "Privacy & Security" badge, leveraging the app's browser-based setup to guarantee data never leaves the device. To keep the main workspace clean and welcoming, I moved the heavy legal compliance text into this overlay and placed only a short disclaimer in the footer. Finally, a permanent "How it works" button in the header ensures this context is always accessible on demand.
Onboarding, Privacy & Disclaimer
Visualizing the Cash Cascade
The Problem:
Showing users a massive wall of tax numbers is confusing. There is a real risk they might lock their cash into long-term investments and not have enough left to actually pay their tax bill in April.
The Solution:
I designed the results section as a step-by-step "Cash Cascade" using progressive disclosure. The layout acts as a financial guardrail: it forces users to address their mandatory tax owings (Step 1) before unlocking their investment options for FHSA and RRSP (Steps 2 and 3). By breaking down massive annual limits into clear monthly targets, the design turns abstract math into a safe, easy-to-follow financial roadmap.
Cash Cascade
Data Viz & Progressive Disclosure
Data Visualization
The Problem:
Displaying comprehensive tax data is a balancing act. Dumping a massive spreadsheet of calculations causes cognitive overload for the average user, but hiding the math entirely frustrates power users who need to verify where their money is going.
Instead of defaulting to a single chart type, I matched each visualization format to the specific job it needed to perform, using progressive disclosure to serve both user types effectively.
- Stat Pills (Headline Figures): Single scalar facts like Gross Income and Tax Savings are presented as text for immediate reading with zero decoding overhead. I applied a consistent visual language to the deltas, using an accent color to flag "good news", so users can instantly register the impact of their optimization at a glance. Gross income deliberately carries no delta, as it remains mathematically unaffected by the optimization.
- The Data Table (Auditing the Math): Once users see their headline result, their next instinct is to verify it line by line. Since this is a precision lookup task rather than a trend analysis, a traditional table is the only format that works. It sits behind a "See breakdown" toggle, keeping the default view clean while providing power users with the granular transparency they need.
- The Step Graph (Visualizing the "Aha" Moment):The core insight is showing users where they sit on the tax curve. Since Canadian tax brackets jump discretely rather than rising smoothly, I used a step function to honestly reflect how the system behaves. A shaded "Income Shielded" zone turns the optimization into a tangible, spatial win.
Dynamic Alerts & Contextual Education
The Problem:
Tax terminology is intimidating, and users can easily miss critical legal thresholds or input invalid data during entry, leading to compliance errors and a lack of trust in the tool.
The Solution:
I separated user education from system feedback. I implemented static, on-demand tooltips to explain complex rules (like capital gains inclusion rates) without cluttering the UI. Alongside this, I designed dynamic micro-copy and active input constraints. If a user triggers a legal threshold (like a freelancer crossing $30,000 for GST registration) a specific warning appears. Also, if a user inputs a value exceeding a hard legal limit (such as FHSA limit), the system automatically clears the input and displays an inline alert directly below the field explaining the restriction. This prevents invalid data entry while proactively keeping the user informed and compliant.
Conditional Micro-Copy & Contextual Tooltips
Time-Aware Cash Flow Planning
The Problem:
In my initial iterations, the system simply divided the user's annual tax liability by 12 to calculate their monthly savings goal. I quickly realized a critical flaw: this assumed everyone starts planning on January 1st. If a user inputs their data in July, dividing by 12 creates a false sense of security and guarantees a massive cash shortfall by tax season.
The Solution:
I updated the logic to make the tool time-aware. The system now dynamically takes the total tax owed and available cash and divides it strictly by the remaining months in the year. This iteration ensures that the recommended monthly targets adjust based on the current calendar date, keeping the financial plan realistic and safe no matter when the user starts.
Time-Aware Cash Flow Planning
Accessible Design & Keyboard Navigation
During early iterations, instant reactivity caused "calculation panic"; numbers flashing on every keystroke made the tool feel unstable. Furthermore, I needed to balance rapid data entry for power users with strict web accessibility standards, especially since the interface lacked a traditional "Calculate" button.
I redesigned the interaction model to ensure the tool feels deliberate, fast, and fully inclusive:
- Intentional Reactivity: To build trust and eliminate visual clutter, the engine waits for explicit intent. It updates the math only when a user clicks away from an input or explicitly presses 'Tab' or 'Enter'.
- Rapid Scenario Testing: To speed up data entry, users can adjust values using the up and down arrow keys in intuitive increments ($1,000 for cash, 0.5% for matches). Pressing 'Enter' triggers the calculation but intentionally keeps focus on the input, allowing users to rapidly tweak numbers and test scenarios without reaching for a mouse.
- Invisible Accessibility: To ensure these custom keyboard controls meet web standards, I made sure that assistive technologies recognize the step adjustments. Simultaneously, an aria-live="polite" region ensures screen readers quietly announce the newly calculated tax results in the background, keeping users perfectly informed without interrupting their workflow.
Zero-State & Visual Affordance
The Problem:
When users first open a financial calculator, a blank results panel feels intimidating and gives zero context about what the application actually outputs.
The Solution:
Instead of leaving the right-hand dashboard empty on load, I designed a structured Skeleton UI. By displaying muted outlines of the final Cash Cascade cards and charts, the interface immediately previews what the output will look like. This provides clear visual affordance, helping users understand the cause-and-effect relationship between their inputs on the left and the optimized results on the right.
Zero-State
Product Scope & Trade-Offs
Traded a basic calculator approach for granular inputs to deliver an actionable financial roadmap.
Most tax calculators only ask for basic numbers to give a rough estimate. I decided to build a detailed planner instead. By asking users for specific inputs—like contribution limits and medical expenses—BracketWise takes a bit longer to fill out. However, this extra friction is worth it because it gives users an actionable, personalized roadmap to actually lower their taxes.
Maintained lean MVP discipline against AI feature bloat
Modern AI coding tools make it incredibly tempting to generate massive, complex feature sets right from the start, like linking family profiles to route household taxes. But sticking to lean MVP rules is the best way to build reliable software. I focused the app entirely on the individual earner. Instead of building complex logic to route family deductions, I used simple tooltips to explain who in the household should claim them.
Avoided building a bookkeeping tool for self-employed users by grouping expenses and using GST warning alerts
Self-employed taxes are complicated. Building features to track receipts or calculate sales tax would have turned this app into QuickBooks. Instead, I kept the focus strictly on income tax planning by asking for just one total "expenses" number. To keep users legally safe without adding feature clutter, I used a dynamic alert that simply warns them to register for GST if their revenue passes $30,000.
Validation & Usability Testing
Stress-Testing with AI
A tax tool has to be mathematically bulletproof. Testing only simple, everyday scenarios wasn't enough to guarantee the app was reliable.
I used Gemini and Claude to generate extreme financial edge cases—like mixing high capital gains with maxed-out FHSA contributions. I ran these complex profiles through the app to verify that the calculations and charts held up perfectly under pressure.
Mathematical Validation
Validating the UX
Data Analytitics:
Usability testing revealed a few friction points in result comprehension. Users felt overwhelmed by the combined marginal tax graph sitting in the top-level results.
In response, by leveraging progressive disclosure, I moved the complex tax graph into a detailed breakdown section—keeping the initial results highly scannable for the average user, while ensuring power users still retain full access to the granular visual data they need.
I also added a lightweight delta indicator to the two pills that actually change post-optimization.
Results, First Iteration
Results, Second Iteration
Optional Inputs:
Because some inputs like childcare and medical expenses don't apply to every user, I hid them behind optional buttons to keep the default interface clean and avoid overwhelming the user.
Initially, I used a standard toolbar design where clicking a button at the top spawned a new input field below. During user testing, I noticed friction with this approach. Users would click a button and then have to visually scan the page to find where the new input had just appeared.
To fix this, I redesigned the feature using an inline expansion model. Now, clicking "+ Medical Expenses" transforms the button directly into an input field in that exact spot.
Optional Inputs, First Iteration
Optional Inputs, Second Iteration
Expert Financial Validation
Feedback from financial testing revealed that the MVP’s "maximize everything" algorithm was strategically flawed. While maxing out RRSP and FHSA room is crucial for high-income or self-employed users facing large tax bills, it actively harms lower-income users by burning their valuable contribution room for minimal immediate tax relief.
This validation directly informed the V2 roadmap. The next iteration will shift to contextual optimization, proactively advising lower-bracket users to utilize a TFSA instead, preserving their RRSP room for future, peak-earning years.
Reflections
Lesson Learned
- Copywriting as a Functional System:
In a complex financial product, copywriting isn't just about tone—it is a critical piece of system logic. While the dynamic alerts I designed handle standard flows well, I realized that using generalized messaging during the tax optimization stage can be misleading for unique edge cases. Moving forward, I want to refine the content design to be much more granular, ensuring the text is as precise and responsive as the underlying math.
What's Next
- Scaling the Optimization Logic:
The app already features intelligent constraints, halting RRSP and FHSA contributions when income drops below the Basic Personal Amount or during the BC Tax Reduction clawback. For V2, I will scale this efficiency into a fully contextual engine. Instead of defaulting to maximum contributions, the system will evaluate the marginal tax benefit of every dollar, proactively advising lower-bracket users to prioritize TFSAs while preserving RRSP room for peak-earning years.