Skip to content

YeboNa PRD ​

China-Africa Trade & Sourcing Platform ​

Product: YeboNa
Tagline: "Import with Confidence"
Last Updated: 2026-03-19
Status: In Development (MVP Complete)


1. Vision & Problem Statement ​

The Problem ​

African entrepreneurs and businesses face massive friction when importing goods from China:

  1. Trust Deficit — No way to verify Chinese suppliers, sourcing agents, or freight forwarders
  2. Payment Risk — Sending money overseas with no recourse if supplier disappears
  3. Information Asymmetry — Hidden fees, fake quotes, and no price transparency
  4. Language Barriers — Communication breakdowns lead to wrong products, missed deadlines
  5. Currency Complexity — Converting ZAR/NGN/KES to CNY/USD is expensive and confusing
  6. Fragmented Services — Need separate contacts for sourcing, shipping, customs, exchange

The Vision ​

YeboNa is a trusted marketplace connecting African buyers with verified Chinese suppliers and service providers—with escrow protection, transparent pricing, and end-to-end tracking.

Think "Alibaba + Upwork + Escrow.com" purpose-built for China-Africa trade.

Target Markets ​

  • Primary: Nigeria, South Africa, Kenya, Ghana, Tanzania
  • Secondary: Uganda, Rwanda, Ethiopia, Senegal, Côte d'Ivoire, Eswatini
  • Supplier Side: China (Guangzhou, Yiwu, Shenzhen)

2. Solution Overview ​

Core Value Propositions ​

For African BuyersFor Chinese Suppliers/Agents
Find verified providersAccess African buyer demand
Escrow-protected paymentsGet paid reliably
Compare quotes transparentlyBuild reputation via reviews
Track orders end-to-endExpand market reach
Multi-language supportReduce payment friction

Service Categories (Implemented) ​

typescript
type ServiceCategory = 
  | 'sourcing'      // Product sourcing & factory finding
  | 'freight'       // Shipping & logistics
  | 'exchange'      // Currency exchange (CNY↔USD↔local)
  | 'inspection'    // Quality inspection
  | 'customs'       // Customs clearance
  | 'translation'   // Translation & negotiation
  | 'verification'  // Supplier verification
  | 'other';

3. Core Features (Implemented) ​

3.1 User Accounts & Authentication ​

  • Phone-based signup with OTP verification (WhatsApp/SMS via YeboLink)
  • Password authentication with secure hashing (bcrypt)
  • JWT access tokens (15-minute expiry) with refresh token rotation (30-day)
  • Multi-country support: China, Nigeria, South Africa, Kenya, Ghana, Tanzania, Uganda, Eswatini + 15 more African countries
  • User types: buyer (default), provider, both
  • Verification levels: unverified, phone_verified, id_verified, fully_verified

3.2 Provider Profiles & Services ​

  • Provider registration with business name, bio, location, languages
  • Service catalog: Each provider can offer multiple services across categories
  • Pricing models: Fixed price, per-unit, hourly, custom quote
  • Rating system: Overall + breakdown (communication, quality, value, timeliness)
  • Provider status: pending, active, suspended, inactive

3.3 Service Requests (RFQ System) ​

  • Request creation: Category, title, description, attachments, budget range, timeline
  • Request lifecycle: open → quoted → in_progress → completed / cancelled / expired
  • Targeted requests: Can specify specific providers to quote
  • Auto-expiry: Requests expire after configurable period

3.4 Quote Management ​

  • Quote submission: Amount, currency, description, deliverables, timeline, validity
  • Quote status: pending → accepted / declined / expired
  • Single quote per provider per request (no spam)
  • Quote comparison: Buyers see all quotes with provider ratings

3.5 Escrow Transactions ​

  • Transaction creation: Automatically created when quote accepted
  • Platform fee: 5% of transaction amount (configurable)
  • Transaction states:
    pending_payment → payment_received → in_progress → completed → released
                                                    ↘ disputed → refunded
  • Proof uploads: Payment proof, completion proof (URLs stored)
  • Dispute handling: Either party can open dispute, admin resolves

3.6 Messaging System ​

  • 1:1 conversations between buyers and providers
  • Request-linked chats: Conversations tied to specific requests
  • Message types: text, image, file, system, quote, payment
  • Read receipts: Track message read status
  • Conversation search: Find by participant

