Data flow
Manual underwriting stays in your browser: inputs, the engine, results, exports. Without sign-in, your deal leaves it on four occasions, each started by you: three of the four AI actions, and a URL that carries the deal (the fourth, reading a comp file, sends that file, not the deal). That covers a share link you send and the IC memo button on the desk, because the memo is a page and opening it is a request with the whole deal in the request line. With Underwrite Core there are two more, also started by you: saving a deal to your account sends it to Underwrite's server, which keeps it privately under the account, and making a share link sends the deal to Underwrite's server, which signs the link and keeps no copy of the deal. Market data flows the other way and never carries deal data out.
One more path carries the deal's ZIP and, after a lookup, a digest of the deal's link, and nothing else about the deal. Where this site has it set up, Public rent context, a folded panel beside the rent on the desk, sends the five-digit ZIP to Underwrite's server when you press Look up, and the server asks the Census Bureau's public data API for that area's rent figures. The Census Bureau sees that request from Underwrite's server, not from your browser. The panel's source link is different: if you open it, your browser goes to the Census Bureau's data site with the ZIP in its address. The server may keep the public figures for that ZIP in memory for up to 30 days, so a later lookup may not need to ask again. While its figures are on the desk, and where this site lets them travel on a link, the desk also sends them back to Underwrite's server with the server's token for them and a one-way digest of the deal's memo or share link, a SHA-256 fingerprint that does not contain the deal, right after the lookup, after each pause in editing and when you copy a link, so the server can sign the figures to that one deal. With Underwrite Core, making a share link sends the figures and the server's token for them with the deal itself, as making a share link already sends the deal. Where the lookup is not set up, the panel says so and sends nothing. In Confidential Mode the panel sends nothing.
- Your browser
assumptions, the model, results, source trail, workbook, print
- Your browser
document or comp file staged; workbooks and CSV files reduced to bounded cell text locally
- Underwrite server
size and reference checks, rate limit; staged PDFs read back from private storage and deleted when the read settles
- the processing service APIExternal AI
reads the document, returns structured values and the sentences it quotes for them; for a comp file, the rows and the line each came from
- Your browser
current inputs and computed results, serialized
- Underwrite server
validation and rate limit; keeps no copy
- the processing service APIExternal AI
returns prose for review; cannot change a number
- FREDExternal provider
Treasury curve, SOFR, CPI, inflation expectations
- Underwrite server
holds the provider key; stamps observation date, cadence, freshness
- Your browser
renders the series with their own as-of dates
- Your browser
the deal's five-digit ZIP. After a lookup, while its figures are on the desk and can travel on a link here, the figures with the server's token for them and a one-way digest of the memo or share link, never the deal; with Underwrite Core, a share link sends them with the deal itself
- Underwrite server
rate limit; asks the Census Bureau for the ZIP's area, keeps the public figures in memory for up to 30 days, and signs them to that one deal's link
- Census BureauExternal provider
its public data API receives the ZIP in a request from Underwrite's server, not from your browser, and returns the area's rent figures
- Your browser
the whole deal, encoded into the URL itself; there is no link database. Without sign-in the link is made here. With Underwrite Core, making a share link sends the deal to Underwrite's server, which signs the link and keeps no copy of the deal. The desk's own IC memo button builds one of these URLs
- Wherever you send itOut of Underwrite's hands
the link is the deal; anyone holding it can open it
- Underwrite server
opening the link sends the whole URL, deal included, to the server in the request line; the server reads the deal name for the memo's title, runs the deal through the engine to draw the link's preview card (IRR, multiple, NOI, grade and verdict, an image the hosting platform's CDN caches), serves the page, and keeps no copy of the deal. The request line exists in the hosting platform's access log, which this product does not control and therefore does not promise to delete
- Your browser
an event name, a random id this browser made for itself, and coarse facts: which assumption field was edited, which limitation appeared, which export ran. Never a value, a quote, a name, an address or a file
- Underwrite server
an allowlist of event names and properties; unknown events and free text are refused; no IP address or user agent is kept
- Private store
read only by the founder's own report; deleted by a retention pass he runs, window 90 days, which leaves a receipt; no third-party analytics, no session replay, no keystrokes
- Your browser
the deal's name and inputs; no source quote and no document
- Underwrite server
checks the sign-in and that the deal looks like one, then writes it
- Private store
kept under your account, in a folder with a random name that holds no email address; you can download or delete it at any time
- StripeExternal provider
the card is entered on Stripe's hosted page; card numbers never touch Underwrite
- Underwrite server
a signed webhook records customer id, email, plan and status in a private ledger; the signature is verified before anything is read
- Form serviceExternal provider
your email and what you typed go to a form service and land in the founder's inbox; type nothing there you would not email
The diagram also shows three paths that carry no deal data: usage events, off in Confidential Mode and deleted by a retention pass the founder runs (window 90 days, not a timer); a subscription, where the card is entered on Stripe's page and Underwrite keeps a customer id, email, plan and status; and the two forms, which reach the founder through a form service. A subscriber's saved deals are kept privately under their account, in a folder with a random name, never with Confidential Mode on, and nothing reads their contents. A visitor who does not sign in keeps nothing on the server.
The AI boundary
Four features send data to the processing service's API, each only when you click it, each through Underwrite's server, and each returns material a human reviews: the parser, the comp reader, the deal review and the memo's executive summary. Two of them change no number: the deal review and the memo's executive summary are written about figures the engine has already produced, and what they return is prose, checked against the engine before it is shown and refused if it disagrees.
The parser is different. It returns field values, those values are written into the inputs panel, and the engine recomputes from them: exactly what happens when you type a value yourself. What it cannot do is produce a result. It fills inputs; it never returns an IRR, a multiple, a verdict or a grade, and no figure it returns is used as an output. On a hotel deal it reports the ADR, occupancy and RevPAR the document states, and the server, not the model, turns them into a monthly revenue per key in code. That row is labeled as computed by the server, it lands in an input you can see and change, and /methodology/hotel states the conversion. The model has one commercial line: office or other space a document describes beside the retail is named beside the result and its income left out, not folded into the retail line.
The comp reader is the parser reading a comp file you choose on the desk: a rent or sale comp report you exported from a service you use. It goes the way a deal document goes, and comes back as rows, each with the line it came from. Code computes their counts, ranges and medians beside your assumptions, and no comp changes an input unless you click to use its median. Underwrite has no comp data of its own and does not verify yours.
| Feature | Sends, on click | Returns | What it can never do |
|---|---|---|---|
| AI parser | The document or pasted text you hand it | The assumptions, each with the sentence it came from or a mark to check. The server says how it worked out a hotel's revenue per key | Produce the return: the assumptions go to the inputs for your review, the same as typed ones |
| AI comp reader | A comp file you choose: a PDF itself, an Excel or CSV file's cell text and name, or pasted rows | Comp rows, each with the line it came from. Each figure is confirmed against the cell text or pasted rows (a PDF's rows are shown as read and not confirmed), and the counts, ranges and medians are calculated from those | Change an input, a figure or the verdict: a comp median enters an input only when you click to use it |
| AI deal review | The assumptions on screen and the calculated results | Notes, diligence questions, and a one-line read | Change any output, verdict, grade, or exported number |
| Executive summary | The assumptions on screen and the calculated results | Two to four sentences restating the figures already on the deal | Recompute anything; it restates, and you review before it is kept |
The calls run under the processing service's commercial API terms, which do not use the input for training. Underwrite trains nothing.
On the desk, each figure is labeled: extracted values read Extracted from source with the sentence behind them where there is one, calculated results read Calculated by model, and anything you override reads User assumption. A figure the server computed from values your document states, such as a vacancy from a stated occupancy, reads Computed by the server, with its formula. On a deal of your own, an input no document and no edit set, which still holds the worked example's value, reads Sample assumption. Judgment calls the engine cannot make are routed to analyst review and say so.
What is read
Source quotes
A quote appears only when the server found the sentence in your pasted or spreadsheet text and it states the value. It stays at that field for the session that parsed it. Every other value is flagged with the reason, or says how the server computed it. The server passes a PDF to the model without reading its text, so every PDF row is flagged and its sentence is the model’s account of the document, not a checked quote. Quotes are not carried into a saved deal or a share link, and tenant rows have none.
Confidential Mode
It turns off the parser, comp reading, the AI review, the memo's AI summary, share links and memo links, and the public rent lookup where it is set up. Everything else keeps computing in your browser.
Source trail
Source trail walks the IRR back through the cash flows and revenue assumptions to the seller’s sentence on rent. It shows a calculation and its inputs. It does not cite a source for every figure. The desk uses the same tool.
The engine, and what is advisory
Every financial figure is calculated from the assumptions on the deal. The same assumptions always give the same result. The verdict follows two published rules, shown on every surface: project IRR at or above 15.00% and minimum DSCR at or above 1.00x (all-equity deals skip the coverage test because there is no debt service).
Anything else that reads like advice is labeled advisory and never decides the deal: lender-standard tests shape the grade, solvers propose values you apply yourself, and a written review cannot change a figure. The files behind the verdict are at /methodology/engine; the full method is at /methodology.
Document handling
The figures below are the capability report of the deployment serving this page, the same report the upload panel reads.
- PDF size ceiling
- asking the deployment...
- PDF page ceiling
- asking the deployment...
- the parser service's own limit; the product tells you before you hit it
- Excel workbook ceiling
- asking the deployment...
- workbooks are opened in your browser; only bounded cell text is sent
- Parse rate limit
- asking the deployment...
- enforced server-side; the limiter and this number share one constant
The mechanics behind those numbers: a PDF at or under the direct ceiling travels inside your parse request. A larger PDF is staged, from your browser, into private blob storage under a server-issued token scoped to PDFs, to one folder, to the size ceiling, and to a few minutes. The store is private: the document never sits at a public address, the parser service cannot fetch it by URL, and only Underwrite's server token can read it back. The server verifies the staged reference is its own, refuses foreign hosts and malformed paths, and deletes the blob the moment the parse settles, on success and on every failure path. Excel workbooks never travel as binary: they are opened in your browser and only their cell text, normalized and capped in size, is sent, with formulas and macros never executed.
Underwrite's operator log records sizes, timings and errors. When the server withholds the parser's note, or refuses an AI review or summary, the log line quotes the figure or word that caused it, and on a PDF that figure can come from your document. Rate limiting is per IP and applied on the server, with the ceiling above read from the limiter's own constant. The count is held in memory per server instance, so it is a service protection, not a hard guarantee: several instances, or a restart, can let more through.
Confidential Mode
Confidential Mode is one switch on the desk. With it on, these are off:
- AI parsing is disabled: text, PDFs, and workbooks cannot be sent from the parser panel.
- Comp files cannot be read: the comp reader beside the parser sends nothing.
- AI deal review is disabled, and the Review tab steps aside so you are never parked on a dead panel.
- The memo's AI executive summary is disabled on the memo page, and the request is refused at the call as well as at the button.
- Share links are disabled, because they encode the deal in the URL.
- The memo link is disabled for the same reason; the printable memo remains available from the desk itself.
- Usage events stop: with Confidential Mode on, no page sends a beacon at all, not even the fact of an edit.
- The one feedback question that follows an export is not offered, because what you type into it goes to a form service.
- Public rent context sends nothing, not even the ZIP, and says why in its panel.
What keeps working: the assumptions you enter, the model, scenarios and sensitivities, print, the workbook, and deals saved in this browser. Two limits: Confidential Mode is a setting kept in this browser's storage, not an account setting. It stays on across reloads and across the desk and the memo page in this browser until you turn it off or clear the site's data, and it does not follow you to another browser or device. In a browser that blocks site storage it holds only until the page reloads. And the page itself still fetches market rates from Underwrite's server; those requests carry no deal data in either direction. Your organization's document-handling policy still governs what you are authorized to paste anywhere, including here.
Source provenance and your changes
An AI-extracted value arrives either with a source sentence or with a flag that says why it has none: the sentence was not found in your document, it does not state the value, it came from a PDF the server cannot read, the row is a tenant row this parser does not quote, or no sentence came back at all. A value the server computed from figures the document states is not flagged; it says it was computed, and from what. For pasted text and workbooks the server holds your source, so it asks two questions of every quote the model returns: is this sentence literally in the source, and does it state the value being claimed. A quote that fails either is not provenance. It is still shown, beside the hand-verify flag, and labeled as reported rather than attested. The server passes a PDF to the model without reading its text, so only the second question can be asked of a PDF quote: the server checks that the sentence the model reports states the value beside it, and cannot check that the sentence is in your document. Every row read from a PDF carries the hand-verify flag, and the sentence it reports is the model's account of the document rather than a verified quotation from it. Tenant rows extracted from a rent roll carry no quote at all: they arrive as an audit row with the term the document stated, and the per-tenant sentence is not tracked yet.
The desk states each input's standing in two places. In the parser's list of what it extracted, a value shows its quote, or an amber flag to verify it by hand when no quote survived; every tenant row from a rent roll is in that list with the amber flag. In the inputs panel, each parsed field carries a gold dot whose tip shows the sentence or says no sentence came back. Tenant cards carry no dot, so a tenant row's standing is shown only in the parser's list, and hand-entered fields claim no source at all. The moment you edit an extracted field, the dot gives way to a User assumption ring: the quote attests what the source said, not what you chose, so a value that departs from its evidence is visibly yours.
Source quotes are state in the tab that parsed the document. They are not written into a saved deal, they are not encoded into a share link or a memo link, and loading a deal from the library clears them. A colleague who opens your link gets the deal's values and no evidence behind them, and so do you when you reopen your own saved deal: the desk shows those fields with no provenance rather than with provenance it cannot stand behind. The workbook and the printed memo do not carry the quotes either. Nothing Underwrite produces is a substitute for keeping the source document beside the deal.
The change record works the same way: the desk keeps the deal as it arrived (from a parse, a link, the library, or the defaults) and diffs the live model against it, so every edited assumption is listed with its loaded value, its current value, and the measured impact of that one edit, with one-click restore. This record is derived from the live session, not stored: Underwrite keeps no server-side history of your edits, and a saved deal is a snapshot, not a log. There is no edit history across sessions: a deal saved in this browser, or to your account with Underwrite Core, holds the deal as it was saved and nothing of how it got there.
Model limitations
These are the deals the model covers. The desk shows the first line and links here.
- Multifamily is the strong path.
- Mixed-use is supported when its rent roll uses whole-year lease terms of 1 to 100 years.
- A lease term the model cannot represent, such as a part year, keeps the deal unscored. Nothing is rounded, and no IRR, multiple or verdict is shown.
- Expense recoveries are not modeled until you include them. Included, expense recoveries are modeled without gross-up or reconciliation.
- Office, retail, industrial, net lease and hotel cover only part of the deal.
- Development and portfolio deals are not supported.
Each limitation below uses one wording on the desk, the memo and this page. A limitation carries no invented impact number. Where a deal gives a limitation measurable scope, the desk and memo state the share of gross potential revenue it sits behind.
Operating expenses are carried gross. CAM, tax and insurance reimbursements from commercial tenants are not credited back to EGI, so NOI is conservative by the amount of any recovery this asset actually collects.
Applies: Commercial deals, until you include expense recoveries. Workaround: Include expense recoveries to credit net, modified gross and fixed CAM reimbursements to income, on occupied space only.
Recoveries are credited to EGI from the terms entered: each payer's pro rata share of the recoverable lines, on occupied space only, with any admin fee and CAM cap as stated. Variable expenses are not grossed up for occupancy, there is no year-end reconciliation or audit, and reserves, leasing costs and any line not ticked are not recovered.
Applies: When expense recoveries are on. No workaround inside the model.
Commercial space on an aggregate rent assumption carries no rent roll, so tenant improvements, leasing commissions, rollover downtime and free rent sit outside the cash flow. On a rent roll, market leasing assumptions are off unless turned on.
Applies: Commercial space entered as aggregate SF and rent, with no tenant rent roll. On a rent roll, renewal probability is off unless market leasing assumptions are turned on. Workaround: Add a tenant rent roll: tenant improvements, leasing commissions, rollover downtime and free rent are modeled per tenant, and expired leases re-lease at market. Turn on market leasing assumptions to blend a renewal (no downtime, renewal TI/LC, free rent and rent) with a new lease, and to count downtime by month. Or include the re-tenanting reserve, which applies them to a stated share of the space each year.
Anchor-loss rent reductions and termination rights on inline tenants are not read from leases and never enter the cash flow, with or without a rent roll.
Applies: Multi-tenant retail and office. Workaround: Include the co-tenancy case: the anchor goes dark in a stated year, and inline rent is cut by a stated percent or a share of it ends after a cure period.
Taxes, depreciation and partner-level management fees are not modeled. Every IRR and multiple on this desk is a pre-tax, pre-fee project-level figure.
Applies: Until you include the after-tax view. Workaround: Enable the after-tax overlay: straight-line depreciation, optional cost segregation with bonus depreciation, optional NOL carry-forward, and optional flat state rates are modeled.
A pass-through entity is assumed. State rates are added flat to federal; SALT-cap and deductibility interactions, Section 1031 exchanges, and entity-versus-partner distinctions are not modeled.
Applies: When the after-tax overlay is on. No workaround inside the model.
The balloon is assumed paid off at sale with no exit-debt cost. Interest-only periods and floating rates are also not modeled.
Applies: Every levered deal. No workaround inside the model.
A step-down, yield maintenance or defeasance cost is charged on the senior acquisition loan when the sale pays it off before maturity, as its own exit-debt line. An interest-only period runs from closing, then the loan amortizes over its full amortization. A floating rate resets once a year to the entered index path, or the current index held flat, capped at any strike, plus the spread; the cap's cost is a use at closing. Not modeled: prepayment cost on mezzanine debt or a refinance loan, lockouts, monthly rate resets, rate floors, cap expiry, extension options, and rate sensitivities on a floating loan, which move only the fixed rate.
Applies: When a prepayment structure, an interest-only period or a floating rate is entered on a levered deal. No workaround inside the model.
Tier amounts are computed against the LP's compounded hurdle over the full hold. Annual interim distributions feed the IRR cash flows but do not step LPs through hurdles year by year.
Applies: Every deal with a waterfall. No workaround inside the model.
Hotel operating revenue can be entered as room nights and daily rates. Seasonal demand, departmental margins, development and portfolio economics remain outside the model.
Applies: Hotel revenue scenarios when explicitly enabled. Workaround: Include hotel revenue and enter rooms, daily rate and physical occupancy.
The base project return excludes additional acquisition, asset management and disposition fees. Partner-level fee allocations are not modeled.
Applies: Additional fee scenarios when explicitly enabled. Workaround: Include the fee view for a separate pre-tax result after the additional sponsor fees you enter.
The wider institutional gap map, including what stays with counsel, appraisers, and lease abstracts, is at /methodology/beyond-phase-1.
Live data
Macro series (Treasury curve, SOFR, CPI, inflation expectations) come from FRED, fetched by Underwrite's server; provider keys never reach your browser, and the requests carry no deal data. Every figure keeps three facts separate: the observation date it describes, the cadence it can possibly move at, and the moment Underwrite last called the provider. A monthly CPI print is labeled as the month it describes and never dressed up as an intraday read. When the provider is unreachable or unconfigured, the product serves labeled fallback figures and never presents them as a market observation.
Reading the feed...
Beyond the FRED series, many Phase 3 market overlays run on seeded calibrations until direct data licenses exist; each is tagged live, hybrid, seeded, or derived in the module inventory, and the memo's module notes say which is which.
Exports and sharing
The Excel workbook is written in your browser by the export code, from the live model; it does not round-trip a server. Print produces the IC memo from the same state. Share links and memo links encode the deal's inputs into the URL itself: there is no link database, and the link is the deal. Without sign-in the link is made in your browser. With Underwrite Core, making a share link sends the deal to Underwrite's server, which signs the link and keeps no copy of the deal; the signature is what lets the link open for whoever receives it while you have Underwrite Core. Opening one is a request to Underwrite's server with the whole deal in the URL: the server reads the deal name for the memo page's title, runs the deal through the engine to draw the link's preview card (its name, IRR, multiple, Year 1 NOI, grade and verdict, an image the hosting platform's CDN caches), serves the page, and keeps no copy of the deal, and the request line exists in the hosting platform's access log, which this product does not control and therefore does not promise to delete. The URL does not carry the parse: source quotes stay in the session that made them. Treat a share link like the document it carries, because anyone holding it can open that deal; that is why Confidential Mode disables both link flows.
Deletion and access
A deal saved to this browser's library exists in its local storage, on your machine. Delete any deal from the library, or clear the site's browser data to remove everything at once. Without sign-in there is no copy on Underwrite's server to request, and no one at Underwrite can pull up a deal from a database. With Underwrite Core, saving a deal to your account sends it to Underwrite's server, which keeps it privately under the account, in a folder with a random name; you can download or delete it from the account at any time, and a deal with Confidential Mode on is never saved there. Access is whoever can use your browser profile or your account, plus anyone you hand a share link, plus whatever the hosting platform's access log retains of the request lines of the memo and share links that were opened. Those request lines carry the encoded deal, the founder can read that log, and this product neither controls its retention nor promises to delete it. Confidential Mode turns both link flows off, which is the way to keep a deal out of it.
The transient exceptions are the AI requests themselves: for the seconds a parse, review, or summary is in flight, the material you sent exists in the request path (and for a staged PDF, in private blob storage that is deleted when the parse settles). Those requests are handled by the processing service under its commercial API terms, which do not use the input for training.
Two other records persist. Usage events carry an event name and three random ids this browser made for itself: one for the browser, one for the tab's session, and one for the deal being worked on, which a share link also carries so a forwarded copy is not counted as somebody else's second deal. None of the three is derived from your property, your document, your numbers, or a hash of any of them. Clearing site data severs them from anything recorded before. An event can also carry a few fixed-choice facts about the step: the deal's property type, which input was edited and whether the edit moved the verdict, how many fields a parse returned and how many it quoted, and whether the source was text, a PDF or a spreadsheet. Never a value, a name, a quote or a file.
Deleting those events is a pass the founder runs, not a background timer. The window is 90 days: a day older than that is deleted when the pass runs, and each pass writes a receipt saying what it deleted and when. Until a pass has run, the events are still there. If the store is unavailable the event is not recorded at all, and the diagnostic line left behind names the event and nothing else: no ids, in a platform log this product does not control and does not promise to delete.
A subscription record (customer id, email, plan, status) is a business record, kept for as long as the business needs it and deliberately not covered by the usage-event window above: email ali@getunderwrite.com to have it removed.
Security status
What exists and is checked by automated gates against the shipped product:
- Provider API keys are server-side only; a gate scans the built client bundle for key material and provider endpoints on every run.
- Staged documents go to private storage, single-use, deleted when the parse settles; a gate regression-tests the refusal of foreign hosts, wrong folders, path traversal, and lookalike references.
- Upload tokens are scoped to PDFs, one folder, the size ceiling, and minutes of validity.
- AI endpoints are rate limited per IP, with the enforced number published by the capability endpoint.
- Usage events are allowlisted by name and by property: the schema has no free-text field, so a document, a value or a quote cannot be recorded even by mistake. An unexpected field is refused outright rather than quietly dropped, and a gate proves both on every run.
- Checkout is Stripe's hosted page, and live checkout stays closed while any commercial fact is pending; the webhook that records a subscription verifies Stripe's signature before it reads a byte, and the ledger holds no deal data.
- Sign-in is an emailed link that works once and expires in 15 minutes. There is no password, so there is no password database to breach. Sessions are stored on the server, revocable at sign-out, in a cookie scripts cannot read.
- Where the paid line is on, Underwrite Core is checked on the server for every paid action that touches the server: reading a document, saving and opening deals, making a share link. Share links are then signed on the server, so a link to a deal cannot be made by hand.
What Underwrite does not have:
- No SOC 2 or ISO 27001 certification, and no third-party penetration test report.
- No signed data processing agreements. An institution that requires one should run sensitive deals in Confidential Mode or manually until that paperwork exists.
- No SSO, no team permissioning, no field-level audit log: single-analyst workflow today.
- No encryption-at-rest claim of Underwrite's own. Without sign-in, no deal data rests on Underwrite servers. With Underwrite Core, the deals you save to your account rest in the hosting platform's private storage, and how that storage is encrypted is the platform's to state, not this page's.
The ceilings, the rate limit, the feed rows and the limitations above are read from the running system. A trust gate refuses a build whose prose and running system disagree. It is run by hand against a candidate before a release, not by the continuous integration that runs on a push: that job checks types and lint, then asserts the canonical figures against production after the deploy.