1295 words
6 minutes
Building an AI Scholarship Matching Platform with Claude

Every year, billions of dollars in scholarship funding goes unclaimed — not because students aren’t deserving, but because the matching problem is genuinely hard. Eligibility criteria span citizenship, GPA thresholds, field of study, programme level, and dozens of softer factors that no spreadsheet can sensibly aggregate. Whizzia is our answer to that problem: an AI-powered scholarship intelligence platform that maps a student’s full academic profile to a ranked shortlist of opportunities, then helps them actually win.

You can see the live app here: WhizzIA

I’m the lead developer on the project. Here’s how we built it.

The Core Idea#

The platform sits at the intersection of three problems students face:

  1. Discovery — finding scholarships they’re actually eligible for, not just a generic list
  2. Positioning — understanding how competitive their profile is and what’s missing
  3. Application quality — getting their CV and personal statement to a fundable standard

Claude handles all three. The architecture is a Next.js frontend talking to a Supabase backend, with the Claude API powering the intelligence layer — profile analysis, CV critique, essay feedback, and scholarship scoring.

Authentication and Onboarding#

The entry point is a clean split-screen login. A dark teal panel on the left carries the Whizzia logo — a graduation cap overlaid on a location pin, which neatly encodes the “where are you going?” question at the heart of the product. The right panel handles the email OTP flow.

Email verification screen — split-panel layout

We deliberately avoided social login for the first version. Scholarship applications involve sensitive data — GPA, citizenship, disability status — and a verified email creates a cleaner audit trail. The six-digit OTP is sent via Supabase Auth and expires in ten minutes.

pages/api/auth/verify.ts
const { data, error } = await supabase.auth.verifyOtp({
email,
token: otp,
type: 'email',
});

The Profile Builder#

Once authenticated, students are walked through a seven-step profile wizard. Step one collects the demographic information that gates the largest share of scholarships: country of citizenship, country of residence, gender, ethnicity (optional), and disability status.

Profile creation wizard — Personal Information step

The sidebar shows progress through all seven steps — Personal Information, Academic Background, Study Preferences, Work Experience, Research & Projects, Achievements, and Final Details. A live Profile Readiness score in the top-right corner updates as fields are completed, climbing toward 100% as the student fills in more data. This was a deliberate UX choice: visible progress reduces drop-off in long onboarding flows.

Subsequent steps capture the academic data that drives matching: GPA, current degree level, target programme, intended study destination, language proficiency scores, and a free-text personal statement. Work experience and research sections feed directly into the CV review feature.

All profile data is stored in Postgres via Supabase. No data is sent to Claude unless the user explicitly triggers an analysis — privacy by default.

Profile Analysis and Scholarship Readiness#

The Profile Analysis page is the dashboard’s centrepiece. It surfaces four headline metrics — Completeness, Readiness score, Percentile rank, and total Match count — alongside a breakdown of what’s still missing and an Eligibility Alignment panel.

Profile Analysis dashboard — readiness metrics and match breakdown

The Scholarship Matches widget in the bottom right categorises opportunities into three buckets: Safe (18), Competitive (23), and Reach (9). These aren’t static labels — they’re computed at query time by comparing the student’s normalised profile vector against each scholarship’s eligibility matrix. The bucketing thresholds are tuned to the realistic acceptance rates in our dataset.

The “Missing Critical Data” banner is generated by a lightweight rules engine that checks which high-signal fields are empty. Country of citizenship, GPA, programme level, field of study, study destination, and personal statement are the six fields with the most impact on match quality — filling them shifts the match count from 50 to upwards of 120 in most cases.

const CRITICAL_FIELDS = [
{ key: 'citizenship', label: 'Country of citizenship' },
{ key: 'gpa', label: 'GPA' },
{ key: 'programLevel', label: 'Program level' },
{ key: 'fieldOfStudy', label: 'Field of study' },
{ key: 'destination', label: 'Study destination' },
{ key: 'statement', label: 'Personal statement' },
];
export function getMissingCritical(profile: Profile) {
return CRITICAL_FIELDS.filter(f => !profile[f.key]);
}

