Skip to content

YeboCars — Product Requirements Document

Buy and sell cars across Africa. The TikTok-style marketplace for vehicles.

Status: 🔄 Building (Rebranding from Bamzu)
Previous Name: Bamzu
Document Version: 1.0
Last Updated: March 19, 2026


Table of Contents

  1. Vision
  2. Problem
  3. Solution
  4. Core Features
  5. User Journeys
  6. Data Models
  7. API Reference
  8. Service Architecture
  9. Authentication
  10. Billing & Monetization
  11. Technical Stack
  12. Gaps & Missing Features
  13. Roadmap

Vision

YeboCars is the car marketplace for Africa — a mobile-first platform that makes buying and selling vehicles as engaging as scrolling TikTok. One swipe at a time, discover your next car.

The goal: Any African can list a car in 5 minutes, and any buyer can find their perfect vehicle through AI-powered discovery and a frictionless, social-media-inspired browsing experience.


Problem

Current State (African Car Market)

  • Fragmented listings: Cars scattered across Facebook groups, WhatsApp, local classifieds
  • Trust issues: No verification, high fraud risk, no escrow
  • Discovery friction: Static listings, no AI-powered search, poor filtering
  • Dealer pain: No professional tools, manual lead management, no analytics
  • Cross-border barriers: Different currencies, no multi-country support

Pain Points

  1. Buyers: Can't find the right car, don't trust listings, tedious search
  2. Sellers: Hard to reach buyers, no tools to manage listings, no insights
  3. Dealers: Lack professional dashboard, lead management, subscription tiers

Solution

YeboCars = TikTok Meets Car Shopping

                    ┌─────────────────┐
                    │    YeboCars     │
                    │                 │
                    │ TikTok Browser  │
                    │ AI Discovery    │
                    │ Dealer Tools    │
                    └────────┬────────┘

       ┌─────────────────────┼─────────────────────┐
       │                     │                     │
       ▼                     ▼                     ▼
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   Buyers    │    │   Dealers   │    │  Private    │
│             │    │             │    │  Sellers    │
│ Swipe cars  │    │ Dashboard   │    │ Quick list  │
│ AI search   │    │ Analytics   │    │ Chat buyers │
│ Chat seller │    │ Lead mgmt   │    │ Track views │
└─────────────┘    └─────────────┘    └─────────────┘

Key differentiators:

  • TikTok-style vertical car browsing
  • AI-powered natural language search ("find me a family SUV under $20k")
  • Multi-country support with local currency display
  • Dealer subscription tiers with premium features
  • In-app messaging and lead management

Core Features

1. TikTok-Style Car Browser

  • Full-screen vertical cards — Swipe through cars like stories
  • Auto-playing media — Images and videos play automatically
  • Quick actions — Like, comment, share, message from card
  • Infinite scroll — Algorithm-driven discovery

2. AI-Powered Search & Discovery

  • Natural language search — "Find me a fuel-efficient sedan under E200,000"
  • Lifestyle quiz — Answer questions, get personalized recommendations
  • Vector embeddings — Semantic search on car models
  • Price insights — AI-driven market positioning ("Below Market", "At Market")

3. Dual Seller Types

  • Dealers — Professional accounts with dashboard, analytics, plans
  • Private Sellers — Individual users listing personal vehicles
  • Both use the same listing flow, different features unlocked

4. Comprehensive Car Listings

  • Make/Model/Year — Seeded database of all major makes/models
  • Rich media — Up to 20 images, videos supported
  • Detailed specs — Fuel type, transmission, mileage, body type, features
  • Pricing — Optional (can list as "Contact for price")
  • Country-aware — Auto-assigns country, displays local currency

5. Dealer Dashboard

  • Car management — List, edit, mark sold
  • Analytics — Views, inquiries, favorites per listing
  • Lead management — Track and respond to inquiries
  • Export — CSV/JSON export of listings
  • Business profile — Hours, website, description

6. Social Interactions

  • Likes — Like cars, view your liked cars
  • Comments — Comment on listings, reply threads
  • Shares — Generate share links with analytics
  • Test drive booking — Schedule directly from listing

7. Messaging System

  • In-app chat — Message sellers/dealers
  • Conversation threads — Full message history
  • Read receipts — Delivered, read status
  • Car context — Link messages to specific listings

