CRM (Salesforce)
Pushes CXOS-computed insight — LTV band, propensity, relationship context — back into Salesforce so sales and account teams see it in their native workflow.
High-Level Design
Reverse ETL puts CXOS insight where sales already works, instead of a separate tool.
💼 Business Context
- Sales and account teams live in Salesforce — pushing LTV, propensity, and relationship context there means insight gets used, instead of sitting in a dashboard salespeople never open
- Closes the loop with a system that is itself a Data Sources input, making Salesforce both a source and a destination
- Owned by Revenue Operations / Platform Engineering
🔌 Technical Overview
A scheduled .NET Core Reverse ETL job (Docker container on Azure Container Apps Jobs) reads computed fields — LTV band, upsell propensity, churn risk, household/account relationships — from the relevant marts tables via the Query & Analytics Engine, maps them to custom fields on the Salesforce Account/Contact object, and writes them via the Salesforce Bulk API for efficient high-volume upsert. Field mappings are version-controlled configuration, not hardcoded, so adding a new synced field doesn't require a code change.
Synced Fields
💾 Salesforce Field Mapping
{
"salesforce_object": "Account",
"field_mappings": {
"CXOS_LTV_Band__c": "marts.customer_profile.ltv_band",
"CXOS_Churn_Risk__c": "marts.propensity_scores.churn_risk"
},
"sync_method": "bulk_api_upsert",
"schedule": "hourly"
}
🔗 Integration Points
- Business Systems (Data Sources) — Salesforce as an original source, distinct from this reverse sync
- Query & Analytics Engine — reads the marts tables being synced
- Salesforce Bulk API — the write mechanism for efficient high-volume upsert
- Consent Enforcement — synced fields respect the same purpose-based consent rules as any other consumer
🧰 Services Consumed
- Owning microservice —
Cxos.Connectors.Salesforce (write path)(see the Full Application Service Map) - No dedicated database — stateless connector (see Platform Connectors above)
⚠️ Non-Functional Considerations
- Scale: bulk API upsert handles the full account/contact base in a single scheduled run rather than per-record calls
- Latency: hourly sync cadence by default, tunable per field group based on how time-sensitive the insight is
- Reliability: partial-batch failures are retried at the record level via Bulk API job status polling, not treated as an all-or-nothing failure
- Security/Privacy: only fields explicitly approved for CRM sync are mapped — Reverse ETL does not become a shortcut around the same field-level entitlement rules the Profile API enforces
🎯 Enterprise Example
An account executive opens a Salesforce account record and sees CXOS-computed churn risk and upsell propensity directly on the page — insight that previously required logging into a separate BI tool now shows up automatically in the tool they already work in every day.