@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap'); @import 'tailwindcss'; @import 'tw-animate-css'; @plugin "@tailwindcss/typography"; @custom-variant dark (&:is(.dark *)); @theme inline { --color-background: hsl(var(--background)); --color-foreground: hsl(var(--foreground)); --color-border: hsl(var(--border)); --color-input: hsl(var(--input)); --color-ring: hsl(var(--ring)); --color-card: hsl(var(--card)); --color-card-foreground: hsl(var(--card-foreground)); --color-card-border: hsl(var(--card-border)); --color-popover: hsl(var(--popover)); --color-popover-foreground: hsl(var(--popover-foreground)); --color-popover-border: hsl(var(--popover-border)); --color-primary: hsl(var(--primary)); --color-primary-foreground: hsl(var(--primary-foreground)); --color-secondary: hsl(var(--secondary)); --color-secondary-foreground: hsl(var(--secondary-foreground)); --color-muted: hsl(var(--muted)); --color-muted-foreground: hsl(var(--muted-foreground)); --color-accent: hsl(var(--accent)); --color-accent-foreground: hsl(var(--accent-foreground)); --color-destructive: hsl(var(--destructive)); --color-destructive-foreground: hsl(var(--destructive-foreground)); --font-sans: 'Montserrat', sans-serif; --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); } :root { --background: 0 0% 100%; --foreground: 0 0% 8%; --border: 0 0% 90%; --input: 0 0% 90%; --ring: 0 78% 46%; --card: 0 0% 100%; --card-foreground: 0 0% 8%; --card-border: 0 0% 90%; --popover: 0 0% 100%; --popover-foreground: 0 0% 8%; --popover-border: 0 0% 90%; --primary: 0 78% 46%; --primary-foreground: 0 0% 100%; --secondary: 0 0% 95%; --secondary-foreground: 0 0% 8%; --muted: 0 0% 95%; --muted-foreground: 0 0% 33%; --accent: 0 78% 46%; --accent-foreground: 0 0% 100%; --destructive: 0 78% 46%; --destructive-foreground: 0 0% 100%; --radius: 0.5rem; } .dark { --background: 0 0% 8%; --foreground: 0 0% 100%; --border: 0 0% 15%; --input: 0 0% 15%; --ring: 0 78% 46%; --card: 0 0% 10%; --card-foreground: 0 0% 100%; --card-border: 0 0% 15%; --popover: 0 0% 10%; --popover-foreground: 0 0% 100%; --popover-border: 0 0% 15%; --primary: 0 78% 46%; --primary-foreground: 0 0% 100%; --secondary: 0 0% 15%; --secondary-foreground: 0 0% 100%; --muted: 0 0% 15%; --muted-foreground: 0 0% 70%; --accent: 0 78% 46%; --accent-foreground: 0 0% 100%; --destructive: 0 78% 46%; --destructive-foreground: 0 0% 100%; } @layer base { * { @apply border-border; } body { @apply font-sans antialiased bg-background text-foreground; } } import React, { useEffect, useState, useRef } from 'react'; import { Building2, FileText, LineChart, Search, TrendingUp, Zap, Menu, X, ChevronDown, Key, BarChart3, Linkedin, } from 'lucide-react'; import teamMeeting from '@assets/team-meeting.png'; import heroImage from '@assets/hero-image_1783373605036.png'; import benefitsImage from '@assets/benefits-image_1783374248853.png'; import touroCo from '@assets/Gemini_Generated_Image_r9bd2ar9bd2ar9bd-removebg-preview_1782504887058.png'; const FORMSPREE_ENDPOINT = 'https://formspree.io/f/mrewqoeo'; const NAV_ITEMS = [ { label: 'Team', href: 'https://www.tourocompany.com/team' }, { label: 'Investments', href: 'https://www.tourocompany.com/investments', children: [ { label: 'Investments', href: 'https://www.tourocompany.com/investments' }, { label: 'Properties', href: 'https://www.tourocompany.com/properties' }, ], }, { label: 'Multifamily Services', href: '#', children: [ { label: 'Touro Property Management', href: 'https://www.tourocompany.com/touro-proprerty-management' }, { label: 'Touro Property Accounting', href: '#' }, ], }, { label: 'News + Press', href: 'https://www.tourocompany.com/news' }, ]; function DropdownItem({ item }: { item: typeof NAV_ITEMS[number] }) { const [open, setOpen] = useState(false); const ref = useRef(null); const menuId = `nav-menu-${item.label.replace(/\s+/g, '-').toLowerCase()}`; useEffect(() => { if (!item.children) return; function onMouse(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); } function onKey(e: KeyboardEvent) { if (e.key === 'Escape') setOpen(false); } document.addEventListener('mousedown', onMouse); document.addEventListener('keydown', onKey); return () => { document.removeEventListener('mousedown', onMouse); document.removeEventListener('keydown', onKey); }; }, [item.children]); if (!item.children) { return ( {item.label} ); } return (
setOpen(true)} onMouseLeave={() => setOpen(false)}>
); } type FormState = { whoAreYou: string; unitCount: string; accountingMethod: string; fullName: string; companyName: string; email: string; phone: string; }; const WHO_OPTIONS = ['Owner looking to self-manage', 'Owner looking to grow operations', 'Property management company']; const UNIT_OPTIONS = ['0–50 units', '51–100 units', '101–200 units', '201–300 units', 'More than 300 units']; const ACCOUNTING_OPTIONS = ['In-house accountant', 'General accounting firm', 'Property Management company', 'I do it myself']; function ContactModal({ onClose }: { onClose: () => void }) { const [form, setForm] = useState({ whoAreYou: '', unitCount: '', accountingMethod: '', fullName: '', companyName: '', email: '', phone: '' }); const [errors, setErrors] = useState>({}); const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle'); useEffect(() => { document.body.style.overflow = 'hidden'; const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', onKey); return () => { document.body.style.overflow = ''; document.removeEventListener('keydown', onKey); }; }, [onClose]); const set = (field: keyof FormState, value: string) => { setForm((f) => ({ ...f, [field]: value })); setErrors((e) => ({ ...e, [field]: '' })); }; const validate = (): boolean => { const newErrors: Partial = {}; if (!form.whoAreYou) newErrors.whoAreYou = 'Please select an option.'; if (!form.accountingMethod) newErrors.accountingMethod = 'Please select an option.'; if (!form.unitCount) newErrors.unitCount = 'Please select an option.'; if (!form.fullName.trim()) newErrors.fullName = 'Full name is required.'; if (!form.companyName.trim()) newErrors.companyName = 'Company name is required.'; if (!form.email.trim()) newErrors.email = 'Email is required.'; if (!form.phone.trim()) newErrors.phone = 'Phone number is required.'; setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validate()) return; setStatus('submitting'); try { const res = await fetch(FORMSPREE_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ 'Who are you?': form.whoAreYou, 'How do you manage accounting?': form.accountingMethod, 'How many units?': form.unitCount, 'Full Name': form.fullName, 'Company Name': form.companyName, 'Email': form.email, 'Phone Number': form.phone, _subject: 'New Lead from Touro Accounting Website', }), }); if (res.ok) { setStatus('success'); } else { setStatus('error'); } } catch { setStatus('error'); } }; const fieldBase = 'w-full border border-[#e5e5e5] rounded-[12px] px-4 py-[10px] text-[#141414] text-sm outline-none transition-colors focus:border-[#cf1a1a] focus:ring-1 focus:ring-[#cf1a1a] placeholder:text-[#aaa]'; const fieldErr = 'border-[#cf1a1a]'; const selectBase = 'w-full border border-[#e5e5e5] rounded-[12px] px-4 py-[10px] text-[#141414] text-sm outline-none bg-white appearance-none transition-colors focus:border-[#cf1a1a] focus:ring-1 focus:ring-[#cf1a1a] cursor-pointer'; const labelBase = 'block text-[12px] font-bold text-[#141414] mb-[6px]'; return (
e.stopPropagation()}>

