QBO Launch Validation

End-to-end deposit walkthrough ยท ProMount by Vancomm (promount entity) ยท Check each box as you go

โšก Run this first โ€” green = ready (read-only, creates nothing; reports PASS / FAIL / MANUAL per prerequisite): doppler run -p vancomm -c dev_vancomm -- node scripts/qbo-launch-preflight.mjs

Before you start โ€” all of these must be live (the list below is what the preflight checks & how to fix each): Bridge Worker: scoro-qbo-bridge.vancomm.workers.dev Test amounts: keep totals $5โ€“$10. Real money flows through QBO Payments. Deposit = quote sum ร— prepayment_percent (e.g. $1.00 ร— 50% = $0.50).
See a finished example: Project 3031 ยท Company 565 ยท Quote 3290 ยท Prepayment 128 ยท Final invoice 2348
1 Create Project
manual
Do New Project in Scoro (promount entity) โ€” clearly test-flagged name, e.g. WALKTHROUGH TEST [date]. Note the project ID.
  • Project exists with a numeric ID
  • URL contains promount
2 Create Customer
manual
Do New Company + linked Person โ€” test-flagged name, e.g. WALKTEST CUSTOMER LLC [date]. Use a real email address (QBO will email the deposit invoice here). Note the company contact ID.
  • Company + Person saved, both linked
  • Email address is reachable
3 Create Quote
manual
Do From inside the Project, create a Quote linked to the Customer. Add a line item, keep total $5โ€“$10. Optionally add a 5% discount. Note the total.
  • Quote exists with a quote number and total
  • Linked to correct Project and Customer
  • PDF preview renders correctly
4 Create Prepayment
manual + auto Worker Path A
Do From the Quote / Order โ†’ New prepayment invoice โ†’ set advance = 50% โ†’ Save.
Auto (Path A, ~60s): Worker mints QBO deposit invoice (50% of order total) โ†’ fetches Intuit pay-link โ†’ writes <a href>Pay online</a> into c_qbo_invoice_link on the Scoro prepayment.
Wait ~60s before sending the PDF โ€” the pay-link populates after the Worker runs. Also confirm the PDF shows a clickable link, not raw HTML (Caveat A & B).
  • Prepayment exists; note its ID
  • Scoro: c_qbo_invoice_link is populated (not empty)
  • Prepayment PDF: "Pay online" is a live hyperlink
  • QBO: deposit invoice for test customer, amount = 50% of total, payment enabled
5 Customer Pays Deposit
manual + auto Worker Path B
Do Click the Pay online link from the prepayment PDF and pay. Or: open the QBO deposit invoice โ†’ Receive payment โ†’ enter deposit amount โ†’ Save.
Auto (Path B, ~60s): QBO payment.create webhook โ†’ Worker verifies HMAC โ†’ resolves qbomap KV entry โ†’ posts receipt to Scoro โ†’ prepayment flips to paid/reconciled.
  • QBO: deposit invoice status Paid, $0.00 balance
  • Scoro: prepayment status paid/reconciled
  • Scoro: receipt linked to the prepayment
6 Final Invoice
manual status advance + auto Worker Path C
Do Find the Order in Scoro. Advance status to Ready to Invoice (or the configured equivalent from P-3).
Auto (Path C, ~60s): Order trigger โ†’ Worker reads order + prepayment โ†’ creates Scoro final invoice โ†’ applies deposit credit (balance = order total โˆ’ deposit) โ†’ creates QBO balance invoice โ†’ writes pay-link to c_qbo_invoice_link on the final invoice.
  • Scoro: final invoice exists; deposit credited; balance = order total โˆ’ deposit
  • Scoro final invoice PDF: "Pay online" is a live hyperlink
  • QBO: balance invoice for test customer, amount = balance due, payment enabled
7 Pay Balance Invoice
manual + auto Path B or native connector
Do Click the Pay online link from the final invoice PDF and pay the remaining balance. Or: record payment directly in QBO against the balance invoice.
Auto: QBO payment webhook โ†’ Worker Path B (or native Receipts connector from P-7) marks the Scoro final invoice paid in full. Idempotency keys prevent duplicate receipts.
  • QBO: balance invoice status Paid, $0.00 balance
  • Scoro: final invoice status Paid in full; paid_sum = order total
8 Reconciliation Checks
manual

Scoro:

  • Prepayment: paid/reconciled; receipt = deposit amount
  • Final invoice: paid in full; paid_sum = order total; balance $0
  • No outstanding AR on test customer
  • Both PDFs show "Pay online" as a live hyperlink

QBO (Mhondoro Capital Partners, LLC):

  • Deposit invoice: Paid; payment recorded
  • Balance invoice: Paid; payment recorded
  • Customer Deposits liability: balance reflects deposit in + out
  • Total from test customer = order total (deposit + balance)
Deposit (D) = T ร— 50%[calc]
Balance (B) = T โˆ’ D[calc]
D + B= T โœ“

Troubleshooting Quick Reference

Symptom Most likely cause Action
Pay-link blank (Phase 4) Path A not fired or errored Wait 60s; refresh record. Check Worker log viewer
Pay-link = literal HTML "HTML format" flag OFF on custom field Scoro โ†’ Custom fields โ†’ c_qbo_invoice_link โ†’ enable flag โ†’ re-run Worker
Prepayment not paid (Phase 5) QBO webhook not wired / token mismatch / no KV entry Confirm P-4; check Worker logs; if KV missing, re-drive Path A first
"customer mapping unresolved" Scoro company โ†’ QBO customer not seeded Seed KV: qbomap:scoro_company:{id} โ†’ {customerId, billEmail}
No webhook in Worker logs Scoro trigger not wired / wrong URL Scoro โ†’ Triggers and actions โ†’ verify trigger + Worker URL
Final invoice not paid (Phase 7) KV entry for balance invoice missing (Path C incomplete) Check Path C completed; confirm qbomap:qbo_invoice:{balanceId} in KV
Duplicate receipts in Scoro Both native connector + Worker Path B fired Not harmful. If double-credit: void the duplicate receipt manually in Scoro UI
Key caveats Wait ~60s after creating the prepayment before sending the PDF โ€” the pay-link populates after the Worker runs. Confirm it renders as a clickable link, not raw HTML. Keep test amounts small โ€” real money flows.
Related: Bridge Worker ยท E2E quote-to-cash reference ยท E-mail kit ยท QuickBooks Online ยท Intuit Developer