New: Supaflow Claude Plugin -- let Claude create, edit, and monitor your data pipelines. Try the plugin

SUPABASE → SNOWFLAKE

Supabase to Snowflake

Choose an RLS-scoped Supabase Auth connection or a PostgreSQL database user for warehouse-wide replication.

Use the dedicated Supabase source when Snowflake should receive the rows visible to an application user. Use the PostgreSQL source when a database user should replicate every table and row it is permitted to read. Every connector is included on every Supaflow plan — you pay only for the compute your pipelines consume.

Two access paths for tenant-scoped exports or centralized warehouse replication: with no per-row fees.

What the Supabase to Snowflake connector does

Verified connector behavior and known limits for this source.

Supabase to Snowflake capability matrix — connector features, how each works, and known limits
FeatureHow it worksLimit / caveat
Supabase Auth and RLSConnect with a publishable or legacy anon key, then sign in with email/password or magic link. Each row read uses the signed-in user session, so Supabase evaluates that user's Row Level Security policies.RLS controls source-row visibility. The connector does not copy Supabase RLS policies into Snowflake.
PostgreSQL database-user replicationFor centralized replication, connect the PostgreSQL source with a dedicated database username and password. It discovers schemas and tables visible to that user and reads every selected row the user is permitted to access.Grant the database user CONNECT, schema USAGE, and table SELECT for the intended scope. This path uses PostgreSQL credentials, not Supabase Auth or API keys.
Metadata discovery without a service-role keyA metadata helper installed in the Supabase project exposes schemas, tables, columns, and primary keys to the authenticated role. Actual row reads still use the signed-in user session.Install the helper in each connected project. Supabase secret keys are not required for discovery or reads.
Supported database objectsDiscovers ordinary and partitioned tables in public and other Data API-exposed schemas when the authenticated role has schema usage and table read access.Views and foreign tables are not discovered. Materialize view data into a table when it must be synced.
Timestamp-based incremental syncTables with a recognized modification column, such as `updated_at`, `modified_at`, or `last_modified_at`, can run in bounded incremental windows on your schedule.This is not WAL or logical-replication CDC. Incremental reads do not emit hard-delete events.
Deterministic paginationRead Page Size is configurable from 1 to 1,000 rows. Tables with a source primary key use stable key-based ordering across pages instead of relying on unordered offsets.An unbounded read that needs more than one page requires a primary key. The connector stops rather than risk duplicated or skipped rows.
PostgreSQL value mappingCommon PostgreSQL values are mapped to Snowflake types. Arrays, JSON, and JSONB follow the JSON path into Snowflake VARIANT; numeric and timestamp values use their corresponding canonical types.PostgreSQL types without a direct mapping fall back to readable strings rather than receiving a source-specific Snowflake type.
Rate limiting and session refreshThe connector refreshes Supabase Auth sessions before expiry. Transient throttling and server errors retry with backoff, jitter, cancellation checks, and Retry-After support.A revoked refresh token requires reconnection. Expensive RLS policies can still exceed the source project's statement timeout.
Snowflake destinationSelected Supabase tables land in generated Snowflake tables. Choose the Snowflake load behavior separately from the Supabase source sync mode.A Snowflake merge or overwrite strategy does not turn the Supabase source into a delete-event or CDC source.

Why Supaflow for Supabase to Snowflake

Every connector included, usage-based pricing

Every Supaflow connector is included on every plan at no extra cost. You pay only for compute consumed, measured in Supaflow Credits (1 credit = 1 billable job hour on an S (Small) Agent node). No per-row fees.

Match the connector to the access model

The dedicated Supabase source signs in as an application user, so a tenant-scoped export sees the rows allowed by that user's RLS policies. The PostgreSQL source signs in with an actual database username and password, so a centralized replication pipeline can read every selected table and row that database user is permitted to access.

Safe pagination for application tables

The connector uses source primary keys to keep multi-page reads deterministic. If a large table has no primary key, it fails with a specific correction instead of continuing through unordered offset pages that can duplicate or skip rows.

4 Supabase behaviors to account for

These source-specific cases affect discovery, parsing, or incremental reads. The notes below explain the failure mode and connector behavior.

Quirk 1

Supabase Auth and PostgreSQL use different credentials

Failure mode: Treating a Supabase API key as a PostgreSQL login sends the pipeline down the wrong setup path and does not provide a database connection.

Evidence: The Supabase source uses a publishable or legacy anon key plus an Auth user session. The PostgreSQL source requires a database host, database name, username, and password.

Fix: Use Supabase Auth for RLS-scoped reads. For warehouse-wide replication, create a dedicated read-only PostgreSQL user, grant the intended schema and table access, and connect through the PostgreSQL source.

Quirk 2

The row API does not provide enough metadata for safe replication

Failure mode: A row-only integration can read data but still miss schema, column, and primary-key metadata needed to build stable destination tables and paginate safely.

