Integrations

QuickBooks

Pull QuickBooks invoices and payments into /v1/sales-invoices and /v1/payment-entries.

The snag

Finance teams double-key invoices between QuickBooks and their operating system, and cash reporting is always a week behind.

How Zivvy helps

OAuth into QuickBooks Online, poll the Invoice and Payment endpoints, and upsert into /v1/sales-invoices and /v1/payment-entries.

What you get

  • Pull QuickBooks invoices → /v1/sales-invoices
  • Payments landing in QuickBooks mirror to /v1/payment-entries
  • COA + tax codes mapped one-time during setup

Workflow stream

QuickBooks Invoice → /v1/sales-invoices with tax breakout

Common uses

  1. 01

    QuickBooks Invoice → /v1/sales-invoices with tax breakout

  2. 02

    QuickBooks Payment → /v1/payment-entries reconciled

  3. 03

    Journal entries synced to /v1/journal-entries

Integration code

Open API reference

Import a QuickBooks invoice

curl -X POST https://integrate.zivvy.xyz/v1/sales-invoices \
  -H "Authorization: Bearer $ZIVVY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": "Acme Corp",
    "external_id": "qbo-inv-101",
    "posting_date": "2026-07-24",
    "items": [{ "item_code": "SVC-CONS", "qty": 4, "rate": 250 }]
  }'

Poll QBO and upsert

import { getQBO, getZivvy } from "./clients";

export async function syncInvoices(sinceISO) {
  const qbo = await getQBO();
  const zv = getZivvy();
  const invoices = await qbo.query(
    `select * from Invoice where MetaData.LastUpdatedTime > '${sinceISO}'`
  );
  for (const inv of invoices.QueryResponse.Invoice) {
    await zv.salesInvoices.upsert({
      external_id: `qbo-${inv.Id}`,
      customer: inv.CustomerRef.name,
      posting_date: inv.TxnDate,
      items: inv.Line
        .filter(l => l.DetailType === "SalesItemLineDetail")
        .map(l => ({
          item_code: l.SalesItemLineDetail.ItemRef.name,
          qty: l.SalesItemLineDetail.Qty,
          rate: l.SalesItemLineDetail.UnitPrice
        }))
    });
  }
}

API endpoints

POST /v1/sales-invoicesGET /v1/sales-invoicesPOST /v1/payment-entriesPOST /v1/journal-entries

Events emitted

HMAC-SHA256 signed webhooks, retried for 24 hours.

  • sales-invoices.submitted
  • payment-entries.paid
  • journal-entries.submitted

0

free seats forever

0

card required to start

1

workspace for the workflow

Questions

Ready to try it?

Free plan. Two seats. No card.