3.7 Reviews & Ratings ​

  • Bidirectional reviews: Users review providers, providers review users
  • 5-star rating with breakdown categories
  • Photo attachments on reviews
  • Provider response: Providers can respond to reviews
  • Rating aggregation: Automatic recalculation on new reviews

3.8 Waitlist & Pre-launch ​

  • Waitlist signup: Name, phone, interest, country, source tracking
  • Status management: pending, approved, invited, registered
  • Email notifications: New signup alerts to admin
  • CEO Dashboard integration: Waitlist data accessible via API

3.9 Blog/Content System ​

  • Blog posts: Title, slug, content, excerpt, category, tags
  • AI-powered: Integrated with autoblogger for content generation
  • SEO-ready: Slugs, meta descriptions, featured images

4. User Journeys ​

4.1 African Buyer Journey ​

1. DISCOVERY
   └─ Lands on yebona.com → Sees value prop & providers
   
2. SIGNUP
   └─ Enter phone → Receive OTP → Create password → Verify
   
3. POST REQUEST
   └─ Select category → Describe need → Set budget → Submit
   
4. COMPARE QUOTES
   └─ Receive quotes → View provider profiles → Compare prices
   
5. ACCEPT & PAY
   └─ Accept quote → Transaction created → Make payment (escrow)
   
6. TRACK & COMMUNICATE
   └─ Message provider → Track progress → Receive updates
   
7. CONFIRM & REVIEW
   └─ Confirm delivery → Release payment → Leave review

4.2 Chinese Supplier/Agent Journey ​

1. REGISTER
   └─ Signup → Complete provider profile → Add services
   
2. BROWSE REQUESTS
   └─ View open requests → Filter by category → Find opportunities
   
3. SUBMIT QUOTES
   └─ Create detailed quote → Set price & timeline → Submit
   
4. WIN & DELIVER
   └─ Quote accepted → Payment confirmed → Start work
   
5. COMPLETE & GET PAID
   └─ Submit deliverables → Buyer confirms → Receive payout
   
6. BUILD REPUTATION
   └─ Receive reviews → Improve ratings → Attract more business

4.3 Admin Journey (via CEO Dashboard) ​

1. MONITOR
   └─ View waitlist signups → Track provider applications
   
2. MANAGE
   └─ Verify providers → Resolve disputes → Process payouts
   
3. ANALYZE
   └─ Review transaction metrics → Monitor GMV → Track growth

5. Data Models (Complete Schema) ​

5.1 Users Table ​

sql
CREATE TABLE users (
  id              VARCHAR(50) PRIMARY KEY,       -- 'usr_1234567890'
  phone_number    VARCHAR(20) UNIQUE NOT NULL,
  password_hash   VARCHAR(255) NOT NULL,
  email           VARCHAR(255),
  name            VARCHAR(255),
  avatar_url      TEXT,
  country         VARCHAR(100),
  country_code    VARCHAR(10),                   -- 'NG', 'ZA', 'KE'
  user_type       VARCHAR(20) DEFAULT 'buyer',   -- buyer, provider, both
  verification_level VARCHAR(20) DEFAULT 'phone_verified',
  language        VARCHAR(10) DEFAULT 'en',
  currency        VARCHAR(10) DEFAULT 'USD',
  created_at      TIMESTAMP DEFAULT NOW(),
  updated_at      TIMESTAMP DEFAULT NOW()
);

5.2 Refresh Tokens Table ​

sql
CREATE TABLE refresh_tokens (
  token           VARCHAR(255) PRIMARY KEY,      -- Cryptographic random
  user_id         VARCHAR(50) REFERENCES users(id),
  phone_number    VARCHAR(20) NOT NULL,
  expires_at      TIMESTAMP NOT NULL,            -- 30 days from creation
  created_at      TIMESTAMP DEFAULT NOW()
);

5.3 Providers Table ​