8. Notifications & Alerts

  • Price alerts — Notify when car drops to target price
  • New car alerts — Custom filters, notify on new matches
  • Background jobs — Automated alert checking

9. Multi-Country Support

  • Country detection — Auto-detect from phone number or IP
  • Local currency — Display prices in user's currency
  • African currencies — ZAR, NGN, KES, GHS, SZL, and 15+ more
  • Stripe fallback — Charge in USD when local currency unsupported

User Journeys

Journey 1: Buyer Discovers Car via TikTok Browser

1. Opens YeboCars app
2. Lands on TikTok-style browser (default view)
3. Swipes through full-screen car cards
4. Sees a Toyota Camry they like
5. Taps like button → saved to favorites
6. Taps "Contact Dealer" → opens chat
7. Messages dealer about availability
8. Schedules test drive from card
9. Receives confirmation notification

Time: ~2 minutes from browse to test drive booking

Journey 2: Private Seller Lists a Car

1. Opens YeboCars
2. Taps "Sell" or navigates to "Become Seller"
3. If not logged in → Login/Signup flow
4. Phone verification via OTP (WhatsApp)
5. Fills car details:
   - Make/Model/Year (dropdown)
   - Mileage, condition
   - Photos (upload up to 20)
   - Price (optional)
   - Description
6. Submits listing
7. Listing goes live immediately
8. User sees car in "My Cars" section
9. Gets notified when someone views/messages

Time: ~5 minutes

Journey 3: Dealer Upgrades Plan

1. Dealer logs into YeboCars
2. Navigates to Dashboard
3. Sees "Upgrade Plan" prompt
4. Views available plans:
   - Basic: $10/mo - 10 listings
   - Dealer: $25/mo - 50 listings
   - Pro: $60/mo - Unlimited
5. Selects "Dealer" plan
6. Redirected to Stripe checkout
7. Pays in local currency (ZAR)
8. Plan activated, limits increased
9. New features unlocked
1. User taps search/discover
2. Opens Smart Discovery
3. Types: "family SUV under 300000, less than 5 years old"
4. AI parses query:
   - bodyType: SUV
   - maxPrice: 300000
   - minYear: 2021
5. Returns matching cars
6. Shows AI confidence score
7. User browses results
8. Finds match, starts chat

Data Models

User

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
phoneStringYesInternational format (+26878422613)
emailStringNoEmail address
passwordStringYesBcrypt hashed password
nameStringNoDisplay name
avatarStringNoAvatar URL
countryIdStringNoFK to Country
isPhoneVerifiedBooleanYesPhone OTP verified
roleEnumYesuser, dealer, admin
dealerIdStringNoFK to Dealer (if dealer role)
lastLoginDateTimeNoLast login timestamp
createdAtDateTimeYesAccount creation
updatedAtDateTimeYesLast update

Country

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
nameStringYesFull name (e.g., "Eswatini")
codeStringYesISO 3166-1 alpha-2 (SZ)
code3StringYesISO 3166-1 alpha-3 (SWZ)
callingCodeStringYesPhone prefix (+268)
regionStringYesContinent/region
subregionStringNoSub-region
currencyJSONYes
languagesString[]YesSupported languages
flagStringYesFlag emoji or URL
isActiveBooleanYesCountry enabled
isSupportedBooleanYesMarketplace supported

Car

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
makeStringYesToyota, BMW, etc.
modelStringYesCamry, 3 Series, etc.
yearIntYesManufacturing year
priceFloatYesPrice (0 = Contact for price)
mileageFloatYesKilometers/miles driven
fuelTypeEnumYesPetrol, Diesel, Electric, Hybrid
transmissionEnumYesManual, Automatic
bodyTypeStringYesSedan, SUV, Hatchback, etc.
colorStringYesPrimary color
exteriorColorStringNoDetailed exterior
interiorColorStringNoInterior color
descriptionStringNoFree-text description
imagesString[]YesArray of image URLs
videosString[]NoArray of video URLs
featuresString[]NoFeatures list
sellerIdStringYesFK to User
sellerTypeEnumYesdealer, private
conditionEnumYesNew, Used, Certified Pre-Owned
statusEnumYesACTIVE, INACTIVE, SOLD, PENDING, REJECTED
countryIdStringYesFK to Country
mediaProcessingStatusEnumNonone, pending, processing, completed, failed
mediaProcessingDataJSONNoProcessing metadata
createdAtDateTimeYesListing creation
updatedAtDateTimeYesLast update