Let's Talk About Accounting

Tell us about your portfolio and we'll be in touch shortly.

{status === 'success' ? (
✓

Thank you!

We'll be in touch within 24 hours.

) : (
{/* Who are you? */}
{WHO_OPTIONS.map((opt) => ( ))}
{errors.whoAreYou &&

{errors.whoAreYou}

}
{/* Accounting method */}
{errors.accountingMethod &&

{errors.accountingMethod}

}
{/* Unit count */}
{errors.unitCount &&

{errors.unitCount}

}
{/* Contact fields */}
set('fullName', e.target.value)} className="w-full px-4 py-[11px] text-[#141414] text-sm outline-none placeholder:text-[#aaa] bg-transparent focus:bg-[#fafafa] transition-colors" />
{errors.fullName &&

{errors.fullName}

}
set('companyName', e.target.value)} className="w-full px-4 py-[11px] text-[#141414] text-sm outline-none placeholder:text-[#aaa] bg-transparent focus:bg-[#fafafa] transition-colors" />
{errors.companyName &&

{errors.companyName}

}
set('email', e.target.value)} className="w-full px-4 py-[11px] text-[#141414] text-sm outline-none placeholder:text-[#aaa] bg-transparent focus:bg-[#fafafa] transition-colors" /> {errors.email &&

{errors.email}

}
set('phone', e.target.value)} className="w-full px-4 py-[11px] text-[#141414] text-sm outline-none placeholder:text-[#aaa] bg-transparent focus:bg-[#fafafa] transition-colors" /> {errors.phone &&

{errors.phone}

}
{status === 'error' && (

Something went wrong. Please try again or email us at{' '} dante@tourocompany.com

)}
)}
); } export function Home() { const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [modalOpen, setModalOpen] = useState(false); const openModal = (e: React.MouseEvent) => { e.preventDefault(); setMobileMenuOpen(false); setModalOpen(true); }; useEffect(() => { const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add('opacity-100', 'translate-y-0'); entry.target.classList.remove('opacity-0', 'translate-y-5'); } }); }, { threshold: 0.1 } ); const sections = document.querySelectorAll('.animate-on-scroll'); sections.forEach((section) => observer.observe(section)); return () => sections.forEach((section) => observer.unobserve(section)); }, []); return (
{/* NAVIGATION */} {/* HERO */}

Multifamily Accounting Created by Owners, Not Just Bookkeepers

Stop stressing over messy books and misclassified revenue. As multifamily operators, we build financials that reflect your true performance so you can scale your portfolio and protect your NOI.

Multifamily accounting dashboard
{/* COMPARISON SECTION */}

Most accounting firms don't actually understand multifamily property operations.

As owners and operators ourselves, we built Touro because we were tired of accountants who don't speak rent rolls, CapEx, or lender reporting.

Other Accounting Firms

    {["Unclear property performance that hides your numbers and leaks cash.", "Misclassified revenue and chaotic, unpredictable turn costs.", "Spending hours understanding the basics of multifamily.", "General bookkeepers without real niche knowledge.", "Always reacting, never getting ahead."].map((item, i) => (
  • ✗ {item}
  • ))}

The Touro Difference

Touro Multifamily Accounting

    {["Embraces both property operations and compliance for 100% financial clarity.", "Optimizes resources to help you save costs and grow your NOI.", "Multifamily is all we do. No learning curve, no explaining the basics.", "Speaks your language: rent rolls, turn costs, CapEx, and lender reporting.", "Stays ahead of what's next."].map((item, i) => (
  • ✓ {item}
  • ))}
{/* WHO IS THIS FOR */}

Who is Touro for?

{[ { icon: , title: "Transitioning to Self-Management", desc: "You want to take control and start managing your own properties, but you want an outsourced back office to handle all your accounting." }, { icon: , title: "Growing Owners Tired of Messy Books", desc: "You are already self-managing a growing portfolio, but you are not satisfied with your current financial picture. We will be the specialized multifamily accounting team fighting in your corner." }, { icon: , title: "Expanding Property Management Companies", desc: "You run an established management firm and your portfolio is growing fast. You need to expand your accounting team instantly with experts who speak your language from day one." }, ].map((card, i) => (
{card.icon}

{card.title}

{card.desc}

))}
{/* BENEFITS — image + text */}
Multifamily property

Accounting That Drives Your NOI, From Day One

{[ { icon: , title: "Investor-Ready Financials", desc: "Get clean, professional reports that tell the right story to your lenders and investors. No more scrambling before key meetings." }, { icon: , title: "Actionable Cost Insights", desc: "Know exactly where every property is leaking cash. Spot exactly where to cut expenses and where to push performance." }, { icon: , title: "Clarity to Move Fast", desc: "Plan your next acquisition with absolute financial peace of mind. When a deal appears, you'll have the data to pull the trigger immediately." }, ].map((b, i) => (
{b.icon}

{b.title}

{b.desc}

))}
{/* SERVICES */}

Our Services

We plug seamlessly into your business as your remote back office. No long-term commitments. Just month-to-month contracts designed to scale with your unit count at a fraction of the cost.

{[ { icon: , title: "Full Property-level Accounting", desc: "Accounts payable, transaction posting, reconciliations, tight month-end close, and others." }, { icon: , title: "Portfolio Financial Reporting", desc: "Clean, investor-ready financial statements and custom reporting for owners and operators." }, { icon: , title: "Strategic Growth Plans", desc: "Portfolio-level analysis and guidance with actionable insights to track performance across your assets so you can make decisions faster." }, { icon: , title: "Specialized Services", desc: "Expert management and tracking of lender draws, CapEx, and property payroll." }, ].map((s, i) => (
{s.icon}

{s.title}

{s.desc}

))}
{/* FAQ */}

FAQ

{[ { q: "What is multifamily property accounting?", a: "Multifamily property accounting is the specialized practice of managing financial records for residential apartment buildings and portfolios. It goes beyond standard bookkeeping to include property-level P&Ls, rent roll reconciliation, CapEx tracking, lender reporting, and NOI analysis. The metrics that actually drive acquisition and operational decisions." }, { q: "Do I really need a specialized accountant for my multifamily portfolio?", a: "Yes. Generic bookkeepers don't understand property management software or real estate tax treatments. If you manage multiple properties, a generic approach leads to misclassifications that hide your true performance." }, { q: "Can Touro handle accounting as my portfolio grows?", a: "Absolutely. Touro is built specifically for scaling owners. Our portfolio-level financials allow you to evaluate performance across all entities simultaneously, giving you the speed to acquire more assets." }, { q: "What do your services cost?", a: "Pricing matches your portfolio size and complexity. We offer flexible month-to-month contracts at a small fraction of what full-service property management companies charge. No hidden fees, no long-term traps." }, ].map((item, i) => (
))}
{/* CLOSING CTA */}

Your Properties. Our Expertise.

Stop settling for accounting that reports the past. Start working with owners who help you build the future of your portfolio.

{/* FOOTER */}
Follow us:

3500 Oak Lawn Avenue STE 460-T Dallas, TX 75219

Copyright © 2026, Touro Co.

Touro Co.
{modalOpen && setModalOpen(false)} />}
); } function FaqItem({ question, answer }: { question: string; answer: string }) { const [isOpen, setIsOpen] = useState(false); return (