[Release Notes] ERPNext Version 13 has been released

Welcome to the future of ERP

ERPNext Version 13 has been released!

A complete redesign makeover changes the way you see everything. Also, packed with 100+ new features and two new modules. The following are the highlights of this release.

  • New Design
  • A dark mode
  • Fully Refreshed POS
  • A complete new Loan module
  • An upgraded Healthcare module (with Rehabilitation and Laboratory functionalities)
  • Better way to handle stock valuation
  • Refactored Bank Reconciliation
  • Bulk processing of Statement of Accounts
  • Production Forecasting
  • Event Streaming (to enable offline erpnext)
  • Multi-currency Payroll

You can read the release notes on the version 13 release page.

Steps to switching to version-13

bench switch-to-branch version-13 frappe erpnext --upgrade
bench update
bench build

Reporting bugs and other issues

To report an issue create a Github Issue with proper descriptions, screenshots and error traceback.
You can also share the link of github issue in this thread.

Thanks to all the contributors and users of ERPNext and Frappe community to make this release happen.


Thats great!!!

@nabinhait Bench Migrate Issue

Please advise . Thanks

frappe@frappe:~/frappe-bench$ bench --site site1.local migrate
Migrating site1.local
Updating DocTypes for frappe        : [====================] 100%
Updating DocTypes for erpnext       : [=====               ] 26%

There was an issue while migrating the DocType: Customer

Traceback (most recent call last):
  File "/home/frappe/frappe-bench/apps/frappe/frappe/database/mariadb/schema.py", line 75, in alter
  File "/home/frappe/frappe-bench/apps/frappe/frappe/database/database.py", line 152, in sql
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_result
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py", line 1075, in read
    first_packet = self.connection._read_packet()
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packet
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/protocol.py", line 220, in check_error
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.IntegrityError: (1062, "Duplicate entry '' for key 'represents_company'")

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 101, in <module>
  File "/home/frappe/frappe-bench/apps/frappe/frappe/utils/bench_helper.py", line 18, in main
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/frappe/frappe-bench/env/lib/python3.6/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/commands/__init__.py", line 27, in _func
    ret = f(frappe._dict(ctx.obj), *args, **kwargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/commands/site.py", line 300, in migrate
  File "/home/frappe/frappe-bench/apps/frappe/frappe/migrate.py", line 70, in migrate
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/sync.py", line 19, in sync_all
    sync_for(app, force, verbose=verbose, reset_permissions=reset_permissions)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/sync.py", line 70, in sync_for
    reset_permissions=reset_permissions, for_sync=True)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/modules/import_file.py", line 70, in import_file_by_path
    ignore_version=ignore_version, reset_permissions=reset_permissions)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/modules/import_file.py", line 143, in import_doc
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 267, in insert
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 982, in run_post_save_methods
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 847, in run_method
    out = Document.hook(fn)(self, *args, **kwargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 1136, in composer
    return composed(self, method, *args, **kwargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 1119, in runner
    add_to_return_value(self, fn(self, *args, **kwargs))
  File "/home/frappe/frappe-bench/apps/frappe/frappe/model/document.py", line 841, in <lambda>
    fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 247, in on_update
    raise e
  File "/home/frappe/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py", line 244, in on_update
    frappe.db.updatedb(self.name, Meta(self))
  File "/home/frappe/frappe-bench/apps/frappe/frappe/database/mariadb/database.py", line 291, in updatedb
  File "/home/frappe/frappe-bench/apps/frappe/frappe/database/schema.py", line 37, in sync
  File "/home/frappe/frappe-bench/apps/frappe/frappe/database/mariadb/schema.py", line 84, in alter
    fieldname, self.table_name))
  File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 424, in throw
    msgprint(msg, raise_exception=exc, title=title, indicator='red', is_minimizable=is_minimizable, wide=wide, as_list=as_list)
  File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 403, in msgprint
  File "/home/frappe/frappe-bench/apps/frappe/frappe/__init__.py", line 357, in _raise_exception
    raise raise_exception(msg)
frappe.exceptions.ValidationError: represents_company field cannot be set as unique in tabCustomer, as there are non-unique existing values

Can you add a link to your website

Bench console

l = frappe.get_all(“Customer”, fields=[“name”,“represents_company”])

for i in l:
if i.get(“represents_company”) == ‘’:
e = frappe.get_doc(“Customer”, i.get(“name”))
e.represents_company = None




Great job…thanks for the release…

ive been using beta-13 and when i run the command : bench update after the upgrade i get
No module named ‘psutil’

what to do now?

@hpema108 run the below command in the frappe-bench directory.

./env/bin/pip install psutil


I get this error when I try to customize dashboard in accounting, seems that some doctypes are not mapped correctly. Can anyone confirm if the problem exists from the build or from my side only.


it now updates but when i go try to login it loads the desk and quickly jumps to the home page. Im also noticing an error message about nodejs being 8 and its required 10 - could this be part of the issue?

Bank Statement Transaction, Bank Statement Settings and bank-reconciliation are deprecated, remove those.


Has immutable ledger been deferred ?

I noticed that lot of “frappe app”-based phrases are untranslatable from CSV. Is it something I am doing wrong, or do others have the same issue?

My translation.csv looks like this.

Words in english,Words to my liking
Another words in english,Another words to my liking

1 Like

So happy to see the release right on time! Pretty excited :heart_eyes: :partying_face:

Also, if you run into errors while running bench build, run bench setup requirements and build again.

1 Like

Thanks so much to everyone involved.

Please let us know when the VM will be updated to v13 (http://build.erpnext.com/ERPNext-Production.ova)


What will be the command for a fresh install?


I was using beta version 13. Running this command in this order leaves error and renders installation inaccessible :frowning:

yarn install v1.22.10
[1/4] Resolving packages…
[2/4] Fetching packages…
error chalk@4.1.0: The engine “node” is incompatible with this module. Expected version “>=10”. Got “8.17.0”
error Found incompatible module.
info Visit yarn install | Yarn for documentation about this command.
Traceback (most recent call last):
File “/usr/local/bin/bench”, line 11, in
load_entry_point(‘bench’, ‘console_scripts’, ‘bench’)()
File “/home/frappe/.bench/bench/cli.py”, line 41, in cli
File “/usr/local/lib/python3.6/dist-packages/click/core.py”, line 764, in call
return self.main(*args, **kwargs)
File “/usr/local/lib/python3.6/dist-packages/click/core.py”, line 717, in main
rv = self.invoke(ctx)
File “/usr/local/lib/python3.6/dist-packages/click/core.py”, line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/usr/local/lib/python3.6/dist-packages/click/core.py”, line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File “/usr/local/lib/python3.6/dist-packages/click/core.py”, line 555, in invoke
return callback(*args, **kwargs)
File “/home/frappe/.bench/bench/commands/update.py”, line 43, in switch_to_branch
switch_to_branch(branch=branch, apps=list(apps), upgrade=upgrade)
File “/home/frappe/.bench/bench/app.py”, line 417, in switch_to_branch
switch_branch(branch, apps=apps, bench_path=bench_path, upgrade=upgrade)
File “/home/frappe/.bench/bench/app.py”, line 409, in switch_branch
NameError: name ‘utils’ is not defined

go to /home/frappe/.bench/bench/
and git pull
then try …
this is what am doing now i have other isssues am working on it

1 Like

this open issue supposed to be solved before the release