sql
CREATE TABLE providers (
  id                   VARCHAR(50) PRIMARY KEY,  -- 'prov_1234567890'
  user_id              VARCHAR(50) REFERENCES users(id),
  business_name        VARCHAR(255),
  bio                  TEXT,
  city                 VARCHAR(100),
  country              VARCHAR(100),
  languages            TEXT[],                    -- Array of language codes
  response_time_mins   INTEGER,
  rating               DECIMAL(3,2) DEFAULT 0,
  review_count         INTEGER DEFAULT 0,
  rating_communication DECIMAL(3,2) DEFAULT 0,
  rating_quality       DECIMAL(3,2) DEFAULT 0,
  rating_value         DECIMAL(3,2) DEFAULT 0,
  rating_timeliness    DECIMAL(3,2) DEFAULT 0,
  status               VARCHAR(20) DEFAULT 'pending', -- pending, active, suspended
  verified_at          TIMESTAMP,
  created_at           TIMESTAMP DEFAULT NOW(),
  updated_at           TIMESTAMP DEFAULT NOW()
);

5.4 Provider Services Table ​

sql
CREATE TABLE provider_services (
  id              VARCHAR(50) PRIMARY KEY,       -- 'svc_1234567890_abc123'
  provider_id     VARCHAR(50) REFERENCES providers(id),
  category        VARCHAR(50) NOT NULL,          -- ServiceCategory enum
  description     TEXT,
  starting_price  DECIMAL(15,2),
  currency        VARCHAR(10) DEFAULT 'USD',
  price_unit      VARCHAR(20) DEFAULT 'fixed',   -- fixed, per_unit, hourly
  created_at      TIMESTAMP DEFAULT NOW(),
  updated_at      TIMESTAMP DEFAULT NOW()
);

5.5 Requests Table ​

sql
CREATE TABLE requests (
  id              VARCHAR(50) PRIMARY KEY,       -- 'req_1234567890'
  user_id         VARCHAR(50) REFERENCES users(id),
  category        VARCHAR(50) NOT NULL,
  title           VARCHAR(255) NOT NULL,
  description     TEXT NOT NULL,
  attachments     TEXT[],                        -- Array of URLs
  budget_min      DECIMAL(15,2),
  budget_max      DECIMAL(15,2),
  budget_currency VARCHAR(10) DEFAULT 'USD',
  timeline        VARCHAR(100),
  target_providers TEXT[],                       -- Specific provider IDs
  status          VARCHAR(20) DEFAULT 'open',    -- open, quoted, in_progress, completed, cancelled, expired
  expires_at      TIMESTAMP,
  created_at      TIMESTAMP DEFAULT NOW(),
  updated_at      TIMESTAMP DEFAULT NOW()
);

5.6 Quotes Table ​

sql
CREATE TABLE quotes (
  id              VARCHAR(50) PRIMARY KEY,       -- 'quote_1234567890'
  request_id      VARCHAR(50) REFERENCES requests(id),
  provider_id     VARCHAR(50) REFERENCES providers(id),
  amount          DECIMAL(15,2) NOT NULL,
  currency        VARCHAR(10) DEFAULT 'USD',
  description     TEXT,
  deliverables    TEXT[],                        -- Array of deliverable strings
  timeline        VARCHAR(100),
  valid_until     TIMESTAMP,
  status          VARCHAR(20) DEFAULT 'pending', -- pending, accepted, declined, expired
  created_at      TIMESTAMP DEFAULT NOW(),
  updated_at      TIMESTAMP DEFAULT NOW()
);

5.7 Transactions Table ​

sql
CREATE TABLE transactions (
  id                   VARCHAR(50) PRIMARY KEY,  -- 'txn_1234567890'
  quote_id             VARCHAR(50) REFERENCES quotes(id),
  request_id           VARCHAR(50) REFERENCES requests(id),
  user_id              VARCHAR(50) REFERENCES users(id),
  provider_id          VARCHAR(50) REFERENCES providers(id),
  amount               DECIMAL(15,2) NOT NULL,
  currency             VARCHAR(10) DEFAULT 'USD',
  fee                  DECIMAL(15,2),             -- Platform fee (5%)
  provider_payout      DECIMAL(15,2),             -- Amount - Fee
  status               VARCHAR(20) DEFAULT 'pending_payment',
  -- pending_payment, payment_received, in_progress, completed, released, disputed, refunded
  payment_proof_url    TEXT,
  completion_proof_url TEXT,
  paid_at              TIMESTAMP,
  completed_at         TIMESTAMP,
  released_at          TIMESTAMP,
  created_at           TIMESTAMP DEFAULT NOW(),
  updated_at           TIMESTAMP DEFAULT NOW()
);

