Each scenario names the production risk it addresses and checks its own outcome. The same objects rendered here are asserted against in the test suite, so the dashboard cannot drift away from what the tests prove.
AEUR invoice syncs to QuickBooks at the transaction-date rate
PASSSyncing a historical invoice with today’s rate silently restates revenue.
- Clio bill INV-2026-001SYNCEDEUR 10,000 issued 2026-07-01.
- Rate capturedAS OF TXN DATERate 1.10 as of 2026-07-01; home value USD 11000.00.
- QBO invoicecreated 1001CurrencyRef EUR, ExchangeRate 1.10.
EUR 10,000 at 1.10 as of 2026-07-01 = USD 11000.00. The sync ran on 2026-09-14 and that date appears nowhere in the valuation.
BA redelivered webhook does not create a second invoice
PASSWebhook redelivery is normal. Without idempotency it doubles revenue.
- First deliverySYNCEDCreated QBO invoice 1001.
- Redelivery (same record, same etag)SKIPPED_DUPLICATEIdempotency key already applied; no provider call made.
- QBO invoices now1Count did not increase.
The duplicate is recognised by provider + entity + id + version + payload hash, before any write.
CSettlement at a different rate produces a realised FX gain
PASSBooking the payment at the invoice rate hides a real cash difference.
- Clio receipt 8801SYNCEDEUR 10,000 received 2026-07-20 at 1.13.
- Home value at recognitionUSD 11,000.00Invoice date rate 1.10.
- Home value at settlementUSD 11,300.00Payment date rate 1.13.
- Realised FXGAIN USD 300.00Posted to FX_GAIN_REALISED.
EUR 10,000.00 settled on 2026-07-20 at 1.13 is worth USD 11,300.00. The same amount was recognised on 2026-07-01 at 1.10, i.e. USD 11,000.00. The USD 300.00 difference is realised because the cash actually moved.
EA trust-to-operating transfer is blocked, not best-effort
PASSClient money posted to an operating account is a reportable breach, not a data-quality issue.
- Clio transfer 8802BLOCKED_ACCOUNTING_RULEEUR 2,500 out of Client Trust Bank into Operating Bank.
- Fund typeTRUSTTaken from the SOURCE account: it is still client money while it moves.
- Rule triggeredTRUST_INTO_OPERATING_ACCOUNTClient/trust money cannot be posted to the operating account Operating Bank - EUR. Trust funds belong to the client until they are properly earned and transferred.
- Remediationguidance recordedPost the receipt to a trust bank account. If this is an earned-fee transfer, model it as an explicit two-sided trust-to-operating transfer with its own approval, not as a direct posting.
Guardrails run before the provider call, so a blocked posting costs zero mutations. These are configurable guardrails, not a claim of IOLTA/SRA compliance.
FA provider failure parks one record and replays cleanly
PASSA failed batch that aborts, or silently drops a record, leaves the ledgers unreconcilable.
- Bill INV-2026-003RETRYABLE_ERRORQBO returned 503 Service Unavailable
- Bill INV-2026-004 (same batch)SYNCEDUnrelated record was not affected by the failure.
- Retry queue1 pendingBackoff 60s, attempt 1 of 5.
- After backoff elapsesSYNCEDCreated QBO invoice 1004.
- Replay once moreSKIPPED_DUPLICATESuccessful replay is still idempotent.
No idempotency key is recorded on failure, so the replay is allowed to do the work; one is recorded on success, so any further replay is a no-op.
DAn open receivable carries unrealised FX, kept separate from realised
PASSConflating the two double-counts the same currency movement, or posts a gain that has not happened.
- Clio bill INV-2026-002SYNCEDEUR 6,000 still open at 2026-07-31.
- Carried at 1.10USD 6,600.00Transaction-date measurement.
- Retranslated at 1.07USD 6,420.00Reporting-date measurement.
- Unrealised FXLOSS -USD 180.00postsToLedger = false. Reported only; QBO performs its own home-currency adjustment.
- Double-count guardALREADY_SETTLEDALREADY_SETTLED: Invoice INVOICE:CLIO:4101 is fully settled as at 2026-07-31; its FX difference is realised, not unrealised. Revaluing it would double-count.
EUR 6,000.00 is still outstanding at 2026-07-31. Carried at 1.10 it stands at USD 6,600.00; retranslated at the 2026-07-31 rate of 1.07 it is USD 6,420.00. The -USD 180.00 difference is unrealised: no cash has moved and the rate can still change before settlement.
GReconciliation surfaces a difference the sync never saw
PASSEvery event reporting SYNCED does not mean the two ledgers agree.
- Operating Bank - EURMATCHClio 10000.00 vs QBO 10000.00, difference 0.00.
- Operating Bank - USDMATCHClio 25000.00 vs QBO 25000.00, difference 0.00.
- Client Trust Bank - EURMISMATCHClio 8000.00 vs QBO 7900.00, difference 100.00.
Balances are derived independently from each system, not from sync outcomes, which is the only way a manual edit or an out-of-band entry is ever caught.
HA mirrored update does not bounce back and forth forever
PASSBi-directional sync plus webhooks is a loop generator: each write triggers the other side.
- QBO invoice 1001 to ClioSYNCEDCreated Clio bill 9001; link records the content fingerprint.
- Clio webhook for that billSKIPPED_ECHONew etag, identical economics: recognised as our own write returning.
- Clio bills created1The echo produced no second record.
- QBO payment 2001SYNCEDMirrored to Clio payment 9002.
- Same QBO payment againSKIPPED_DUPLICATEDuplicate suppressed on the QBO to Clio direction too.
The fingerprint covers economic content only. Etag and SyncToken change on every mirrored write, so a version-based check would loop forever; a content-based one terminates on the first echo.