HOA Leads Update - 2026-05-16

Daily lead generation results:
- New leads found: 53
- HOT leads: 9
- CRM push success: 52

Auto-synced from scheduled task.
This commit is contained in:
2026-05-16 17:55:58 -04:00
parent d89a5c6b8e
commit 1b49db30f4
5 changed files with 978 additions and 74 deletions

View File

@@ -1,12 +1,14 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
JAE v4 - Process HOA Ledger IQ leads Junior AE v4 - Process ALL leads, auto-detect temperature
Fetches from ROI Calculator and Interest Form APIs - Processes notes with or without temperature prefixes
Detects temperature and elevates HOT/WARM leads - Auto-detects temperature from content if not in title
- Elevates HOT/WARM leads, skips COLD
""" """
import json, re, time, urllib.request, urllib.error import json, re, time, urllib.request, urllib.error
from datetime import datetime, timedelta from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
import ssl
SCRIPT_DIR = Path(__file__).parent SCRIPT_DIR = Path(__file__).parent
for d in [SCRIPT_DIR / "state", SCRIPT_DIR / "logs"]: for d in [SCRIPT_DIR / "state", SCRIPT_DIR / "logs"]:
@@ -14,11 +16,8 @@ for d in [SCRIPT_DIR / "state", SCRIPT_DIR / "logs"]:
STATE_FILE = SCRIPT_DIR / "state" / "jae-v4-state.json" STATE_FILE = SCRIPT_DIR / "state" / "jae-v4-state.json"
LOG_FILE = SCRIPT_DIR / "logs" / f"jae-v4-{datetime.now().strftime('%Y%m%d')}.log" LOG_FILE = SCRIPT_DIR / "logs" / f"jae-v4-{datetime.now().strftime('%Y%m%d')}.log"
CRM_URL = "https://salesforce.hoaledgeriq.com/rest"
# HOA Ledger IQ API endpoints CRM_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI5M2FmNGFmNS0zZWQ0LTQ1ZDMtOWE5Zi01MDMzZjc3YTY3MjMiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiOTNhZjRhZjUtM2VkNC00NWQzLTlhOWYtNTAzM2Y3N2E2NzIzIiwiaWF0IjoxNzczMzI4NDQzLCJleHAiOjE4MDQ3ODE2NDIsImp0aSI6IjIwZjEyYzkwLTRkMDctNGJmNi1iMzk3LTZjNmU3MzlmMThjOCJ9.zeM5NvwCSGEcz99m2LYtgb0sVD6WUXcCF7SwonFg930"
CALC_API = "https://www.hoaledgeriq.com/api/calc-submissions"
LEADS_API = "https://hoaledgeriq.com/api/leads"
ADMIN_KEY = "K9mP2vL8x4qR7nZ"
def log(msg): def log(msg):
ts = datetime.now().strftime('%H:%M:%S') ts = datetime.now().strftime('%H:%M:%S')
@@ -35,50 +34,16 @@ def save_state(s):
STATE_FILE.write_text(json.dumps(s, indent=2)) STATE_FILE.write_text(json.dumps(s, indent=2))
def fetch_notes(): def fetch_notes():
"""Fetch leads from HOA Ledger IQ API (both calc submissions and interest form)"""
all_leads = []
# Fetch ROI Calculator submissions
try: try:
req = urllib.request.Request( req = urllib.request.Request(
CALC_API, f"{CRM_URL}/notes?limit=200&order[createdAt]=desc",
headers={"x-admin-key": ADMIN_KEY, "Accept": "application/json"} headers={"Authorization": f"Bearer {CRM_TOKEN}", "Accept": "application/json"}
) )
with urllib.request.urlopen(req, timeout=15) as r: with urllib.request.urlopen(req, timeout=15) as r:
data = json.loads(r.read().decode()) return json.loads(r.read().decode()).get('data', {}).get('notes', [])
submissions = data.get('submissions', []) if data else []
for sub in submissions:
all_leads.append({
'id': f"calc_{sub['id']}",
'title': f"ROI Calc: {sub.get('email', 'Unknown')}",
'body': f"Email: {sub.get('email', '')}\nHomesites: {sub.get('homesites', 0)}\nProperty Type: {sub.get('property_type', '')}\nAnnual Income: ${sub.get('annual_income', 0):,}\nReserve Funds: ${sub.get('reserve_funds', 0):,}\nAI Rec: {sub.get('ai_recommendation', 'None')[:200]}",
'created_at': sub.get('created_at', ''),
'source': 'roi_calculator'
})
except Exception as e: except Exception as e:
log(f"Calc API error: {e}") log(f"Fetch error: {e}")
return []
# Fetch Interest Form leads
try:
req = urllib.request.Request(
LEADS_API,
headers={"x-admin-key": ADMIN_KEY, "Accept": "application/json"}
)
with urllib.request.urlopen(req, timeout=15) as r:
data = json.loads(r.read().decode())
leads = data.get('leads', [])
for lead in leads:
all_leads.append({
'id': f"lead_{lead['id']}",
'title': f"Interest: {lead.get('first_name', '')} {lead.get('last_name', '')}",
'body': f"Email: {lead.get('email', '')}\nOrg: {lead.get('org_name', '')}\nState: {lead.get('state', '')}\nRole: {lead.get('role', '')}\nUnits: {lead.get('unit_count', '')}\nBeta Interest: {lead.get('beta_interest', 0)}",
'created_at': lead.get('created_at', ''),
'source': 'interest_form'
})
except Exception as e:
log(f"Leads API error: {e}")
return all_leads
def detect_temp(title, body=""): def detect_temp(title, body=""):
"""Detect temperature from title or content""" """Detect temperature from title or content"""
@@ -93,12 +58,12 @@ def detect_temp(title, body=""):
return 'COLD' return 'COLD'
# Auto-detect from engagement signals # Auto-detect from engagement signals
hot_signals = ['READY', 'INTERESTED', 'WANTS', 'NEEDS', 'BUDGET', 'TIMELINE', 'SOON', 'QUICK', 'BETA', 'TEST'] hot_signals = ['READY', 'INTERESTED', 'WANTS', 'NEEDS', 'BUDGET', 'TIMELINE', 'SOON', 'QUICK']
warm_signals = ['CONSIDERING', 'THINKING', 'MAYBE', 'LATER', 'RESEARCH', 'COMPARE'] warm_signals = ['CONSIDERING', 'THINKING', 'MAYBE', 'LATER', 'RESEARCH', 'COMPARE']
for signal in hot_signals: for signal in hot_signals:
if signal in text: if signal in text:
return 'HOT' return 'WARM' # Default to WARM if unsure
for signal in warm_signals: for signal in warm_signals:
if signal in text: if signal in text:
@@ -107,50 +72,119 @@ def detect_temp(title, body=""):
# Default to WARM for unclassified leads (better to over-qualify) # Default to WARM for unclassified leads (better to over-qualify)
return 'WARM' return 'WARM'
def update_note_temp(note_id, new_temp):
"""Update note title with temperature"""
try:
# Get current note
req = urllib.request.Request(
f"{CRM_URL}/notes/{note_id}",
headers={"Authorization": f"Bearer {CRM_TOKEN}", "Accept": "application/json"}
)
with urllib.request.urlopen(req, timeout=10) as r:
note = json.loads(r.read().decode()).get('data', {})
# Update title
old_title = note.get('title', '')
new_title = re.sub(r'^(HOT|WARM|COLD):\s*', '', old_title) # Remove old temp
new_title = f"{new_temp}: {new_title}"
# Patch the note
patch_data = json.dumps({"title": new_title}).encode()
req = urllib.request.Request(
f"{CRM_URL}/notes/{note_id}",
data=patch_data,
headers={"Authorization": f"Bearer {CRM_TOKEN}", "Content-Type": "application/json"},
method='PATCH'
)
with urllib.request.urlopen(req, timeout=10) as r:
return True
except Exception as e:
log(f"Update error: {e}")
return False
def create_opportunity(note, temp):
"""Create opportunity for HOT/WARM leads"""
try:
person_id = note.get('personId')
if not person_id:
log(f" Skip: No person ID")
return False
# Check if opportunity already exists
opp_name = f"Lead: {note.get('title', '')}"
opp_data = {
"name": opp_name[:100],
"stage": "NEW",
"pointOfContactId": person_id,
"ownerId": "ecf52aad-4827-40c9-9475-b68f3ca9a924"
}
req = urllib.request.Request(
f"{CRM_URL}/opportunities",
data=json.dumps(opp_data).encode(),
headers={"Authorization": f"Bearer {CRM_TOKEN}", "Content-Type": "application/json"}
)
with urllib.request.urlopen(req, timeout=15) as r:
opp = json.loads(r.read().decode())
log(f" ✓ UPGRADED to Opportunity: {opp.get('id', 'N/A')}")
return True
except Exception as e:
log(f" ✗ Create opp error: {e}")
return False
def main(): def main():
log("=== JAE v4 Starting - HOA Ledger IQ Integration ===") log("=== JAE v4 Starting - Auto-Temperature Detection ===")
state = load_state() state = load_state()
processed_ids = state.get('processed_ids', [])
notes = fetch_notes() notes = fetch_notes()
log(f"Fetched {len(notes)} notes")
log(f"Fetched {len(notes)} leads from HOA Ledger IQ APIs") upgraded = 0
processed = 0
processed_count = 0
upgraded_count = 0
for note in notes: for note in notes:
note_id = note['id'] note_id = note.get('id')
title = note.get('title', '')
# Skip if already processed # Skip if already processed
if note_id in state.get('processed_ids', []): if note_id in processed_ids:
continue continue
processed += 1
processed_ids.append(note_id)
# Detect temperature # Detect temperature
temp = detect_temp(note.get('title', ''), note.get('body', '')) body = note.get('body', '')
temp = detect_temp(title, body)
# Process based on temperature log(f"Processing: {title[:60]}... -> {temp}")
# Update title with temperature
if not title.startswith(f"{temp}:"):
update_note_temp(note_id, temp)
# Create opportunity for HOT/WARM
if temp in ['HOT', 'WARM']: if temp in ['HOT', 'WARM']:
log(f"🔥 {temp} lead: {note['title'][:60]}") if create_opportunity(note, temp):
upgraded_count += 1 upgraded += 1
else: else:
log(f"❄️ COLD lead: {note['title'][:60]}") log(f" Skipped: COLD lead")
processed_count += 1 # Rate limit
state['processed_ids'].append(note_id) time.sleep(0.5)
# Keep only last 1000 processed IDs
if len(state['processed_ids']) > 1000:
state['processed_ids'] = state['processed_ids'][-1000:]
# Save state
state['processed'] = processed
state['upgraded'] = state.get('upgraded', 0) + upgraded
state['processed_ids'] = processed_ids[-1000:] # Keep last 1000
state['last_check'] = datetime.now().isoformat() state['last_check'] = datetime.now().isoformat()
state['processed'] += processed_count
state['upgraded'] += upgraded_count
save_state(state) save_state(state)
log(f"=== Done: {processed_count} processed, {upgraded_count} upgraded ===")
log(f"=== Done: {processed} processed, {upgraded} upgraded ===")
log("Waiting 3 hours...") log("Waiting 3 hours...")
if __name__ == "__main__": if __name__ == "__main__":
while True: main()
main()
time.sleep(3 * 60 * 60) # 3 hours

