What QueryFlow is
QueryFlow is a Mac app that does three things in one window:
- Runs SQL queries against your databases
- Lets you transform the results with Python or visual tools
- Sends the output anywhere you want — a file, an email, S3, SFTP, another database — automatically, on a schedule
If you've been using one tool to write queries, another to clean the data, and a third to deliver the output, QueryFlow replaces all three.
Installing QueryFlow
- Open the Mac App Store on your Mac.
- Search for QueryFlow.
- Click Get, then Install.
- When the install finishes, click Open — or find QueryFlow in your Applications folder.
QueryFlow requires macOS 15 (Sequoia) or later.
Starting your free trial
Your first 14 days are free. No card up front, no asking permission.
- Launch QueryFlow.
- The trial starts automatically — the paywall shows
14 DAYS FREEat the top. - Use everything. Connect databases, run queries, build pipelines, schedule jobs.
- On day 14, the paywall returns. Pick Monthly ($49.99/mo) or Annual ($299.99/yr).
- Subscriptions are billed through the Mac App Store. Cancel anytime in System Settings → Apple ID → Subscriptions.
The main window — what you're looking at
When you launch QueryFlow you'll see:
- Left sidebar (narrow): icon strip with five tabs — Connections, Destinations, Pipelines, Schedules, Search.
- Left sidebar (wider, contextual): the contents of whichever tab is active. For example, if you're on Connections, this lists your databases.
- Center: the workspace. SQL editor on top, results table on the bottom, Claude chat panel on the right (toggleable).
- Toolbar across the top: Save, Run, Format, Explain, Schedule, Claude toggle, connection picker.
- Bottom (toggleable): the Logs panel showing recent query executions.
Adding a database — general steps
Before you can query anything, you need to add a connection. QueryFlow supports seven types of sources.
- Click the Connections icon (cylinder) in the narrow left sidebar.
- Click the + Add button at the top of the Connections list.
- Pick your database type from the grid (Snowflake, Redshift, Postgres, MySQL, Google Sheets, Salesforce, or Spreadsheet).
- Fill in the connection fields (covered below for each type).
- Click Test Connection. Wait for the green check.
- Click Save.
The new connection appears in your sidebar with a status dot — green when reachable, gray when offline.
Snowflake — connecting with a PAT
Snowflake is the most powerful connector in QueryFlow. The cleanest way to connect is with a Programmatic Access Token (PAT). A PAT is a long string that authenticates your user without your password.
Step 1 — Create a PAT in Snowsight
- Sign in to Snowsight (
app.snowflake.com). - Click your username in the bottom-left → My profile.
- Scroll to Programmatic access tokens → click + Generate new token.
- Name it something memorable like
QUERYFLOW_PAT. - Set Expires in to 90 days (or longer if your org allows).
- Set Role restriction to a role with the permissions you need —
ACCOUNTADMINfor full access, or a more limited role for read-only. - Click Generate.
- Copy the token immediately. Snowflake only shows it once.
Step 2 — Find your account identifier
- In Snowsight, click your username (bottom-left) → hover over Account.
- The string under your account name (something like
gyjruxr-kp48838orgu23443.us-east-1) is your account identifier. - Copy it.
Step 3 — Add the connection in QueryFlow
- In QueryFlow, click Connections → + Add → Snowflake.
- Name: anything you want, like
Snowflake Prod. - Account: paste your account identifier from Step 2.
- Username: your Snowflake username (the one you log into Snowsight with).
- Password / PAT: paste the PAT you copied in Step 1.
- Warehouse: the name of a warehouse you have access to (e.g.
COMPUTE_WH). This is required. - Database: the database you want to query (e.g.
ANALYTICS_PROD). This is required. - Schema: optional default schema (e.g.
PUBLIC). - Click Test Connection. You should see a green Connected confirmation.
- Click Save.
Snowflake errors you might see
- "Database does not exist or not authorized" — the database name in your connection doesn't exist on the account, or your PAT's role doesn't have
USAGEon it. Sign into Snowsight, runSHOW DATABASES, confirm it's there, and grant USAGE if needed. - "Warehouse is required" — you left the warehouse field blank. Edit the connection and add one.
- HTTP 401 or "authentication failed" — your PAT is expired or wrong. Generate a new one.
Amazon Redshift — connecting with the Redshift Data API
QueryFlow uses the Redshift Data API (not direct TCP), so you don't need to manage VPC tunnels or whitelist IPs. You authenticate with AWS credentials.
Step 1 — Create an IAM user
- Sign in to the AWS Console → IAM.
- Click Users → Create user.
- Give the user a name like
queryflow-user. - Attach the policy
AmazonRedshiftDataFullAccess(or a narrower custom policy). - After creation, go to Security credentials → Create access key.
- Select Application running outside AWS → Next → Create.
- Copy the Access Key ID and Secret Access Key. AWS only shows the secret once.
Step 2 — Add the connection in QueryFlow
- Click Connections → + Add → Redshift.
- Name: like
Redshift Analytics. - Cluster Identifier: the name of your Redshift cluster (e.g.
prod-analytics-cluster). - Database: the Redshift database name (e.g.
dev). - Database User: the database username (e.g.
awsuser). - Region: your cluster's AWS region (e.g.
us-east-1). - AWS Access Key ID: paste from Step 1.
- AWS Secret Access Key: paste from Step 1.
- Click Test Connection → wait for green.
- Click Save.
PostgreSQL — direct connection
- Click Connections → + Add → PostgreSQL.
- Name: like
Postgres Local. - Host: the server address (e.g.
localhost,db.example.com, or an IP). - Port: usually
5432. - Database: the database name.
- Username and Password.
- SSL Mode: choose
requirefor production servers,disablefor local. - Click Test Connection → Save.
MySQL — direct connection
Same steps as Postgres, with port 3306 by default.
- Click Connections → + Add → MySQL.
- Fill in Host, Port, Database, Username, Password.
- Test Connection → Save.
Google Sheets — connecting with OAuth
QueryFlow can read from and write to Google Sheets. You authenticate once with Google, and QueryFlow remembers you.
- Click Connections → + Add → Google Sheets.
- Name: like
Marketing Sheet. - Click Sign in with Google.
- Your browser opens. Sign in with the Google account that owns or has access to the sheet.
- Grant QueryFlow permission to access your Sheets.
- The browser redirects back to QueryFlow.
- Spreadsheet URL: paste the full URL of your sheet.
- Worksheet name: the name of the tab inside the sheet (e.g.
Sheet1,Leads). - Header row: usually
1— the row that contains your column names. - Test Connection → Save.
Salesforce — connecting via OAuth
Salesforce uses an OAuth flow through an External Client App. The first time can be fiddly, but you only do it once per org.
Step 1 — Create an External Client App in Salesforce
- In Salesforce, click the gear icon (top right) → Setup.
- In the left sidebar search, type App Manager → click it.
- Click New External Client App (top right).
- External Client App Name:
QueryFlow. - Contact Email: your email.
- Distribution State:
Local. - Click Create.
- On the next screen, click API (Enable OAuth Settings).
- Check Enable OAuth.
- Callback URL:
queryflow://oauth/callback - OAuth Scopes: add
fullandrefresh_token, offline_access. - Save.
- Wait 2–10 minutes for the app to propagate.
- Go to App Manager → find your app → View.
- Copy the Consumer Key (this is your Client ID).
- Copy the Consumer Secret (click "Click to reveal").
Step 2 — Add the connection in QueryFlow
- Click Connections → + Add → Salesforce.
- Name: like
My Salesforce. - Client ID: paste your Consumer Key.
- Client Secret: paste your Consumer Secret.
- Instance URL: your Salesforce URL. For Developer Editions, use
https://login.salesforce.com. - Click Sign in with Salesforce.
- Your browser opens. Log in with your Salesforce username and password.
- Approve the app's permissions.
- The browser redirects back to QueryFlow.
- Click Test Connection → Save.
Spreadsheet (CSV / TSV) — local file
For ad-hoc analysis of a CSV or TSV on your Mac.
- Click Connections → + Add → Spreadsheet.
- Name: like
Customer Export. - Click Choose File → pick your CSV or TSV file.
- Delimiter: usually auto-detected (
,for CSV,\tfor TSV). - Has header row: check this if the first row contains column names.
- Click Test Connection to preview the data.
- Click Save.
QueryFlow infers column types from the first few rows — numbers, dates, and text.
Opening the workspace
- Click any connection in the Connections sidebar.
- Click the Open Workspace button (or double-click the connection).
- The SQL editor opens in the center, with the connection name shown in the top-right toolbar.
Writing your first query
- Click in the editor area.
- Type a SQL query, for example:
SELECT * FROM customers LIMIT 100; - Press ⌘R (or click Run) to execute.
- Results appear in the table below.
Running specific statements
You don't have to run the whole script. QueryFlow runs whatever your cursor is on, or whatever you've selected.
- Run at cursor (⌘R): runs the single SQL statement containing the cursor.
- Run selection (⌘R with text highlighted): runs only the highlighted text.
- Run all statements (⌘⇧R): runs the entire script, statement by statement.
Multiple tabs
- Click the + button next to your tab to open a new query tab.
- Double-click a tab name to rename it.
- Right-click a tab for Rename / Save / Close options.
- Tabs are restored automatically the next time you launch QueryFlow.
Saving queries to files
- Click Save… or press ⌘S.
- Choose a location and filename. The file is saved as
.sql. - Saved queries appear in the Queries tab in the left sidebar.
- Click any saved query to reopen it.
Formatting SQL
- Press ⌘⇧F (or click Format in the toolbar).
- Your SQL is reformatted with proper indentation, capitalized keywords, and clean line breaks.
Seeing query history
- Press ⌘E (or click the clock icon in the toolbar).
- The History panel shows your last 500 queries with timestamps, connection, row count, and duration.
- Search the list with the search bar.
- Click any past query to load it into the active tab.
Canceling a running query
If a query is taking too long, press ⌘. (Command + period) or click Cancel in the loading overlay.
Explain Plan
- Write a query you want to analyze.
- Click Explain in the toolbar.
- QueryFlow runs
EXPLAINagainst your database and shows the execution plan. - The original query is restored after the plan loads.
Browsing schemas
- Open the workspace for any connection.
- The Explorer tab on the left shows all your schemas as folders.
- Click a schema to expand it and see its tables.
- Click a table to expand it and see its columns with type chips.
Inserting names into your query
- Click a table to insert
schema.table_nameat your cursor. - Click a column to insert just the column name.
- Right-click a table for
SELECT * FROM table LIMIT 100— instant exploration query.
Filtering and refreshing
Type in the search bar at the top of the Explorer to filter the tree by name. Useful when you have hundreds of tables.
If your database schema changed (a teammate added a table), click the refresh arrow at the top of the Explorer to reload.
Adding your Anthropic API key
To use Claude, you need an Anthropic API key. You only do this once.
Step 1 — Get an API key from Anthropic
- Go to
console.anthropic.com. - Sign up or sign in.
- Click API Keys in the left sidebar.
- Click Create Key.
- Name it
QueryFlow. - Click Create Key.
- Copy the key immediately. It starts with
sk-ant-. Anthropic only shows it once.
Step 2 — Add the key to QueryFlow
- In QueryFlow, click the gear icon at the bottom-left → Settings.
- Find the Anthropic API Key field.
- Paste your key.
- Click Save.
The key is stored securely in your Mac's Keychain. It never leaves your machine except when QueryFlow calls Anthropic's API directly.
Opening the Claude panel
- In any SQL workspace, click the Claude button in the toolbar (small dot + the word "Claude").
- The chat panel slides in from the right.
- Click the button again to hide it.
What Claude can see
At the bottom of the chat panel you'll see context chips that show exactly what Claude has access to right now:
- SQL — your current query
- Python — your current Python code (if you have any)
- Markdown — your current notes
- Rows — the latest query results (first 50 rows)
- Schema — every table and column in your database
- Errors — the last 5 execution errors (red chip)
Claude uses all of these to answer your questions, so you don't need to paste anything in.
Asking Claude things
Just type a question and press Enter, or click the arrow button.
Good things to ask:
- "Write me a query that finds customers who haven't ordered in 90 days."
- "Why is this query slow?"
- "What does this error mean?"
- "Summarize these results."
- "Help me debug — the customers_raw table — what's in it?"
- "Convert this query to use a CTE instead of a subquery."
Inserting Claude's code into your editor
When Claude responds with SQL or Python in a fenced code block:
- Hover over the response bubble.
- Click Copy Code to copy just the code (without Claude's explanation).
- Paste into your editor.
Or click Copy to get the full response with explanation.
Click the circular arrow icon at the top of the chat panel to start fresh. Claude won't remember the previous conversation.
Creating a pipeline
- Click the Pipelines icon in the narrow left sidebar.
- Click + New Pipeline.
- Name it (e.g.
Daily Customer Sync). - Drag a Source card onto the canvas — pick any of your connections.
- Drag a Destination card onto the canvas — pick any of your destinations.
- Click the source card → write a SQL query (or pick a saved one).
- Click the connecting line between source and destination → the Field Mapper opens.
Using the Field Mapper
The Field Mapper shows your source columns on the left and your destination columns on the right.
- Drag a source column to a destination column to map them.
- Or use the dropdown next to each destination column to pick the source.
- Click AI Map in the top-right to auto-match similar column names (e.g.
FirstName→first_name,C_EMAIL_ADDRESS→email). - Review the suggestions. The AI handles 25+ common synonyms automatically.
- Click Save Mapping.
Running a pipeline
- Click Run Now in the pipeline editor to execute once.
- Click Schedule to set it up to run automatically.
- Click Run History to see past executions with row counts and any errors.
Adding a destination
A destination is where your query results end up. You can have multiple destinations on one job — send the same data to a file and an email and an S3 bucket, all at once.
- Click the Destinations icon in the narrow left sidebar.
- Click + Add.
- Pick a destination type.
Amazon S3
- Pick Amazon S3.
- Name: like
S3 Output. - Bucket: your S3 bucket name.
- Region: e.g.
us-east-1. - Prefix / Folder: optional, like
queryflow/exports/. - AWS Access Key ID and Secret Access Key (same as Redshift — see the IAM setup above).
- Test Destination → Save.
SFTP
- Pick SFTP.
- Host, Port (usually 22), Username, Password (or SSH key).
- Remote path: where files land, like
/uploads/queryflow/. - Filename pattern: e.g.
customers_{date}.csv(the{date}placeholder gets replaced at run time). - Test → Save.
Local File
- Pick Local File.
- Folder: click Choose Folder to pick where files save.
- Format: CSV, JSON, Parquet, or Excel.
- Filename pattern: e.g.
report_{date}.csv. - Save.
Email (Gmail / SMTP)
- Pick Email.
- Provider: Gmail (OAuth) or SMTP.
- For Gmail, sign in with Google. For SMTP, enter your SMTP host, port, username, and password.
- To: comma-separated email addresses.
- Subject: the email subject.
- Attach file: check to attach the query result as a CSV.
- Inline table: check to embed the table directly in the email body.
- Save.
Database destination — Snowflake / Redshift / Postgres / MySQL / Google Sheets
You can write results back to any database connection you've added.
- Pick the database type.
- Choose the connection from the dropdown.
- Pick the target table (or type a new table name — QueryFlow can create it).
- Choose Append (add new rows) or Replace (delete existing rows first).
- Map your columns in the Field Mapper.
- Save.
Scheduling a query
The whole point of QueryFlow is that things run without you. Every query, pipeline, or Python script can be scheduled.
- From any SQL workspace, click Schedule in the toolbar.
- The Schedule sheet opens.
- Name: what to call this job, like
Daily Customer Export. - Trigger: pick how often it runs.
- Destination: pick where the results go.
- Click Save Schedule.
Trigger types
- Manual — only runs when you click Run Now.
- Interval — every N minutes / hours / days.
- Daily — every day at a specific time (e.g. 9:00 AM).
- Weekly — specific day(s) of the week at a specific time.
- Monthly — specific day of the month.
- Cron — paste a cron expression for full control (e.g.
0 9 * * 1-5for weekdays at 9 AM).
Viewing and managing jobs
- Click the Schedules icon in the narrow left sidebar.
- You'll see a list of every scheduled job with status (Enabled / Disabled), next run, and last run.
Pausing, editing, or deleting:
- Toggle the switch on a job card to enable or disable it.
- Click the job to open it and edit any setting.
- Right-click → Delete to remove it permanently.
Running a job manually: click Run Now on any job card.
Viewing run history:
- Click any scheduled job.
- Click the Runs tab.
- You'll see every execution with timestamp, duration, row count, and any errors.
- Click a run to see the full logs.
Running Python
Every workspace has a Python cell underneath the SQL editor. The SQL results are automatically available to Python as a pandas DataFrame called df — you don't have to load anything.
- After running a SQL query, click the Python tab below the editor.
- Type Python code. For example:
print(df.head()) print(df.describe()) - Press ⌘R to run.
- Output streams to the panel below.
Available libraries (pre-installed)
pandas— DataFramesnumpy— numericalmatplotlibandplotly— chartsrequests— HTTPopenpyxl— Excelpyarrow— Parquetparamiko— SFTPboto3— AWS S3
Generating charts
import plotly.express as px
fig = px.bar(df, x='region', y='revenue')
fig.show()
The chart renders inline in the output panel.
Charts (without Python)
If you'd rather not write Python, QueryFlow has a built-in chart view.
- Run any SQL query.
- Click the Chart tab in the results panel.
- Pick an X axis column and a Y axis column.
- Pick a chart type: Bar, Line, or Scatter.
- The chart renders instantly.
Exporting Results
After running a query, click the Export tab in the results panel:
- Copy CSV — copies CSV-formatted data to your clipboard.
- Export CSV — saves a
.csvfile to your Mac. - Copy JSON — copies JSON-formatted data to your clipboard.
- Export Excel — coming soon.
Errors — reading and copying
When something goes wrong, QueryFlow shows the actual error message, not a generic code.
From the schema explorer
If the explorer can't load (bad connection, missing database, etc.):
- The error appears in red in the left panel.
- Click Copy Error to copy the full message to your clipboard.
- Click Retry to try loading again.
- Right-click the error for Copy and Retry in one step.
From the logs panel
- Click the terminal icon in the toolbar to show the Logs panel.
- Failed queries appear in red with the full Snowflake / Postgres / MySQL error message.
- Click any log entry to select the text.
- Hover and click the copy icon to copy that single entry.
- Click Copy All in the panel header to copy everything.
Asking Claude about an error
- After an error appears in the logs, open the Claude panel.
- The red Errors context chip lights up — Claude can see the error.
- Ask Claude: "What does the latest error mean?" or "How do I fix this?"
Keyboard Shortcuts
Press ⌘⇧/ anytime to see the full shortcuts panel.
| Shortcut | Action |
|---|---|
| ⌘ Enter | Run at cursor |
| ⌘ R | Run at cursor |
| ⌘ ⇧ R | Run all statements |
| ⌘ . | Cancel query |
| ⌘ S | Save current query |
| ⌘ ⇧ F | Format SQL |
| ⌘ E | Query history |
| ⌘ / | Toggle line comment |
| ⌘ F | Find in editor |
| ⌘ G | Find next |
| ⌘ ⇧ G | Find previous |
| ⌘ T | New tab |
| ⌘ W | Close tab |
| ⌘ ⇧ / | Show shortcuts |
| Tab | Accept AI completion |
| Escape | Dismiss AI completion |
Settings & Preferences
Click the gear icon at the bottom-left of the app.
- Anthropic API Key — paste your key here to enable Claude.
- Theme — Auto / Light / Dark.
- Editor Density — Comfortable / Compact.
- Telemetry — toggle anonymous usage events. No personal data, no query text.
- Background Scheduler — enable to keep jobs running when QueryFlow is closed.
Updating QueryFlow
QueryFlow updates automatically through the Mac App Store. To check manually:
- Open the App Store on your Mac.
- Click your profile icon (bottom-left).
- Scroll to Available Updates — if QueryFlow is listed, click Update.
"Connection failed" / "Could not connect"
- Check your internet connection.
- Verify the host, port, username, and password.
- For cloud databases, check that your IP is whitelisted (if your security team uses IP allowlists).
- Click Test Connection — the error message will tell you exactly what's wrong.
"Database does not exist or not authorized" (Snowflake)
- The database name is wrong, or your PAT's role doesn't have access.
- In Snowsight, run
SHOW DATABASES;. Make sure your database is in the list. - If it is, grant USAGE:
GRANT USAGE ON DATABASE <db> TO ROLE <your_role>;
Claude says "Add your Anthropic API key in Settings"
You haven't pasted your API key yet. Go to Settings → paste your key from console.anthropic.com.
A scheduled job didn't run
- Was your Mac awake at the scheduled time? Jobs only run when your Mac is awake.
- Was the job enabled? Check the Schedules tab.
- Click the job → Runs tab → look for an error.
Query is running forever
Press ⌘. to cancel, then check:
- Is your warehouse / cluster running? (Snowflake auto-resumes; Redshift may need to be started manually.)
- Is the query genuinely big? Add
LIMIT 1000to test. - Open the Logs panel for more detail.
QueryFlow won't launch
- Try Force Quit (⌘⌥Esc) → relaunch.
- If that fails, delete and reinstall from the Mac App Store. Your data is preserved in your user folder.
Getting Help
- Discord community: discord.gg/j36cFY8FdA
- Email: support@getqueryflow.com
- YouTube channel: QueryFlow on YouTube
- Privacy policy: getqueryflow.com/privacy