Skip to content

Odoo Year-End Closing Journal Entry — Fiscal Year Close Errors Fix

DeployMonkey Team · March 24, 2026 9 min read

Fiscal Year Closing Errors in Odoo

Year-end closing in Odoo involves transferring income and expense account balances to retained earnings. Common errors:

UserError: The closing entry could not be created. No profit and loss accounts found.

ValidationError: The closing journal entry is not balanced.

UserError: You cannot create a closing entry for a locked period.

Warning: Some journal entries are still in draft for this fiscal year.

Understanding Year-End Close in Odoo

Odoo handles year-end closing differently from traditional accounting software. Profit and loss accounts are automatically zeroed out in the balance sheet report — a separate closing journal entry is optional but recommended for audit purposes.

Fix 1: Configure Profit/Loss Accounts

# The closing process needs to know which accounts are P&L
# Odoo identifies them by account_type:
# - income / income_other → Revenue accounts
# - expense / expense_direct_cost / expense_depreciation → Expense accounts

# Check account types
sudo -u postgres psql -d mydb -c "
  SELECT account_type, COUNT(*) FROM account_account
  WHERE company_id = YOUR_COMPANY_ID
  GROUP BY account_type
  ORDER BY account_type;
"

# If no income/expense types exist, accounts are misconfigured
# Fix: update account types
# Accounting > Configuration > Chart of Accounts
# Edit each account and set the correct Account Type

Fix 2: Set the Retained Earnings Account

# Year-end close transfers P&L balance to retained earnings
# This account must be configured:

# Accounting > Configuration > Settings
# Under "Default Accounts" section:
# Set "Undistributed Profits/Losses" account

# Typically account code like:
# 3500 - Retained Earnings
# 2600 - Current Year Earnings

# Create if missing:
# Accounting > Configuration > Chart of Accounts > Create
# Name: Retained Earnings
# Code: 3500
# Type: Current Year Earnings (equity_unaffected)

Fix 3: Draft Entries Blocking Close

# All journal entries for the fiscal year must be posted before closing

# Find draft entries for the year
sudo -u postgres psql -d mydb -c "
  SELECT id, name, date, ref, journal_id
  FROM account_move
  WHERE state = 'draft'
  AND date >= '2025-01-01' AND date <= '2025-12-31'
  AND company_id = YOUR_COMPANY_ID;
"

# Fix: Either post or delete all draft entries
# Accounting > Accounting > Journal Entries
# Filter: Status = Draft, Date within fiscal year
# Select all > Post (or Delete if they're invalid)

Fix 4: Unbalanced Closing Entry

# The closing entry must balance: total debits = total credits
# This can fail if:
# - Rounding differences across many accounts
# - Multi-currency exchange rate differences
# - Manual adjustments to P&L accounts

# Check P&L balance
sudo -u postgres psql -d mydb -c "
  SELECT
    SUM(CASE WHEN aa.account_type LIKE 'income%' THEN aml.balance ELSE 0 END) as total_income,
    SUM(CASE WHEN aa.account_type LIKE 'expense%' THEN aml.balance ELSE 0 END) as total_expense,
    SUM(aml.balance) as net_result
  FROM account_move_line aml
  JOIN account_move am ON aml.move_id = am.id
  JOIN account_account aa ON aml.account_id = aa.id
  WHERE am.date >= '2025-01-01' AND am.date <= '2025-12-31'
  AND am.state = 'posted'
  AND aa.account_type LIKE ANY(ARRAY['income%', 'expense%'])
  AND am.company_id = YOUR_COMPANY_ID;
"

Fix 5: Lock Date After Close

# After closing, lock the fiscal year to prevent changes:
# Accounting > Configuration > Settings
# Set "Lock Date for Non-Advisers" to the last day of the fiscal year
# Set "Fiscal Year Lock Date" for all users

# Example for FY 2025:
# Lock Date: 2025-12-31

# This prevents anyone from posting entries in the closed year

Fix 6: Multi-Company Year-End Close

# Each company must be closed separately
# Switch to each company and run the closing process

# For inter-company transactions:
# 1. Reconcile all inter-company accounts first
# 2. Close each company independently
# 3. The consolidated view handles elimination entries separately

Year-End Close Checklist

StepActionVerification
1Post all draft entriesNo drafts in fiscal year
2Reconcile all bank accountsBank reconciliation complete
3Run exchange rate adjustmentsUnrealized gains/losses posted
4Verify retained earnings accountAccount exists with correct type
5Run year-end closeClosing entry created and posted
6Set lock datePrevious year locked

Prevention

DeployMonkey's AI agent guides you through the year-end closing process with a step-by-step checklist. It verifies all prerequisites, identifies blocking issues, and ensures a clean fiscal year close.