[Breaking Change v13] Introducing Immutable Ledgers in ERPNext


Our Scenario:

Purchase may not be immediately booked (invoice not received, or material not verified or invoice not verified or busy with another task). We do not have dedicated accountant, so purchases are booked as and when we get free. However, some item from this purchase may be delivered to customer to meet urgency. Happens 20-30% of the times.

It is practical, that there could be delay in booking entries.

With current implementation, we shall not be able to book transaction correctly to reflect our books. Also, if we book transaction on actual date of booking transaction, we may end up filling incorrect returns with tax authorities.

I am not against Immutable ledgers, but I am against implementation.

Proposed Solution:

Where Stock Entry and Journal Entry, both are affected from one doctype (e.g.: Purchase Invoice with Update Stock option), it should book backdated Journal entry as per document date and automatically forward post stock entry with a warning. Currently it is not allowing to book backdated purchase itself.


Further, there may be stock reconciliations required for end of fiscal year. This should be one exception I feel were back dated stock entries should be allowed. Else, It would be difficult to disclose actual stock value and stock in books where this reconciliation entry is passed on a later date.

I agree immutable stock ledgers would be disaster for SME like ours. The issue is well pointed out earlier but I would add to it that there are many cases when ZERO valued stock entries are posted since the people doing stock entries are not aware about the stock values and neither are they concerned for this there needs to be Stock Reconciliation which is mainly for valuation purposes and it happens on backdated basis.

The erpnext team cannot expect every stock entry to have the correct valuation rate and what if the error is found after some time and then if we just want to do the stock reconciliation for the stock valuations in the back-dates I guess immutable sle would deny the same. This seems like a DEAL Breaker for most of the users especially those in SME sector since most of the times there are no dedicated person for such things in the organisation.


I’m currently assessing ERPNEXT for my business and think so far , its a great product. I’m in the final stages and really want to implement this product . I believe i would re-consider if the system don’t allow back-dating of stock. It is quit crucial for , i think most businesses to back-date stock transactions and get an actual correct stock valuation based on this.
I would propose the user to have an option in the system to allow proper back-dating of stock transactions , whether reconciliations ,or purchase orders back-logs etc… ,with
quantity and cost. It will just give ERPNEXT an advantage over other systems in the market. ’

To erase a feature that most users find crucial in an ERP system , just don’t add up. Rather give them the option to activate or disable the feature.

Hope this will be considered , as it is crucial to listen to user feedback, for any ERP system be successful and to properly consider the impact of major system changes .


Just to add to the points where the team has made the system so flexible that even in v13 we have the option for negative stock as shown below:

So my question is how does the people doing accounting on erpnext would manage their stock suppose they have checked allow negative stock and then they plan to make the stock entries for fulfilment later as is the case in most SMEs.

I guess that immutable Stock Ledger would defeat the whole purpose of allowing negative stock since you cannot go to govt authorities with Negative stock ledger values as I think it might even be illegal in some countries to have negative stock balances.


Promblem regarding cancellation:

  1. I entered a stock reconciliation dated January 1, 2020 to enter the Opening balances of stock inventory.
  2. I submitted the stock reconciliation entry.
  3. I cancelled the stock reconciliation entry.
  4. I amended the stock reconcilation entry,
  5. I CANNOT SUBMIT THE STOCK RECONCIALIATION INVENTORY OPENING BALANCE anymore for January 1 because the cancellation entry is dated TODAY.
1 Like

The new GLE or SLE created by the cancellation entry is dated on the date of cancellation.
But this new entry DOES NOT have any “originating” journal entry or stock entry supporting it.

Also, the first GLE or SLE generated by the journal entry no longer has the originating journal entry to support it is it got cancelled.

This has the effect of “inventing” ghost GLE and SLE (Ledger entries) without any journal entry supporting ledger entries.

To correct way to do this is, in order to cancel Stock Entry (Journal), we MUST NOT cancel the original entry. Instead, we must create a reversing Stock Entry dated today for the stock we want to cancel. This way, ALL supporting journal entries are maintained.

So, with immutable ledgers, we can say NO CANCELLATIONs are allowed with stock entries. All stake holders must be super careful about dates. A single manual error in the dates can mess up the entire Inventory system.

I haven’t looked to closely at the back end of this, but I don’t see any reason that these have to be ghost entries. The originating Entry is the document that was at one time created and then later cancelled. When Entries are cancelled, they don’t disappear. They’re still part of the permanent record in the company’s accounting.



On cancellation of any transaction instead of deleting the General Ledger Entry(GLE) or Stock Ledger Entry(SLE) a new GLE or SLE will be posted on the date of cancellation that will reverse the impact of that transaction.

In accounting, we have journal entries to record transactions. When journal entries are posted (in ERPNext - submitted), a set of General Ledger entries are generated for the purpose of generating reports like Trial Balance, Balance Sheet, Income Statement, etc.

Previously, when Journal Entries are cancelled, the corresponding General Ledger Entries are also cancelled. When you amend the Journal Entries, a new set of corresponding General Ledger Entries are generated. So, there is a one-to-one mapping between Journal Entry (in our case Stock Entry) to the General Ledger Entry.

