Quick-start guide

SideQuest live in 30 minutes.

Five steps. The longest part is the QuickBooks OAuth setup. After that, you process POs by asking Claude Desktop to do it.

Don't want to read the docs? Paste our install prompt into Claude Desktop. Claude becomes your implementation specialist and walks you through every step on-screen. Same install, no reading. If anything still goes wrong after that, email [email protected] — same business day response.
On QuickBooks Desktop instead of QBO? This guide is for QBO. The QBD install path is similar but includes one extra step (starting the local bridge service) and is currently in beta. Apply for the QBD beta for free use up to 200 POs/month for 12 months in exchange for feedback.

Pick your computer. The steps below switch instantly.

Before you start: a Mac (macOS 12+) or Windows 10/11 PC, your QuickBooks Online admin credentials, the Gmail account where POs arrive, Claude Desktop installed (claude.ai/download — the free tier is enough for most customers), and the connector zip file from your welcome email.
How the product works: SideQuest installs as a Model Context Protocol (MCP) server on your computer. You talk to it through Claude Desktop. You ask Claude "list incoming POs and draft estimates"; Claude runs the connector tools, shows you the drafts, and submits them to QuickBooks when you tell it to. There is no separate web page or background daemon.
You only need the free Claude Desktop app. The Claude Desktop app is a free download from claude.ai/download. No Anthropic API key, no paid plan, no subscription beyond your SideQuest tier.

Step 0 · Check your email host (30 seconds)

SideQuest reads inbound POs from Gmail natively. Other hosts work via a 10-minute forwarding setup. Type your domain or email address and we'll check the MX records and tell you which path applies.

Step 1 · Install the connector (5 min)

Unzip the connector folder from your welcome email. It goes somewhere like ~/Downloads/sidequest-connector.

Open Terminal (Command+Space → "Terminal" → Return). Type cd (with a trailing space), drag the sidequest-connector folder from Finder into the Terminal window, press Return. Run:

bash install-connector.sh

Find sidequest-connector.zip in your Downloads folder. Right-click it and pick Extract All.

Open the unzipped sidequest-connector folder in File Explorer. Double-click install.bat. A PowerShell window opens and runs the installer. If Windows SmartScreen warns you, click More info → Run anyway.

If the installer says Python is missing, install Python 3.12 from python.org first. Check the "Add python.exe to PATH" box on the first installer screen. Then double-click install.bat again.

About 60 seconds in, the installer pauses and asks for your license key. Copy it from your welcome email, paste it in when prompted, press ReturnEnter. The installer saves the key.

When it finishes you see All done and your tier (Free, Starter, etc.). The installer also adds qb-distributor-mcp to your PATH.

Step 2 · Connect QuickBooks via our hosted helper page (3 min)

Fastest path: use the hosted helper at sidequestautomation.com/qb/start. It removes most of the OAuth Playground tangent: paste your Client ID, click one button, sign in to QuickBooks, copy two values back to your terminal. If you'd rather see the underlying Playground flow,If you'd rather see the underlying Playground flow, the steps still work; expand the details below.

