Red Hook WatchIndependent Community Resource

ABC methodology

How activity-based cost allocation is computed for the Town of Red Hook'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 (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.
  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 Town's General Fund, fully loaded

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:

ServiceDirectPayroll shareBenefits allocOverhead allocGross fully-loadedDedicated revNet levy burden
Police$20,1220.3%$648$447$21,218$14,500
Fire protection$0$0$0
Streets, DPW & lighting$94,29911.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,60612.1%$28,297$19,525$152,428−$37,000$78,879
Culture & recreation$302,06722.4%$52,684$36,353$391,104−$19,600$253,873
Government administration$592,31853.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 FundFY24/24 drilldown (ABC view) · or browse all years on the General Fund multi-year page.

What makes the Town's allocation different

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

FundLabelPaid by
AGeneral Fund (Town-wide)All Town residents incl. Village residents
BGeneral Fund (Town-outside-villages)Town residents who don't live in a village
DAHighway — Town-wideAll Town residents incl. Village residents
DBHighway — Town-outside-villagesTown 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