Overview
Hightouch lets you pull data stored in your Snowflake warehouse and push it to downstream destinations.You can connect Snowflake to Hightouch using Snowflake Partner Connect to bypass the setup steps outlined below. You can learn more about this in Snowflake’s documentation.
Snowflake credential setup
To allow Hightouch access to Snowflake, it’s best to create a user specifically provisioned with access to the required tables and schemas. You can also use a personal Snowflake login for your credentials, as long as it has the correct permissions. You can use the following SQL template to create a service account with the necessary roles and permissions with some considerations:- This snippet provides an example of creating a service account; you may need to alter it depending on your Snowflake implementation details.
- RSA key pair authentication setup is detailed in the Provide credentials section.
- If you want Hightouch to access multiple databases, run the snippet multiple times, changing
ht_databaseeach time. - If you want Hightouch to have read-only access, omit the last line of the query.
- The snippet includes lines for creating a new warehouse and database for Hightouch to use; if you already have databases and warehouses you intend to use, omit these lines.
If you opt to use the Lightning engine, you must grant additional permissions.
Connection configuration
You may need to allowlist Hightouch’s IP addresses to let our systems connect to your Snowflake account. Reference our networking docs to determine which IP addresses you need to allowlist.You can also securely connect to your Snowflake account using AWS PrivateLink. AWS PrivateLink is a Business Tier feature.
Configure your source
Enter the following required fields into Hightouch:-
Account identifier: You can find this identifier at the beginning of your Snowflake URL, for example, (
https://ACCOUNT_IDENTIFIER.snowflakecomputing.com). Only enter theACCOUNT_IDENTIFIERand not the full URL. -
Warehouse: This specifies the warehouse to use when Hightouch executes queries in Snowflake.
You can choose to route all queries to a single warehouse, or configure separate warehouses optimized for different workloads (recommended):
- Route all queries to a single warehouse: Use this option if you want to use a single warehouse for all Hightouch operations.
-
Route queries to different warehouses (split by workload) (Recommended): This option allows you to optimize performance and cost by routing different types of queries to different warehouses:
- Batch warehouse: For background jobs like sync runs, schema sampling, audience snapshots, and other workloads that are not latency-sensitive. This warehouse can be optimized for cost efficiency.
- Interactive warehouse: For latency-sensitive queries (e.g., audience previews) and heavier workloads that need more compute (e.g., identity resolution). This warehouse should be sized up for best experience.
- Database: This specifies the database to use when Hightouch executes queries in Snowflake.
Account identifier format may differ based on Snowflake account age.For example, older Snowflake accounts often have identifiers that look like
ACCOUNT_LOCATOR.CLOUD_REGION_ID.CLOUD, whereas newer Snowflake accounts have identifiers that look like ORGNAME-ACCOUNT_NAME.For more details, visit Snowflake’s account identifier docs.Choose your sync engine
For optimal performance, Hightouch tracks incremental changes in your data model—such as added, changed, or removed rows—and only syncs those records. You can choose between two different sync engines for this work. The Basic engine requires read-only access to Snowflake. Hightouch executes a query in your database, reads all query results, and then determines incremental changes using Hightouch’s infrastructure. This engine is easier to set up since it requires read—not write—access to Snowflake. The Lightning engine requires read and write access to Snowflake. The engine stores previously synced data in a separate schema in Snowflake managed by Hightouch. In other words, the engine uses Snowflake to track incremental changes to your data rather than performing these calculations in Hightouch. Therefore, these computations are completed more quickly.
Basic versus Lightning engine comparison
The Lightning sync engine requires granting write access to your data warehouse, which makes its setup more involved than the Basic sync engine. However, it is more performant and reliable than the Basic engine. This makes it the ideal choice to guarantee faster syncs, especially with large data models. It also supports more features, such as Warehouse Sync Logs, Match Booster, and Identity Resolution.Hightouch can use Warehouse Export with Snowflake. Instead of streaming every row through Hightouch, it has Snowflake write query results directly into Amazon S3 (or your configured cloud storage), which Hightouch then reads. This speeds up syncs of large models. Warehouse Export runs automatically when your sync engine and storage support it, and Hightouch falls back to standard export when they don’t, so your syncs keep running either way.Snowflake exports to Amazon S3, so your workspace storage must be S3.If Warehouse Export runs into a fixable configuration problem, such as a storage-integration or bucket-permission issue, Hightouch stops using it for the affected syncs so it isn’t retried on every run, and shows this on the sync and on this source’s configuration page. After you resolve the problem, re-enable Warehouse Export from an individual sync, or for all of this source’s syncs at once from the source configuration page, and Hightouch uses it again on the next run.A one-off problem on a single run, such as a row that exceeds the Warehouse Export size limit, isn’t treated as a configuration issue: that run falls back to standard export and says so on the run summary, and Hightouch automatically retries Warehouse Export on the next run.By default, Warehouse Export unloads with
COPY INTO using short-lived credentials that Hightouch generates for each run. If your Snowflake account blocks inline-credential unloads (for example, the account parameter PREVENT_UNLOAD_TO_INLINE_URL = TRUE), or you prefer Snowflake to authorize the write with its own identity, point Warehouse Export at a named external stage backed by a storage integration instead.A named stage requires your workspace to export to your own cloud storage bucket. To set it up:- Create a storage integration and an external stage whose location is the root of the bucket Hightouch uses for this workspace, with no subfolder or key prefix.
- Grant the Hightouch Snowflake role
USAGEon the storage integration and the stage. - Enter the stage name (for example,
DB.SCHEMA.STAGE_NAME) in the source’s Warehouse Export settings.


Lightning engine setup
To set up the Lightning engine, ensure that the service account you previously created has the appropriate permissions. Specifically, append these commands to the service account creation:Provide credentials
Enter the following fields into Hightouch:- Username: This can be your personal Snowflake login or a dedicated user for Hightouch. When using the Basic engine, this user must have read access to the data you wish to sync. If using the Lightning engine, you must also grant the permissions described in the preceding snippet. Note: Use the “Login name”, which may differ from the Snowflake username.
- Role (optional) - Use this field to specify the role Hightouch should use when executing queries in Snowflake. If left blank, Hightouch uses the user’s default role.
- RSA key pair (recommended)
- Password
Snowflake is deprecating password authentication in favor of RSA key pair authentication or multi-factor authentication. Hightouch connections configured with password authentication continue to work only if Snowflake permits it. For details, see Snowflake’s MFA rollout guide. Check your Snowflake account for the rollout timeline.
RSA authentication
Generate a private key and public key by running the following commands in your terminal:ALTER USER command to assign the public key to your Hightouch Snowflake user:
Authentication Method of the Snowflake Source settings, drag and drop or upload the private key you just generated into the Private key file field. Enter the password for your private key in the box below here, unless you used an unencrypted key.
Test your connection
When setting up a source for the first time, Hightouch validates the following:- Network connectivity
- Snowflake credentials
- Permission to list schemas and tables
- Permission to write to
hightouch_plannerschema - Permission to write to
hightouch_auditschema
Manage warehouse compute
Hightouch runs queries in Snowflake to power audiences, syncs, and other workflows. Because Snowflake bills primarily on compute, your warehouse setup, schema design, and job frequency can affect both cost and performance. This section outlines recommended patterns to help you:- Keep Hightouch’s Snowflake usage predictable and easy to review
- Scope Hightouch’s access to only the data it needs
- Avoid unnecessary compute for common activation workflows
Recommended Snowflake setup
When you connect Snowflake to Hightouch, we recommend that you:-
Use a dedicated user, role, and warehouse
So compute usage and data access are easy to track and control. -
Set practical warehouse defaults
Start with a modest size, shorten idle time, and add reasonable query time limits. -
Separate interactive and scheduled work when needed
Run UI-driven queries and background jobs on different warehouses if you need stronger performance isolation. -
Design models with query cost in mind
Keep parent models focused, handle large event tables carefully, and combine tables only when it clearly helps. -
Review usage regularly
Use Snowflake’s cost dashboards, resource monitors, and query history to confirm performance and spend.
Use a dedicated user, role, and warehouse
Snowflake organizes access and compute around three objects:- A user (who runs queries)
- A role (what they can access)
- A virtual warehouse (where queries run)
Scope access with a dedicated role
The role controls which objects Hightouch can read and write.- Grant read access only to the databases and schemas that back your Hightouch models.
- Grant write access only when required (for example, for Warehouse Sync Logs or Hightouch-managed audit schemas).
- Avoid broad account-level privileges.
- Masking policies on sensitive columns
- Row- or column-level security
- Views that expose filtered or redacted data
Separate Hightouch from human users
Create a dedicated Snowflake user for Hightouch:- Set its default role to the Hightouch role.
- Set its default warehouse to the Hightouch warehouse.
- Use strong authentication (for example, RSA key pair authentication).
Isolate compute with a dedicated warehouse
The warehouse is the compute engine Snowflake bills.- Create a virtual warehouse dedicated to Hightouch (for example,
HIGHTOUCH_WH). - Attach it to the Snowflake source configuration in Hightouch.
- Attribute Snowflake credits to Hightouch
- Adjust warehouse settings without impacting other workloads
Set practical warehouse defaults
Once Hightouch has its own warehouse, a few settings determine how it behaves.Choose a starting size and adjust as needed
Start with a modest size rather than the largest option available. Many teams begin with Medium and adjust based on real usage. Watch for:- How long syncs and other Hightouch jobs take
- Whether Customer Studio previews remain responsive
- Whether Snowflake reports consistent queuing
If you see frequent queuing or slow UI performance, increase the size or simplify models before scaling up.
Reduce idle time with auto-suspend
Auto-suspend controls how long the warehouse stays running when idle. Snowflake’s default (often 10 minutes) is higher than many teams need. Reducing auto-suspend to around 1 minute, while keeping auto-resume enabled, is common. This helps the warehouse shut down soon after Hightouch stops issuing queries while still starting automatically when new work begins.Add query time limits as a safeguard
Statement timeouts limit how long a query can run and help prevent unexpectedly long-running workloads. The default timeout (2 days) is typically higher than necessary. Set a maximum duration that:- Covers your typical sync runtimes
- Prevents a query from running indefinitely
- Review Snowflake query history
- Identify the models or filters causing long runtimes
- Simplify the query before increasing the timeout
Use multi-cluster only when concurrency is the issue (optional)
Concurrency (sometimes called parallelization) means how many queries run at the same time. Multi-cluster warehouses can add extra clusters during busy periods to handle higher concurrency. This can help when:- Many Hightouch jobs run at once
- You see consistent queuing during peak times
- Usage spikes unpredictably
Separate interactive and scheduled work
Hightouch issues both interactive and batch queries:- Interactive: audience previews, traits exploration, dashboards, identity resolution, and other UI actions
- Batch: sync runs, heavy traits, sampling refreshes, and snapshots
Common pattern: two warehouses
Many teams use:- An interactive warehouse for fast UI queries
- A batch warehouse for scheduled and background jobs
- Create two warehouses (for example,
HIGHTOUCH_INTERACTIVE_WHandHIGHTOUCH_BATCH_WH). - Configure Hightouch to send interactive work to one and batch work to the other.
- Set size and auto-suspend settings independently.
Design Customer Studio models with query cost in mind
Warehouse configuration determines how much compute is available. Schema design strongly affects how much work each query must do and which data Hightouch touches.Keep parent and related models simple
For Customer Studio:- The parent model should represent the main entity (for example, customer or account).
- Include stable identifiers and frequently used segmentation fields.
- Include keys needed to join related models.
Limit event tables to what activation requires
Event tables can grow very large. To keep queries manageable:- Limit time windows to what activation actually needs
- Organize tables based on common filters (often date or tenant)
- Create smaller summary tables for common metrics when helpful
Combine tables only when it clearly helps
As a general guideline:- Keep data in separate tables by default.
- Combine tables only when it clearly improves common Hightouch queries.
- Avoid flattening very large tables unless it solves a specific performance problem.
Improve audience building performance
If Customer Studio previews feel slow, you can increase warehouse size—but before doing that, consider enabling sampling.- Sampling runs previews against a subset of rows for faster results.
- You can still run full queries for production syncs or reporting.
Reduce cost
Overspending typically results from multiple factors rather than a single issue.Reduce unnecessary query volume
Running more queries than needed increases cost by:- Keeping warehouses active longer
- Increasing concurrency, which may require larger warehouses
Right-size warehouses for your workload
Many teams overspend because their warehouse is larger than necessary. Aim for balance: enough capacity to meet performance expectations without paying for idle time or excess headroom.Monitor cost and usage
Use Snowflake’s built-in tools to validate Hightouch usage.Review cost dashboards
- Filter by warehouse name to track credit usage
- Compare Hightouch warehouses with other workloads
Use budgets and resource monitors
- Set budgets for Hightouch warehouses
- Configure alerts or automatic suspension for unexpected spikes
Inspect query history
- Filter by Hightouch user, role, or warehouse
- Identify expensive or slow queries
- Tie them back to specific models or workflows
Create models
Once your source configuration has passed the necessary validation, your source setup is complete. Next, you can set up models to define which data you want to pull from Snowflake. The Snowflake source supports these modeling methods:- writing a query in the SQL editor
- using the visual table selector
- leveraging existing dbt models
- leveraging existing Looker Looks
- leveraging existing Sigma workbooks
You must enable the Lightning sync engine to store sync logs in your warehouse.
FAQ
How can I tell how much compute Hightouch is using?
If you’re using a dedicated warehouse for Hightouch, most high-level cost questions can be answered directly in the Snowflake console.- Go to Admin → Cost Management.
- Open the Consumption tab.
- Filter by your Hightouch warehouse name.
- Credit usage over time
- Breakdown by warehouse
- Query and service-level cost trends

You must be an
ACCOUNTADMIN or have the necessary permissions to access these views.How can I identify specific queries driving cost?
For more detailed analysis, Snowflake exposes usage and query telemetry in the sharedSNOWFLAKE database.
Two views are especially useful:
SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
This view includes the CREDITS_ATTRIBUTED_COMPUTE column, which reports how many credits were consumed by each query.
- It accounts for concurrent queries by allocating weighted compute usage.
- It excludes idle time between query completion and warehouse shutdown.
- It allows you to identify the most expensive individual queries.
SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
This related view includes:
- Full SQL query text
- Query duration
- Bytes scanned and written
- Rows produced
- Queuing time
- Spill metrics
- Which queries consume the most credits
- Whether queuing is contributing to performance issues
- Whether large scans or joins are driving cost
Example: Identify expensive Hightouch queries in the last day
The following example joins query attribution and warehouse-scoped history to show the most expensive queries executed on a specific Hightouch warehouse in the last 24 hours:WAREHOUSE_NAMEto match your Hightouch warehouse- The time window in the
WHEREclause - The
RESULT_LIMITparameter
- Rank queries by compute consumption
- Inspect SQL text to identify inefficient joins or scans
- Confirm that configuration changes (warehouse size, routing, schema adjustments) are having the intended effect
Tips and troubleshooting
If you run into an issue this page doesn’t cover, .Connection timeout
When initially testing your connection, you may receive a connection timeout error. Once a connection is established, subsequent API requests should happen more quickly, so it’s best to retry the tests if they first fail. You can do this by clicking Test again.Network error: Could not reach Snowflake
You may receive this error if the input for Account identifier is invalid. Instead of using the complete Snowflake URL, for example,https://ACCOUNT_IDENTIFIER.snowflakecomputing.com,
ensure that you’re only using the ACCOUNT_IDENTIFIER part of the URL, for example, companyname-xu12345 or companyname-xu12345.us-east-1.
SQL compilation error with quoted identifiers
You may receive aSQL compilation error: invalid identifier '"column name"' error when your Snowflake table has column names that contain spaces or special characters. Snowflake requires double-quoted identifiers for these columns, but Hightouch’s query engine may not handle them correctly in all contexts.
To work around this, rename the columns in a CTE or view before using them in your Hightouch model:
JWT token is invalid
You may receive intermittentJWT token is invalid errors when using key pair authentication. This is typically caused by clock skew between your Snowflake account and Hightouch’s servers, and is more common after configuring dbt models or other tools that also use key pair auth.
Resetting the key pair in Snowflake and re-configuring the connection in Hightouch may temporarily resolve the issue. If the error recurs, for further troubleshooting.