QuickBooks Online

Sync pay runs, pay stubs, and company info from QuickBooks Online into Audit1 using Intuit's official OAuth 2.0 Authorization Code flow.

What syncs: Pay runs, pay stubs (per-employee detail), company info (legal name, EIN), employees


Prerequisites #

  • Active QuickBooks Online account (Intuit)
  • A QBO Admin who can grant the connection from inside QuickBooks
  • Active Audit1 account with an employer record matching the QBO company

Setup #

1. Start in Your Portal #

Go to Settings > Connections > Set Up Connection > Connectors > QuickBooks Online.

2. Click "Connect to QuickBooks" #

You will be redirected to Intuit. Sign in with your QuickBooks credentials, choose the company to connect, and grant the requested scopes. Intuit redirects you back to Audit1 automatically.

The OAuth flow is the standard Intuit Authorization Code grant — no client-side keys, no secret to copy. The connector stores a refresh token on Audit1's side and rotates the short-lived access token automatically.

3. Set Schedule and Go Live #

Setting Options
Frequency Daily (recommended), weekly, or manual

Run a test sync first. Once data looks correct in your Audit1 dashboard, enable the schedule.


How It Works #

flowchart LR qbo["QuickBooks Online
Intuit OAuth 2.0"] connector["Connector
QuickBooks Online"] gcs[("connectors-api-files
GCS bucket")] creator["Files-creator"] db[("MongoDB")] auditor["Auditor
P1 · P2 · P3"] qbo --> connector --> gcs --> creator --> db --> auditor classDef primary fill:#4f39f6,color:#ffffff,stroke:#4f39f6,stroke-width:2px; class connector primary
  1. OAuth — Each connection captures realm_id (Intuit's company identifier) and the refresh token, scoped to that employer.
  2. Pull — The connector calls Intuit's REST endpoints (/payruns, /paystubs, /companyinfo) for the date window.
  3. Normalize — Per-employee pay stub data is converted to the Audit1 payroll-row format and uploaded to the connectors-api-files GCS bucket.
  4. Ingest — Files-creator picks up the upload, identifies the employer + policy, and the Auditor runs Phase 1 / 2 / 3.

Each employer can be connected to one QuickBooks realm at a time. Disconnecting from inside Audit1 revokes Audit1's tokens with Intuit immediately.


Endpoints (Internal — Portal & Diagnostics Only) #

These are managed by the Audit1 portal; developer API keys cannot call them directly. Included here so engineers debugging an integration know what each route does.

Method Endpoint Description
GET /auth/connect?employer_id=... Redirect to Intuit consent screen
GET /auth/callback Intuit redirects here after user grants access
POST /auth/disconnect Revoke tokens for a connection
GET /auth/status/:realmId Connection health for one realm
GET /auth/connections List all connected realms
GET /payroll/company?realm_id=... Pull company info
GET /payroll/payruns?realm_id=...&start_date=...&end_date=... Pull pay runs in a window
GET /payroll/paystubs?realm_id=... Pull pay stubs
POST /orchestrator/sync Trigger a full sync for one connection

Troubleshooting #

Problem Solution
✗ "Connection Denied" page after Intuit redirect The QBO user clicked Cancel. Restart from your portal.
✗ Sync returns 401 / 403 mid-stream Refresh token expired or was revoked inside QBO. Click Reconnect in your portal.
✗ No pay-run data appears Verify QuickBooks Payroll is active on the connected realm. The connector pulls from QBO Payroll, not QBO accounting line items.
Sync stuck "pending" Files-creator may be backed up. Check the file list in your portal; allow up to 15 minutes during normal load.

Need help? Email support@audit1.com