# ERPNext AI Builder: Build and Customize ERPNext

Canonical: https://erpfly.com/erpnext/
Last updated: September 14, 2026

Tell erpfly what your ERPNext should do. It writes the Frappe app, installs it on a copy of your site, and opens a pull request when you’re happy with it.

Versions: ERPNext v16, v15. Delivered as: Frappe app. Deploy with: bench or Frappe Cloud.

### Build a new Frappe app

For processes ERPNext doesn’t cover: rentals, calibration, inspections, your own customer portal. You get an app that installs with bench and has its own DocTypes, logic, reports and tests.

- DocTypes and child tables
- Controllers and hooks.py events
- Script Reports and a Workspace
- Unit tests and migration patches

More: https://erpfly.com/erpnext-custom-module-development/

### Customize the ERPNext you run

For changes to Sales Order, Item, Employee and the rest. Everything is exported as fixtures inside a small app, so staging and production end up with the same fields and rules.

- Custom Fields and Property Setters
- Workflows and Authorization Rules
- Print Formats written in Jinja
- Client Scripts where the form needs them

More: https://erpfly.com/erpnext-customization/

### Example requests

- **Request:** Block submitting a Sales Order when the customer is on credit hold, unless an Accounts Manager does it.
  **Result:** A Check field on Customer, a before_submit hook on Sales Order, a role check and a test for both paths. (https://erpfly.com/modules/sales-order-management/)
- **Request:** Sync our ZKTeco punches into Employee Checkin every 15 minutes.
  **Result:** A settings DocType for device IPs, a scheduler_events entry in hooks.py, and an Error Log entry when a device doesn’t answer. (https://erpfly.com/modules/attendance-management/)
- **Request:** Bin locations inside each warehouse, and pick lists sorted by walking order.
  **Result:** A Bin Location DocType linked to Warehouse, a field on Pick List Item, and a sort applied when the pick list is created. (https://erpfly.com/modules/warehouse-management/)
- **Request:** A tax invoice print format with our bank details and the HSN code on every line.
  **Result:** A Print Format in Jinja shipped as a fixture, using the item’s gst_hsn_code and the company’s default bank account. (https://erpfly.com/modules/invoice-management/)
- **Request:** Tools have calibration due dates. A job card can’t start if one of its tools is overdue.
  **Result:** A Tool Calibration DocType, a validate hook on Job Card, and a daily job that emails the maintenance lead a week ahead. (https://erpfly.com/modules/manufacturing/)
- **Request:** Machine rentals with deposits and a damage check on return.
  **Result:** Submittable Rental Booking and Damage Inspection DocTypes, a Sales Invoice made on return, and a report of machines out today. (https://erpfly.com/erpnext-custom-module-development/)

### How it fits the ERPNext you already run

**Self-hosted on bench.** The pull request is an ordinary Frappe app. Your developer runs bench get-app with the repository URL, installs it on the site, and runs bench migrate on later updates. Nothing about how your bench is set up has to change.

**On Frappe Cloud.** Custom apps need a private bench group on Frappe Cloud. Connect the GitHub repository to the bench, deploy, then install the app on your site. Shared benches only offer apps from the marketplace, so this is the one setting to check before you start.

**Customizations that survive upgrades.** Changes made in Customize Form live only in one site’s database. erpfly exports them as fixtures inside the app, so Custom Fields, Property Setters and Workflows reach staging and production the same way, and a move from v15 to v16 doesn’t leave half of them behind.

**Server Scripts or an app?.** Server Scripts are fine for a one-line rule. They are switched off by default on self-hosted benches, can’t import libraries and don’t come with tests. As soon as a change touches more than one DocType, erpfly writes an app instead.

### FAQ

### Does erpfly work with ERPNext on Frappe Cloud?

Yes, as long as the site is on a private bench group. Custom apps can’t be installed on shared benches. You connect the repository erpfly pushes to, deploy the bench, and install the app on your site.

### Can it change standard DocTypes like Sales Invoice?

Yes. It adds Custom Fields and Property Setters, hooks into document events from hooks.py, and exports all of it as fixtures. It never edits files inside the erpnext or frappe apps, so updates don’t overwrite your changes.

### Which ERPNext versions does it support?

ERPNext and Frappe v15 and v16. You pick the version before you start, because the generated code targets that version exactly. If you’re on v14 or older, plan the upgrade first.

### Will it work alongside HRMS, Healthcare or our own apps?

Yes. When you connect a staging site, erpfly reads the installed apps and their DocTypes, and lists the ones your new app depends on in required_apps. HRMS has been a separate app since v14, so HR changes build on it rather than on ERPNext.

### What happens when I type in the chat box on this page?

It opens the erpfly builder with your description, the ERPNext version and the Build or Customize choice already filled in. Nothing is generated until you sign in and confirm.

### Sources

- [Installing an app, Frappe Cloud documentation](https://docs.frappe.io/cloud/installing-an-app)
- [Private Benches, Frappe Cloud documentation](https://docs.frappe.io/cloud/benches)
- [Server Script, Frappe Framework documentation](https://docs.frappe.io/framework/user/en/desk/scripting/server-script)
- [Supported versions, Frappe](https://frappe.io/support-versions)
- [Frappe HR repository, Frappe on GitHub](https://github.com/frappe/hrms)