Our Favorite Question: What’s Blocking You?

When a property is under pressure, leaders often assume they already know why something is not getting done.

A floor plan is still missing. Follow-up is inconsistent. Unit turns are behind. Reviews are not getting answered. And the natural instinct is to jump straight to a conclusion:

“The team is not moving fast enough.”

Sometimes that is true. But many times, it is not.

That is why one of our favorite leadership questions is so simple:

What’s blocking you?

It is a small question, but it does three important things at once. It helps clarify what is actually in the way. It demonstrates leadership without sounding heavy-handed. And it empowers the team to speak honestly about what they need in order to move.

Why this question works

Most underperforming properties do not have one big problem. They have several smaller ones interacting at the same time.

A leasing issue may actually be a systems issue.
A marketing issue may actually be a follow-up issue.
A turn-delay issue may actually be a staffing or priority issue.

When you ask, “What’s blocking you?” you stop guessing and start diagnosing.

Instead of forcing someone to defend themselves, you are inviting them to help identify the real bottleneck.

Prompt

Copy

# HWH Luxury Living — Listing Price Audit Prompt ## Objective Audit live rental listings for **HWH Luxury Living** across Zillow, Apartments.com, and the property website against the internal rent roll, and flag every case where an advertised price does not match the source-of-truth market rent. ## Step 0 — Get the Rent Roll (required, blocking) Before anything else, prompt the user to provide a **Rent Roll** report exported from AppFolio. Once supplied, validate it before proceeding: 1. Confirm the file contains a column literally named **Advertised Rent**. 2. Confirm the file contains a column literally named **Unit Type**. 3. If either column is missing, **stop immediately** — do not attempt to substitute another column (e.g. Tags, BD/BA), guess, or continue with a partial audit. Report back to the user exactly which required column(s) are missing and ask them to re-export the Rent Roll report from AppFolio with those columns included. 4. Only proceed to the Inputs/Process steps below once both columns are confirmed present. ## Inputs 1. **Rent roll**: The attached sheet **Master**. Relevant columns: - **Unit No.** (Column C) — match key - **Unit Type** — floor plan / unit type name, shown in the output for context only (not used for matching) - **Advertised Rent** — the market rent to compare against - **Showable** — internal flag for whether a unit is currently being marketed - **Notes** — often already explains a pricing decision (e.g. "loss leader," "revert to appfolio advertised pricing," "SF is wrong and no peninsula") — carry into the output Notes column 2. **Audit scope — two groups, reported separately (never merged):** - **Group 1 — Yellow**: rows where the Unit No. cell (Column C) has a yellow fill. This is the sheet's own "advertised" legend. - **Group 2 — Not Yellow but Showable = True**: rows where Column C is *not* yellow-filled, but Showable reads Yes/yes. A unit belongs to exactly one group — Group 1 takes precedence if a row is somehow both. 3. **Listing sources:** - Zillow: https://www.zillow.com/apartments/los-angeles-ca/hwh-luxury-living/5ZbFJZ/ - Apartments.com: https://www.apartments.com/hwh-luxury-living-los-angeles-ca/qp5npbz/ - Property website: https://www.hwhluxuryliving.com/availability (JS-rendered — wait for the listing widget to load before reading) ## Process 1. Run Step 0 (prompt for Rent Roll, validate required columns). Do not continue past this point until both required columns are confirmed present. 2. Load the rent roll and split units into Group 1 and Group 2 as defined above. 3. For each of the 3 sources, pull every currently advertised **unit-specific** listing and its price. Ignore floor-plan-level or model listings that don't name a specific unit number (e.g. a "$2,950+" floor-plan row), and ignore any listing shown as a price range rather than one number. 4. Match each source listing back to a rent-roll row **by unit number only** — no floor-plan/Unit Type fallback matching. If a listing can't be tied to one specific unit number, skip it. 5. Compare the listed base/advertised price to the market rent (Advertised Rent) for every match found, using an **exact-dollar match** — no rounding, no percentage tolerance. Ignore concessions, specials, or fee disclaimers — compare the advertised number as shown, unadjusted. 6. Compile results into two separate output tables, Group 1 then Group 2, in the format below. Give each group its own summary — do not combine totals across groups. ## Classification Rules - **Mismatch (ERROR)**: A specific unit is listed on a source with a price, and that price does not exactly equal the rent-roll's Advertised Rent. - **Not Listed (WARNING)**: The unit is in scope (in-group) but isn't found as a unit-specific listing on that source (unlisted, rented, delisted, or only shown at the floor-plan/range level). Not treated as a discrepancy. - **Match**: Listed price exactly equals the market rent. ## Formatting Rules - Any percentage figures produced or referenced in this process (e.g. **Occupancy %**, **Pre-lease %**) must be rounded to exactly **4 decimal places**. Longer decimal strings can break formatting/formulas when the output is opened in Excel. ## Output Format Two tables, one per group, each with the same columns: **Group 1 — Yellow** | Unit | Floor Plan | Advertised Rent | Zillow Price | Zillow Status | Apartments.com Price | Apartments.com Status | Website Price | Website Status | Notes | **Group 2 — Not Yellow but Showable = True** | Unit | Floor Plan | Advertised Rent | Zillow Price | Zillow Status | Apartments.com Price | Apartments.com Status | Website Price | Website Status | Notes | Status values: `Match`, `Mismatch (ERROR)`, `Not Listed (WARNING)`. Each table is followed by its own summary: - Total units audited (in that group) - Total mismatches (errors) — listed first, sorted by largest dollar variance - Total not-listed warnings — count, plus a brief list of unit numbers Close with a short **cross-group observations** section calling out any patterns worth flagging (e.g. a source lagging on recently repriced units, or a group with unusually thin listing coverage). ## Confirmed Parameters - **Market rent basis**: Advertised Rent column — not the 12-mo. rent column. - **Required Rent Roll columns**: Advertised Rent and Unit Type must both be present (exact column names). Missing either one halts the process before any audit work begins. - **Tolerance**: exact dollar match only. - **Price ranges**: skipped entirely — only unit-specific, single-price listings are compared. - **Multi-unit floor plans**: doesn't arise, since matching is by unit number only; floor-plan-only listings are skipped as unmatched rather than guessed at. - **Fees/concessions**: ignored — advertised/base rent is compared as-is. - **Percent decimal precision**: any Occupancy % or Pre-lease % figures are rounded to 4 decimal places. - **Frequency**: intended to run weekly (not yet scheduled — run manually until set up).

