> 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/supabase/faq.md).

# FAQ

<details>

<summary>Which Supabase connection string should I use?</summary>

Use the **Session pooler** string. In your Supabase dashboard, click **Connect** and choose **Session pooler**:

| Field    | Value                                                       |
| -------- | ----------------------------------------------------------- |
| Host     | `aws-[region].pooler.supabase.com`                          |
| Port     | `5432`                                                      |
| Database | `postgres`                                                  |
| User     | `postgres.[project-ref]`                                    |
| Password | Your database password (not your Supabase account password) |

Coupler.io connects over IPv4. Supabase's direct connection (`db.[project-ref].supabase.co`) is IPv6-only unless your project has the paid IPv4 add-on, so it usually won't work. The shared pooler is IPv4 on every plan tier.

{% hint style="warning" %}
Don't use the Transaction pooler (port `6543`). Transaction mode doesn't support prepared statements or session-level settings, which leads to intermittent, hard-to-diagnose run failures.
{% endhint %}

</details>

<details>

<summary>Can I load data into a Supabase table that doesn't exist yet?</summary>

Yes. Enter any table name and Coupler.io creates it on the first successful run — the same as with any PostgreSQL destination. You can also specify a schema that doesn't exist yet and Coupler.io will create it.

The default `postgres` role has enough privileges for this. If you connect with a custom, limited role, grant it `CREATE` on the database and schema first.

</details>

<details>

<summary>Should I load data into the public schema?</summary>

Prefer a **dedicated schema** (for example, `coupler` or `analytics`).

Anything in `public` is exposed through Supabase's Data API, and tables Coupler.io creates have Row Level Security disabled — so they'd be readable by anyone holding your anon key, and Supabase's Security Advisor will flag them. A separate schema stays out of the Data API unless you explicitly add it to **Project Settings → API → Exposed schemas**.

If you do need tables in `public`, enable RLS on them after the first run. RLS doesn't block Coupler.io's writes, since the role it connects as bypasses RLS.

</details>

<details>

<summary>How does Coupler.io determine column types?</summary>

Coupler.io detects types from your source data and enforces them when writing — numeric fields land as numbers, dates as date types, and so on, rather than everything becoming text. There's no schema auto-detection setting to configure, unlike the BigQuery destination.

If a table already exists with different column types, you may hit type mismatch errors. Letting Coupler.io create the table from scratch is the cleanest way to get properly typed columns.

</details>

<details>

<summary>What's the best write mode for my use case?</summary>

* **Replace** — deletes all existing rows and loads fresh data on every run. Best for dashboards and reports that should always reflect the current state of your source.
* **Append** — adds new rows below the existing data without touching what's already there. Best for historical logs and tracking change over time.

If you're unsure, start with Replace and switch to Append once your pipeline is stable.

</details>

<details>

<summary>What are the rules for column names in Supabase?</summary>

Standard PostgreSQL rules apply — Supabase doesn't change them. The one that trips people up is the **63-character limit** on identifiers. Sources like Facebook (Meta) Ads and Stripe sometimes produce longer field names, which fails the run.

Use the **Transformations** step to rename affected columns to something shorter before they reach Supabase.

{% hint style="info" %}
Unlike BigQuery, PostgreSQL does allow spaces and mixed case in column names — but they then require double quotes in every query, so renaming them in Coupler.io is still worth doing.
{% endhint %}

</details>

<details>

<summary>Can multiple sources send data to the same Supabase project?</summary>

Yes, in two ways:

* **One data flow, multiple sources** — use Append, Join, or Aggregate transformations to combine sources before the data lands in Supabase
* **Multiple data flows** — each pointing at the same database but writing to different tables or schemas

</details>

<details>

<summary>Will my data flow fill up my Supabase project?</summary>

Worth watching, particularly in Append mode and particularly on the Free plan:

* **Free plan** projects go **read-only** once the database exceeds 500 MB, which fails subsequent runs
* **Paid plans** autoscale disk as you approach capacity, so this is rarely an issue

To keep size in check, filter or aggregate at the source level, use Replace mode where you don't need history, or periodically archive old rows out of append-only tables.

</details>

<details>

<summary>Will Coupler.io keep my Free plan project from being paused?</summary>

Usually, yes. Supabase pauses Free plan projects after roughly 7 days of low activity, and a scheduled Coupler.io data flow counts as database activity — a daily run is generally enough to keep the project awake.

A paused project accepts no connections at all, so if you pause your data flow for a while, restore the project from the Supabase dashboard before resuming it.

</details>

<details>

<summary>Do I need to allowlist Coupler.io's IP addresses?</summary>

Only if you've enabled Supabase's **Network Restrictions** (Project Settings → **Database**). It uses CIDR notation, so add:

* `34.123.243.115/32`
* `34.170.96.92/32`

Restrictions are enforced on pooled and direct connections alike, so switching connection route isn't a workaround.

{% hint style="warning" %}
If you manage restrictions via the Supabase CLI, an `update` replaces the entire allowlist unless you pass `--append`. Adding Coupler.io's IPs without it can silently remove your own.
{% endhint %}

</details>

<details>

<summary>Why did my connection start failing right after I fixed the password?</summary>

Supabase temporarily bans client IPs after repeated failed authentication attempts — sometimes as few as two wrong passwords in a row. The ban clears after about 30 minutes, or you can lift it immediately with **Unban IP** in Project Settings → Database.

Avoid re-running a failing data flow repeatedly, since each attempt can extend the ban.

</details>

<details>

<summary>My data flow times out. Can I extend the limit?</summary>

Yes. Supabase caps statements at 2 minutes by default for the `postgres` role. Raise it from the SQL Editor:

```sql
alter role postgres set statement_timeout = '10min';
```

Also consider splitting large flows into smaller sources or filtering at the source level. Note that the Supabase dashboard and client libraries cap out at 60 seconds regardless — that limit doesn't apply to Coupler.io's connection.

</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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