5.8 Conversations Table ​

sql
CREATE TABLE conversations (
  id               VARCHAR(50) PRIMARY KEY,      -- 'conv_1234567890'
  participant_1_id VARCHAR(50) REFERENCES users(id),
  participant_2_id VARCHAR(50) REFERENCES users(id),
  request_id       VARCHAR(50) REFERENCES requests(id),
  transaction_id   VARCHAR(50) REFERENCES transactions(id),
  last_message_at  TIMESTAMP,
  created_at       TIMESTAMP DEFAULT NOW(),
  updated_at       TIMESTAMP DEFAULT NOW()
);

5.9 Messages Table ​

sql
CREATE TABLE messages (
  id              VARCHAR(50) PRIMARY KEY,       -- 'msg_1234567890_abc123'
  conversation_id VARCHAR(50) REFERENCES conversations(id),
  sender_id       VARCHAR(50) REFERENCES users(id),
  message_type    VARCHAR(20) DEFAULT 'text',    -- text, image, file, system, quote, payment
  content         TEXT NOT NULL,
  metadata        JSONB,                         -- For structured data (file info, etc.)
  read_at         TIMESTAMP,
  created_at      TIMESTAMP DEFAULT NOW()
);

5.10 Reviews Table ​

sql
CREATE TABLE reviews (
  id                   VARCHAR(50) PRIMARY KEY,  -- 'review_1234567890'
  transaction_id       VARCHAR(50) REFERENCES transactions(id),
  reviewer_id          VARCHAR(50) REFERENCES users(id),
  reviewee_id          VARCHAR(50) REFERENCES users(id),
  review_type          VARCHAR(20) NOT NULL,     -- user_to_provider, provider_to_user
  rating               DECIMAL(2,1) NOT NULL,    -- 1.0 - 5.0
  rating_communication DECIMAL(2,1),
  rating_quality       DECIMAL(2,1),
  rating_value         DECIMAL(2,1),
  rating_timeliness    DECIMAL(2,1),
  text                 TEXT NOT NULL,            -- Min 20 chars
  photos               TEXT[],
  response             TEXT,                     -- Provider's response
  created_at           TIMESTAMP DEFAULT NOW(),
  updated_at           TIMESTAMP DEFAULT NOW()
);

5.11 Waitlist Table ​

sql
CREATE TABLE waitlist (
  id          VARCHAR(50) PRIMARY KEY,           -- 'wl_1234567890_abc123'
  name        VARCHAR(255) NOT NULL,
  phone       VARCHAR(20) NOT NULL,
  interest    VARCHAR(50) DEFAULT 'all',         -- all, sourcing, freight, exchange
  product     VARCHAR(50) DEFAULT 'yebona',
  source      VARCHAR(50) DEFAULT 'website',     -- website, referral, social
  status      VARCHAR(20) DEFAULT 'pending',     -- pending, approved, invited, registered
  notes       TEXT,
  country     VARCHAR(100),
  created_at  TIMESTAMP DEFAULT NOW(),
  updated_at  TIMESTAMP DEFAULT NOW(),
  UNIQUE(phone, product)
);

5.12 Blog Posts Table ​

sql
CREATE TABLE blog_posts (
  id              SERIAL PRIMARY KEY,
  title           VARCHAR(500) NOT NULL,
  slug            VARCHAR(500) UNIQUE NOT NULL,
  content         TEXT NOT NULL,
  excerpt         TEXT,
  category        VARCHAR(100),
  tags            TEXT[],
  status          VARCHAR(20) DEFAULT 'published',  -- draft, published
  author          VARCHAR(100) DEFAULT 'AI',
  featured_image  TEXT,
  published_at    TIMESTAMP DEFAULT NOW(),
  created_at      TIMESTAMP DEFAULT NOW(),
  updated_at      TIMESTAMP DEFAULT NOW()
);

6. API Reference (Complete) ​

6.1 Authentication ​

MethodEndpointDescriptionAuth
POST/api/auth/send-verification-codeSend OTP to phoneNone
POST/api/auth/signupVerify OTP & create accountNone
POST/api/auth/loginLogin with phone/passwordNone
POST/api/auth/refreshRefresh access tokenRefreshToken
POST/api/auth/logoutLogout (revoke refresh token)JWT
POST/api/auth/logout-allLogout all devicesJWT
GET/api/auth/meGet current userJWT

