> For the complete documentation index, see [llms.txt](https://docs.coupler.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.coupler.io/destinations/categories/database/snowflake.md).

# Snowflake

Send data to Snowflake with Coupler.io. Centralize multi-source data in a cloud data warehouse with automatic type detection and SQL-native analytics.

Snowflake is a cloud-native data warehouse built for scalable analytics. Sending data to Snowflake with Coupler.io lets you centralize data from any supported source and run powerful SQL queries, build dashboards, and feed downstream analytics pipelines.

## Why use Snowflake as a Coupler.io destination?

* **SQL-native analysis** — query your imported data with any SQL tool, BI platform, or analytics framework
* **Type enforcement** — Coupler.io detects and maps column types automatically, so your data lands in Snowflake cleanly structured
* **Any source, one warehouse** — combine data from Google Ads, Stripe, HubSpot, Salesforce, and dozens of other sources into a single Snowflake database
* **Flexible destinations** — Snowflake is one of many destinations Coupler.io supports, alongside AI tools, Google Sheets, Excel, BigQuery, Data Studio, and others
* **Scheduled refreshes** — keep your tables up to date automatically on the interval that fits your workflow

## Prerequisites

* A Snowflake account with an active warehouse
* A Snowflake role with the following privileges:
  * **USAGE** on the target warehouse
  * **USAGE** on the target database
  * **USAGE** and **CREATE TABLE** on the target schema
  * **INSERT** on the target table
* The warehouse must be running (not suspended) at the time of the data flow run, or set to auto-resume

## Quick start

{% hint style="success" %}
Make sure your Snowflake warehouse is set to auto-resume so it wakes up automatically when Coupler.io connects. If the warehouse is suspended and auto-resume is off, the data flow will fail.
{% endhint %}

{% stepper %}
{% step %}
**Create a new data flow and add your source.** Log in to Coupler.io, click **Add data flow**, and configure your data source — this can be any source Coupler.io supports, such as Google Ads, Stripe, or HubSpot.
{% endstep %}

{% step %}
**Select Snowflake as your destination.** In the destination step, choose **Snowflake** from the list.
{% endstep %}

{% step %}
**Connect your Snowflake account.** Click **+ Add Account** and authenticate via OAuth. You'll be redirected to Snowflake's login page to authorize Coupler.io access. Once authorized, you'll return to Coupler.io automatically.
{% endstep %}

{% step %}
**Set your target database, schema, and table.** Enter the **database** name and **table** name where Coupler.io should write data. The **schema** defaults to `public` — change it if you use a different schema. If the schema or table doesn't exist yet, Coupler.io will create them automatically on the first run.
{% endstep %}

{% step %}
**Choose a write mode.**

* **Replace** — drops all existing rows in the table and loads fresh data on each run. Best for dashboards and reports that always reflect the latest state.
* **Append** — adds new rows below existing data without removing anything. Best for event logs, transaction history, or any time-series data.

{% hint style="warning" %}
If you use Append mode and your source data structure changes (e.g., new columns are added), you'll need to manually update the Snowflake table schema before the next run.
{% endhint %}
{% endstep %}

{% step %}
**Run your data flow.** Click **Save and Run** to trigger the first manual run. Coupler.io will connect to your Snowflake warehouse, create the table if needed, and load your data. Once the run completes successfully, you can set up a schedule.
{% endstep %}
{% endstepper %}

## Supported features

| Feature              | Supported |
| -------------------- | --------- |
| Replace mode         | Yes       |
| Append mode          | Yes       |
| Automatic scheduling | Yes       |
| Type enforcement     | Yes       |
| Templates            | No        |

## Snowflake common issues

### Connection issues

<details>

<summary>OAuth authorization fails or returns an error</summary>

This usually means something went wrong during the Snowflake OAuth flow. Common causes:

* Your Snowflake account URL is incorrect or the account is inactive
* Your browser is blocking pop-ups or third-party cookies required for the OAuth redirect
* The Snowflake user you're logging in with doesn't have a default role assigned

Things to try:

* Ensure you're logging into the correct Snowflake account
* Allow pop-ups for Coupler.io in your browser settings
* Check that your Snowflake user has a default role set (e.g., `SYSADMIN` or a custom role with the required privileges)
* Try disconnecting and reconnecting the Snowflake account in Coupler.io

</details>

<details>

<summary>Data flow fails because the warehouse is suspended</summary>

Snowflake warehouses can be suspended (paused) to save credits. If the warehouse assigned to your user or role is suspended and auto-resume is disabled, Coupler.io won't be able to execute queries.

To fix this:

* Enable **auto-resume** on the warehouse so it starts automatically when Coupler.io connects
* Alternatively, manually resume the warehouse in the Snowflake console before running the data flow

{% hint style="info" %}
You can enable auto-resume with: `ALTER WAREHOUSE your_warehouse SET AUTO_RESUME = TRUE;`
{% endhint %}

</details>

<details>

<summary>Connection times out during the data flow run</summary>

A timeout during the run (not at the OAuth step) can indicate the warehouse is too small for the data volume, or that Snowflake is experiencing transient issues.

* Try running the data flow again — transient timeouts often resolve themselves
* If the issue persists, consider scaling up the warehouse size temporarily for the initial load
* Check the Snowflake query history in the Snowflake console for more details on what failed

</details>

### Data issues

<details>

<summary>Append mode breaks after a source schema change</summary>

When using Append mode, Coupler.io writes new rows into the existing table structure. If your source adds new columns (for example, a new metric in your ad platform), Snowflake won't know about them and the run may fail.

To fix this, manually `ALTER TABLE` in Snowflake to add the new column(s) before the next run. After that, Coupler.io will populate them normally.

</details>

<details>

<summary>Data types are wrong in the destination table</summary>

Coupler.io detects and enforces column types automatically. However, if the table already exists with different column types from a previous run or manual creation, there can be a mismatch.

* If you're using **Replace** mode, try dropping the existing table and letting Coupler.io recreate it cleanly on the next run
* If you're using **Append** mode, check that the existing table's column types match what Coupler.io is trying to write

</details>

<details>

<summary>Data flow fails with an identifier or naming error</summary>

Snowflake treats unquoted identifiers as uppercase by default. If your table or column names contain mixed case or special characters, they may need to be quoted in Snowflake.

* Let Coupler.io create the table from scratch (using Replace mode on a new table) to avoid naming conflicts
* If you pre-created the table manually, make sure the column names match exactly what Coupler.io expects — check case sensitivity

</details>

### Permission errors

<details>

<summary>Permission denied when creating a schema or table</summary>

The Snowflake role associated with your connected account doesn't have enough privileges. Make sure the role has:

* **USAGE** on the target warehouse
* **USAGE** on the target database
* **USAGE** and **CREATE TABLE** on the target schema
* **INSERT** on the target table

You can grant these with:

```sql
GRANT USAGE ON WAREHOUSE your_warehouse TO ROLE your_role;
GRANT USAGE ON DATABASE your_database TO ROLE your_role;
GRANT USAGE ON SCHEMA your_database.your_schema TO ROLE your_role;
GRANT CREATE TABLE ON SCHEMA your_database.your_schema TO ROLE your_role;
GRANT INSERT ON ALL TABLES IN SCHEMA your_database.your_schema TO ROLE your_role;
```

{% hint style="info" %}
If you want Coupler.io to create new tables automatically, the role needs CREATE TABLE on the schema — not just INSERT on existing tables.
{% endhint %}

</details>

## Snowflake FAQ

<details>

<summary>What's the difference between Replace and Append mode?</summary>

**Replace** deletes all existing rows in the table and loads the latest data from your source on every run. Use this when you always want the table to reflect the current state — for example, a live snapshot of your ad campaigns or subscriptions.

**Append** adds new rows to the bottom of the table without removing existing data. Use this for historical tracking — for example, logging daily metrics, transaction events, or usage data over time.

</details>

<details>

<summary>What happens if the schema or table I specify doesn't exist yet?</summary>

Coupler.io will create them automatically on the first successful run. You don't need to pre-create anything in Snowflake — just make sure the connected role has USAGE on the database and CREATE TABLE privileges on the schema.

</details>

<details>

<summary>Can I send data from multiple sources into the same Snowflake database?</summary>

Yes. You can create multiple data flows, each pointing to the same Snowflake database but writing to different tables or schemas. You can also use a single data flow with multiple sources and apply Join, Append, or Aggregate transformations before the data lands in Snowflake.

</details>

<details>

<summary>Does Coupler.io enforce data types when writing to Snowflake?</summary>

Yes. Coupler.io detects column types from your source data and enforces them when writing to Snowflake. This means numeric fields land as numbers, dates as date types, and so on — rather than everything being stored as text. If the existing table has different types, you may see type mismatch errors. Letting Coupler.io create the table from scratch (using Replace mode on a new table) is the cleanest way to get properly typed columns.

</details>

<details>

<summary>Does my Snowflake warehouse need to be running for the data flow to work?</summary>

Yes. The warehouse must be running (or set to auto-resume) when Coupler.io executes the data flow. If the warehouse is suspended and auto-resume is off, the run will fail. Enable auto-resume in Snowflake to avoid this: `ALTER WAREHOUSE your_warehouse SET AUTO_RESUME = TRUE;`

</details>

<details>

<summary>What schema does Coupler.io use by default?</summary>

If you don't specify a schema, Coupler.io defaults to `public`. You can change this to any schema your Snowflake role has access to.

</details>

<details>

<summary>How does Coupler.io authenticate with Snowflake?</summary>

Coupler.io uses OAuth to connect to Snowflake. When you add a Snowflake account, you'll be redirected to Snowflake's login page to authorize access. No passwords are stored in Coupler.io — the connection is managed through OAuth tokens.

</details>

<details>

<summary>How do I keep my existing Snowflake data safe when using Replace mode?</summary>

Replace mode overwrites everything in the target table on each run. If you need to preserve historical data, switch to **Append** mode instead. Alternatively, set up a separate table for Coupler.io's writes and use SQL views or queries to combine it with your other data.

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.coupler.io/destinations/categories/database/snowflake.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
