2020–21 through 2025–26 · six annual files · 679 districts
Every year New Jersey publishes how much certificated staff each district reported — teachers, administrators, supervisors and special-service staff — and, for each of those four roles, how that staff divides by race and by sex. It is one of the few public files that describes the adults in a school system rather than the children. It is also a file where the empty-looking cells mean something specific, and usually not what they look like.
New Jersey’s Department of Education posts an annual certificated staff file. A certificated staff member is one who holds a New Jersey educator certificate; the file sorts them into four roles, and the role names below are the publisher’s own.
| Role | What it covers | 2025–26 districts reporting 20+ FTE |
|---|---|---|
| Teacher | Classroom teachers. | 595 of 663 |
| Special Service | Certificated specialists — counsellors, child-study team members, nurses, therapists. | 306 of 663 |
| Administrators | Principals, assistant principals, central-office administrators. | 92 of 663 |
| Supervisors/Coordinators | Supervisors and programme coordinators. Many districts have none at all. | 17 of 663 |
Each role row carries a total FTE, seven race categories and two sex categories — each as both a count of FTE and a percentage — plus a non-binary percentage. Twenty published measures per role, per district, per year, for 679 districts across six school years. We hold the whole district slice: 320,880 values.
We show it on district profiles, in the section Who works in this district. We do not show it on school profiles. The file has school rows, but only 264 school codes across 677 districts — nowhere near school coverage — so a school-level rendering would be a coverage claim the data does not support.
Every number in this file is a full-time equivalent: a measure of reported workload, not a count of employees. A district reporting 730.2 FTE of certificated staff does not have 730 employees. Two half-time teachers are 1.0 FTE and two people; one teacher splitting a year between two districts appears as a fraction in each.
This is the easiest way to get this file wrong, and it runs in both directions.
Across the whole release of 1,524,240 values, 909,830 are an exact published zero — the literal 0, meaning the district reported no staff FTE in that group and that role — and 76,212 are withheld, carrying the literal <.1 and no number at all. There is no third empty state.
The proportions are startling. Of the 16,044 district-level American Indian FTE cells, 15,396 are an exact zero and none is withheld. A tool that renders those as “no data” has reversed the finding: the district answered the question, and the answer was none.
| Metric (district level, all six years) | Reported | Published zero | Withheld |
|---|---|---|---|
race.white.fte | 14,666 | 1,378 | 0 |
gender.female.fte | 14,567 | 1,477 | 0 |
gender.male.fte | 12,179 | 3,865 | 0 |
race.hispanic.fte | 7,057 | 8,987 | 0 |
race.black.fte | 6,023 | 10,021 | 0 |
race.asian.fte | 4,283 | 11,761 | 0 |
race.two-or-more-races.fte | 1,131 | 14,913 | 0 |
race.hawaiian-native.fte | 856 | 15,188 | 0 |
race.american-indian.fte | 648 | 15,396 | 0 |
gender.nonbinary.percent | 0 | 0 | 16,044 |
One more wrinkle, in the opposite direction. The publisher’s own percentage columns are rounded, and eight district cells carry a reported non-zero FTE beside a percentage rounded down to an exact 0.0 — six American Indian, two Two or More Races. Build a composition out of the percentage columns and the smallest reported groups silently vanish. Every share we print is computed from the FTE columns, which add up: the seven race FTE values sum to the role total within 0.1 in all 16,044 district-role cells.
New Jersey’s reporting schema has a non-binary category. Two things are true about it, and both are findings rather than gaps.
First, the category is published as a percentage with no count behind it. Every other category in the file — all seven race categories, female, male — carries both an FTE and a percentage. Non-binary carries a percentage alone. There is no gender.nonbinary.fte metric in the release at all.
Second, that percentage has never once been published. All 76,212 of its cells, at every reporting level, in every one of the six years, for every role, are the literal <.1 with no number. Sixteen thousand and forty-four of those are district cells. Not one district, in any role, in any year, has a published non-binary value.
The race columns reconcile. The sex columns do not, always: in 421 of the 16,044 district-role cells, female FTE plus male FTE does not equal the published total FTE.
It is tempting to read that gap as the withheld non-binary count. It is not, and the data says so plainly. Most of the residuals are rounding — 295 of the 421 are ±0.1. And 181 of them are negative: female plus male exceeds the publisher’s own total, which no count of a third category can explain. The largest is −54.0 against a published total of 1.0.
We therefore publish neither the residual nor anything derived from it. The two published sex values appear with their shares of the published role total, and the gap is left as what it is — an inconsistency in the source.
Certificated staff are not the staff. The paraprofessionals, instructional aides, clerical staff, service workers and skilled trades who make up a large share of the adults a child meets in a school day are in a separate New Jersey file — and that file has exactly two measures, role-fte and total-fte. It carries no race and no sex at all, at any level, in any year.
So a composition reading of a district’s staff is structurally a reading of its certificated half. That is a limit of the state’s collection, not of this site, and we name it on the profile rather than leave it to be inferred.
New Jersey has a lot of very small districts, and this file shows it. Across all 16,044 district-role cells the median total is 10.8 FTE. 5,848 cells are at or below 5.0 FTE. 1,022 are an exact zero — most of them Supervisors/Coordinators, a role many districts simply do not have.
At that size a percentage is arithmetic wearing the clothes of a finding. A role with 3.0 FTE produces shares of 33% and 67%, moves by a third on a single hire, and in a small district identifies individuals quickly.
The file arrives as an exact, offline, byte-pinned Aquifer release — this site downloads and parses nothing. From it we project the whole district-level slice into one table keyed on school year, district code, staff role and metric: 320,880 rows, carrying every published number, every publisher literal and every value state alongside it. Withheld cells are stored with no number, never as a zero.
The projection refuses to install if any of the populations above has moved: the per-metric reported and zero counts, the non-binary disclosure (16,044 cells, 16,044 withheld, 0 published, one distinct literal), and the race and sex reconciliation counts. If New Jersey ever publishes a non-binary value, the build fails rather than quietly contradicting the sentence on the profile.
The district join is by exact zero-padded district code only; names are never a fallback. Five districts in the file have no matching profile and render nothing.
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.
New Jersey Department of Education · 1999-2000 through 2025-26 · source confidence A · updated 2026-08-03 · 16 known issues (4 core)
The pitfall: The record runs twenty-seven editions and breaks three times inside it, so no series may be drawn straight across it and an empty-looking demographic cell is almost always an exact published zero rather than a suppression.
Type: definitional — applies to the whole dataset
How to spot it: The publisher reports numeric FTE by role; no person identifier, employee count, salary, payroll, cost, quality, or need field is present in the district role projection.
The misread: Calling 730.2 FTE 730 employees, adding it to UFB salary dollars as a payroll rate, or treating a change as evidence of service quality or staffing adequacy.
Full entry, with the story and the numbers, in the served ergo doc.
Type: measurement — applies to years: 2020-21 through 2025-26 · tables: staffing_certificated_district_role
How to spot it: District source rows contain exactly Administrators, Special Service, Supervisors/Coordinators, and Teacher; there is no district value with a separate total role.
The misread: Presenting the four-role sum as a separately published NJDOE district total or combining it with the independent non-certificated reported total.
Full entry, with the story and the numbers, in the served ergo doc.
Type: suppression — applies to years: 2020-21 through 2025-26 · tables: staffing_certificated_district_composition
How to spot it: Release-wide, 909,830 of 1,524,240 values are value_state exact-reconciliation-zero with reported_literal '0' and 76,212 are value_state suppressed with reported_literal '<.1'; there is no third empty state. At district level 15,396 of the 16,044 american-indian FTE cells are an exact 0.
The misread: Rendering an exact 0 as 'not reported' or 'no data', which reverses the finding: the district reported no staff FTE in that group and role. Or the mirror error, rendering a withheld <.1 as a zero.
Instead: Carry numeric_value as NULL only where the publisher withheld the value, keep the reported_literal beside it, and give the two states different words on the page.
Full entry, with the story and the numbers, in the served ergo doc.
Type: coverage — applies to years: 2020-21 through 2025-26 · tables: staffing_certificated_district_composition · columns: staff.certificated.gender.nonbinary.percent
How to spot it: The release has 20 metric definitions: seven race categories and two gender categories each carry a .fte and a .percent, and gender.nonbinary carries a .percent alone. All 76,212 of its cells across all reporting levels — 16,044 at district level — are value_state suppressed with reported_literal '<.1' and a NULL numeric value. Not one district, role or year has a published value.
The misread: Dropping the category from a rendering because it is empty, which reads as 'there are none'; or reconstructing a value from total-fte minus female-fte minus male-fte and presenting the residual as a non-binary count.
Instead: Show the category, say that New Jersey published no value for it in any district, any role, or any year, and do not derive one.
Full entry, with the story and the numbers, in the served ergo doc.
Type: measurement — applies to years: 2020-21 through 2025-26 · tables: staffing_certificated_district_composition
How to spot it: Grouping the composition mart by (school_year, district_code, staff_role): the seven race FTE values sum to total-fte in all but 108 cells, off by at most 0.1. The two sex FTE values leave a non-zero residual in 421 cells. 295 of those residuals are +/-0.1; 181 are NEGATIVE, meaning female plus male exceeds the publisher's own total; the largest absolute residual is -54.0 against a published total of 1.0 (district 4270, Teacher, 2022-23).
The misread: Publishing total-fte minus female-fte minus male-fte as a non-binary count, an 'other' category, or an 'unreported' band. The residual is a mixture of publisher rounding and at least one gross publisher inconsistency, and in a small district a derived whole-number residual would identify individuals the publisher chose to withhold.
Instead: Show the two published sex values and their shares of the published role total, say that they do not always add to it, and derive nothing from the gap.
Full entry, with the story and the numbers, in the served ergo doc.
Type: coding — applies to years: 2020-21 through 2025-26 · tables: staffing_certificated_district_composition · columns: staff.certificated.race.american-indian.percent, staff.certificated.race.two-or-more-races.percent
How to spot it: At district level, race.american-indian.fte has 648 reported values but race.american-indian.percent only 642; race.two-or-more-races.fte has 1,131 against 1,129. The six and two extra cells are published zeros in the percent column standing over a reported non-zero FTE.
The misread: Building a composition from the publisher's own .percent metrics, which silently drops the smallest reported groups to zero and leaves the shares not summing to 100.
Instead: Compute every share from the .fte metrics, which are additive: the seven race FTE values sum to the role's total FTE within 0.1 in all 16,044 district-role cells.
Full entry, with the story and the numbers, in the served ergo doc.
Type: coverage — applies to the whole dataset
How to spot it: nj-noncertificated-staff.sqlite has exactly two metric definitions, staff.noncertificated.role-fte and staff.noncertificated.total-fte. There is no race, ethnicity or sex metric at any reporting level or in any year.
The misread: Presenting certificated staff composition as 'the district's staff', which excludes a large share of the adults a child encounters and does so invisibly.
Instead: Name the exclusion on the surface: this is the certificated part of the staff, and New Jersey collects no demographics for the rest.
Full entry, with the story and the numbers, in the served ergo doc.
Type: measurement — applies to years: 2020-21 through 2025-26 · tables: staffing_certificated_district_composition
How to spot it: Across the 16,044 district-role cells the median total FTE is 10.8; 5,848 are at or below 5.0 and 1,022 are an exact zero. In 2025-26 only 17 of 663 districts report 20 or more Supervisors/Coordinators FTE, and 37 districts report under 20 FTE of certificated staff in total.
The misread: Printing '33% of Supervisors/Coordinators FTE' where the role is 3.0 FTE, which is one person-equivalent rendered as a statistic and, in a small district, an identification.
Instead: State an FTE floor, print the reported counts below it and no share, and say which rows were floored and why.
Full entry, with the story and the numbers, in the served ergo doc.
Type: measurement — applies to years: 2007-08, 2008-09 · tables: staffing_certificated_edition, staffing_certificated_district_history · columns: count_unit, total_value
How to spot it: Every value through 2007-08 is an integer; from 2008-09 they are fractional. Statewide administrators read 9,187 whole people in 2007-08 and 9,026.8 FTE in 2008-09, a 1.7 percent fall with no hiring change behind it.
The misread: Plotting a staff count straight across 2008-09 and reading the step as a cut. The step is the publisher changing what one staff member is worth.
Instead: Draw the record as separate stretches either side of 2008-09, label each stretch with its own unit, and never interpolate or index across the boundary.
Full entry, with the story and the numbers, in the served ergo doc.
Type: definitional — applies to years: 2007-08, 2008-09, 2017-18, 2018-19 · tables: staffing_certificated_edition · columns: race_scheme, race_vocabulary, seventh_label
How to spot it: editions.race_scheme takes four values across twenty-seven editions: five-category-combined through 2007-08, seven-category-with-other through 2017-18, seven-category-with-two-or-more in 2018-19, and the modern seven from 2019-20. The 2018-19 workbook renames the OTHER column to 'Two or More Races' at the same column position and says nowhere whether the category changed.
The misread: Carrying one band across a rename — reading the OTHER column and the Two or More Races column as one series — which asserts that the same people are in both. NJDOE has never said that.
Instead: Draw a stretch per vocabulary and label the seventh band with that stretch's own published name. Through 2007-08 also label the fourth band 'Asian / Pacific Isl.' and the sixth 'American Indian / Alaskan': those categories were collected combined, so no chart may imply they were ever apart.
Full entry, with the story and the numbers, in the served ergo doc.
Type: suppression — applies to years: 2016-17, 2017-18, 2018-19 · tables: staffing_certificated_edition, staffing_certificated_district_role_history · columns: role_split_state, role_split_districts
How to spot it: At district grain in 2016-17, 2017-18 and 2018-19 the thinnest position reaches 1 district out of 671 with a both-sexes row, against 96 percent or better in every earlier edition. Each position still prints a MALE row and a FEMALE row; only the all-positions line gets a TOTAL.
The misread: Adding the male and female rows to recover a role total. That produces a figure NJDOE never printed, in the same editions where NJDOE also omits a gender row rather than printing a zero — so the sum is short by every unprinted zero and there is no way to tell which.
Instead: Record the edition as not-published-at-this-grain, emit no role row for it, and say so where a reader would otherwise expect one.
Full entry, with the story and the numbers, in the served ergo doc.
Type: entry — applies to years: 2004-05, 2005-06, 2006-07 · tables: staffing_certificated_district_role_history
How to spot it: Statewide teachers read 90,904 in 2005-06 against 109,832 in 2004-05 and 110,964 in 2006-07; special services reads 37,176 against 16,647 and 17,868. The all-positions total is continuous at 136,948.
The misread: Reading 2005-06 as a year New Jersey lost nineteen thousand teachers and gained twenty thousand special-service staff, or including it in any role-mix comparison.
Instead: Use the all-positions total across that year, which is comparable, and use no role figure from it. The defect is the publisher's and is retained exactly as printed.
Full entry, with the story and the numbers, in the served ergo doc.
Type: identity — applies to tables: staffing_certificated_district_history · columns: identity_match_state
How to spot it: The pinned organization-identity release carries name assertions effective 2020-08-11 onward and holds no evidence about 1999. District-code match stays above 90 percent throughout the archive, but comparing the printed school name against the current spine's name, roughly 8 percent disagree in 1999-2000 and 6 percent in 2018-19.
The misread: Reading a high match rate on the oldest editions as confidence that the 1999 row and today's district describe the same thing, and drawing a twenty-seven-year trend for one entity without saying so.
Instead: Surface the caution where a reader meets the oldest points, and describe the match as custody of a code rather than continuity of a place.
Full entry, with the story and the numbers, in the served ergo doc.
Type: definitional — applies to the whole dataset
How to spot it: The definition appears on the 2019-20 workbook's 'Introduction and Changes' sheet and nowhere else in the collection, back to 1999-2000: 'The report represents the number of Staff on the fifteenth school day in October each year.' No edition from 2020-21 on repeats it, and nothing in the values reveals it.
The misread: Reading a school year's figure as everyone who worked there that year, or as an average staffing level. A teacher hired in November, or gone in May, is either wholly in it or wholly out of it.
Instead: Describe it as staff on the fifteenth school day in October of that school year, and read a year-over-year change as a change between two October days. Quote the sentence rather than restating it, because there is no second statement to check it against.
Full entry, with the story and the numbers, in the served ergo doc.
Type: coding — applies to tables: staffing_certificated_district_role_history · columns: staff_role, staff_role_published
How to spot it: The archive prints SUPPSERV in 1999-2000 and 2001-02 and SPECSERV in the rest; the modern releases print the singular. The statewide series runs 13,745 / 14,374 / 15,188 / 15,626 across the switches with no break, so it is one position spelled several ways.
The misread: Grouping on the published literal and producing two or three roles where the publisher has one.
Instead: Conform to one role key and keep the published spelling beside it in staff_role_published.
Full entry, with the story and the numbers, in the served ergo doc.
Type: coding — applies to years: 2019-20, 2020-21 · tables: staffing_certificated_district_composition, staffing_certificated_district_role
How to spot it: 2019-20 heads its percentage columns Wh_Pct / Bl_Pct / Min Pct in the archive's idiom and its seventh race column Multi; from 2020-21 they read %White / %Black / Two or More Races, the minority roll-up is dropped and a non-binary percentage appears. The presentation break — four level sheets, a fourth position, the end of the race-by-gender cross — is one edition earlier, and NJDOE declares it on that edition's own sheet.
The misread: Filing 2019-20 as either the last archive edition or the first modern one and reading a measure straight across the seam. It is both: modern presentation, archive vocabulary, and each half changes in a different year.
Instead: Put the era boundary where the publisher put it, at 2019-20, and scope any mart keyed on the modern metric set to 2020-21 onward rather than inventing states for the metrics 2019-20 does not publish.
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 5, working as part of a stack of tools created by Lyra Forge.