Request/Response Examples ​

typescript
// POST /api/auth/send-verification-code
Request: { phoneNumber: "+2347012345678" }
Response: { success: true, message: "Code sent", otp?: "123456" /* dev only */ }

// POST /api/auth/signup
Request: { phoneNumber: "+2347012345678", otp: "123456", password: "secret123", name: "John Doe" }
Response: { 
  success: true, 
  data: { 
    accessToken: "eyJ...", 
    refreshToken: "abc123...", 
    user: { id, phoneNumber, name, ... } 
  } 
}

// POST /api/auth/login
Request: { phoneNumber: "+2347012345678", password: "secret123" }
Response: { success: true, data: { accessToken, refreshToken, user } }

// POST /api/auth/refresh
Request: { refreshToken: "abc123..." }
Response: { success: true, data: { accessToken, refreshToken } }

6.2 Users ​

MethodEndpointDescriptionAuth
GET/api/users/meGet profileJWT
PATCH/api/users/meUpdate profileJWT
typescript
// PATCH /api/users/me
Request: { name: "John Doe", country: "Nigeria", language: "en", currency: "NGN" }
Response: { success: true, data: { user: { ... } } }

6.3 Providers ​

MethodEndpointDescriptionAuth
GET/api/providersList providers with filtersOptional
GET/api/providers/:idGet provider detailsOptional
POST/api/providersRegister as providerJWT
PATCH/api/providers/meUpdate provider profileJWT
POST/api/providers/me/servicesAdd serviceJWT
DELETE/api/providers/me/services/:serviceIdRemove serviceJWT
typescript
// GET /api/providers?category=sourcing&country=China&minRating=4.0&limit=20
Response: {
  success: true,
  data: [{
    id: "prov_123",
    businessName: "TradeLink Asia",
    bio: "Professional sourcing agent...",
    rating: 4.8,
    reviewCount: 189,
    services: [{ category: "sourcing", startingPrice: 100, currency: "USD" }],
    user: { name: "Zhang Wei", verificationLevel: "fully_verified" }
  }],
  total: 45
}

// POST /api/providers
Request: {
  businessName: "My Trading Co",
  bio: "Experienced sourcing agent",
  city: "Guangzhou",
  country: "China",
  languages: ["en", "zh"],
  services: [{ category: "sourcing", description: "Factory finding", startingPrice: 100 }]
}

6.4 Requests ​

MethodEndpointDescriptionAuth
POST/api/requestsCreate requestJWT
GET/api/requestsGet my requestsJWT
GET/api/requests/:idGet request detailsJWT
GET/api/requests/openBrowse open requests (for providers)Optional
PATCH/api/requests/:id/statusUpdate statusJWT
typescript
// POST /api/requests
Request: {
  category: "sourcing",
  title: "Need supplier for phone cases",
  description: "Looking for manufacturer of silicone phone cases...",
  attachments: ["https://..."],
  budgetMin: 500,
  budgetMax: 2000,
  budgetCurrency: "USD",
  timeline: "2 weeks"
}
Response: { success: true, data: { id: "req_123", status: "open", ... } }

6.5 Quotes ​

MethodEndpointDescriptionAuth
POST/api/requests/:requestId/quotesSubmit quoteJWT (Provider)
GET/api/quotes/myGet my quotesJWT (Provider)
POST/api/quotes/:id/acceptAccept quoteJWT (Request Owner)
POST/api/quotes/:id/declineDecline quoteJWT (Request Owner)
POST/api/quotes/:id/withdrawWithdraw quoteJWT (Provider)
typescript
// POST /api/requests/:requestId/quotes
Request: {
  amount: 800,
  currency: "USD",
  description: "I can find 3 qualified suppliers...",
  deliverables: ["3 supplier quotes", "Sample negotiation", "Factory visit"],
  timeline: "5 days",
  validUntil: "2026-04-01"
}

6.6 Transactions ​

