Docs/QuickBooks
Integrations

QuickBooks

Eliminate manual expense entry. Scan a receipt and have it appear as a QuickBooks Online expense automatically — with the correct vendor, amount, date, and category.

Requirements: A ReceiptConverter API key (from your dashboard), a QuickBooks Online account, and either Make or Zapier (free tiers work).

Option A — Make (recommended)

Make has a native QuickBooks Online module that supports creating expenses directly. This is the easiest no-code path.

1
Trigger — Watch for new receipts
Options:
• Google Drive – Watch Files in your /Receipts folder
• Dropbox – Watch for new files
• Gmail – Watch attachments with label "receipts"
• HTTP – Watch for a webhook (advanced)
2
HTTP – Make a request → parse receipt
Method: POST
URL: https://receiptconverter.com/api/v1/convert
Headers: Authorization: Bearer sk_live_your_key
Body type: multipart/form-data
Field: file = [binary from step 1]
3
QuickBooks – Create Expense
Map the fields:
  Payee (vendor):     {{2.data.vendor}}
  Amount:             {{2.data.total}}
  Transaction Date:   {{2.data.date}}
  Account:            choose an expense account
  Memo:               Auto-imported by ReceiptConverter

Option B — Zapier

Zapier's QuickBooks Online integration also supports creating expenses. Use Webhooks by Zapier to call ReceiptConverter.

1
Trigger — your preferred receipt source
Gmail, Google Drive, Dropbox, or any app with file attachments.
2
Webhooks by Zapier – POST
URL: https://receiptconverter.com/api/v1/convert
Header: Authorization → Bearer sk_live_your_key
Payload type: form
File: receipt attachment from step 1
3
QuickBooks Online – Create Expense
Map data__vendor → Payee, data__total → Amount, data__date → Date.
Note: Zapier flattens nested JSON with double underscores (__).

Option C — Direct API integration

Building a custom integration? Parse the receipt first, then use the QuickBooks Online API to create the expense. Below is a Node.js example using both APIs.

import { readFileSync } from "node:fs";

const RC_KEY = process.env.RECEIPTCONVERTER_API_KEY;
const QBO_TOKEN = process.env.QUICKBOOKS_ACCESS_TOKEN;
const QBO_COMPANY_ID = process.env.QUICKBOOKS_COMPANY_ID;

// 1. Parse receipt
async function parseReceipt(filePath) {
  const file = new File([readFileSync(filePath)], "receipt.jpg");
  const form = new FormData();
  form.append("file", file);

  const res = await fetch("https://receiptconverter.com/api/v1/convert", {
    method: "POST",
    headers: { Authorization: `Bearer ${RC_KEY}` },
    body: form,
  });
  if (!res.ok) throw new Error(`RC error: ${res.status}`);
  return (await res.json()).data;
}

// 2. Create QuickBooks expense
async function createQBOExpense(receipt) {
  const payload = {
    TotalAmt: receipt.total,
    PaymentType: "Cash",
    EntityRef: { name: receipt.vendor },
    TxnDate: receipt.date,
    Line: [{
      Amount: receipt.total,
      DetailType: "AccountBasedExpenseLineDetail",
      AccountBasedExpenseLineDetail: {
        AccountRef: { name: "Meals & Entertainment" },
      },
    }],
  };

  const res = await fetch(
    `https://quickbooks.api.intuit.com/v3/company/${QBO_COMPANY_ID}/purchase`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${QBO_TOKEN}`,
        "Content-Type": "application/json",
        Accept: "application/json",
      },
      body: JSON.stringify(payload),
    }
  );
  if (!res.ok) throw new Error(`QBO error: ${res.status}`);
  return res.json();
}

// Run
const receipt = await parseReceipt("./lunch.jpg");
const expense = await createQBOExpense(receipt);
console.log("Created QBO expense:", expense.Purchase.Id);