Evidence: The connector checks for the Supaflow metadata helper during setup and reports a specific error when the helper is missing or not visible.

Fix: Install the metadata helper once per Supabase project. It exposes metadata to the authenticated role while row reads remain RLS-controlled.

Quirk 3

Large tables without primary keys cannot be paged safely

Failure mode: Unordered offset pages can shift while rows are inserted or updated, causing duplicate or skipped rows during a large full refresh.

Evidence: After a full REST page without a source primary key, the connector stops before requesting another unsafe offset page.

Fix: Add a primary key to the source table, use a reliable incremental column, or keep a bounded read within one page.

Quirk 4

Complex RLS policies can hit the source statement timeout

Failure mode: Postgres may evaluate many candidate rows before RLS returns the visible set. A request can exceed `statement_timeout` even when the result page is small.

Evidence: The connector detects PostgREST timeout code `57014` and reports the affected Supabase table instead of returning a generic read failure.

Fix: Increase the timeout for the authenticated role or simplify the expensive policy. Lowering Read Page Size alone may not reduce the policy scan.

How it works

1

Choose the access boundary

Use the Supabase source when an application user's RLS visibility should govern the sync. Use the PostgreSQL source when a dedicated database user should provide broader replication access.

2

For RLS-scoped reads, connect Supabase Auth

Install the metadata helper, enter the project reference and a publishable or legacy anon key, then sign in with email/password or magic link as the user whose RLS visibility should govern the sync.

Supabase source docs
3

For warehouse-wide reads, connect PostgreSQL

Create a dedicated read-only PostgreSQL user, grant it CONNECT, schema USAGE, and table SELECT for the intended scope, then enter that user's database connection details.

PostgreSQL source docs
4

Select tables, Snowflake, and a schedule

Choose the tables and columns to replicate, select full refresh or a reliable incremental cursor, connect Snowflake, and run the pipeline on the cadence your freshness target requires.

Snowflake destination docs

Frequently asked questions

How does Supaflow sync Supabase to Snowflake?

Supaflow signs in as a Supabase Auth user and reads selected tables through the Supabase Data API. The source project evaluates that user's RLS policies before rows are returned, and the resulting rows load into generated Snowflake tables. A metadata helper supplies schema and primary-key information without a service-role key.

How is the Supabase source different from the PostgreSQL source?

The Supabase source uses a publishable or legacy anon key plus a Supabase Auth user session, so reads follow that application user's RLS policies. The PostgreSQL source uses an actual database username and password. It is the better fit for centralized replication because it can read every selected table and row that database user is permitted to access.

Can Supaflow replicate an entire Supabase database to Snowflake?

Yes. Use the PostgreSQL source with a dedicated database user that has CONNECT, schema USAGE, and table SELECT across the schemas and tables you intend to replicate. Supaflow can then read every selected row that user is permitted to access. Use the dedicated Supabase source instead when an application user's RLS visibility should limit the export.

Does Supaflow support incremental Supabase to Snowflake sync or CDC?

Supaflow supports scheduled timestamp-based incremental sync for tables with a recognized modification column such as `updated_at`. It does not use Postgres WAL, logical replication, or CDC, and incremental reads do not capture hard deletes. Use full refresh or model deletions explicitly when downstream removal is required.

Are Supabase RLS policies copied into Snowflake?

No. Supabase evaluates RLS at read time and returns only the rows visible to the configured Auth user. The connector copies those visible rows, not the policy definitions. Configure Snowflake roles, row-access policies, and grants separately for warehouse users.

How is pricing different from Fivetran or Hevo for Supabase to Snowflake?

Fivetran and Hevo commonly meter changed rows or volume, so a backfill or a high-churn application table can increase the month's bill. Every Supaflow connector is included on every plan at no extra cost. You pay only for compute consumed, measured in Supaflow Credits (1 credit = 1 billable job hour on an S (Small) Agent node). No per-row fees. See the pricing page for the credit packages and free tier.

Can I self-host the Supabase to Snowflake pipeline?

Yes. Run the Supaflow Agent in your VPC, or run it in your Snowflake account through the Snowflake Native App. In customer-controlled deployments, the data plane connects to Supabase and Snowflake from that environment; Supaflow Cloud keeps orchestration and encrypted connection metadata rather than processing the row data.

Can Supaflow sync a large Supabase table without a primary key?

Only when the selected read fits within one REST page or another explicit bound. Multi-page reads need a source primary key so the connector can order pages deterministically. Add a primary key, choose a reliable incremental column, or keep the selected read within the configured page limit.

Choose your Supabase-to-Snowflake access path

Every connector is included on every Supaflow plan — you pay only for the compute your pipelines consume. Use RLS-scoped Supabase Auth or an actual PostgreSQL database user, then run full-refresh or cursor-based incremental loads into Snowflake.