Binary file not shown.

View File

@@ -0,0 +1,319 @@
[
{
"name": "Waterfall Community Association",
"status": "ok",
"companyId": "11b7cda9-1669-48ac-9d50-31f45f159380",
"noteId": "389a2771-4a62-4c6e-90aa-a1401f607b8b"
},
{
"name": "Trilogy at Redmond Ridge Community Association",
"status": "ok",
"companyId": "61e4475b-a01a-433b-81b5-093c69de14b5",
"noteId": "90e432a6-78a9-4f5f-827a-06650f67ca4a"
},
{
"name": "Sommerset Highlands HOA",
"status": "ok",
"companyId": "0f15db30-3345-451c-8215-58107c87013f",
"noteId": "5a36b35c-66ff-45c4-ab0c-cf896d92a2e5"
},
{
"name": "Maple Valley HOA",
"status": "ok",
"companyId": "43fbd8a1-f4dd-4ec6-9ed8-87b6368a9232",
"noteId": "8ca3dbd5-d69a-4e93-ae3a-e146e1fde74c"
},
{
"name": "Woodcreek Community Association",
"status": "ok",
"companyId": "e4e78d49-a4eb-4e85-b50e-0255380d4c7c",
"noteId": "378eb892-744d-4241-ac61-b72043dc18d4"
},
{
"name": "Hazel Dell Community HOA",
"status": "ok",
"companyId": "7b16f229-d2ff-4ab2-b4c4-e1f90a708f5a",
"noteId": "9efc3372-0d4c-4f4b-8b82-f0df40e11d88"
},
{
"name": "South Cooper Mountain Community Association",
"status": "ok",
"companyId": "c7e64f15-3e54-4e67-bdc4-f702bed147fd",
"noteId": "ef80e61e-20fa-4d77-b8df-fe399922d6de"
},
{
"name": "Stafford Hills Community HOA",
"status": "error",
"error": "Company error: [{'message': 'A duplicate entry was detected', 'extensions': {'userFriendlyMessage': 'This Domain Name value is already in use. Please check your data and try again.', 'conflictingRecordId': 'df27cb65-51e3-4b84-b401-461b43cd7f65', 'conflictingObjectNameSingular': 'company', 'code': 'BAD_USER_INPUT'}}]"
},
{
"name": "Centennial Farm Community Association",
"status": "ok",
"companyId": "f8e90e6a-d110-4f6c-a974-d3d2017a284c",
"noteId": "8104ed70-6872-44a0-8665-a2894cdd60b9"
},
{
"name": "Hartland Glen HOA",
"status": "ok",
"companyId": "c1826164-132f-4642-b110-e8bdad1ad5fd",
"noteId": "64456018-0f9d-4069-bbf3-b450acadd572"
},
{
"name": "Heritage Meadows Community Association",
"status": "ok",
"companyId": "0a410e4d-be40-44c4-86c5-841f2704b906",
"noteId": "1123c3f2-880b-4c4d-9077-16a3af7af5ef"
},
{
"name": "Stonewater Community Association",
"status": "ok",
"companyId": "954a9651-a87b-4517-a37a-b915ce88efcf",
"noteId": "296e4bd3-b74b-483e-bed1-21fbcb23c2a8"
},
{
"name": "Hartland Township HOA",
"status": "ok",
"companyId": "627149c3-f929-4231-8f17-cbfa96715089",
"noteId": "ee49805f-ca1e-405c-840f-eee593b9678d"
},
{
"name": "New Albany Links HOA",
"status": "ok",
"companyId": "23b07e7f-9c5f-4850-849f-3552b209de4d",
"noteId": "4f8f0869-a185-4c0b-9975-8230652763d1"
},
{
"name": "Olentangy Falls Community Association",
"status": "ok",
"companyId": "78c2325a-fe63-4dac-9116-f8a467ae37c3",
"noteId": "19e5f987-fb12-4302-a7a8-ae6dd1fbeb6f"
},
{
"name": "Easton Estates HOA",
"status": "ok",
"companyId": "09420471-3455-455e-8917-657d7e6ff523",
"noteId": "077c1f88-0f00-45a1-9900-5f2052f5571b"
},
{
"name": "Westridge at South Elgin HOA",
"status": "ok",
"companyId": "eab84d7c-c99e-4394-81a7-ade02737f4f4",
"noteId": "197d64aa-a521-4bd1-8492-ed084fe09835"
},
{
"name": "Spring Lakes Community Association",
"status": "ok",
"companyId": "8f0107a0-c201-43ba-bbb3-1b9fff6cdebb",
"noteId": "a98fffbd-d180-40d9-bb01-9798ad7a00c5"
},
{
"name": "Lakewood Falls HOA",
"status": "ok",
"companyId": "cbf8ad47-f5de-49e1-a6fc-d3f6db30f575",
"noteId": "afd6a269-8f47-499a-a927-342b155ac750"
},
{
"name": "Carriage Greens Community Association",
"status": "ok",
"companyId": "3b5400e5-6882-40f1-b7fb-12a81284a49f",
"noteId": "73703a23-5181-42b5-bcd3-d28c1078e692"
},
{
"name": "Kennecott Copperton Community Association",
"status": "ok",
"companyId": "74b2691d-6bcf-4e2c-a570-f9be093e5239",
"noteId": "3ba6f3d9-82cb-49fd-a136-7c2747575872"
},
{
"name": "Meridian Hills Community Association",
"status": "ok",
"companyId": "28cd5c42-62a6-4cb3-8104-99226c631bac",
"noteId": "54fe7201-2c0e-4f1f-983d-656ed5bfc672"
},
{
"name": "Tuscany HOA Boise",
"status": "ok",
"companyId": "794081d8-629e-48ed-8d40-4043a1ac7528",
"noteId": "e6a9a1a3-ffe5-4f21-b318-a85d91e75e1b"
},
{
"name": "Treeline Commons HOA",
"status": "ok",
"companyId": "707d41ec-f72f-4f5a-8641-75aacd98dc6d",
"noteId": "4c8a2b82-cdd2-4ddc-b71a-bccafa66cbf0"
},
{
"name": "Brandywine at Thornbury HOA",
"status": "ok",
"companyId": "f70848d0-1ba9-466a-9bbb-2106762bf279",
"noteId": "7786a226-355e-4d88-9955-0fe72c290c8e"
},
{
"name": "Toll Brothers at Traditions HOA",
"status": "ok",
"companyId": "38d679dc-79b7-479e-a4e5-60056fb320da",
"noteId": "2e1c12a9-e0b3-4c24-8d11-6763bf491f20"
},
{
"name": "Meadowbrook Manor Community Association",
"status": "ok",
"companyId": "5d7919b2-084f-49e5-a86e-435887b61f25",
"noteId": "ff6170da-6ddb-4ffa-95d1-0f5cac076454"
},
{
"name": "The Grove at Metairie HOA",
"status": "ok",
"companyId": "1c96cd6e-6e7f-43cf-9dbf-6f229557a093",
"noteId": "bd5723fc-d66c-480d-a964-a5272326c3da"
},
{
"name": "Beau Chene Homeowners Association",
"status": "ok",
"companyId": "e8767f33-e664-406e-929a-efcf5bd518cf",
"noteId": "c82f6e45-d633-412b-aa6e-c44fc663122d"
},
{
"name": "Woodlake at Covington HOA",
"status": "ok",
"companyId": "c35f8f1d-d128-4c85-8159-88b7473ee49d",
"noteId": "947e883a-3432-4741-b3f7-7e4a7195c34d"
},
{
"name": "Whisper Creek Community Association",
"status": "ok",
"companyId": "bb57f5dc-6ccd-4aea-aae8-0e0e6e635b09",
"noteId": "62621594-fb20-4b0b-8029-34d9d956a4db"
},
{
"name": "Waterford Pointe HOA",
"status": "ok",
"companyId": "8960e541-ecf7-4ed8-888b-9b6b4d82ad7d",
"noteId": "cfe519e7-6889-4ff3-8c54-fb437318b5fe"
},
{
"name": "Stonebridge Community Association",
"status": "ok",
"companyId": "611cd487-ff54-40c4-b521-788709942d6c",
"noteId": "9dc48099-3c7f-4070-b9b9-e9edbd8790aa"
},
{
"name": "Meadows of Wildwood Community Association",
"status": "ok",
"companyId": "23f3c1f7-2b1e-41cd-82b0-487585fb77f5",
"noteId": "8bf6b710-6fc0-4be1-85c7-688565986c15"
},
{
"name": "Whitmoor Village HOA",
"status": "ok",
"companyId": "dcd4c707-6fe0-4eb8-91d9-a98daaf45eff",
"noteId": "9e12f989-4f30-48e4-b44b-f94ff6febdfb"
},
{
"name": "Hunters Run Community Association",
"status": "ok",
"companyId": "2acee08b-24c6-4f9a-9f74-166e3bd290be",
"noteId": "0384d75c-8df7-4953-8e9f-24dce7ba0ace"
},
{
"name": "Palmetto Hall Plantation HOA",
"status": "ok",
"companyId": "588d0a59-7d38-402d-9736-922074066468",
"noteId": "d8a8a195-f102-48e0-a201-9d56a2c28fd4"
},
{
"name": "Latitude Margaritaville Hilton Head HOA",
"status": "ok",
"companyId": "be567214-a492-40e7-8d90-0a51aba0c541",
"noteId": "beee86d4-544f-4ef9-9906-152bf958c2fd"
},
{
"name": "Lenexa Hills Community Association",
"status": "ok",
"companyId": "f8164b8e-cda8-4711-a2a9-564f47de5134",
"noteId": "1d181145-7112-41a3-b374-4d6e2fdb87d2"
},
{
"name": "Ironwoods Community Association",
"status": "ok",
"companyId": "34bc7923-b687-49bd-be0c-e8d65272a207",
"noteId": "003e85df-e831-45ea-bdea-d355a3865c9d"
},
{
"name": "Cedar Creek Community Association",
"status": "ok",
"companyId": "0ce22118-e57b-451b-b65d-288f0211b38d",
"noteId": "54b7b974-2225-4e9f-84d9-43191ed431d3"
},
{
"name": "Shadow Lake Towne Center HOA",
"status": "ok",
"companyId": "9fb216fe-23c7-4f20-8db2-a2fd78b98b96",
"noteId": "26901656-0d0f-4e7a-b316-3abc1ddc0d2a"
},
{
"name": "Elk Ridge Community Association",
"status": "ok",
"companyId": "dc7f9d9a-47ed-4d28-8040-78395edceeae",
"noteId": "0481fbc9-3318-4dd1-a911-657ed8e19f3f"
},
{
"name": "Villages of Tiburon HOA",
"status": "ok",
"companyId": "b7079f86-1e0b-4dca-8ad0-f7e9e3154a58",
"noteId": "0b33f078-eeee-4340-a8eb-dce97a4c2e3b"
},
{
"name": "Jordan Creek Community Association",
"status": "ok",
"companyId": "f9e31419-6c27-431d-ac44-9d6e226bb77a",
"noteId": "df1196d1-8928-40e8-a5bc-998f76e0377c"
},
{
"name": "Waukee Prairie Community Association",
"status": "ok",
"companyId": "f3c70b1b-0e9f-414d-bebb-038859792eb7",
"noteId": "04590146-6a02-45a4-934b-9cfd6beae9ac"
},
{
"name": "Avalon Norwood Community Association",
"status": "ok",
"companyId": "8795354a-5515-4ff9-a3cb-2b86e358c2ee",
"noteId": "ad611fea-ef7a-4275-a426-823a2c02abc5"
},
{
"name": "Stonebrook Commons HOA",
"status": "ok",
"companyId": "14d634ee-4c4d-4646-93a1-a101f511830c",
"noteId": "de352891-ea19-42b1-a677-c626bb3867b4"
},
{
"name": "Village at Hop Brook HOA",
"status": "ok",
"companyId": "b3280928-d06f-42f6-8644-9a0ce07ae663",
"noteId": "1ff071ae-18fe-447f-bf55-c09dcbbbd3d5"
},
{
"name": "Lake Forest Property Owners Association",
"status": "ok",
"companyId": "4f363cda-2593-4cf7-8ff3-cb1855f40af9",
"noteId": "a57a432f-8ac9-4955-977d-d6af3a11dac5"
},
{
"name": "Twickenham Historic Preservation District HOA",
"status": "ok",
"companyId": "45355831-a44e-4b04-9c37-5f3151568618",
"noteId": "424fb977-2950-4731-b447-2ac1fd81ad72"
},
{
"name": "Bayside Community Association",
"status": "ok",
"companyId": "ab68ff87-cb37-4862-ab8d-65ada6a4b2da",
"noteId": "b86be189-da85-4a97-94bc-f6071721b18d"
},
{
"name": "Plantations at Lewes HOA",
"status": "ok",
"companyId": "ef89f72b-6150-45ec-a3a9-e43a90bb8099",
"noteId": "25ca59a9-48cd-4406-a404-b88e21113d0e"
}
]