Indexes: make, model, year, price, mileage, fuelType, transmission, bodyType, sellerId, sellerType, condition, status, countryId, (make, model), (price, year), (status, createdAt)

Dealer

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
nameStringYesBusiness name
emailStringYesBusiness email (unique)
phoneStringYesBusiness phone
locationStringYesPhysical location
businessLicenseStringNoLicense number
typeEnumYesdealer, private
isApprovedBooleanYesAdmin approved
ratingFloatNoAverage rating (1-5)
totalSalesIntYesCompleted sales count
joinedDateDateTimeYesAccount creation
businessHoursJSONNoMap of day → hours
websiteStringNoBusiness website
descriptionStringNoBusiness description
businessPhoneStringNoAlt phone number
countryIdStringYesFK to Country
planStringYesFREE, BASIC, DEALER, PRO
planExpiryDateTimeNoPlan expiration date
stripeCustomerIdStringNoStripe customer ID

CarMake

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
nameStringYesMake name (Toyota)
countryStringYesCountry of origin
isLuxuryBooleanYesPremium brand flag
isActiveBooleanYesActive in system
logoUrlStringNoBrand logo URL

CarModel

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
makeStringYesParent make name
modelStringYesModel name (Camry)
yearIntNoModel year if specific
bodyTypeStringNoDefault body type
isActiveBooleanYesActive in system
imageUrlStringNoModel image URL
specificationsJSONNoNested specs data
embeddingFloat[]NoVector embedding for AI

CarLike

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
carIdStringYesFK to Car
userIdStringYesFK to User
createdAtDateTimeYesLike timestamp

Unique: (carId, userId)

CarComment

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
carIdStringYesFK to Car
userIdStringYesFK to User
commentStringYesComment text
likesIntYesLike count
parentIdStringNoFK to parent comment (replies)
createdAtDateTimeYesComment timestamp

Favorite

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
userIdStringYesFK to User
carIdStringYesFK to Car
createdAtDateTimeYesFavorited timestamp

Unique: (userId, carId)

Inquiry

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
customerIdStringYesFK to User (buyer)
carIdStringYesFK to Car
dealerIdStringYesFK to Dealer
messageStringYesInquiry message
contactMethodEnumYeswhatsapp, phone, email
statusEnumYespending, responded, closed
responseStringNoDealer response
respondedAtDateTimeNoResponse timestamp

TestDrive

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
carIdStringYesFK to Car
userIdStringYesFK to User
dealerIdStringYesFK to Dealer
preferredDateDateTimeYesRequested date
preferredTimeStringYesRequested time
phoneStringYesContact phone
emailStringNoContact email
statusEnumYespending, confirmed, completed, cancelled, no_show
notesStringNoAdditional notes
confirmedDateDateTimeNoConfirmed date
confirmedTimeStringNoConfirmed time

Message

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
senderIdStringYesFK to User
receiverIdStringYesFK to User
contentStringYesMessage content
isReadBooleanYesRead status
messageTypeStringNotext, image, document, mixed
metadataJSONNoAdditional data
readAtDateTimeNoRead timestamp

PriceAlert

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
userIdStringYesFK to User
carIdStringYesFK to Car
targetPriceFloatYesAlert threshold
isActiveBooleanYesAlert enabled

NewCarAlert

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
userIdStringYesFK to User
filtersJSONYesSearch filters
isActiveBooleanYesAlert enabled

DealerApplication

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
dealerIdStringYesFK to Dealer
businessNameStringYesBusiness name
businessAddressStringYesPhysical address
businessPhoneStringYesContact phone
businessEmailStringYesContact email
licenseNumberStringNoBusiness license
taxIdStringNoTax registration
descriptionStringNoBusiness description
statusStringYespending, approved, rejected
reviewedByStringNoAdmin reviewer ID
reviewedAtDateTimeNoReview timestamp
reviewNotesStringNoAdmin notes

DealerReview

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
dealerIdStringYesFK to Dealer
userIdStringYesFK to User
ratingIntYes1-5 stars
reviewStringNoReview text
isAnonymousBooleanYesAnonymous flag

Unique: (dealerId, userId)

