Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/api/realestateapi/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ export async function POST(req: NextRequest) {
value_max,
estimated_equity_min,
estimated_equity_max,
equity_percent_min,
stories_min,
stories_max,
latitude,
Expand Down Expand Up @@ -227,6 +228,8 @@ export async function POST(req: NextRequest) {
value_max,
estimated_equity_min,
estimated_equity_max,
equity_percent: equity_percent_min ? parseInt(equity_percent_min) : undefined,
equity_percent_operator: equity_percent_min ? 'gte' : undefined,
stories_min,
stories_max,
ids_only: ids_only ?? false,
Expand Down
65 changes: 53 additions & 12 deletions app/discover/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,8 @@ function DiscoverPageContent() {
estimated_equity_max: '',
mortgage_min: '',
mortgage_max: '',

equity_percent_min: '',

// Distress & Special Conditions
assumable: null as boolean | null,
reo: null as boolean | null,
Expand Down Expand Up @@ -562,9 +563,12 @@ function DiscoverPageContent() {



// Load daily properties and user favorites on page load
// Load daily properties on page load (skip if restoring search)
useEffect(() => {
loadDailyProperties();
const hasSearchFromUrl = searchParams.get('hasResults') === 'true';
if (!hasSearchFromUrl) {
loadDailyProperties();
}
}, []);

// Load user favorites for favoriting functionality
Expand Down Expand Up @@ -1013,7 +1017,8 @@ function DiscoverPageContent() {
estimated_equity_max: '',
mortgage_min: '',
mortgage_max: '',

equity_percent_min: '',

// Distress & Special Conditions
assumable: null,
reo: null,
Expand Down Expand Up @@ -1376,6 +1381,7 @@ function DiscoverPageContent() {
estimated_equity_max: 'financial',
mortgage_min: 'financial',
mortgage_max: 'financial',
equity_percent_min: 'financial',
assumable: 'financial',
reo: 'distress',
pre_foreclosure: 'distress',
Expand Down Expand Up @@ -1429,6 +1435,7 @@ function DiscoverPageContent() {
estimated_equity_max: '',
mortgage_min: '',
mortgage_max: '',
equity_percent_min: '',
assumable: null,
reo: null,
pre_foreclosure: null,
Expand Down Expand Up @@ -1504,6 +1511,7 @@ function DiscoverPageContent() {
estimated_equity_max: '',
mortgage_min: '',
mortgage_max: '',
equity_percent_min: '',
assumable: null,
reo: null,
pre_foreclosure: null,
Expand Down Expand Up @@ -1561,6 +1569,7 @@ function DiscoverPageContent() {
estimated_equity_max: 'financial',
mortgage_min: 'financial',
mortgage_max: 'financial',
equity_percent_min: 'financial',
assumable: 'financial',
reo: 'distress',
pre_foreclosure: 'distress',
Expand Down Expand Up @@ -1613,6 +1622,7 @@ function DiscoverPageContent() {
estimated_equity_max: '',
mortgage_min: '',
mortgage_max: '',
equity_percent_min: '',
assumable: null,
reo: null,
pre_foreclosure: null,
Expand Down Expand Up @@ -1693,6 +1703,7 @@ function DiscoverPageContent() {
estimated_equity_max: '',
mortgage_min: '',
mortgage_max: '',
equity_percent_min: '',
assumable: null,
reo: null,
pre_foreclosure: null,
Expand Down Expand Up @@ -2345,11 +2356,26 @@ function DiscoverPageContent() {
/>
</div>
</div>


<div>
<label className="block text-xs font-medium text-gray-700 mb-2 uppercase tracking-wide">
Equity Percent (Min)
</label>
<div className="flex space-x-2">
<input
type="number"
placeholder="Min %"
value={filters.equity_percent_min || ''}
onChange={(e) => updateFilter('equity_percent_min', e.target.value)}
className="w-24 px-2 py-2 border border-gray-300 rounded-md text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
/>
</div>
</div>

<FilterGroup label="Assumable">
<ToggleButton
active={filters.assumable === null}
label="Any"
<ToggleButton
active={filters.assumable === null}
label="Any"
color="blue"
onClick={() => updateFilter('assumable', null)}
/>
Expand Down Expand Up @@ -3388,11 +3414,26 @@ function DiscoverPageContent() {
/>
</div>
</div>


<div>
<label className="block text-xs font-medium text-gray-700 mb-2 uppercase tracking-wide">
Equity Percent (Min)
</label>
<div className="flex space-x-2">
<input
type="number"
placeholder="Min %"
value={filters.equity_percent_min || ''}
onChange={(e) => updateFilter('equity_percent_min', e.target.value)}
className="w-24 px-2 py-2 border border-gray-300 rounded-md text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
/>
</div>
</div>

<FilterGroup label="Assumable">
<ToggleButton
active={filters.assumable === null}
label="Any"
<ToggleButton
active={filters.assumable === null}
label="Any"
color="blue"
onClick={() => updateFilter('assumable', null)}
/>
Expand Down
36 changes: 25 additions & 11 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -496,15 +496,29 @@ export default function Home() {
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 mb-8">
Transform Into a Full-Spectrum Investment Firm
</h2>
<div className="space-y-6 text-lg text-gray-700 leading-relaxed">
<p>
<strong>MultifamilyOS</strong> transforms individual investors into full-spectrum investment firms by providing an AI-powered team that never sleeps.
</p>
<p>
Instead of juggling fragmented tools, emails, and spreadsheets, you get one intelligent platform that scouts properties, analyzes deals, generates documents, engages owners, and helps you secure financing.
<p className="text-lg text-gray-700 leading-relaxed">
MultifamilyOS is an AI-powered investment team that never sleeps. Instead of juggling fragmented tools, emails, and spreadsheets, you get one intelligent platform that scouts properties, analyzes deals, generates documents, engages owners, and helps you secure financing. It's like having a full staff—property agent, analyst, attorney, marketer, and financing advisor—working 24/7 to scale your pipeline and close deals faster.
</p>
</div>
</div>
</div>

{/* 52-Week Master Class Section */}
<div className="bg-blue-600 py-16">
<div className="max-w-6xl mx-auto px-6">
<div className="text-center">
<h2 className="text-3xl md:text-4xl font-bold text-white mb-2">
Close Your First Multifamily Deal Faster
</h2>
<p className="text-xl text-blue-100 mb-6">
With AI, Coaching, and a Community That Funds Each Other
</p>
<div className="max-w-5xl mx-auto">
<p className="text-lg text-blue-50 leading-relaxed mb-4">
Professional members get exclusive access to the MultifamilyOS Cohort Program. Master every discipline of multifamily investing through weekly self-paced modules taught by Charles Dobens and hands-on practice using the MultifamilyOS.
</p>
<p>
It's like having a full staff—property agent, analyst, attorney, marketer, and financing advisor—working 24/7 to scale your pipeline and close deals faster.
<p className="text-lg text-blue-50 leading-relaxed">
Apply what you learn immediately to real deals in your pipeline. Join weekly group sessions to discuss challenges, share insights, and accelerate your progress alongside fellow investors. From deal analysis to asset management, build the expertise to analyze, acquire, and grow a multifamily portfolio.
</p>
</div>
</div>
Expand All @@ -523,7 +537,7 @@ export default function Home() {
</div>

<div className="max-w-4xl mx-auto mb-8">
<p className="text-xl text-gray-700 leading-relaxed">
<p className="text-lg text-gray-700 leading-relaxed">
Connect with an exclusive network of elite multifamily investors who are actively seeking investment opportunities and partnership deals. Our private member community creates a unique environment where experienced investors share deal flow, co-invest on larger acquisitions, and provide capital for promising projects.
</p>
</div>
Expand All @@ -548,7 +562,7 @@ export default function Home() {
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 mb-4">
Built-In AI Property Coach
</h2>
<p className="text-xl text-gray-600">
<p className="text-lg text-gray-600">
Get instant, expert-level insights on any multifamily investment question
</p>
</div>
Expand All @@ -564,7 +578,7 @@ export default function Home() {
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 mb-4">
Platform Capabilities
</h2>
<p className="text-xl text-gray-600">
<p className="text-lg text-gray-600">
Everything you need to find, analyze, and close multifamily deals
</p>
</div>
Expand Down
6 changes: 3 additions & 3 deletions app/pricing/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -602,11 +602,11 @@ function PricingPageContent() {
</>
)}
<p className="text-sm text-gray-700 mb-4">
Everything in Plus and more. Access to Charles Dobens Master Class Training and participation in weekly group coaching sessions.
Everything in Plus and more. Membership in the MultifamilyOS Cohort program, including direct access to Charles Dobens.
</p>
<ul className="text-sm space-y-1 text-gray-800 mb-4 flex flex-col">
<li className="flex items-start"><span className="w-2 h-2 bg-indigo-600 rounded-full mt-2 mr-3 flex-shrink-0"></span>Self-paced Master Class Training Program</li>
<li className="flex items-start"><span className="w-2 h-2 bg-indigo-600 rounded-full mt-2 mr-3 flex-shrink-0"></span>Weekly Coaching Calls with Charles Dobens</li>
<li className="flex items-start"><span className="w-2 h-2 bg-indigo-600 rounded-full mt-2 mr-3 flex-shrink-0"></span>Master Class Training Program</li>
<li className="flex items-start"><span className="w-2 h-2 bg-indigo-600 rounded-full mt-2 mr-3 flex-shrink-0"></span>Community Access and Networking</li>
</ul>
{isAnnual ? (
Expand Down Expand Up @@ -1316,7 +1316,7 @@ function PricingPageContent() {
<p className="mb-3">The Professional plan adds depth through:</p>
<ul className="list-disc pl-6 space-y-1">
<li><strong>Capital Club</strong> – Engage with a network of multifamily property investors who can help underwrite deals and participate in funding. Accelerate capital raising and enjoy the confidence of having a network of backers behind your offers.</li>
<li><strong>Master Class Training</strong> – 90+ lessons led by Charles Dobens, the Multifamily Attorney, covering markets, deal structuring, capital raising, due diligence, and scaling. With $50M+ in personal investing experience and $3B+ in client transactions, Charles brings practical, field-tested strategies to every lesson.</li>
<li><strong>Master Class Training</strong> – A comprehensive program of weekly sessions led by Charles Dobens, the Multifamily Attorney, covering markets, deal structuring, capital raising, due diligence, and scaling. With $50M+ in personal investing experience and $3B+ in client transactions, Charles brings practical, field-tested strategies to every lesson.</li>
<li><strong>Weekly Coaching</strong> – Live calls with Charles Dobens that combine deal analysis, market updates, and expert Q&A. These sessions provide direct access to one of the most respected educators in multifamily investing.</li>
<li><strong>Community Access</strong> – Direct connection to experienced peers and mentors for accountability, support, and networking opportunities.</li>
</ul>
Expand Down
4 changes: 2 additions & 2 deletions components/property/actions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ export const PropertyActions = ({ listing }: PropertyActionsProps) => {
});
};

const formatCurrency = (amount: number | undefined) => {
if (!amount) return 'N/A';
const formatCurrency = (amount: number | null | undefined) => {
if (amount === null || amount === undefined) return 'N/A';
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export const PropertyInfoSections: React.FC<PropertyInfoSectionsProps> = ({ prop

// Helper function to format currency
const formatCurrency = (value: number | null | undefined) => {
if (!value) return 'N/A';
if (value === null || value === undefined) return 'N/A';
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
Expand Down