Loan Pricer · Institutional Scale

Price entire portfolios.

Secondary marketing isn't one loan at a time — it's hundreds or thousands. Bulk Pricer takes a spreadsheet of loans, runs every one through the same Program & Pricing engines as a single scenario, and rolls the results into a dashboard and an exportable bid — all in a workspace completely isolated from your production pipeline.

Bid tapes Portfolio what-ifs Parallel batch processing Bid Summary PDF
A dedicated site of its own

Bulk Pricer is big enough to have its own home
on the web: BulkPricer.com

A full, multi-page site for institutional-scale batch pricing — the Loan Pricer engine, run across thousands of loans at once. One of the flagship product domains we own; this page is just the overview.

Explore BulkPricer.com  →

Measured on real volume

Throughput from the platform's own processing — not a projection.

<49s
to price a 250-loan batch
(random sample)
<0.2s
per loan in a batch
(thread-safe, parallel)
<2s
per loan, full-scope
interactive pricing
1000s
of loans per batch
— institutional scale
🛡
Staging isolation — the core design rule

Bulk loans live only in per-client staging tables and an in-memory cache — never the production loan schema. The engine runs in test-only mode: no loan-table writes, no logging side-effects. A 5,000-loan batch can be priced, re-priced, and discarded without touching — or risking — a single real loan in your pipeline.

From spreadsheet to bid — one pipeline

Open any stage, then walk the whole flow with Prev / Next.

Four ways to run it

From a single eligibility check to a full parallel batch.

PE Test
Run a single row through eligibility only — a quick pass/fail badge before committing a full batch.
Single Loan Pricing
Price one row end-to-end (Program + Pricing) to inspect a specific loan's result in detail.
Batch Job
Price the whole set as a tracked, parallel job — with live progress and a processing history.
Reprocess
Re-run a job against current pricing — safely cancellable, restoring the prior results if you stop it.

Built for volume, isolated by design

The architecture a technical evaluator will want to see.

Two isolated paths

The production UI writes to the 13-table loan schema. Bulk Pricer builds a loan object from each staging row and calls the engine with testOnly: true — the write step is skipped, the pipeline runs in memory, and results land in per-client staging tables and a short-lived cache.

Parallel & cancel-safe

Batches run with Parallel.ForEachAsync and a configurable degree of parallelism — thread-safe counters, a fresh executor chain per loan, pooled connections, and a rate-limited geocode fallback for missing county/census data.

Single-rate optimization

Each loan prices its note rate only — not the full rate matrix — a fraction of the work per loan. That's the optimization that makes thousands-of-loans batches feasible while reusing the exact production engines.

One bad row never kills the run

Conversion splits every batch into clean loans and error rows — a missing required field or an unmappable value is captured against its source row (loan number and borrower), reported back, and skipped, never fatal to the batch. Every result traces to its originating spreadsheet line.

Async by design — no broker to run

A large upload enqueues instantly and returns; pricing happens off the request thread on a hosted background worker, and the client polls for progress. The queue is a bounded, in-process channel that applies backpressure when full — no external message broker to deploy, secure, or operate.

One engine, not an approximation

Each staged row becomes the same loan object the single-loan form builds, priced through the exact same engines — no parallel "bulk-only" calculator to drift. A price on a 5,000-loan bid tape is the price that loan would have received one at a time.

See it run on real volume.

A guided walkthrough and the architecture detail are available in the private data room.

Request Private Access