Inspiration

Choosing a credit card is far more complicated than it should be. Most people end up picking cards based on ads, word of mouth, or generic “best of” lists that don’t reflect how they actually spend money. Meanwhile, many Canadians are unknowingly leaving hundreds of dollars in rewards on the table or paying fees for benefits they never use.

We were inspired to build cardmatch.ca to flip that experience around: instead of forcing users to understand complex credit card terms, the product understands them.

What it does

cardmatch.ca helps users find the credit cards that best suit their real financial behaviour.

Users upload their debit card statements and answer a short, intuitive questionnaire. Cardmatch analyzes spending patterns, such as groceries, travel, and recurring purchases, and combines this with user preferences to recommend credit cards that maximize rewards, minimize fees, and fit individual lifestyles.

Rather than generic rankings, users receive personalized, data-driven recommendations tailored to how they actually spend. They are then able to simulate different spending habits and see how those changed numbers affect recommendations in real time.

How we built it

We built cardmatch.ca as a modern web application using:

  • Next.js + React + TypeScript for a fast, scalable frontend
  • Tailwind CSS for clean and responsive UI
  • PDF parsing to extract structured data from bank statements
  • A rules-based scoring engine that evaluates cards based on spend categories, fees, perks, and user preferences
  • Zod for type-safe validation and structured data handling The recommendation engine scores cards dynamically, factoring in spending behaviour, reward structures, annual fees, merchant constraints, and selected perks.

Challenges we ran into

Since we parsed the statements on the client side to ensure security, one of our biggest challenges was normalizing and interpreting statement data. Bank statements vary widely in format, naming conventions, and category clarity, which required careful parsing and error handling.

Another challenge was designing fair scoring logic, balancing annual fees against rewards, perks, and real-world usability without overfitting to a single spending pattern.

Finally, simplifying a complex financial decision into a short, friendly questionnaire, without losing accuracy, required multiple iterations.

Accomplishments that we're proud of

  • Building an end-to-end personalized recommendation system in a short timeframe
  • Successfully extracting meaningful insights from raw debit card statements
  • Designing a clean, approachable UX for a traditionally intimidating topic
  • Creating logic that considers all the provided data
  • Delivering recommendations users can actually trust and understand

What we learned

We learned that good financial tools must prioritize clarity and trust. Small design choices, like transparent explanations and realistic constraints, make a huge difference in user confidence.

On the technical side, we gained hands-on experience working with unstructured financial data, building scoring systems, and managing complex application state in React.

Most importantly, we learned how impactful personalization can be when it’s grounded in real data.

What's next for cardmatch.ca

Now we're set on

  • Expanding card coverage across more Canadian financial institutions
  • Improving statement parsing accuracy with smarter categorization
  • Explore privacy-first AI enhancements for deeper insights Our long-term goal is to make cardmatch.ca the go-to platform for smarter, more confident credit card decisions in Canada.

Built With

Share this project:

Updates