WholesaleOS
An autonomous real-estate wholesaling platform — AI deal analysis, compliance-guarded outreach, and an executive command center.

- 7
- External APIs orchestrated
- 15+
- Background automations
- 0
- Type errors in production
Overview
WholesaleOS is a production SaaS that runs the entire real-estate wholesaling pipeline: it scores incoming leads, estimates ARV and repair costs with calibrated confidence intervals, drafts compliant outreach across SMS, email, voice, and direct mail, and surfaces only the decisions that need a human. It was architected in five independently shippable phases — Measurement, Reliability, Compliance, Automation, Autonomy — each verified with typed tests and green production builds.
The challenges
Trusting AI with money decisions
Every dollar figure the system produces — ARV, repair estimates, offer prices — feeds automated actions. A hallucinated number could send a real offer to a real seller.
Regulated outreach at scale
Cold SMS and calls fall under TCPA. Automating outreach without a compliance layer is a lawsuit, not a feature.
Third-party chaos
The platform orchestrates seven external APIs. Any of them can fail, rate-limit, or silently degrade at any moment.
The solutions
A calibrated confidence layer
Every estimate carries a confidence interval tracked against real outcomes. A gate blocks any automated action whose confidence falls below the market's calibration threshold.
Fail-closed compliance guard
No message leaves without passing consent, DNC, channel-rule, and quiet-hour checks — and the DNC cache fails closed on errors. Every decision lands in an immutable audit log.
A reliability substrate
Spend ledgers, circuit breakers, idempotency keys, response caches, and a dead-letter queue wrap every external call, so one flaky provider never cascades.
Results
- Five architecture phases shipped, each with standalone test suites and zero-error type checks
- 40+ API routes and 15 background functions running in production on Vercel + Inngest
- Owner operates the business from a single command feed instead of raw dashboards