MethodEndpointDescriptionAuth
GET/api/transactionsGet my transactionsJWT
GET/api/transactions/:idGet transaction detailsJWT
POST/api/transactions/:id/confirm-paymentConfirm payment madeJWT (Buyer)
POST/api/transactions/:id/start-workMark work startedJWT (Provider)
POST/api/transactions/:id/completeMark work completeJWT (Provider)
POST/api/transactions/:id/releaseRelease paymentJWT (Buyer)
POST/api/transactions/:id/disputeOpen disputeJWT
typescript
// Transaction Flow
1. Quote accepted → Transaction created (pending_payment)
2. Buyer pays → POST /confirm-payment (payment_received)
3. Provider starts → POST /start-work (in_progress)
4. Provider finishes → POST /complete (completed)
5. Buyer confirms → POST /release (released) → Payout to provider

6.7 Conversations & Messages ​

MethodEndpointDescriptionAuth
GET/api/conversationsGet my conversationsJWT
POST/api/conversationsCreate/get conversationJWT
GET/api/conversations/:id/messagesGet messagesJWT
POST/api/conversations/:id/messagesSend messageJWT

6.8 Reviews ​

MethodEndpointDescriptionAuth
POST/api/transactions/:transactionId/reviewsSubmit reviewJWT
GET/api/providers/:providerId/reviewsGet provider reviewsOptional

6.9 Waitlist (Admin API) ​

MethodEndpointDescriptionAuth
POST/api/waitlistJoin waitlistNone
GET/api/waitlistList entriesAPI Key
PATCH/api/waitlist/:idUpdate entryAPI Key
DELETE/api/waitlist/:idDelete entryAPI Key

6.10 Blog ​

MethodEndpointDescriptionAuth
GET/api/blog/postsList published postsNone
GET/api/blog/posts/:slugGet post by slugNone
POST/api/blog/postsCreate postAPI Key

7. Service Architecture ​

7.1 System Overview ​

┌─────────────────────────────────────────────────────────────────┐
│                         CLIENTS                                  │
├──────────────────┬──────────────────┬───────────────────────────┤
│   Expo App       │   Landing Page   │   CEO Dashboard           │
│   (iOS/Android)  │   (React/Vite)   │   (waitlist/admin)        │
└────────┬─────────┴────────┬─────────┴───────────┬───────────────┘
         │                  │                     │
         ▼                  ▼                     ▼
┌─────────────────────────────────────────────────────────────────┐
│                    YEBONA API (Cloud Run)                        │
│   Express.js + TypeScript                                        │
│   ├── Routes (auth, providers, requests, quotes, transactions)  │
│   ├── Controllers (business logic)                               │
│   ├── Services (database, email, whatsapp)                       │
│   └── Middleware (auth, validation)                              │
└────────────────────────────┬────────────────────────────────────┘
                             │
         ┌───────────────────┼───────────────────┐
         ▼                   ▼                   ▼
┌────────────────┐  ┌────────────────┐  ┌────────────────┐
│   Neon DB      │  │   YeboLink     │  │   Resend       │
│   (Postgres)   │  │   (SMS/WA)     │  │   (Email)      │
└────────────────┘  └────────────────┘  └────────────────┘

7.2 Tech Stack ​

LayerTechnologyPurpose
Mobile AppExpo/React NativeCross-platform mobile app
APIExpress.js + TypeScriptREST API server
DatabaseNeon (Serverless Postgres)Primary data store
AuthCustom JWT + Refresh TokensAuthentication
SMS/WhatsAppYeboLink (via Swychr)OTP delivery, notifications
EmailResendEmail notifications
HostingGoogle Cloud RunServerless containers
State MgmtZustandMobile app state
HTTP ClientAxiosAPI calls with interceptors

7.3 External Integrations ​

ServicePurposeStatus
YeboLink APISend OTP codes via WhatsApp/SMS✅ Implemented
ResendEmail notifications (waitlist alerts)✅ Implemented
CEO DashboardAdmin access to waitlist data✅ Implemented

8. Authentication & Authorization ​

8.1 Authentication Flow ​

1. User enters phone number
2. Backend generates 6-digit OTP
3. OTP sent via YeboLink (WhatsApp preferred, SMS fallback)
4. User enters OTP + password
5. Backend verifies OTP, creates user, returns tokens
6. Access token (15 min) + Refresh token (30 days)
7. App stores tokens securely (SecureStore on mobile, localStorage on web)
8. Axios interceptor auto-refreshes on 401

