New York's OSC chart-of-accounts organizes spending by object (salaries, contractual, equipment) and by function code (1620 buildings, 3120 police, 5110 highway, etc.). It does nottell you what each operational service actually costs to run, fully loaded — because indirect cost centers (employee benefits, buildings, IT, insurance) live in their own function codes and aren't attached to the services they support.
Activity-based costing re-decomposes the same dollars into service activities. Direct lines stay with the service that incurred them. Indirect pools (benefits, overhead) get allocated to operational services using payroll share as the cost driver. The result is one fully-loaded cost per service — police, streets, planning, refuse — that includes its share of shared overhead and benefits.
The pipeline runs the same five steps for every fund in every jurisdiction; only the routing rules differ. Every dollar in the source document ends up somewhere: direct, pooled-and-allocated, or excluded with a documented reason.
For one (jurisdiction, fund, fiscal year, source) document, the allocator does this:
- Direct lines. Every appropriation line is routed to a service via
analysis/abc_routing.yaml. OSC code 3120 (police) goes to police, 5110 (streets) to transportation, 1110 (court) to court, and so on. These stay where they are — no allocation needed. - Benefits pool, allocated by payroll share.OSC 9010-series benefit lines (state retirement, FICA, workers comp, hospital/medical, employee benefit reserve) all pool into a single benefits bucket. Each service's personal-services dollars as a fraction of total fund payroll becomes its share of the pool. If police is 60% of the fund's GF payroll, police gets 60% of the benefits pool.
- Overhead pool, allocated the same way. Indirect general-government lines (1620 buildings, 1640 garage, 1680 IT, 1910 insurance, 1920 municipal dues, restricted-reserve transfers) pool into an overhead bucket, then split by payroll share. The Village FY26-27 case is the exception — see the jurisdiction-specific section below.
- Dedicated revenue offsets the gross.Revenue lines that fund a specific service (Town/Tivoli police-contract payments, refuse-tag sales, zoning fees, court fines, SRO contract, etc.) are subtracted from that service's gross fully-loaded cost.
- General non-tax revenue is distributed proportionally. Revenue not tied to a specific service (state aid, sales-tax distribution from the County, interest earnings, fund-balance draw) is split across services in proportion to their post-dedicated residual cost. What's left is the net levy burden — what the property-tax levy actually has to fund for that service.
appropriation_balanced — sum of direct + pooled + excluded = source appropriation total; revenue_balanced — sum of levy + dedicated + general + excluded revenue = source revenue total; levy_balanced — sum of net-levy-burden across services = the actual levy. If any invariant fails the build halts. Pipeline source: analysis/build_activity_based_cost_allocation.py; routing rules: analysis/abc_routing.yaml.The most recent ABC document for the Town's General Fund (Fund A) is the FY24/24 adopted budget. Top-line totals:
| Total appropriation | $1.94M |
| Total revenue | $732K |
| Property-tax levy | $6K |
| Total personal-services payroll | $768K |
| Benefits pool (allocated by payroll share) | $235K |
| Overhead pool (allocated by payroll share) | $162K |
Per-service buildup, after running the five steps above:
| Service | Direct | Payroll share | Benefits alloc | Overhead alloc | Gross fully-loaded | Dedicated rev | Net levy burden |
|---|---|---|---|---|---|---|---|
| Police | $20,122 | 0.3% | $648 | $447 | $21,218 | — | $14,500 |
| Fire protection | $0 | — | — | — | $0 | — | $0 |
| Streets, DPW & lighting | $94,299 | 11.4% | $26,706 | $18,427 | $139,432 | — | $95,283 |
| Refuse & sanitation | $0 | — | — | — | $0 | — | $0 |
| Planning, zoning & building inspection | $0 | — | — | — | $0 | −$6,152 | $-6,152 |
| Court | $104,606 | 12.1% | $28,297 | $19,525 | $152,428 | −$37,000 | $78,879 |
| Culture & recreation | $302,067 | 22.4% | $52,684 | $36,353 | $391,104 | −$19,600 | $253,873 |
| Government administration | $592,318 | 53.9% | $126,454 | $87,255 | $806,028 | −$99,600 | $482,748 |
| Debt service | $428,660 | — | — | — | $428,660 | — | $292,931 |
Reconciliation: appropriation balanced — yes; revenue balanced — yes; levy balanced — yes. Source bundle key: red-hook-town/FY24/24/budget_adopted/A.
Drill in: General Fund — FY24/24 drilldown (ABC view) · or browse all years on the General Fund multi-year page.
Unlike the Village or Tivoli — which levy one tax against one taxpayer base — the Town runs four operating funds with two distinct taxpayer bases plus two highway funds. Each fund gets its own ABC document; allocations never cross funds because mixing taxpayer pools that don't share cost would be structurally misleading.
A vs B vs DA vs DB — four funds, two taxpayer bases
| Fund | Label | Paid by |
|---|---|---|
| A | General Fund (Town-wide) | All Town residents incl. Village residents |
| B | General Fund (Town-outside-villages) | Town residents who don't live in a village |
| DA | Highway — Town-wide | All Town residents incl. Village residents |
| DB | Highway — Town-outside-villages | Town residents who don't live in a village |
A Village resident pays into A and DA, not into B or DB; a Town-outside-villages resident pays into all four. The ABC pipeline allocates inside each fund independently, so the buildup above this section is only for the A fund. The per-fund pages (linked in the source list) carry the same buildup for B, DA, DB.
Police lives in B as a $130K contract payment to the Village
The Town does not run a police department. It buys patrol service from the Village under an Intermunicipal Agreement, and the line items live in the B (town-outside-villages) fund — because Village residents are paying for Village police through their Village levy already; only Town-outside residents pay the Town side of the contract.
The Town's ABC police service therefore looks tiny by Village standards: just the contract payment plus a small sheriff / mileage / court-officer addendum, with no Town payroll, no benefits or overhead allocation, and no Town-direct police capital. It's a pass-through. The fully-loaded cost of policing residents who live outside the villages is the Village's line (allocated to Village police in the Village A fund), minus the share covered by this Town contract.
The contract's composition (base patrol, sheriff coverage, mileage, court officers) is documented in the cross-jurisdiction police cost-sharing detail issue page.
Highway (DA / DB) — separate ABC documents, distinct levies
DA carries snow removal, paving, and highway operations that benefit every Town resident; DB carries the same for the ~50 miles of road outside the villages only. State CHIPS and Multi-Modal Transportation aid show up as dedicated revenue in both, offsetting the levy share. In recent years DA's CHIPS receipts have been large enough to drive its property-tax levy to zero — the ABC view shows that explicitly as the net levy burden going to zero on transportation services in DA.
No bespoke overrides
The Town has no bespoke share overrides analogous to the Village's police_costs.yaml. Every Town document uses pure payroll-share allocation for the benefits and overhead pools. The Town's gov-admin function code mix is broader than the Village's — payroll concentrates in the Supervisor's office, Town Clerk, Assessor, and Court — so government_administration ends up with the largest payroll share of the A fund.
Sources
- externalABC pipeline: analysis/build_activity_based_cost_allocation.py— The allocator. Reads fiscal_lines.json + abc_routing.yaml, emits the per-document bundle.
- externalRouting config: analysis/abc_routing.yaml— OSC function-code → service mapping; fund metadata with per-jurisdiction taxpayer-base overrides; revenue routing.
- externalFiscal-lines bundle: site/data/fiscal_lines.json— Pipeline input: every appropriation/revenue line for every (jurisdiction, fund, fy, source) document.
- recordTown A General Fund — multi-year overview— Year-over-year totals; toggle to ABC view to see fully-loaded service trends.
- recordTown B Fund (town-outside-villages) — multi-year overview— Where the Town's $130K annual police-contract payment to the Village shows up.
- recordTown DA Highway — multi-year overview— Town-wide highway fund.
- recordTown DB Highway — multi-year overview— Town-outside-villages highway fund.