Easier way - Accounts Payable/Payment Entry

For uploading Payment Entries in bulk, you can use the data import tool.

Also, from the Payment entry page you can select multiple payment entries to print, if that is what you are looking for.

Then you can go to the “Menu” button and choose print option. Other bulk actions like cancel, delete etc. would be available in version 11.

Thanks for the response @Pawan! Data import tool isn’t a good way for a bookkeeper to handle this. It’s not feasible for her to do that every week.

Also, what I really need is from purchase invoice page - check off the invoices I wish to pay and have a bulk create payment entry. That would be ideal for us. Or, create payment entry for all invoices due by XX/XX/XX date.

It is a kind of auto payment feature, in SAP it is F110, both the relevant configuration and user operation are some what complicated, because there are so many things to be considered, e.g auto select the invoice to be paid by user defined criteria, auto determine the house bank to pay, also need to consider whether the due invoices to be paid now or in the future considering the payment term and discount, also whether the payment should be combined for multi invoices belong to the same commercial partner etc. anyway, in real business this is a very useful feature and heavily used, but with significant support and maintenance burden.

Per your idea, if we only concern batch creating the draft payment entries for selected invoices via ad hoc or saved filters, my draft idea about the possible solution is as following

  • Define and assign the naming series for cheque number which is mandatory
  • Show a popup window(dialog) with summary info about the total to be paid amount, how many suppliers, invoices, payment entries , let the user to confirm whether to proceed
  • In the backend take the selected invoice as input, base on assigned naming series to assign the cheque number, save the draft payment entry

for more strict control of such sensitive transaction, normally before generate the payment entry , there will be a separate step by the controller to review whether the submitted invoice is the right candidate for the upcoming payment run, so this review step will mark the reviewed invoice with a kind of payment batch number or simply block the invoices which need further clarification, thus later on the payment handling person can filter the invoices by payment batch number!

All in all, this is very important missing feature so far, if there are enough feedback and interests on this topic, I am willing to contribute the coding via pull request.


You really nailed it @szufisher. I do think this is a missing feature and I would be happy to pay for some of the development of this.

This would be a major time saver for us and probably others as well!

@charlie-cook, Could you please create this as GitHub issue by linking this post and also assigning the issue to @szufisher (i presume GitHub name is also same).

Once you do above, I’ll label it as “Paid Development” & we monitor it.
I will pitch in for some front-end testing, in case you need me. Guys, Let’s do it.


No need to duplicate an issue, @cradford open one on this already, 11814. @joshreeder, @jhk and I have already built it and it’s a contribution that’s planned. It relies on the Purchase Discounts PR (discussed here) and a soon-to be PR’d Indirect Expense.

It’s not strange that lots of US businesses need this (like @charlie-cook) and the sponsor of this code Evaqua Farms. @rmehta this is what I was talking about when I said I’d be stealing the best ideas from QuickBooks and make them work for ERPNext.


This is EXACTLY what we want! Our bookkeeper will absolutely LOVE this as it’s even better and more concise than our other archaic albeit custom system.

What will it take @rmehta for us to get this on the ERPNext Cloud?

Game changer for us on multiple levels - discounts, Accounts Payable, Payment Entry, bulk check printing, etc…

@tmatteson, if any development work is pending Or code review needed, might be we could ask @szufisher to pitch in.

To be noted! we see a willingness from the community to help each other in different way possible. Let’s get this moved swiftly.

1 Like

The process is pretty simple. @tmatteson has already mentioned that this will be contribututed so let’s wait for the Pull Requests. We are happy to help in any way.

I am willing to pay to get this expedited. Not sure how that works or who I pay but let me know! This will save us hours each week! :slight_smile:

@rmehta @charlie-cook I’ll link to branch with it in its current state by the end of the day. It’s working in a custom app and I’ve been building the other dependencies (discount payment terms, indirect expense). Code review today to get the Indirect Expense stuff ship shape.

1 Like

if you really need this new feature now, here is a simple workaround.

  1. go to purchase invoice list view, open the browser’s web console, copy & paste the following javascript code into the command line, then press ENTER
