---
title: Sync with QuickBooks
description: How your agent keeps QuickBooks matched to Doing Work on the shop's schedule.
url: https://doingwork.work/docs/sync-quickbooks/
---

# Sync with QuickBooks

Doing Work doesn't connect to QuickBooks itself. The shop's agent does the sync, on the schedule the shop picks. Daily is a good default.

## Each run

- Call [sync.changes](https://doingwork.work/docs/reference/sync-changes/) with the `next_cursor` you saved last time. The first run can start from `updated_since`. Page until `has_more` is false, then save the last `next_cursor`.
- Each row is one invoice, payment, refund or customer with its current details, so you never replay history.
- If `external_refs` has a `quickbooks` id, update that QuickBooks record. If not, look for a match, create one if there is none, then call [sync.setRef](https://doingwork.work/docs/reference/sync-setref/) with the QuickBooks id.
- A record can show up again in a later run. The saved id makes that safe: running the same sync twice changes nothing.
- To catch anything missed, call sync.changes with `system=quickbooks` and `unsynced=true`. [sync.findRefs](https://doingwork.work/docs/reference/sync-findrefs/) goes from a QuickBooks id back to the Doing Work record.

## Match bank deposits

List payouts with [payouts.list](https://doingwork.work/docs/reference/payouts-list/) and read each with [payouts.get](https://doingwork.work/docs/reference/payouts-get/). It lists every payment and refund in the payout with the processor fee, the Doing Work fee and the net. The nets add up to the deposit. Record both fees as expenses so the deposit, the invoices and the fees line up. The `payout.paid` event tells you when a new payout lands.

Owner or office only. Amounts need the see_prices permission.
