MA

QBO sync & reconciliation

I6
Nightly export (02:00) · daily reconciliation (06:00) · rows freeze after export · errors surface, never implicit.
assumption— shape settles with the Angie recording
Last export
07-20 02:00
1 invoice, 1 payment · clean (run AR-2)
Reconciliation Δ
$0.00
to the cent · 07-20 06:00
Open sync errors
1
surfaced in-app + task auto-created

Daily reconciliation report

clean · 07-20 06:00
MetricXOSQBOΔ
AR outstanding (open invoices)$18,575$18,575$0.00
Payments received MTD$18,985$18,985$0.00
Sub bills paid MTD$5,600$5,600$0.00

Runs daily whether anyone looks or not. A non-zero delta raises a flag (H1) and a task — discrepancies surface as flags, not surprises (SS§6). 06:00 snapshot — today's INV-904 deposit (J-1044, posted after this morning's signing) lands in tonight's run.

Export-run history

Inngest — visible history, retry, dead-letter
RunItemsResult
07-20 02:001 invoice, 1 paymentclean
run AR-2 — INV-901 + PMT-1203
07-19 02:001 invoice, 2 payments1 error
PMT-1202 duplicate QBO customer — surfaced + task created, rest committed
07-18 02:002 invoicesclean
07-17 02:00no changesclean

Per-row sync state

observable, never implicit (MD§4.8)
EntityRefDirectionStateDetail
InvoiceINV-901XOS → QBOsyncedqbo_id 4471 · last sync 07-20 02:00
InvoiceINV-903XOS → QBOsyncedexported 07-16 → edits FROZEN in XOS · qbo_id 4462
PaymentPMT-1203XOS → QBOsynced$2,800 → INV-901 (qbo 4471) · synced 07-20 02:00
Bill (sub)SUB-911XOS → QBOsynced$5,600 · Peak One Contracting
InvoiceINV-902XOS → QBOpendingqueued for tonight's export (02:00)
PaymentPMT-1202XOS → QBOerrorQBO rejected: customer “Grant & Ellie Moss” matches TWO QBO customer records (duplicate name). Parked by idempotency key — merge in QBO, then retry. Task auto-created for Angie.
idempotency key prevents the duplicate JN was famous for
PaymentQBO-PMT-88QBO → XOSsyncedcheck recorded directly in QBO against INV-903 → synced back 07-17

Money rows freeze in XOS after export — post-export edits happen in QBO and sync back on the next run. Nothing fails silently: every error lands here, in the digest, and as a task.