Sync Supabase (Postgres) to Google Sheets free with Apps Script, or live with scheduled refresh and two-way write-back.
Fastest path: install a Postgres-aware Sheets add-on, paste in your Supabase connection string, and you have live data in a sheet in under 5 minutes, with scheduled refresh and write-back included. If you'd rather not install anything, a free Apps Script snippet against Supabase's REST API gets a table into Sheets in about 10 minutes, no scheduling included unless you add a trigger yourself. This guide covers both, plus the automation-tool and two-way-sync options in between.
Supabase to Google Sheets for free (Apps Script + REST API)
Every Supabase project auto-generates a REST API on top of your Postgres tables (PostgREST). You can call it directly from Google Apps Script with your project URL and the anon public API key, no Postgres driver, no paid tool, nothing to install. This is the answer to "how do I do this for free" and it's genuinely free: no Brooked account, no automation-tool subscription, just a script bound to your sheet.
In your Supabase dashboard, go to Settings → API and copy the Project URL and the anon public key. Then, in your sheet, open Extensions → Apps Script and paste:
function importSupabaseTable() {
const SUPABASE_URL = "https://YOUR-PROJECT.supabase.co";
const ANON_KEY = "YOUR_ANON_PUBLIC_KEY";
const TABLE = "orders"; // the table you want to pull
const response = UrlFetchApp.fetch(
`${SUPABASE_URL}/rest/v1/${TABLE}?select=*&limit=1000`,
{
headers: {
apikey: ANON_KEY,
Authorization: `Bearer ${ANON_KEY}`,
},
}
);
const rows = JSON.parse(response.getContentText());
if (!rows.length) return;
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(TABLE)
|| SpreadsheetApp.getActiveSpreadsheet().insertSheet(TABLE);
sheet.clearContents();
const headers = Object.keys(rows[0]);
sheet.appendRow(headers);
rows.forEach((row) => sheet.appendRow(headers.map((h) => row[h])));
}Run it once to authorize, then add a time-driven trigger (Triggers → Add Trigger → Time-driven) to refresh hourly or daily. Note the anon key respects Row Level Security, so if your table has RLS enabled and no public read policy, the request returns an empty array. Either add a scoped read policy for anonymous access or switch to a service-role key kept server-side (never paste a service-role key into a client-visible Apps Script if the sheet is shared).
Limits: Apps Script's 6-minute execution cap means very large tables need pagination (loop with offset and limit). There's no built-in write-back, no UI for picking columns, and you're maintaining the script yourself.
Automation tools: n8n and Zapier
If you already run workflows in n8n or Zapier, both have native Supabase nodes/apps and native Google Sheets actions. A typical workflow: trigger on a schedule (or a Supabase database webhook for real-time), query Supabase, map fields, append or update rows in Sheets. n8n's free self-hosted tier makes this a genuinely free option if you're comfortable running n8n; Zapier's free tier caps you at 100 tasks/month, which fills up fast on frequent syncs.
Honest take: this is more setup than Apps Script for a single table, but it scales better once you're syncing multiple tables or chaining Supabase data into other tools (Slack alerts, CRM updates) alongside the sheet.
Two-way sync tools (Whalesync and similar)
If the real requirement is bidirectional: someone edits a row in Sheets and it needs to update the Supabase row, and vice versa, dedicated sync tools like Whalesync are built specifically for that record-level, near-real-time use case. They're purpose-built for ops teams treating Sheets as a lightweight front-end onto Supabase data (e.g., a content team editing a CMS table). Expect a paid plan (typically starting in the $29 to $99/month range) and roughly 10 to 20 minutes of setup mapping fields between the two systems.
Brooked also supports two-way write-back (see below); the difference is that Brooked is query/import-first (you define what gets pulled and pushed), while tools like Whalesync are designed around continuous record mirroring. Pick based on whether you want "a sheet driven by queries" or "a live mirror of a table."
The Brooked method: connecting via Postgres
Supabase is Postgres. Every Supabase project is a fully managed Postgres database with a couple of extra layers (auto-REST, auth, storage) on top. That means any real Postgres client can connect directly, with full SQL access, scheduled refresh, and write-back, which is exactly what Brooked's PostgreSQL connector does. No REST API limits, no anon-key RLS workarounds, just SQL.
Step 1: Install Brooked
Install Brooked from the Google Workspace Marketplace. Free tier includes 100 imports per month, no credit card required.
Step 2: Find your Supabase connection details
In your Supabase project, go to Settings → Database → Connection string. Choose the URI format. You'll find all the connection details you need:
- Host: your project's db.*.supabase.co hostname
- Port: 5432 for the direct connection, or 6543 for Supavisor's connection pooler
- Database: postgres (default)
- Username: postgres or a custom role you've created
- Password: your database password (set when creating the project)
Use the direct connection (port 5432) for Brooked: it holds a persistent connection for scheduled queries, which is what a Sheets connector needs. The pooler (port 6543, Supavisor/PgBouncer) is optimized for many short-lived connections from serverless functions and application servers, and generally isn't necessary unless your project is close to its direct-connection limit. Enable SSL mode either way. Supabase requires SSL on all connections.
Step 3: Connect and run your first query
Open the Brooked sidebar and click Add data source → PostgreSQL (Supabase runs on Postgres). Enter the connection details and enable SSL. Click New import, write your SQL query, choose a destination range, and click Import.
Step 4: Schedule auto-refresh
Toggle Auto-refresh in the import's settings and pick a cadence: 15 minutes, hourly, or daily. The schedule runs server-side, so the sheet stays current even if nobody has it open. This is the piece that neither the free Apps Script method nor a one-off CSV export gives you without extra work.
Two-way sync: writing data back to Supabase
Brooked supports writing data from Google Sheets back to your Supabase tables using INSERT, UPDATE, UPSERT, or DELETE. Create a Supabase role with the appropriate write permissions for this use case. Note: Brooked bypasses Row Level Security (RLS) when using the postgres superuser, so create a restricted role if you need RLS enforcement.
Using the AI agent with Supabase
Open the Chat tab and ask questions about your Supabase data in plain English. The agent inspects your schema and returns results into Sheets.
Comparing the methods
| Method | Cost | Setup | Scheduled refresh | Two-way | Best for |
|---|---|---|---|---|---|
| Apps Script + REST API (anon key) | Free | 10 to 15 min | Time-driven trigger | DIY | One table, no budget, comfortable pasting a script |
| n8n / Zapier automation | Free tier limited · paid for volume | 15 to 30 min | Scheduled or event-triggered | DIY (separate workflow) | Teams already running automations who want one more node |
| Two-way sync tools (e.g. Whalesync) | Paid, from ~$29 to $99/mo | 10 to 20 min | Near real-time | Yes | Ops teams that need Sheets edits to write back automatically |
| Brooked add-on (Postgres connection) | Free tier · Pro $29/user | Under 5 min | 15 min / hourly / daily | Yes | Anyone who wants scheduled refresh and write-back without code |
Common use cases
- Product analytics: pull user signups, feature usage, and retention data into a Sheets dashboard
- Founder metrics: surface key business metrics from your Supabase database for weekly review
- Customer support: query user and subscription records for CS team without Supabase access
- Ad-hoc analysis: run one-off queries against your app database and share results in a sheet
- Ops reporting: schedule daily imports of key tables for operational dashboards
Troubleshooting common issues
Related Articles
- PostgreSQL to Google Sheets: Connect & Auto-Sync in 10 Minutes (2026)
- How to Connect MySQL to Google Sheets
- How to Automatically Refresh MySQL Data in Google Sheets Every Hour (Without Babysitting a Script)
Frequently asked questions
Can I sync Supabase to Google Sheets for free?
Yes. The Apps Script method in this guide is completely free: it calls Supabase's REST API with your anon key and writes rows to a sheet, and you can schedule it with a free time-driven trigger. Brooked's free tier also covers 100 Supabase imports per month with no credit card, if you'd rather skip maintaining a script.
Does Supabase have a native Google Sheets integration?
No. Supabase doesn't ship a built-in Sheets connector. Your options are: call the auto-generated REST API from Apps Script (free, DIY), wire up an automation tool like n8n or Zapier, use a two-way sync tool such as Whalesync, or connect with a Sheets add-on like Brooked that talks to the underlying Postgres database directly.
What's the fastest way to get Supabase data into a sheet?
For a one-off pull, run a query in the Supabase SQL editor, export as CSV, and import into Sheets, all in under 2 minutes. For anything that needs to stay current, install Brooked, connect with your Postgres connection string, and turn on scheduled refresh. That's about 5 minutes total, and it keeps updating on its own.
Should I connect on port 5432 or 6543?
Port 5432 is the direct Postgres connection. Use this for tools like Brooked that hold a persistent connection to run scheduled queries. Port 6543 is Supavisor's connection pooler (formerly PgBouncer), designed for many short-lived connections from serverless functions or app servers. For a Sheets connector doing periodic imports, the direct connection on 5432 is usually the better fit; switch to the pooler only if you're hitting Supabase's connection limits.
Can I write data from Google Sheets back into Supabase?
Yes, two ways. With Brooked, since Supabase is Postgres under the hood, you get native two-way sync: INSERT, UPDATE, UPSERT, or DELETE straight from the sheet. With a dedicated sync tool like Whalesync, you get bidirectional record-level sync designed for ops workflows. Apps Script can also write back via the REST API, but you're responsible for conflict handling yourself.
Does Brooked bypass Supabase Row Level Security?
Only if you connect as the postgres superuser. To respect RLS, create a dedicated Postgres role scoped to the anon or authenticated role and connect as that user instead. Brooked will then be subject to your existing RLS policies just like any other Postgres client.
Connect Supabase to Google Sheets today.
Free tier: 100 imports per month, no credit card required. Or see the full Supabase integration details.
Install Brooked free →

