Skip to content

Gusto

Fetch processed payroll data from Gusto, split into net pay, tax, and other debit components.

Create a Gusto app at dev.gusto.com and complete the OAuth 2.0 flow. Save your credentials to a JSON file:

{
"client_id": "...",
"client_secret": "...",
"access_token": "eyJ...",
"refresh_token": "...",
"company_uuid": "..."
}

VisiGrid automatically refreshes expired access tokens and writes the updated credentials back to the file.

Terminal window
vgrid fetch gusto --credentials gusto-creds.json \
--from 2026-01-01 --to 2026-02-01 --out gusto.csv
FlagDescriptionDefault
--fromStart date inclusive (YYYY-MM-DD)required
--toEnd date exclusive (YYYY-MM-DD)required
--credentialsPath to OAuth2 JSON file
--access-tokenDirect access token (requires --company-uuid)
--company-uuidGusto company UUID
--outOutput CSV pathstdout
-q / --quietSuppress progress messagesoff

Each processed payroll expands into exactly 3 canonical rows:

RowtypeAmount
Net paypayroll_net-net_pay_debit
Taxpayroll_tax-tax_debit
Other (fees/misc)payroll_other-(company_debit - net_pay - tax)

All amounts are negative (outflow from the company bank account).

  • effective_datecheck_date from the Gusto payroll
  • posted_date — same as effective_date (Gusto does not distinguish)

3-row expansion. Each payroll becomes 3 rows sharing the same group_id = payroll:{uuid}. The source_id values are payroll:{uuid}:net, payroll:{uuid}:tax, and payroll:{uuid}:other.

Date range limit. Maximum span of 366 days. VisiGrid errors if the range exceeds this.

Status filter. Only payrolls with processing_status = processed are included.

Pagination. Page-based (100 payrolls per page).

Sort order. effective_date ascending, then source_id ascending.