cur_list.page.add_menu_item(__("Auto Pay"), function() {
			var me = this;
			var dialog = new frappe.ui.Dialog({
				title: __("Create Payment Entries for selected invoices"),
				fields: [
					{"fieldtype": "Data", "label": __("Check Prefix"), "fieldname": "prefix"},
					{"fieldtype": "Int", "label": __("from check number"), "fieldname": "check_number"},
					{"fieldtype": "Date", "label": __("check date"), "fieldname": "check_date","reqd":1,"default": frappe.datetime.get_today()},
					{"fieldtype": "Button", "label": __("create Payments"), "fieldname": "make_payment_entry", "cssClass": "btn-primary"},
			dialog.fields_dict.make_payment_entry.$input.click(function() {
				var args = dialog.get_values();
				args.names = cur_list.get_checked_items().map(function (item) {
					return item.name;
				var eachcount=0;
						method: "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry",
						args: {
							"dn": v,
							"dt": cur_list.doctype
						freeze: true
					}).then(r =>{
						if (!r.exc){
							var cur_doc = frappe.model.sync(r.message);
							cur_doc = cur_doc[0];
							cur_doc.reference_no=args.prefix + (args.check_number+1);
								method: "frappe.desk.form.save.savedocs",
								args: { doc: cur_doc, action: "Save"},
								freeze: true
							}).then(r =>{
								eachcount ++;
								if (eachcount>= args.names.length){
									frappe.msgprint(__("Created " + args.names.length + " Payment entries"));
									frappe.route_options = {"reference_name": ["in",args.names.join(",")]};
									frappe.set_route("List","Payment Entry");							

here the screenshot for your reference

  1. select the to-be paid invoices , click the newly created Auto Pay menu as below

  2. input check number prefix, the start check number and payment day(default as today), click the Create Payment Button

  3. After finish, it will show a popup window with message xx payments created, switch to the payment entries list which filtered by the newly created payment entries

side note, currently custom script is not supported in list view, otherwise the above code can be included in the doctype’s custom script, thus no need to manually copy & paste the code into web console every time . anyway this is at least the doable huck!


Changes are on the agritheory-check_run branch. At minimum I’d expect the named to be changed to Cheque Run or Cheque Batch or something with the Indian English spelling of “cheque”.
@joshiparthin @jhk


@tmatteson great :+1:

@szufisher How does this work exactly? Do you still have to create a payment entry, attach the invoices to be paid, etc…?

What we need is something to select a grouping or purchase invoices (by due date) and have the system automatically calculate the total for each supplier and then print accordingly to the check.

@tmatteson Any progress on this? I’m considering switching off of ERPNext Cloud at this point so that I could potentially use this module you’ve created. Is it ready for prime time?

1 Like

Any update on integration into base ERPnext? Going from Payables list to printing checks for each Supplier with selected invoices for payment is too slow and cumbersome now.

Hi guys, any update on this feature?

I must presume we are doing something wrong as the payables payment process is basically impractical for anything more than a tiny amount of transactions per week.

Here is what we do to make 1 payment.
1 - CLICK on Accounts Payable link
2 - Order by due date
3 - CLICK on Supplier we want to pay
4 - CLICK on Payment Entry +
5 - CLICK on Payment Entry Type to select Pay
6- CLICK on Party Type to select Supplier
7 - CLICK on Party and enter letters to choose Supplier we just clicked on + from
8 - CLICK on Account Paid From and enter letters to choose. (WHICH HIDES Supplier balance)
9 - CLICK on Accounts collapsible link to show balance just hidden
10 - CLICK on amount and enter $
11 - CLICK on reference number and enter
12 - CLICK on reference date and select
13 - CLICK on Get Outstanding Invoice
14 - CLICK on From Date
15 - CLICK many times to go back in date
16 - CLICK to select date
17 - CLICK to uncheck Allocate Payment Amount
18 - OPEN other tab to be able to see info on unpaid invoices like date not just an internal PINV-#### series
19 - ENTER amounts 1 by 1 to allocate to invoices to be paid (no shortcut to pay completely)
20 - CLICK Save
21 - CLICK Menu and select Print
22 - CLICK on PDF
23 - from PDF window CLICK on Print

Twenty four steps (some involving multiple substeps) to MAKE ONE (1) SUPPLIER PAYMENT. We sometimes have 40 in 1 day. What are we doing wrong as I do not see how ERPnext is usable for anything more than micro-companies.

1 Like

We had this same exact experience. We created a custom “batch payment” system where we simply enter a date at the top for all payables through X date plus the starting check number. The system returns a list of payables due by that date and sorts them by supplier. We then click a “make payments” button and it will automatically create the payment entries for us. Then we go to Payment Entry screen and select all filtered on today’s posting date. Then we can click print and it will batch print the checks for us all at once. It’s still a process but it took us from those 24 steps you mentioned above for one payment to about 10 steps for all of our payables in that week.

We run our payable payments every Thursday so this allows our bookkeeper to spend about 1 hour in total running all of our checks plus putting them in the envelopes and putting stamps on so it’s pretty efficient now.

1 Like

To help others and presuming the bank account for paying is always the same, we now have it down to:
1 - CLICK on Accounts Payable link
2 - Order by due date
3 - CLICK on Supplier we want to pay
4 - CLICK on Pay All Invoices custom button
5 - OPEN other tab to be able to see info on unpaid invoices like date not just an internal PINV-#### series
6 - CLICK Save
7 - CLICK Menu and select Print
8 - CLICK on PDF
9 - from PDF window CLICK on Print

Still cumbersome, but less than half. Basically 1 click from Supplier to filled out Payment Entry. Still have to work on reducing all the steps from Payment Entry to printed check

To accomplish that is only the following client custom scripts:

  • Supplier
  • Payment Entry
    If someone can share how to insert a code block and keep formatting into these posts, I will share here.
1 Like