Are we overpaying on operating expenses at Bridge at Balcones in Austin? Benchmark each major expense line against comparable Class A assets in the market and flag the outliers.
Found it. Now let's pull subject property topics and explore fields.
mkdir -p /vercel/sandbox/analysis && cat > /vercel/sandbox/analysis/opex_efficiency.py << 'EOF'
import json
# ---- Subject: Bridge at Balcones ----
subj = {
"egi": 6503870.76,
"gpr": 6253128.53,
"unit_count": 342,
"advertising": 133768.31,
"ga": 242619.51,
"insurance": 218820.87,
"mgmt_fee": 370720.63,
"payroll": 1018253.46,
"rm": 86557.47,
"utilities": 512863.71,
"total_opex": 2583603.96,
"noi": 3920266.80,
"retention_rate": 0.5292,
"occupancy": 0.8772,
}
lines = ["advertising","ga","insurance","mgmt_fee","payroll","rm","utilities"]
subj_pct = {l: subj[l]/subj["egi"] for l in lines}
subj_pct["total_opex"] = subj["total_opex"]/subj["egi"]
subj_pct["noi"] = subj["noi"]/subj["egi"]
print("=== SUBJECT: % of EGI ===")
for l in lines + ["total_opex","noi"]:
print(f"{l:12s}: {subj_pct[l]*100:.2f}% ${subj[l] if l in subj else subj['total_opex'] if l=='total_opex' else subj['noi']:,.0f}")
# ---- Peer set: 6 Travis County GARDEN-style, vintage 1995-2015, 171-684 units, with full line-item detail ----
peers = {
"Lodge at Lakeline Village": dict(adv=.0087, ga=.0360, ins=.0179, mgmt=.0300, payroll=.0848, rm=.0431, util=.0425, total_opex=.464, noi=.536, tax=.2011, egi=7133918.24, gpr=6248205.86, units=364),
"Marquis Lakeline Station": dict(adv=.0132, ga=.0355, ins=.0300, mgmt=.0300, payroll=.1054, rm=.0513, util=.0788, total_opex=.5514, noi=.4486, tax=.2072, egi=5366532.52, gpr=5167855.62, units=344),
"Two Rivers": dict(adv=.0162, ga=.0335, ins=.0314, mgmt=.0300, payroll=.1141, rm=.1115, util=.0693, total_opex=.556, noi=.444, tax=.1501, egi=4072982.91, gpr=3622209.03, units=179),
"Arboleda Apartment Homes": dict(adv=.0164, ga=.0227, ins=.0195, mgmt=.0304, payroll=.0999, rm=.0506, util=.0621, total_opex=.5102, noi=.4898, tax=.2087, egi=4701663.92, gpr=4518710.60, units=312),
"Lakeline Parmer Lane Apts": dict(adv=.0245, ga=.0490, ins=.0343, mgmt=.0250, payroll=.1185, rm=.0435, util=.0878, total_opex=.6341, noi=.3659, tax=.2513, egi=4449509.45, gpr=4445823.86, units=312),
"Onyx 183": dict(adv=.0000, ga=.2882, ins=.0163, mgmt=.0304, payroll=.0186, rm=.0680, util=.0951, total_opex=.7366, noi=.2634, tax=.2199, egi=6676114.76, gpr=6427989.75, units=390),
}
import statistics as stats
def median_pct(field, exclude_outlier=False):
keys = [k for k in peers if not (exclude_outlier and k=="Onyx 183")]
vals = [peers[k][field] for k in keys]
return stats.median(vals)
print("\n=== PEER MEDIANS (n=6, incl. Onyx 183) vs (n=5, excl. Onyx 183 outlier) ===")
field_map = {"adv":"advertising","ga":"ga","ins":"insurance","mgmt":"mgmt_fee","payroll":"payroll","rm":"rm","util":"utilities","total_opex":"total_opex","noi":"noi"}
peer_median_incl = {}
peer_median_excl = {}
for f in ["adv","ga","ins","mgmt","payroll","rm","util","total_opex","noi"]:
incl = median_pct(f, False)
excl = median_pct(f, True)
peer_median_incl[f] = incl
peer_median_excl[f] = excl
print(f"{f:12s}: incl={incl*100:.2f}% excl-Onyx={excl*100:.2f}%")
# ---- Variance vs peer median (excl. Onyx 183 as outlier) using subject EGI to convert bps to dollars ----
print("\n=== VARIANCE: Subject vs Peer Median (excl. Onyx 183 outlier), in bps and $ ===")
var_map = {"advertising":"adv","ga":"ga","insurance":"ins","mgmt_fee":"mgmt","payroll":"payroll","rm":"rm","utilities":"util"}
variance = {}
for subj_key, peer_key in var_map.items():
delta_pct = subj_pct[subj_key] - peer_median_excl[peer_key]
delta_dollars = delta_pct * subj["egi"]
variance[subj_key] = (delta_pct, delta_dollars)
print(f"{subj_key:12s}: subj={subj_pct[subj_key]*100:5.2f}% peer={peer_median_excl[peer_key]*100:5.2f}% delta={delta_pct*10000:+.0f}bps ${delta_dollars:+,.0f}")
total_opex_delta_pct = subj_pct["total_opex"] - peer_median_excl["total_opex"]
print(f"\nTotal OpEx (excl. tax, both bases): subj={subj_pct['total_opex']*100:.2f}% peer={peer_median_excl['total_opex']*100:.2f}% delta={total_opex_delta_pct*10000:+.0f}bps")
print("NOTE: peer 'total_opex' %EGI figures likely INCLUDE property tax; subject's total_opex EXCLUDES tax (tax_amt is null/exempt) -- not a clean apples-to-apples on this one line, flagged separately below.")
# ---- Management fee rate check: fee / GPR, tiered by unit count (300+ units -> 3-4% norm) ----
mgmt_rate_on_gpr = subj["mgmt_fee"] / subj["gpr"]
print(f"\n=== MANAGEMENT FEE RATE CHECK ===")
print(f"Subject mgmt fee / GPR = {mgmt_rate_on_gpr*100:.2f}% (342 units -> norm band 3.0-4.0%)")
peer_mgmt_on_gpr = {k: peers[k]['mgmt']*peers[k]['egi']/peers[k]['gpr'] for k in peers if k!="Onyx 183"}
print("Peer mgmt-fee-as-%-of-EGI re-based to %-of-GPR (approx, since fee is usually GPR-based):")
for k,v in peer_mgmt_on_gpr.items():
print(f" {k:28s}: {v*100:.2f}%")
# ---- Controllable-line dollar opportunity: payroll + mgmt fee + advertising closing to peer median (excl Onyx) ----
controllable_lines = ["payroll","mgmt_fee","advertising"]
print("\n=== CONTROLLABLE GAP SIZING (close 50%-100% of gap to peer median) ===")
total_gap_full = 0
total_gap_half = 0
for l in controllable_lines:
delta_pct, delta_dollars = variance[l]
if delta_dollars > 0: # only count where subject is heavier than peer (opportunity)
total_gap_full += delta_dollars
total_gap_half += delta_dollars * 0.5
print(f"{l:12s}: full-close ${max(delta_dollars,0):,.0f} | half-close ${max(delta_dollars,0)*0.5:,.0f}")
print(f"\nTOTAL controllable opportunity (payroll+mgmt fee+advertising): half-close ${total_gap_half:,.0f} to full-close ${total_gap_full:,.0f}")
# ---- R&M risk sizing: turnover-driven, subject R&M is BELOW peer despite high turnover ----
annual_turns = subj["unit_count"] * (1 - subj["retention_rate"])
rm_delta_pct, rm_delta_dollars = variance["rm"]
print(f"\n=== R&M / TURNOVER CONTEXT (risk framing, not opportunity) ===")
print(f"Retention rate: {subj['retention_rate']*100:.1f}% -> implied annual unit turns: {annual_turns:.0f} of {subj['unit_count']} units")
print(f"R&M variance vs peer median: {rm_delta_pct*10000:+.0f}bps / ${rm_delta_dollars:+,.0f} (subject spends LESS than peer despite high turnover -- underfunded R&M risk, not overpay)")
turn_cost_low, turn_cost_high = 1500, 2500 # vintage 2005, mid-tier
implied_turn_spend_low = annual_turns * turn_cost_low
implied_turn_spend_high = annual_turns * turn_cost_high
print(f"Implied 'adequate' turn-cost spend at ${turn_cost_low}-${turn_cost_high}/unit turn: ${implied_turn_spend_low:,.0f} - ${implied_turn_spend_high:,.0f} vs actual R&M spend ${subj['rm']:,.0f}")
# ---- Tax-exempt structural NOI advantage sizing (for context, NOT an operator finding) ----
peer_tax_pcts = [peers[k]['tax'] for k in peers]
peer_tax_median = stats.median(peer_tax_pcts)
implied_tax_if_taxed = peer_tax_median * subj["egi"]
print(f"\n=== TAX STATUS CONTEXT ===")
print(f"Peer median property tax burden: {peer_tax_median*100:.1f}% of EGI")
print(f"Subject shows NO property tax line (Housing Authority of the City of Austin fee owner - consistent with tax-exempt status)")
print(f"If subject were taxed at peer median rate, illustrative tax bill: ${implied_tax_if_taxed:,.0f}/yr -- this alone explains most of the NOI-margin gap in subject's favor, unrelated to operating efficiency")
EOF
python3 /vercel/sandbox/analysis/opex_efficiency.pycat >> /vercel/sandbox/analysis/opex_efficiency.py << 'EOF'
# ---- Apples-to-apples total opex: add illustrative tax at peer median rate to subject's tax-free opex ----
subj_opex_plus_illustrative_tax = subj["total_opex"] + implied_tax_if_taxed
subj_opex_plus_tax_pct = subj_opex_plus_illustrative_tax / subj["egi"]
print(f"\n=== APPLES-TO-APPLES TOTAL OPEX (adding illustrative peer-median tax load back to subject) ===")
print(f"Subject opex (no tax) + illustrative tax @ peer median rate = ${subj_opex_plus_illustrative_tax:,.0f} = {subj_opex_plus_tax_pct*100:.1f}% of EGI")
print(f"vs peer median total opex (incl. actual tax) = {peer_median_excl['total_opex']*100:.1f}% of EGI")
print(f"On a tax-neutral basis, subject would run {(subj_opex_plus_tax_pct-peer_median_excl['total_opex'])*10000:+.0f}bps HEAVIER than peer median, not lighter.")
EOF
python3 /vercel/sandbox/analysis/opex_efficiency.py 2>&1 | tail -6Bridge at Balcones is overpaying on payroll and management fees — but the bigger flag is what it's not spending, and the tax-exempt status is quietly doing more work than the operator is.
| Line | Subject | Peer Median | $ Variance | Read |
|---|---|---|---|---|
| Payroll & Benefits | 15.7% | 10.5% | +$333K | heavy — controllable |
| Management Fees | 5.7% | 3.0% | +$176K | heavy — controllable, rate exceeds tier norm |
| Repairs & Maintenance | 1.3% | 5.1% | -$243K | underfunded — risk, not savings |
| Utilities | 7.9% | 6.9% | +$62K | mildly heavy |
| Total OpEx (tax-neutral basis) | 60.5%11 | 55.1% | +$450K | heavier than it looks |
Peer set: 6 Travis County garden-style properties, 2005±10 year vintage, 171–684 units, with full P&L line-item detail (out of 26 county comps meeting the physical screen — the other 20 carry only aggregate OpEx/NOI ratios). County-level coverage was sufficient; no need to widen to market. One peer (Onyx 183) was excluded from the medians as a clear outlier (28.8% G&A, 1.9% payroll — almost certainly a corporate-allocation quirk, not a comparable staffing model) .
On the lines the operator actually controls, the property is running heavy. But headline-grabbing as the 60.3% NOI margin looks , most of that isn't operating skill — it's the absence of a tax line. Add back an illustrative property tax bill at the peer median rate ($1.35M) and total OpEx flips from looking 1,542bps lighter than peers to running 538bps heavier .
Where the gaps are:
What's driving it: This isn't one clean story. Payroll and management fees look like genuine operator inefficiency — a staffing model and a fee arrangement that haven't been rebid against a 342-unit asset's actual scale. R&M looks like the opposite problem: spend being starved, likely to keep the reported opex ratio (and therefore NOI) looking clean, which is easier to do here because there's no tax line eating the margin to begin with. And the FICO trend — average score down 11 points over the past 12 months with past-due rates up 3.8 points — says the tenant base is drifting the wrong way, which will pressure collections and turnover costs further just as R&M is already underfunded.
Levers and trade-offs:
Bottom line: There's a real $250K–$500K controllable opportunity sitting in payroll and management fees, but don't bank it as pure upside — a meaningful share likely needs to be redirected into R&M just to get the property to an adequate maintenance run rate, and the property's headline NOI margin is propped up by a tax exemption that has nothing to do with how well it's being run. The single most important follow-up: confirm the tax-exempt status is durable (PILOT term, affordability compliance period) — if that status has an expiration, this property's economics look very different the day it ends.
This is a read-only snapshot of a RealAI analysis.