ERPNext integration with Frappe CRM

Any updates on this topic?
Thank you in advance

2 Likes

@michelle do you have any updates for us?

This is still WIP, will post once it’s done.

hopefully in time for Frappeverse :slightly_smiling_face:

4 Likes

Frappe CRM <> ERPNext Integration is now live!

Now, whether both apps are installed on the same site or across different sites, you can link Frappe CRM directly to your ERPNext instance.

Here’s how it works:

  1. When working on a deal in Frappe CRM, you’ll now see a “Create Quotation” button that takes you to ERPNext to continue the process.
  2. Once a deal is marked as “Won” or “Lost”, a customer is automatically created in ERPNext.

Check the video here.

References:

Feedback/suggestion and contributions welcome.

11 Likes

@michelle
Great news, thanks for your support!
How can we translate the Feappe CMR to Hungarian to stay all translation after updating.

1 Like

Great news!

I try to understand the future relationship between ERPNext and Frappe CRM and its usecase.

If I understand it correctly, the current integration is a one-way street?
Frappe CRM → ERPNext

What are the plans for ERPNext → Frappe CRM integration, since both work with their dedicated doctypes for (contacts, leads…). What is your plan for working with preexisting data from the ERPNext Database inside Frappe CRM?

2 Likes

Right now, no. Ideally, you should pick the CRM (Frappe CRM or ERPNext CRM module), and then continue using it.

If you plan to use Frappe CRM and are already using ERPNext CRM, then it’s going to be a one time migration. They’ll continue remaining separate doctypes.

We use Crowdin to manage translations now.

You can contribute to the translations here: Frappe dashboard in Crowdin

extracted from the linkedin comments, hope this is helpful to some asking the same question.

Is Frappe CRM different to the CRM module in ERPNext? Is there a benefit in installing a separate CRM app and then linking it to ERPNext, compared to using the inbuilt CRM?

Our plan is to continue extensive development in the new CRM now. The idea is to keep ERPNext lean, so maybe in future versions, we might completely separate out the existing CRM or stop active development in the module (which it already is).
If you just need a CRM tool, you should try Frappe CRM. If you are already using ERPNext CRM, then it will be a one-time migration for you if you plan to switch to Frappe CRM. Going forward, as more features will be added in Frappe CRM, there will be significant difference between the two.

4 Likes

We have a Site on Frappe Cloud & have installed the Frappe CRM
Both are on latest version
The ERPNext Integration is enabled - unable to see the create quotation Button
Not sure if we are missing any other settings



Screenshot 2024-09-22 at 9.45.52 AM

Can you share the site name?

Hi,
I did a patch release now the issue is fixed. Just update CRM version to v1.23.4

1 Like

Its working :+1:
Shall check in detail

1 Like

Hi @shariquerik

I get this error message when trying to link to ERPNext, same site, self hosted

Error

/api/method/frappe.client.set_value ModuleNotFoundError: Internal Server Error

Any ideas?

version

image

Share full error, check Error log doctype or check console

error log doctype data :point_down:

Title
‘NoneType’ object has no attribute ‘name’
method
Error
Traceback with variables (most recent call last):
File “apps/frappe/frappe/app.py”, line 114, in application
response = frappe.api.handle(request)
request = <Request ‘https://sitename/api/method/frappe.client.set_value’ [POST]>
response = None
rollback = True
e = AttributeError(“‘NoneType’ object has no attribute ‘name’”)
File “apps/frappe/frappe/api/init.py”, line 49, in handle
data = endpoint(**arguments)
request = <Request ‘https://sitename/api/method/frappe.client.set_value’ [POST]>
endpoint = <function handle_rpc_call at 0x7fad1aaf8160>
arguments = {‘method’: ‘frappe.client.set_value’}
File “apps/frappe/frappe/api/v1.py”, line 36, in handle_rpc_call
return frappe.handler.handle()
method = ‘frappe.client.set_value’
frappe = <module ‘frappe’ from ‘apps/frappe/frappe/init.py’>
File “apps/frappe/frappe/handler.py”, line 49, in handle
data = execute_cmd(cmd)
cmd = ‘frappe.client.set_value’
data = None
File “apps/frappe/frappe/handler.py”, line 85, in execute_cmd
return frappe.call(method, **frappe.form_dict)
cmd = ‘frappe.client.set_value’
from_async = False
server_script = None
method = <function set_value at 0x7fad1aac0160>
File “apps/frappe/frappe/init.py”, line 1775, in call
return fn(*args, **newargs)
fn = <function set_value at 0x7fad1aac0160>
args = ()
kwargs = {‘doctype’: ‘CRM Deal’, ‘name’: ‘CRM-DEAL-2024-00001’, ‘fieldname’: ‘status’, ‘value’: ‘Won’, ‘cmd’: ‘frappe.client.set_value’}
newargs = {‘doctype’: ‘CRM Deal’, ‘name’: ‘CRM-DEAL-2024-00001’, ‘fieldname’: ‘status’, ‘value’: ‘Won’}
File “apps/frappe/frappe/utils/typing_validations.py”, line 31, in wrapper
return func(*args, **kwargs)
args = ()
kwargs = {‘doctype’: ‘CRM Deal’, ‘name’: ‘CRM-DEAL-2024-00001’, ‘fieldname’: ‘status’, ‘value’: ‘Won’}
apply_condition = <function whitelist..innerfn.. at 0x7fad1aac00d0>
func = <function set_value at 0x7fad1aac0040>
File “apps/frappe/frappe/client.py”, line 188, in set_value
doc.save()
doctype = ‘CRM Deal’
name = ‘CRM-DEAL-2024-00001’
fieldname = ‘status’
value = ‘Won’
values = {‘status’: ‘Won’}
doc = <CRMDeal: CRM-DEAL-2024-00001>
File “apps/frappe/frappe/model/document.py”, line 337, in save
return self._save(*args, **kwargs)
self = <CRMDeal: CRM-DEAL-2024-00001>
args = ()
kwargs = {}
File “apps/frappe/frappe/model/document.py”, line 390, in _save
self.run_post_save_methods()
self = <CRMDeal: CRM-DEAL-2024-00001>
ignore_permissions = None
ignore_version = None
File “apps/frappe/frappe/model/document.py”, line 1128, in run_post_save_methods
self.run_method(“on_update”)
self = <CRMDeal: CRM-DEAL-2024-00001>
File “apps/frappe/frappe/model/document.py”, line 962, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
self = <CRMDeal: CRM-DEAL-2024-00001>
args = ()
kwargs = {}
fn = <function Document.run_method..fn at 0x7fad16cd1240>
method = ‘on_update’
File “apps/frappe/frappe/model/document.py”, line 1322, in composer
return composed(self, method, args, **kwargs)
self = <CRMDeal: CRM-DEAL-2024-00001>
args = ()
kwargs = {}
hooks = [<function create_customer_in_erpnext at 0x7fad16e679a0>, <function clear_doctype_notifications at 0x7fad18baee60>, <function process_workflow_actions at 0x7fad16bf2d40>, <function attach_files_to_document at 0x7fad1b440ee0>, <function apply at 0x7fad16be8ca0>, <function update_due_date at 0x7fad16be8d30>, <function apply_permissions_for_non_standard_user_type at 0x7fad18bae680>]
method = ‘on_update’
doc_events = {'
': {‘on_update’: [‘frappe.desk.notifications.clear_doctype_notifications’, ‘frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions’, ‘frappe.core.doctype.file.utils.attach_files_to_document’, ‘frappe.automation.doctype.assignment_rule.assignment_rule.apply’, ‘frappe.automation.doctype.assignment_rule.assignment_rule.update_due_date’, ‘frappe.core.doctype.user_type.user_type.apply_permissions_for_non_standard_user_type’], ‘after_rename’: [‘frappe.desk.notifications.clear_doctype_notifications’], ‘on_cancel’: [‘frappe.desk.notifications.clear_doctype_notifications’, ‘frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions’, ‘frappe.automation.doctype.assignment_rule.assignment_rule.apply’], ‘on_trash’: [‘frappe.desk.notifications.clear_doctype_notifications’, ‘frappe.workflow.doctype.workflow_action.workflow_action.process_workflow_actions’], ‘on_update_after_submit’: ['frappe.workflow.doctype.workflow_action.workflow_action.process_w…
handler = ‘frappe.core.doctype.user_type.user_type.apply_permissions_for_non_standard_user_type’
composed = <function Document.hook..compose..runner at 0x7fad16cd1090>
compose = <function Document.hook..compose at 0x7fad16cd2200>
f = <function Document.run_method..fn at 0x7fad16cd1240>
File “apps/frappe/frappe/model/document.py”, line 1306, in runner
add_to_return_value(self, f(self, method, *args, **kwargs))
self = <CRMDeal: CRM-DEAL-2024-00001>
method = ‘on_update’
args = ()
kwargs = {}
f = <function create_customer_in_erpnext at 0x7fad16e679a0>
add_to_return_value = <function Document.hook..add_to_return_value at 0x7fad16cd24d0>
fn = <function Document.run_method..fn at 0x7fad16cd1240>
hooks = (<function create_customer_in_erpnext at 0x7fad16e679a0>, <function clear_doctype_notifications at 0x7fad18baee60>, <function process_workflow_actions at 0x7fad16bf2d40>, <function attach_files_to_document at 0x7fad1b440ee0>, <function apply at 0x7fad16be8ca0>, <function update_due_date at 0x7fad16be8d30>, <function apply_permissions_for_non_standard_user_type at 0x7fad18bae680>)
File “apps/crm/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py”, line 199, in create_customer_in_erpnext
address = get_organization_address(doc.organization)
doc = <CRMDeal: CRM-DEAL-2024-00001>
method = ‘on_update’
erpnext_crm_settings = <ERPNextCRMSettings: ERPNext CRM Settings>
contacts = [{‘contact’: ‘Ash an’, ‘full_name’: ‘Ash an’, ‘email’: ‘as@gmail.com’, ‘mobile_no’: ‘0987654321’, ‘gender’: ‘Male’, ‘is_primary’: 1}]
File “apps/crm/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py”, line 177, in get_organization_address
“name”: address.name,
organization = ‘asdf’
address = None
builtins.AttributeError: ‘NoneType’ object has no attribute ‘name’

Raised a fix and released in version 1.23.5

1 Like