Skip to main content
Each MSP connects their own QuickBooks Online realm to Regentra. The integration lives next to the per-MSP Stripe integration — they’re peers, not competitors. Most MSPs run both: QuickBooks for books of record, Stripe for payment processing.

What this integration does

Pushed automatically when you generate / send / void invoices in Regentra:
EventWhat happens in QuickBooks
Generate invoiceNew Invoice created in your QB realm with line items, customer ref, due date
Send via QB emailQB emails the customer the invoice from your QB realm (uses BillEmail)
Edit DRAFT invoice (notes, due date)Sparse update to the QB invoice
Void invoiceQB invoice voided; if also linked to Stripe, Stripe invoice voided too
Mark PaidQB Payment created applying full balance to the invoice
Customer pays via QBLocal invoice flips to PAID; Stripe invoice voided automatically
Issue credit memoNew QB CreditMemo against the customer
Plus continuous sync via Intuit webhooks for incoming payments and invoice status changes — Regentra keeps the local PSA invoice in step with QB without manual intervention.

Setting up QuickBooks

1

Connect from Regentra

Go to Settings → Integrations → QuickBooks → Connect QuickBooks. Sign in with the email that owns your QBO company. Authorize Regentra against your realm. You’ll land back on the integrations page with the green Connected badge.
2

Configure the mapping

Go to Settings → Integrations → QuickBooks → Configure mapping. Choose:
  • Default Service Item — which QB Service item PSA invoice line items book against (drives your GL account). Optional; falls back to the first active Service item.
  • Default Income Account — reference only; QB routes invoice income via the Service item itself.
  • Online Payment Methods — see QuickBooks Payments below.
3

(Optional) Sync your customers

From a Portal Company detail page, click Sync to QuickBooks to push it as a QB Customer. Regentra dedupes by primary email so re-syncs don’t create duplicates.
If the Connect button is missing or you see “QuickBooks integration not configured,” contact support@regentra.io — the platform-side QuickBooks app needs to be enabled for your account.

QuickBooks Payments (Pay Now button)

Optional. Lets your customers pay through QuickBooks’ hosted payment page directly from QB-emailed invoices.
1

Enroll the QB realm in QuickBooks Payments

In QuickBooks: Settings (gear) → Account and Settings → Payments → Set up Payments. Intuit collects KYC (EIN, deposit account, identity verification) — typically 1-3 business days.
2

Pick the methods to accept

Settings → Integrations → QuickBooks Mapping → Online Payment Methods: master Pay Now toggle, credit card, and ACH (US-only). Toggles default ON when QB is your only payment integration, OFF when Stripe is also connected (see the dual-system section below).
3

Push invoices, send via QB email

On the Regentra invoice detail page, Send to QuickBooks → push the invoice. Email via QuickBooks → trigger QB to email the customer with the Pay Now button. Customer clicks → enters card or ACH on Intuit’s hosted page → Intuit Payments processes the charge → QB auto-creates a Payment entity → the local PSA invoice flips to PAID.
No card data ever touches Regentra. The Pay Now flow is end-to-end Intuit-hosted — Regentra just sets the AllowOnline* flags on the QB invoice body so the button appears.

Using QuickBooks with Stripe (the dual-system pattern)

The most common MSP setup. QuickBooks acts as the books of record (invoices, customers, AR ledger, GL); Stripe acts as the payment processor (collects card / ACH from your customers, deposits net to your bank).

What Regentra does automatically

When both are connected:
Customer actionStripe sideQuickBooks side
Pays via Stripe checkout linkInvoice closes, deposit lands in your bankRegentra automatically creates a QB Payment so the QB ledger reflects the receipt
Pays via QB Pay Now (if enabled)Regentra automatically voids the linked Stripe invoice so they can’t double-payPayment lands, ledger updates
Pays you offline (cash, wire)Click Mark Paid in Regentra → QB Payment created
The bridges are best-effort and idempotent — webhook redeliveries and double-clicks can’t double-book.

Default behavior protects against duplicate charges

When both Stripe and QB are connected, Regentra defaults the QB Pay Now toggles to OFF. The customer sees only the Stripe checkout link. This prevents the parallel-payment-path failure mode where the customer might use both channels and end up double-charged. You can override this — turn the QB Pay Now toggles back on under Settings → Integrations → QuickBooks Mapping → Online Payment Methods. The bridges still keep it safe, but a single payment path is simpler for customers and bookkeeping.

Stripe processing fee + bank deposit reconciliation

