Description
The CRM module owns the commercial relationship with a counterparty: who it is, who works there, and the sales pipeline. It is upstream of the ERP module: the ERP depends on the CRM, never the reverse, and the CRM imports no ERP class and reads no ERP table.
- Counterparty: a company or a natural person (a person may carry first and last name, from which
nameis derived), shared by every company of the installation. Holds the legal identity (name, VAT number, tax id, address, e-invoice routing), an optional parent for groups, the bank accounts, and the aggregate customer/supplier flags written by the ERP. - LeadConversionService: turns a qualified lead into an open opportunity and marks the lead converted, in one transaction (the leads list has a "Convert" action).
- Contact: a person at one or more counterparties, optionally a Laraplate user. The link carries the contact's role at that counterparty (a
ContactRoletaxonomy node, configured without code) and whether it is the main contact (one per counterparty). - Lead and Opportunity: the pipeline, with
OpportunityStageas a Core taxonomy. - OpportunityLifecycleService: closes an opportunity as won; the ERP calls it when a quotation is accepted.
The ERP Party is the relationship between a counterparty and one company of the group; it reads and writes its legal identity through the counterparty.
Installation
Install Core first, then this module, then the ERP. Enable it with php artisan module:enable CRM; migrations run before the ERP ones (their file names are stamped earlier), and php artisan permission:refresh creates the CRUD permissions of its models.
Current Status
Parity with the former ERP M3.1 CRM, plus counterparties and counterparty bank accounts. Quotations stay in the ERP (a CRM Quote with its product catalogue is a future step). Campaigns, interaction history and ticketing are not built yet; see docs/superpowers/specs/2026-10-15-crm-module-design.md in the laraplate repository.
License
GNU AGPL v3.