Inspiration

Students miss out on money they may already qualify for simply because they never knew it existed. Student discounts are scattered across company websites, scholarship search is overwhelming, and many lists are outdated or difficult to trust.

We built Charge Up Savings to make that easier. Instead of asking students to search through endless catalogs, we start with the student and surface the opportunities that are most relevant to them.

What it does

Charge Up Savings has two main tools.

Student Discount Finder

Students can search for companies or services they already use and quickly see whether a student discount is available.

The search is fuzzy and typo-tolerant, so even something like chipotel can still surface Chipotle. Results include the discount, how to claim it, what verification is required, and a direct source link.

Scholarship Matcher

Students can upload a resume instead of completing a long questionnaire.

We use Gemini 3.1 Flash-Lite to extract scholarship-relevant information such as major, year in school, skills, research interests, school, and work experience.

Every extracted fact includes supporting evidence from the resume, and we verify that evidence before adding it to the student's profile.

The language model does not decide scholarship eligibility.

Instead, eligibility is evaluated using deterministic rules for things like:

  • Major
  • GPA
  • Year level
  • Citizenship
  • Age
  • Residency
  • Graduate study plans
  • Deadlines
  • Scholarship-specific requirements

If important information is missing, the system does not guess. It asks only a few optional follow-up questions that could actually change the student's results.

How we built it

We split the scholarship system into separate stages so each part has one clear responsibility:

Resume → Gemini structured extraction → Evidence verification → Student profile → BM25 + semantic embeddings → Reciprocal Rank Fusion → Deterministic eligibility filtering → Bayesian-optimized ranking → Explainable scholarship matches

We use BM25 for exact lexical relevance and Gemini Embedding 2 for semantic similarity. These rankings are combined using Reciprocal Rank Fusion.

Eligibility is then enforced separately with deterministic rules.

For the final ranking, we built a small validation benchmark and used Gaussian-process Bayesian optimization to tune the ranking weights instead of choosing them entirely by hand. Our validation nDCG@5 improved from 0.9248 to 0.9579.

The frontend is built with React and Vite, with lightweight Node.js API endpoints used for Gemini-powered extraction and embeddings.

Challenges we faced

One of the biggest challenges was deciding where AI should and should not be trusted.

It would have been easy to give a resume and a scholarship description to an LLM and ask whether the student qualifies. We decided against that because eligibility can depend on hard requirements, and a confident AI mistake could waste a student's time.

Instead, we let AI handle the unstructured problem of understanding a resume, while deterministic code handles eligibility.

Resume extraction also had several edge cases. Job titles like "Software Engineering Intern" could look like majors, graduation dates had to be interpreted carefully, and we had to avoid inferring sensitive information that a student never explicitly provided.

We also had to separate relevance from eligibility. A scholarship can be very relevant to someone's background while still depending on information we do not know. Those opportunities are shown as needing verification instead of being presented as confirmed matches.

Another challenge was working within API rate limits. Our original ranking evaluation repeatedly embedded the same scholarship corpus, which quickly exhausted the Gemini free-tier quota. We redesigned it to embed scholarships once, reuse those vectors, and perform the rest of the Bayesian optimization locally.

What we learned

One of our biggest takeaways was that more AI is not always better.

The system became more reliable when we combined different techniques for different jobs:

  • LLMs for resume understanding
  • Evidence verification for grounding
  • BM25 for lexical retrieval
  • Embeddings for semantic retrieval
  • RRF for rank fusion
  • Deterministic rules for eligibility
  • Bayesian optimization for ranking weights
  • Adaptive questions for resolving missing information

That separation made the system easier to explain, test, and trust.

What's next

The current version uses a curated scholarship and discount dataset. The next step is expanding it into a larger, continuously maintained database of verified opportunities.

We would also like to add outcome-based feedback so the ranking system can learn from signals such as scholarships students save, apply to, and ultimately receive.

Long term, Charge Up Savings could become a shared platform where universities and student organizations contribute verified opportunities, while students get one place to see the money and resources they may otherwise never know existed.

Built With

Share this project:

Updates

Submission history