7.2 KiB
7.2 KiB
Persona-Based Lead Pricing Implementation Summary
Overview
Successfully implemented persona-based pricing multiplier system for LetsGoCappadocia lead management. The system automatically adjusts lead prices based on tourist persona profiles, optimizing revenue while providing fair pricing.
Implementation Details
1. Database Layer
New Functions
apply_persona_multiplier(p_price INTEGER, p_tourist_persona JSONB)- Applies persona-based multiplier to lead price
- Multipliers:
very_high: 1.5x (Romantic Couple, Luxury Traveler)high: 1.3x (Content Creator, Group Tour)medium: 1.0x (Family Explorer, Solo Adventurer)low: 0.8x (Budget Backpacker)
- Returns adjusted price rounded to nearest integer
Updated Functions
-
calculate_lead_price(p_base_price, p_planned_activities, p_trigger_source, p_tourist_persona)- Added
p_tourist_personaparameter - Pricing calculation chain:
- Base price (default: 20 credits)
- Activity multipliers (balloon: 2.0x, ATV: 1.5x, guided tour: 1.4x)
- AI recommendation premium (1.75x)
- Persona multiplier (0.8x - 1.5x) ← NEW
- Final price = base × activities × AI × persona
- Added
-
update_lead_pricing()(Trigger Function)- Updated to pass
tourist_personatocalculate_lead_price - Automatically recalculates price when persona changes
- Trigger fires on: INSERT or UPDATE of base_price, planned_activities, override_price, trigger_source, tourist_persona
- Updated to pass
Updated Views
leads_for_providers- Added
tourist_personacolumn (visible to all providers) - Added
persona_confidencecolumn (visible to all providers) - Persona information shown regardless of purchase status (to incentivize purchase)
- Contact information (email, whatsapp) still masked until purchased
- Added
2. Migration Files
00089_add_persona_pricing_multiplier.sql
- Creates
apply_persona_multiplierfunction - Updates
calculate_lead_pricefunction with persona parameter - Updates
update_lead_pricingtrigger function - Recreates trigger with persona support
- Updates existing leads with persona-based pricing
- Grants necessary permissions
00090_update_leads_view_with_persona.sql
- Drops and recreates
leads_for_providersview - Adds persona columns to view
- Maintains security (contact info masking)
3. Frontend Integration
Existing Components (Already Working)
-
PersonaBadge Component (
/src/components/planner/PersonaBadge.tsx)- Displays persona with emoji, label, and color-coded badge
- Shows description optionally
- Color coding based on spend_potential
-
LeadDetailModal Component (
/src/components/provider/LeadDetailModal.tsx)- Shows persona information in dedicated card
- Displays emoji, sales_label, description, confidence score
- Shows spend_potential badge
- Purchased leads: Shows recommended services
- Unpurchased leads: Shows teaser message with lock icon
- Incentivizes purchase by showing persona type before purchase
-
Persona Detection (
/src/utils/persona-engine.ts)- Analyzes trip data (travelers, interests, activities, budget)
- Returns persona type and confidence score
- Used in
useTripEvents.tsduring lead creation
Lead Creation Flow
- User creates trip plan in TripPlanner
- User clicks on AI tour recommendation
- LeadCaptureModal opens for contact info
- On submit:
detectPersona()analyzes trip data- Returns persona type and confidence
leadsApi.create()called with persona data- Database trigger calculates final price with persona multiplier
- Toast shows persona emoji and label
- Provider sees lead with persona badge and adjusted price
4. Pricing Examples
Example 1: Budget Backpacker
- Base price: 20 credits
- Activities: None
- AI recommendation: No
- Persona: Budget Backpacker (low)
- Final price: 20 × 0.8 = 16 credits
Example 2: Romantic Couple with Balloon
- Base price: 20 credits
- Activities: Hot air balloon (2.0x)
- AI recommendation: Yes (1.75x)
- Persona: Romantic Couple (very_high)
- Final price: 20 × 2.0 × 1.75 × 1.5 = 105 credits
Example 3: Luxury Traveler with Full Package
- Base price: 20 credits
- Activities: Balloon (2.0x) + ATV (1.5x) + Guided tour (1.4x)
- AI recommendation: Yes (1.75x)
- Persona: Luxury Traveler (very_high)
- Final price: 20 × 2.0 × 1.5 × 1.4 × 1.75 × 1.5 = 441 credits
Example 4: Family Explorer
- Base price: 20 credits
- Activities: Guided tour (1.4x)
- AI recommendation: No
- Persona: Family Explorer (medium)
- Final price: 20 × 1.4 × 1.0 = 28 credits
5. Security & Privacy
Persona Information
- ✅ Visible to all providers (before purchase)
- ✅ Helps providers assess lead quality
- ✅ Incentivizes purchase of high-value leads
Contact Information
- ❌ Masked until purchased (email:
***@***.***, whatsapp:+90 *** *** ****) - ✅ Full access after purchase
Recommended Services
- ❌ Hidden until purchased (shows teaser with lock icon)
- ✅ Full list visible after purchase
6. Benefits
For Providers
- See lead quality before purchase (persona type, spend potential)
- Make informed purchase decisions
- Optimize budget allocation
- Target high-value leads
For Platform
- Dynamic pricing based on lead value
- Increased revenue from high-value leads
- Fair pricing for budget travelers
- Better lead-provider matching
For Users
- Fair pricing based on travel style
- Better service recommendations
- Improved provider matching
7. Testing
Lint Check
npm run lint
# Result: Checked 244 files in 3s. No fixes applied. ✅
Database Functions
- ✅
apply_persona_multiplierfunction created - ✅
calculate_lead_priceupdated with persona parameter - ✅
update_lead_pricingtrigger updated - ✅ Trigger fires on persona changes
- ✅ Existing leads updated with persona pricing
Frontend Components
- ✅ PersonaBadge displays correctly
- ✅ LeadDetailModal shows persona information
- ✅ Persona detection works during lead creation
- ✅ Toast shows persona emoji and label
- ✅ Provider dashboard shows persona badges
8. Files Modified/Created
Database Migrations
supabase/migrations/00089_add_persona_pricing_multiplier.sql(NEW)supabase/migrations/00090_update_leads_view_with_persona.sql(NEW)
Documentation
TODO.md(UPDATED)PERSONA_PRICING_SUMMARY.md(NEW - this file)
Existing Files (No Changes Needed)
/src/types/persona.ts(Already exists)/src/types/lead.ts(Already exists)/src/utils/persona-engine.ts(Already exists)/src/components/planner/PersonaBadge.tsx(Already exists)/src/components/provider/LeadDetailModal.tsx(Already exists)/src/pages/TripPlanner/hooks/useTripEvents.ts(Already uses persona detection)/src/db/api.ts(Already accepts persona parameters)
Conclusion
✅ All requirements successfully implemented
- Persona-based pricing multiplier active
- Database functions and triggers working
- Frontend integration verified
- Security and privacy maintained
- Lint checks passed
- No breaking changes
The system is production-ready and will automatically apply persona-based pricing to all new leads.