~/projects/salesforce-crm-automation
CRM Automation
Apex + Flow orchestration for an enterprise client
- PROJECT_ID
- PROJECT_02
- TYPE
- ENTERPRISE_INTEGRATION
- STATUS
- PRODUCTION
- YEAR
- 2025
- COMPLEXITY
- O(n) bulkified, async callouts
- STACK
- Apex · Flows · Platform Events · Queueable · REST/SOAP · Odoo
§01
Introduction
Cutting manual CRM workflow time by 30% with declarative Flows for the 80% and bulkified Apex for the complex 20%, syncing to an ERP through Platform Events.
- › Record-triggered Flows own assignment, approvals and notifications so admins tune rules without deployments.
- › One-trigger-per-object Apex delegating to testable handler classes.
- › Platform Events decouple ERP callouts from the user transaction.
§02
Problem
Sales ops manually triaged inbound records, re-keyed data into an external ERP, and chased approvals over email. Throughput capped at what humans could click through in a day, and error rates grew with volume.
§03
Constraints
Automate routing and approvals without breaking existing processes, keep admins able to adjust rules without deployments, and sync to the ERP in near-real-time while respecting Salesforce governor limits.
§04
Architecture
PRESENTATION
Lightning Web Components
Reusable LWC with @wire adapters for reads and imperative Apex for writes; Lightning Message Service for cross-component events.
SERVICE
Apex (bulkified)
One-trigger-per-object pattern delegating to handler classes; every path bulk-safe and covered by unit tests (85%+).
ASYNC
Platform Events + Queueable
Long-running callouts moved off-transaction to respect governor limits.
INTEGRATION
REST / SOAP callouts
Named Credentials for auth, retry with exponential backoff, idempotency keys on outbound sync.
EXTERNAL
Odoo ERP + third-party APIs
Custom Odoo modules (Python/XML) receive normalized payloads; failures land in a replayable error queue.
§05
Implementation
Record-triggered Flows handle the declarative 80%. The complex 20% lives in bulkified Apex with Platform Events decoupling ERP callouts from the user transaction.
§06
Engineering challenges
Flow vs Apex per use case. Flows win on maintainability but lose on bulk performance and testability. The line was drawn at loops and callouts: anything iterating large record sets or touching external systems became Apex. Governor limits forced async orchestration via Queueable chains with retry and idempotency keys.
§07
Results
- −30%
- MANUAL_WORKFLOW
- 85%+
- APEX_COVERAGE
- idempotent
- ERP_SYNC
Manual workflow time dropped by up to 30%, sync errors became replayable instead of silent, and the org passed 85%+ test coverage.