Philosophy, Ethics, Real Time Inventory and Immutable Ledgers

No, that’s the whole point. Like I said before, you should really reread Nabin’s explanation of the posting date/transaction date distinction. It clarifies all these issues.

There’re many scenarios that require backdated stock entries… We have to look from end users business perspective, not from tech stuffs which is the users don’t care too much

This immutable forces the users to always bring forward all cancellations/adjustments only…in other words…they should have final audited stock balances ( or let’s assume 80-90% valid) before using erpnext.

There’re many other cases…they do adjustment for many reasons like taxes, internal purpose etc…system should not lock down it… bringing adjustment forward only is not acceptable. They are the users and the data are theirs. Let the users themselves decide in flexible way whether they’re capable enough to use this feature. And based on real experience…even not many enterprises can adopt this properly… backdated is required. tracking/versioning is already there for user admin for audit purpose

It doesn’t make sense even for enterprises…they do adjustment/correction here and there most of the time for many internal reasons.

I’m in the opinion…We cannot force user to go with erp align with current date in every situation. System should be flexible enough and put them (end-users) in control.


User-perspective means transaction dates, and backdated transaction dates are allowed. Can you be specific about a scenario where a user needs backdated posting dates too?

what if the scenario e.g. tax purpose report per last year requires user to backdated adjust stock balance value? is it possible? The adjustment is posted forward per current posting date, right? Immutable doesn’t allow to adjust posting date of backdated value/qty…

the reason behind may vary e.g. previously the value is incorrect but adjustment comes today…some users cannot accept the adjustment is brought forward only.

Why not using Stock Reconciliation for stock adjutment made on back date?
Maybe making new purpose in the list as “Stock Adjustment” that can similarly do like Stock Reconciliation. The difference is this adjustment can be done anytime while the reconciliation only at year end.

Yes, a stock adjustment for last year can have a backdated transaction date, as can any journal entry that might be needed to help recalculate valuation. I know I keep posting this, but I think it clears up a lot of misconceptions about what an immutable ledger actually means:

The situation here became something like this. Let me assume a product P being sold, made of R1, R2 Raw Material:

  1. In May month, we had to manufacture a certain quantity of P. For that, we had received R1 and R2 in April - which we couldn’t enter into stock because of some government restriction (lack of staff). Then, by end of may the Product P was shipped out of our warehouse. All the while, the in-house staff did all physical movement - minus ERPNext movement.
  2. In June, more R1/R2 arrived - they were ordered in March. At that time, the staff made PR on those. But, the PR of previously received R1/R2 (in may) was never entered until end of June.

We cannot simply shift the delivery date of P (or, actually, SI) because of taxation laws.
So, in effect, sitting in June, we had to make old entries on R1/R2/P into our stocks - all the while there were already entries of R1 and R2 in month of June.

In the hindsight, the solution is simple - don’t enter new entries until old are entered. But, practically that means “wait fairly long to assure date ordering” - which is quite a big constraints for small organization which run on staff doubling their responsibilities of data entry and actual work.

Hi Shreyansh,

Right, so a Purchase Request was missed. It should have been entered on May 10th, but only on June 20th was it realized to be missing. Maybe even the Purchase Order/Invoice were missing, too. So, in June, you make a backdated stock entry with the format:

Posting date (no backdating allowed): June 20
Transaction date (backdating fine): May 10

Your stock levels, though wrong for more than a month, will be correct going forward, and your reports will include the event on May 10th. If you use perpetual inventory, the system will create a GL Entry on the same dates, as well. In other words, there’s nothing stopping you from posting May’s entries in June (even after delivery). The only thing you’re prevented from doing is pretending that they actually were posted in May.

Would that workflow present you with trouble?

(There is one actually messy part here, related to how FIFO valuation queues get calculated on backdating, but that’s a somewhat different issue.)

1 Like

Your point is valid - if there were a way to differentiate between posting and transaction dates - that might not have created a problem for me in this scenario (or even other similar situations).
Even though the link that you had added above did talk about such an distinction, the original post (here) talks about restricting transaction (here I assume transaction dates) prior to last transaction (in my sample case, June).

Back dated entries that affect the Stock Ledger will be allowed only after the last stock transaction’s posting time which means there will be no need of any reposting of future transactions.

Am I mistaken or reading wrong?

The computational expensive part being described is related to valuation queues, and in @nabinhait ‘s explanation those valuation queues are tied specifically to posting date. Likewise, I interpret the post you’ve linked to be referring to posting rather than transaction date. In a few other places, as well, the devs have said that the limits on backdating will apply to posting dates and not transaction dates.

The language is inherently a bit confusing, though, so some clarification about current technical plans would definitely be valuable.

@peterg thanks a lot for all your clarifications - we were thrown a curve ball when it was said that backdated stock transactions will not be permitted. It is clear now that we can choose a prior transaction date to post Purchase receipts or Delivery notes.

My follow up question is as follows: For Year End Closing Dec 31 - if we post on Jan 15 some delivery notes or other transactions, will the year end closing statements - like balance sheet / P&L show the impact of those transactions? More generally - are period reports based on posting dates or transactions dates?

Excuse my confusion, I can understand if posting date can’t be, and yes it shouldn’t be, backdated because it will be “cheating” (you work on the post today as if you did it yesterday).
But transaction date (if I understand correctly) is the date when actual transaction/document happen. So it should be “as-is” for the date and the value. Otherwise it might cause fraud.