8.2 Token Management ​

typescript
// Access Token (short-lived, stateless)
{
  userId: "usr_123",
  phoneNumber: "+2347012345678",
  type: "access",
  exp: 1679529600000,  // 15 minutes
  iat: 1679528700000
}

// Refresh Token (long-lived, stored in DB)
// Cryptographically random string stored in refresh_tokens table
// Can be revoked individually or all at once

8.3 Authorization Rules ​

ResourceBuyerProviderAdmin
Create request✅✅✅
Submit quote❌✅❌
Accept quote✅ (own)❌❌
Release payment✅ (own)❌❌
Mark complete❌✅ (own)❌
View transactions✅ (own)✅ (own)✅
Manage waitlist❌❌✅ (API key)

9. Payment & Escrow System ​

9.1 Current Implementation ​

The escrow system is logically implemented but payment processing is manual:

1. Quote accepted → Transaction created (pending_payment)
2. Buyer pays provider directly (bank transfer, mobile money, etc.)
3. Buyer confirms payment in app → (payment_received)
4. Provider delivers service
5. Provider marks complete → (completed)
6. Buyer releases → (released)
7. Platform takes 5% fee (tracked, not auto-collected)

9.2 Fee Structure ​

typescript
const PLATFORM_FEE_PERCENT = 0.05; // 5%

// On transaction creation:
fee = amount * PLATFORM_FEE_PERCENT;
providerPayout = amount - fee;

// Example: $1000 transaction
// Fee: $50
// Provider receives: $950

9.3 Dispute Resolution ​

  • Either party can open dispute with reason
  • Transaction status becomes disputed
  • Admin notified via logging (no automated resolution yet)
  • Manual resolution: refund or release

10. Logistics & Shipping ​

10.1 Current Implementation ​

Shipping/freight is handled as a service category—providers offer freight services, and the marketplace facilitates matching.

NOT YET IMPLEMENTED:

  • Real-time shipment tracking
  • Automated freight quotes
  • Integration with shipping carriers
  • Container/shipping cost calculators

10.2 Provider Capabilities ​

Freight providers can offer:

  • Sea freight (FCL/LCL)
  • Air freight
  • Door-to-door delivery
  • Customs clearance
  • Warehousing

11. Translation & Localization ​

11.1 Current Implementation ​

  • App Language: English (hardcoded)
  • User Language Preference: Stored in users.language but not used
  • Provider Languages: Array of language codes (['en', 'zh', 'fr'])

11.2 Translation as a Service ​

Translation is offered as a service category (translation)—providers offer translation/negotiation services.

NOT YET IMPLEMENTED:

  • In-app translation
  • Auto-translate messages
  • Multi-language UI

12. Notifications ​

12.1 Implemented Channels ​

ChannelImplementationUse Case
WhatsAppYeboLink APIOTP, critical alerts
SMSYeboLink API (fallback)OTP when WhatsApp fails
EmailResendWaitlist notifications

12.2 Notification Types ​

typescript
// Implemented in whatsappService.ts
sendVerificationCodeMessage()     // OTP
sendPasswordResetCode()           // Password reset
sendNewMatchNotification()        // (legacy from dating app, unused)
sendNewMessageNotification()      // New message alert
sendRequestAcceptedNotification() // Quote accepted
sendNewRequestNotification()      // New request for provider
sendServiceCompletedNotification() // Work marked complete
sendVerificationApprovedNotification() // Provider verified
sendVerificationRejectedNotification() // Verification failed

12.3 NOT YET IMPLEMENTED ​

  • Push notifications (mobile)
  • In-app notification center
  • Email notifications for transactions
  • SMS notifications for transaction updates

13. Technical Stack Details ​

13.1 Backend Dependencies ​

json
{
  "express": "^4.18.2",
  "typescript": "^5.3.3",
  "@neondatabase/serverless": "^0.10.6",
  "bcryptjs": "^2.4.3",
  "resend": "^2.1.0",
  "cors": "^2.8.5",
  "dotenv": "^16.4.1"
}

13.2 Mobile App Dependencies ​