2a · Create the Intuit Developer app

  1. Open developer.intuit.com/app/developer/myapps. Sign in with your QuickBooks login.
  2. Click Create app → QuickBooks Online and Payments. Name it whatever you want (e.g. SideQuest).
  3. Open Keys & OAuth → Production (or Development if you're testing). Under Redirect URIs, click Add URI and paste exactly: https://sidequestautomation.com/qb/callback. Save.
  4. Copy two values from this page: Client ID and Client Secret. Save them in a temporary text file.

2b · Run the hosted authorization helper

  1. Open sidequestautomation.com/qb/start.
  2. Paste your Client ID from step 2a into the field. Pick Sandbox or Production.
  3. Click Authorize QuickBooks. Intuit opens in a new tab. Sign in, pick the QB company, click Connect.
  4. Intuit redirects you to sidequestautomation.com/qb/callback which shows your authorization code and realm ID in two copy-paste boxes.
Prefer the old OAuth Playground flow? Expand here.
  1. Open developer.intuit.com/app/developer/playground.
  2. Select your workspace, then your SideQuest app.
  3. Check the com.intuit.quickbooks.accounting scope.
  4. Click Get authorization code. Click Connect on the consent screen.
  5. Back on the Playground, click Get tokens.
  6. Copy Refresh token (starts with RT1-) and Realm ID from the page.

2c · Write the values into .env

In TerminalPowerShell, paste this block. Replace each YOUR_... with the values from 2b, then press ReturnEnter.

cat > ~/.qb-distributor-mcp/.env <<EOF
QB_CLIENT_ID=YOUR_CLIENT_ID
QB_CLIENT_SECRET=YOUR_CLIENT_SECRET
QB_REALM_ID=YOUR_REALM_ID
QB_REFRESH_TOKEN=YOUR_REFRESH_TOKEN
QB_ENVIRONMENT=sandbox
QB_REDIRECT_URI=http://localhost:8765/callback
GMAIL_PO_LABEL=purchase-orders
EOF
@"
QB_CLIENT_ID=YOUR_CLIENT_ID
QB_CLIENT_SECRET=YOUR_CLIENT_SECRET
QB_REALM_ID=YOUR_REALM_ID
QB_REFRESH_TOKEN=YOUR_REFRESH_TOKEN
QB_ENVIRONMENT=sandbox
QB_REDIRECT_URI=http://localhost:8765/callback
GMAIL_PO_LABEL=purchase-orders
"@ | Set-Content -Path "$HOME\.qb-distributor-mcp\.env"

Step 3 · Connect Gmail via Google Cloud Console (10 min)

3a · Create a Google Cloud project

  1. Open console.cloud.google.com signed in as the Gmail account that receives your POs.
  2. Accept Google Cloud's Terms of Service if first time.
  3. Create project → name it SideQuest Automation. Wait for it to provision.

3b · Enable the Gmail API

  1. Open the Gmail API library page. Confirm the project picker at top shows SideQuest Automation.
  2. Click Enable.

3c · Configure the OAuth consent screen

  1. Open OAuth Overview → click Get started.
  2. App name: SideQuest Automation. Support email: your Gmail.
  3. Audience: External. (Internal is only for Google Workspace orgs.)
  4. Contact email: your Gmail. Agree to the Google API User Data Policy. Create.

3d · Add yourself as a test user

Required. Without this, the OAuth dance fails with access_denied.

  1. Click Audience in the left nav.
  2. Scroll to Test users → + Add users.
  3. Type your Gmail address, press Return, click Save.

3e · Create the Desktop OAuth client

  1. Click Clients in the left nav → Create client.
  2. Application type: Desktop app. Name: SideQuest Connector. Click Create.

3f · Get the complete client_secret JSON

Google changed the rules. The first time you click Download JSON for a brand-new client, the file Google gives you is missing the client_secret value. You have to add a second secret to the same client and download that one.

  1. On the Clients list, click on SideQuest Connector to open the detail page.
  2. Scroll to Client secrets. Click + Add secret. A new row appears with a NEW badge; its download icon is active.
  3. Click the download icon next to the NEW secret. The file Google saves to Downloads now has "client_secret": "GOCSPX-..." inside.

Move the file into the connector folder:

mv ~/Downloads/client_secret_2_*.apps.googleusercontent.com.json \
  ~/.qb-distributor-mcp/google_client_secret.json
Move-Item "$HOME\Downloads\client_secret_2_*.apps.googleusercontent.com.json" `
  "$HOME\.qb-distributor-mcp\google_client_secret.json"

Verify the file has the secret (Mac):

grep client_secret ~/.qb-distributor-mcp/google_client_secret.json
Select-String -Path "$HOME\.qb-distributor-mcp\google_client_secret.json" -Pattern "client_secret"

You should see "client_secret":"GOCSPX-...". If you see nothing, you grabbed the incomplete first download. Repeat 3f.

3g · Add Gmail paths to .env

printf "\nGOOGLE_CLIENT_SECRETS_PATH=$HOME/.qb-distributor-mcp/google_client_secret.json\nGOOGLE_TOKEN_PATH=$HOME/.qb-distributor-mcp/google_token.json\n" >> ~/.qb-distributor-mcp/.env
Add-Content -Path "$HOME\.qb-distributor-mcp\.env" -Value @"

GOOGLE_CLIENT_SECRETS_PATH=$HOME\.qb-distributor-mcp\google_client_secret.json
GOOGLE_TOKEN_PATH=$HOME\.qb-distributor-mcp\google_token.json
"@

3h · Run the Gmail OAuth dance

~/.qb-distributor-mcp/venv/bin/python -c "
from pathlib import Path
from qb_distributor_mcp.gmail_client import GmailClient
home = Path.home() / '.qb-distributor-mcp'
client = GmailClient(home / 'google_client_secret.json', home / 'google_token.json')
print('Token file:', (home / 'google_token.json').exists())
"
& "$HOME\.qb-distributor-mcp\venv\Scripts\python.exe" -c "from pathlib import Path; from qb_distributor_mcp.gmail_client import GmailClient; home = Path.home() / '.qb-distributor-mcp'; client = GmailClient(home / 'google_client_secret.json', home / 'google_token.json'); print('Token file:', (home / 'google_token.json').exists())"

A browser tab opens. Click your Gmail account. You will see "Google hasn't verified this app." That is normal — your app is in Testing mode because you just created it. Click Advanced (small link, bottom-left), then Go to SideQuest Automation (unsafe), then Continue to grant Gmail read/modify access.

Browser says "The authentication flow has completed." Terminal prints Token file: True.

Step 4 · Wire credentials into Claude Desktop (2 min)

The MCP server Claude Desktop launches does not read ~/.qb-distributor-mcp/.env. It runs from a different working directory, so the env file is invisible to it. The fix is to copy every value from your .env into Claude Desktop's claude_desktop_config.json under the env block.

Paste this one-liner. It reads your .env and writes the config in one shot.

python3 -c "
import json, pathlib
cp = pathlib.Path.home() / 'Library/Application Support/Claude/claude_desktop_config.json'
ep = pathlib.Path.home() / '.qb-distributor-mcp/.env'
env = {k.strip(): v.strip() for line in ep.read_text().splitlines() if line.strip() and not line.startswith('#') and '=' in line for k, v in [line.split('=', 1)]}
cfg = json.loads(cp.read_text()) if cp.exists() else {}
cfg.setdefault('mcpServers', {})
cfg['mcpServers']['qb-distributor'] = {
    'command': str(pathlib.Path.home() / '.qb-distributor-mcp/venv/bin/qb-distributor-mcp'),
    'args': ['serve'],
    'env': env,
}
cp.parent.mkdir(parents=True, exist_ok=True)
cp.write_text(json.dumps(cfg, indent=2))
print('Wrote config with', len(env), 'env vars')
"
py -c "
import json, pathlib, os
cp = pathlib.Path(os.environ['APPDATA']) / 'Claude' / 'claude_desktop_config.json'
ep = pathlib.Path.home() / '.qb-distributor-mcp' / '.env'
env = {k.strip(): v.strip() for line in ep.read_text().splitlines() if line.strip() and not line.startswith('#') and '=' in line for k, v in [line.split('=', 1)]}
cfg = json.loads(cp.read_text()) if cp.exists() else {}
cfg.setdefault('mcpServers', {})
cfg['mcpServers']['qb-distributor'] = {
    'command': str(pathlib.Path.home() / '.qb-distributor-mcp' / 'venv' / 'Scripts' / 'qb-distributor-mcp.exe'),
    'args': ['serve'],
    'env': env,
}
cp.parent.mkdir(parents=True, exist_ok=True)
cp.write_text(json.dumps(cfg, indent=2))
print('Wrote config with', len(env), 'env vars')
"

You should see Wrote config with 9 env vars. If the count is lower, your .env is missing one of the QB or Gmail entries from Steps 2 and 3. Open ~/.qb-distributor-mcp/.env in any text editor and confirm all nine keys are present.

Now fully quit Claude Desktop. Use Claude → Quit Claude or Cmd+Q. Closing the window is not enough.Right-click the Claude icon in the system tray (bottom-right, near the clock) and pick Quit. Closing the window is not enough. Reopen Claude Desktop. You should see qb-distributor in the MCP tool list.

Step 5 · Create the Gmail label and process a test PO (5 min)

In Gmail, scroll the left sidebar, click More → Create new label. Name it exactly the same string you typed in the setup wizard (purchase-orders if you took the default). Save.

Forward a real PO email to yourself (or compose a fake one) and apply the purchase-orders label. Then open Claude Desktop and ask:

List my incoming purchase orders and draft an estimate for each one.

Claude reads the labeled email, parses the PO, matches every line against your QuickBooks catalog, flags pricing variances, and shows you the draft inline in chat. Each draft has a review_url like qbd://drafts/abc123 you can reference in follow-up messages.

To edit, say things like:

When it looks right, ask Claude to submit:

Submit draft abc123 to QuickBooks.

The Estimate writes to QuickBooks Online. Claude replies with the QB Estimate number and a link to open it in QuickBooks.

Step 6 · (Optional) Build your cross-reference table

This is the single biggest accuracy improvement you can make. SideQuest matches unknown part numbers with fuzzy matching, but customer aliases up front lift Day-1 match accuracy from ~85% to ~99%.

Create the file in any text editor:

touch ~/.qb-distributor-mcp/cross_reference.csv
open -a TextEdit ~/.qb-distributor-mcp/cross_reference.csv

If TextEdit opens in Rich Text, switch to plain via Format → Make Plain Text.

Press Win+R, paste this path, press Enter to open the folder:

%USERPROFILE%\.qb-distributor-mcp

Right-click in the folder, pick New → Text Document, name it cross_reference.csv (make sure Windows doesn't add a .txt on the end — turn on "File name extensions" in File Explorer's View menu if you can't tell). Open it in Notepad.

Add rows in this format:

customer_id,customer_part,internal_sku,notes
ACME,ACME-EL34,BR-ELB-075-NPT,Acme's catalog code for 3/4" brass elbow
ACME,ACME-EL12,BR-ELB-050-NPT,
,LEGACY-12NPT,BR-ELB-050-NPT,Global alias works for any customer
,COMPETITOR-X1,FS-BOLT-25-100,Picked up from competitor pricing

Leave customer_id blank for global aliases. The matcher prefers a customer-specific row when both exist. Save. Add this line by hand to ~/.qb-distributor-mcp/.env:

CROSS_REFERENCE_CSV=/Users/YOU/.qb-distributor-mcp/cross_reference.csv
CROSS_REFERENCE_CSV=C:\Users\YOU\.qb-distributor-mcp\cross_reference.csv

Rerun the Step 4 one-liner so the new CROSS_REFERENCE_CSV value lands in Claude Desktop's config too. Cmd+Q Claude Desktop, reopen. The next PO uses your new mappings.

You're done

That's the whole loop. From now on:

When you're ready for production, open the OAuth Playground again. Pick SideQuest Connector (Production) from the Select app dropdown, click Get authorization code, pick your real QB company on the Connect screen, then click Get tokens. Open ~/.qb-distributor-mcp/.env and update three values: the new QB_REALM_ID, the new QB_REFRESH_TOKEN, and change QB_ENVIRONMENT=sandbox to QB_ENVIRONMENT=production. Re-run the Step 4 one-liner. Cmd+Q Claude Desktop and reopen.

Verify your setup any time

Run the diagnostic check:

qb-distributor-mcp doctor

It prints your license tier, QB realm ID, Gmail account, and runs a sample call against the demo catalog. Secrets are redacted in the output, so it's safe to paste into a support email.

Troubleshooting common Day-1 issues

"Claude Desktop doesn't show 'qb-distributor' in the MCP list"

Three things to check.

(1) The config file path is correct. ~/Library/Application Support/Claude/claude_desktop_config.json (note the spaces).%APPDATA%\Claude\claude_desktop_config.json.

(2) The JSON parses cleanly. Paste it into any JSON validator online to confirm.

(3) You restarted Claude Desktop fully. Cmd+Q to quit, then reopen — closing the window isn't enough.Right-click the Claude icon in the system tray and pick Quit, then reopen — closing the window isn't enough.

"Claude says 'no incoming POs found' but I labeled one"

Two checks. (1) Open the message in Gmail and confirm the label chip shows next to the subject. (2) The label name in ~/.qb-distributor-mcp/.env (GMAIL_PO_LABEL=) matches exactly what you used in Gmail — case-sensitive, hyphens count. If you change one, change the other and restart Claude Desktop.

"Match confidence is low on every line"

Your cross-reference table is probably empty or undersized. Open ~/.qb-distributor-mcp/cross_reference.csv and check the row count. Most distributors need at least 100 mappings before match quality stabilizes. Email [email protected] with a CSV of your customer's past POs and we'll help you extract the cross-references in batch.

"QuickBooks returns an error when Claude tries to submit"

Usually an OAuth permissions issue. Open the OAuth Playground, rerun Step 2b to get a fresh Refresh token, update ~/.qb-distributor-mcp/.env with the new value, rerun the Step 4 one-liner, then Cmd+Q Claude Desktop and reopen. If the error persists, check the operator runbook for QB-specific error codes (3200, 5010, etc.).

"Setup wizard hangs at 'Listening for redirect on localhost:8765'"

That is Intuit silently rejecting http://localhost:8765/callback as a redirect URI. The wizard cannot complete. Press Ctrl+C, skip the wizard for the QuickBooks step, and follow Step 2 above (OAuth Playground).

"Gmail OAuth fails with KeyError: 'client_secret'"

Your google_client_secret.json is the first download Google gave you, which is missing the secret. Open Google Cloud → Clients, open your OAuth client, click + Add secret, then download that second secret. Replace ~/.qb-distributor-mcp/google_client_secret.json with the new file and rerun the OAuth dance (Step 3h).

"Gmail OAuth returns access_denied"

Your app is in External + Testing mode and your Gmail address is not in the test users list. Go to Audience → Test users, click + Add users, type your Gmail, save. Then retry the Gmail OAuth dance.

"Claude says QB_REALM_ID and QB_REFRESH_TOKEN aren't set, but they're in my .env"

The MCP server Claude Desktop launches does not read ~/.qb-distributor-mcp/.env (it runs from a different working directory). Your env vars need to live inside the env block of claude_desktop_config.json too. Rerun the Step 4 one-liner, then Cmd+Q Claude Desktop and reopen.

"qb-distributor-mcp doctor shows every env var as 'unset'"

Doctor reads os.environ, not your .env file or the Claude Desktop config. Only the live MCP server (started by Claude Desktop) loads those. Doctor's "unset" line is misleading, not broken. To verify the wiring, ask Claude Desktop a real question like list 5 items from my QuickBooks sandbox.

"doctor says 'license_not_found'"

The license key in your .env file doesn't match what's on the SideQuest control plane. Double-check the key against your welcome email. If you mistyped it during install, re-run the installer (bash install-connector.sh from the connector folderdouble-click install.bat in the connector folder). Answer n when it asks if you want to keep the existing key, then paste a fresh one.

"I want handwritten POs parsed automatically"

Optional. Open your .env file (~/.qb-distributor-mcp/.env%USERPROFILE%\.qb-distributor-mcp\.env) and add the line ANTHROPIC_API_KEY=sk-ant-.... The connector uses Claude vision to read handwriting. Cost is roughly $0.005-$0.01 per handwritten PO. Skip it and handwritten POs come back flagged for manual review.

Setup checklist More FAQs Operator runbook
SideQuest Automation · sidequestautomation.com
Stuck? Email [email protected]