Now, with immutable ledger, when you cancel a Stock Entry, the General (Stock) Ledger entries that were generated when we submitted (posted) the Stock Entry are not cancelled. Instead, a new set of General (Stock) Ledger with TODAY’S date is generated to reverse the previous General Ledger Entries.

So, what we have now is One Cancelled Journal Entry (meaning - no longer valid), and yet we have two sets of existing General Ledger entries with no Journal (Stock) Entry to stand on for support. The original set of General Ledger Entries no longer has the Journal Entry since it has been cancelled, and the New set of General Ledger entries with Today’s date appears out of nowhere without a Journal Entry with the Today’s date.

This is why, if we want to implement Immutable Ledger entries, the present procedure of generating Ledger entries for cancelled entries seems dubious.

It is better to know outright with immutable ledgers, CANCELLED ENTRIES are not possible.

Also, you wlil discover the unpleasant surprise that you cannot Amend the cancelled entry because it pre-dates the General Ledger entries generated for the cancellation. You will get Backdated error.

This is where we interpret things differently. You understand “Cancelled” to mean “No longer valid”. I understand it to mean “Created and subsequently reversed”.

Sorry, you do not get what I mean.
You must consider the RELATIONSHIP between the JOURNAL ENTRY with its GENERAL LEDGER entry (system generated upon posting or submit).

In this implementation, what we have is a Journal Entry MARKED cancelled. And yet you have two sets of GENERAL LEDGER entries.

The auditor will ask you, WHERE did this General Ledger entry come from? (pointing to the first set),.
What do you do? point to a Journal Entry marked cancelled?

Then the auditor will ask you, WHERE did this General Ledger entry come from? (pointing to the second set generated when you cancelled the journal entry).

What do you do? point to the cancelled journal entry again? Then, the auditor will demand… This General Ledger posting DOES NOT even have the same date as the Journal Entry you are pointing at!

So, in this immutable ledger implementation, Users must be warned outright that they cannot cancel any Stock Entry.

Yes, exactly.

No, not in the posting date of the document, but the date of cancellation is marked immutably in the document’s timeline (not to mention the general ledger itself). The information is there.

I understand what you want: you want a 1-to-1 relationship between Entries and Ledgers. That’s not a requirement of my accounting standard, but if it is for yours you can already do it. Just turn off cancel permissions on all relevant documents. Then, if you need to reverse something, you can create a reversal Entry exactly like you’re describing.

Ok thanks.
The one thing is, Once cancelled, you cannot amend the transaction because of the Backdated requirement.

One thing that can be implemented is the Periodic Inventory Closing procedure.

At present, Inventory valuation is finalized, posted and sealed upon every Submit of a stock entry.

With Inventory Closing (Similar to Income / Expense period closing), this is done at the end of a Period (month-end/quarter-end/year-end).

Inventory valuation can be performed as a batch process for all stock entries based on their individual item inventory valuation (moving average, standard cost, Fifo, even Lifo).

The difference between the Posted ledger entries and the Inventory Valuation calculated by the Inventory Closing procedure will be posted as an Inventory Adjustment journal entry.

So, as long as the Inventory period has not been closed, Changes can be done to stock entries of Open inventory periods.

1 Like

This is lifted from SAP:

You can cancel a delivery document, choosing the Data → Cancel or by choosing the same option in the context menu.

In this case, a new cancellation delivery document is opened, and both the inventory and the accounting transactions are reversed, once you add the cancelation delivery.

Use this option when you make a mistake creating the delivery document. For example, if you choose the wrong customer or item.

Alternatively, if items were delivered and sent back to you, create a return document based on the delivery to reverse all the transactions.

You cannot create an A/R invoice from a delivery that has been closed or canceled nor can you create another sales document with reference to the delivery. You can no longer make changes to the closed delivery either.

Since you can’t change or cancel a goods receipt PO, you can create a goods return document.

This validates my observation that rather than creating on-date general ledger entries, the correct approach is to create another cancel journal document, while also creating general ledger entry.

It can be seen that each cancellation action is SUPPORTED BY a cancel journal document, while the original journal is marked as cancelled.

1 Like

Why does SAP doing it one way mean that that’s the “correct” approach? If that’s how you feel, perhaps you should be using SAP?

1 Like

Sorry. Research.
Immutable Ledgers is a breaking change.
The power of open source lies in contributing ideas.

Yep, and new ideas means not just copying SAP. You’ve brought up many interesting points in this thread, but in my opinion the fact that SAP does it one way isn’t an argument for doing it that way.

And, of course, to reiterate: if you want to do reversals with separate Entry documents, you still can.

Probably (and it is just an idea!!..) create an easy way to reverse transactions maybe will help most of us…

Is that another way of saying that the ERPNext administrator is going to spend the rest of his life correcting screwed Stock Entry dates?

1 Like

Avoid Cancelling any Stock Entry. I learned this when I entered a Stock Reconciliation for Opening inventory stock balances. I realized I placed the wrong warehouse. So, I cancelled the Entry assuming that it is easy to Amend since it is the one and only entry for Stock.

But, it turns out, the current implementation of Immutable Ledger creates Reversing Entries at Stock Ledger’s on today’s date, as explained by the first post. So, I cannot submit the Amended entry because the Cancelled GL Entries with today’s date causes my stock recon entry dated Jan 1 to be Backdated.