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

Authenticate with your SheetLink account. This opens a browser window once — credentials are stored locally for unattended use.

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://user:pass@host/db

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 sheetlink_transactions (
  id                   SERIAL PRIMARY KEY,
  transaction_id       TEXT UNIQUE NOT NULL,
  date                 DATE NOT NULL,
  description_raw      TEXT,
  merchant_name        TEXT,
  amount               NUMERIC(12, 2),
  iso_currency_code    TEXT DEFAULT 'USD',
  category_primary     TEXT,
  category_detailed    TEXT,
  account_id           TEXT,
  account_name         TEXT,
  source_institution   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_sheetlink_transactions_date
  ON sheetlink_transactions (date DESC);

CREATE INDEX IF NOT EXISTS idx_sheetlink_transactions_account_id
  ON sheetlink_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, authenticate with sheetlink auth, then run sheetlink sync --output postgres://user:pass@host/db. The CLI creates the sheetlink_transactions table automatically and upserts on transaction_id.

SheetLink creates a sheetlink_transactions table with 35 columns — the full Plaid transaction schema including transaction_id (upsert key), date, authorized_date, description_raw, merchant_name, amount, category_primary, category_detailed, all location fields, and more. A sheetlink_accounts table is also created.

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

Pass the full connection string to the --output flag: sheetlink sync --output postgresql://user:password@host:5432/dbname. You can also pass $DATABASE_URL if that env var is set. 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