Red Hook WatchIndependent Community Resource

ABC methodology

How activity-based cost allocation is computed for the Village's A General Fund budget.
What activity-based costing does

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.

The math, in plain English

For one (jurisdiction, fund, fiscal year, source) document, the allocator does this:

  1. 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.
  2. Benefits pool, allocated by payroll share.OSC 9010-series benefit lines (FICA, Medicare, workers comp, employee benefit reserve) 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. Two pension lines are exceptions, routed by which NYS retirement system actually covers the staff: PFRS(A9015, Police & Fire Retirement) is 100% police, since only sworn officers belong to it; ERS(A9010, the civilian Employees' Retirement System) is allocated on civilian payroll share only — sworn officers are in PFRS, not ERS, so charging police the full payroll share of ERS would over-allocate it. Likewise police-specific medical insurance is its own budget line, assigned 100% to police rather than pooled.
  3. 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.
  4. 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.
  5. 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.
Reconciliation invariants. The Python pipeline asserts three balance conditions, to the dollar (with a $1 floating-point tolerance): 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 Village's General Fund, fully loaded

The most recent ABC document for the Village's General Fund (Fund A) is the FY26/27 adopted budget. Top-line totals:

Total appropriation$2.65M
Total revenue$2.65M
Property-tax levy$1.47M
Total personal-services payroll$1.11M
Benefits pool (allocated by payroll share)$408K
Overhead pool (allocated by payroll share)$184K

Per-service buildup, after running the five steps above:

ServiceDirectPayroll shareBenefits allocOverhead allocGross fully-loadedDedicated revNet levy burden
Police$904,20061.6%$192,915$71,225$1,170,840−$400,856$601,339
Fire protection$171,005$173,505$135,503
Streets, DPW & lighting$422,91317.1%$95,526$50,199$571,138−$50,000$406,996
Refuse & sanitation$81,7202.1%$11,480$6,033$99,233−$73,039$20,457
Planning, zoning & building inspection$81,0002.5%$13,877$7,293$102,170−$40,000$48,553
Court$50,5003.7%$20,690$10,873$82,062−$58,977$18,029
Culture & recreation$8,400$8,400$6,560
Government administration$292,97013.1%$73,029$38,377$406,877−$153,300$198,037
Debt service$38,081$38,081$29,740

Reconciliation: appropriation balanced — yes; revenue balanced — yes; levy balanced — yes. Source bundle key: red-hook-village/FY26/27/budget_adopted/A.

Drill in: General FundFY26/27 drilldown (ABC view) · or browse all years on the General Fund multi-year page.

What makes the Village's allocation different

The Village A General Fund FY 26-27 adopted budget is the one place the pipeline departs from the pure payroll-share default. The bespoke override applies only to that single document — every other Village year, and every Town and Tivoli document, uses pure payroll-share allocation for police along with every other service.

Police bespoke override (Village FY 26-27 only)

Police is 24/7, the primary municipal-liability exposure, and the heaviest IT user in Village government. Pure payroll-share allocation understates police's draw on facility, insurance, and IT overhead. The police_cost_sharing.py analysis computed bespoke shares for the FY 26-27 budget:

  • Buildings & utilities (A1620.4 + A1620.41): 35% to police — staffed 24/7, occupies roughly that share of Village Hall floor area.
  • Unallocated insurance (A1910.4): 50% to police — primary municipal-liability exposure (use of force, vehicle pursuits, personnel claims).
  • Central data processing / IT (A1680.4): 40% to police — heaviest IT user (CAD, evidence management, body cam storage, real-time NCIC/state-system access). Police- specific software is already separately booked under A3120.4x.
  • Workers comp (A9040.81): 75% to police — police are the highest-risk Village employees by category.
  • Other benefits (retirement, FICA, Medicare, disability): payroll-share allocation, same as every other service.

The residual of each pool after police's bespoke share is split among the remaining services by their payroll share of non-police personnel — so the math still reconciles to the dollar.

The override only applies to FY 26-27 because that's the year police_costs.yaml was extracted against — the specific function-code line amounts in the override are anchored to that budget's published numbers. Future years can be re-extracted the same way; until then they fall back to payroll-share like every other service.

Why the override matters in one number

In the FY 26-27 adopted budget the bespoke shares attribute roughly $89K of overhead to police vs the ~$112K it would absorb under pure 60.7% payroll-share — a smaller overhead number, because the overhead pool sees specific line-by-line splits instead of a single weighted-average ratio. Combined with the bespoke $252,579 benefits figure (which uses the higher 75% workers-comp share), the net effect is well-documented and defensible per-line attribution rather than a single payroll-share blunt instrument.

Sources