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: 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.
4

(Optional) Turn on auto-push for Stripe-imported invoices

If you also import invoices from Stripe (see Stripe → Importing invoices created directly in Stripe), the mapping page has an “Auto-push to QuickBooks” card with an Automatically push invoices to QuickBooks checkbox, off by default. See below for exactly what it does.
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: 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 $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.

Auto-pushing invoices created from a Stripe import

If you invoice through Stripe directly and also use QuickBooks as your books of record, turning on Automatically push invoices to QuickBooks (Settings → Integrations → QuickBooks → Configure mapping → “Auto-push to QuickBooks”, off by default) automatically pushes newly-imported Stripe invoices to QuickBooks — you don’t have to click Send to QuickBooks on each one.
Turning this on stamps the moment you enabled it. Only Stripe invoices created after that moment auto-push. Invoices you import from further back — through a manual backfill, or the background healing sweep catching up on older history — still import into Regentra for visibility, but don’t auto-push; use the bulk send described below for those.
Once auto-push is on, the invoice-generate form also defaults its QuickBooks checkbox to checked, so a manually-generated invoice pushes to QuickBooks by default too.

Finding and bulk-sending invoices that aren’t in QuickBooks

The invoice list (PSA → Invoices) shows an In QuickBooks status pill per row so you can see at a glance which invoices have been pushed. Use the Not in QuickBooks filter to isolate everything that hasn’t. If a push failed, the pill shows why — the specific error QuickBooks returned — instead of leaving you to guess. To catch up a batch at once, select the invoices you want and click Send to QuickBooks from the list (not the single-invoice button on each invoice’s detail page). This is available only to Admin-level roles — a stricter check than the rest of this feature — since sending up to 50 invoices in one action has a much bigger blast radius than pushing one.

Reconnecting a broken connection

If your QuickBooks connection breaks — most commonly an expired refresh token — a QuickBooks connection is broken — Reconnect banner now appears in two places: on the integration card itself, and on the invoice list, since that’s usually where you’ll notice invoices have stopped syncing. Either one takes you through the same reconnect flow, which re-authorizes without losing your mapping configuration.

Payment processor and accounting sync roles

QuickBooks can act as both your payment processor (collecting payment) and your accounting sync (recording it to your books) at the same time — every other processor (Stripe, Alternative Payments) only ever holds the payment-processor role. See Payment Processors for how this works, including what happens if you connect QuickBooks while Stripe is already your active processor, and what disconnecting QuickBooks does to both roles at once.

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 for settled Stripe or direct Alternative Payments collections and the Mark Paid manual action. AP collection through its own QuickBooks connection posts to QuickBooks through AP instead.
  • 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.