Fixed Assets Are Where Accounting Gets Real—and Where Most ERP Setups Fall Short
Every company that buys equipment, vehicles, furniture, or IT infrastructure has fixed assets on the balance sheet. The accounting rules are clear: capitalize the cost, depreciate it over the useful life, and recognize disposal gains or losses when the asset leaves the books. The reality is messier. Finance teams juggle spreadsheets alongside the ERP, manually calculate depreciation for edge cases, and pray that the auditors don't ask about the revaluation methodology.
Odoo 19's Asset Management module handles the full lifecycle—from initial capitalization through monthly depreciation, mid-life revaluation, and final disposal or sale. But the module ships with sensible defaults that don't match every jurisdiction or business. IFRS vs. local GAAP depreciation rules, prorated first-year depreciation, degressive-to-linear switches, and revaluation surplus accounts—these all require configuration that the out-of-the-box setup won't give you.
This guide walks you through every layer of Odoo 19 asset management: how to configure asset categories, choose the right depreciation method, automate journal entry generation, handle disposals and sales, execute revaluations, and avoid the mistakes that create audit findings.
Configuring Asset Categories: The Foundation of Every Depreciation Schedule
Asset categories in Odoo define the default depreciation rules that apply when a vendor bill line is capitalized. Getting the categories right means your accountants rarely need to override individual assets—the defaults do the work.
Key Fields on the Asset Category
| Field | Purpose | Example Value |
|---|---|---|
Asset Type | Determines whether entries post as assets, deferred revenue, or deferred expense | Asset |
Journal | The accounting journal where depreciation entries post | Depreciation Journal |
Asset Account | Balance sheet account holding the gross asset value | 1700 — Fixed Assets |
Depreciation Account | Contra account for accumulated depreciation | 1709 — Accum. Depreciation |
Expense Account | P&L account where the depreciation expense lands | 6200 — Depreciation Expense |
Duration | Useful life in months | 60 (5 years) |
Computation Method | Linear, Degressive, or Accelerated Degressive | Linear |
Prorata Temporis | Enable first-year proration based on acquisition date | Enabled |
Creating an Asset Category via the UI
Navigate to Accounting → Configuration → Asset Categories. Create one category per asset class (Vehicles, IT Equipment, Office Furniture, Buildings, etc.). Each category maps to a specific chart of accounts structure:
category = env['account.asset.group'].create({
'name': 'IT Equipment',
'asset_type': 'purchase',
'journal_id': depreciation_journal.id,
'account_asset_id': account_1700.id,
'account_depreciation_id': account_1709.id,
'account_depreciation_expense_id': account_6200.id,
'method_number': 36, # 3-year useful life
'method_period': '1', # Monthly depreciation
'method': 'linear',
'prorata_computation_type': 'daily_computation',
})When you assign an asset category to an expense account on a vendor bill, Odoo automatically proposes creating an asset when the bill is posted. This means your accounts payable clerks don't need to know the depreciation rules—they just code the bill to the right account and the system handles the rest.
Depreciation Methods in Odoo 19: Linear, Degressive, and Accelerated Degressive
Choosing the right depreciation method isn't just an accounting preference—it has direct tax and financial reporting implications. Odoo 19 supports three methods out of the box, and understanding when to use each one saves you from restatements and audit adjustments.
Method Comparison
| Method | Formula | Best For | Odoo Field Value |
|---|---|---|---|
| Linear (Straight-Line) | Cost / Useful Life | Office furniture, buildings, leasehold improvements | linear |
| Degressive (Declining Balance) | Book Value × Degressive Factor / Useful Life | Vehicles, IT equipment, machinery with front-loaded wear | degressive |
| Accelerated Degressive | Degressive until it drops below linear, then switches to linear | Tax optimization in jurisdictions that allow accelerated depreciation | degressive_then_linear |
Linear Depreciation Example
A server rack purchased for $60,000 with a 5-year useful life and no salvage value:
Asset: Server Rack
Cost: $60,000
Useful Life: 60 months
Method: Linear
Salvage Value: $0
Monthly Depreciation = $60,000 / 60 = $1,000/month
Year 1: $12,000 | Book Value: $48,000
Year 2: $12,000 | Book Value: $36,000
Year 3: $12,000 | Book Value: $24,000
Year 4: $12,000 | Book Value: $12,000
Year 5: $12,000 | Book Value: $0Degressive Depreciation with Factor
The degressive factor (typically 1.5 to 2.0) accelerates early depreciation. A company vehicle at $45,000 with a 5-year life and degressive factor of 2.0:
Asset: Company Vehicle
Cost: $45,000
Useful Life: 60 months
Method: Degressive
Degressive Factor: 2.0
Annual Rate: 2.0 / 5 = 40%
Year 1: $18,000 (40% of $45,000) | Book Value: $27,000
Year 2: $10,800 (40% of $27,000) | Book Value: $16,200
Year 3: $6,480 (40% of $16,200) | Book Value: $9,720
Year 4: $3,888 (40% of $9,720) | Book Value: $5,832
Year 5: $5,832 (remaining) | Book Value: $0Setting the Degressive Factor in Code
asset = env['account.asset'].create({
'name': 'Company Vehicle - Toyota Hilux',
'original_value': 45000.00,
'acquisition_date': '2026-01-15',
'method': 'degressive',
'method_number': 60,
'method_period': '1',
'method_progress_factor': 0.40, # Degressive factor / years
'account_asset_id': account_1710.id,
'account_depreciation_id': account_1719.id,
'account_depreciation_expense_id': account_6210.id,
'journal_id': depreciation_journal.id,
})
asset.validate() # Confirms and generates the schedule When prorata_computation_type is set to 'daily_computation', Odoo calculates the first and last period depreciation based on the exact number of days. An asset purchased on March 15 gets 17/31 of March's depreciation in the first entry. This is required under IFRS and most local GAAPs—disable it only if your jurisdiction allows full-month first-period depreciation.
Automatic Depreciation Entry Generation: Set It and Forget It
One of the strongest features of Odoo's asset module is the automatic generation of depreciation journal entries. Once an asset is confirmed, Odoo creates the entire depreciation schedule as draft journal entries—one per period for the full useful life of the asset.
How the Scheduler Works
Odoo generates depreciation entries using a scheduled action (ir.cron) that runs daily. The process:
- Draft entries are created when the asset is confirmed—one entry for each depreciation period in the schedule.
- The cron job posts entries whose date has passed. Entries dated today or earlier are automatically posted if the asset's
auto_postflag is enabled. - Each journal entry debits the expense account and credits the accumulated depreciation account, with the asset as the analytic reference.
<!-- What Odoo generates for each depreciation period -->
<!-- Debit: Depreciation Expense (P&L) -->
<!-- Credit: Accumulated Depreciation (Balance Sheet) -->
Account 6200 - Depreciation Expense DR $1,000.00
Account 1709 - Accumulated Depreciation CR $1,000.00
Reference: Server Rack - 03/2026
Asset: Server Rack (ID: 42)
Date: 2026-03-31Reviewing and Posting Entries in Bulk
For companies that prefer manual review before posting, disable auto_post on the asset category. Then use the batch posting wizard:
# Find all draft depreciation entries up to today
draft_entries = env['account.move'].search([
('asset_id', '!=', False),
('state', '=', 'draft'),
('date', '<=', fields.Date.today()),
])
# Review count before posting
print(f"Posting {{len(draft_entries)}} depreciation entries")
# Post them all
draft_entries.action_post()Run depreciation posting before generating your month-end trial balance. A common mistake is closing the period with unposted depreciation entries, then having to reopen the period to post them. Add the depreciation review to your month-end checklist: Accounting → Assets → filter by "Running" status → verify all entries through the current month are posted.
Asset Disposal and Sale: Recognizing Gains, Losses, and Write-Offs
Assets don't live forever. Equipment breaks, vehicles get replaced, and offices get renovated. When an asset leaves the books, Odoo needs to record the disposal correctly: post any remaining depreciation up to the disposal date, remove the asset and accumulated depreciation from the balance sheet, and recognize the gain or loss on the income statement.
Disposal Types in Odoo 19
| Action | When to Use | P&L Impact |
|---|---|---|
| Sell | Asset is sold for a price (vehicle trade-in, equipment resale) | Gain if sale price > book value; loss if sale price < book value |
| Dispose (Write-Off) | Asset is scrapped, donated, or lost with no proceeds | Loss equal to remaining book value |
Selling an Asset: Step-by-Step
When you sell an asset through the Odoo UI, the system handles the journal entries automatically. Navigate to Accounting → Assets, open the asset, and click "Sell or Dispose":
Asset: Company Vehicle - Toyota Hilux
Original Cost: $45,000
Accumulated Depreciation: $28,800 (after 3 years degressive)
Book Value at Disposal: $16,200
Sale Price: $20,000
Journal Entry on Disposal:
──────────────────────────────────────────────────
Account 1200 - Accounts Receivable DR $20,000
Account 1719 - Accum. Depreciation DR $28,800
Account 1710 - Vehicle Assets CR $45,000
Account 7600 - Gain on Disposal CR $3,800
──────────────────────────────────────────────────
Gain on Sale = $20,000 - $16,200 = $3,800Programmatic Disposal
# Sell an asset with proceeds
asset = env['account.asset'].browse(42)
# The sell wizard handles gain/loss calculation
sell_wizard = env['account.asset.sell'].create({
'asset_id': asset.id,
'action': 'sell',
'invoice_id': customer_invoice.id, # Link to the sale invoice
})
sell_wizard.do_action()
# For write-off (no proceeds)
dispose_wizard = env['account.asset.sell'].create({
'asset_id': asset.id,
'action': 'dispose',
'loss_account_id': account_6900.id, # Loss on disposal account
})
dispose_wizard.do_action()Odoo 19 supports partial disposal through the asset split feature. If you purchased a batch of 10 laptops as a single $30,000 asset and need to dispose of 3, split the asset first (Modify → reduce the original value proportionally), then dispose of the new split asset. This preserves the depreciation history on both the remaining and disposed portions.
Asset Revaluation: Adjusting Book Values to Fair Market Value
Under IFRS (IAS 16), companies can choose the revaluation model for fixed assets, where the carrying amount is adjusted to fair value at regular intervals. Even under cost model accounting, impairment testing may require write-downs. Odoo 19 handles both upward and downward revaluations through the asset modification workflow.
When to Revalue
- Upward revaluation — fair value exceeds book value (common with land and buildings). The increase goes to a revaluation surplus account in equity, not the P&L (unless reversing a prior impairment).
- Downward revaluation (impairment) — book value exceeds recoverable amount. The decrease hits the P&L as an impairment loss, unless there's a prior revaluation surplus to absorb it.
- Periodic reassessment — IFRS requires revaluations to be "sufficiently regular" so that book value doesn't differ materially from fair value. Most companies revalue annually.
Executing a Revaluation in Odoo
Use the "Modify" button on a running asset to change its gross value, salvage value, or remaining useful life. Odoo recalculates the depreciation schedule from the modification date forward:
# Upward revaluation: building's fair value increased
asset = env['account.asset'].browse(55)
# Original value: $500,000 | Book value after 5 years: $400,000
# New fair value appraisal: $550,000
modify_wizard = env['asset.modify'].create({
'asset_id': asset.id,
'name': 'Revaluation - 2026 appraisal',
'method_number': 180, # Remaining useful life in months
'value_residual': 550000.00, # New gross value
'date': '2026-03-31',
'account_asset_counterpart_id': account_3100.id, # Reval surplus
})
modify_wizard.modify()
# Odoo will:
# 1. Post a journal entry for the revaluation increase
# 2. Recalculate monthly depreciation from April 2026 forward
# 3. Update the depreciation schedule with new amountsRevaluation Journal Entry Structure
Revaluation: Office Building - March 2026
Book Value Before: $400,000
Fair Value: $550,000
Revaluation Increase: $150,000
Journal Entry:
──────────────────────────────────────────────────
Account 1700 - Building Assets DR $150,000
Account 3100 - Revaluation Surplus CR $150,000
──────────────────────────────────────────────────
New Monthly Depreciation = $550,000 / 180 months = $3,055.56
(vs. previous $2,222.22/month) Every modification creates a log entry on the asset with the date, reason, old values, and new values. Auditors can trace the complete history of an asset from acquisition through every revaluation and depreciation adjustment. Always fill in the name field on the modification wizard with a meaningful description—"2026 appraisal by Jones & Partners" is better than "adjustment."
3 Asset Management Mistakes That Create Audit Findings
Mismatched Fiscal Year and Depreciation Period Boundaries
Your fiscal year ends on June 30, but Odoo's depreciation schedule generates entries aligned to calendar months. The result: your June 30 trial balance shows 6 months of depreciation, but the asset schedule shows entries through June 30 only if you configured method_period correctly. If set to '12' (annual) instead of '1' (monthly), you get a single annual entry on December 31—six months after your fiscal year-end. Your balance sheet carries the wrong accumulated depreciation for half the year.
Always use method_period = '1' (monthly) for asset categories, even if your reporting is annual. Monthly entries give you accurate balances at any month-end for interim reporting. If your jurisdiction requires annual depreciation calculations, use monthly entries with annual totals in your reports. Configure the fiscal year properly under Accounting → Configuration → Fiscal Years so that period boundaries align with your reporting dates.
Not Running Depreciation Before Disposal
You sell a vehicle on March 15. The last posted depreciation entry was for February 28. You click "Dispose" without posting the March 1-15 depreciation first. Odoo disposes the asset at the February 28 book value, overstating the book value by half a month of depreciation. The gain/loss on disposal is wrong, your tax return is wrong, and the auditor flags it as a misstatement.
Before any disposal or sale, run the depreciation cron up to the disposal date: Accounting → Assets → select the asset → verify the last posted depreciation date. If the asset has prorata enabled, Odoo will calculate the partial-month depreciation automatically when you trigger disposal. But you must ensure all prior full-month entries are posted first. Add "Verify depreciation is current" to your asset disposal checklist.
Revaluation Surplus Misclassification on the Balance Sheet
An upward revaluation should credit a revaluation surplus account in equity (IAS 16.39), not revenue. If the counterpart account on the modification wizard is set to a P&L income account, the revaluation increase inflates your reported profit. This is an IFRS violation that external auditors will catch—and it distorts your tax liability, dividends capacity, and financial ratios.
Create a dedicated "Revaluation Surplus" equity account (e.g., account 3100) in your chart of accounts. Always use this account as the counterpart for upward revaluations. For downward revaluations (impairments), use the P&L impairment loss account only to the extent the decrease exceeds any prior revaluation surplus for that asset. Document your revaluation policy and enforce it through the asset category configuration.
What Proper Asset Management Saves Your Business
Asset management in Odoo isn't just about compliance. It's about financial visibility and operational control:
Automated depreciation schedules eliminate the spreadsheet gymnastics that consume finance teams during close. Every entry is pre-generated, pre-dated, and audit-ready.
Manual depreciation spreadsheets are error-prone. One wrong formula propagates across 60 months. Odoo calculates prorated, degressive, and linear depreciation without human error.
Your balance sheet reflects the correct net book value of every asset at any point in time. No more month-end surprises from unposted depreciation or forgotten disposals.
For a mid-size company with 200+ fixed assets, the manual process involves maintaining parallel spreadsheets, reconciling them to the GL monthly, and rebuilding the schedules every time an asset is modified, disposed, or revalued. A properly configured Odoo asset module replaces all of that with a single source of truth that posts entries automatically, tracks the full audit trail, and generates the fixed asset register report in seconds.
Optimization Metadata
Complete guide to Odoo 19 asset management. Configure depreciation schedules (linear, degressive, accelerated), automate journal entries, handle disposals and revaluations, and avoid audit pitfalls.
1. "Configuring Asset Categories: The Foundation of Every Depreciation Schedule"
2. "Depreciation Methods in Odoo 19: Linear, Degressive, and Accelerated Degressive"
3. "Asset Disposal and Sale: Recognizing Gains, Losses, and Write-Offs"
4. "Asset Revaluation: Adjusting Book Values to Fair Market Value"
5. "3 Asset Management Mistakes That Create Audit Findings"