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 Tivoli's General Fund (Fund A) is the FY24/25 AFR (audited actuals). Top-line totals:
| Total appropriation | $1.23M |
| Total revenue | $1.10M |
| Property-tax levy | $530K |
| Total personal-services payroll | $262K |
| Benefits pool (allocated by payroll share) | $179K |
| Overhead pool (allocated by payroll share) | $114K |
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 | $41,537 | — | — | — | $41,537 | — | $29,128 |
| Fire protection | $113,934 | — | — | — | $113,934 | — | $79,895 |
| Streets, DPW & lighting | $93,325 | 10.8% | $19,243 | $12,278 | $124,847 | — | $87,548 |
| Refuse & sanitation | $51,728 | 7.9% | $14,112 | $9,004 | $74,844 | −$25,473 | $34,621 |
| Planning, zoning & building inspection | $182,748 | 2.3% | $4,032 | $2,573 | $189,353 | −$40,075 | $104,681 |
| Court | $26,077 | 8.3% | $14,758 | $9,417 | $50,252 | −$11,641 | $27,076 |
| Culture & recreation | $53,799 | 16.2% | $28,892 | $18,435 | $101,125 | — | $70,914 |
| Government administration | $338,794 | 54.6% | $97,595 | $62,272 | $498,662 | −$223,198 | $193,168 |
| Debt service | $18,412 | — | — | — | $18,412 | — | $12,912 |
Reconciliation: appropriation balanced — yes; revenue balanced — yes; levy balanced — yes. Source bundle key: tivoli/FY24/25/afr/A.
Drill in: General Fund — FY24/25 drilldown (ABC view) · or browse all years on the General Fund multi-year page.
Tivoli is the cleanest application of the ABC pipeline of the three jurisdictions. The default payroll-share allocation applies to every service without bespoke overrides, and there is no A/B/DA/DB fund split to manage — Tivoli is a Village, so its A General Fund covers every Tivoli operating service end-to-end.
One operating fund, one taxpayer base
Tivoli's A General Fund is paid by Village of Tivoli residents only. Capital Projects (Fund H) is bond-financed and not part of the operating ABC view. Tivoli has no enterprise funds in the bundle (water and sewer are not separate enterprise accounts in Tivoli the way they are in the Village of Red Hook), so there's no rate-funded service to allocate separately.
Police is a $23K contract payment to the Village
Tivoli has no police department of its own. It buys patrol service from the Village of Red Hook under a separate inter-municipal agreement (visible on the Village side as revenue line A2260T). Inside Tivoli's books that contract shows up as a single direct A3120 line item; ABC routes it to police as a direct cost with zero payroll-share, zero benefits, zero overhead — a clean pass-through.
The fully-loaded cost of policing Tivoli residents is the Village's line, of which only $23K is offset by Tivoli's contract. See the police cost-sharing detail page for the cross-jurisdiction view.
Fire is a contracted service, not an own-operated department
Tivoli's fire service is provided through the Tivoli Fire District (Town Fund SF, not Village fund A). The line item that appears in Tivoli's A fund as “fire” is the contractual contribution / hydrant service piece — again routed by ABC as a direct cost with no payroll-share, no benefits, no overhead.
No bespoke overrides
Tivoli has no analog of the Village's police_costs.yaml override file. Every Tivoli ABC document uses pure payroll-share allocation for the benefits and overhead pools, with no per-service hand-set shares. Government administration dominates Tivoli's payroll share, which is what the table above reflects.
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; revenue routing.
- externalFiscal-lines bundle: site/data/fiscal_lines.json— Pipeline input: every appropriation/revenue line for every (jurisdiction, fund, fy, source) document.
- recordTivoli A General Fund — multi-year overview— Year-over-year totals; toggle to ABC view to see fully-loaded service trends.