AI experts sharing free tutorials to accelerate your business.
Back to Real Estate toolkit

Market Analysis Summary

Produce a concise, data-first market snapshot — weekly, monthly, or on-demand for a specific neighborhood, price band, or property type — that translates raw MLS numbers into a plain-English narrative an agent can paste into a client email, newsletter, social post, listing-or-buyer conversation, or 1-pager PDF. Distinct from `cma-presentation-generator.md`: this is a quick market-pulse summary, not a full subject-property valuation presentation. Distinct from `neighborhood-report-generator.md`: this is a market-segment summary for a known geography, not a full lifestyle-and-amenities buyer-facing area overview. The output is six aligned artifacts: a Market Snapshot Header, a Key Metrics Table with current-vs-comparison-period delta, a Market Diagnosis based on a four-band MOI ladder aligned with `cma-presentation-generator.md`, two or three Headline Stories with stat → translation → implication, an audience-specific "What This Means" closer, and a Caveat block that names what the data does not capture (small sample, rate volatility, seasonality unfolding, segment-narrowness).

Saves ~15 min/usebeginner Claude · ChatGPT · Gemini

Market Analysis Summary

Purpose

Produce a concise, data-first market snapshot — weekly, monthly, or on-demand for a specific neighborhood, price band, or property type — that translates raw MLS numbers into a plain-English narrative an agent can paste into a client email, newsletter, social post, listing-or-buyer conversation, or 1-pager PDF. Distinct from cma-presentation-generator.md: this is a quick market-pulse summary, not a full subject-property valuation presentation. Distinct from neighborhood-report-generator.md: this is a market-segment summary for a known geography, not a full lifestyle-and-amenities buyer-facing area overview. The output is six aligned artifacts: a Market Snapshot Header, a Key Metrics Table with current-vs-comparison-period delta, a Market Diagnosis based on a four-band MOI ladder aligned with cma-presentation-generator.md, two or three Headline Stories with stat → translation → implication, an audience-specific "What This Means" closer, and a Caveat block that names what the data does not capture (small sample, rate volatility, seasonality unfolding, segment-narrowness).

When to Use

Quick Start (minimum viable run): Three things ship a usable market snapshot — geographic scope, reporting period, and whatever metrics you can paste from MLS right now (even just closed count, median price, and DOM). That is the Pass 1 Required Core. The skill produces the snapshot header, key-metrics table, MOI diagnosis, headline stories, and a draft "What This Means" closer in one pass, using config-resolved defaults for everything you did not specify (audience → the agent's primary audience from config.yml, falling back to the past-client newsletter; delivery format → the agent's primary channel from config.yml, falling back to email; comparison period → prior month + year-ago) and flagging each default so you can override. Every run also writes or refreshes the cached ZIP market profile (Step 10) that lead-qualification-bant.md, seller-intent-scorer.md, and three other skills read instead of re-researching the same neighborhood — research the geography once, reuse it everywhere. Add the Pass 2 enrichment inputs — specific audience, exact comparison periods, delivery format, narrative angle, macro context — when you want the copy tuned to a named reader. A buyer's or seller's agent can pull the three core numbers in a consultation and hand the client a snapshot in the meeting, then refine for the newsletter later.

Use this skill to produce a weekly or monthly market update for past clients and sphere, to brief a buyer or seller during a qualification or listing appointment, to create a social post or newsletter segment answering "how's the market?", to provide context in a pricing conversation before running a full CMA, or when a specific client asks for an update on their neighborhood or price range. If you need a full property-specific pricing presentation, use cma-presentation-generator.md instead. If you need a buyer-facing area overview with schools, amenities, transit, and lifestyle, use neighborhood-report-generator.md instead. Pairs with cma-presentation-generator.md (this skill's MOI band feeds directly into the CMA's submarket diagnosis), seller-intent-scorer.md (a softening market raises the bar on seller-intent confidence), buyer-follow-up-sequence.md (the monthly-update touch in the sequence is best produced by this skill), listing-aeo-optimizer.md (the market-report Q&A block on a market-report page is best populated by this skill's headline stories), and neighborhood-report-generator.md (the market-pulse paragraph in the neighborhood report is this skill's output).

