Analytics Events
Event taxonomy for tracking marketplace liquidity and user behavior.
Event Naming Convention
Format: {object}_{action}
Examples: request_created, offer_accepted, deal_completed
Core Marketplace Events
Request Events
request_started
- When: User taps "Post Request" button
- Properties:
user_id: UUIDplatform: ios/android/web
request_category_selected
- When: User selects category in request form
- Properties:
category: phone/accessory
request_submitted
- When: User taps submit button
- Properties:
category: phone/accessorybudget_min: numberbudget_max: numberlocation_city: string
request_created
- When: Request successfully created in database
- Properties:
request_id: UUIDbuyer_id: UUIDcategory: phone/accessorybudget_range: number (max - min)location_city: string
request_viewed
- When: Seller views request detail
- Properties:
request_id: UUIDseller_id: UUIDoffer_count: number
request_closed
- When: Request status changes to closed
- Properties:
request_id: UUIDreason: offer_accepted/manual_closeoffer_count: numbertime_to_close: seconds
Offer Events
offer_started
- When: Seller taps "Make Offer" button
- Properties:
request_id: UUIDseller_id: UUID
offer_submitted
- When: Seller taps submit button
- Properties:
request_id: UUIDprice: numberwithin_budget: boolean
offer_created
- When: Offer successfully created in database
- Properties:
offer_id: UUIDrequest_id: UUIDseller_id: UUIDprice: numberprice_vs_budget_max: percentagerequest_age: seconds
offer_viewed
- When: Buyer views offer detail
- Properties:
offer_id: UUIDrequest_id: UUIDbuyer_id: UUID
offer_accepted
- When: Buyer accepts an offer
- Properties:
offer_id: UUIDrequest_id: UUIDdeal_id: UUIDprice: numberoffer_count: number (total offers on request)time_to_accept: seconds (from request creation)
offer_rejected
- When: Offer auto-rejected (another offer accepted)
- Properties:
offer_id: UUIDrequest_id: UUID
Deal Events
deal_created
- When: Deal created (offer accepted)
- Properties:
deal_id: UUIDrequest_id: UUIDoffer_id: UUIDbuyer_id: UUIDseller_id: UUIDprice: number
deal_completed
- When: Buyer marks deal as completed
- Properties:
deal_id: UUIDtime_to_complete: seconds (from deal creation)
deal_cancelled
- When: Buyer cancels deal
- Properties:
deal_id: UUIDreason: stringtime_to_cancel: seconds
Chat Events
chat_opened
- When: User opens chat conversation
- Properties:
conversation_id: UUIDoffer_id: UUIDuser_role: buyer/seller
message_sent
- When: User sends message
- Properties:
conversation_id: UUIDsender_role: buyer/sellermessage_length: number
message_received
- When: User receives message
- Properties:
conversation_id: UUIDrecipient_role: buyer/sellerdelivery_method: realtime/push
Rating Events
rating_submitted
- When: Buyer submits rating
- Properties:
rating_id: UUIDdeal_id: UUIDseller_id: UUIDrating: 1-5has_review: boolean
Report Events
report_created
- When: User reports another user
- Properties:
report_id: UUIDreporter_id: UUIDreported_user_id: UUIDreason: string
report_reviewed
- When: Admin reviews report
- Properties:
report_id: UUIDaction: resolved/warned/suspended
Seller Events
seller_application_started
- When: User taps "Become Seller"
- Properties:
user_id: UUID
seller_application_submitted
- When: User submits seller application
- Properties:
user_id: UUIDhas_business_name: boolean
seller_approved
- When: Admin approves seller
- Properties:
seller_id: UUIDtime_to_approval: seconds
seller_rejected
- When: Admin rejects seller
- Properties:
seller_id: UUID
seller_suspended
- When: Admin suspends seller
- Properties:
seller_id: UUIDreason: string
User Lifecycle Events
user_registered
- When: User completes OTP verification
- Properties:
user_id: UUIDplatform: ios/android/flutter_web
user_profile_completed
- When: User adds name and avatar
- Properties:
user_id: UUIDhas_avatar: boolean
user_logged_in
- When: User logs in (after registration)
- Properties:
user_id: UUIDplatform: ios/android/flutter_web
user_logged_out
- When: User logs out
- Properties:
user_id: UUID
Engagement Events
app_opened
- When: User opens app
- Properties:
user_id: UUIDplatform: ios/android/flutter_websession_id: UUID
screen_viewed
- When: User navigates to screen
- Properties:
screen_name: stringuser_id: UUID
notification_received
- When: Push notification delivered
- Properties:
notification_type: stringuser_id: UUID
notification_tapped
- When: User taps notification
- Properties:
notification_type: stringuser_id: UUIDdeep_link: string
Key Performance Indicators (KPIs)
Marketplace Liquidity
Requests per Day
- Formula: COUNT(request_created) per day
- Target:
50+in first month
Offers per Request
- Formula: AVG(offer_count) per request
- Target:
3+average
Time to First Offer
- Formula: MEDIAN(time between request_created and first offer_created)
- Target:
<2 hours
Deal Completion Rate
- Formula: COUNT(deal_completed) / COUNT(deal_created)
- Target:
30%+
User Engagement
Buyer Retention
- Formula: % of buyers who post 2nd request within 30 days
- Target:
40%+
Seller Response Rate
- Formula: % of sellers who make ≥1 offer per week
- Target:
60%+
Chat Engagement
- Formula: % of offers that result in chat
- Target:
80%+
Trust & Quality
Seller Approval Rate
- Formula: COUNT(seller_approved) / COUNT(seller_application_submitted)
- Target:
70%+
Average Seller Rating
- Formula: AVG(rating) across all sellers
- Target:
4.0+stars
Report Rate
- Formula: COUNT(report_created) / COUNT(deal_created)
- Target:
<5%
Funnel Analysis
Buyer Funnel
- app_opened (100%)
- request_started (60%)
- request_submitted (80% of started)
- request_created (95% of submitted)
- offer_received (70% of created)
- offer_accepted (40% of received)
- deal_completed (30% of accepted)
Seller Funnel
- app_opened (100%)
- request_viewed (80%)
- offer_started (50% of viewed)
- offer_submitted (90% of started)
- offer_created (95% of submitted)
- offer_accepted (20% of created)
- rating_received (80% of accepted)
Implementation
Backend (Laravel)
// Using Laravel Events
event(new RequestCreated($request));
// Event Listener
class LogRequestCreated
{
public function handle(RequestCreated $event)
{
Analytics::track('request_created', [
'request_id' => $event->request->id,
'buyer_id' => $event->request->buyer_id,
'category' => $event->request->category,
'budget_range' => $event->request->budget_max - $event->request->budget_min,
]);
}
}
iOS (Swift)
Analytics.logEvent("request_created", parameters: [
"request_id": request.id,
"buyer_id": request.buyerId,
"category": request.category,
"budget_range": request.budgetMax - request.budgetMin
])
Android (Kotlin)
firebaseAnalytics.logEvent("request_created") {
param("request_id", request.id)
param("buyer_id", request.buyerId)
param("category", request.category)
param("budget_range", request.budgetMax - request.budgetMin)
}
Flutter (Dart)
FirebaseAnalytics.instance.logEvent(
name: 'request_created',
parameters: {
'request_id': request.id,
'buyer_id': request.buyerId,
'category': request.category,
'budget_range': request.budgetMax - request.budgetMin,
},
);
Privacy Considerations
- No PII in event properties (no phone numbers, emails, names)
- User IDs are UUIDs (not personally identifiable)
- Comply with GDPR/local privacy laws
- Allow users to opt-out of analytics
- Anonymize data after 90 days
Reporting Dashboards
Daily Dashboard
- Requests posted today
- Offers made today
- Deals completed today
- Active users today
- New registrations today
Weekly Dashboard
- Requests per day (trend)
- Offers per request (trend)
- Time to first offer (trend)
- Deal completion rate (trend)
- Seller approval rate
Monthly Dashboard
- User growth (total, buyers, sellers)
- Marketplace liquidity metrics
- Retention cohorts
- Revenue metrics (Phase 2)
- Top performing sellers