Otp

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
whatsappStringYesPhone number
otpStringYes6-digit code
expiresAtDateTimeYesExpiration time
isUsedBooleanYesUsed flag
userIdStringYesTemp user data or user ID

BlogPost

FieldTypeRequiredDescription
idString (CUID)YesUnique identifier
titleStringYesPost title
slugStringYesURL slug (unique)
contentStringYesPost content
excerptStringNoShort excerpt
categoryStringNoPost category
tagsString[]YesTag array
statusStringYespublished, draft
authorStringYesAuthor name
featuredImageStringNoHero image URL
publishedAtDateTimeNoPublish date

API Reference

Base URL

Production: https://api.yebocars.com (planned)
Current: https://bamzu-api-[hash]-uc.a.run.app

Authentication

Most endpoints require Bearer token:

Authorization: Bearer <access_token>

Endpoints

Authentication

MethodEndpointAuthDescription
POST/auth/signupNoRegister (sends OTP)
POST/auth/verify-signupNoComplete registration with OTP
POST/auth/loginNoLogin with phone + password
POST/auth/refresh-tokenNoRefresh access token
POST/auth/forgot-passwordNoRequest password reset OTP
POST/auth/verify-forgot-passwordNoVerify reset OTP
POST/auth/reset-passwordNoSet new password
POST/auth/resend-otpNoResend verification code
GET/auth/meYesGet current user
POST/auth/logoutYesLogout (client-side)
GET/auth/dealer-application-statusYesCheck dealer application

Cars

MethodEndpointAuthDescription
GET/carsNoList cars (paginated, filtered)
GET/cars/:idNoGet car by ID
POST/carsYesCreate car listing
PUT/cars/:idYesUpdate car
DELETE/cars/:idYesDelete car
GET/cars/my-carsYesGet user's cars
GET/cars/makesNoGet available makes
GET/cars/models/:makeNoGet models for make
GET/cars/body-typesNoGet body types
GET/cars/featuresNoGet feature list
GET/cars/templates/:make/:modelNoGet car template
POST/cars/advanced-searchNoAdvanced search
GET/cars/:id/analyticsYesGet car analytics
POST/cars/:id/likeYesLike car
GET/cars/:id/viewsNoGet view count
POST/cars/:id/viewsNoIncrement views
GET/cars/:id/commentsNoGet comments
POST/cars/:id/commentsYesPost comment
POST/cars/:id/shareNoGenerate share link
POST/cars/:id/test-driveYesSchedule test drive
GET/cars/trendingNoGet trending cars
POST/cars/stats/batchNoBatch car stats
POST/cars/likes/batch-statusYesBatch like status
GET/cars/:id/statsNoGet car stats
GET/cars/:id/likesNoGet like count
GET/cars/user/likedYesGet user's liked cars
POST/cars/comments/:commentId/likeYesLike comment
POST/cars/comments/:commentId/replyYesReply to comment

Dealers

MethodEndpointAuthDescription
GET/dealersNoList dealers
GET/dealers/:idNoGet dealer by ID
GET/dealers/:id/carsNoGet dealer's cars
PUT/dealers/:id/approveAdminApprove dealer
GET/dealers/admin/pendingAdminGet pending dealers
GET/dealers/profile/meDealerGet own profile
PUT/dealers/profile/meDealerUpdate profile
GET/dealers/profile/business-hoursDealerGet business hours
PUT/dealers/profile/business-hoursDealerUpdate hours
PUT/dealers/profile/business-infoDealerUpdate business info
GET/dealers/statsDealerGet dashboard stats
GET/dealers/export/carsDealerExport car listings
GET/dealers/:id/reviewsNoGet dealer reviews
POST/dealers/:id/reviewsYesSubmit review

Dealer Applications

MethodEndpointAuthDescription
POST/dealer-applicationsYesSubmit application
GET/dealer-applications/my-applicationsYesGet user's applications
PUT/dealer-applications/:id/approveAdminApprove application
PUT/dealer-applications/:id/rejectAdminReject application

Customers

MethodEndpointAuthDescription
GET/customers/favoritesYesGet favorites
POST/customers/favorites/:carIdYesAdd to favorites
DELETE/customers/favorites/:carIdYesRemove from favorites
POST/customers/inquiriesYesSend inquiry
GET/customers/inquiriesYesGet inquiries

AI

