2024–25 reports · updated June 2026
New Jersey's annual "report card" for every public school and district: state test results, student growth, graduation, attendance, discipline, college-and-career readiness, and staffing. We use four of those measures on school and district profiles — and this page is the manual for how each one works and how we chart it.
The data comes from the New Jersey School Performance Reports. The browsable site is at nj.gov/education/spr; the underlying downloadable databases — one workbook of school-level data and one of district/state data per year — are linked from its download page and posted (under a slightly different path, sprreports/) back to 2011–12. We work from the 2024–25 release.
Each year's school workbook is a single large Excel file (about 330 MB) that packs roughly eighty report tabs — one per measure — keyed on the same county / district / school codes as the state's enrollment files, so it joins cleanly to everything else on this site.
The reports carry far more than this; these are the four we surface today.
| Measure | What it answers | Where it appears |
|---|---|---|
| NJSLA test scores | How students score on the state test, by level (1–5), grade, and year | Test scores module |
| Student growth | How much progress students made vs. peers who started at the same place | Test scores module (the lead) |
| Graduation rate | Share of a class that finishes within four years | Graduation module (high schools) |
| Chronic absenteeism | Share of students who miss 10% or more of school days | Chronic absenteeism module |
The New Jersey Student Learning Assessment (NJSLA) is given each spring in English language arts (grades 3–9) and math (grades 3–8, plus the high-school courses Algebra I, Geometry, and Algebra II). Every student's result falls into one of five performance levels:
| Level | Meaning |
|---|---|
| 1 | Did not yet meet expectations |
| 2 | Partially met expectations |
| 3 | Approached expectations |
| 4 | Met expectations |
| 5 | Exceeded expectations |
"Met or exceeded expectations" — the headline proficiency number — is levels 4 and 5 combined. But a single proficiency percentage hides the shape: a school where most non-proficient students sit at level 3 (just short) is in a very different place from one where they sit at level 1. So we show the full 1–5 distribution.
Each small panel is a diverging area anchored to a flat horizontal line — the proficiency boundary. Levels 4–5 (proficient) fill the area above the line; levels 1–3 fill the area below. Light shading is level 1, dark is level 5.
We label the proficient share at the first and last points, and you can hover any panel for the exact level-by-level breakdown.
Test scores are shown in two lenses, because they answer different questions:
By grade, year to year — one panel per grade, e.g. how have this school's third-graders done over the last four years? This mixes a different set of students each year (a new third-grade class annually) but tracks the grade itself.
Aggregate grade results, lined up across years — one panel per approximate class path along the diagonal of the grade-by-year grid. These are not linked student records: enrollment and the tested population can change between years, so the panel must not be read as the same students followed over time. Math paths cover grades 3–8 only, since the high-school course tests aren't a clean grade-by-grade sequence.
We never compute a single school-wide 1–5 distribution by averaging across grades. New Jersey doesn't publish one, and synthesizing it is unsafe: a privacy-suppressed grade (see caveats) silently drops out of the average, and at high schools it would mix incomparable course populations (Algebra I vs. Algebra II). Each panel is one real, published per-grade result.
One consequence to keep in mind: a school's headline proficiency reflects only the grades it tests, while the district and state figures blend all grades 3–8 plus high school. So a high school's math can read below its district's overall rate — the district number is lifted by the higher-scoring elementary grades. That's real, not a glitch.
Proficiency tracks family income closely. Growth doesn't — which is why we lead with it.
The median Student Growth Percentile (SGP) measures how much a school's students progressed in a year compared with students statewide who scored the same the year before. It runs 1–99, where 50 is a typical year of growth; New Jersey labels the result Low, Typical, or High. A school can have modest proficiency but high growth (students gaining ground fast) or high proficiency but low growth (coasting) — so growth is the closest thing to a demographic-independent answer to "is this school doing well by its students?"
The graduation module shows the four-year graduation rate — the share of a class that earns a diploma within four years of entering ninth grade — over the most recent five years, against the statewide rate.
New Jersey publishes two versions: a State calculation and a Federal adjusted-cohort rate. Only the State rate is reported across all the trend years, so that's the line we plot; where the Federal rate is available (the latest year) the caption notes it, since the two use slightly different cohort rules and can differ by a few points. Because graduation rates cluster high (often 85–95%), this is the one chart where we zoom the vertical axis off zero so the movement is legible — and in a district with a single high school we drop the redundant district line.
A student is chronically absent if they miss 10% or more of the days they're enrolled — roughly 18 days in a full school year, excused or not. It's a leading indicator of disengagement, and it rose sharply statewide after the pandemic. We plot the school's rate over time against the state, for all grade levels.
To protect student privacy, the state withholds or caps small numbers. A figure can arrive as a sentence — "Fewer than 10 students…", "There is no data available…" — or as a privacy cap, <10% or >90%, instead of an exact value. We render these honestly: a capped grade shows "withheld" rather than a made-up number, and a capped figure never silently becomes a zero.
The NJSLA was not given in spring 2020, and 2020–21 was disrupted. The current files' trend tabs therefore start at 2021–22, so the test-score and growth views run 2021–22 → 2024–25. Pre-pandemic results exist in older files but on a partly different test (PARCC), so we don't splice across that break.
For both proficiency and graduation the state publishes more than one calculation. We headline the figure New Jersey itself features on the report card (so it matches what you'd find on the state site), and note the alternates in captions rather than quietly picking a different one.
The tabs we use load into the same SQLite warehouse as the enrollment data, joined on the NJDOE county / district / school codes. Each is built straight from the published workbook — no modeling, no imputation.
| Table | From | Holds |
|---|---|---|
grad_rate | Graduation Rate Trends | 4- and 5-year rates (State + Federal), by entity, year, group |
assessment | ELA / Math Participation & Performance | school-wide % met/exceeded, per subject & year |
assessment_grade | ELA / Math Performance by Test | per grade-test Level 1–5 distribution + mean scaled score |
growth | Student Growth Trends | median SGP (ELA + Math) with the Low/Typical/High label |
absenteeism | Chronic Absenteeism Trends | % chronically absent, by entity & year |
Source data: New Jersey Department of Education, School Performance Reports, downloadable databases (nj.gov/education/spr/download), 2024–25 release.
Every dataset behind this site keeps a structured registry of its known issues — the format breaks, suppression rules, entry errors, and definitional traps we hit while building on it — so that the next person (or agent) who works with this data doesn't rediscover them the hard way. Each issue has a stable id, a machine-readable scope (which years, columns, and tables it touches), and an effect: breaks stops a pipeline, corrupts silently wrongs the numbers, misleads invites a wrong reading of right numbers, context is background you must hold to use the data responsibly. Issues marked ★ are core: read them before any use of this data. The registry is maintained in the ergo format and served in machine-readable form alongside this page — links at the end of this section.
NJ Dept. of Education, Office of Performance Reports · 2015-16 → 2024-25 (trend tabs post-COVID only — see spr/trend-tabs-post-covid-only) · source confidence A · updated 2026-07-10 · 13 known issues (1 core)
The pitfall: NJ publishes two 4-yr graduation rates — State and Federal — but only State is populated across years (27,115 of 27,201 trend rows; Federal in just 5,423, effectively one year); plotting Federal as a trend, or comparing states on it, is the classic misread.
Type: availability — applies to the whole dataset
How to spot it: 404s when constructing file URLs from the landing-page path instead of the sprreports host
Full entry, with the story and the numbers, in the served ergo doc.
Type: format — applies to years: all · tables: grad_rate, assessment, assessment_grade, absenteeism, growth · columns: CountyCode, DistrictCode, SchoolCode
How to spot it: CountyCode='13', DistrictCode='4900' — string cells with leading zeros preserved, despite the layout workbook's dictionary calling them Numeric
The misread: Coercing codes to integers strips leading zeros and silently breaks the warehouse join.
Full entry, with the story and the numbers, in the served ergo doc.
Type: format — applies to years: all · tables: grad_rate, assessment, assessment_grade, absenteeism, growth · columns: SchoolYear
How to spot it: layout workbook's Type column for SchoolYear varies by tab; every tab's actual SchoolYear cell reads as the hyphenated string, e.g. '2020-21'
The misread: Writing per-tab ingestion code that trusts each tab's declared SchoolYear type parses some tabs as numeric and others as text inconsistently; always treat SchoolYear as a string.
Full entry, with the story and the numbers, in the served ergo doc.
Type: suppression — applies to years: all · tables: grad_rate, assessment, assessment_grade, absenteeism · columns: *Rate*, *Percent*
How to spot it: value fails float() after stripping a trailing % — includes '>90%', '<10%', and prose sentences
The misread: Treating suppression NULLs as zero. Capped extremes also go NULL — fine for All Students (they only hit tiny subgroups), a real loss for small subgroups.
Full entry, with the story and the numbers, in the served ergo doc.
Type: measurement — applies to years: all · tables: grad_rate · columns: 4YrGraduationRate*, 5YrGraduationRate*
How to spot it: 4YrGraduationRateState_District non-empty in 27,115 of 27,201 trend rows; …Federal_District in only 5,423 (≈ one year)
The misread: Drawing the Federal rate as a trend line (it has one point), or comparing a State figure against another state's federal ACGR — NJ's State calc runs higher (SOMSD 2024-25: State 93.2% vs Federal 89.4%).
Full entry, with the story and the numbers, in the served ergo doc.
Type: format — applies to the whole dataset
How to spot it: Database_SchoolDetail.xlsx is 346,029,712 bytes (330 MB); Database_DistrictStateDetail.xlsx is 119,164,900 bytes (114 MB)
Full entry, with the story and the numbers, in the served ergo doc.
Type: availability — applies to years: 2024-25 →
How to spot it: download.js sets isNewYearFormat = year >= '2024-2025'; for those years only Database_*.xlsx is linked
The misread: Expecting a Reference Guide PDF, zip, or Access variant for 2024-25 and later — from 2024-25 on NJDOE publishes .xlsx only.
Full entry, with the story and the numbers, in the served ergo doc.
Type: suppression — applies to years: all · tables: GraduationCohortProfile · columns: NonContinuing_District, Persisting_District
How to spot it: NonContinuing_District and Persisting_District are typed Text in the layout workbook; every other GraduationCohortProfile metric column is Numeric
Full entry, with the story and the numbers, in the served ergo doc.
Type: coverage — applies to years: 2024-25 file only shows 2020-21→2024-25 (grad) / 2021-22→2024-25 (assessment, absenteeism, growth) · tables: grad_rate, assessment, assessment_grade, absenteeism, growth
How to spot it: GraduationRateTrends carries 2020-21…2024-25 (five years); ELA/MathParticipationPerformance, PerformanceByTest, and StudentGrowthTrends carry 2021-22…2024-25 (four years) in the 2024-25 file
The misread: Assuming the current file's trend tabs cover full history — pre-COVID NJSLA (2018-19 and earlier, with the no-spring-2020 testing gap) requires pulling older years' files separately; deferred in this builder.
Full entry, with the story and the numbers, in the served ergo doc.
Type: measurement — applies to years: all · tables: assessment_grade · columns: l1, l2, l3, l4, l5, proficiency, prof_str
How to spot it: a capped Algebra I test (values suppressed to '<10%'/'>90%') once inflated a home-grown school-wide aggregate by silently dropping its lowest cohort from the average
The misread: Aggregating assessment_grade's per-grade-test Level 1-5 distributions into a school-wide number instead of using NJ's own published school-wide MetExceededExpectations (table assessment) — suppression and incomparable course populations (Algebra I vs II) bias the result.
Full entry, with the story and the numbers, in the served ergo doc.
Type: universe — applies to years: all · tables: growth · entities: standalone high schools
How to spot it: growth table has zero rows for a standalone high school's own school_code; district/state context columns are still populated
The misread: Reading an absent growth row for a high school as missing or bad data — SGP is defined only for grades 4-8 by NJ's own methodology; high schools need a proficiency-only frame with no cohort lens.
Full entry, with the story and the numbers, in the served ergo doc.
Type: coverage — applies to years: all · tables: assessment_grade · rows: grade_test rows for HS course tests (Algebra I/II, Geometry, etc.)
The misread: Trying to trace a high school math cohort year-over-year the way grades 3-8 are traced — HS course tests (Algebra I/II, Geometry, etc.) aren't a clean grade+1 sequence, so students in 'Algebra I' this year aren't reliably in 'Algebra II' next year.
Full entry, with the story and the numbers, in the served ergo doc.
Type: definitional — applies to tables: assessment, assessment_grade
The misread: Reading a high school's math proficiency sitting below its district as a deficit — the district figure blends grades 3-8 with HS course tests over different populations.
Full entry, with the story and the numbers, in the served ergo doc.
Machine-readable: this page as an ergo doc · all datasets (index.json) · format: ergo · implementation: source repo
The text on this page was generated by Claude Opus 4.8, working as part of a stack of tools created by Lyra Forge.