- Home
- Apps
- Multichannel & PIM Tools
- Inventory Adjustment Backdate for Odoo
Illustrative previewA build-to-order Odoo module that lets authorized users post inventory adjustments and stock moves on a past
effective date, each stamped with a mandatory remark for audit-clean historical records.
ECOSIRE builds, installs, and supports it on your Odoo 17, 18, or 19 environment.
What is Inventory Adjustment Backdate for Odoo?
A build-to-order Odoo module that lets authorized users post inventory adjustments and stock moves on a past effective date, each stamped with a mandatory remark for audit-clean historical records. ECOSIRE builds, installs, and supports it on your Odoo 17, 18, or 19 environment. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.
Key Features
Built to order, done for you
No DIY setup — a working app, built, installed and supported by ECOSIRE.
- 1
You order
Start with a one-time build price. We scope it with you at kickoff.
- 2
We build & install
ECOSIRE builds, configures and installs it on your Odoo.
- 3
Go live + support
You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.
Technical Specifications
- Odoo Compatibility
- Odoo 17, Odoo 18, Odoo 19
- Editions
- Enterprise & Community
- License
- Licence confirmation required
- Python Requirement
- Python 3.10+
- Database
- PostgreSQL 12+
About this Product
Odoo stamps every stock move and inventory adjustment with the server date at the moment you validate it. That is correct for live operations, but it breaks the moment you are entering history: an opening stock count captured a week late, a physical count reconciled at month-end, a goods receipt that arrived before your go-live, or a correction that auditors expect to sit on the date the event actually happened. Out of the box the stock.move and stock.move.line date fields are written programmatically at validation, the inventory-adjustment flow on stock.quant records now(), and the valuation layers in stock.valuation.layer inherit that same timestamp — so your stock ledger, your valuation, and your accounting periods all disagree with the real-world event date. Finance then sees inventory movement land in the wrong period, and there is no native, permission-gated way to say "this happened on the 3rd, not today."
ECOSIRE builds a dedicated Inventory Adjustment Backdate module that adds a validated, audit-controlled effective-date override to Odoo's stock engine. We introduce an effective_date (Datetime) field and a required backdate_reason (Text) field on the adjustment and move flow, wired through a targeted extension of stock.quant, stock.move, and stock.move.line. When an authorized user posts a backdated adjustment, an override on _apply_inventory() / the move validation path propagates the chosen date down to the resulting moves, move lines, and the generated stock.valuation.layer rows, so the on-hand history, the SVL journal, and the account move (when Anglo-Saxon/perpetual valuation is on) all carry the same effective date. Every backdate writes an immutable trail — who set it, the original system date, the new date, and the remark — via the standard mail.thread chatter and a dedicated log model, so nothing is silently rewritten.
The control layer is where a made-to-order build earns its price. We gate the ability to backdate behind a new security group in ir.model.access.csv plus record rules, so only a controller or inventory manager can override a date; everyone else follows the normal now() behaviour. We add a configurable guard rail — a maximum look-back window and an optional hard lock against posting into a closed accounting period — enforced with an @api.constrains validation and a clear ValidationError rather than a silent correction. The reason field is mandatory by constraint, the backdated documents surface a visible badge in the form and list views (XML in 17.0/18.0, OWL-aware where you are on 19.0), and we ship an audit report (QWeb PDF or list export) of every backdated movement over a date range for your finance and audit teams. Optional add-ons we scope on request: an automated action to flag out-of-window attempts, and an XML-RPC/JSON-RPC endpoint so a data-migration script can post opening balances at their true dates.
Because this is build-to-order, delivery works as a short engagement rather than a download. We start with a scoping call to confirm your Odoo version (17.0 / 18.0 / 19.0), Community vs Enterprise, your valuation method, and who is allowed to backdate. We then build against a copy of your environment, hand you the module on a staging database for UAT, and only deploy to production once you have signed off — with a rollback path ready. Typical delivery is one working week from confirmed scope. Pricing starts from $999 (indicative, single-company base scope); multi-company propagation, closed-period accounting locks, deep localization of the audit report, and bulk data-migration backdating via the API increase the quoted scope.
What you get
- Installable module source code for your target Odoo version (17.0, 18.0, or 19.0), with a clean `__manifest__.py` and no core patches
- Installation and configuration on your staging environment, including the security group and guard-rail settings
- Technical documentation: models extended, fields added, security groups, record rules, and constraint logic
- End-user guide plus a live training session for the controllers/managers who will use backdating
- Post-go-live support window for defect fixes and questions after production deployment
- UAT on a staging database with a documented rollback plan before any production change
- Git repository handover with the full commit history and tagged release
- Audit-report template and a short runbook for your finance/audit team on reviewing backdated movements
Who this is for
Financial Controller / Accountant
Needs inventory movement to land in the correct accounting period so valuation and the GL reconcile. Wants backdating locked to authorized users, blocked in closed periods, and fully audit-logged with a reason on every entry.
Inventory / Warehouse Manager
Runs physical counts and reconciliations that are often finalized days after the count date. Needs to post the adjustment on the real count date without breaking on-hand history or lot/serial traceability.
ERP Implementation Lead (go-live / migration)
Loading opening balances and historical stock during a go-live or data migration. Needs to backdate opening moves to their true dates in bulk, ideally driven via the XML-RPC/JSON-RPC API, so historical reporting is accurate from day one.
Compliance / Audit Officer
Answers to external auditors and regulators. Needs an immutable trail of who changed a date, from what to what, and why, plus a report of every backdated movement over any period.
How Inventory Adjustment Backdate for Odoo Compares
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| Backdated effective date | Permission-gated override propagated to moves, lines, and valuation layers | Possible, but you design and test the propagation yourself | Often sets the move date only, valuation may lag | Always uses server `now()` at validation — no override |
| Mandatory reason / remark | Enforced by `@api.constrains`; no backdate without a remark | Only if you build and test the constraint | Varies; frequently optional or absent | No concept of a backdate reason |
| Access control | Dedicated security group + record rules; others keep native behaviour | You define the groups and rules from scratch | Generic or all-or-nothing access | No backdating capability to control |
| Accounting-period safety | Optional hard lock against posting into closed periods | Must be researched and coded per your valuation setup | Rarely checks period state | Not applicable |
| Audit trail | Immutable log of user, original date, new date, reason + chatter | Only what you choose to build | Basic or no dedicated log | Standard chatter only, no date-change record |
| Version + edition fit | Built and tested for your exact 17.0/18.0/19.0, Community or Enterprise | You own version compatibility | Generic build; may not match your edition | N/A |
| Delivery model | Build-to-order: scoping, staging UAT, sign-off, rollback plan | In-house or contractor time and risk on you | Instant install, but generic and unsupported for your case | Included, but the capability does not exist |
| Ownership + support | Full git repo handover + post-go-live support window | You maintain it entirely | Vendor-dependent, limited to their roadmap | Standard Odoo support only |
Frequently Asked Questions about Inventory Adjustment Backdate
How long does delivery take?
This is a build-to-order module, not an instant download. Typical delivery is one working week from confirmed scope. After a short scoping call we build against a copy of your environment, hand it over on staging for UAT, and deploy to production only once you have signed off. Complex scope — multi-company, closed-period locks, or bulk migration — can extend the timeline, which we confirm before you commit.
Will this let anyone change stock dates and hide it?
No. Backdating is gated behind a dedicated security group and record rules, so only the controllers or managers you designate can override a date. A remark is mandatory, and every backdate is written to an immutable audit trail — user, original system date, new date, and reason — via chatter and a dedicated log model. It records history transparently; it does not silently rewrite it.
Does the backdated date reach accounting and valuation, or just the stock move?
It propagates. The effective date is pushed to the `stock.move`, the `stock.move.line`, and the generated `stock.valuation.layer` rows, and under perpetual/Anglo-Saxon valuation the resulting account move carries the same date so inventory lands in the intended accounting period. We confirm your exact valuation method during scoping so the behaviour matches your setup.
Which Odoo versions do you support, and Community or Enterprise?
We build for Odoo 17.0, 18.0, and 19.0, on both Community and Enterprise. Views are delivered as classic XML on 17.0/18.0 and OWL-aware where you are on 19.0. We confirm the exact version and edition on the scoping call because the stock and valuation internals differ slightly across releases.
How does pricing and scoping work?
Pricing starts from $999 (indicative, single-company base scope). The final number is a fixed quote issued after the scoping call, once we know your version, edition, valuation method, and whether you need multi-company propagation, closed-period locks, localization, or bulk API-driven backdating. You approve the fixed quote before any build work begins.
What about support and future Odoo updates?
Every engagement includes a post-go-live support window for defect fixes and questions. Because the module extends stock and valuation rather than patching core, it ports cleanly; when you upgrade to a newer Odoo version we can quote a compatibility pass. You also receive the full git repository, so your own team can maintain it if you prefer.
Can we bulk-backdate opening stock during a migration?
Yes, this is a common scope add-on. We can expose a method callable over the XML-RPC/JSON-RPC API so your migration script posts each opening balance at its true historical date, with the reason and audit trail applied automatically. Bulk migration volume is one of the drivers that increases the quoted scope, so we size it during scoping.
Related Modules