But here, the posting date is said causing the burden. Posting date should always be going forward (you can’t go back in time). But transaction date may be causing the recalculation, because the actual happen is in the past.

So I see here the toll is not caused by posting (or transaction date for that matter), but just because there is only one date used.
Even in the Stock-related doctype, the field allowed to be edit is labeled as Posting Date. I think this should be re-labeled as Transaction Date. And the posting date is the date user enter/create the doctype.

From @nabinhait explanation, I have notes:

  1. The rate for outgoing is not filled (NA). If it is filled (take from previous relevant Queue), it can be used as carry forward Rate, e.g for transfer incoming in WH2. They should be balanced out anyway. Or if it is used for sales it can be used to calc COGS, or write-off as
  2. Where is Credit in GLE taken? It should be from Qty*Rate, right? But if the outgoing Rate is NA, it must be from calculation (I guess from the Queue). This can be heavy because everytime there will be calculation.
  3. The immutable GLE table may be correct for the final balance. But it is still wrong for the periodical (daily/weekly/monthly) balance.
  4. As in my other post somewhere here, make use of the Stock Reconciliation doctype. Make one more purpose and name it Stock Adjustment or something. Use this to handle the backdated stock entry.

These are my quick notes so I may be wrong or not precise.

There is no Transaction Date field in Purchase Invoice or Purchase Order

Reporting would have to be based on transaction date, otherwise it would be pretty incoherent. As for closing vouchers, my assumption is that they’ll block new transaction dates like they do now, but I haven’t seen this said explicitly anywhere.

To be sure, I’m not trying to dismiss anyone’s concerns about this change. There are some big implications, especially w.r.t. valuation in perpetual inventory systems, and I don’t know enough about how different companies do this to really understand the implications for everyone. There definitely are issues and things that don’t seem to be fully figured out yet (hence the delay, I assume), but they’re a bit more specific than I initially thought when first hearing about this change.

That sounds about right, at least as I understand it. For the most part, the only place this will really be visible to users (apart from audit) is in how valuation gets calculated. That’s the tricky part.

Correct. This part isn’t implemented yet in the v13 development builds.

Thanks. This clarifies many things.

I think we shouldn’t ban backdated stock entries. There are always corrections and oversights.

Rather, making back dated stock entries should be a special permission. If a company does not wish to make back dated entries (ie, once inventory has stabilised) - we can remove the permission. Perhaps, given that multiple periods could be impacted, run it as a job

From a regulatory/audit perspective - this shouldn’t be allowed post fiscal close. ie, once a period is closed and/or the 13th period is opened, back dated stock entries should not be allowed.

We I have a use case, we make some sales Invoices where Update Stock is checked. SO basically we are affecting both Stock Ledger and also the accounting ledger.

Now the issue is we might need to cancel the invoice and amend it some silly mistake in this case the invoice date is generally not changed so basically we are trying to post a back-dated entry which would cause an issue. Though this use case is for mistakes which don’t happen quite often but still you don’t want the system to be harsh even for silly mistakes.

The solution to the above problem: What I have thought that if the immutable ledgers are indeed introduced (which I also think is a GOOD thing), then I would stop posting Stock Update from Sales Invoices and probably run a CRON Job like 5-days later to post the stock entries. So basically my people in accounting would get a time line for 5-days to edit or amend invoices in back-dates.

Also I am presuming that Immutable Stock Ledgers would somehow allow adjusting the STOCK Value by posting back-dated Stock Reconciliations as I had pointed out since Stock Value and Stock Qty are 2 different things and not managed by same people in our organisation.

All in all I know its a great feature to have immutable ledgers esp Stock Ledgers, I am saying it from experience since many time we used to do Stock Reconciliation for a particular item and only to find that some Stock Entry for that Item Code was not submitted and that still caused a lot of headache with immutable ledgers this kind of a problem is resolved.

I know to every change there is a lot of resistance and I know I am the one who is resisting this change since in the future it would cause a lot of pain for its implementation but I hope the team in erpnext would try to make the transition as smooth as possible

If we put immutable as mandatory, users will have no control over their own data.
Most business saying this in simple way → “I want xxx qty and xxx stock balance in my financial report on xxx date” Its impossible to have it if immutable is mandatory

There’s always pros and cons…Immutable is a good thing but again in real business practice, lets to be honest, I believe most organizations cannot only moving forward…they would want and MUST turn back time for different reasons and purposes.

Let them or user admin decide using permission manager, system setting option…where & when they want to lock backdated over certain period…it’s very wise choice for all


This is not true, under the immutability implementation proposed by the developers. It will be entirely possible to say exactly that.

From multiple ERPNext implementation experiences

  1. User enters an incorrect value or incorrect qty and finds out later that it’s incorrect. He/she wants to cancel and amend it. Cost of Goods sold would be posted with an incorrect value in immutable ledgers and Gross Profit report will show incorrect values
  2. User enters provisional values for incoming stock or opening stock to continue using the system and update with the true values later when it is possible
  3. User wants to add additional landed costs (I guess LCV still modifies SLEs in v13 from what I see in the code)
  4. Company receives stock and wants to pay the supplier based on a profit margin which is determined in the future and cannot be determined at the time of receiving stock