# Prospecting Module - User Journeys ## Personas | # | Persona | Role / Auth | Description | |---|---------|-------------|-------------| | 1 | **Platform Admin** | `admin` role | Manages prospects, runs enrichment scans, sends campaigns, exports leads | !!! note "Admin-only module" The prospecting module is exclusively for platform admins. There are no store-level or customer-facing pages. All access requires admin authentication. --- ## Platforms Using Prospecting The prospecting module is enabled on multiple platforms: | Platform | Domain | Path Prefix (dev) | |----------|--------|--------------------| | HostWizard | hostwizard.lu | `/platforms/hosting/` | --- ## Dev URLs (localhost:9999) The dev server uses path-based platform routing: `http://localhost:9999/platforms/hosting/...` ### 1. Admin Pages Login as: `admin@orion.lu` or `samir.boulahtit@gmail.com` | Page | Dev URL | |------|---------| | Dashboard | `http://localhost:9999/platforms/hosting/admin/prospecting` | | Prospects List | `http://localhost:9999/platforms/hosting/admin/prospecting/prospects` | | Prospect Detail | `http://localhost:9999/platforms/hosting/admin/prospecting/prospects/{prospect_id}` | | Leads List | `http://localhost:9999/platforms/hosting/admin/prospecting/leads` | | Quick Capture | `http://localhost:9999/platforms/hosting/admin/prospecting/capture` | | Scan Jobs | `http://localhost:9999/platforms/hosting/admin/prospecting/scan-jobs` | | Campaigns | `http://localhost:9999/platforms/hosting/admin/prospecting/campaigns` | ### 2. Admin API Endpoints **Prospects** (prefix: `/platforms/hosting/api/admin/prospecting/`): | Method | Endpoint | Dev URL | |--------|----------|---------| | GET | prospects | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects` | | GET | prospect detail | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}` | | POST | create prospect | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects` | | PUT | update prospect | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}` | | DELETE | delete prospect | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}` | | POST | import CSV | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/import` | **Leads** (prefix: `/platforms/hosting/api/admin/prospecting/`): | Method | Endpoint | Dev URL | |--------|----------|---------| | GET | leads (filtered) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/leads` | | GET | top priority | `http://localhost:9999/platforms/hosting/api/admin/prospecting/leads/top-priority` | | GET | quick wins | `http://localhost:9999/platforms/hosting/api/admin/prospecting/leads/quick-wins` | | GET | export CSV | `http://localhost:9999/platforms/hosting/api/admin/prospecting/leads/export/csv` | **Enrichment** (prefix: `/platforms/hosting/api/admin/prospecting/`): | Method | Endpoint | Dev URL | |--------|----------|---------| | POST | HTTP check (single) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/http-check/{id}` | | POST | HTTP check (batch) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/http-check/batch` | | POST | tech scan (single) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/tech-scan/{id}` | | POST | tech scan (batch) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/tech-scan/batch` | | POST | performance (single) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/performance/{id}` | | POST | performance (batch) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/performance/batch` | | POST | contacts (single) | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/contacts/{id}` | | POST | full enrichment | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/full/{id}` | | POST | score compute | `http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/score-compute/batch` | **Interactions** (prefix: `/platforms/hosting/api/admin/prospecting/`): | Method | Endpoint | Dev URL | |--------|----------|---------| | GET | prospect interactions | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}/interactions` | | POST | log interaction | `http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}/interactions` | | GET | upcoming follow-ups | `http://localhost:9999/platforms/hosting/api/admin/prospecting/interactions/upcoming` | **Campaigns** (prefix: `/platforms/hosting/api/admin/prospecting/`): | Method | Endpoint | Dev URL | |--------|----------|---------| | GET | list templates | `http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/templates` | | POST | create template | `http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/templates` | | PUT | update template | `http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/templates/{id}` | | DELETE | delete template | `http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/templates/{id}` | | POST | preview campaign | `http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/preview` | | POST | send campaign | `http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/send` | | GET | list sends | `http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/sends` | **Stats** (prefix: `/platforms/hosting/api/admin/prospecting/`): | Method | Endpoint | Dev URL | |--------|----------|---------| | GET | dashboard stats | `http://localhost:9999/platforms/hosting/api/admin/prospecting/stats` | | GET | scan jobs | `http://localhost:9999/platforms/hosting/api/admin/prospecting/stats/jobs` | --- ## Production URLs (hostwizard.lu) In production, the platform uses **domain-based routing**. ### Admin Pages & API | Page / Endpoint | Production URL | |-----------------|----------------| | Dashboard | `https://hostwizard.lu/admin/prospecting` | | Prospects | `https://hostwizard.lu/admin/prospecting/prospects` | | Prospect Detail | `https://hostwizard.lu/admin/prospecting/prospects/{id}` | | Leads | `https://hostwizard.lu/admin/prospecting/leads` | | Quick Capture | `https://hostwizard.lu/admin/prospecting/capture` | | Scan Jobs | `https://hostwizard.lu/admin/prospecting/scan-jobs` | | Campaigns | `https://hostwizard.lu/admin/prospecting/campaigns` | | API - Prospects | `GET https://hostwizard.lu/api/admin/prospecting/prospects` | | API - Leads | `GET https://hostwizard.lu/api/admin/prospecting/leads` | | API - Stats | `GET https://hostwizard.lu/api/admin/prospecting/stats` | --- ## Data Model ### Prospect ``` Prospect ├── id (PK) ├── channel: DIGITAL | OFFLINE ├── business_name (str) ├── domain_name (str, unique) ├── status: PENDING | ACTIVE | INACTIVE | PARKED | ERROR | CONTACTED | CONVERTED ├── source (str) ├── Digital fields: has_website, uses_https, http_status_code, redirect_url, scan timestamps ├── Offline fields: address, city, postal_code, country, location_lat/lng, captured_by_user_id ├── notes, tags (JSON) ├── created_at, updated_at └── Relationships: tech_profile, performance_profile, score, contacts, interactions ``` ### Prospect Score (0-100) ``` ProspectScore ├── score (0-100, overall) ├── Components: technical_health (max 40), modernity (max 25), business_value (max 25), engagement (max 10) ├── reason_flags (JSON array) ├── score_breakdown (JSON dict) └── lead_tier: top_priority | quick_win | strategic | low_priority ``` ### Status Flow ``` PENDING ↓ (HTTP check determines website status) ACTIVE (has website) or PARKED (no website / parked domain) ↓ (contact attempt) CONTACTED ↓ (outcome) CONVERTED (sale) or INACTIVE (not interested) Alternative: PENDING → ERROR (invalid domain, technical issues) ``` --- ## User Journeys ### Journey 1: Digital Lead Discovery (Domain Scanning) **Persona:** Platform Admin **Goal:** Import `.lu` domains, enrich them, and identify sales opportunities ```mermaid flowchart TD A[Import CSV of .lu domains] --> B[Prospects created with status PENDING] B --> C[Run HTTP check batch] C --> D[Run tech scan batch] D --> E[Run performance scan batch] E --> F[Run contact scrape] F --> G[Compute scores batch] G --> H[View scored leads] H --> I{Score tier?} I -->|>= 70: Top Priority| J[Export & contact immediately] I -->|50-69: Quick Win| K[Queue for campaign] I -->|30-49: Strategic| L[Monitor & nurture] I -->|< 30: Low Priority| M[Deprioritize] ``` **Steps:** 1. Navigate to Dashboard: - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting` - Prod: `https://hostwizard.lu/admin/prospecting` 2. Import domains via CSV: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/import` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/prospects/import` 3. Run HTTP batch check: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/http-check/batch` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/enrichment/http-check/batch` 4. Run tech scan batch: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/tech-scan/batch` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/enrichment/tech-scan/batch` 5. Run performance scan batch: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/performance/batch` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/enrichment/performance/batch` 6. Compute scores: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/score-compute/batch` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/enrichment/score-compute/batch` 7. Monitor scan jobs: - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting/scan-jobs` - Prod: `https://hostwizard.lu/admin/prospecting/scan-jobs` 8. View scored leads: - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting/leads` - Prod: `https://hostwizard.lu/admin/prospecting/leads` 9. Export top priority leads: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/leads/export/csv?min_score=70` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/leads/export/csv?min_score=70` --- ### Journey 2: Offline Lead Capture **Persona:** Platform Admin (out in the field) **Goal:** Capture business details from in-person encounters using the mobile-friendly capture form ```mermaid flowchart TD A[Meet business owner in-person] --> B[Open Quick Capture on mobile] B --> C[Enter business name, address, contact info] C --> D[Prospect created with channel=OFFLINE] D --> E{Has website?} E -->|Yes| F[Run full enrichment] E -->|No| G[Score based on business value only] F --> H[Prospect fully enriched with score] G --> H H --> I[Log interaction: VISIT] I --> J[Set follow-up date] ``` **Steps:** 1. Open Quick Capture (mobile-friendly): - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting/capture` - Prod: `https://hostwizard.lu/admin/prospecting/capture` 2. Fill in business details and submit: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/prospects` - Body includes: `channel: "offline"`, `business_name`, `address`, `city`, `postal_code` 3. Optionally run full enrichment (if domain known): - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/full/{id}` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/enrichment/full/{id}` 4. Log the interaction: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}/interactions` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/prospects/{id}/interactions` - Body: `{ "interaction_type": "visit", "notes": "Met at trade fair", "next_action": "Send proposal", "next_action_date": "2026-03-10" }` --- ### Journey 3: Lead Qualification & Export **Persona:** Platform Admin **Goal:** Filter enriched prospects by score tier and export qualified leads for outreach ```mermaid flowchart TD A[Navigate to Leads page] --> B[Filter by score tier] B --> C{View preset lists} C -->|Top Priority| D[Score >= 70] C -->|Quick Wins| E[Score 50-69] C -->|Custom filter| F[Set min/max score, channel, contact type] D --> G[Review leads] E --> G F --> G G --> H[Export as CSV] H --> I[Use in campaigns or CRM] ``` **Steps:** 1. Navigate to Leads: - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting/leads` - Prod: `https://hostwizard.lu/admin/prospecting/leads` 2. View top priority leads: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/leads/top-priority` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/leads/top-priority` 3. View quick wins: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/leads/quick-wins` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/leads/quick-wins` 4. Filter with custom parameters: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/leads?min_score=60&has_email=true&channel=digital` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/leads?min_score=60&has_email=true&channel=digital` 5. Export filtered leads as CSV: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/leads/export/csv?min_score=50&lead_tier=quick_win` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/leads/export/csv?min_score=50&lead_tier=quick_win` --- ### Journey 4: Campaign Creation & Outreach **Persona:** Platform Admin **Goal:** Create email campaign templates and send targeted outreach to qualified prospects ```mermaid flowchart TD A[Navigate to Campaigns] --> B[Create campaign template] B --> C[Choose lead type: no_website, bad_website, etc.] C --> D[Write email template with variables] D --> E[Preview rendered for specific prospect] E --> F{Looks good?} F -->|Yes| G[Select qualifying leads] G --> H[Send campaign] H --> I[Monitor send status] F -->|No| J[Edit template] J --> E ``` **Steps:** 1. Navigate to Campaigns: - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting/campaigns` - Prod: `https://hostwizard.lu/admin/prospecting/campaigns` 2. Create a campaign template: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/templates` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/campaigns/templates` - Body: `{ "name": "No Website Outreach", "lead_type": "no_website", "channel": "email", "language": "fr", "subject_template": "Votre presence en ligne", "body_template": "Bonjour {{business_name}}..." }` 3. Preview the template for a specific prospect: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/preview` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/campaigns/preview` - Body: `{ "template_id": 1, "prospect_id": 42 }` 4. Send campaign to selected prospects: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/send` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/campaigns/send` - Body: `{ "template_id": 1, "prospect_ids": [42, 43, 44] }` 5. Monitor campaign sends: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/campaigns/sends` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/campaigns/sends` --- ### Journey 5: Interaction Tracking & Follow-ups **Persona:** Platform Admin **Goal:** Log interactions with prospects and track follow-up actions ```mermaid flowchart TD A[Open prospect detail] --> B[View interaction history] B --> C[Log new interaction] C --> D[Set next action & date] D --> E[View upcoming follow-ups] E --> F[Complete follow-up] F --> G{Positive outcome?} G -->|Yes| H[Mark as CONTACTED → CONVERTED] G -->|No| I[Schedule next follow-up or mark INACTIVE] ``` **Steps:** 1. View prospect detail: - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting/prospects/{id}` - Prod: `https://hostwizard.lu/admin/prospecting/prospects/{id}` 2. View interactions: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}/interactions` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/prospects/{id}/interactions` 3. Log a new interaction: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/prospects/{id}/interactions` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/prospects/{id}/interactions` - Body: `{ "interaction_type": "call", "subject": "Follow-up call", "outcome": "positive", "next_action": "Send proposal", "next_action_date": "2026-03-15" }` 4. View upcoming follow-ups across all prospects: - API Dev: `GET http://localhost:9999/platforms/hosting/api/admin/prospecting/interactions/upcoming` - API Prod: `GET https://hostwizard.lu/api/admin/prospecting/interactions/upcoming` --- ### Journey 6: Full Enrichment Pipeline (Single Prospect) **Persona:** Platform Admin **Goal:** Run the complete enrichment pipeline for a single prospect to get all data at once ```mermaid flowchart TD A[Open prospect detail] --> B[Click 'Full Enrichment'] B --> C[Step 1: HTTP check] C --> D{Has website?} D -->|Yes| E[Step 2: Tech scan] D -->|No| H[Step 5: Compute score] E --> F[Step 3: Performance audit] F --> G[Step 4: Contact scrape] G --> H H --> I[Prospect fully enriched] I --> J[View score & breakdown] ``` **Steps:** 1. Run full enrichment for a prospect: - API Dev: `POST http://localhost:9999/platforms/hosting/api/admin/prospecting/enrichment/full/{prospect_id}` - API Prod: `POST https://hostwizard.lu/api/admin/prospecting/enrichment/full/{prospect_id}` 2. View the enriched prospect detail: - Dev: `http://localhost:9999/platforms/hosting/admin/prospecting/prospects/{prospect_id}` - Prod: `https://hostwizard.lu/admin/prospecting/prospects/{prospect_id}` The full enrichment runs 5 sequential steps: 1. **HTTP check** — Verifies domain connectivity, checks HTTPS, records redirects 2. **Tech scan** — Detects CMS, server, hosting provider, JS framework, SSL cert details 3. **Performance audit** — Runs PageSpeed analysis, records load times and scores 4. **Contact scrape** — Extracts emails, phones, addresses, social links from the website 5. **Score compute** — Calculates 0-100 opportunity score with component breakdown --- ## Recommended Test Order 1. **Journey 1** (steps 1-3) - Import domains and run HTTP checks first 2. **Journey 6** - Run full enrichment on a single prospect to test the complete pipeline 3. **Journey 1** (steps 4-9) - Run batch scans and view scored leads 4. **Journey 2** - Test offline capture on mobile 5. **Journey 3** - Filter and export leads 6. **Journey 4** - Create campaign templates and send to prospects 7. **Journey 5** - Log interactions and check follow-ups !!! tip "Enrichment order matters" The enrichment pipeline must run in order: HTTP check first (determines if website exists), then tech scan, performance, and contacts (all require a live website). Score computation should run last as it uses data from all other steps.