The reason to run CRM inside Acumatica instead of bolting on a separate system is one word: continuity. A lead becomes a contact and business account, the account grows opportunities, an opportunity produces a quote, the quote becomes a sales order, the order ships and invoices, and the invoice posts to AR — all in one database, one security model, one audit trail. No sync jobs, no duplicate customer masters, no "which system is right" arguments. But that continuity only materializes if you configure the handoffs deliberately, and the handoffs are where every implementation I've done needed real work.
Stage 1: Lead → contact + business account
Leads (CR301000) are deliberately lightweight — a name, a company, a source. The important design decision is your qualification workflow: what has to be true before a lead converts? Acumatica's conversion action creates a contact and, optionally, a business account of type Prospect. The classic mistake is converting too eagerly and flooding Business Accounts with junk prospects that later collide with real customer records. I configure the lead workflow so conversion is only available from a Qualified state, and I put duplicate validation (built into CRM configuration) in blocking mode on both email and account name — cleaning duplicate business accounts after the fact is miserable because documents hang off them.
Stage 2: Opportunity → quote
Opportunities (CR304000) carry the pipeline: stage, probability, amount, and crucially products — line items with inventory IDs, quantities and prices. Whether teams fill in products or just a total amount is the fork in the road. If sales only types a number, the downstream automation dies here, because a quote and a sales order need lines. Getting salespeople to build product lines on the opportunity is an adoption battle, but it's the one battle worth fighting; everything after it is configuration.
From an opportunity you create a sales quote (CR304500), which snapshots the products, applies real pricing (price classes, discounts, taxes via the tax zone), and becomes the printable/emailable document. Quotes version properly — a revised quote supersedes the old one on the opportunity — and the approval map can require sign-off above a discount threshold, which I've wired for clients who kept discovering rogue 30% discounts at invoice time.
A business account of type Prospect cannot receive a sales order. The "Convert to Customer" step — assigning a customer class, terms, credit limit — is the real gate between CRM and ERP. Decide who owns that step (sales ops? finance?) and put it in the workflow explicitly. Implementations that leave it implicit get sales orders blocked at month-end and angry reps.
Stage 3: Quote → sales order → shipment → invoice
Converting a won quote creates the sales order with lines, prices and discounts intact. From there it's standard distribution: allocation, shipment (SO302000), confirm, prepare invoice, release to AR. Two configuration points matter for the CRM-to-cash seam:
- Credit hold. The moment a prospect becomes a customer with real terms, the credit checking rules on the customer class take over. If the class defaults credit limit to zero, every first order goes on hold. Set sensible class defaults or the "first deal" experience is a support ticket.
- Owner continuity. The salesperson on the opportunity should flow to the order and invoice for commission tracking. The default mapping mostly does this, but check it — commission disputes are the fastest way to lose sales-team trust in the system.
Automating the seams
The handoffs are also where small customizations pay off. A favorite: when an opportunity is marked Won, validate it actually has products before allowing the stage change. Ten lines in a graph extension:
public class OpportunityMaintExt : PXGraphExtension<OpportunityMaint>
{
protected virtual void _(Events.RowPersisting<CROpportunity> e)
{
var row = e.Row;
if (row == null || row.StageID != "W") return; // Won
CROpportunityProducts product =
SelectFrom<CROpportunityProducts>
.Where<CROpportunityProducts.quoteID
.IsEqual<@P.AsGuid>>
.View.SelectSingleBound(Base, null, row.QuoteNoteID);
if (product == null)
throw new PXRowPersistingException(
nameof(CROpportunity.stageID), row.StageID,
"An opportunity cannot be Won without product lines.");
}
}
Business events cover the notification layer: opportunity idle in a stage for 14 days, quote expiring, first order for a converted customer. These are configuration, not code, and they're what makes the pipeline feel alive to a sales manager.
Reporting across the whole funnel
Because everything shares one database, a Generic Inquiry can join leads to opportunities to orders to invoices and answer questions bolt-on CRMs answer only with export gymnastics: actual revenue by lead source, quote-to-order conversion by salesperson, average days from qualification to first payment. Build the funnel GI early — it's the artifact that convinces the sales team the data entry is worth it.
Wrapping up
Lead-to-cash in Acumatica is less a feature than a chain of well-defined handoffs: qualify before converting, force product lines before Won, gate the prospect-to-customer step explicitly, and let standard distribution carry it home. Configure the seams, automate the nagging with business events, and the single-database continuity does the rest.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.