Snowflake Streaming Destination Config Reference
Beta- free
- growth
- enterprise
8 minute read
Snowflake Streaming is a warehouse destination. RudderStack streams events as rows into tables in a Snowflake database through the Snowpipe Streaming API, in near real time, without staging files or a sync schedule.
In a Snowflake Streaming destination spec:
type: snowpipe_streamingdefinition_version: 1
Sample configuration
version: rudder/v1
kind: destination
metadata:
name: snowflake-streaming-prod
spec:
id: snowflake-streaming-prod
display_name: Snowflake Streaming Production
type: snowpipe_streaming
definition_version: 1
enabled: true
config:
account: xy12345.us-east-2.aws
database: RUDDER_EVENTS
warehouse: RUDDER_WAREHOUSE
user: "{{ .SNOWFLAKE_USER }}"
role: RUDDER_ROLE
namespace: rudder_events
private_key: "{{ .SNOWFLAKE_PRIVATE_KEY }}"
private_key_passphrase: "{{ .SNOWFLAKE_PRIVATE_KEY_PASSPHRASE }}"
enable_iceberg: false
skip_tracks_table: false
json_paths: track.properties.metadata,identify.traits.address
underscore_divide_numbers: false
allow_users_context_traits: false
connection_mode:
web: cloud
cloud: cloud
consent_management:
web:
- provider: oneTrust
consents:
- analyticsThe above example authenticates with an encrypted key pair and writes standard Snowflake tables. Iceberg tables are a choice you make when you create the destination — see Iceberg tables.
Config keys
config accepts only the keys listed below. The shared config key rules cover unknown keys, defaults, and immutability.
Connection
account
RequiredType:
string
Description:
Your Snowflake account identifier — the part of your Snowflake URL before .snowflakecomputing.com.
Notes:
- At most 100 characters, and must not contain line breaks.
- A
{{ path || fallback }}template is accepted in place of a literal.
database
RequiredType:
string
Description: Name of the Snowflake database RudderStack streams data into.
Notes:
- At most 100 characters, and must not contain line breaks.
- A
{{ path || fallback }}template is accepted in place of a literal.
warehouse
RequiredType:
string
Description: Name of the Snowflake virtual warehouse RudderStack runs its connection checks and schema changes on. Rows are streamed without it, so a small warehouse is enough.
Notes:
- At most 100 characters, and must not contain line breaks.
- A
{{ path || fallback }}template is accepted in place of a literal.
user
RequiredSecretType:
string
Description:
Snowflake user RudderStack connects as. The user authenticates with private_key — Snowflake Streaming doesn’t support password authentication.
Notes:
- At most 100 characters, and must not contain line breaks.
- A
{{ path || fallback }}template is accepted in place of a literal.
Supply it as a {{ .VAR }} reference rather than a literal — see Secrets.
See Create a user.
role
Type:
string
Description:
Role RudderStack assumes. When omitted, the user’s default role is used. The role needs permission to create schemas and tables in database.
Notes:
- At most 100 characters, and must not contain line breaks.
- A
{{ path || fallback }}template is accepted in place of a literal.
namespace
RequiredImmutableType:
string
Description: Schema RudderStack creates its tables in.
Notes:
- At most 64 characters, and must not start with
pg_in any capitalization. - A
{{ path || fallback }}template is accepted in place of a literal. - Unlike Snowflake, there’s no fallback to the source name. A spec that omits this key fails validation with
'namespace' is required. - Can’t be changed once the destination exists — the API rejects the update. Create a new destination instead.
Authentication
Snowflake Streaming authenticates with a key pair only.
private_key
RequiredSecretType:
string
Description:
PEM-encoded private key whose public half is assigned to user in Snowflake.
Notes:
- Must be a whole PEM block, from its
BEGIN PRIVATE KEYline to itsEND PRIVATE KEYline, or theENCRYPTED PRIVATE KEYequivalents. A bare base64 key body is rejected, and so is a PKCS#1RSA PRIVATE KEY. - Templates aren’t accepted.
{{ .VAR }}references are resolved before validation, so the resolved value is what must be PEM-shaped.
Supply it as a {{ .VAR }} reference rather than a literal — see Secrets. An environment variable can carry the key directly:
export RUDDER_SNOWFLAKE_PRIVATE_KEY="$(cat rsa_key.p8)"In a var file, use a YAML literal block:
SNOWFLAKE_PRIVATE_KEY: |
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY----- A reference that is the whole quoted value, such as '{{ .SNOWFLAKE_PRIVATE_KEY }}', keeps the line breaks in either quote style, including the single-quoted references rudder-cli import writes.
private_key_passphrase
SecretType:
string
Description:
Passphrase you set when encrypting private_key. Leave it out for an unencrypted key.
Notes:
- At most 100 characters, and must not contain line breaks.
Supply it as a {{ .VAR }} reference rather than a literal — see Secrets.
Authentication fails if the key is encrypted and this passphrase is missing. Rudder CLI doesn’t check that anENCRYPTED PRIVATE KEYcomes with a passphrase, sovalidatedoesn’t catch it.
Iceberg tables
By default, RudderStack creates standard Snowflake tables. With enable_iceberg, it creates Snowflake-managed Iceberg tables instead, which store their data as Parquet files in your own cloud storage. In Iceberg tables, JSON values are stored as VARCHAR strings and timestamps as TIMESTAMP_NTZ, without a time zone.
enable_iceberg
ImmutableType:
boolean
Default value:
false
Description: Create Snowflake-managed Iceberg tables instead of standard tables.
Notes:
- Requires
external_volume. - Can’t be changed once the destination exists — the API rejects the update. Create a new destination instead.
external_volume
RequiredType:
string
Description: Name of the Snowflake external volume Iceberg tables keep their data and metadata files on. The volume must already exist.
Notes:
- Required when
enable_icebergistrue. Leave it unset otherwise — the dashboard shows it only when Iceberg is on, and RudderStack ignores it without Iceberg. - At most 100 characters, and must not contain line breaks.
- RudderStack reads it only when it creates a table, so changing it later leaves existing tables on the old volume. To move to another volume, create a new destination.
- A spec that sets
enable_iceberg: truewithout it fails validation with'external_volume' is required when 'enable_iceberg' is true.
enable_iceberg: true
external_volume: RUDDER_ICEBERG_VOLUMETable behavior
Snowflake Streaming only appends rows. It never writes a users table — identify events go to the identifies table only — and doesn’t merge, so it has no keys for either.
skip_tracks_table
Type:
boolean
Default value:
false
Description:
Skip sending events to the tracks table. Per-event tables are unaffected.
json_paths
Type:
string
Description:
Comma-separated dot-notation paths whose values are stored as JSON columns instead of being flattened. Start each path with the event type it applies to, such as track.properties.metadata. A path without one applies to track events only.
Notes:
- Not validated locally.
json_paths: track.properties.metadata,identify.traits.addressSee JSON Column Support.
Legacy column naming
Both keys below preserve the column naming of destinations created before the behavior changed. Leave them at their defaults on a new destination. Neither can be changed once the destination exists — the API rejects the update.
underscore_divide_numbers
ImmutableInternalType:
boolean
Default value:
false
Description:
When false, numeric suffixes in column names are preserved: v3 stays v3 rather than being split into v_3.
allow_users_context_traits
ImmutableInternalType:
boolean
Default value:
false
Description:
When false, context.traits.* fields aren’t promoted to top-level traits and are stored only as context_traits_* columns.
Per-source keys
Both keys are objects keyed by the local source type — the tokens listed under Source types. A key naming a source type this destination doesn’t support fails validation.
connection_mode
Type:
object
Description: Maps each source type you connect to the mode its events reach Snowflake Streaming in, using the modes in Source types.
Notes:
- An entry is required for each source type you connect — see Connect a source.
connection_mode:
web: cloud
cloud: cloudconsent_management
Type:
object
Description:
Consent provider configuration per source type. The entry shape, accepted providers, and the rules on resolution_strategy and consents are shared across all destination types — see Consent management.
Source types
Snowflake Streaming accepts events from these source types in the mentioned connection modes:
| Source type | Connection mode |
|---|---|
android | cloud |
android_kotlin | cloud |
ios | cloud |
ios_swift | cloud |
web | cloud |
unity | cloud |
react_native | cloud |
flutter | cloud |
cordova | cloud |
cloud | cloud |
Every source type is cloud only — events reach Snowflake from RudderStack’s servers, never in device mode.
The dashboard additionally offers Snowflake Streaming to AMP, Shopify, and cloud app sources. Rudder CLI doesn’t manage those connections, soamp,shopify, andcloud_sourceare invalid here.
Connect a source
An event stream connection to this destination is checked against two rules at validate time.
The source’s type must be supported. A source’s type resolves to one of the tokens above before the check — a JavaScript source resolves to web, and webhook and server-side SDK sources resolve to cloud. Every type an event stream source can resolve to is supported here, so this check always passes.
The destination config must carry a connection_mode entry for that source type. This lives on the destination spec, not on the connection spec. Without it:
destination 'snowflake-streaming-prod' config has no 'connection_mode' entry for source type 'web'Snowflake Streaming needs no additional config keys to connect a source of any type.
Secrets
user, private_key, and private_key_passphrase are the secret keys. Write each one you use as a {{ .VAR }} reference and supply the value at apply time:
config:
user: "{{ .SNOWFLAKE_USER }}"
private_key: "{{ .SNOWFLAKE_PRIVATE_KEY }}"
private_key_passphrase: "{{ .SNOWFLAKE_PRIVATE_KEY_PASSPHRASE }}"export RUDDER_SNOWFLAKE_USER="RUDDER_USER"
export RUDDER_SNOWFLAKE_PRIVATE_KEY="$(cat rsa_key.p8)"
export RUDDER_SNOWFLAKE_PRIVATE_KEY_PASSPHRASE="..."
rudder-cli apply
# or
rudder-cli apply --var-file secrets.vars.yamlNote that:
rudder-cli importwrites only the secrets the API returns, as{{ .VAR }}references, and leaves the others out. Add any secret key it leaves out, then supply the variables before you apply — see Secrets.private_keyspans several lines. Use a YAML literal block in a var file, or an environment variable that carries the key file’s contents — seeprivate_key.
See How to Use Variable Substitution in Rudder CLI.
Changes by release
No changes since this type became available.
For changes across every destination type, see Destination Type Changes by Release.
See more
- Snowflake Streaming Destination for the warehouse, database, role, and user setup
- Snowflake Streaming with Iceberg Tables for external volumes and Iceberg table behavior
- Snowflake Destination Config Reference for the Snowflake destination, which loads data in batches on a schedule
- Destination Type Reference for Rudder CLI for the rules shared across destination types
- Destination YAML Reference for the spec envelope