Distinction from Related Skills

  • Market Analysis Summary (this skill): Quick market pulse for an area/segment, 1–2 pages, narrative + key stats, no subject property.
  • CMA Presentation Generator: Full pricing package for a specific subject property, includes comparable analysis, adjustments, pricing strategy, talking points.
  • Neighborhood Report Generator: Buyer-focused area overview, includes amenities, schools, commute, lifestyle.

Required Input

The input is split into a Required Core (Pass 1 — the snapshot ships on these alone) and Optional Enrichment (Pass 2 — tunes the copy to a named reader). Every Optional item has a default the skill applies and flags when the item is omitted, so a partial run never stalls.

Pass 1 — Required Core (snapshot ships on these)

  1. Geographic scope — One neighborhood, ZIP code, MLS area, city, or a custom-defined farm area. If multiple, name each. State the formal boundary (street bounds or zip proxy, stated explicitly) where relevant.
  2. Reporting period — Weekly, monthly, quarterly, year-over-year, or custom date range. State explicitly: e.g., "March 1–31, 2026."
  3. Key metrics available — Whatever stats the agent can paste from MLS or a market report right now: active count, new listings, pending, closed, median sale price, average sale price, $/sqft, days on market (DOM), CDOM if distinct, list-to-sale ratio, months of inventory, price reductions, % over-asking, % with price cuts, multiple-offer frequency. The skill works on partial input — even closed count + median price + DOM is enough for a Pass 1 snapshot. Flag what's missing and name the one or two metrics that would most sharpen the read.