InPost Shipping Integration for Odoo
A build-to-order Odoo delivery carrier that connects your Polish operations to InPost parcel-locker and courier shipping — automated rate selection, label generation, and tracking directly from Sales and Inventory. ECOSIRE scopes, builds, installs, and supports it for you.

Inter Company Stock Transfer
A build-to-order Odoo module that automatically generates the counterpart receipt or delivery order in the partner company whenever stock moves between your Odoo companies. ECOSIRE scopes, builds, installs and supports it for your exact multi-company setup.

J&T Express Shipping Connector for Odoo
A build-to-order Odoo integration that connects your J&T Express account for one-click shipment booking, AWB/label generation, COD amount mapping and real-time tracking sync. ECOSIRE builds, installs and supports it on Odoo 17, 18 or 19.

Jumia Marketplace Connector (Africa)
Build-to-order Odoo module syncing Jumia listings, orders, stock, prices and logistics labels. Built, installed and supported by ECOSIRE.
Inventory Adjustment Backdate
A build-to-order Odoo module that lets authorized users post inventory adjustments and stock moves on a past effective date, each stamped with a mandatory remark for audit-clean historical records. ECOSIRE builds, installs, and supports it on your Odoo 17, 18, or 19 environment.
- `effective_date` (Datetime) override on the inventory-adjustment and stock-move flow, replacing the hard-coded `now()` at validation only for authorized users
- Mandatory `backdate_reason` (Text) enforced by an `@api.constrains` so no backdated record can be posted without a remark
- Date propagation down to `stock.move`, `stock.move.line`, and the generated `stock.valuation.layer` rows so on-hand, valuation, and the ledger agree
- New security group in `ir.model.access.csv` plus record rules — only controllers/inventory managers can backdate; everyone else keeps native behaviour