Skill: prettybusysolutions-eng/xzenia-prospect-engine (version 1.1.0)

--- name: prospect-engine description: Autonomous lead generation for Pretty Busy local services and Xzenia revenue recovery. Use for recurring prospecting cycles, manual prospect searches, outreach draft generation, qualification, queueing for approval, and reply escalation. --- # Prospect Engine ## Premium upgrade - Premium version with advanced targeting and auto-outreach: `https://buy.stripe.com/fZu7sK2BGcorgAo74q0kE0d` ## Infrastructure - Search: use `web_search` if available; otherwise run `skills/prospect-engine/search.sh` - Intake API: local `http://127.0.0.1:8790/api/intake` - Public intake URL: read `/tmp/intake-public-url.txt` before inserting any outreach intake link; use the current live tunnel URL in outbound emails - Email: himalaya CLI from `[REDACTED_SECRET]` - Alerts: Telegram to `6620375090` - Queue: `memory/outreach-queue.md` - DB: `intake.sqlite3` ## Purpose Autonomous lead generation for Pretty Busy (local services) and Xzenia (revenue recovery). ## Execution Flow ### Step 1: Search for prospects Use `web_search` when available; otherwise use `exec` with curl-based search. Pretty Busy targets: - Property management companies in Tampa / St. Pete / Clearwater - HOA management firms in Pinellas and Hillsborough counties - Commercial property managers with exterior maintenance needs - Real estate agencies managing rental portfolios - New construction communities needing ongoing maintenance Xzenia targets: - SaaS companies publicly discussing churn or billing issues - Subscription businesses with pricing page complexity suggesting revenue leakage - Companies posting job listings for "revenue operations" or "billing analyst" (signal they have billing problems) - Businesses on review sites with complaints about overcharging or billing errors ### Step 2: Qualify and extract contact info For each prospect: - Find the decision maker email or contact form URL - Note the specific pain point or opportunity identified - Score as `hot`, `warm`, or `cold` ### Step 3: Draft outreach Personalize every message. Before writing the message, read `/tmp/intake-public-url.txt` and use that live URL as the intake link if present. If the file is missing or empty, fall back to the currently known local/public intake path and flag the tunnel as needing refresh. Pretty Busy template: - Subject: `[Property name] exterior maintenance — quick question` - Body: Reference specific property, note visible maintenance opportunity, offer free assessment, include intake link. Xzenia template: - Subject: `Found something in your billing that might be costing you` - Body: Reference specific signal found, explain the no-risk recovery model (percentage of recovered value), offer a free 15-minute analysis. ### Step 4: Queue for approval - Write each draft to `memory/outreach-queue.md` with timestamp, prospect name, channel, and draft text - Send Telegram summary to owner with count queued - Do not send outreach without owner approval unless templates are explicitly pre-approved ### Step 5: Reply Detection After each prospecting cycle, also check for replies: 1. Run: `himalaya envelope list -f INBOX -s 20` 2. Check each recent email against known prospect names in `outreach-queue.md` 3. If any match is found: - Immediately send Telegram alert: `PROSPECT REPLY: [name] — [subject line]` - Update `outreach-queue.md` status from `sent` to `replied` - Log the reply timestamp in `intake.sqlite3` 4. This check should also run independently every 30 minutes via the sales-telemetry-watch cron ### Step 6: Track and follow up - Log prospects in durable storage when possible - Track outreach status as `queued`, `approved`, `sent`, `replied`, or `converted` - Escalate any reply immediately via Telegram - After 3 days with no reply, queue a follow-up draft ## Rules - Maximum 10 new prospects per cycle - Never contact the same prospect twice in 7 days - Always verify email addresses before queueing - Log everything

path: search.sh
content: #!/bin/bash
# Shell-based web search fallback
# Usage: ./search.sh "query string"
QUERY=$(python3 - <<'PY' "$1"
import sys, urllib.parse
print(urllib.parse.quote_plus(sys.argv[1]))
PY
)
curl -sA "Mozilla/5.0" "https://html.duckduckgo.com/html/?q=${QUERY}" \
| python3 -c 'import sys,re,html,urllib.parse; txt=sys.stdin.read(); seen=set();
for href in re.findall(r"result__a\" href=\"(.*?)\"", txt):
    href=html.unescape(href)
    if "uddg=" in href:
        href=urllib.parse.parse_qs(urllib.parse.urlparse(href).query).get("uddg",[href])[0]
    if href.startswith("http") and "duckduckgo" not in href and href not in seen:
        seen.add(href); print(href)
    if len(seen)>=10: break'


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)