Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. Accounting
  3. IFRS Unearned Revenue Recognition on Delivery (IFRS 15 / ASC 606) v 19.0
  4. Sales Conditions FAQ

IFRS Unearned Revenue Recognition on Delivery (IFRS 15 / ASC 606)

by Novalyft Solutions https://novalyftsolutions.com
Odoo
v 19.0 Third Party 6
Download for v 19.0 Deploy on Odoo.sh
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Inventory (stock)
• Invoicing (account)
• Sales (sale_management)
• Discuss (mail)
Lines of code 941
Technical Name unearned_revenue_recognition
LicenseLGPL-3
Websitehttps://novalyftsolutions.com
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Inventory (stock)
• Invoicing (account)
• Sales (sale_management)
• Discuss (mail)
Lines of code 941
Technical Name unearned_revenue_recognition
LicenseLGPL-3
Websitehttps://novalyftsolutions.com

IFRS Unearned Revenue Recognition on Delivery

Defer revenue from invoice posting to physical delivery — IFRS 15 / ASC 606 compliant, built for retail, e-commerce, and wholesale workflows where customers pay upfront.

The problem: prepayment recognizes revenue too early

In retail and prepayment business models, customers pay 100% upfront when placing an order. The accounting team must invoice the full amount so accounts receivable and cash are tracked correctly — but recognizing revenue at invoice posting violates IFRS 15 and ASC 606, because the performance obligation (delivering the goods) hasn't been satisfied yet.

Standard Odoo behavior:

ON INVOICE:    Dr  Accounts Receivable    Cr  Sales Revenue   ← too early!
                                          Cr  VAT Payable
ON PAYMENT:    Dr  Bank                   Cr  Accounts Receivable

This module changes the pattern so revenue lands on the P&L only when goods are physically delivered:

ON INVOICE:        Dr  Accounts Receivable     Cr  Unearned Revenue  (Balance Sheet liability)
                                               Cr  VAT Payable
ON PAYMENT:        Dr  Bank                    Cr  Accounts Receivable
ON DELIVERY:       Dr  Unearned Revenue        Cr  Sales Revenue     (P&L recognition ✓)
ON RETURN:         Dr  Sales Revenue           Cr  Unearned Revenue  (auto reversal)

VAT is still recognized at invoice posting (correct per most tax-point rules, including the Lebanese and GCC patterns). Only the revenue side is deferred.

Key features

Automatic redirect on invoice posting

Invoice lines generated from a sales order are routed to an Unearned Revenue liability account instead of Sales Revenue. AR, VAT, and tax accounts are untouched.

Recognition on delivery

Validating an outgoing stock picking posts a Miscellaneous journal entry that moves the delivered portion from Unearned Revenue to Sales Revenue, in real time.

Partial deliveries & backorders

Each picking recognizes only its proportional share. Backorders recognize their portion when later validated. The audit trail tracks per-move quantities so re-validation can never double-count.

Returns auto-reverse

Validating an incoming return picking posts the inverse entry automatically, proportional to the returned quantity at the invoice's original FX rate.

Credit notes protect Sales Revenue

Credit notes against deferred invoices inherit the deferral account, so order modifications never accidentally hit the P&L.

Multi-currency, frozen at invoice date

Recognition entries reuse the invoice's posted FX rate via the line's balance — no rate lookup at delivery time, no FX surprises.

Multi-company aware

Recognition entries post in the correct company's books with its own chart of accounts. A multi-company record rule keeps audit lines scoped per company.

Three-level configuration

Set the deferral account per product category, fall back to a company-wide default, fall back to Odoo Enterprise's native Deferred Revenue Account. No client-specific hardcoding.

Full audit trail

Every recognition and reversal writes a dedicated audit-trail row (x.revenue.recognition.line) cross-linking the picking, sale order, invoice, and journal entry.

Smart buttons everywhere

The Sales Order, Customer Invoice, and Stock Picking forms each show a Revenue Recognition smart button with quick access to the filtered audit trail.

SO recognition status

Recognized Revenue / Pending Recognition / Status (not_started / partial / complete) on every Sales Order header — at a glance.

Deferred Revenue report

New menu under Accounting → Reporting → Deferred Revenue lists all posted invoice lines still parked in deferral, grouped by partner.

See it in action

Sales Order — recognized vs. pending at a glance

Every Sales Order shows Recognized Revenue, Pending Recognition, and a status badge (not started / partial / complete) in the header. The Recognition smart button opens the full audit trail filtered to this order.

