Integration

Sync Salesforce to Snowflake

Land Salesforce accounts, opportunities, and custom objects in Snowflake on the next poll of a change using Change Data Capture, model them next to the rest of your data, and write scores and segments back to Salesforce, with every load recorded as an ordered run you can replay.

Mainly Salesforce to Snowflake
Direction
Streamed via Salesforce CDC
Latency
Record created or updated
Common trigger
Scores and segments back
Reverse ETL

Why teams connect Salesforce and Snowflake

Salesforce is where the pipeline lives. Snowflake is where the company measures it against everything else: product usage, billing, support, marketing spend. Getting Salesforce into the warehouse usually means a managed connector you cannot see into, a nightly job that is hours stale, or a bulk export someone schedules and forgets.

  • Accounts, opportunities, and custom objects land in Snowflake on the next poll using Salesforce Change Data Capture, not on a nightly cycle
  • Every load is an ordered run log, so a number that looks off in a board can be traced to the exact sync and row that wrote it
  • Deleted and merged Salesforce records become soft deletes, so a historical report does not silently change
  • Model output, a fit score or a health segment, is written back to Salesforce on a schedule so reps see the same number as the analyst

Worked example

The load flow most teams turn on first.

Salesforce Opportunity changes into ANALYTICS.CRM.OPPORTUNITY, streamed

Change-driven through CDC, with a scheduled full reconcile so nothing drifts.

  1. 1Trigger: Salesforce New or updated record on Opportunity via Change Data Capture, batched every 10 seconds.
  2. 2Shape: map the CDC payload to the target column names and types using the table below, keeping the full change event in a _RAW column.
  3. 3Stage: for a batch above 5,000 rows, write to a stage and COPY INTO a scratch table. Below that, pass rows straight to the merge.
  4. 4Merge: MERGE INTO ANALYTICS.CRM.OPPORTUNITY t USING :batch s ON t.ID = s.ID, update on match, insert when not matched.
  5. 5Deletes: a Deleted record event sets IS_DELETED = TRUE and DELETED_AT = CURRENT_TIMESTAMP() rather than removing the row.
  6. 6Watermark: write the max SystemModstamp seen to a control table, so a replay knows where to resume.
  7. 7Nightly reconcile: a scheduled flow runs a bounded SOQL query and merges the result, catching anything a gap in the CDC stream dropped.

Field mapping

The starting map for the Opportunity to ANALYTICS.CRM.OPPORTUNITY step.

Salesforce fieldSnowflake columnNotes
IdID VARCHARMatch key for the merge. The 18-character ID.
AccountIdACCOUNT_ID VARCHARForeign key to ANALYTICS.CRM.ACCOUNT, not resolved inline.
NameNAME VARCHAR
StageNameSTAGE VARCHAREnum value kept as text. Join to a stage dimension for order and probability.
AmountAMOUNT NUMBER(18,2)Record-currency amount. See CURRENCY_ISO_CODE.
CurrencyIsoCodeCURRENCY_ISO_CODE VARCHAROnly present if multi-currency is on. Keep a AMOUNT_USD derived column for reporting.
CloseDateCLOSE_DATE DATEDate, not timestamp.
SystemModstampSYSTEM_MODSTAMP TIMESTAMP_NTZWatermark for reconcile. UTC.
OwnerIdOWNER_ID VARCHARJoin to a user dimension, not resolved inline.
(full CDC event)_RAW VARIANTKeep the whole payload so a new field does not need a backfill.
(derived)IS_DELETED BOOLEANSet by the delete and merge flow, default FALSE.

What syncs, each direction

  • Core and custom objects. Account, Contact, Opportunity, Lead, Case, and any custom object land as typed tables plus a raw VARIANT column. (Salesforce to Snowflake)
  • Field history and activity. Field history, tasks, events, and email activity stream into event tables for stage-velocity and activity modeling. (Salesforce to Snowflake)
  • Scores and segments. A model table of account fit, health, or propensity is written back to Salesforce custom fields on a schedule. (Snowflake to Salesforce)
  • Enrichment and hygiene. Firmographic fields, deduped account hierarchies, and do-not-contact flags computed in the warehouse update the matching Salesforce records. (Snowflake to Salesforce)

Governance and audit

The same controls apply to this sync as to every other Neblex workload.

  • Ordered run log. Every load is an event log with the batch, the merge statement, and row counts. Replay a run without re-reading from Salesforce.
  • Approval on write-back. Reverse-ETL flows that change Salesforce data can pause for review before the first run of a changed mapping.
  • Scoped access. Salesforce uses a connected app and a permission set limited to the synced objects. Snowflake uses a role with grants on the target schema only.
  • Environments. Build against a Salesforce sandbox and a Snowflake scratch schema, then promote the same flow to production.

Frequently asked questions

How fresh is the data in Snowflake?

CDC-driven loads land on the next poll to a minute of the Salesforce change. A nightly reconcile catches anything a gap in the CDC stream dropped.

What if an object does not support Change Data Capture?

The connector falls back to a scheduled query on that object's SystemModstamp, so the table still stays current, just on the schedule you set.

Do we get history, or just current state?

Both. Current-state tables are merged in place, and the raw change events are appended to a history table so a record can be reconstructed at a point in time.

What happens when a Salesforce record is merged or deleted?

The delete and merge flow sets IS_DELETED = TRUE and records the surviving ID for a merge, rather than removing the row.

Is this different from Salesforce's own connector or a managed pipeline?

Managed pipelines are fine if you only need scheduled tables and never need to see inside a load. This is for teams that also want streamed changes, a readable run log, write-back, and the same governance as their other integrations.

Connectors on this page

Salesforce

CRM

Operations
1,296
Typed outputs
57.9%
Change triggers
95 (poll)
Authentication
OAuth2

Snowflake

Snowflake

Operations
7
Typed outputs
85.7%
Change triggers
Poll or inbound webhook
Authentication
ConnectionString
See it on your data

Bring one real integration

We will build it with you against your own systems, with the run log open.