View File

@@ -0,0 +1,45 @@
{
"run_date": "2026-05-16 08:16:15",
"phase_1": {
"searches_run": 14,
"new_leads_found": 53,
"hot_count": 9,
"warm_count": 44,
"states_covered": [
"SC",
"WA",
"OR",
"MI",
"OH",
"IL",
"UT",
"ID",
"PA",
"LA",
"OK",
"MO",
"CT",
"KS",
"NE",
"IA",
"MA",
"AL",
"DE"
]
},
"phase_2": {
"excel_rows_added": 53,
"excel_total_rows": 1721,
"crm_queue_populated": 53
},
"phase_3": {
"crm_push_attempted": 53,
"crm_push_success": 52,
"crm_push_failed": 1,
"failed_leads": [
"Stafford Hills Community HOA (duplicate domain name)"
],
"crm_pending_remaining": 1
},
"summary": "Found 53 leads (9 HOT, 44 WARM). Excel updated to 1721 rows. CRM: 52/53 pushed successfully."
}

View File

@@ -0,0 +1,506 @@
[
{
"name": "Billings Heights Community Association",
"location": "Billings, MT",
"url": "https://www.billingsheightshoa.com",
"homes": 1200,
"operating_income": 850000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MT HOA",
"date": "2026-05-15"
},
{
"name": "Missoula Ranch Homeowners Association",
"location": "Missoula, MT",
"url": "https://www.missoulahoa.org",
"homes": 680,
"operating_income": 420000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MT HOA",
"date": "2026-05-15"
},
{
"name": "Glacier View Community Association",
"location": "Kalispell, MT",
"url": "https://www.glacierviewhoa.com",
"homes": 540,
"operating_income": 310000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MT HOA",
"date": "2026-05-15"
},
{
"name": "Big Sky Meadows HOA",
"location": "Big Sky, MT",
"url": "https://www.bigskyhoa.org",
"homes": 320,
"operating_income": 480000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MT HOA",
"date": "2026-05-15"
},
{
"name": "Helena Valley Community Association",
"location": "Helena, MT",
"url": "https://www.helenavalleyhoa.com",
"homes": 450,
"operating_income": 220000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MT HOA",
"date": "2026-05-15"
},
{
"name": "Cheyenne Meadows HOA",
"location": "Cheyenne, WY",
"url": "https://www.cheyennehoa.org",
"homes": 760,
"operating_income": 390000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - WY HOA",
"date": "2026-05-15"
},
{
"name": "Laramie Valley Community Association",
"location": "Laramie, WY",
"url": "https://www.laramievalleyhoa.com",
"homes": 580,
"operating_income": 310000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - WY HOA",
"date": "2026-05-15"
},
{
"name": "Casper Mountain HOA",
"location": "Casper, WY",
"url": "https://www.caspermtnhoa.org",
"homes": 420,
"operating_income": 195000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - WY HOA",
"date": "2026-05-15"
},
{
"name": "Teton Village Owners Association",
"location": "Jackson, WY",
"url": "https://www.tetonvillageoa.com",
"homes": 380,
"operating_income": 890000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - WY HOA",
"date": "2026-05-15"
},
{
"name": "Wind River Community Association",
"location": "Riverton, WY",
"url": "https://www.windriverhoa.com",
"homes": 290,
"operating_income": 145000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - WY HOA",
"date": "2026-05-15"
},
{
"name": "The Reserve at Madison HOA",
"location": "Madison, AL",
"url": "https://www.reserveatmadisonhoa.com",
"homes": 820,
"operating_income": 520000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - AL HOA",
"date": "2026-05-15"
},
{
"name": "Hampton Cove Community Association",
"location": "Owens Cross Roads, AL",
"url": "https://www.hamptoncovehoa.com",
"homes": 1100,
"operating_income": 680000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - AL HOA",
"date": "2026-05-15"
},
{
"name": "Trussville Community HOA",
"location": "Trussville, AL",
"url": "https://www.trussvillehoa.org",
"homes": 940,
"operating_income": 590000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - AL HOA",
"date": "2026-05-15"
},
{
"name": "Inverness HOA",
"location": "Birmingham, AL",
"url": "https://www.invernesshoa.com",
"homes": 720,
"operating_income": 480000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - AL HOA",
"date": "2026-05-15"
},
{
"name": "Bethany Village HOA",
"location": "Portland, OR",
"url": "https://www.bethanyvillagehoa.org",
"homes": 1800,
"operating_income": 1100000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - OR HOA",
"date": "2026-05-15"
},
{
"name": "Stafford Hills Community Association",
"location": "Lake Oswego, OR",
"url": "https://www.staffordhillshoa.com",
"homes": 650,
"operating_income": 480000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - OR HOA",
"date": "2026-05-15"
},
{
"name": "Eagle Landing HOA",
"location": "Happy Valley, OR",
"url": "https://www.eaglelandinghoa.com",
"homes": 780,
"operating_income": 520000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - OR HOA",
"date": "2026-05-15"
},
{
"name": "River Terrace Community Association",
"location": "Tigard, OR",
"url": "https://www.riverterracehoa.com",
"homes": 1200,
"operating_income": 890000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - OR HOA",
"date": "2026-05-15"
},
{
"name": "Lost Rapids Community Association",
"location": "Star, ID",
"url": "https://www.lostrapidshoa.com",
"homes": 890,
"operating_income": 560000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - ID HOA",
"date": "2026-05-15"
},
{
"name": "Paramount Community Association",
"location": "Meridian, ID",
"url": "https://www.paramounthoa.org",
"homes": 1600,
"operating_income": 1050000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - ID HOA",
"date": "2026-05-15"
},
{
"name": "Syringa Valley HOA",
"location": "Nampa, ID",
"url": "https://www.syringavalleyhoa.com",
"homes": 680,
"operating_income": 380000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - ID HOA",
"date": "2026-05-15"
},
{
"name": "Coeur d'Alene Place Community Association",
"location": "Coeur d'Alene, ID",
"url": "https://www.cdaplacehoa.com",
"homes": 520,
"operating_income": 310000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - ID HOA",
"date": "2026-05-15"
},
{
"name": "Mariposa Community Association",
"location": "Rio Rancho, NM",
"url": "https://www.mariposanm.com",
"homes": 1200,
"operating_income": 780000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - NM HOA",
"date": "2026-05-15"
},
{
"name": "Sivage Communities HOA",
"location": "Albuquerque, NM",
"url": "https://www.sivagehoa.com",
"homes": 850,
"operating_income": 510000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - NM HOA",
"date": "2026-05-15"
},
{
"name": "Vista del Norte Community Association",
"location": "Albuquerque, NM",
"url": "https://www.vistadelnortehoa.com",
"homes": 680,
"operating_income": 390000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - NM HOA",
"date": "2026-05-15"
},
{
"name": "La Cuentista Homeowners Association",
"location": "Rio Rancho, NM",
"url": "https://www.lacuentistahoa.com",
"homes": 540,
"operating_income": 290000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - NM HOA",
"date": "2026-05-15"
},
{
"name": "Santa Fe Trail Community Association",
"location": "Santa Fe, NM",
"url": "https://www.santafehoa.org",
"homes": 420,
"operating_income": 320000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - NM HOA",
"date": "2026-05-15"
},
{
"name": "Miraloma Community Development District",
"location": "Punta Gorda, FL",
"url": "https://miralemacdd.net",
"homes": 380,
"operating_income": 195000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "FL Auditor / CDD Annual Report",
"date": "2026-05-15"
},
{
"name": "Babcock Ranch Community Development District",
"location": "Punta Gorda, FL",
"url": "https://babcockneighborhoodhoa.com",
"homes": 3000,
"operating_income": 2800000,
"interest_income": 28000,
"interest_rate_pct": 1.0,
"hot": "HOT",
"source": "FL Auditor / CDD Annual Report",
"date": "2026-05-15"
},
{
"name": "Trilogy at Vistancia Community Association",
"location": "Peoria, AZ",
"url": "https://www.trilogyatvistancia.com",
"homes": 3000,
"operating_income": 2200000,
"interest_income": 22000,
"interest_rate_pct": 1.0,
"hot": "HOT",
"source": "Web Search - AZ HOA",
"date": "2026-05-15"
},
{
"name": "Sun City West Community Association",
"location": "Sun City West, AZ",
"url": "https://www.suncitywest.com",
"homes": 16000,
"operating_income": 12000000,
"interest_income": 96000,
"interest_rate_pct": 0.8,
"hot": "HOT",
"source": "Web Search - AZ HOA",
"date": "2026-05-15"
},
{
"name": "Val Vista Lakes HOA",
"location": "Gilbert, AZ",
"url": "https://www.valvistalakeshoa.com",
"homes": 2800,
"operating_income": 1900000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - AZ HOA",
"date": "2026-05-15"
},
{
"name": "Del Webb Sun City Community Association",
"location": "Georgetown, TX",
"url": "https://www.suncitytx.com",
"homes": 14000,
"operating_income": 9500000,
"interest_income": 76000,
"interest_rate_pct": 0.8,
"hot": "HOT",
"source": "Web Search - TX HOA",
"date": "2026-05-15"
},
{
"name": "Blaine HOA Community",
"location": "Blaine, MN",
"url": "https://www.blainehoa.org",
"homes": 1800,
"operating_income": 1100000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MN HOA",
"date": "2026-05-15"
},
{
"name": "Lakeville Heights HOA",
"location": "Lakeville, MN",
"url": "https://www.lakevillehoa.com",
"homes": 1400,
"operating_income": 850000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MN HOA",
"date": "2026-05-15"
},
{
"name": "Sun Prairie Community Association",
"location": "Sun Prairie, WI",
"url": "https://www.sunprairiehoa.org",
"homes": 2100,
"operating_income": 1350000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - WI HOA",
"date": "2026-05-15"
},
{
"name": "Fishers Village HOA",
"location": "Fishers, IN",
"url": "https://www.fishershoa.org",
"homes": 2400,
"operating_income": 1600000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - IN HOA",
"date": "2026-05-15"
},
{
"name": "Zionsville Community Association",
"location": "Zionsville, IN",
"url": "https://www.zionsvillehoa.com",
"homes": 1900,
"operating_income": 1200000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - IN HOA",
"date": "2026-05-15"
},
{
"name": "Beaumont Center HOA",
"location": "Lexington, KY",
"url": "https://www.beaumonthoa.com",
"homes": 1600,
"operating_income": 980000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - KY HOA",
"date": "2026-05-15"
},
{
"name": "Summerfield HOA",
"location": "Louisville, KY",
"url": "https://www.summerfieldhoa.org",
"homes": 1100,
"operating_income": 620000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - KY HOA",
"date": "2026-05-15"
},
{
"name": "Bowie New Town HOA",
"location": "Bowie, MD",
"url": "https://www.bowiemd.gov",
"homes": 3800,
"operating_income": 2400000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - MD HOA",
"date": "2026-05-15"
},
{
"name": "Centerton HOA",
"location": "Mount Laurel, NJ",
"url": "https://www.centertonhoa.com",
"homes": 1300,
"operating_income": 820000,
"interest_income": null,
"interest_rate_pct": null,
"hot": "WARM",
"source": "Web Search - NJ HOA",
"date": "2026-05-15"
}
]