Skip to content
How it works

From one paragraph to a pull request you’d actually merge

No magic. erpfly is a pipeline of fairly boring steps, each one there because we watched an ERP project go wrong without it.

  1. 1

    It reads what you already have

    Connect a staging site with a read-only key, or start from a clean install. erpfly pulls your DocType definitions, custom fields, installed apps and naming series (or, on Odoo, your installed modules and model fields). This is why the code it writes refers to your real Territory names and your real warehouse structure, not placeholders.

  2. 2

    You describe the job, not the schema

    Write it the way you would explain it to a new operations manager. "Anything over $20k needs Sara to approve" is better input than a list of fields. Paste a spreadsheet, a screenshot of a paper form, or last month’s process doc. erpfly works out the data model from the description.

  3. 3

    It asks before it guesses

    Ambiguity is where ERP projects go wrong, so erpfly stops and asks. Usually two or three questions: can one order have several deliveries, who can cancel after submit, what happens to stock if an inspection fails. You answer in plain words.

  4. 4

    Code, then tests, then a linter

    It writes the app or addon, generates tests from your rules, and runs both. A linter checks platform conventions: no core edits, no validation that only lives in JavaScript, no raw SQL built from strings, access rules on every new model. Failures are fixed before you see anything.

  5. 5

    You try it on a sandbox

    A disposable copy of your site boots with the module installed. Click through it, create records, try to break it. Ask for changes in the chat ("the approver should be the branch manager, not the sales head") and the sandbox updates.

  6. 6

    A pull request lands in your repo

    When it’s right, erpfly opens a pull request on GitHub or GitLab with the code, tests, migration patches and a README describing what changed. Your developer reviews it. You deploy through bench, Frappe Cloud, Odoo.sh or your own pipeline.

What the linter refuses to let through

Language models write plausible code. Plausible isn’t the same as safe. These are some of the checks every generated module has to pass before you see it.

  • SQL built with string formatting instead of parameters
  • ignore_permissions=True or sudo() without a written reason
  • New Odoo models without a line in ir.model.access.csv
  • frappe.db.commit() inside a document event
  • Edits to files inside the erpnext, frappe or Odoo core addons

We wrote more about this in our checklist for reviewing AI-generated ERP code.

erpfly check · rental_booking.py
$ erpfly check
 doctype/rental_booking      permissions defined for 3 roles
 doctype/damage_inspection   linked to Rental Booking
 rental_booking.py:48        frappe.db.sql uses f-string
 rewritten with %(machine)s parameter
 tests                       14 passed in 6.2s
 patches                     1 patch, idempotent
Ready for review.

Where to go next

Questions people ask us

Something missing? Email hello@erpfly.com and a person will answer.

Does erpfly need access to my production ERP?

No. It works best with a read-only API key on a staging site so it can read your schema. It never needs write access to production, and nothing is deployed until you merge the pull request yourself.

What model does erpfly use?

A mix. Large language models write the first draft, but a lot of the work is ordinary software: a schema reader, a linter tuned for Frappe and Odoo conventions, a test runner and a sandbox. The model is one part of the pipeline, not the whole thing.

What if the generated code fails its tests?

erpfly reads the failure, fixes the code and runs the tests again before showing you anything. If it can’t get to green after a few attempts, it tells you what’s failing instead of pretending it worked.

Can my developer edit the code and keep using erpfly?

Yes. erpfly reads the current state of the repository before each change, so hand edits are kept. It works like a colleague opening a new branch, not a generator that overwrites everything.

Your next module is one paragraph away

Write it the way you’d explain it to a new hire. We’ll turn it into an app you can read, test and install.

ERPNext v16