Skip to main content

Example 1: Salesforce -> Snowflake nightly sync

Workflow examples

Why this example

Sales and customer-success teams want BI dashboards driven by Salesforce records, but Tableau / Looker / Power BI cannot query Salesforce efficiently at scale. The standard pattern is a nightly batch that lands Salesforce Accounts and Opportunities into a Snowflake warehouse, where the BI tools already point.

Helix Beverages context: this is the workflow the Sales Ops team built to address BI lag (named problem 2 in the Helix overview). Sales and CS dashboards used to run a day behind because nobody could join Salesforce to MSSQL fast enough; this nightly batch lands the SF tables into the Snowflake warehouse that already feeds the leadership team's Monday review.

At a glance

  • Connectors used: Salesforce, Snowflake
  • Nodes used: Start, Source, Transform, Load
  • Schedule: daily at 02:00 UTC (low Salesforce-API quota window)
  • Direction: One-way (Salesforce -> Snowflake)

Canvas

Both source branches run in parallel; the single Start node fans out to both Source nodes.

Step-by-step

#NodeActionKey configurationOutput shape
1Start------
2Source: SF AccountsSalesforce: query AccountSOQL: SELECT Id, Name, Industry, AnnualRevenue, LastModifiedDate FROM Account WHERE LastModifiedDate > YESTERDAY{ Id, Name, Industry, AnnualRevenue, LastModifiedDate }
3Transform: SF Accounts--Rename Id to salesforce_id, cast AnnualRevenue to NUMBER(18,2), pass LastModifiedDate through.Snowflake-shaped row
4Load: Snowflake AccountsSnowflake: MergeTarget table WH.SALES.ACCOUNTS, merge key salesforce_id. Mode: Merge.--
5Source: SF OpportunitiesSalesforce: query OpportunitySOQL with same LastModifiedDate > YESTERDAY predicate.{ Id, Name, Amount, CloseDate, StageName, AccountId, LastModifiedDate }
6Transform: SF Opportunities--Rename + cast as above, map AccountId -> account_salesforce_id.Snowflake-shaped row
7Load: Snowflake OpportunitiesSnowflake: MergeTarget table WH.SALES.OPPORTUNITIES, merge key salesforce_id.--

Variations

  • Replace Snowflake with PostgreSQL or MSSQL -- swap the Load action's connector. The Transform stays identical; database targets share the same data-shape contract.
  • Run hourly instead of nightly -- bump the schedule and tighten the SOQL predicate to LastModifiedDate > LAST_N_HOURS:1.
  • Add a Notification node on the Snowflake Merge result -- wire the Load's error port to a Notification (SMTP) node that emails ops on failure.
  • Backfill mode -- drop the date predicate and switch the Load mode to Replace for a clean full reload.