When a customer pays 100viaStripe,Stripedeposits 100 via Stripe, Stripe deposits ~97 into your bank and keeps ~$3 as a processing fee. Your QB books need three entries to balance:
  1. $100 invoice paid (the QB Payment).
  2. $97 net deposit hitting your bank account.
  3. $3 expense recorded against a “Stripe Fees” account.
Regentra creates all three natively when you configure two account mappings — no third-party reconciliation tool required.
1

Open the QuickBooks mapping page

Settings → Integrations → QuickBooks → Configure mapping → scroll to the Stripe Fee Reconciliation card. (The card only appears when both Stripe and QuickBooks are connected.)
2

Pick the expense account

Choose the QB Expense account where the Stripe processing fees should be debited. Typical name: “Merchant Processing Fees” or “Stripe Fees.” Create one in QB first if it doesn’t exist.
3

Pick the deposit bank account

Choose the QB Bank account where Stripe deposits actually land. The Purchase entry credits this account for the fee amount so the QB bank balance matches the net Stripe payout.
4

Save

From now on, every Stripe webhook for a paid invoice posts a QB Purchase debiting the expense account and crediting the bank account, in addition to the Payment.
Either field unset = fee posting is skipped (Payment is recorded at gross, same as the pre-feature behavior). The mapping is opt-in and backward-compatible: existing orgs are unaffected until you set both accounts.
The full chain on a Stripe payment:
  1. Stripe webhook fires → Regentra walks invoice → payment_intent → latest_charge → balance_transaction to extract the exact fee in cents
  2. Regentra posts the QB Payment (gross amount) against the invoice — same as before
  3. Regentra posts a QB Purchase debiting the expense account (3fee),creditingthedepositbankaccount(3 fee), crediting the deposit bank account (-3 to net the deposit)
  4. Purchase carries a deterministic requestId keyed on the Stripe charge ID — so webhook re-delivery cannot create duplicate Purchase rows
Fee fetch + fee post failures are best-effort: they’re logged but never roll back the gross Payment. A QB hiccup means you might see a fee delta in QB for a few cycles, but the customer’s AR is always resolved correctly. If you currently use a third-party reconciliation tool (Acodei, Synder, Bookkeep, the QBO native Stripe app), the native flow will create duplicate entries. Disable the third-party tool’s fee sync before enabling Regentra’s, or leave the Regentra mapping fields blank.

What gets synced (per direction)

Regentra → QuickBooks

  • Customers — Portal Companies push to QB Customers via Sync to QuickBooks (or auto-sync on Portal Company edit). Dedupes by primary email.
  • Invoices — pushed on Send to QuickBooks from the invoice detail page or auto-pushed when “QuickBooks” is checked as a destination on invoice generate.
  • Payments — created automatically on Stripe webhook + Mark Paid manual action.
  • Voids — propagated to QB invoice voids.
  • Credit Memos — created via the Issue Credit Memo button on PAID/VOID invoices.

QuickBooks → Regentra

  • Invoice paid (full) — local invoice flips to PAID; if linked to Stripe, Stripe invoice auto-voided.
  • Invoice paid (partial) — local invoice flips to PARTIAL with remaining balance shown in the UI. Flips to PAID once the rest lands.
  • Payment received — walks LinkedTxn[] to find the affected invoice and reconciles balance.

Troubleshooting

”First you’ll need to create a company to use with your app”

The Intuit account you signed in with has no QBO company attached. Sign out of Intuit, sign back in with the email that owns your QBO company, and retry the connect.

Test Connection succeeded yesterday, fails today

Refresh tokens last ~100 days. If yours expired, the connection-status banner on the QB integration card will say “QuickBooks connection is broken — Reconnect.” Click Reconnect to re-authorize without losing your mapping configuration.

Customer paid via Stripe but QB still shows the invoice as outstanding

The auto-bridge runs when the Stripe payment completes. If it failed (network blip, expired QB token, etc.), the local invoice is PAID but the QB ledger isn’t. Click Mark Paid on the invoice detail page — same idempotency key, so it retries the QB Payment creation. The audit log captures both the failed attempt and the manual retry.

Stripe invoice still shows “open” after customer paid via QB

Same situation in reverse. The QB-paid → Stripe void bridge is best-effort. Manually void the Stripe invoice from the Stripe dashboard, OR click Void on the Regentra invoice detail page (which fires both the local + Stripe + QB voids in one action).

Realm-already-connected error

Each QuickBooks realm can only be connected to one Regentra organization. If you see “This QuickBooks realm is already connected to another Regentra organization. Disconnect it there before connecting it here.” — go to that other org first, disconnect, then retry.

Other errors

If you hit an error not covered here, contact support@regentra.io with the timestamp and the error message shown in the UI. The platform team can trace the underlying request to Intuit and follow up.