Destinations & Activation → Reverse ETL / CDP Sync

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.

Data Source
Business Systems
Salesforce is also a source under Data Sources
→
Ingestion
Ingestion Layer
Salesforce connector — original data in
→
Processing
Rollups & Aggregations
Computes the marts feeding this sync
→
Foundation
Unified Customer Profile
LTV band, lifecycle stage source data
→
Intelligence
Propensity Scores
Upsell/churn scores synced alongside profile fields
→
Activation
CRM (Salesforce)
Scheduled Reverse ETL job → Salesforce Bulk API

💼 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

LTV band Churn risk / upsell propensity Household/account relationships Last-touchpoint summary

💾 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.

← Back to Reverse ETL / CDP Sync