json
{
  "expo": "~54.0.33",
  "expo-router": "~6.0.23",
  "expo-secure-store": "^15.0.8",
  "axios": "^1.13.5",
  "zustand": "^5.0.11",
  "react-hook-form": "^7.71.1",
  "zod": "^4.3.6",
  "@tanstack/react-query": "^5.90.21",
  "expo-linear-gradient": "^15.0.8"
}

13.3 Infrastructure ​

ComponentServiceRegion
APIGoogle Cloud Runeurope-west1
DatabaseNeon Postgreseu-central-1
Domainapi.yebona.comCloudflare

14. Roadmap ​

Phase 1: MVP (COMPLETE) ✅ ​

  • [x] User registration/auth with OTP
  • [x] Provider profiles & services
  • [x] Request/quote system
  • [x] Transaction/escrow flow
  • [x] Messaging system
  • [x] Reviews & ratings
  • [x] Waitlist
  • [x] Blog CMS
  • [x] Mobile app (Expo)

Phase 2: Payment Integration (NEXT) ​

  • [ ] Stripe Connect for escrow
  • [ ] Multi-currency support (USD, CNY, NGN, ZAR, KES)
  • [ ] Automatic payouts to providers
  • [ ] Payment method management
  • [ ] Currency exchange integration

Phase 3: Enhanced Discovery ​

  • [ ] AI-powered provider matching
  • [ ] Product search (image-based)
  • [ ] Verified supplier database
  • [ ] Price comparison tools
  • [ ] Market intelligence

Phase 4: Logistics & Tracking ​

  • [ ] Shipping carrier integrations
  • [ ] Real-time tracking
  • [ ] Automated freight quotes
  • [ ] Container calculator
  • [ ] Customs documentation

Phase 5: Scale & Localization ​

  • [ ] Multi-language UI (Chinese, French, Portuguese)
  • [ ] In-app translation
  • [ ] Push notifications
  • [ ] Provider mobile app
  • [ ] White-label for enterprises

15. Gaps & Needed Features ​

15.1 Critical Missing (Phase 2) ​

FeaturePriorityEffortNotes
Stripe/Payment IntegrationP0HighCurrently manual payments
Provider Verification FlowP0MediumManual approval only
Currency Exchange RatesP0MediumNeeded for multi-currency
File UploadP0MediumNo media storage (URLs only)
Push NotificationsP0MediumNo mobile push yet

15.2 Important Missing (Phase 3) ​

FeaturePriorityEffortNotes
Admin DashboardP1HighUsing CEO dashboard proxy
Provider AnalyticsP1MediumNo dashboard for providers
Order TrackingP1HighNo shipment integration
Search/Filter ImprovementsP1MediumBasic filtering only
Rate LimitingP1LowNo API rate limits

15.3 Nice to Have (Phase 4+) ​

FeaturePriorityNotes
Product catalogP2AI-powered product search
Supplier directoryP2Verified Chinese supplier database
In-app translationP2AI translation for messages
Batch ordersP2Group buying for better prices
Insurance integrationP3Cargo insurance
Trade financeP3Payment terms, letters of credit

15.4 Technical Debt ​

IssueImpactFix
No input validationSecurityAdd Zod schemas
No rate limitingSecurityAdd express-rate-limit
Passwords in plain logsSecuritySanitize logger
No pagination cursorPerformanceAdd cursor-based pagination
No cachingPerformanceAdd Redis cache
No testsQualityAdd Jest test suite

16. Appendix ​

A. Environment Variables ​

bash
# Database
DATABASE_URL=postgresql://...@neon.tech/neondb?sslmode=require

# API Keys
DASHBOARD_API_KEY=yebona_dashboard_key_2026
INTERNAL_API_KEY=yebona_internal_key_2026

# Email
RESEND_API_KEY=re_xxx
NOTIFICATION_EMAIL=admin@yebona.com

# Runtime
PORT=3000
NODE_ENV=production

B. API Base URLs ​

EnvironmentURL
Productionhttps://api.yebona.com
Cloud Runhttps://yebona-api-igsg3gipka-ew.a.run.app
Local Devhttp://localhost:3000

C. Mobile App Config ​

javascript
// app.json (Expo)
{
  "name": "yebona-app",
  "slug": "yebona",
  "scheme": "yebona",
  "extra": {
    "apiUrl": "https://api.yebona.com"
  }
}

Document generated from codebase analysis. Last updated: 2026-03-19

One chat. Everything done.