Accounting Sync
Sync your contacts and invoices to your accounting package, without duplicates: the same call twice changes nothing, a changed invoice is updated, an invoice that already exists there is linked instead of created again. Payment status (paid, partial, open) comes back with sync-payments, optionally written to your own records and on a schedule. Amounts in cents. QuickBooks Online first. Paid plans.
Endpoints (11)
The project settings: provider, default_item, default_tax, tax_map, tax_mode, the company facts from the last status call, write_back, the payment sync state (payments: cursor, last_run_at, last_changed, schedule) and the canonical tax keys.
No input parameters required.
Set the provider and defaults; only the keys you send change. tax_map maps canonical tax keys to provider tax codes (QuickBooks: query "select * from TaxCode" on the quickbooks integration lists them), e.g. {"standard": "3", "zero": "10"}; a key with null or "" is removed. default_item is the provider item used for lines without item (QuickBooks needs one; "select * from Item" lists them). write_back sends payment changes found by sync-payments to your own MAPI records. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
provider |
string | No | "quickbooks". |
default_item |
string|integer | No | Provider item id for lines without item, e.g. "1". |
default_tax |
string | No | Canonical tax key or provider tax code for lines without tax. |
tax_map |
array | No | {"standard": "3", "reduced": "8", "zero": "10", "exempt": "2", "reverse_charge": "..."} |
tax_mode |
string | No | exclusive (prices without tax, default of the provider), inclusive or none. |
write_back |
array | No | null or {"mode": "none"}, or {"mode": "mapi", "entity": "invoices", "match_field": "the field of that entity that holds the invoice local_ref (default id)", "status_field": "payment_status", "status_values": {"paid": "Paid", "partial": "Part paid", "open": "Unpaid"} (optional), "balance_field": "balance_cents" (optional), "paid_at_field": "paid_at" (optional)}. |
Start connecting the accounting package. Needs the provider app keys in the vault first (QuickBooks: quickbooks_client_id, quickbooks_client_secret). Returns authorize_url for the user; afterwards call status. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
provider |
string | No | "quickbooks" (default). |
return_url |
string | No | Page to return to after connecting (must be on your own site). |
Whether the accounting package is connected, the company (name, country, home currency, multi-currency, custom invoice numbers), link counts per object and status, and warnings with what to do.
No input parameters required.
Create or update one contact (customer) by your own local_ref. Returns action created | updated | adopted | unchanged, remote_id and warnings. An existing customer with the same name (or the only one with the same e-mail) is linked instead of duplicated. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
local_ref |
string|integer | ✓ Yes | Your own id of this contact: 1-64 characters, letters, digits and . _ : - |
name |
string | ✓ Yes | Display name; unique in QuickBooks. |
company |
string | No | |
email |
string | No | |
phone |
string | No | |
tax_number |
string | No | Stored for providers that take it; QuickBooks does not get it yet. |
currency |
string | No | 3-letter code; only with multi-currency on, and only when the contact is created. |
billing_address |
array | No | {"line1", "line2", "city", "postal_code", "region", "country"}; line1 is required in it. |
notes |
string | No |
Create or update one invoice by your own local_ref. The same call twice changes nothing (unchanged); a changed invoice is updated; an invoice with the same number that already exists is linked (adopted), never duplicated. Amounts are cents. Send contact_ref of a synced contact, or the contact itself in contact. Returns action, remote_id, remote_number, total_minor, balance_minor, payment_status and warnings. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
local_ref |
string|integer | ✓ Yes | Your own id of this invoice (e.g. the job or order id). |
number |
string | No | The invoice number shown to the customer (QuickBooks: at most 21 characters, Custom transaction numbers on). |
contact_ref |
string|integer | No | local_ref of a contact synced with upsert-contact. |
contact |
array | No | The contact itself (fields of upsert-contact); it is upserted first. |
issue_date |
string | No | YYYY-MM-DD |
due_date |
string | No | YYYY-MM-DD |
currency |
string | No | Must be the company currency unless multi-currency is on; cannot change after creation. |
tax_mode |
string | No | exclusive, inclusive or none; default from configure. |
lines |
array | ✓ Yes | List (1-100) of {"description", "quantity" (default 1), "unit_price_minor" (cents), "tax" (canonical key or provider code), "item" (provider item id), "service_date"}. |
memo |
string | No | Message shown on the invoice. |
notes |
string | No | Internal note, not shown to the customer. |
expected_total_minor |
integer | No | Your total incl. tax in cents; a different provider total gives a warning. |
One synced invoice: its link (remote id, status, last error) and its live state at the provider (total, balance, paid, partial or open).
| Field | Type | Required | Description |
|---|---|---|---|
local_ref |
string|integer | ✓ Yes |
Synced objects of this project, newest change first, with remote id, status (pending, synced, error), payment status and the last error.
| Field | Type | Required | Description |
|---|---|---|---|
object_type |
string | No | contact or invoice. |
status |
string | No | pending, synced or error. |
payment_status |
string | No | paid, partial or open. |
page |
integer | No | |
per_page |
integer | No | Default 25, max 100. |
Read the payment changes at the accounting package since the last run and update the synced invoices: payment_status (paid, partial, open), balance_minor and paid_at. With configure.write_back each change of payment status is also written to your own record. Safe to repeat. The first run looks back 30 days, or from since. Returns checked, linked, changed (local_ref, payment_status, previous_status, balance_minor), cursor and more (true: call again to continue). Use set-schedule to run it automatically. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
since |
string | No | Read changes from this date (YYYY-MM-DD) or ISO time instead of the stored cursor, e.g. for a first backfill. |
Run sync-payments automatically. schedule is a cron expression, at most every 15 minutes (e.g. "*/15 * * * *" or "0 * * * *"); null or "" removes the schedule. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
schedule |
string | No | Cron expression, or null / "" to stop. |
timezone |
string | No | Time zone of the schedule, e.g. Europe/London (default UTC). |
Remove the link of one object. Nothing is changed or deleted in the accounting package; a next upsert finds the object again by its number or name.
| Field | Type | Required | Description |
|---|---|---|---|
object_type |
string | ✓ Yes | contact or invoice. |
local_ref |
string|integer | ✓ Yes | |
confirm |
boolean | ✓ Yes | Must be true. |
MCP Tool Names
When using this integration through an AI assistant (Claude, ChatGPT, Cursor, etc.), the endpoints are available as MCP tools:
| Endpoint | MCP Tool Name |
|---|---|
| get-config | accounting-sync_get_config |
| configure | accounting-sync_configure |
| connect | accounting-sync_connect |
| status | accounting-sync_status |
| upsert-contact | accounting-sync_upsert_contact |
| upsert-invoice | accounting-sync_upsert_invoice |
| get-invoice | accounting-sync_get_invoice |
| list-links | accounting-sync_list_links |
| sync-payments | accounting-sync_sync_payments |
| set-schedule | accounting-sync_set_schedule |
| unlink | accounting-sync_unlink |
Website