Sales Order S00048 with Recognition smart button, Recognized Revenue and Pending Recognition fields, and the Partial status badge

Per-product recognition method

Choose Automatic (goods → on delivery, services → on invoice), Recognize on invoice posting, or Recognize on delivery. The setting lives on each product's Accounting tab so you can override the auto behavior per SKU.

Product form Accounting tab showing the Revenue Recognition Method dropdown with three options

Company-wide defaults in Accounting Settings

Set a fallback Unearned Revenue account and the recognition Misc journal under Accounting → Configuration → Settings → Customer Invoices. The fallback chain (category → company → Enterprise native) is documented above.

Accounting Settings page showing the Unearned Revenue Recognition section with Default Unearned Revenue Account and Recognition Journal fields

Per-category deferral account

The Product Category form gains an Unearned Revenue Account field. Setting it overrides the company default for every product in that category — the recommended granularity for retail catalogs.

Product Category form showing the Unearned Revenue section with the Unearned Revenue Account field

Configure in three minutes

  1. Per product category — open any category and set the new Unearned Revenue Account field. This is the deferral target for every product in that category.
  2. Company default — under Accounting → Configuration → Settings → Customer Invoices → Unearned Revenue Recognition, set a fallback Default Unearned Revenue Account and the Recognition Journal.
  3. Per product (optional) — override the auto behavior on a product form's Accounting tab. Choose Automatic, Recognize on invoice posting, or Recognize on delivery.

Automatic means storable / consumable goods recognize on delivery and services recognize on invoice — the right default for most retail catalogs.

Edge cases the module gets right

  • Partial deliveries & backorders — each picking recognizes its own share; the audit trail prevents duplication.
  • Multiple invoices per SO line — recognition allocates FIFO across all posted invoice lines.
  • Quantity changes after invoicing — additional invoices add additional deferred amounts; credit notes offset against deferral, not sales.
  • Drop-shipping — supplier → customer pickings carry the SO link, so recognition still fires correctly.
  • Multi-company — each company's books are kept clean by a multi-company ir.rule on the audit-trail model.
  • Multi-currency — recognition uses the invoice's frozen FX rate, never the delivery-date rate.
  • Service products forced to defer — the invoice chatter logs a warning so accountants know to recognize manually.
  • Invoice reset to draft / cancel — every recognition entry generated from that invoice is reversed automatically.
  • Manual invoices — invoices not driven by a sale order are left unchanged.
  • Idempotent re-validation — re-validating a picking, or any code path that re-triggers recognition, can never double-recognize.

Compatibility

Odoo version 19.0 (Community and Enterprise)
Dependencies account, sale_management, stock, sale_stock — all standard Odoo.
Enterprise integration account_accountant's native Deferred Revenue Account is detected at runtime and used as a fallback. Not required.
License LGPL-3
Tests 22 unit tests covering invoice routing, recognition triggers, partial deliveries, returns, credit notes, idempotency, multi-currency, services, taxes, multi-invoice, security, and dropship.

Who is this for?

  • Retailers taking full payment at checkout but shipping later.
  • E-commerce operations recognizing revenue per shipment instead of per order.
  • Wholesale and distribution billing on order confirmation but delivering in multiple shipments.
  • Companies in IFRS or US GAAP jurisdictions needing IFRS 15 / ASC 606 compliance.
  • Lebanese, GCC, and other regions where VAT is due at invoice but revenue is not.
  • Multi-company groups needing per-company recognition books.

Known limitations

  • No time-based deferral. Use Odoo's native Enterprise Deferred Revenue feature for annual contracts, subscriptions, or prepaid hours.
  • Services explicitly set to defer have no automatic delivery driver — the invoice chatter logs a warning so the accountant knows to clear it manually.
  • Manual (non-SO) invoices are never redirected — by design, so customer-service invoice fixes don't accidentally enter deferral.
  • Picking cancellation: Odoo 19 forbids cancelling pickings whose moves are done. To undo a delivery, validate a return picking — recognition automatically reverses.

Built by Novalyft Solutions

We build Odoo implementations and modules for the Levant, GCC, and beyond.

Visit novalyftsolutions.com  ·  License LGPL-3  ·  Free and open source.

Please log in to comment on this module

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author, please use the developer contact information. They can usually be found in the description.
Please choose a rating from 1 to 5 for this module.
Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with