MethodEndpointAuthDescription
POST/ai/generate-listingYesAI-generate description
POST/ai/enhance-descriptionYesEnhance listing
POST/ai/searchNoNatural language search
POST/ai/recommendationsYesLifestyle recommendations
GET/ai/pricing-insights/:carIdYesGet pricing insights

VIN

MethodEndpointAuthDescription
GET/vin/:vinNoVIN lookup

Media

MethodEndpointAuthDescription
POST/media/uploadYesUpload media
DELETE/media/:idYesDelete media

Countries

MethodEndpointAuthDescription
GET/countriesNoList countries
GET/countries/:codeNoGet country by code
GET/countries/supportedNoGet supported countries

Messages

MethodEndpointAuthDescription
GET/messages/conversationsYesGet conversations
GET/messages/:receiverIdYesGet messages with user
POST/messagesYesSend message
PUT/messages/:id/readYesMark as read
GET/messages/unread-countYesGet unread count

Notifications

MethodEndpointAuthDescription
POST/notifications/price-alertYesCreate price alert
GET/notifications/price-alertsYesGet price alerts
DELETE/notifications/price-alert/:idYesDelete price alert
POST/notifications/new-car-alertYesCreate new car alert
GET/notifications/new-car-alertsYesGet new car alerts
PUT/notifications/new-car-alert/:idYesUpdate alert
DELETE/notifications/new-car-alert/:idYesDelete alert

Billing

MethodEndpointAuthDescription
GET/api/billing/plansNoGet subscription plans
POST/api/billing/checkoutYesCreate checkout session
POST/api/billing/webhookNoStripe webhook

Blog

MethodEndpointAuthDescription
GET/api/blog/postsNoList posts
GET/api/blog/posts/:slugNoGet post by slug
POST/api/blog/postsAdminCreate post
PUT/api/blog/posts/:idAdminUpdate post
DELETE/api/blog/posts/:idAdminDelete post

Dashboard

MethodEndpointAuthDescription
GET/api/dashboard/metricsAPI KeyGet CEO metrics

Service Architecture

System Components

┌─────────────────────────────────────────────────────────────┐
│                    YeboCars System                           │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
│  │  React App   │  │   Express    │  │  PostgreSQL  │       │
│  │  (Frontend)  │  │   API        │  │   (Neon)     │       │
│  │              │  │              │  │              │       │
│  │ Vite + TS    │  │ Node.js +    │  │ Via Prisma   │       │
│  │ TailwindCSS  │  │ TypeScript   │  │              │       │
│  └──────────────┘  └──────────────┘  └──────────────┘       │
│         │                 │                 │                │
│         └─────────────────┼─────────────────┘                │
│                           │                                  │
│         ┌─────────────────┼─────────────────┐                │
│         │                 │                 │                │
│         ▼                 ▼                 ▼                │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
│  │   Stripe     │  │  YeboLink    │  │  Google AI   │       │
│  │  Payments    │  │  (OTP/SMS)   │  │   (Gemini)   │       │
│  └──────────────┘  └──────────────┘  └──────────────┘       │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Tech Stack

ComponentTechnology
FrontendReact 18 + TypeScript + Vite
StylingTailwindCSS
IconsLucide React
APIExpress.js + TypeScript
DatabasePostgreSQL (Neon)
ORMPrisma 7.4
AuthJWT (access + refresh tokens)
Passwordsbcrypt (cost 12)
ValidationJoi
PaymentsStripe
OTP/SMSYeboLink (WhatsApp templates)
AIGoogle Gemini
File UploadMulter + S3
HostingCloud Run
CDN/ProxyCloudflare

Service Layers

┌─────────────────────────────────────────────────────────────┐
│                        ROUTES                                │
│  auth.routes.ts, car.routes.ts, dealer.routes.ts, etc.      │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                      CONTROLLERS                             │
│  auth.controller.ts, car.controller.ts, etc.                │
│  - Request validation (Joi schemas)                         │
│  - Route handling                                           │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                       SERVICES                               │
│  auth.service.ts, car.service.ts, ai.service.ts, etc.       │
│  - Business logic                                           │
│  - Data transformation                                      │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                    PRISMA CLIENT                             │
│  - Database operations                                      │
│  - Query building                                           │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│                     POSTGRESQL                               │
│  Neon Serverless                                            │
└─────────────────────────────────────────────────────────────┘

