Centralized MongoDB database layer for Ottonomix sales prospecting. Provides shared data models, CRUD operations, and query capabilities for company-research and lead-discovery skills. Manages French companies, research snapshots, people, news events, signals, and discovered leads with Ottonomix-specific scoring.
Centralized data layer for Ottonomix sales prospecting tools. Provides shared MongoDB access with consistent schemas across all prospecting-related skills, optimized for French company data and Ottonomix's focus areas.
Ottonomix is a French coaching company specializing in:
This database is optimized for French companies (SAS, SARL, SA, SCOP) and tracks signals relevant to these specific needs.
┌─────────────────┐ ┌─────────────────┐
│ lead-discovery │────→│ │
│ (find leads) │ │ prospecting-db │
└─────────────────┘ │ (shared data) │←────┐
│ │ │
┌─────────────────┐ └─────────────────┘ │
│ company-research│─────────────────────────────┘
│ (deep research) │
└─────────────────┘
{
"_id": "ObjectId",
"name": "Acme SAS",
"domain": "acme.fr",
"legal_form": "SAS|SARL|SA|SCOP|EURL", // French legal forms
"siret": "12345678900012", // French business ID
"industry": "Technology",
"sector": "B2B Software",
"size": "50-200",
"employee_count": 75,
"founded": 2015,
"headquarters": {
"city": "Paris",
"region": "Île-de-France",
"country": "France"
},
"locations": ["Paris", "Lyon", "Bordeaux"],
"description": "...",
"website": "https://acme.fr",
"social_links": {
"linkedin": "...",
"twitter": "...",
"welcome_to_the_jungle": "..." // French platform
},
"source": "manual|feed|discovery",
// Ottonomix-specific fields
"ottonomix_fit": {
"autonomy_potential": 85, // 0-100 score
"transmission_readiness": 70, // For founder transitions
"collective_governance_maturity": 60, // For shared leadership
"employee_buyout_candidate": true, // SCOP/reprise potential
"overall_score": 78
},
"lead_quality": {
"score": 87,
"grade": "A",
"priority": "HIGH",
"reason": "Founder approaching retirement, no succession plan"
},
"financial_indicators": {
"revenue_range": "10M-50M EUR",
"funding_status": "bootstrapped|seed|series_a|profitable",
"profitability": "profitable|break_even|growth_stage"
},
"created_at": "ISO-8601",
"updated_at": "ISO-8601",
"last_research_date": "ISO-8601",
"research_count": 3
}
{
"_id": "ObjectId",
"company_id": "ObjectId",
"timestamp": "ISO-8601",
"research_version": 1,
"mode": "agentic|standard",
"data": { /* complete research results */ },
"diff_from_previous": { /* changes from last snapshot */ },
"ai_analysis": { /* AI-generated insights */ },
"signals_detected": [...],
"ottonomix_analysis": {
"autonomy_gaps": ["Centralized decision making", "Excessive meetings"],
"transmission_risks": ["No documented processes", "Founder-dependent"],
"collective_leadership_opportunities": ["Young management team", "Flat hierarchy"],
"recommended_approach": "Focus on founder transition coaching"
}
}
{
"_id": "ObjectId",
"company_id": "ObjectId",
"name": "Marie Dupont",
"title": "Directrice des Ressources Humaines",
"title_normalized": "DRH|Chief People Officer",
"department": "RH",
"linkedin_url": "...",
"email": "[email protected]",
"phone": "+33 1 23 45 67 89",
"inferred_role": "decision_maker|influencer|contact",
"seniority_level": 9,
"is_founder": false,
"years_at_company": 5,
"first_seen": "ISO-8601",
"last_seen": "ISO-8601"
}
{
"_id": "ObjectId",
"company_id": "ObjectId",
"date": "ISO-8601",
"category": "funding|leadership|expansion|culture|transmission|reprise|other",
"title": "Acme lève 5M€ pour accélérer sa croissance",
"summary": "...",
"source": "Les Echos|La Tribune|FrenchWeb| Maddyness",
"url": "...",
"relevance_score": 0.85,
"keywords": ["levée", "fonds", "croissance"],
"discovered_via": "feed|manual|research"
}
{
"_id": "ObjectId",
"company_id": "ObjectId",
"signal_type": "new_hr_leadership|leadership_transition|funding|rapid_growth|hiring_spree|culture_challenges|coaching_mentioned|succession_planning|founder_retirement|employee_buyout_candidate|autonomy_gaps|collective_governance_opportunity",
"confidence": 0.9,
"evidence": "...",
"urgency": "HIGH|MEDIUM|LOW",
"status": "active|contacted|converted|archived",
"recommended_action": "...",
"discovered_at": "ISO-8601",
"expires_at": "ISO-8601",
"ottonomix_priority": 1 // 1-5 priority for Ottonomix
}
{
"_id": "ObjectId",
"company_name": "Acme SAS",
"source_feed": "Les Echos",
"source_url": "...",
"discovery_date": "ISO-8601",
"signal_type": "funding|transmission|reprise|...",
"signal_summary": "Levée de 5M€ Series A",
"confidence": 0.85,
"status": "new|researched|contacted|archived",
"company_id": "ObjectId",
"auto_researched": true|false,
"ottonomix_relevance": 0.9 // How well it fits Ottonomix's focus
}
{
"_id": "ObjectId",
"name": "Les Echos Startups",
"url": "https://...",
"type": "rss|api|scraped",
"category": "funding|leadership|transmission|general",
"is_active": true,
"check_interval_hours": 24,
"last_checked": "ISO-8601",
"last_new_items": 5,
"language": "fr",
"region": "France",
"filters": {
"keywords": ["levée", "fonds", "transmission", "reprise"],
"min_relevance": 0.6
}
}
python3 scripts/db_manager.py init
from scripts.db_manager import ProspectingDB
db = ProspectingDB()
# Companies
company = db.create_company({"name": "Acme SAS", "legal_form": "SAS", ...})
company = db.get_company_by_name("Acme SAS")
companies = db.get_companies_by_signal("founder_retirement")
# Get high-fit Ottonomix prospects
prospects = db.get_ottonomix_prospects(min_score=70, limit=20)
# Research
snapshot = db.create_research_snapshot(company_id, data)
snapshots = db.get_research_history(company_id)
# People
person = db.create_person(company_id, {"name": "Marie", ...})
people = db.get_people_by_company(company_id)
# Signals
signal = db.create_signal(company_id, {...})
signals = db.get_active_signals(min_confidence=0.8)
# Discovered Leads
lead = db.create_discovered_lead({"company_name": "...", ...})
leads = db.get_unresearched_leads(limit=10)
# Feeds
feed = db.create_feed_source({"name": "...", "url": "..."})
feeds = db.get_active_feeds()
# Initialize database
python3 scripts/db_manager.py init
# Add a feed source
python3 scripts/db_manager.py add-feed "Les Echos" "https://..." --category funding
# List feed sources
python3 scripts/db_manager.py list-feeds
# Get unresearched leads
python3 scripts/db_manager.py list-leads --status new --limit 20
# Get high-priority signals
python3 scripts/db_manager.py list-signals --min-confidence 0.8
# Get Ottonomix-fit prospects
python3 scripts/db_manager.py list-prospects --min-score 70
# Export data
python3 scripts/db_manager.py export --format json --output leads.json
MONGODB_URIpip install pymongo python-dateutil
export MONGODB_URI="mongodb://localhost:27017" # default
export PROSPECTING_DB_NAME="ottonomix_prospecting" # default
Other skills import and use:
import sys
sys.path.insert(0, '/home/william/.openclaw/workspace/skills/prospecting-db')
from scripts.db_manager import ProspectingDB
db = ProspectingDB()
# Use db...
companies — Company profiles (French-optimized)research_snapshots — Versioned research datapeople — Contacts and decision makersnews_events — Intelligence eventssignals — Coaching opportunity signals (Ottonomix-specific)discovered_leads — Feed-discovered prospectsfeed_sources — Monitored feed configurations