Skip to main content

Overview

This guide walks you through connecting your Snowflake data warehouse to Permutive so you can import data for audience building and activation. You’ll configure your Snowflake instance with the necessary permissions using a setup script, then create the connection in the Permutive dashboard.
Prerequisites:
  • A Snowflake account with SECURITYADMIN and ACCOUNTADMIN roles
  • Access to run SQL scripts in your Snowflake instance
  • Knowledge of the database, schema, and warehouse you want to connect

Step 1: Set Up Your Snowflake Instance

To connect Permutive to your Snowflake instance, you’ll run a script that creates a dedicated user and role with read-only permissions. Choose between password authentication or key pair authentication.
Password authentication is the most straightforward method.

Run the Setup Script

Before running the script, replace the following placeholders:
  • <PASSWORD>: The password for PERMUTIVE_USER
  • <WAREHOUSE_NAME>: The warehouse Permutive will use to query data
  • <DATABASE_NAME>: The database you want to import
  • <SCHEMA_NAME>: The schema containing the tables you want to import
This script will:
  • Create a new role: PERMUTIVE_ROLE
  • Create a new user: PERMUTIVE_USER, with its session timezone set to UTC
  • Grant read access to the specified database and schema
  • Grant read access to all current and future tables within the schema
Create the user with its timezone set to UTC. Permutive compares incremental cursor values as UTC instants. If the user’s session timezone is not UTC, cursor columns without a timezone (TIMESTAMP_NTZ, DATE, TIME) are interpreted in the session timezone instead, which can cause syncs to silently miss rows — or import no rows at all. TIMESTAMP_TZ and TIMESTAMP_LTZ columns are unaffected.The setup scripts above set TIMEZONE = 'UTC' when creating the user. Because they use CREATE USER IF NOT EXISTS, they will not change a user that already exists — for an existing user, set it explicitly:

Step 2: Configure Network Policy (Optional)

Skip this section if you’re not using Network Policies to control traffic to your Snowflake instance.
If you use Network Policies, add Permutive’s IP addresses to your allowlist:

Create a User-Based Network Policy

We recommend creating a Network Policy attached to the Permutive user:
Attach the policy to the Permutive user:

Step 3: Create the Connection in Permutive

1

Select Snowflake from the Catalog

In the Permutive dashboard, go to Connectivity > Catalog and select Snowflake.
2

Enter Connection Details

Fill in the following fields:
Snowflake uses UPPERCASE for all database, schema, user, and role names. Ensure you use uppercase values when entering connection details.
3

Save the Connection

Click Save to create the connection. It will appear on your Connections page with a “Processing” status while Permutive validates the credentials.

Step 4: Create an Import

Once your connection is active, you can create imports. Permutive uses incremental updates based on a cursor column to sync data efficiently.

Cursor Column Requirements

When creating an import, you’ll need to select a cursor column. This column should be:
  • Monotonically increasing over time
  • Not updated after creation
  • Preferably unique or high-cardinality
  • Not nullable
Good cursor examples:
  • CREATED_AT or UPDATED_AT timestamp columns
Supported cursor data types:
  • TIMESTAMP_TZ, TIMESTAMP_NTZ, TIME, DATE
TIMESTAMP_NTZ, DATE, and TIME cursors have no timezone of their own, so they only compare correctly when the user’s session timezone is UTC (see the timezone warning in Step 1).
1

Navigate to Imports

Go to Connectivity > Imports and click Create Import.
2

Configure the Import

  1. Select Snowflake as the source type
  2. Select your Snowflake connection
  3. Choose the schema and table to import
  4. Select your cursor column
  5. Continue with the standard import configuration
For more details on configuring imports, see Imports.

Supported Data Types

Permutive supports the following Snowflake data types:
Semi-structured data types (OBJECT and ARRAY) are not supported. If your tables contain these types, you must transform the data into a flattened format before Permutive can sync it.

Handling Semi-Structured Data

If your source tables contain OBJECT or ARRAY columns, create a View that flattens the data:
Configure Permutive to sync from the view instead of the raw table.

Security Best Practices

  • Use a dedicated read-only role and user per environment
  • Limit grants to only the schemas you need
  • Consider multi-factor policies for administrative users

Granting Access to Multiple Schemas

To grant access to additional schemas, repeat the following for each schema:

Troubleshooting

If you receive authentication errors:
  • Verify the account locator/region in your host URL
  • Double-check the username and password
  • Ensure you’re using UPPERCASE for database, schema, user, and role names
Solution: Re-check your connection details and ensure they match exactly what was created by the setup script.
If you receive permission errors:
  • Confirm USAGE grants on the warehouse, database, and schema
  • Verify SELECT grants on tables/views (including future tables)
Solution: Re-run the permission grants from the setup script or add missing grants manually. After updating permissions, run a schema resync in Permutive to refresh the available tables.
If you receive cursor-related errors:
  • Ensure the cursor column exists in the table
  • Verify it’s one of the supported data types
  • Avoid using nullable columns as cursors
Solution: Choose a different cursor column that meets the requirements.
If rows are missing or being re-synced:
  • This can occur if multiple rows share the same cursor value
Solution: If needed, reset the connection state in Permutive and re-run the import. Consider using a higher-cardinality cursor column.
If an import runs successfully but misses rows that are present when you query the table directly, check the user’s session timezone. When it is not UTC, cursor columns without a timezone (TIMESTAMP_NTZ, DATE, TIME) are interpreted in the session timezone, offsetting the cursor comparison.Solution: Set the user’s session timezone to UTC, then trigger a new sync:
Confirm the effective value with:
If connections are being blocked:
  • Ensure Permutive’s IP addresses are allowlisted in your Network Policy
Solution: Add Permutive’s IP addresses to your Network Policy (see Step 2).
If the public key fingerprints don’t match:Solution: Reassign the public key to the user:

FAQ

All standard Snowflake editions are supported.
Yes, with USAGE on the schema and SELECT on the view.
If a table lacks a monotonically increasing column like a timestamp, it may not be suitable for incremental sync. You would need to add one to the table schema before importing.

Next Steps

Create an Import

Learn how to import data from your Snowflake connection

Back to Sources

Return to Sources overview