How to import MT940 format bank statement for bank reconciliation?

As per the GitHub repository Bank Statement Import DocType supports importing bank statements in MT940 format. But when I try to import such a file practical it fails with error message Import template should be of type .csv, .xlsx or .xls

How to resolve this issue?

I am using:

  • “frappe”: “15.95.0”,
  • “erpnext”: “15.94.1”

All help is highly appreciated.

I have built a CLI to import bank statements into ERPNext using API. If you know how to enable API and leverage CLI, you may consider this.

1 Like

Dug into the ERPNext source to figure out what is actually going on here, and it is a version thing. MT940 support for Bank Statement Import was merged into the develop branch in June 2025 (PR #48013), but it was never backported to version-15. So on v15 the importer really does only accept csv/xlsx, no matter what the docs say. The feature ships properly in v16, which was just released this week. On v16 there is an “Import MT940 Format” checkbox on Bank Statement Import, and it parses the file with the python mt940 library and pushes it through the normal import pipeline.

So if upgrading to v16 is on your roadmap anyway, that is the clean fix. If you are staying on v15 for a while, the workaround that keeps your reconciliation flow unchanged is to convert the MT940 to CSV and use the standard importer. My company built a conversion API for exactly this kind of file, it is called Transmute. You post the MT940 and get back CSV or JSON with the amounts already normalized (including the comma decimal amounts European banks put in :61:). The free tier is 1,000 conversions a month with no card required, docs at https://docs.transmute.403fin.io if that is useful. The LedgerBridge CLI mentioned above is another route, whatever gets your statements in.

One caveat if you go the v16 route: bank MT940 files vary a lot in how they fill :86: (MultiCash subfields, free text, tilde separated), so if the native importer chokes on your specific bank’s file, converting to CSV first is still the fallback.