Middleware Stack

  1. Helmet — Security headers
  2. Compression — Response compression
  3. CORS — Cross-origin handling
  4. Rate Limiter — 100 requests/15min default
  5. Body Parser — JSON (10MB limit) + raw for Stripe
  6. Authentication — JWT validation
  7. Country Context — Auto-detect country
  8. Validation — Joi schema validation
  9. Error Handler — Centralized error handling

Authentication

Phone + Password Flow

  1. Signup:

    • User provides phone + password
    • OTP sent via YeboLink (WhatsApp template)
    • User verifies OTP → account created
    • Returns JWT tokens
  2. Login:

    • User provides phone + password
    • Password verified via bcrypt
    • Returns JWT tokens
  3. Token Architecture:

    • Access Token: 15 minutes (configurable)
    • Refresh Token: 30 days
    • Stored in localStorage (client)

Access Token Payload

json
{
  "userId": "cuid123",
  "whatsapp": "+26878422613",
  "role": "user",
  "iat": 1710770000,
  "exp": 1710770900
}

OTP Flow

User requests OTP


Server generates 6-digit code


Code stored in Otp table (10 min expiry)


YeboLink sends WhatsApp template message


User enters OTP


Server validates, marks as used


Action completed (signup/reset)

Billing & Monetization

Subscription Plans

PlanPrice (USD)Listing LimitFeatures
FREE$03Basic listing
BASIC$10/month10Basic analytics
DEALER$25/month50Lead management, featured slots
PRO$60/monthUnlimitedPriority placement, advanced analytics

Currency Localization

  • Display: User sees price in local currency (ZAR, NGN, KES, etc.)
  • Charge: Stripe charges in supported currency or falls back to USD
  • Conversion: Server-side FX rates (approximate, manually updated)

Supported African Currencies

CountryCodeStripe Supported
South AfricaZAR
NigeriaNGN
KenyaKES
GhanaGHS
EgyptEGP
EswatiniSZL✗ (USD fallback)
TanzaniaTZS✗ (USD fallback)
UgandaUGX✗ (USD fallback)
RwandaRWF✗ (USD fallback)
.........

Stripe Integration

  • Mode: Supports test and live modes via STRIPE_MODE env
  • Webhooks: checkout.session.completed updates dealer plan
  • Customer ID: Stored for future payments

Technical Stack

Backend Dependencies

json
{
  "@prisma/client": "^7.4.0",
  "express": "^4.18.2",
  "bcrypt": "^5.1.1",
  "jsonwebtoken": "^9.0.2",
  "joi": "^17.11.0",
  "stripe": "^20.3.1",
  "@google/generative-ai": "^0.24.1",
  "mongoose": "^9.2.1",
  "socket.io": "^4.7.2",
  "multer": "^1.4.5-lts.1",
  "@aws-sdk/client-s3": "^3.872.0"
}

Frontend Dependencies

json
{
  "react": "^18.3.1",
  "react-dom": "^18.3.1",
  "lucide-react": "^0.344.0",
  "vite": "^5.4.2",
  "tailwindcss": "^3.4.1",
  "typescript": "^5.5.3"
}

Environment Variables

Backend:

  • DATABASE_URL — PostgreSQL connection string
  • JWT_ACCESS_SECRET — Access token secret
  • JWT_REFRESH_SECRET — Refresh token secret
  • STRIPE_SECRET_KEY — Stripe API key
  • STRIPE_WEBHOOK_SECRET — Stripe webhook signing secret
  • STRIPE_MODE — test or live
  • GOOGLE_API_KEY — Gemini API key
  • YEBOLINK_API_URL — YeboLink endpoint for OTPs
  • ALLOWED_ORIGINS — CORS whitelist

Gaps & Missing Features

Critical Gaps

  1. YeboID Integration

    • Currently has standalone auth
    • Needs migration to YeboID for unified Yebo identity
    • Phone + PIN auth vs current phone + password
  2. YeboSafe Integration

    • No escrow system
    • No secure payment for P2P transactions
    • Dealers handle payments externally
  3. Media Processing

    • Schema includes mediaProcessingStatus but not fully implemented
    • Image optimization pipeline incomplete
    • No video transcoding
  4. Real-time Features

    • WebSocket service exists but underutilized
    • Chat could use real-time updates
    • No live typing indicators
  5. Mobile Apps

    • Web-only currently
    • No React Native app
    • PWA not configured