← Back to the AI Script Library

Ready For An Occupancy Boost?

Let’s talk through what is holding your property back and what it will take to move occupancy in the right direction.

(function () { function esc(s) { return s.replace(/&/g, '&').replace(//g, '>'); } function highlightLine(line) { if (/^\s{0,3}#{1,6}\s/.test(line)) { return '' + esc(line) + ''; } var out = esc(line); out = out.replace(/^(\s*(?:[-*+]|\d+\.)\s)/, '$1'); out = out.replace(/\*\*([^*]+?)\*\*/g, '**$1**'); out = out.replace(/(^|[^*])\*([^*\s][^*]*?)\*(?!\*)/g, '$1*$2*'); out = out.replace(/`([^`]+?)`/g, '`$1`'); out = out.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '[$1]($2)'); return out; } function fallbackCopy(text) { try { var ta = document.createElement('textarea'); ta.value = text; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.top = '-9999px'; ta.style.left = '-9999px'; document.body.appendChild(ta); ta.focus(); ta.select(); ta.setSelectionRange(0, text.length); var ok = false; try { ok = document.execCommand('copy'); } catch (err) { ok = false; } document.body.removeChild(ta); return ok; } catch (err) { return false; } } function copyText(text, onDone) { try { if (navigator.clipboard && navigator.clipboard.writeText && window.isSecureContext) { navigator.clipboard.writeText(text).then( function () { onDone(true); }, function () { onDone(fallbackCopy(text)); } ); return; } } catch (err) { /* fall through to fallback */ } onDone(fallbackCopy(text)); } function initPrompt() { var codeEl = document.querySelector('.prompt-code-block'); var raw = codeEl ? (codeEl.textContent || '') : ''; if (codeEl && raw.trim()) { try { codeEl.innerHTML = raw.split('\n').map(highlightLine).join('\n'); } catch (err) { /* leave plain text if highlighting fails */ } } var btn = document.querySelector('.prompt-copy-button'); if (btn) { btn.addEventListener('click', function (e) { e.preventDefault(); if (!raw.trim()) return; try { copyText(raw, function (success) { var original = btn.textContent; btn.textContent = success ? 'Copied!' : 'Copy failed'; btn.classList.add(success ? 'is-copied' : 'is-error'); setTimeout(function () { btn.textContent = original; btn.classList.remove('is-copied', 'is-error'); }, 1800); }); } catch (err) { if (window.console && console.error) console.error('Prompt copy failed:', err); btn.textContent = 'Copy failed'; btn.classList.add('is-error'); setTimeout(function () { btn.textContent = 'Copy'; btn.classList.remove('is-error'); }, 1800); } }); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initPrompt); } else { initPrompt(); } })();