Why most ERP CRMs end up half used
Here’s a pattern we’ve seen more times than we’d like. A company moves onto ERPNext or Odoo, the finance team is happy, and the sales team keeps its own spreadsheet on the side. The CRM in the ERP isn’t bad. It just asks for fields the reps leave blank and skips the three things the sales manager checks every Monday.
The fix is rarely a different CRM. It’s a CRM that has been bent to fit. That used to mean hiring a Frappe or Odoo developer, writing a spec, waiting for a quote and then waiting again. erpfly shortens the loop to the part that matters: you describe the way your team sells, you look at what gets generated, and you ask for changes until it’s right.
What a CRM module from erpfly contains
When you ask for a CRM, you don’t get a screenshot or a no-code toy. You get source code laid out the way an experienced developer would lay it out.
On ERPNext, that’s a Frappe app. Custom fields go into fixtures so they travel between sites. New objects such as a territory rule or a visit log become DocTypes with proper permissions. Business logic hooks into document events (before_insert, on_update, on_submit) through hooks.py instead of Server Scripts, because Server Scripts are hard to test and harder to review.
On Odoo, it’s an addon with a manifest, models that _inherit from crm.lead and sale.order, XML views that extend rather than replace the stock ones, access rules in ir.model.access.csv, and data files for stages and crons.
Both come with a short README that explains what was added and why. You can hand that to an auditor or a new developer and they’ll follow it.
A realistic example
Say you sell industrial pumps. Leads come in from your website and from three trade shows a year. Your rules are:
- Leads in the Gulf region go to Omar and Priya, alternating.
- If a lead sits untouched for 5 working days, the owner gets a reminder. After 10 days, their manager does too.
- Any quote over $20,000, or with more than 12% discount, needs the sales head to approve.
- When a deal is won, create the customer, the sales order and a delivery task for the service team.
That’s the whole prompt. erpfly asks one follow-up question (should people on leave be skipped in the rotation?) and then writes the module. The assignment rule is about 40 lines of Python. The approval step is a standard Workflow, so it shows up in the ERPNext UI exactly where your team expects it.
Things we’d tell you not to build
Not every CRM request is a good idea, and we’d rather say so up front.
- A lead scoring model with 30 inputs. Start with three signals you trust. You can add more once you see which leads actually close.
- A replacement for your email client. Logging emails against leads works well. Rebuilding Gmail inside ERPNext doesn’t.
- Custom fields for every edge case. If a field is filled in on less than one lead in ten, it probably belongs in a comment.
What to prepare before you ask
You don’t need a spec. But ten minutes of prep makes the first version much closer to right. Pull up an export of last quarter’s leads and look at which columns your team actually filled in. Write down your pipeline stages as the sales manager says them out loud, not as they appear in the software. And decide who is allowed to approve a discount, because that single question causes more back-and-forth than everything else combined.
How it fits with the rest of your ERP
A CRM on its own is a contact list with extra steps. The value shows up when it connects to what happens after the deal. Because erpfly generates modules against your real ERP schema, a won opportunity can flow into sales orders, then invoices, then support tickets in a helpdesk, without a single CSV export.
If you’re running ERPNext and want the wider picture, our page on ERPNext custom module development explains how generated apps are structured and deployed. Odoo teams should look at Odoo module development.