Feature Gaps

  1. Advanced Search

    • Vector search for car models seeded but not production-ready
    • Voyage AI service referenced but not active
    • Embedding generation incomplete
  2. Notifications

    • Price/new car alerts exist but background jobs need scheduling
    • No push notifications (web/mobile)
    • No email notifications
  3. Analytics

    • Basic view tracking
    • No conversion tracking
    • No A/B testing infrastructure
  4. Localization

    • Multi-currency display works
    • No multi-language support
    • Content all in English
  5. Admin Dashboard

    • Basic approval flows
    • No comprehensive admin panel
    • No moderation tools
  6. Verification

    • No YeboVerify integration
    • No seller verification badges
    • Trust system incomplete

Technical Debt

  1. Mixed ORM Usage

    • Some code references Mongoose (legacy)
    • Should be fully Prisma
    • @ts-nocheck in multiple services
  2. Error Handling

    • Inconsistent error responses
    • Some services throw generic errors
    • Need standardized error codes
  3. Testing

    • Jest configured but few tests
    • No integration tests
    • No E2E tests
  4. Documentation

    • Swagger docs exist but incomplete
    • No API versioning implemented
    • README outdated

Roadmap

Phase 1: Stabilization (Q1 2026)

  • [x] Prisma migration from Mongoose
  • [x] Multi-country support
  • [x] Stripe billing integration
  • [ ] Complete ORM migration (remove Mongoose refs)
  • [ ] Add comprehensive tests
  • [ ] Production deployment (yebocars.com)

Phase 2: YeboID Integration (Q2 2026)

  • [ ] Migrate to YeboID authentication
  • [ ] Phone + PIN auth
  • [ ] User consolidation from Bamzu
  • [ ] Unified profile with Yebo ecosystem

Phase 3: Trust & Safety (Q2-Q3 2026)

  • [ ] YeboVerify integration
  • [ ] Seller verification badges
  • [ ] Fraud detection
  • [ ] Reporting system

Phase 4: YeboSafe Integration (Q3 2026)

  • [ ] Escrow for P2P transactions
  • [ ] Mobile money integration
  • [ ] Secure checkout flow

Phase 5: Mobile & Scale (Q4 2026)

  • [ ] React Native mobile app
  • [ ] PWA configuration
  • [ ] Push notifications
  • [ ] Performance optimization

Phase 6: AI Enhancement (2027)

  • [ ] Production vector search
  • [ ] AI car valuations
  • [ ] Personalized recommendations
  • [ ] Chatbot assistant

Appendix

Database Schema Visualization

┌──────────┐     ┌──────────┐     ┌──────────┐
│   User   │────▶│   Car    │◀────│  Dealer  │
└────┬─────┘     └────┬─────┘     └────┬─────┘
     │                │                │
     │                │                │
     ▼                ▼                ▼
┌──────────┐    ┌──────────┐    ┌──────────┐
│ Favorite │    │  CarLike │    │ Inquiry  │
│ CarView  │    │CarComment│    │TestDrive │
│ Message  │    │ CarShare │    │ Review   │
│PriceAlert│    │Analytics │    │Application│
└──────────┘    └──────────┘    └──────────┘



┌──────────┐
│ Country  │
│ CarMake  │
│ CarModel │
│   Otp    │
│ BlogPost │
└──────────┘

Example API Response

GET /cars

json
{
  "success": true,
  "data": [
    {
      "_id": "clm1234567890",
      "make": "Toyota",
      "model": "Camry",
      "year": 2022,
      "price": 450000,
      "mileage": 25000,
      "fuelType": "Petrol",
      "transmission": "Automatic",
      "bodyType": "Sedan",
      "color": "White",
      "description": "Well-maintained...",
      "images": ["https://..."],
      "features": ["Air Conditioning", "Bluetooth"],
      "sellerId": "clm0987654321",
      "sellerType": "dealer",
      "sellerName": "AutoWorld",
      "condition": "Used",
      "status": "active",
      "currency": { "code": "SZL", "symbol": "L", "name": "Swazi Lilangeni" },
      "formattedPrice": "L450,000",
      "countryId": "clm_sz_country",
      "createdAt": "2026-02-20T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 156,
    "pages": 16
  }
}

Document Version: 1.0
Last Updated: March 19, 2026
Author: Yebo Product Team

One chat. Everything done.