SheetLink

Three steps from install to queryable transactions in Postgres.

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

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

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

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.

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.

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.

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.

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.

TaskManual CSV → PostgresSheetLink CLI
Log into each bank website
Download CSV from each bank
Separate CSV per account
Different columns per bank
Manual — check for duplicate rows
Full manual process again
Custom scripting required
  • 7 days of transaction history
  • Google Sheets sync
  • 1 bank connection
  • Manual sync on demand
Try Free
  • 24 months of history
  • Google Sheets + Excel add-in
  • Unlimited banks
  • Manual sync on demand
Get Pro

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.

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.

Yes. SheetLink uses transaction_id as a unique key and performs an upsert. Running sync multiple times is safe — no duplicate rows are created.

SheetLink reads the DATABASE_URL environment variable in standard Postgres format: postgresql://user:password@host:5432/dbname. SSL connections (Supabase, RDS, etc.) are supported.

Yes. SheetLink works with any Postgres-compatible connection string, including Supabase, Neon, RDS, Heroku Postgres, PlanetScale (Postgres mode), and self-hosted instances.

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.

Last updated: April 2026