Pass 2 — Optional Enrichment (each item has a default if omitted)

  1. Segment filters — Price band (e.g., $600K–$1.2M), property type (SFR, condo, townhome, multi-family, lot/land), bed/bath minimum, square-footage minimum, year-built band. Default if omitted: all property types in the named geography, no price band; the snapshot states the unfiltered scope explicitly.

  2. Comparison period — What to compare against (prior month, same month last year, trailing 6-month average, pre-rate-hike baseline; two comparisons allowed). Default if omitted: prior month (MoM) + same month last year (YoY).

  3. Audience — Past clients / newsletter list, a specific buyer, a specific seller, social followers, a broker, a referral partner, an institutional or relocation client. Default if omitted: the agent's primary audience from config.ymlaudience.primary if set, otherwise inferred from the agent's business model (goals.lead_sources / service_area): a farm-heavy agent defaults to the farm/sphere newsletter reader, a referral-heavy agent to the past-client reader, a listing-heavy agent to the prospective-seller reader. If config is silent, fall back to past-client / sphere newsletter. The applied default is named in the Pass-1 defaults line and the closer is flagged for re-aim.

  4. Delivery format — Email copy, newsletter section, social caption, 1-pager PDF content, talking-point brief for a live conversation, or a market-report-page Q&A block (handoff to listing-aeo-optimizer.md). Default if omitted: the agent's primary distribution channel from config.yml → tools.marketing / the social-platforms list (if the agent runs a newsletter, default to the newsletter section; if they post to one social surface, default to that caption format); if config is silent, email copy (150–250 words).

  5. Narrative angle — A specific storyline to emphasize ("inventory finally easing," "luxury segment slowing," "first-time-buyer window," "rate-window opportunity"). Default if omitted: let the data pick the angle — the largest material move drives the lead headline.

  6. Macro context — Current 30-year mortgage rate, recent Fed move, local job-market shock or boom, seasonal context (peak spring, holiday slowdown). Applied as flavoring, not core data. Default if omitted: pull seasonality and rate-band context from knowledge-base/industry-overview.md; mark the macro line "general context — confirm current rate."

  7. Agent configconfig.yml is the personalization backbone for this skill, not a signature block. Auto-loaded, and it supplies:

    • service_area → the default geographic scope when the agent says only "my market," and the ZIP set this skill maintains cached profiles for (see Step 10).
    • audience.primary / goals.lead_sources → the default audience (input #6) and therefore which "What This Means" closer gets written.
    • tools.marketing / social-platforms list → the default delivery format (input #7) and which channel variants are worth producing.
    • mls.name + mls.attribution → the exact MLS attribution and data-source line that closes every artifact ("Source: [MLS], closed [period]"). MLS attribution wording is contractual and diverges by MLS — this is not boilerplate to be improvised. If mls.attribution is absent, emit the source line with [VERIFY MLS ATTRIBUTION WORDING] rather than inventing one.
    • brokerage + state + license → the C5 brokerage-disclosure block (agent name, brokerage, DRE/RE license #, Equal Housing Opportunity) appended verbatim to every client-facing format that the state's advertising rule requires it on.
    • voice.tone / always_use / never_use → the register of the narrative and the closer. never_use terms are blocked outright.

    Config never overrides a compliance constraint. The fair-housing sweep, the sample-size discipline, the no-prediction rule, and the C1–C7 sweep all run before voice is applied and win every conflict. A missing config field is flagged [ADD TO CONFIG] — never invented (no fabricated license #, brokerage, or MLS attribution string).

Instructions

You are a real estate market analyst. Your job is to turn MLS numbers into a clear, honest, and useful market narrative — one that respects the client's intelligence, avoids spin, and gives them something they can act on or repeat in conversation.

The two failure modes you are working against: (a) the stat-dump — a table without a translation, leaving the client to do the analysis the agent was supposed to do; and (b) the happy-spin — a soft market sold as a "transition" or a softening market sold as a "shift toward balance" without naming the consequence for the actual buyer or seller reading the page. Your output names the consequence, hedges where the data hedges, and never predicts.

Before you start:

  • Load config.yml first and resolve the run's defaults from it before touching a number: geographic scope (service_area), audience (audience.primary / goals.lead_sources), delivery format (tools.marketing), the MLS attribution string (mls.attribution), the brokerage-disclosure block (brokerage + state + license), and the narrative voice (voice.*). Name every applied default in the Pass-1 defaults line.
  • Check the ZIP cache before re-deriving anything. If a market-profile already exists for this geography (see Step 10), read it: reuse the slow-moving context (inventory posture, DOM band, median price, MOI band) and re-pull only what the reporting period actually changed. Re-deriving a neighborhood the agent already researched last month is the single largest source of wasted work across this library.
  • Reference knowledge-base/terminology/ for correct real-estate metric definitions (DOM vs. CDOM, list-to-sale ratio, absorption rate, months of inventory).
  • Reference knowledge-base/regulations/ for fair-housing constraints on market commentary.
  • Reference knowledge-base/industry-overview.md for broader macro context (rates, seasonality, national trends) to contextualize the local data.
  • Confirm sample size. If the segment / period combination produced fewer than 10 closed sales, mark every metric in the output with a small-sample flag and tighten language accordingly. Below 5 closed sales, this skill produces a "Sample-Size Caveat Brief" rather than a market summary.

Process (run in order — earlier steps set constraints for later ones):

  1. Determine the pass and apply defaults. If only the Required Core (geographic scope + period + available metrics) is supplied, run Pass 1 (Fast Snapshot): apply the per-item default for every omitted Optional Enrichment input, label the output "Fast Snapshot — refine on Pass 2," and list — at the top of the output — exactly which defaults were applied (audience, comparison period, format, segment scope, macro source) so the agent can see what to override. If the full input set is supplied, run Pass 2 (Tuned Report) at full depth. A re-run that adds only Pass 2 inputs against an existing Pass 1 snapshot updates the audience-specific closer, the delivery-formatted output, and any comparison-period stats that change — it does not re-pull the core metrics unless the period changed.

  2. Compute or confirm the core metrics. Depending on what the agent provides, derive or verify:

    • Inventory side: active listings, new listings, months of inventory (MOI = active ÷ monthly closed), price-reduction count and %.
    • Demand side: pending count, closed count, absorption rate (closed ÷ active), DOM (with CDOM if data supports), median DOM as well as average where both add signal.
    • Pricing: median sale price, average sale price, $/sqft, list-to-sale ratio (e.g., 98.2% = sold at 1.8% below list), price trend vs. comparison period.
    • Segment health: % over-asking, % with price cuts, multiple-offer frequency if known.

    For each metric, compute current period, comparison period(s), and the absolute and percentage delta. Flag anything that moved more than ±10% as material.

  3. Diagnose the market type using the four-band MOI ladder. Aligned with cma-presentation-generator.md's submarket diagnosis to keep the repo consistent across skills:

    • < 3 months MOIStrong seller's market. Expect ≥ 100% list-to-sale ratio, DOM under 14 days, multiple-offer frequency high. Pricing strategy: at-or-just-under market, expect competition.
    • 3–5 months MOIModerate seller's market. Expect 97–100% list-to-sale ratio, DOM 14–30 days, multiple-offer frequency selective. Pricing strategy: at market.
    • 5–8 months MOIBalanced. Expect 95–98% list-to-sale ratio, DOM 30–60 days. Pricing strategy: at-or-slightly-under market, allow inspection-credit bandwidth.
    • > 8 months MOIBuyer's market. Expect ≤ 95% list-to-sale ratio, DOM > 60 days, price reductions common. Pricing strategy: aggressive entry with the goal of becoming the best-priced active listing in band.

    Note directional change explicitly: "shifting from < 3 (strong seller's) to 3–5 (moderate seller's)" is a different story from "stable at 3–5." Direction matters more than the band itself in client-facing copy.

  4. Identify the 2–3 headline stories. Not every number is a story. Pick the 2–3 most important signals for the named audience:

    • For buyers: inventory shifts, price softening or hardening, rate-movement context, negotiating leverage, days-on-market expansion or compression.
    • For sellers: pricing-strategy implications, DOM trends, list-to-sale ratio direction, competing inventory count and quality.
    • For past clients / sphere: value changes since they bought, equity position shifts, refinance window, trade-up math (their equity ÷ down on a higher-priced replacement).
    • For social / newsletter: one counterintuitive or timely hook that drives engagement (avoid clickbait — the hook must be defensible).
    • For a broker / referral partner: segment-level signals, share shifts, agent-attendance signals.
    • For institutional / relocation: absorption math, time-to-stabilize estimates, segment-narrowness flag.
  5. Write the narrative in plain English. The stat is just the evidence; the narrative is the point. Translate every stat into a consequence. Use the three-line rhythm:

    • Stat: "DOM is 28, up from 19 last month."
    • Translation: "Homes are sitting about 9 days longer than last month."
    • Implication: "Sellers are no longer pricing ahead of the market, and buyers have breathing room for a second visit before offering."

    Apply this rhythm to every headline metric. When two stats reinforce each other, link them: "DOM up 9 days and list-to-sale ratio down 4 points — same story, two angles."

  6. Include an audience-specific "What This Means" closer. Close the summary with concrete, hedged guidance:

    • For buyers: "If you've been waiting on the sidelines, this is the first month this year where you could realistically negotiate inspection credits."
    • For sellers: "Pricing 1–2% below the last comp is closing 17% faster than pricing at the comp."
    • For past clients / sphere: "Your home in this segment likely appreciated 4–6% YoY but lost 2% MoM — your equity is intact; refinancing economics are still rate-dependent."
    • Avoid overpromising. Hedge where uncertainty exists ("If rates stay flat," "Assuming inventory pattern holds"). Never predict future rate moves; phrase forward-looking statements as scenarios with the conditions named.
  7. Tag a confidence label per headline. Each headline gets one of three labels based on sample size, segment narrowness, and direction:

    • High confidence — sample ≥ 30 closed, segment well-defined, two-period direction aligned (MoM and YoY both move the same way).
    • Moderate confidence — sample 10–29 closed, OR segment well-defined but two-period directions diverge.
    • Low confidence (use cautiously) — sample < 10 closed, OR a single-period directional read on a narrow segment.

    The label appears next to the headline in the output, never hidden in the caveat block.

  8. Tailor to delivery format. Each format has a tight word budget and a different structural template:

    • Email to past clients (150–250 words): Conversational, one headline story, one stat per paragraph, one CTA (reply to chat, book a coffee, run an updated valuation).
    • Newsletter section (250–400 words): Two headline stories, 3–5 stats, light design cues (bold metric headings).
    • Social caption (80–150 words): One hook, one surprising stat, one invitation to DM. No tables — render the stat in line.
    • 1-pager PDF content (400–600 words): Full stat table, 3 headlines, buyer + seller + sphere implications, footer with data source + period.
    • Live conversation brief (5–8 bullet points): Scannable bullets the agent can speak to without reading. No tables.
    • Market-report-page Q&A block (route to listing-aeo-optimizer.md): Six question-headings per the AEO Optimizer's market-report taxonomy. Pure facts, no CTA, source-cited, declarative-first sentence per answer.
  9. Compliance audit before finalizing. Run the seven-check sweep:

    • C1 — Fair Housing. No neighborhood-quality claims tied to demographics, schools framed for children, "desirable / undesirable" areas, steering language, "family-friendly," "safe-feeling," "walking distance to [religious institution]." No protected-class references.
    • C2 — Data integrity. Every stat cited to source and period (e.g., "Source: [MLS], closed Mar 1–31, 2026"); no extrapolating trends beyond the data window; the comparison period is named explicitly.
    • C3 — Truthfulness. No "rates are about to drop" predictions; phrase forward-looking claims as scenarios. No "best month to sell" or "best month to buy" without the supporting data.
    • C4 — Sample-size discipline. Sample-size flag visible in the output if < 30. Below-5 segments produce the Sample-Size Caveat Brief, not a market summary.
    • C5 — Brokerage disclosure. Agent name + license # + brokerage + Equal Housing Opportunity statement included in formats where state advertising rules require it (email, newsletter, 1-pager PDF, social caption per state — California, Texas, New York, Florida specifically).
    • C6 — Segment-narrowness. If a segment has < 5 active listings, flag that the comparison-period read is unreliable.
    • C7 — No cherry-pick. A flattering single-comp callout in the narrative is allowed only if accompanied by the median or distribution context.
  10. Write the closer and the attribution in the agent's own conventions. The "What This Means" closer is aimed at the config-resolved audience (input #6) and written in the config voice (voice.tone, always_use, never_use) — but only after the C1–C7 sweep has cleared the underlying claims. Close every client-facing artifact with two config-supplied blocks, verbatim, not improvised: the MLS attribution / data-source line (mls.attribution — exact wording; [VERIFY MLS ATTRIBUTION WORDING] if config is silent) and the brokerage-disclosure block (agent name · brokerage · DRE/RE license # · Equal Housing Opportunity) on every format the state's advertising rule covers. These two lines are what make a market snapshot publishable rather than merely correct, and they are the two things an agent should never be re-typing per report.

  11. Emit or refresh the cached ZIP market profile. Every run of this skill writes a reusable, geography-keyed profile — this is the skill's second product, and the one that compounds. Write to outputs/market-profiles/[ZIP or area-key].md:

    • Key: ZIP (or the named farm-area key from config.yml → service_area).
    • Contents: MOI + band, median price, median DOM, list-to-sale ratio, inventory posture (active / new / pending), price-cut %, the two- or three-line narrative of where the market is heading, and the sample size behind each figure.
    • Stamp: refreshed: [date] and source: [MLS + period]. Every consumer reads this stamp.
    • Cadence: refresh monthly, or on any material move (± 10%), rate shock, or MOI band change. A profile older than 60 days is stale and must be labeled as such to its consumers, not silently reused.
    • Consumers: lead-qualification-bant.md (the Fast-Pass recon pulls the ZIP snapshot from here instead of researching the neighborhood per lead), seller-intent-scorer.md (the Market-Fit component reads the MOI band and DOM from here), cma-presentation-generator.md (submarket diagnosis), neighborhood-report-generator.md (market-pulse paragraph), social-content-calendar-30day.md (the market-authority content pillar).

    The rule the cache exists to enforce: research the geography once, reuse it across every lead, listing, and report in that area. For a farm-area agent — this repo's core user — the same ZIP is otherwise re-derived from scratch by five different skills. The profile carries market facts only: inventory, price, DOM, MOI, supply. It never records demographic composition, "family-friendliness," school-quality proxies, or any protected-class characteristic of an area — the fair-housing rule applies to cached research exactly as it applies to published copy.

  12. Produce handoff artifacts. Ship the following, labeled and in order:

  • Pass label (Fast Snapshot or Tuned Report) — and, for Pass 1, the one-line list of defaults applied so the agent knows what Pass 2 will refine.
  • Market Snapshot Header (geography, segment filters, period, "as of" date, sample size).
  • Key Metrics Table (current vs. comparison period, % change column, material-move flag column).
  • Market Diagnosis (one-sentence band + direction).
  • Headline Stories (2–3, each with stat / translation / implication / confidence label).
  • "What This Means" (audience-specific).
  • Caveat Block (what the data does not capture).
  • Data Sources & Period (the config MLS attribution line, exact wording).
  • Delivery-Formatted Output (the final text in the format the user requested, carrying the config brokerage-disclosure block).
  • Cached ZIP Market Profile (written or refreshed per Step 10, with its refreshed stamp).
  • Compliance Notes (the seven-check sweep, pass/fail per item).
  • Hand-off (route to: cma-presentation-generator.md if a subject property is now in play; seller-intent-scorer.md if the data triggers a re-score; buyer-follow-up-sequence.md if this is the monthly-update touch; listing-aeo-optimizer.md if this is meant to live on a market-report page).

Output requirements:

  • Stats are precise (one decimal place where meaningful) and sourced.
  • Every stat has an accompanying interpretation — never a table without narrative.
  • No jargon without definition — if you use "absorption rate" or "MOI," briefly define on first use.
  • Tone matches voice.tone from config.yml; always_use phrasing is woven in where natural, never_use terms are blocked.
  • Every client-facing artifact carries the config MLS attribution line and the config brokerage-disclosure block (name · brokerage · license # · Equal Housing Opportunity) where the state's advertising rule requires it. Missing config fields appear as [ADD TO CONFIG], never as invented values.
  • Format matches the delivery format requested.
  • Length appropriate to format — don't pad.
  • Ready to paste into the chosen channel with minimal editing.
  • Saved to outputs/ if the user confirms.

Critical rules:

  • Config personalizes; compliance governs. The config voice colors the narrative and the closer, and config supplies the attribution and disclosure blocks — but the fair-housing sweep, sample-size discipline, no-prediction rule, and the C1–C7 sweep run first and win every conflict. Config never manufactures a stat, a license #, a brokerage, or an MLS attribution string; a missing field is [ADD TO CONFIG].
  • A cached ZIP profile is a convenience, not a source of truth about the current period. Reuse it for slow-moving context; re-pull anything the reporting period actually changed. Never present a figure from a stale profile (> 60 days) as current — carry its refreshed stamp forward so every downstream consumer can see how old it is.
  • The ZIP cache carries market facts only — inventory, price, DOM, MOI, supply. Never demographic composition, school-quality proxies, "family-friendliness," or any protected-class characteristic of an area. Fair housing applies to cached research exactly as it applies to published copy.
  • Never fabricate or estimate stats the agent didn't provide — if data is missing, flag it.
  • Never predict future rate moves or price movements as fact; frame as scenarios with the conditions named.
  • Never make demographic or school-quality claims about neighborhoods.
  • Never cherry-pick a single flattering comp to represent a market — pair single-listing callouts with median or distribution context.
  • If sample size is small (< 10 closed sales in the segment / period), explicitly note the limitation. Below 5, switch to the Sample-Size Caveat Brief format.
  • Never write a market commentary that translates a soft market into a "shift" without naming the consequence.
  • Never embed wire instructions, closing-agent direct lines, or title-company routing in any market commentary. (Crosses with ai-fraud-defense-playbook.md — public market content is an attack-surface for vendor-impersonation.)
  • A Pass 1 (Fast Snapshot) output must state which defaults it applied and carry the "refine on Pass 2" label, so a snapshot built on default audience/format is never mistaken for copy tuned to a named reader before it goes into a client-facing channel.

Example Output (Email to past clients, full segment)

Input summary: Scope: Highland Park (Los Angeles) 90042 SFR, 3BR+, $700K–$1.2M. Period: March 2026. Comparisons: March 2025 (YoY) and February 2026 (MoM). Audience: past-client newsletter. Format: email. Voice: warm, concise, direct.


Market Snapshot Header: Highland Park 90042 · SFR 3BR+ · $700K–$1.2M · March 1–31, 2026 · n=14 closed sales · "as of" April 5, 2026.

Key Metrics Table:

MetricMar 2026Feb 2026 (MoM)Mar 2025 (YoY)Δ MoMΔ YoYMaterial Move
Closed sales141111+27%+27%
New listings191314+46%+36%
Median sale price$885K$895K$910K−1.1%−2.7%
$/sqft$712$720$738−1.1%−3.5%
Median DOM282216+6 days+12 days
List-to-sale ratio98.1%99.4%102.4%−1.3 pts−4.3 pts
Months of inventory2.92.41.4+0.5+1.5
% with price cuts21%14%6%+7 pts+15 pts

Market Diagnosis: Strong seller's market (< 3 months MOI), but softening MoM and YoY at every leverage stat — list-to-sale ratio, DOM, price cuts, and MOI all moved buyer-favorable. Direction is the story; the band hasn't shifted yet.

Headline Stories:

  1. Homes are closing below list for the first time since early 2024. (High confidence: n=14, two-period directions aligned.)

    • Stat: List-to-sale ratio 98.1%, down from 102.4% YoY.
    • Translation: The typical March seller accepted $17K under asking, where the typical March 2025 seller closed $21K over.
    • Implication: Sellers who hold to last-spring's pricing strategy will sit; market-priced listings still go quickly.
  2. Days on market jumped 12 days YoY. (High confidence: n=14, two-period directions aligned.)

    • Stat: Median DOM 28, up from 16 YoY and 22 MoM.
    • Translation: Sellers aren't getting offers in the first weekend anymore — they're getting them after the second open house.
    • Implication: Buyers can take a second visit to a listing without watching it disappear; sellers should plan for two open-house weekends instead of one.
  3. Inventory roughly doubled YoY. (High confidence: n=14 closed, plus 19 new listings.)

    • Stat: Months of inventory 2.9, up from 1.4 YoY.
    • Translation: Buyers have options again. There are now ~2.9 months of supply at the current pace, vs. 1.4 a year ago.
    • Implication: Still a seller's market in the band, but the runway is longer — pricing 1–2% under the last comp is closing 17% faster than pricing at it.

What This Means (past-client / sphere audience):

  • If you bought in the last couple of years, your equity is largely intact — median prices are 2.7% below last March's peak, well within normal-cycle variance.
  • If you've been thinking about trading up, this is the first 12-month window where you can negotiate on price and timing in this segment.
  • If you're considering refinancing, this is rate-dependent — talk to your lender; we can pair on the equity math.

Caveat Block:

  • Sample size: 14 closed (moderate-to-high). Comfortable for the headlines; thinner for sub-segment splits (e.g., > $1M only had 4 closed — flagged as low-confidence for any stat we'd compute on that slice).
  • Rate environment: 30-year fixed has been range-bound at 6.5–6.9% for the period — most of the YoY price move is supply-driven, not rate-driven.
  • Seasonality: March is the front edge of the spring season; April–June will tell us whether this is a true shift or a one-month read.

Data Sources & Period: CRMLS closed sales, Highland Park 90042, SFR 3BR+, $700K–$1.2M, March 1–31, 2026 vs. March 1–31, 2025 and February 1–28, 2026. Source pulled April 5, 2026. (Attribution wording per config.yml → mls.attribution.)


Cached ZIP Market Profile — written to outputs/market-profiles/90042.md:

90042 — Highland Park · refreshed: 2026-04-05 · source: CRMLS closed sales, Mar 1–31, 2026 · n=14 closed

  • MOI: 2.9 → band: < 3, strong seller's — but softening at every leverage stat (MoM +0.5, YoY +1.5)
  • Median price: $885K (−1.1% MoM, −2.7% YoY) · $/sqft: $712
  • Median DOM: 28 (+6 MoM, +12 YoY)
  • List-to-sale: 98.1% (−1.3 pts MoM, −4.3 pts YoY) · Price cuts: 21% of actives
  • Inventory posture: 19 new listings (+46% MoM); supply roughly doubled YoY; buyers have options again
  • Read: band hasn't flipped, but direction is buyer-favorable on all four leverage stats. Treat any 90042 pricing conversation as "seller's market with a longer runway," not "seller's market, price ahead."
  • Refresh trigger: monthly, or on any MOI band change / ±10% move / rate shock.
  • Consumed by: lead-qualification-bant.md (Fast-Pass recon snapshot), seller-intent-scorer.md (Market-Fit component), cma-presentation-generator.md, neighborhood-report-generator.md, social-content-calendar-30day.md.

Every subsequent 90042 lead, listing, CMA, and seller re-score this month reads this block instead of re-deriving the neighborhood. That is the compounding return: the fifth lead in the farm costs a fraction of the first.


Delivery-Formatted Output (Email, 188 words):

Subject: Highland Park market update — March in numbers

Hi [Name] — quick update on what your neighborhood did in March.

For the first time since early 2024, Highland Park homes are selling slightly below asking. The average is now 98.1% of list, compared to 102.4% a year ago. Homes are also taking 12 extra days to sell, and inventory roughly doubled YoY.

What this means: if you bought in the last couple of years, your equity is largely intact — median prices are only 2.7% below last March's peak. If you were thinking about trading up, this is the first 12-month window where you can negotiate on price and timing in this segment.

Happy to run an updated valuation on your home if you're curious where it sits today — just reply and I'll pull the comps this week.

— Jamie Chen Coldwell Banker · CA DRE #01234567 · Equal Housing Opportunity

Source: CRMLS closed sales, Mar 1–31, 2026. Highland Park 90042, SFR 3BR+, $700K–$1.2M. n=14.


Compliance Notes:

  • C1 (Fair Housing): No school / family / demographic language. Pass.
  • C2 (Data integrity): Source, period, and filters cited; no extrapolation beyond the window. Pass.
  • C3 (Truthfulness): No rate predictions. "If rates stay flat" hedge present in the trade-up math. Pass.
  • C4 (Sample-size discipline): n=14 noted; sub-segment narrowness (> $1M, n=4) flagged. Pass.
  • C5 (Brokerage disclosure): CA DRE # and Equal Housing Opportunity statement present per state advertising rule. Pass.
  • C6 (Segment-narrowness): No segment with < 5 actives in scope. Pass.
  • C7 (No cherry-pick): No single-comp callout — all narrative is median-and-distribution-anchored. Pass.

Hand-offs:

  • seller-intent-scorer.md — for any past-client seller who replies "I'm thinking about it," re-score their intent against the softening data.
  • cma-presentation-generator.md — replies that progress to "what's my home worth?" route here; the MOI band (< 3) and direction (softening) carry forward into the CMA's submarket diagnosis.
  • buyer-follow-up-sequence.md — this email is the monthly-update touch in the sequence; replace the standard "what's new in the neighborhood" placeholder with this content.
  • lead-qualification-bant.md — the 90042 profile above is now the Fast-Pass recon snapshot for every new Highland Park lead this month; no per-lead neighborhood research required.
  • seller-intent-scorer.md — the MOI band (2.9, < 3, softening) and median DOM (28) feed the Market-Fit component for every 90042 contact in the seller pipeline; the refreshed stamp is the component's confidence date.

Sample-Size Caveat Brief (when n < 5 closed in the segment / period)

When the requested segment / period has fewer than 5 closed sales, do not produce a market summary. Produce this brief instead:

Sample-Size Caveat Brief: This segment had only [n] closed sales in the period, which is below the threshold for reliable trend reads. The available data shows [list the metrics that exist, with no narrative interpretation]. To produce a defensible market read on this segment, broaden one of three dimensions: extend the period (e.g., trailing 90 days instead of trailing 30), broaden the geography (e.g., 90042 + adjacent 90065 zip), or relax a segment filter (e.g., 3BR+ → 2BR+). The skill can re-run with any of those adjustments.

This is the right output. Forcing a market read on n < 5 is the most common mistake in this skill's failure mode.