NJ School Data
← Data library
Data explainer

NJDOE certificated staff

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.

1 · The source

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.

RoleWhat it covers2025–26 districts reporting 20+ FTE
TeacherClassroom teachers.595 of 663
Special ServiceCertificated specialists — counsellors, child-study team members, nurses, therapists.306 of 663
AdministratorsPrincipals, assistant principals, central-office administrators.92 of 663
Supervisors/CoordinatorsSupervisors 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.

2 · FTE is workload, not people

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 matters most where the language is most tempting. “37% of teacher FTE is Black” is what the file supports. “37% of teachers are Black” is a different claim about a different quantity, and this file cannot settle it. There is no person identifier here, no headcount, no salary and no payroll — and nothing in it speaks to staffing adequacy, quality, effectiveness or need.

3 · A zero and a blank are different claims

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)ReportedPublished zeroWithheld
race.white.fte14,6661,3780
gender.female.fte14,5671,4770
gender.male.fte12,1793,8650
race.hispanic.fte7,0578,9870
race.black.fte6,02310,0210
race.asian.fte4,28311,7610
race.two-or-more-races.fte1,13114,9130
race.hawaiian-native.fte85615,1880
race.american-indian.fte64815,3960
gender.nonbinary.percent0016,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.

4 · The category with no published value

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.

So the honest rendering shows the category and says so. Dropping the row because it is empty would read as “there are none,” which is a claim about people this file does not make. Printing something in it would be inventing a number the state withheld.

5 · Where the sex rows don’t add up

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.

6 · Who is not in this file

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.

7 · Small districts, and the share floor

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.

So the district profile applies a floor: below 20.0 FTE in a role it prints the reported counts and no shares, and charts no bar. Twenty FTE is the level at which one full-time equivalent moves a share by five points, so nothing finer than that is a real reading. This is our editorial threshold, not the state’s rule — NJDOE publishes every one of these values, and you can read them all in the tables on the profile whether or not a percentage sits beside them.

8 · What we built

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.

The issue registry

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.

fte-is-not-headcount-or-payroll [misleads · open] Certificated FTE is fractional reported workload, not employee headcount, payroll, salary cost, effectiveness, quality, or need

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.

district-total-is-derived [misleads · mitigated] The district release has four certificated role rows but no authoritative district-total row

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.

published-zero-is-not-a-suppression [corrupts · mitigated] A blank-looking demographic cell is an exact published zero (literal 0), not a withheld value; the only withheld cells in the release carry the literal <.1

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.

nonbinary-is-never-published [misleads · mitigated] staff.certificated.gender.nonbinary.percent is a percentage with no count metric behind it, and it is withheld in every district, every role and every year

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.

sex-fte-does-not-reconcile-to-total [misleads · mitigated] The two published sex FTE values do not sum to the published total FTE in 421 of 16,044 district-role cells, and the residual is not a recoverable non-binary count

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.

percent-column-rounds-a-reported-fte-to-zero [misleads · mitigated] Eight district cells carry a reported non-zero FTE and a percent the publisher rounded to an exact 0.0, so the two columns disagree about whether anyone is there

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.

noncertificated-has-no-race-or-sex [misleads · mitigated] The non-certificated release carries no demographic metric, so paraprofessionals, aides, clerical and service staff are absent from any staff-composition reading

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.

small-denominator-share-floor [misleads · mitigated] Half of all district-role cells report 10.8 FTE or less, where a single hire moves a share by ten points or more

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.

headcount-becomes-fte [corrupts · mitigated] Counts through 2007-08 are whole staff and counts from 2008-09 are fractional FTE

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.

race-vocabulary-changes-three-times [misleads · mitigated] Five categories, then seven with an OTHER, then OTHER renamed Two or More Races in place

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.

role-split-is-absent-from-2016-17 [corrupts · mitigated] Three editions print a both-sexes row for the all-positions line only

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.

2005-06-position-split [corrupts · open] The 2005-06 teacher and special-services split is not comparable with its neighbours

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.

identity-spine-is-a-current-snapshot [misleads · mitigated] A matched 1999 record confirms the code exists today, not that it is the same district

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.

staff-counted-on-one-october-day [context · open] Each annual figure is a single-day snapshot, stated in exactly one edition of twenty-seven

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.

special-services-is-spelled-two-ways [breaks · mitigated] The archive says Special Services and the modern releases say Special Service

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.

presentation-and-vocabulary-break-one-edition-apart [misleads · mitigated] 2019-20 is laid out like the modern editions but named like the archive ones

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.

Changelog

  • — AQ-060 consumer page created with the exact refresh-2 pin, district-role mart receipt, two independent staffing-family boundary, exact served coverage, and issues for FTE semantics and the derived certificated district total.
  • — Widened the district projection from one metric to the whole district slice (16,044 to 320,880 cells) so the race and sex composition behind a district's certificated staff reaches the consumer warehouse; the three pre-existing tables and their receipts are byte-identical. Added fail-closed expectations on per-metric value states, the non-binary disclosure, and the race/sex reconciliation. Shipped the district-profile module and served this page at /data/certificated-staff/, and registered the six issues a representation surface has to get right.
  • — Moved the certificated pin to nj-certificated-staff-aq060-2019-20-move and added a second exact pin on nj-certificated-staff-archive-2019-20-move, widening the consumer record from six editions to the whole published twenty-seven, 1999-2000 through 2025-26. Projected an edition register carrying each edition's counting unit, race vocabulary, total basis and role-split state, plus a per-district series and a per-district-role series; the four pre-existing marts and their receipts are byte-identical, and the two certificated ones are deliberately still scoped to 2020-21 onward because that is where the column vocabulary breaks. Shipped the twenty-seven-year band on district profiles with the total drawn in three stretches, the race composition drawn in three different stretches, and the role mix stated as not renderable rather than drawn. Registered the seven issues the whole record needs.

The text on this page was generated by Claude Opus 5, working as part of a stack of tools created by Lyra Forge.