---
name: depreciation_schedules
description: "Build depreciation schedules that tie to the fixed asset register: classify each asset, set book useful life and salvage apart from the tax recovery period, compare straight line, declining balance, and units of production, apply partial year conventions (half-year, mid-quarter with the 40 percent test, mid-month), layer section 179 and bonus in the right order, and roll the register forward to the ledger. Ships a calculator tested against the IRS MACRS percentage tables and a register checker. Use when adding an asset, building or rebuilding a depreciation schedule, choosing a method, doing a month end or year end depreciation run, or reconciling depreciation to the general ledger or Form 4562."
---

# Depreciation Schedules

## Purpose

A depreciation schedule is two schedules wearing one name. The book schedule spreads cost over the useful life the business expects, with a salvage value the business estimates. The tax schedule follows rules the tax system assigns: a property class, a recovery period, a prescribed method, and a convention, with no salvage value at all. Mixing the two is the root of most depreciation errors: a book life typed into a tax return, a tax life driving the financial statements, or one blended column in the register that matches neither.

This skill builds both schedules from one clean asset record, runs the partial year conventions correctly, applies first year expensing in the right order, and ties the result to the fixed asset register and the ledger. It ships a tested calculator (`bin/depreciation.py`) and a register checker (`bin/register_check.py`), plus the method and control detail in `references/`.

Scope line: this skill builds schedules and keeps registers honest. It does not file returns, give tax advice for a specific taxpayer, or replace a cost segregation study. Elections and close calls go to the tax preparer with the schedules attached.

## Workflow

1. Start from the register, not from a blank sheet. Pull or create the asset row first: description, serial or tag number, location, vendor document, placed in service date, and full capitalized cost. Use the starter file at `assets/fixed-asset-register.csv` for a new register. One row per asset, a stable asset_id, book and tax lives in separate column sets. Field list and rules: `references/register-and-controls.md`.

2. Decide whether the cost belongs on the register at all. Check the written capitalization policy and its dollar threshold. Split land out of every building purchase before anything else, because land is never depreciable: support the split with an appraisal, a tax assessment split, or the purchase documents. Construction in progress stays off the schedule until the asset is ready and available for use. Repairs stay expenses; betterments, restorations, and adaptations are capitalized as their own assets with their own placed in service dates.

3. Set the book side. Pick a useful life from the policy table for that asset type and how the business actually uses the asset. Set salvage to what the asset is expected to fetch or save at the end of that life, zero only when that is a real expectation. Choose the method by how the asset delivers benefit: straight line for even benefit, declining balance for assets that lose productivity or value early, units of production when wear follows output. Record method, life, and salvage on the row. Formulas and method choice detail: `references/methods-and-conventions.md`.

4. Set the tax side (US federal). Work the five decisions in order: basis (cost times business use percent, land already out), system (GDS by default, ADS when required or elected), recovery period from the property class in Publication 946 Appendix B, method (200 percent declining balance for 3, 5, 7, and 10 year property, 150 percent for 15 and 20 year, straight line for real property and for all ADS property), and convention from step 5. Common classes: computers 5 years, office furniture 7 years, qualified improvement property and land improvements 15 years, residential rental 27.5 years, nonresidential real property 39 years. Never derive the recovery period from the book life.

5. Run the convention test before computing any schedule for the year. Real property takes mid-month and skips the test. For everything else, add the depreciable bases of MACRS property placed in service in the last 3 months of the tax year, counting basis after section 179 and personal use reductions but before bonus. If that total is more than 40 percent of the bases placed in service all year, every non real property asset placed in service that year uses mid-quarter, including assets bought early in the year. Otherwise half-year. Write the test result in the year file: it is the support for every first year amount that follows.

6. Decide first year expensing per asset, in order. Section 179 first: an election per asset, capped by the dollar limit for the year and by taxable income from the active conduct of a trade or business, with vehicle caps where they apply. Verify the current year limits in the IRS revenue procedure for that year before quoting a number, they are inflation adjusted and changed by statute in 2025. Bonus second: a percentage of the basis left after section 179, applied by default to eligible property unless the taxpayer elects out by class, with the percentage set by the acquisition date. Neither applies to ADS property or to a building itself. Record both amounts on the asset row.

