The money
Across 6 measured years the school budget came within 2.6% of itself in the worst of them. Underneath that, 125 of 576 line-years missed their own budget by more than a quarter — in both directions, cancelling each other out.
This page is the charted half of a written analysis. Every figure on it is recomputed from the database when the site is built — nothing is typed into a sentence — so where a count here differs from the prose in the report, this is the one that reflects the data as it now stands.
A budget and an actual are different kinds of number. Do not measure growth between them.
Every comparison on this page is one year’s budget against that same year’s spending, which is a fair question. Running from an actual in one year to a budget in another is not: the answer is part growth and part the step between the two kinds of column. That mistake once put a special education escalator 1.5 points too high on this site. The projection everywhere else here is built from budget columns only, and nothing on this page feeds it.
Each bar is every measured line in that year added up, and how far the spending landed from the budget those same documents printed beside it. 1 of 6 came in over: FY23.
| Year | Lines | Budgeted | Spent | Difference |
|---|---|---|---|---|
| FY18 | 89 | $17,502,644 | $17,496,413 | -$6,231 · 0% |
| FY19 | 108 | $19,155,686 | $19,113,746 | -$41,940 · −0.2% |
| FY20 | 111 | $19,748,349 | $19,569,555 | -$178,794 · −0.9% |
| FY22 | 119 | $20,889,212 | $20,752,649 | -$136,563 · −0.7% |
| FY23 | 106 | $20,804,700 | $20,917,634 | $112,934 · +0.5% |
| FY25 | 43 | $7,662,709 | $7,462,928 | -$199,781 · −2.6% |
FY25 rests on 43 lines against 119 in the fullest year, because only one document so far restates it line by line. Read it as a first reading, not as the year’s verdict. FY21 is missing on purpose — see below.
What this does not show
Whether an underspend is a saving. A line that came in under can be a line that was over-budgeted, or a line where something did not happen — a position left unfilled, a placement that did not start, a project deferred. These documents print two columns of dollars and nothing that tells those apart. Nobody should read a negative bar as prudence or as a cut without a second source.
Money moved between lines during the year. Districts do this with proper approvals, and a line that overspent may have been topped up legitimately. Those votes are not in these documents. At department level the town’s own ledger does show them, which is why the FY26 closeout analyses are a separate piece of work.
What anything cost. Both columns are the town’s net general-fund share, after state aid, grants, fees and revolving funds have paid theirs. A line that rose because a grant ended looks exactly like a line that got more expensive.
The same 576 line-years, counted by how far each one missed its own budget. 198 landed within two percent. 125 missed by more than a quarter, and they run both ways — which is why the totals above are so quiet. A budget that comes out flat is not necessarily a budget that was right; it can be a hundred independent misses that happened to sum to nothing.
| How far off | Line-years | Share |
|---|---|---|
| under 50%+ | 17 | 3.0% |
| 25–50% under | 48 | 8.3% |
| 10–25% under | 69 | 12.0% |
| 5–10% under | 40 | 6.9% |
| 2–5% under | 45 | 7.8% |
| within 2% | 198 | 34.4% |
| 2–5% over | 36 | 6.3% |
| 5–10% over | 32 | 5.6% |
| 10–25% over | 31 | 5.4% |
| 25–50% over | 28 | 4.9% |
| 50–100% over | 16 | 2.8% |
| over 100%+ | 16 | 2.8% |
Of the 50 function groups measured in four or more years, 1 came in under in every one of them (2330 - Paraprofessionals General Education) and none came in over in every one. The other 49 miss in both directions. 30 have drifted by more than 5 points between their first two measured years and their last two.
There is no systematic padding in this budget, and that is a negative finding worth stating plainly: the misses look like noise, not like a line being quietly over-provided year after year.
The ten biggest groups by what was budgeted against them, across every measured year.
−0.7% to +7.5% · pooled +2.6%
−1.1% to 0% · pooled −0.6%
−0.4% to +1.4% · pooled +0.6%
−9.4% to +0.3% · pooled −2.1%
−5.6% to 0% · pooled −2.7%
−2.7% to +4.6% · pooled 0% · 77.3× churn
−16% to +1.7% · pooled −5.5%
+0.3% to +7.7% · pooled +2.4%
−6.4% to −0.8% · pooled −3.7%
−61% to +21% · pooled −12%
The bar runs from the group’s worst measured year to its best. The dot is the pooled result across all of them — what a single net figure would report. Churn is gross variance over net; a high number means the years cancel. The axis is capped at +10%, so that one group running to several times that does not squash every other group into the middle; a bar that runs past the cap is drawn cut, with a chevron, and the figures under it are always the real ones.
What this does not show
Salaries across 346 line-years landed −0.8% against $68,873,714 budgeted. Everything else landed +0.2% against $34,166,827. Both are within one percent and they very nearly cancel, which is most of why the yearly totals above are as quiet as they are.
$68,873,714 budgeted · $68,320,829 spent · 346 line-years
$34,166,827 budgeted · $34,244,058 spent · 195 line-years
$2,722,759 budgeted · $2,748,038 spent · 35 line-years
What this does not show
When a child’s plan requires a school the district cannot provide, the town pays another school. It does not set the price, does not choose how many children need it, and cannot say no. Out-of-district tuition came in over budget in 3 of 6 measured years and under in the rest, with a range from −51% to +27%.
| Year | Budgeted | Spent | Miss |
|---|---|---|---|
| FY18 | $760,270 | $868,927 | +14% |
| FY19 | $754,480 | $958,495 | +27% |
| FY20 | $865,746 | $869,557 | +0.4% |
| FY22 | $818,716 | $397,233 | −51% |
| FY23 | $489,918 | $304,748 | −38% |
| FY25 | $1,164,824 | $732,298 | −37% |
Special education staffing over the same years behaves nothing like it — never further off than −5.9%:
| Year | Budgeted | Spent | Miss |
|---|---|---|---|
| FY18 | $2,434,649 | $2,450,453 | +0.6% |
| FY19 | $2,959,132 | $2,783,630 | −5.9% |
| FY20 | $3,044,407 | $3,005,557 | −1.3% |
| FY22 | $3,685,393 | $3,671,157 | −0.4% |
| FY23 | $3,498,424 | $3,387,386 | −3.2% |
| FY25 | $445,328 | $434,922 | −2.3% |
What this does not show
This is a line nobody can forecast, and that is not the same claim as a line somebody is short-changing. Which of the two it is cannot be settled from these columns.
Dollars are not children. A tuition line falling by a third does not establish that fewer children were placed, at what price, or in what setting. Placement counts are published separately, by year, and they are a different quantity from this one.
The last measured year of the special education staffing series rests on 1 line. It is consistent with the years above it and it is not independent evidence of anything.
98 lines have four or more usable years. 7 of them miss the same way in every one, and the largest averages $42,878 a year on a budget in the tens of millions. That is the shape of noise rather than of padding.
| Line | Years | Average miss | Average dollars |
|---|---|---|---|
| Special Education Transportation - System | 4 | −12% | -$42,878 |
| Maintenance/System Salaries | 5 | −7.2% | -$20,754 |
| Kindergarten Paraprofessionals | 4 | −10% | -$12,324 |
| M..S. Regular Substitutes | 5 | +60% | $6,642 |
| Athletic Equipment/Reconditioning | 4 | −50% | -$5,021 |
| H.S. General School Supplies | 5 | −21% | -$2,952 |
| Special Ed Home/Hospital Tutoring | 4 | −18% | -$1,782 |
Spent the most above budget
Spent the most below budget
Pooled across every measured year, so a single bad year and a steady drift look the same here. The ranges above separate them.
3,158 line-years were excluded from everything above, and each exclusion has a reason rather than a silence. A figure dropped without a stated reason is indistinguishable from a figure that was never published.
Every document that reports FY21 gives it an actual column, and in 116 of its 117 lines that column is identical to the budget, to the dollar — 99% of them. In the years that are used the same figure runs between 7.5% and 21%, and those are lines that genuinely do not move: fixed stipends, flat contracts.
A district does not spend its budget exactly on that many lines. That column is the budget, printed under an actual heading — most likely because the books were not closed when the document went out. FY21 was the first full COVID year, which is the obvious candidate for why. Nothing published says so, and that sentence is a hypothesis rather than a finding. The year is excluded from every comparison on this page.
332 cells in the archive are ones where two published documents state different figures for the same line, year and column. They are kept as disagreements rather than resolved: picking a winner would hide the fact that the sources differ, and nothing published says which is right. Every one of them is dropped from the comparisons above.
| Line | Year | Column | Lowest stated | Highest stated |
|---|---|---|---|---|
| Curriculum Adoption/System | FY16 | actual | $299 | $116,000 |
| Capital Improvement - Maint. | FY18 | settled | $11,000 | $106,122 |
| Curriculum Adoption/System | FY18 | actual | $40,000 | $119,257 |
| Curriculum Adoption/System | FY18 | settled | $40,000 | $119,257 |
| M.S. Guidance Counselor | FY24 | actual | $88,746 | $162,554 |
| Curriculum Adoption/System | FY17 | actual | $26,751 | $94,167 |
| Special Ed Summer Program | FY18 | actual | $0 | $43,130 |
| Special Education Transportation - System | FY20 | actual | $223,350 | $264,462 |
What this does not show
3 questions this page raises and cannot answer are answered elsewhere, each from a document the budget books do not contain. They are separate pieces of work rather than a paragraph here for that reason.
576 usable line-years across 143 lines and 59 function groups, FY18–FY25. Each line’s budget and its actual are read from the same row of the same document, which is what makes the per-line comparison sound. They do not sum back to the district’s own printed totals, which is why nothing here apportions a year’s variance between its lines.
scripts/build_variance_charts.py from sources/data/lunenburg.db — budget_figure, lps_budget_lines, variance_by_group, line_history_disagreementsGuards, stated rather than left to the reader: a year needs at least 20 usable lines to appear at all, a line needs a budget of at least $10,000, and “misses the same way every year” means every year off by more than 2% in the same direction. 210 of the 338 lines in the district’s current workbook are never measured here at all — mostly lines the older documents do not carry.