CV Review with Claude#

The CV Review flow is a three-step pipeline: upload, AI analysis, template selection. Students drag in a PDF, DOC, DOCX, or TXT file (up to 10 MB), hit Analyse My CV, and within seconds get a structured critique from Claude.

CV Review — upload interface with AI Insights panel

The AI Insights panel on the right is empty until a CV is uploaded — a deliberate holding state that signals “your analysis lives here.” Once the document is processed, Claude returns a structured JSON object covering: overall strength score, section-by-section feedback, missing scholarship-relevant keywords, and three specific improvement actions ranked by impact.

const systemPrompt = `You are an expert scholarship application advisor.
Analyse the student's CV for scholarship competitiveness.
Return a JSON object with this exact shape:
{
"overallScore": number, // 0-100
"summary": string, // 2-3 sentence executive summary
"sections": [ // per-section feedback
{ "name": string, "score": number, "feedback": string }
],
"missingKeywords": string[], // scholarship-relevant terms not present
"topActions": [ // ranked improvement actions
{ "priority": number, "action": string, "impact": string }
]
}
Return only valid JSON. No preamble, no markdown fences.`;
const response = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
model: 'claude-sonnet-4-20250514',
max_tokens: 1000,
system: systemPrompt,
messages: [{ role: 'user', content: cvText }],
}),
});

The previous analyses section below the upload zone shows a history of past CV versions with their scores, letting students track improvement over time. This has been one of the most-used features in early testing — students revise based on feedback, re-upload, and watch their score climb.

Essay Review#

The Essay Review module follows the same pattern as CV Review but is tuned specifically for scholarship personal statements. Claude evaluates the essay against five scholarship-specific rubrics: clarity of purpose, evidence of impact, fit with the target award’s values, narrative coherence, and differentiation from a hypothetical applicant pool.

The prompt instructs Claude to return feedback structured around the specific scholarship the student is applying for — if a student has indicated they’re targeting a Commonwealth Scholarship, the feedback prioritises community impact and development goals over raw academic achievement.

Scholarship Matching Engine#

The matching logic runs in two passes. The first is a hard-filter pass in SQL — ruling out any scholarship where the student doesn’t meet mandatory criteria (citizenship, GPA floor, degree level). The second is a soft-ranking pass using Claude, which takes the filtered shortlist and the student’s profile and returns a ranked list with per-scholarship reasoning.

const rankingPrompt = `
Given the following student profile and list of scholarships they are
eligible for, rank the scholarships by fit and return a JSON array.
For each scholarship, include:
- scholarshipId
- fitScore (0-100)
- keyStrengths (array of strings — why this student is a good fit)
- keyRisks (array of strings — what might count against them)
- recommendedFocus (string — what to emphasise in the application)
Student profile: ${JSON.stringify(profile)}
Eligible scholarships: ${JSON.stringify(eligibleScholarships)}
`;

This two-pass approach keeps costs predictable — the SQL filter reduces the average shortlist from 400+ scholarships to around 50 before Claude ever sees it, keeping token usage per ranking call under 3,000.

What’s Next#

The roadmap has three near-term priorities. First, a deadline tracker integrated into the Checklist feature — scholarship windows are brutally short and students consistently miss them. Second, a recommendation letter assistant that drafts referee briefing documents, giving students a polished summary of their accomplishments to hand to professors. Third, a mock interview module using Claude’s conversational capability to run practice scholarship interviews for high-value awards like Rhodes and Gates Cambridge that include a panel stage.

The infrastructure is largely in place. The interesting work now is in the product layer — understanding precisely what blocks a student between “matched” and “funded,” and building the features that close that gap.


Built by Hashi Warsame — Lead Developer, Whizzia

Building an AI Scholarship Matching Platform with Claude
https://fuwari.vercel.app/posts/whizzia/
Author
Hashi Warsame
Published at
2026-05-11
License
CC BY-NC-SA 4.0