<link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<div id="str-calc-root">
<style>
#str-calc-root {
--ink: #1a1a18;
--ink-mid: #4a4a46;
--ink-light: #8a8a84;
--cream: #f8f6f1;
--cream-dark: #ede9e0;
--gold: #b8965a;
--gold-light: #d4b07a;
--gold-faint: #f5edd8;
--border: #ddd8cc;
--shadow-lg: 0 8px 48px rgba(26,26,24,0.12);
font-family: 'DM Sans', sans-serif;
color: #1a1a18;
background: #f8f6f1;
box-sizing: border-box;
}
#str-calc-root *, #str-calc-root *::before, #str-calc-root *::after { box-sizing: border-box; margin: 0; padding: 0; }
#str-calc-root .sc-header {
background: #1a1a18;
padding: 28px 40px 24px;
}
#str-calc-root .sc-brand {
font-family: 'DM Serif Display', serif;
font-size: 13px;
color: #d4b07a;
letter-spacing: 0.12em;
text-transform: uppercase;
margin-bottom: 4px;
}
#str-calc-root .sc-header h2 {
font-family: 'DM Serif Display', serif;
font-size: 28px;
color: #fff;
font-weight: 400;
line-height: 1.15;
margin: 0;
}
#str-calc-root .sc-header h2 em { color: #d4b07a; font-style: italic; }
#str-calc-root .sc-header-sub { font-size: 13px; color: rgba(255,255,255,0.45); margin-top: 6px; }
#str-calc-root .sc-main {
display: grid;
grid-template-columns: 1fr 380px;
max-width: 1100px;
margin: 0 auto;
padding: 36px 32px;
align-items: start;
gap: 0;
}
@media (max-width: 820px) {
#str-calc-root .sc-main { grid-template-columns: 1fr; padding: 24px 20px; }
#str-calc-root .sc-header { padding: 24px 20px 20px; }
#str-calc-root .sc-inputs { padding-right: 0 !important; margin-bottom: 32px; }
}
#str-calc-root .sc-inputs { padding-right: 36px; }
#str-calc-root .sc-section { margin-bottom: 28px; }
#str-calc-root .sc-section-title {
font-size: 10px;
font-weight: 600;
letter-spacing: 0.14em;
text-transform: uppercase;
color: #b8965a;
margin-bottom: 16px;
padding-bottom: 8px;
border-bottom: 1px solid #ddd8cc;
display: flex;
align-items: center;
gap: 8px;
}
#str-calc-root .sc-section-title::after { content: ''; flex: 1; height: 1px; background: #ddd8cc; }
#str-calc-root .sc-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
margin-bottom: 14px;
}
#str-calc-root .sc-field { display: flex; flex-direction: column; gap: 6px; }
#str-calc-root .sc-field label {
font-size: 12px;
font-weight: 500;
color: #4a4a46;
letter-spacing: 0.02em;
}
#str-calc-root .sc-wrap { position: relative; display: flex; align-items: center; }
#str-calc-root .sc-pre, #str-calc-root .sc-suf {
position: absolute;
font-size: 13px;
color: #8a8a84;
pointer-events: none;
top: 50%;
transform: translateY(-50%);
}
#str-calc-root .sc-pre { left: 12px; }
#str-calc-root .sc-suf { right: 12px; }
#str-calc-root .sc-wrap.has-pre input { padding-left: 26px; }
#str-calc-root .sc-wrap.has-suf input { padding-right: 28px; }
#str-calc-root input[type="number"],
#str-calc-root select {
width: 100%;
background: #fff;
border: 1px solid #ddd8cc;
border-radius: 6px;
padding: 10px 14px;
font-family: 'DM Sans', sans-serif;
font-size: 14px;
color: #1a1a18;
outline: none;
transition: border-color 0.15s, box-shadow 0.15s;
-moz-appearance: textfield;
appearance: textfield;
}
#str-calc-root input[type="number"]::-webkit-inner-spin-button,
#str-calc-root input[type="number"]::-webkit-outer-spin-button { -webkit-appearance: none; }
#str-calc-root input[type="number"]:focus,
#str-calc-root select:focus { border-color: #b8965a; box-shadow: 0 0 0 3px rgba(184,150,90,0.12); }
#str-calc-root .sc-slider-field { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }
#str-calc-root .sc-slider-header { display: flex; justify-content: space-between; align-items: center; }
#str-calc-root .sc-slider-val {
font-size: 14px; font-weight: 600; color: #1a1a18;
background: #f5edd8; padding: 2px 10px; border-radius: 20px; border: 1px solid #d4b07a;
}
#str-calc-root input[type="range"] {
width: 100%; height: 4px; -webkit-appearance: none; appearance: none;
background: #ede9e0; border-radius: 2px; outline: none; cursor: pointer;
}
#str-calc-root input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%;
background: #b8965a; border: 2px solid #fff; box-shadow: 0 1px 6px rgba(184,150,90,0.4);
cursor: pointer; transition: transform 0.1s;
}
#str-calc-root input[type="range"]::-webkit-slider-thumb:hover { transform: scale(1.15); }
#str-calc-root .sc-tip {
display: inline-block; width: 14px; height: 14px; background: #ede9e0;
border-radius: 50%; font-size: 9px; color: #8a8a84; text-align: center;
line-height: 14px; cursor: help; margin-left: 4px; vertical-align: middle;
font-style: normal; font-weight: 600;
}
#str-calc-root .sc-capex-display {
background: #f5edd8; border: 1px solid #d4b07a; border-radius: 6px;
padding: 10px 14px; font-size: 14px; font-weight: 600; color: #1a1a18;
}
#str-calc-root .sc-results { position: sticky; top: 24px; }
#str-calc-root .sc-card {
background: #1a1a18; border-radius: 12px; overflow: hidden;
box-shadow: 0 8px 48px rgba(26,26,24,0.12);
}
#str-calc-root .sc-card-header {
padding: 20px 24px 16px; border-bottom: 1px solid rgba(255,255,255,0.08);
}
#str-calc-root .sc-card-label {
font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase;
color: #d4b07a; font-weight: 600; margin-bottom: 4px;
}
#str-calc-root .sc-card-title {
font-family: 'DM Serif Display', serif; font-size: 18px; color: #fff; font-weight: 400;
}
#str-calc-root .sc-hero {
padding: 24px 24px 20px; border-bottom: 1px solid rgba(255,255,255,0.08);
}
#str-calc-root .sc-hero-label {
font-size: 11px; color: rgba(255,255,255,0.4); letter-spacing: 0.08em;
text-transform: uppercase; margin-bottom: 4px;
}
#str-calc-root .sc-hero-val {
font-family: 'DM Serif Display', serif; font-size: 42px; color: #fff;
line-height: 1; margin-bottom: 4px; transition: all 0.3s;
}
#str-calc-root .sc-hero-sub { font-size: 12px; color: rgba(255,255,255,0.4); }
#str-calc-root .sc-metrics {
padding: 20px 24px; display: grid; grid-template-columns: 1fr 1fr;
gap: 16px; border-bottom: 1px solid rgba(255,255,255,0.08);
}
#str-calc-root .sc-metric { display: flex; flex-direction: column; gap: 3px; }
#str-calc-root .sc-metric-label {
font-size: 10px; color: rgba(255,255,255,0.35);
letter-spacing: 0.06em; text-transform: uppercase;
}
#str-calc-root .sc-metric-val {
font-size: 22px; font-family: 'DM Serif Display', serif;
color: #fff; font-weight: 400; transition: all 0.3s;
}
#str-calc-root .sc-metric-val.good { color: #6fcf97; }
#str-calc-root .sc-metric-val.warn { color: #f2c94c; }
#str-calc-root .sc-metric-val.bad { color: #eb5757; }
#str-calc-root .sc-breakdown { padding: 20px 24px; }
#str-calc-root .sc-bd-title {
font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase;
color: rgba(255,255,255,0.35); margin-bottom: 14px;
}
#str-calc-root .sc-bd-row {
display: flex; justify-content: space-between; align-items: center;
padding: 7px 0; font-size: 13px; color: rgba(255,255,255,0.65);
border-bottom: 1px solid rgba(255,255,255,0.05);
}
#str-calc-root .sc-bd-row:last-child { border-bottom: none; }
#str-calc-root .sc-bd-row.total {
color: #fff; font-weight: 600; padding-top: 12px;
border-top: 1px solid rgba(255,255,255,0.15);
border-bottom: none; margin-top: 4px;
}
#str-calc-root .sc-bd-row.deduct { color: rgba(235,87,87,0.85); }
#str-calc-root .sc-bd-val { font-variant-numeric: tabular-nums; }
#str-calc-root .sc-verdict {
margin: 0 24px 24px; padding: 14px 16px; border-radius: 8px;
font-size: 13px; font-weight: 500; display: flex; align-items: center;
gap: 10px; transition: all 0.3s;
}
#str-calc-root .sc-verdict.good { background: rgba(45,106,79,0.3); color: #6fcf97; border: 1px solid rgba(111,207,151,0.25); }
#str-calc-root .sc-verdict.warn { background: rgba(242,201,76,0.15); color: #f2c94c; border: 1px solid rgba(242,201,76,0.25); }
#str-calc-root .sc-verdict.bad { background: rgba(235,87,87,0.15); color: #eb5757; border: 1px solid rgba(235,87,87,0.25); }
#str-calc-root .sc-verdict-icon { font-size: 18px; flex-shrink: 0; }
#str-calc-root .sc-cta {
margin: 0 24px 24px; padding: 16px;
background: rgba(184,150,90,0.12); border: 1px solid rgba(184,150,90,0.25);
border-radius: 8px; text-align: center;
}
#str-calc-root .sc-cta-text { font-size: 12px; color: rgba(255,255,255,0.5); line-height: 1.5; margin-bottom: 10px; }
#str-calc-root .sc-cta-link {
display: inline-block; padding: 9px 20px; background: #b8965a; color: #1a1a18;
border-radius: 6px; font-size: 12px; font-weight: 600; text-decoration: none;
letter-spacing: 0.04em; transition: background 0.15s, transform 0.1s;
}
#str-calc-root .sc-cta-link:hover { background: #d4b07a; transform: translateY(-1px); }
#str-calc-root .sc-disclaimer {
font-size: 11px; color: #8a8a84; margin-top: 12px; line-height: 1.5; padding: 0 2px;
}
</style>
<div class="sc-header">
<div class="sc-brand">ShortTerm.Rentals</div>
<h2>STR Proforma <em>Calculator</em></h2>
<div class="sc-header-sub">Analyze any short-term rental investment in under 2 minutes</div>
</div>
<div class="sc-main">
<div class="sc-inputs">
<div class="sc-section">
<div class="sc-section-title">Acquisition</div>
<div class="sc-row">
<div class="sc-field">
<label>Purchase Price <i class="sc-tip" title="Total purchase price of the property">?</i></label>
<div class="sc-wrap has-pre">
<span class="sc-pre">$</span>
<input type="number" id="sc_purchase_price" value="650000" min="0" step="5000" oninput="scCalc()">
</div>
</div>
<div class="sc-field">
<label>Down Payment <i class="sc-tip" title="Typical STR/DSCR loans require 20–25%">?</i></label>
<div class="sc-wrap has-suf">
<input type="number" id="sc_down_pct" value="25" min="0" max="100" step="1" oninput="scCalc()">
<span class="sc-suf">%</span>
</div>
</div>
</div>
<div class="sc-row">
<div class="sc-field">
<label>Interest Rate</label>
<div class="sc-wrap has-suf">
<input type="number" id="sc_interest_rate" value="7.25" min="0" max="20" step="0.05" oninput="scCalc()">
<span class="sc-suf">%</span>
</div>
</div>
<div class="sc-field">
<label>Loan Term</label>
<div class="sc-wrap">
<select id="sc_loan_term" onchange="scCalc()">
<option value="30">30 years</option>
<option value="20">20 years</option>
<option value="15">15 years</option>
</select>
</div>
</div>
</div>
</div>
<div class="sc-section">
<div class="sc-section-title">Revenue Assumptions</div>
<div class="sc-row">
<div class="sc-field">
<label>Avg Daily Rate (ADR) <i class="sc-tip" title="Your expected nightly rate averaged across the year">?</i></label>
<div class="sc-wrap has-pre">
<span class="sc-pre">$</span>
<input type="number" id="sc_adr" value="325" min="0" step="5" oninput="scCalc()">
</div>
</div>
<div class="sc-field">
<label>Management Fee <i class="sc-tip" title="Property manager's cut of net revenue after platform fees">?</i></label>
<div class="sc-wrap has-suf">
<input type="number" id="sc_mgmt_fee" value="20" min="0" max="50" step="1" oninput="scCalc()">
<span class="sc-suf">%</span>
</div>
</div>
</div>
<div class="sc-slider-field">
<div class="sc-slider-header">
<label>Occupancy Rate <i class="sc-tip" title="% of nights booked per year. Typical CA STR: 55–75%">?</i></label>
<span class="sc-slider-val" id="sc_occ_display">65%</span>
</div>
<input type="range" id="sc_occupancy" min="20" max="95" value="65" step="1" oninput="document.getElementById('sc_occ_display').textContent=this.value+'%'; scCalc()">
</div>
<div class="sc-slider-field">
<div class="sc-slider-header">
<label>Platform Fee (Airbnb/VRBO) <i class="sc-tip" title="Typical host-only fee: 14–16%">?</i></label>
<span class="sc-slider-val" id="sc_platform_display">15%</span>
</div>
<input type="range" id="sc_platform_fee" min="0" max="25" value="15" step="1" oninput="document.getElementById('sc_platform_display').textContent=this.value+'%'; scCalc()">
</div>
</div>
<div class="sc-section">
<div class="sc-section-title">Fixed Ownership Costs</div>
<div class="sc-row">
<div class="sc-field">
<label>Property Taxes</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_prop_tax" value="7150" min="0" step="100" oninput="scCalc()">
</div>
</div>
<div class="sc-field">
<label>Insurance</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_insurance" value="3200" min="0" step="100" oninput="scCalc()">
</div>
</div>
</div>
<div class="sc-row">
<div class="sc-field">
<label>HOA / Other Fees</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_hoa" value="0" min="0" step="100" oninput="scCalc()">
</div>
</div>
<div class="sc-field">
<label>Cable / Internet</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_cable_internet" value="1800" min="0" step="100" oninput="scCalc()">
</div>
</div>
</div>
<div class="sc-row">
<div class="sc-field">
<label>Utilities</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_utilities" value="4800" min="0" step="100" oninput="scCalc()">
</div>
</div>
<div class="sc-field">
<label>City / TOT Taxes <i class="sc-tip" title="% of gross revenue. Typically 8–15% depending on city">?</i></label>
<div class="sc-wrap has-suf">
<input type="number" id="sc_city_tax_pct" value="10" min="0" max="30" step="0.5" oninput="scCalc()">
<span class="sc-suf">%</span>
</div>
</div>
</div>
</div>
<div class="sc-section">
<div class="sc-section-title">Guest Turnover Costs</div>
<div class="sc-row">
<div class="sc-field">
<label>Cleaning Fee <i class="sc-tip" title="Total annual cleaning cost across all stays">?</i></label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_cleaning" value="5200" min="0" step="100" oninput="scCalc()">
</div>
</div>
<div class="sc-field">
<label>Supplies <i class="sc-tip" title="Toiletries, paper goods, welcome items, linen replacement">?</i></label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_supplies" value="1800" min="0" step="100" oninput="scCalc()">
</div>
</div>
</div>
<div class="sc-row">
<div class="sc-field">
<label>CapEx Reserve <i class="sc-tip" title="Capital expenditure reserve. Typical: 3% of gross bookings">?</i></label>
<div class="sc-wrap has-suf">
<input type="number" id="sc_capex_pct" value="3" min="0" max="15" step="0.5" oninput="scCalc()">
<span class="sc-suf">%</span>
</div>
</div>
<div class="sc-field" style="justify-content:flex-end;">
<label style="color:#8a8a84;font-size:11px;">Calculated annual CapEx</label>
<div class="sc-capex-display" id="sc_capex_display">$—</div>
</div>
</div>
</div>
<div class="sc-section">
<div class="sc-section-title">Property Maintenance</div>
<div class="sc-row">
<div class="sc-field">
<label>Estimated Repairs</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_maintenance" value="3600" min="0" step="100" oninput="scCalc()">
</div>
</div>
<div class="sc-field">
<label>Pool & Hot Tub Cleaning</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_pool_cleaning" value="0" min="0" step="100" oninput="scCalc()">
</div>
</div>
</div>
<div class="sc-row">
<div class="sc-field">
<label>Landscaping</label>
<div class="sc-wrap has-pre"><span class="sc-pre">$</span>
<input type="number" id="sc_landscaping" value="0" min="0" step="100" oninput="scCalc()">
</div>
</div>
<div class="sc-field"></div>
</div>
</div>
</div>
<div class="sc-results">
<div class="sc-card">
<div class="sc-card-header">
<div class="sc-card-label">Live Results</div>
<div class="sc-card-title">Annual Proforma</div>
</div>
<div class="sc-hero">
<div class="sc-hero-label">Net Operating Income (NOI)</div>
<div class="sc-hero-val" id="sc_noi">$—</div>
<div class="sc-hero-sub">Before debt service</div>
</div>
<div class="sc-metrics">
<div class="sc-metric">
<div class="sc-metric-label">Cash-on-Cash Return</div>
<div class="sc-metric-val" id="sc_coc">—</div>
</div>
<div class="sc-metric">
<div class="sc-metric-label">Cap Rate</div>
<div class="sc-metric-val" id="sc_cap_rate">—</div>
</div>
<div class="sc-metric">
<div class="sc-metric-label">Annual Cash Flow</div>
<div class="sc-metric-val" id="sc_cash_flow">—</div>
</div>
<div class="sc-metric">
<div class="sc-metric-label">Gross Revenue</div>
<div class="sc-metric-val" id="sc_gross_rev">—</div>
</div>
</div>
<div class="sc-breakdown">
<div class="sc-bd-title">Income & Expense Waterfall</div>
<div class="sc-bd-row"><span>Gross rental revenue</span><span class="sc-bd-val" id="sc_b_gross">—</span></div>
<div class="sc-bd-row deduct"><span>– Platform fees</span><span class="sc-bd-val" id="sc_b_platform">—</span></div>
<div class="sc-bd-row deduct"><span>– Management fees</span><span class="sc-bd-val" id="sc_b_mgmt">—</span></div>
<div class="sc-bd-row deduct"><span>– City / TOT taxes</span><span class="sc-bd-val" id="sc_b_city_tax">—</span></div>
<div class="sc-bd-row deduct"><span>– CapEx reserve</span><span class="sc-bd-val" id="sc_b_capex">—</span></div>
<div class="sc-bd-row deduct"><span>– Operating expenses</span><span class="sc-bd-val" id="sc_b_opex">—</span></div>
<div class="sc-bd-row total"><span>Net Operating Income</span><span class="sc-bd-val" id="sc_b_noi">—</span></div>
<div class="sc-bd-row deduct"><span>– Annual debt service</span><span class="sc-bd-val" id="sc_b_debt">—</span></div>
<div class="sc-bd-row total"><span>Annual Cash Flow</span><span class="sc-bd-val" id="sc_b_cf">—</span></div>
</div>
<div class="sc-verdict" id="sc_verdict">
<span class="sc-verdict-icon" id="sc_verdict_icon">—</span>
<span id="sc_verdict_text">Enter your numbers to see a verdict</span>
</div>
<div class="sc-cta">
<div class="sc-cta-text">Want Josh & Kailen to run a real proforma on a property you're considering?</div>
<a class="sc-cta-link" href="https://shortterm.rentals/sales" target="_blank">Book a Free Consultation →</a>
</div>
</div>
<div class="sc-disclaimer">
All projections are estimates for planning purposes only. Consult a licensed real estate professional before making investment decisions. California DRE Lic. #02238459 / #02238329.
</div>
</div>
</div>
<script>
(function() {
function fmt(n) {
if (n === null || isNaN(n)) return '—';
var abs = Math.abs(n), sign = n < 0 ? '-' : '';
return sign + '$' + Math.round(abs).toLocaleString('en-US');
}
function fmtPct(n) {
if (n === null || isNaN(n)) return '—';
return n.toFixed(2) + '%';
}
function gv(id) {
var el = document.getElementById(id);
return el ? parseFloat(el.value) || 0 : 0;
}
function setText(id, val) {
var el = document.getElementById(id);
if (el) el.textContent = val;
}
function colorMetric(id, val, good, warn) {
var el = document.getElementById(id);
if (!el) return;
el.className = 'sc-metric-val';
if (val >= good) el.classList.add('good');
else if (val >= warn) el.classList.add('warn');
else el.classList.add('bad');
}
function calcMortgage(principal, annualRate, years) {
if (annualRate === 0) return principal / (years * 12);
var r = annualRate / 100 / 12, n = years * 12;
return principal * (r * Math.pow(1+r, n)) / (Math.pow(1+r, n) - 1);
}
window.scCalc = function() {
var purchase = gv('sc_purchase_price');
var downPct = gv('sc_down_pct') / 100;
var rate = gv('sc_interest_rate');
var term = gv('sc_loan_term') || 30;
var downAmount = purchase * downPct;
var loanAmount = purchase - downAmount;
var annualDebt = calcMortgage(loanAmount, rate, term) * 12;
var adr = gv('sc_adr');
var occupancy = gv('sc_occupancy') / 100;
var platformPct = gv('sc_platform_fee') / 100;
var mgmtPct = gv('sc_mgmt_fee') / 100;
var cityTaxPct = gv('sc_city_tax_pct') / 100;
var capexPct = gv('sc_capex_pct') / 100;
var grossRevenue = adr * 365 * occupancy;
var platformFees = grossRevenue * platformPct;
var netAfterPlat = grossRevenue - platformFees;
var mgmtFees = netAfterPlat * mgmtPct;
var cityTaxes = grossRevenue * cityTaxPct;
var capexReserve = grossRevenue * capexPct;
setText('sc_capex_display', fmt(capexReserve));
var totalOpex = gv('sc_prop_tax') + gv('sc_insurance') + gv('sc_hoa')
+ gv('sc_cable_internet') + gv('sc_utilities') + gv('sc_cleaning')
+ gv('sc_supplies') + gv('sc_maintenance') + gv('sc_pool_cleaning')
+ gv('sc_landscaping');
var noi = (netAfterPlat - mgmtFees) - cityTaxes - capexReserve - totalOpex;
var cashFlow = noi - annualDebt;
var capRate = purchase > 0 ? (noi / purchase) * 100 : 0;
var coc = downAmount > 0 ? (cashFlow / downAmount) * 100 : 0;
setText('sc_noi', fmt(noi));
setText('sc_gross_rev', fmt(grossRevenue));
setText('sc_cash_flow', fmt(cashFlow));
setText('sc_cap_rate', fmtPct(capRate));
setText('sc_coc', fmtPct(coc));
setText('sc_b_gross', fmt(grossRevenue));
setText('sc_b_platform', '–' + fmt(platformFees));
setText('sc_b_mgmt', '–' + fmt(mgmtFees));
setText('sc_b_city_tax', '–' + fmt(cityTaxes));
setText('sc_b_capex', '–' + fmt(capexReserve));
setText('sc_b_opex', '–' + fmt(totalOpex));
setText('sc_b_noi', fmt(noi));
setText('sc_b_debt', '–' + fmt(annualDebt));
setText('sc_b_cf', fmt(cashFlow));
colorMetric('sc_coc', coc, 5, 3);
colorMetric('sc_cap_rate', capRate, 6, 4);
colorMetric('sc_cash_flow', cashFlow, 1, 0);
var verdict = document.getElementById('sc_verdict');
var vIcon = document.getElementById('sc_verdict_icon');
var vText = document.getElementById('sc_verdict_text');
verdict.className = 'sc-verdict';
if (cashFlow > 5000) {
verdict.classList.add('good'); vIcon.textContent = '✓';
vText.textContent = 'Strong deal. Positive cash flow with healthy returns.';
} else if (cashFlow >= 0) {
verdict.classList.add('warn'); vIcon.textContent = '~';
vText.textContent = 'Marginal cash flow. Watch expenses and occupancy closely.';
} else {
verdict.classList.add('bad'); vIcon.textContent = '!';
vText.textContent = 'Negative cash flow at these assumptions. Revisit pricing or terms.';
}
};
scCalc();
})();
</script>
</div>
Choosing an STR Manager: A Complete Guide
The short-term rental (STR) market is booming, transforming how people travel and offering property owners a lucrative alternative to traditional long-term leasing. But with great opportunity comes great responsibility. Managing a successful vacation rental involves more than just listing it online; it's a full-time job that includes marketing, guest communication, cleaning, maintenance, and navigating complex local regulations. For many owners, the key to unlocking their property's full potential lies in finding the right professional to manage it.
Choosing a short-term rental manager is one of the most critical decisions you'll make as a property owner. The right partner can maximize your income, protect your investment, and provide a stress-free experience. The wrong one can lead to inconsistent bookings, declining property conditions, and endless headaches. This guide will walk you through everything you need to know to select the best STR manager for your unique goals.
As an expert in California's dynamic short-term rental market, I'm Kailen Wilkerson, and through my work as a STR specialized realtor, I help owners and investors navigate this landscape. I've seen firsthand how a well-chosen management team can turn a good property into a great one. Let's explore how you can find that perfect fit.
⚠️ Quick Important Tax Disclaimer for STR Buyers
If you’re planning to buy a short-term rental specifically to take advantage of STR tax benefits such as depreciation or passive-loss allowances, you must understand the IRS requirements for material participation. Many investors need to meet a minimum of 100 hours of participation annually (more than any other person), and the IRS has multiple tests that determine whether you qualify. Before relying on any potential tax advantages, please read this article on material participation: (link here). Tax laws are complex and subject to change, so always consult your CPA or tax advisor.
Understanding the Role of a Short-Term Rental Manager
Before you can hire the right manager, you need to understand what they do. A short-term rental manager takes on the comprehensive, day-to-day operations of your property, transforming it from a passive asset into an active hospitality business. Their goal is to ensure a seamless experience for both you and your guests.
A great management company handles a wide array of responsibilities, including:
Property Promotion and Marketing: Creating compelling listings with professional photos, writing persuasive descriptions, and advertising your home across multiple platforms like Airbnb, Vrbo, and their own direct booking sites.
Dynamic Pricing: Using market data and seasonal trends to adjust rental rates, maximizing both occupancy and revenue.
Listing and Booking Management: Handling inquiries, screening potential guests, managing reservations, and updating calendars across all booking channels.
Guest Communication: Acting as the primary point of contact for guests before, during, and after their stay. This includes answering questions, providing check-in instructions, and being available 24/7 for emergencies.
Turnover Operations: Coordinating professional cleaning services, restocking essentials like toiletries and coffee, and ensuring the property is pristine for every new arrival.
Maintenance and Repairs: Conducting regular property inspections, managing routine upkeep, and quickly addressing any maintenance issues or emergency repairs to keep the home in top condition.
Guest Experience: Going the extra mile to create a memorable stay, from providing local recommendations to adding thoughtful touches like a welcome basket.
Review Management: Encouraging positive reviews and professionally addressing any negative feedback to maintain a strong online reputation.
Financial and Regulatory Compliance: Handling permitting, inspections, and filing occupancy taxes to ensure your property complies with all local laws.
The STR market continues to grow as travelers seek authentic, comfortable, and unique accommodations. This demand makes professional management more valuable than ever, allowing owners to capitalize on the trend without getting bogged down in the operational complexities.
Key Questions to Ask Yourself Before Hiring
Every property owner has different needs and goals. Before you start evaluating management companies, you need to define what you’re looking for. Answering these questions will create a clear framework for making your decision.
What Services Do You Truly Need?
Not all management companies offer the same services, so start by deciding what you want to hand over. Are you looking for a full-service partner to handle absolutely everything, from marketing to maintenance? Or do you only need help with specific tasks, like guest communication and cleaning? Some owners enjoy managing bookings but want someone else to handle on-the-ground logistics. Lay out the basic services you want covered to narrow down your options from the start.
What Are Your Goals and Expectations?
Define what success looks like for your property. Are you aiming to maximize your rental income above all else? Or is your priority to have a low-maintenance investment that is meticulously cared for, even if it means slightly lower returns? Perhaps you want to use the property yourself for a few weeks a year and need a manager who can accommodate a flexible owner calendar. Clearly outlining your goals will help you find a company whose priorities align with yours.
How Involved Do You Want to Be?
Consider your desired level of involvement. Do you want to be completely hands-off, receiving a monthly statement and nothing more? Or do you prefer to stay in the loop on guest communications and approve maintenance requests? Understanding how your prospective companies communicate with owners is crucial. Some use online portals to provide real-time updates on bookings and financials, while others prefer monthly email reports. Choose a manager whose communication style matches your preferences.
How to Evaluate Property Management Companies
Once you have a clear idea of your needs, you can begin the process of vetting potential managers. It's essential to look beyond the sales pitch and dig into the details of their operations. Here’s what to focus on.
Understand the Fee Structure
Property management fees can vary significantly. The two most common models are commission-based and fixed-rate.
Commission-Based: The manager charges a percentage of each booking, typically ranging from 20% to 35% of the gross rental revenue. This model incentivizes the company to maximize your income, as their earnings are directly tied to your property's performance.
Fixed-Rate: You pay a flat monthly fee for management services, regardless of how many bookings you receive. This can be appealing for its predictability but may not motivate the manager to secure as many reservations as possible.
Be cautious of a low management fee. While it might seem attractive, it could end up costing you more in the long run if it means sacrificing essential services or marketing exposure. Ask what is included in the fee and if there are any additional charges for things like marketing, maintenance coordination, special fees, or processing credit card payments.
Prioritize Local Expertise
A property manager with deep local knowledge is invaluable. They understand your market's seasonal trends, know how to price your home against the competition, and have a network of reliable local vendors for cleaning and maintenance. A local team can also respond quickly to guest emergencies and ensure your property complies with city or county-specific regulations, which are constantly changing in places like California. When you meet them, ask about other properties they manage in your area and how they perform.
Assess Company Stability and Reputation
How long has the company been in business? A stable, well-established company is often a safer bet than a new startup. Look for online reviews from both property owners and guests. Check their listings on platforms like Vrbo and Airbnb to see what past guests have to say. Don't forget to look at their social media presence and affiliations with professional organizations like the Vacation Rental Managers Association (VRMA).
Compare Services Apples to Apples
Create a checklist of services and compare what each prospective company offers. Do they handle tax filing and permit compliance? What is their marketing strategy? Do they provide professional photography and an online owner portal? A comprehensive, side-by-side comparison will reveal which company offers the most value.
Meet Your Local Point of Contact
If you're considering a larger, national company, find out who your local contact will be. This person will be your eyes and ears on the ground. They should be an expert in your market and able to answer detailed questions about their operations. A strong relationship with your local manager is key to a successful partnership.
Signs It’s Time to Switch Property Managers
If you already have a property manager but feel that things aren’t working out, you're not alone. Many owners switch providers to find a better fit. Here are some red flags that indicate it might be time for a change:
Inconsistent Bookings and Low Occupancy: Your calendar has significant gaps, even during peak season. This may signal poor marketing, uncompetitive pricing, or a failure to optimize your listing.
Unclear or Inaccurate Financial Statements: Your owner statements are confusing, late, or contain surprise invoices. A good manager provides transparent, detailed reports that clearly outline your income and expenses.
Poor Communication: Your manager is unresponsive to your calls or emails, or you’re left in the dark about what’s happening at your property.
Inadequate Maintenance: You discover that small maintenance issues are being neglected, leading to bigger problems and costly repairs down the line.
Negative Guest Reviews: A pattern of negative reviews is a major warning sign. It often points to issues with cleanliness, communication, or the overall guest experience, all of which directly impact your booking potential.
You're Still Doing Too Much Work: If you find yourself marketing the property, communicating with guests, or handling your own tax filings, your manager isn’t providing the comprehensive service you’re paying for.
Your Partner in California STR Success
Navigating the world of short-term rental management can be daunting, but the right team makes all the difference. I specialize in helping buyers and sellers thrive in California's unique STR real estate market. I understand that your property is more than just an investment; it's a significant asset that deserves expert care.
By working with us, you gain a partner who is dedicated to understanding your goals. Whether you are looking to purchase your first short-term rentals or want to ensure your current property is in the best hands, I provide the personalized service and market expertise needed to succeed.
Find the Right Team for Your Property
Choosing a short-term rental manager is a defining step in your journey as a property owner. By understanding the role of a manager, defining your own goals, and thoroughly evaluating your options, you can find a partner who will protect your investment and maximize its returns. With the right team and tools, your short-term rental can become a source of both significant income and personal pride.
If you're ready to explore short-term rental real estate opportunities in California or need guidance on taking the next step with your property, we’re here to help. Contact us today to get started.