finance / 2026
Deal Engine
A desktop workspace for merchant cash advance and multifamily underwriting, connecting the initial screen, financial model, and investment memo to one set of assumptions.
Where underwriting actually leaks
The analytical work in a deal is not the hard part. The leak is everywhere else: assumptions living in one analyst’s workbook, a memo hand-copied from a model that has since changed, and no way to answer “what did we assume in March” without opening a file nobody can find.
Deal Engine 2.0 replaces two product-specific predecessors — one merchant cash
advance platform, one multifamily platform — with a single modular monolith.
Import adapters in src/main/importers map legacy records and stage names from
both tools into one unified deal model, and a reconciliation report tracks every
migrated document through attachment, extraction and dead-letter states, so the
cutover itself is auditable.
Screening, modelling and the IC packet sit over one assumption set. Change a rate and the screen, the model and the memo move together, because they are three views of the same object rather than three documents.
Two asset classes, one spine
Product logic lives in the main process under src/main/products, not in React
components; a thin dispatcher routes each deal to its module by productType.
Merchant cash advance — a readiness model evaluated against per-funder profiles: factor-rate yield floors, holdback tolerance and current-position (stacking) limits, with explicit reasons when a deal falls outside a funder’s envelope, plus a document-readiness signal from the vault. The submission desk gates funder submission on that readiness output.
Multifamily — pro forma through to debt: effective gross income, NOI, amortisation with interest-only periods, DSCR and break-even NOI at a 1.20x covenant, exit-cap and NOI-growth sensitivity, ranked tornado drivers, rate-stress floors, project IRR and equity multiple. A fund ledger alongside tracks LP commitments, capital calls and distributions.
Pinned scenarios are stored as immutable, hash-stamped snapshots of the module output, so the exact metrics behind a past decision survive later changes to the model — every output states which version produced it.
Why desktop
The inputs are confidential and frequently arrive as files. The document vault
encrypts attachments with AES-256-GCM under scrypt-derived keys, and a durable
extraction queue parses PDF (pdfjs-dist) and Excel (read-excel-file) attachments
into review findings without the file transiting anyone’s server. Persistence is
node:sqlite — the runtime’s built-in SQLite, so no native module ever needs an
ABI rebuild — behind repository interfaces and eleven versioned migrations.
The renderer is sandboxed with contextIsolation and no Node integration; every
privileged call crosses a typed, Zod-validated IPC boundary exposed through a
narrow preload bridge. Playwright drives the regression suite over the real UI —
pinning a scenario, transitioning a stage, surviving a restart — because an
underwriting tool that silently changes a number is worse than no tool.