7. Compute the schedules with the calculator. Examples:
   - Tax, equipment: `python3 bin/depreciation.py --cost 120000 --life 7 --method macrs-db --factor 2.0 --placed-in-service 2026-02-10 --bonus-pct 50 --format csv`
   - Tax, building: `python3 bin/depreciation.py --cost 390000 --life 39 --method macrs-sl --convention mid-month --placed-in-service 2026-06-20`
   - Book, machine: `python3 bin/depreciation.py --cost 60000 --salvage 6000 --life 5 --method book-sl --convention months --placed-in-service 2026-04-01`
   - Book, usage driven: `python3 bin/depreciation.py --cost 80000 --salvage 5000 --method book-uop --units-total 100000 --units-per-year 30000,25000,20000,15000,10000 --placed-in-service 2026-01-05`
   Run `python3 bin/depreciation.py --self-test` once per install or upgrade: it reproduces the IRS percentage tables for 3, 5, and 7 year 200 percent declining balance property under the half-year convention and checks a 27.5 year mid-month straight line case. The calculator computes from the formulas and rounds each year to cents. The IRS percentage tables round the rate first, so a table built schedule can differ by a few dollars over an asset life. Pick one approach per asset and stay with it.

8. Load the schedule back onto the register row. Accumulated depreciation lives in separate book and tax columns and comes from the schedules, never from a typed total. Run the checker on the register before the period entry posts: `python3 bin/register_check.py assets/fixed-asset-register.csv` (point it at the real register file). Fix every error it prints. Read every warning: fully depreciated assets still in service, and disposed assets with untaken depreciation, are findings to resolve, not noise.

9. Roll the register forward and post. Prove cost and accumulated depreciation separately: opening plus additions minus disposals equals closing, for both. Tie closing cost and accumulated to the general ledger, and the tax totals to the fixed asset listing behind Form 4562. Post the book entry only: depreciation expense by cost center against accumulated depreciation, for the schedule total. Worked rollforward: `references/register-and-controls.md`.

10. Handle disposals and changes in the period they happen. On disposal, take the convention share for the disposal year (`--disposal-date` on the calculator), stop the schedule, remove cost and accumulated in the rollforward, and compute gain or loss from proceeds against remaining book value. Flag the tax side for recapture: gain on section 1245 property is ordinary income up to the depreciation allowed or allowable, including section 179 and bonus. On a life or salvage change, spread the remaining book value over the remaining revised life from that period forward, note the reason and date on the row, and do not restate earlier years.

## Output Contract

A single asset delivery contains: the asset row as recorded, the book schedule and the tax schedule (year, first year expensing split out, regular depreciation, total, accumulated, ending book value), the decisions behind each side (life, salvage, method, class, system, convention, section 179 and bonus amounts), and the convention test result for any tax year where mid-quarter was in play.

A period run delivery contains: the register checker output with errors fixed, the cost and accumulated rollforwards with both ties stated, the period depreciation by cost center that was posted, additions with their class and expensing decisions, and disposals with proceeds, remaining book value, and gain or loss.

Every delivery states: which side each number belongs to (book or tax, every time), the source for any recovery period or limit used (Publication 946 appendix or the revenue procedure for the year), and any asset where a decision is an estimate or a preparer question rather than a settled rule. A schedule with no register row behind it is not a delivery.

## Operating Rules

- Book and tax never share a column, a life, or a total. If a spreadsheet has one depreciation column, the first job is splitting it.
- MACRS has no salvage value. A tax schedule that stops above zero because of salvage is wrong on its face.
- Placed in service means ready and available for use. Delivery and readiness start the clock, first actual use and payment date do not.
- Property placed in service and disposed of in the same tax year gets no depreciation. The calculator refuses that case for MACRS methods, and a register row claiming otherwise is an error.
- Run the 40 percent test on the whole placed in service population for the year, every year additions cluster in the fourth quarter. One asset schedule built before the test is a draft.
- Section 179 and bonus are per asset records, not year level memories. A rebuilt schedule must reproduce the first year exactly from the row.
- Fully depreciated assets stay on the register at full cost and full accumulated until disposal. Deleting them breaks the rollforward and the physical count.
- No asset depreciates past its depreciable amount, and no net book value goes negative. The checker flags both: stop and fix the row, do not plug the difference into the current period.
- Verify time sensitive numbers at the source for the year in question: section 179 limits, the bonus percentage by acquisition date, passenger automobile caps. Dollar figures quoted in the references are dated examples, labeled with their year and source.
- Non US tax: the book method and register work carries over, the MACRS half does not. Use the local tax depreciation rules for the jurisdiction, keep them in the tax column set, and name the source you used.
- Style for schedules and notes: plain, dated, sourced. State the decision and the number. Skip adjectives about the numbers.

## References

- Methods, formulas, MACRS classes, conventions, first year expensing order, disposal and recapture notes: `references/methods-and-conventions.md`
- Register fields, rollforward routine, capitalization policy, period end checks, worked rollforward: `references/register-and-controls.md`
- Calculator: `bin/depreciation.py`, run with `--help` for all options and `--self-test` for the IRS table check
- Register checker: `bin/register_check.py`, run with `--help` for the rules it enforces
- Starter register: `assets/fixed-asset-register.csv`
