College Admissions Decision-Making Model

Source: college_decision_model.md


College Admissions Decision-Making Model

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.


Holistic Review Process

What Gets Scored

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

Admission Rates by Overall Score

The overall rating synthesizes all components:

What "Holistic" Actually Means

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.


Committee vs. Reader Structure

The Standard Multi-Reader Pipeline

Most selective colleges use a 4-step process:

Step 1: First Read (Territory Manager)

Step 2: Second Read (Guest Reader)

Step 3: Subcommittee Review

Step 4: Full Committee / Dean Review

School-Specific Variations

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

Reader Fatigue and Bias


Yield Management via Over-Admission

The Yield Problem

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.

Yield Rates by Tier (Class of 2029 data)

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

How Colleges Calculate Over-Admit Numbers

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:

Early Decision as Yield Guarantee

ED is the primary yield management tool:

The Over-Enrollment Risk

When yield exceeds predictions:


Waitlist Management

Purpose and Scale

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.

Key Statistics

Waitlist Decision Process

  1. May 1 deposit deadline passes; colleges count deposits
  2. Gap analysis: compare deposits to target enrollment
  3. If shortfall exists: activate waitlist
  4. Selection from waitlist is holistic, not ranked:

  5. Colleges look for students who fill specific gaps in the class profile

  6. Needed majors (e.g., engineering slots unfilled)

  7. Geographic diversity gaps

  8. Demographic balance

  9. Financial profile (full-pay students may be preferred at this stage)

  10. Timing: waitlist admits typically notified mid-May through July, sometimes as late as August
  11. Multiple rounds may occur as waitlist admits themselves decline

What Triggers Waitlist Activation

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

Waitlist from the College's Strategic Perspective


Hook Weighting and Balance

ALDC Categories at Harvard (Trial Data)

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

SAT-Equivalent Advantages

Research across three private universities found:

ALDC Composition

Trend Over Time

The admissions advantage for athletes and legacies at Harvard increased over 2000-2017:

How Colleges Balance Hooks vs. Merit vs. Diversity

The balancing act operates through class-shaping at the full committee level:

  1. Academic floor: all admits must meet a minimum academic threshold (roughly top 10-15% of applicant pool)
  2. Hook categories have institutional caps: e.g., ~200 recruited athletes, ~150 legacies per class
  3. Diversity goals set target ranges for racial/ethnic, geographic, socioeconomic composition
  4. "Lopsided" admits: students with extreme strength in one area (e.g., research prodigy, world-class musician) may be admitted despite weaker overall profiles
  5. At the margins, hooks and diversity considerations decide between otherwise similar candidates

The post-SFFA (2023) landscape eliminated explicit racial consideration, increasing pressure on other hooks and socioeconomic proxies.


Agent Decision Algorithm Pseudocode

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)

Key Modeling Insights for the Simulation

  1. Academic rating is necessary but not sufficient: Above a threshold, academics barely differentiate candidates. The real selection happens on ECs, personal qualities, and hooks.

  2. 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.

  3. Round matters enormously: ED applicants face 2-3x higher acceptance rates. This is both strategic (yield guarantee) and mechanical (smaller, more self-selected pool).

  4. 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.

  5. 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.

  6. 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.


Sources