Methodology
Last updated: May 12, 2026
The score in one paragraph
Every property on Scouq receives a deal score from 0 to 100. A higher score means the property clears more of the economic and motivational hurdles that define a viable investment deal: the projected profit is meaningful, the margin relative to purchase price is acceptable, the seller shows motivation signals, the rehab and title risk are manageable, and the market is liquid enough to exit. A score below 35 typically means the numbers do not pencil; a score above 55 with verified buyer demand moves the deal to "make offer" stage. The score is a prioritization filter. It is not investment advice, a valuation, an appraisal, or a guarantee of any outcome. Always verify rent, ARV, and rehab with a licensed agent or property manager before committing capital.
Score factors and weights
The final deal score is a weighted sum of five factors. Weights are read directly from
config.example.json (the canonical defaults) and applied in
src/scoring/mod.rs lines 300-308.
| Factor | Weight | Description |
|---|---|---|
profit |
+34 | Projected flip profit scaled against the minimum acceptable profit ($20,000). Drives the bulk of the score. |
margin |
+24 | Flip margin as a percentage of purchase price, scaled against the minimum acceptable margin (10%). Guards against thin-spread deals. |
motivation |
+22 | Composite seller motivation score derived from days on market (x0.22), price drop percentage, and weighted motivation signals (see signal table below). |
risk |
-16 | Negative factor. Penalizes deals with high rehab-to-ARV ratios and adverse signal flags such as major repair risk or thin spread. |
liquidity |
+16 | Market liquidity proxy. Single-family scores 12/100; non-single-family scores 8/100. Rewards asset classes with deeper buyer pools. |
The final value is clamped to [0, 100]. Each factor's raw score is also independently clamped before weighting.
Motivation signals and signal weights
Motivation signals are sourced from county records and public data feeds. Each signal
carries an independent weight. Signal contributions decay with age: a signal older than
365 days retains 35% of its weight (recency floor). Weights from
config.example.json:
| Signal | Weight | Direction | Description |
|---|---|---|---|
vacant |
13 | Positive | Property flagged as vacant in county records or USPS data. Strong motivation indicator. |
price_drop |
11 | Positive | Recorded listing price reduction. Scaled by signal_value (drop magnitude). |
probate |
12 | Positive | Property in probate or estate sale status per public court records. |
long_dom |
9 | Positive | Extended days on market (typically >90 days). Added to DOM factor in motivation composite. |
absentee_owner |
8 | Positive | Owner's mailing address differs from property address per county assessor records. |
code_violation |
7 | Positive | Open code enforcement violation per municipal data where available. |
high_equity_area |
5 | Positive | ZIP or tract with above-median owner equity, suggesting seller flexibility. |
clean_title |
4 | Positive | No recorded liens, judgments, or title clouds in public records. |
older_roof |
-4 | Negative | Permit records or assessor data indicate roof age above threshold. Increases risk score. |
major_repair_risk |
-10 | Negative | Foundation, structural, or system-level repair flag. Significant risk penalty. |
thin_spread |
-12 | Negative | Wholesale spread below the minimum acceptable threshold. Penalizes deals where wholesale exit is not viable. |
Flip and wholesale economics
Before scoring, the engine computes deal economics from these defaults (all from
config.example.json, applied in src/scoring/mod.rs lines 269-281):
- Target purchase as % of ARV: 70% (the 70% rule)
- Selling costs: 8% of ARV
- Holding costs: 3% of ARV
- Minimum projected profit threshold: $20,000
- Minimum margin threshold: 10%
- Wholesale assignment fee: $10,000
- Wholesale buyer discount (% of ARV): 78%
- Minimum spread after fee: $12,000
Strategy recommendation (flip vs. wholesale) is determined at line 310: flip wins when its projected profit exceeds the wholesale spread plus the assignment fee.
Stage thresholds
Deals are classified into action stages based on score and economics
(src/scoring/mod.rs lines 240-251):
- make_offer: score >= 55, matched buyer in target market, profit >= $20k or spread >= $12k
- underwrite: score >= 35, economics pencil
- watchlist: positive profit or spread but score below underwrite threshold
- pass: no positive economics
Data sources
- County GIS portals: parcel polygons, lot lines, assessed values, ownership records, and sold history. Currently covering 10 counties. Feeds run on a daily ingest cron.
- OpenAddresses: open-licensed address normalization dataset used to standardize mailing addresses and geocode properties to lat/lon.
- County assessor and recorder records: sold price history, deed transfers, lien recordings, and permit data where counties publish it.
- Public listings: where counties or municipalities publish listing data as open data. We do not scrape Zillow, Redfin, or any MLS feed.
- HUD and USPS vacancy data: tract-level vacancy rates used to populate the
vacantsignal. - Public foreclosure and probate notices: parsed from court system open data feeds where available.
- Optional MLS hook (future): architecture supports a licensed MLS connector; not active in current counties.
Not every deal has every data point. When a data field is absent, the corresponding signal or factor defaults to zero rather than being estimated.
Limitations
- Some county feeds run daily; data lag can reach 24 hours between a listing change and the updated score.
- We do not have national MLS access. Coverage is county-by-county and is limited to the 10 counties in the current ingest pipeline.
- Scores are advisory. Always verify rent estimates and ARV with a licensed agent or property manager before making an offer.
- We have no exterior condition data. Photos and a physical inspection are still required before any capital commitment.
- AI summaries are generated by a large language model and can contain errors. Numbers displayed in the score breakdown are computed deterministically and are authoritative; the narrative prose is not.
- ARV estimates are derived from comparable sales in county records, not from a licensed appraisal. They can be materially wrong in markets with thin comps or rapidly changing prices.
- Rehab cost estimates, where present, come from user input or rough heuristics, not from a contractor walkthrough.
Fair Housing
Scouq does not surface demographic data, school ratings that correlate with protected class demographics, neighborhood characterizations by race or ethnicity, or any other signal that functions as a proxy for a protected class under the Fair Housing Act. AI summary prompts include explicit Fair Housing guardrails instructing the model to omit any such characterizations. Signal weights are based on property and seller economics only. If you believe a score or summary contains a Fair Housing violation, contact hello@scouq.com immediately.
When scores recalculate
- Daily ingest cron: all active deals are rescored each morning when fresh county data arrives.
- Price drop trigger: a list price reduction of 2% or more triggers an immediate rescore outside the cron cycle (Q62 threshold in the ingest pipeline).
- New comps available: when a comparable sale records in the same ZIP, affected deals in that market are queued for rescore.
- AI summary refresh: AI narratives regenerate on rescore or when the user explicitly requests a refresh.
Audit trail
Every scored deal stores a score_breakdown JSON field in the
deals table containing the raw factor values, signal contributions, and
config snapshot used at scoring time. List price changes are recorded in the
price_history table with timestamps. Users on Professional and Lifetime
plans can request a per-deal explanation export by emailing
hello@scouq.com. A self-serve breakdown view is
on the roadmap.