Sync Bank Transactions
to Postgres
One command. SheetLink's CLI connects to 10,000+ banks via Plaid and writes your transactions into a Postgres table — ready for dbt, Metabase, Tableau, or any SQL tooling you already use.
Chrome extension is free. Postgres sync requires MAX ($10.99/mo).
How It Works
Three steps from install to queryable transactions in Postgres.
Install the SheetLink CLI
Install globally or run with npx. The CLI is a Node.js tool — works on macOS, Linux, and Windows.
npm install -g sheetlink-cli # or: npx sheetlink
Set DATABASE_URL and authenticate
Point the CLI at your Postgres instance via the DATABASE_URL environment variable, then authenticate with your SheetLink account.
export DATABASE_URL="postgresql://user:pass@localhost:5432/mydb" sheetlink auth
Run the sync
One command writes all your bank transactions to a transactions table. The CLI creates the table automatically on first run and upserts on subsequent runs — no duplicates.
sheetlink sync --output postgres
Postgres Table Schema
SheetLink creates this table automatically on first sync. The schema is stable across syncs so your downstream SQL stays intact.
CREATE TABLE IF NOT EXISTS transactions ( id SERIAL PRIMARY KEY, transaction_id TEXT UNIQUE NOT NULL, date DATE NOT NULL, name TEXT, merchant_name TEXT, amount NUMERIC(12, 2), iso_currency_code TEXT DEFAULT 'USD', category TEXT[], account_id TEXT, account_name TEXT, institution_name TEXT, pending BOOLEAN DEFAULT FALSE, payment_channel TEXT, location_city TEXT, location_region TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_transactions_date ON transactions (date DESC); CREATE INDEX IF NOT EXISTS idx_transactions_account_id ON transactions (account_id);
Note: SheetLink uses INSERT ... ON CONFLICT (transaction_id) DO UPDATE — running sheetlink sync multiple times is safe and idempotent.
What to Do With Transactions in Postgres
BI Tools (Metabase, Tableau, Superset)
Connect your BI tool directly to Postgres. Build dashboards showing monthly spend by category, cash flow over time, or top merchants — all from your real bank data.
dbt Models
Use transactions as a source in your dbt project. Write models to categorize spend, calculate rolling averages, or join against other tables. The stable schema means your refs stay valid across syncs.
Custom Analytics
Write SQL directly against the transactions table. Group by merchant, filter by date range, or calculate account balances on any given day — no spreadsheet required.
Multi-User Dashboards
If you manage finances for multiple entities (business units, clients, family members), each can sync to separate schemas or tables in the same Postgres instance for a unified view.
Manual CSV vs. SheetLink CLI
| Task | Manual CSV → Postgres | SheetLink CLI |
|---|---|---|
| Connect bank | Log into each bank website | Once via Plaid (Chrome extension) |
| Export data | Download CSV from each bank | sheetlink sync --output postgres |
| Handle multiple accounts | Separate CSV per account | All accounts in one command |
| Schema consistency | Different columns per bank | Same schema every time |
| Deduplication | Manual — check for duplicate rows | Automatic via transaction_id upsert |
| Repeat monthly | Full manual process again | Run same command again |
| Automation | Custom scripting required | Add to cron or CI workflow |
Pricing
Free
- ✓7 days of transaction history
- ✓Google Sheets sync
- ✓1 bank connection
- ✓Manual sync on demand
Pro
- ✓24 months of history
- ✓Google Sheets + Excel add-in
- ✓Unlimited banks
- ✓Manual sync on demand
MAX
- ✓Everything in Pro
- ✓CLI + REST API
- ✓Postgres / SQLite / CSV / JSON
- ✓Automation pipelines
Frequently Asked Questions
How do I sync bank transactions to Postgres?
Install the SheetLink CLI with npm install -g sheetlink-cli, set your DATABASE_URL environment variable, authenticate with sheetlink auth, then run sheetlink sync --output postgres. The CLI creates the transactions table automatically.
What Postgres schema does SheetLink create?
SheetLink creates a transactions table with columns for transaction_id (unique key used for deduplication), date, name, merchant_name, amount, category, account_id, account_name, institution_name, pending, payment_channel, and location fields.
Does SheetLink deduplicate transactions on each sync?
Yes. SheetLink uses transaction_id as a unique key and performs an upsert. Running sync multiple times is safe — no duplicate rows are created.
What connection string format does SheetLink expect?
SheetLink reads the DATABASE_URL environment variable in standard Postgres format: postgresql://user:password@host:5432/dbname. SSL connections (Supabase, RDS, etc.) are supported.
Can I use SheetLink with a hosted Postgres service?
Yes. SheetLink works with any Postgres-compatible connection string, including Supabase, Neon, RDS, Heroku Postgres, PlanetScale (Postgres mode), and self-hosted instances.
What plan do I need for Postgres sync?
Postgres sync requires the MAX tier at $10.99/mo or $99/year. It is included alongside the REST API, SQLite sync, CSV export, and JSON export.
Get Your Bank Data Into Postgres Today
Install the CLI, run one command, and have real transactions in your database in minutes.