Source: college_decision_model.md
How admissions offices actually evaluate, select, and manage enrollment — research compiled from the Harvard/SFFA trial data, NBER studies, NACAC reports, and admissions officer accounts.
Elite colleges evaluate applications across multiple discrete dimensions, each receiving a numerical rating. The Harvard trial (SFFA v. Harvard) revealed a 1-6 rating scale (1 = best, 6 = worst, with +/- modifiers) applied to six components:
| Component | Rating 1 (Best) | Rating 2 | Rating 3 | Rating 4-6 |
|---|---|---|---|---|
| Academic | Potential summa; near-perfect scores; intellectual genius (<1% of admits) | Magna potential; superb grades, 750+ SAT per section, 33+ ACT (90% of admits fall here) | Solid grades, good scores, above-average rigor | Below institutional average |
| Extracurricular | National/international distinction (e.g., IMO, published research, Olympian) | School leadership: class president, newspaper editor, concertmaster | Deep participation without notable distinction | Minimal or no involvement |
| Personal | "Outstanding" — humor, grit, leadership, integrity, courage, kindness | "Very strong" personal qualities | "Generally positive" | "Bland," "somewhat negative," "immature," or "questionable" |
| Athletic | Recruited varsity athlete (coach's list) | Strong athlete, recruited but not top priority | Participated in sports, not at competitive level | Little/no athletic involvement |
| Recommendation | Exceptional — "best student in 20 years" language | Very strong endorsement from teachers/counselors | Standard positive | Lukewarm or negative |
| Alumni Interview | Exceptional personal impression | Strong positive impression | Adequate | Negative or no-show |
The overall rating synthesizes all components:
Overall 1: 100% admission rate
Overall 2+/2/2-: ~70% admission rate
Overall 3+: ~20% admission rate
Overall 3: ~3% admission rate
Overall 4+: <1% admission rate
Holistic review incorporates both hard factors (GPA, course rigor, test scores, school strength) and soft factors (ECs, essays, recommendations, interviews, demonstrated interest). The key insight from trial data is that these are not weighted equally — academics dominate initial screening, but personal and extracurricular ratings determine outcomes among academically qualified candidates.
Most selective colleges use a 4-step process:
The regional admissions officer ("territory manager") does the initial read
They know the applicant's high school, its grading norms, counselor reputation, and regional context
They assign preliminary ratings across all components
They write a summary narrative highlighting strengths and concerns
This is typically a 8-15 minute read per application
A second reader independently reviews the application plus the first reader's notes
Their role is to confirm or challenge the initial ratings
If both readers agree on admit/deny, the decision often stands
If they significantly disagree (e.g., ratings differ by 2+ points), the application is flagged for committee
5-8 member subcommittees organized by geographic region
Comprise admissions officers, trained faculty readers, and a senior officer as chair
The territory manager presents and advocates for applicants from their region
Members discuss borderline cases; most clear admits/denies are rubber-stamped
Split decisions go to a vote within the subcommittee
The full admissions committee convenes to review subcommittee recommendations
The Dean of Admissions has final authority
Focus is on class-shaping: balancing demographics, geography, intended majors, hook categories
Waitlist decisions are made here based on projected yield shortfalls
| School | Structure | Notes |
|---|---|---|
| Harvard | Subcommittee + full committee | 5-8 person regional subcommittees, then 40-person full committee |
| Yale | Committee-based | Multiple readers, committee discussion |
| Princeton | Committee-based | Similar to Harvard model |
| Stanford | Primarily single-reader | Officers rarely meet as a committee; less opportunity for advocacy |
| MIT | Committee-based | Strong emphasis on "match" with institutional culture |
| Large state schools | Algorithmic + reader | Initial computer sorting by GPA/scores, then reader review for borderline cases |
During peak season, readers evaluate 20-40 applications per day
Later-read applications within a day may receive slightly lower attention
Regional officers develop advocacy bias for their territory's strongest applicants
The "halo effect" from a strong opening (essay, first impression) colors subsequent ratings
Colleges must admit more students than they have seats because not every admitted student will enroll. The ratio of admitted-to-enrolled students is the yield rate.
| Tier | School | Yield Rate | Implication |
|---|---|---|---|
| HYPSM | Harvard | ~84% | Admits ~1.2x target (minimal over-admit) |
| HYPSM | Stanford | ~82% | Admits ~1.2x target |
| HYPSM | Princeton | ~72% | Admits ~1.4x target |
| Ivy+ | Yale | ~68% | Admits ~1.5x target |
| Ivy+ | Columbia | ~67% | Admits ~1.5x target |
| Ivy+ | UPenn | ~68% | Admits ~1.5x target |
| Ivy+ | Brown | ~67% | Admits ~1.5x target |
| Ivy+ | Cornell | ~68% | Admits ~1.5x target |
| Ivy+ | Dartmouth | ~64% | Admits ~1.6x target |
| Selective | Top 20-30 | 35-50% | Admits 2x-3x target |
| Selective | Top 50 | 20-35% | Admits 3x-5x target |
target_class_size = 1700 (example)
historical_yield = 0.68 (example: 68%)
safety_margin = 0.02 (2% buffer)
admits_needed = target_class_size / (historical_yield - safety_margin)
# = 1700 / 0.66 = 2,576 admits
Colleges use predictive models that account for:
Historical yield by applicant segment (ED vs EA vs RD, in-state vs out-of-state, financial aid vs full-pay)
Current year's applicant pool quality and overlap with peer schools
Economic conditions affecting family willingness to pay
Recent ranking changes or PR events
ED is the primary yield management tool:
ED yield = 100% (binding commitment)
Colleges admit 30-50% of their class through ED
ED acceptance rates are 2-3x higher than RD (e.g., Dartmouth: 19.1% ED vs 5.4% RD)
This is partly self-selection (stronger applicants apply ED) and partly strategic yield management
When yield exceeds predictions:
Housing crises (triple rooms, hotel contracts)
Larger class sizes strain faculty and facilities
Budget implications from additional financial aid commitments
Example: Duke reopened its waitlist in August to manage last-minute enrollment fluctuations
The waitlist serves as a buffer against yield uncertainty. It is activated only when the college's deposit count falls short of enrollment targets after May 1.
Average colleges: admit ~20% of waitlisted students (NACAC data)
Most selective schools: admit ~7% from waitlist
Scale varies enormously: University of Michigan placed 26,898 on waitlist, admitted 955 (3.5%); some elite schools place 1,000-2,000 and admit 0-100
Selection from waitlist is holistic, not ranked:
Colleges look for students who fill specific gaps in the class profile
Needed majors (e.g., engineering slots unfilled)
Geographic diversity gaps
Demographic balance
Financial profile (full-pay students may be preferred at this stage)
| Trigger | Description |
|---|---|
| Yield miss | Fewer deposits than projected |
| Melt | Admitted students who deposited but later withdraw (summer melt = 2-5%) |
| Gap filling | Specific demographic, geographic, or academic program needs |
| Financial | Revenue shortfall if class is too small |
Waitlisting is preferable to rejection for yield protection — it keeps interested students engaged
Some colleges use "soft denials" via waitlist to manage applicant expectations
Waitlist size is intentionally large to ensure adequate pool when activated
Most colleges do NOT rank their waitlist, maintaining flexibility
The SFFA v. Harvard trial revealed precise data on how "hooks" (non-academic advantages) affect admissions:
| Category | Admit Rate | vs. Non-Hooked Baseline (~5-6%) | Effective Multiplier |
|---|---|---|---|
| Recruited Athletes | ~86% | 14-17x baseline | Strongest hook |
| Children of Faculty/Staff | ~47% | 8-9x baseline | Very strong |
| Dean's Interest List (donors) | ~42% | 7-8x baseline | Very strong |
| Legacy | ~34% | 5.7x baseline | Strong |
| First-Generation | Moderate boost | ~1.3-1.5x baseline | Modest |
Research across three private universities found:
Recruited athlete advantage = ~200 SAT points equivalent
Legacy advantage = ~160 SAT points equivalent
Underrepresented minority advantage (pre-SFFA ruling) = ~230 SAT points equivalent
Dean's Interest List = comparable to legacy or higher
43% of white admits at Harvard are ALDC
<16% of Black, Asian, Hispanic admits are ALDC
Recruited athletes, legacies, and dean's interest list applicants are 68%+ white
Non-ALDC applicants are <41% white
Three-quarters of white ALDC admits would have been rejected without their hook
The admissions advantage for athletes and legacies at Harvard increased over 2000-2017:
Admit rate ratio (ALDC vs non-ALDC) grew from 4:1 to 9:1
This suggests hooks have become MORE important, not less, as applicant pools have grown
The balancing act operates through class-shaping at the full committee level:
The post-SFFA (2023) landscape eliminated explicit racial consideration, increasing pressure on other hooks and socioeconomic proxies.
Based on the research above, here is a pseudocode model for how the college admissions agent should evaluate applications:
function evaluateApplication(app, college, round):
// Step 1: Compute component ratings (1-6 scale, 1=best)
academic_rating = computeAcademicRating(app.gpa, app.sat, app.courseRigor, app.schoolStrength)
ec_rating = computeECRating(app.ecTier, app.ecDepth, app.ecDistinction)
personal_rating = computePersonalRating(app.essayScore, app.recommendations, app.interviewScore)
athletic_rating = computeAthleticRating(app.athleteStatus, app.sportLevel)
// Step 2: Compute overall score (weighted average, lower = better)
overall = (academic_rating * 0.40) +
(ec_rating * 0.25) +
(personal_rating * 0.25) +
(athletic_rating * 0.10)
// Step 3: Apply hook multipliers (reduce score = improve chances)
hook_factor = 1.0
if app.isRecruitedAthlete: hook_factor = min(hook_factor, 0.30) // ~86% admit → near-certain
if app.isDonorInterest: hook_factor = min(hook_factor, 0.40) // ~42% admit
if app.isLegacy: hook_factor = min(hook_factor, 0.55) // ~34% admit
if app.isFirstGen: hook_factor = min(hook_factor, 0.80) // modest boost
if app.isFacultyChild: hook_factor = min(hook_factor, 0.45) // ~47% admit
adjusted_score = overall * hook_factor
// Step 4: Apply round multiplier (ED gets boost)
round_multiplier = getRoundMultiplier(round, college)
// ED: 0.70 (2-3x boost via lower threshold)
// EA: 0.85 (modest boost)
// EDII: 0.75 (strong boost, similar to ED)
// RD: 1.00 (baseline)
adjusted_score = adjusted_score * round_multiplier
// Step 5: Add randomness (±15-25% to model reader subjectivity)
noise = uniform(-0.25, 0.25) * adjusted_score
final_score = adjusted_score + noise
// Step 6: Admission decision
admit_threshold = college.getAdmitThreshold(round)
// threshold is calibrated so that:
// total_admits * expected_yield ≈ target_class_size
// accounts for round-specific yield (ED=100%, RD=yield_rate)
if final_score <= admit_threshold:
return ADMIT
elif final_score <= admit_threshold * 1.3:
return WAITLIST
else:
return DENY
function computeAdmitThreshold(college, round):
// How many seats remain for this round?
remaining_seats = college.targetClassSize - college.committedStudents
// Expected yield for this round
yield = getExpectedYield(college, round)
// ED/EDII: 1.0 (binding)
// EA/REA: 0.30-0.50 (non-binding, many cross-admits)
// RD: college.baseYieldRate (0.35-0.84 depending on tier)
// How many to admit this round
admits_target = remaining_seats / yield
// Over-admit buffer (2-5% to hedge yield uncertainty)
admits_target = admits_target * (1 + college.overAdmitBuffer)
// Set threshold so top N applicants (by score) get admitted
// This is done by sorting all applicants and finding the score cutoff
return scoreAtPercentile(applicantPool, admits_target)
function processWaitlist(college):
// After May 1 deposit deadline
deposits = countDeposits(college)
shortfall = college.targetClassSize - deposits
if shortfall <= 0:
return // class is full, no waitlist action
// Account for expected summer melt (2-5%)
expected_melt = deposits * college.meltRate
total_need = shortfall + expected_melt
// Select from waitlist holistically
waitlist_pool = college.waitlistedStudents
// Score waitlist candidates with emphasis on:
// 1. Gap-filling (needed majors, demographics, geography)
// 2. Financial profile (full-pay preferred if budget tight)
// 3. Original application strength
// 4. Demonstrated continued interest (LOCI letters)
for candidate in waitlist_pool.sortedByNeed(college.classProfile):
if total_need <= 0: break
admit(candidate)
total_need -= 1
function shapeClass(college, admitPool):
// Full committee class-shaping pass
// Ensure diversity targets are met within admitted pool
constraints = {
recruited_athletes: max 200,
legacy_admits: max 150,
geographic_spread: min 45 states,
international: 10-15%,
first_gen: 15-20%,
full_pay: 50-55% // financial sustainability
}
// If any constraint is violated, adjust thresholds:
// - Tighten threshold for over-represented groups
// - Loosen threshold for under-represented groups
// - But never below academic floor
academic_floor = 3.5 // no admit with overall rating worse than 3.5
for category, limit in constraints:
if count(admitPool, category) > limit:
raise_threshold_for(category)
elif count(admitPool, category) < limit:
lower_threshold_for(category, floor=academic_floor)
Academic rating is necessary but not sufficient: Above a threshold, academics barely differentiate candidates. The real selection happens on ECs, personal qualities, and hooks.
Hooks are multiplicative, not additive: A recruited athlete with average academics is more likely to be admitted than a non-hooked applicant with perfect scores. The simulation should model this as a multiplier on admission probability, not a score boost.
Round matters enormously: ED applicants face 2-3x higher acceptance rates. This is both strategic (yield guarantee) and mechanical (smaller, more self-selected pool).
Reader noise is real: The ±25% randomness in the current simulation is well-calibrated. Real admissions involves significant reader subjectivity, with different readers giving the same application meaningfully different ratings.
Class-shaping is a constraint optimization: The final committee isn't just picking the "best" students — it's assembling a class that meets institutional goals across multiple dimensions simultaneously.
Waitlist is yield-driven, not merit-driven: Students are selected from the waitlist based on what the class needs, not who scored highest. The simulation should model waitlist decisions based on gap-filling logic.