Source: student_portfolio_behavior.md
Research on how students construct college application portfolios, choose application strategies, and make enrollment decisions.
| Academic Year | Apps/Applicant | YoY Change | Notes |
|---|---|---|---|
| 2013-14 | 4.63 | — | Baseline year in Common App tracking |
| 2014-15 | \~4.70 | +1.5% | |
| 2015-16 | 4.79 | +1.9% | |
| 2016-17 | 4.87 | +1.7% | |
| 2017-18 | 5.01 | +2.9% | Broke 5.0 threshold |
| 2018-19 | 5.26 | +5.0% | |
| 2019-20 | 5.39 | +2.5% | Pre-COVID baseline |
| 2020-21 | \~5.7 | +5.8% | Test-optional surge, COVID year |
| 2021-22 | 6.22 | +9.1% | Post-COVID surge continues |
| 2022-23 | \~6.41 | +3.1% | Continued growth |
| 2023-24 | 6.64 | +3.6% | +4% per Common App end-of-season |
| 2024-25 | 6.80 | +2.4% | First year total apps surpassed 10 million |
Key metrics:
46% cumulative growth in apps per applicant since 2015-16
Platform growth since 2015-16: account creators +116%, applicants +79%, total applications +161%
Proportion applying to 10+ schools roughly doubled from 8% to 17% between 2014-15 and 2023-24
The distribution is right-skewed. Most students apply to 4-7 schools, but a growing tail applies to 15-25+. High-achieving students from private/well-counseled schools drive the upper tail:
Bottom quartile: 2-4 applications
Median: \~5-6 applications
75th percentile: \~8-9 applications
90th percentile: 12-15 applications
Extreme tail: 20-30+ (heavily counseled, high-income)
| Round | Binding? | Deadline | Schools Allowed | Key Constraint |
|---|---|---|---|---|
| Early Decision (ED) | Yes | Nov 1 | 1 only | Must withdraw all other apps if admitted |
| Early Action (EA) | No | Nov 1 | Multiple | Non-binding; can apply EA to many schools |
| Restrictive Early Action (REA) | No | Nov 1 | 1 REA, but other EAs allowed at publics | Harvard, Yale, Princeton, Stanford, Notre Dame, Georgetown |
| Early Decision II (EDII) | Yes | Jan 1-15 | 1 only | Second chance for binding commitment |
| Regular Decision (RD) | No | Jan 1-15 | Unlimited | Standard round |
Binding ED provides the largest boost. Research shows:
Equally qualified students who apply ED have 20-30% higher acceptance probability than RD applicants (Avery, Fairbanks & Zeckhauser, 2003; confirmed by subsequent studies)
On average, ED applicants see a 1.6x (60%) increase in admission chances at very selective schools
Specific examples for Class of 2029:
Yale REA: 10.82% vs 4.5% overall
Brown ED: \~17.5% vs \~5% overall
Emory ED: approximately double the RD rate
Important caveats on ED rate inflation:
Recruited athletes are disproportionately concentrated in ED pools
Legacy and donor admits also cluster in ED
After removing hooked applicants, the unhooked ED advantage is more modest (\~1.3-1.5x)
ED choosers (binding):
Students with a clear first-choice school and strong match/reach profile
Higher-income families who don't need to compare financial aid offers
Students seeking the statistical admission boost
Students whose counselors coach them on strategic ED selection
Recruited athletes locking in their commitment
EA/REA choosers (non-binding):
Students who want early results without commitment
Students who need to compare financial aid packages
Students applying to REA schools (Harvard, Yale, Princeton, Stanford)
Risk-averse students hedging between multiple targets
RD-only choosers:
Students who finalize their list late or lack early counseling
Students who need maximum financial aid comparison
First-gen students with less strategic guidance
Students whose profiles are still developing (fall semester grades matter)
Selective colleges now fill 40-60% of their incoming class through early rounds (ED + EA combined), up from \~33% a decade ago. Some schools fill 50%+ through ED alone. This makes RD disproportionately competitive — fewer remaining seats with a larger applicant pool.
| Category | Acceptance Rate Threshold | Student's GPA/SAT Relative to Admits | Probability Range |
|---|---|---|---|
| Safety | >50% (or >70% for strong safety) | At/above 75th percentile | >75% expected |
| Match/Target | 25-60% | Between 25th-75th percentile | 30-70% expected |
| Reach | <25% | Below 25th percentile, OR school <15% rate | 5-25% expected |
| Far Reach | <10% (HYPSM-tier) | Any profile | <10% expected (holistic lottery) |
Standard counselor advice (for 8-10 applications):
2-3 Safety schools (genuine fits the student would attend)
3-4 Match/Target schools (core of the strategy)
2-3 Reach schools (ambitious but plausible)
0-1 Far Reach / "lottery ticket" schools
Common miscalibrations:
Well-counseled, high-income students: Use Naviance scattergrams (school-specific historical data) to position themselves. More accurate calibration. Apply to 10-15 schools with calculated risk.
Average public school students: Rely on published acceptance rates and anecdotal knowledge. Less precise calibration. Apply to 5-8 schools.
First-generation students: Under-match significantly — apply to fewer schools, skew toward safeties, under-apply to selective schools they'd be competitive at. Apply to 3-6 schools.
58% of high school seniors actively consider rankings during their search (2023 survey)
But only 5% think they know their first-choice school's specific ranking, and only 3% can identify it correctly
Rankings play a "notable but decidedly supporting role" — more of a prestige signal than a direct input
The anchoring effect is strongest at tier boundaries: schools ranked 1-20 carry a prestige halo that schools ranked 21-30 don't, despite minimal quality differences
Rankings create self-reinforcing feedback loops: higher rank → more applications → lower acceptance rate → higher perceived selectivity → higher rank
Research finding (Dearden, Grewal & Lilien, 2019): Published rankings have a significant impact on future peer assessments independent of actual changes in quality. The "prestige effect" operates through reputation persistence rather than informational content.
Students at the same high school converge on similar application lists
Social media and college counseling communities (Reddit, CollegeVine, College Confidential) amplify herding toward "hot" schools
"Yield protection" fears cause students to avoid applying to schools they think might reject them for being overqualified, creating irrational avoidance patterns
Bandwagon effect: When a school's applications spike (e.g., after a viral moment or ranking jump), the following year sees even more applications from students who heard the school was "getting more competitive"
Fear of rejection drives application inflation — "one more app is cheap insurance"
Students are more emotionally affected by a single rejection from a reach school than by multiple safeties' acceptances
This drives over-application to reach schools (emotional hedging) while under-valuing match/safety outcomes
Students disproportionately apply to schools they've heard of (name recognition >> fit)
Geographic proximity creates strong familiarity bias — most students apply to at least 1-2 in-state schools regardless of fit
Legacy and family connections create preset preference anchors
Students underweight long-term debt implications when choosing between a prestigious school with loans vs. a match school with a full ride
The prestige of acceptance "now" dominates the financial burden "later"
First-gen students show the opposite pattern — over-weight cost, under-weight quality differences
Students who apply to 15+ schools and receive 8+ acceptances report more decision anxiety than those with 3-5 acceptances
More options paradoxically reduce decision satisfaction (Schwartz paradox of choice)
75.5% of freshmen were admitted to their first-choice school (2013 CIRP), but only 56.9% enrolled at their first choice — the lowest since 1974
The gap between admission and enrollment is growing, driven by financial constraints
From CIRP Freshman Survey and related research:
| Rank | Factor | % Rating "Very Important" | Notes |
|---|---|---|---|
| 1 | Financial aid offer | \~49% | Largest single factor for enrollment |
| 2 | Overall cost of attendance | \~46% | Especially for first-gen (54% vs 44%) |
| 3 | Academic reputation / prestige | \~38% | Correlates with rankings awareness |
| 4 | Specific major / program quality | \~35% | Matters more for STEM and pre-professional |
| 5 | Location and distance from home | \~30% | First-gen want to stay closer to home |
| 6 | Campus visit / "felt right" | \~28% | Demonstrated interest and emotional fit |
| 7 | Social environment / campus culture | \~25% | Peer effects, diversity, "vibe" |
| 8 | Job placement / career outcomes | \~22% | Rising factor for recent cohorts |
| 9 | Size (small vs large) | \~18% | |
| 10 | Friends or family attending | \~12% |
Schools with the highest yield rates (students who enroll when admitted):
Harvard: \~82%
Stanford: \~80%
MIT: \~78%
Yale: \~72%
Princeton: \~70%
These high yields reflect that admitted students at these schools view them as first-choice — admissions offices have pre-selected for likely enrollees. Yield rates drop off sharply for schools outside the top 20.
function buildPortfolio(student):
// Determine number of applications based on student type
if student.counselingLevel == "elite_private":
numApps = randomNormal(mean=12, sd=3, min=8, max=25)
elif student.counselingLevel == "well_resourced":
numApps = randomNormal(mean=8, sd=2, min=5, max=15)
elif student.counselingLevel == "average_public":
numApps = randomNormal(mean=6, sd=2, min=3, max=10)
elif student.counselingLevel == "first_gen":
numApps = randomNormal(mean=4, sd=1.5, min=2, max=8)
// Build calibrated list
portfolio = []
// Step 1: Calculate personal admission probability for all colleges
for college in ALL_COLLEGES:
student.prob[college] = estimateAdmissionProb(student, college)
// Students miscalibrate: add noise to their self-estimate
student.perceivedProb[college] = student.prob[college] *
randomNormal(mean=1.15, sd=0.2) // Slightly overconfident
// Step 2: Categorize schools
safeties = [c for c in colleges if student.perceivedProb[c] > 0.70]
matches = [c for c in colleges if 0.25 < student.perceivedProb[c] <= 0.70]
reaches = [c for c in colleges if student.perceivedProb[c] <= 0.25]
// Step 3: Score each college on desirability (prestige, fit, cost)
for college in ALL_COLLEGES:
college.desirability[student] = (
0.35 * college.prestigeScore + // US News anchoring
0.25 * programFit(student, college) + // Major/interest match
0.20 * financialFit(student, college) + // Affordability
0.10 * geographicFit(student, college) + // Location preference
0.10 * socialFit(student, college) // Campus culture match
)
// Apply herding bonus for schools popular at student's high school
if college in student.highSchool.popularTargets:
college.desirability[student] *= 1.15
// Step 4: Fill portfolio with target allocation
numSafeties = max(2, floor(numApps * 0.25))
numMatches = max(2, floor(numApps * 0.40))
numReaches = numApps - numSafeties - numMatches
portfolio += topN(safeties, by=desirability, n=numSafeties)
portfolio += topN(matches, by=desirability, n=numMatches)
portfolio += topN(reaches, by=desirability, n=numReaches)
return portfolio
function chooseEarlyStrategy(student, portfolio):
// Decide ED vs EA vs REA vs RD-only
topChoice = maxBy(portfolio, desirability)
// ED decision factors
edCandidate = null
if topChoice.offersED:
if student.needsFinancialAidComparison:
// Low-income students: avoid binding ED (need to compare offers)
edCandidate = null
elif student.perceivedProb[topChoice] < 0.40:
// Use ED boost for a reach school (strategic)
edCandidate = topChoice
elif student.perceivedProb[topChoice] > 0.70:
// Don't waste ED on a safety — use it on best reach
bestReach = maxBy(reaches_in_portfolio, desirability)
if bestReach.offersED:
edCandidate = bestReach
else:
// Match school — ED makes sense for certainty
edCandidate = topChoice
// REA decision
reaCandidate = null
if any(c.offersREA for c in portfolio):
reaSchool = [c for c in portfolio if c.offersREA][0]
if reaSchool.desirability > edCandidate.desirability * 1.1:
// Prefer REA at HYPS if it's clearly the top choice
edCandidate = null
reaCandidate = reaSchool
// EA applications (non-binding, submit to multiple)
eaApps = [c for c in portfolio
if c.offersEA and c != edCandidate and c != reaCandidate]
// RD remainder
rdApps = [c for c in portfolio
if c not in [edCandidate, reaCandidate] + eaApps]
return {ED: edCandidate, REA: reaCandidate, EA: eaApps, RD: rdApps}
function ediiPivot(student, earlyResults):
if earlyResults.ED == "admitted":
return COMMIT // Binding: withdraw all other apps
if earlyResults.ED == "rejected" or earlyResults.REA == "deferred":
// Consider EDII at second-choice school
remainingSchools = [c for c in portfolio if c.offersEDII
and c not in earlyResults.rejected]
if remainingSchools:
bestEDII = maxBy(remainingSchools, desirability)
if student.perceivedProb[bestEDII] < 0.50:
return APPLY_EDII(bestEDII) // Use binding boost
return CONTINUE_TO_RD
function chooseEnrollment(student, acceptances):
if len(acceptances) == 0:
return WAITLIST_HOPE_OR_GAP_YEAR
if len(acceptances) == 1:
return acceptances[0]
// Score each acceptance
for college in acceptances:
enrollScore = (
0.30 * college.prestigeScore +
0.30 * college.netCostScore(student) + // After financial aid
0.15 * programFit(student, college) +
0.10 * college.campusVisitScore(student) + // "Felt right" factor
0.10 * geographicFit(student, college) +
0.05 * peerInfluence(student, college) // Friends attending
)
// Prestige-vs-cost tradeoff by income
if student.incomeQuartile <= 1: // Low income
enrollScore = enrollScore * 0.7 + 0.3 * college.netCostScore(student)
// Extra weight on cost
elif student.incomeQuartile >= 4: // High income
enrollScore = enrollScore * 0.7 + 0.3 * college.prestigeScore
// Extra weight on prestige
// Apply choice overload penalty if too many options
if len(acceptances) > 8:
// Slight randomness increase — decision fatigue
for college in acceptances:
enrollScore += randomUniform(-0.05, 0.05)
return maxBy(acceptances, enrollScore)
function waitlistDecision(student, waitlistOffers, currentCommitment):
for college in waitlistOffers:
if college.desirability > currentCommitment.desirability * 1.2:
// Accept waitlist spot if school is significantly preferred
student.acceptWaitlist(college)
if college.admitsFromWaitlist(student):
return SWITCH_COMMITMENT(college)
return STAY_WITH(currentCommitment)
| Parameter | Value | Source |
|---|---|---|
| Mean apps/student (2024-25) | 6.80 | Common App end-of-season 2024-25 |
| ED acceptance boost (unhooked) | 1.3-1.5x | Avery et al.; Spark Admissions |
| ED acceptance boost (all, including hooked) | 1.6-2.0x | CollegeVine; College Zoom |
| % of class filled via early rounds | 40-60% | Expert Admissions; multiple sources |
| Students attending first-choice school | \~57% | CIRP Freshman Survey |
| Financial aid as "very important" | \~49% | CIRP Freshman Survey |
| Students considering rankings | 58% | Inside Higher Ed / Art & Science Group |
| Students correctly identifying ranking | 3% | Inside Higher Ed / Art & Science Group |
| First-gen cost sensitivity gap | +10 pct points | CIRP Freshman Survey |