# JikoXpress Pro — Payment, Subscription & Business Model Architecture

| Property | Value |
|---|---|
| Version | 1.0 |
| Status | Draft |
| Created | April 2026 |
| Purpose | Development Guide — Payment, Subscription & Delivery Model |

---

## Executive Summary

JikoXpress Pro operates a **three-engine business model** designed specifically for the East African food market. Unlike generic SaaS platforms, JikoXpress earns from three distinct but complementary revenue streams — each designed to align platform success with kitchen success.

---

## Part 1: The Three-Engine Business Model

### 1.1 Overview

```
ENGINE 1 — Platform Subscription
  Kitchen pays monthly to use JikoXpress management tools
  POS, KDS, menu, staff, devices, reports — the full platform

ENGINE 2 — Marketplace Commission
  JikoXpress brings external customers to the kitchen
  Platform earns a cut on those orders only

ENGINE 3 — Delivery Revenue Share
  Customer pays delivery fee
  JikoXpress shares majority with Dasher, keeps margin
```

### 1.2 Revenue Stream Breakdown

| Stream | Who Pays | When | Amount | Applies To |
|---|---|---|---|---|
| Subscription | Kitchen | Monthly | Plan-based | All kitchens |
| Marketplace Commission | Kitchen (deducted) | Per order | 10% of food value | App & WhatsApp orders only |
| Delivery Margin | Customer (via delivery fee) | Per delivery | 30% of delivery fee | All Dasher deliveries |

### 1.3 What Each Order Type Earns JikoXpress

| Channel | Fulfillment | Subscription ✓ | Commission | Delivery Margin |
|---|---|---|---|---|
| POS | Dine-in | ✅ | ❌ | ❌ |
| POS | Pickup | ✅ | ❌ | ❌ |
| POS | Delivery (Dasher) | ✅ | ❌ | ✅ |
| Kiosk | Dine-in / Pickup | ✅ | ❌ | ❌ |
| Table QR | Dine-in | ✅ | ❌ | ❌ |
| App | Pickup | ✅ | ✅ | ❌ |
| App | Delivery (Dasher) | ✅ | ✅ | ✅ |
| WhatsApp | Pickup | ✅ | ✅ | ❌ |
| WhatsApp | Delivery (Dasher) | ✅ | ✅ | ✅ |

> **App + Dasher Delivery = all three engines firing simultaneously. Highest value order type.**

### 1.4 The Core Principle

**Subscription** is the stability engine — predictable, recurring.
**Commission** is the growth engine — scales with kitchen volume.
**Delivery** is the experience engine — owns the customer journey end-to-end.

**STARTER is free forever — not charity. It is a customer acquisition tool.**
STARTER kitchens still generate commission revenue on app orders and processing margin on every M-Pesa transaction. Every kitchen on STARTER that takes 50 app orders/month earns JikoXpress real money without paying a subscription.

---

## Part 2: Subscription Plans

### 2.1 Plan Tiers

#### STARTER — Free Forever

```
Price:        TZS 0 / month
Billing:      None
Trial:        Not applicable — free forever
Target:       Home chefs, street vendors, side hustle cooks
```

**Included:**
- Basic menu (up to 20 items)
- Order management (receive, accept, prepare, complete)
- Mobile app only
- Mobile money payments (USSD)
- Table QR (1 table)
- Operating hours scheduling
- Order history (30 days)
- Basic push notifications

**Limits:**
- 20 menu items
- 100 orders/month
- 1 staff account (owner only)
- 1 location

---

#### GROWING — Mid Tier

```
Price:        TZS X/month (monthly) or TZS X/week (weekly)
Billing:      Monthly or Weekly — kitchen chooses
Trial:        Covered by 3-day PROFESSIONAL trial on signup
Target:       Small restaurants, busy food stalls, cafes, food trucks
```

**Included (everything in STARTER plus):**
- Unlimited menu items
- POS access (desktop/tablet)
- Kiosk channel
- Table QR (unlimited)
- WhatsApp bot ordering
- Receipt & kitchen printer support
- Card payments + cash handling
- Basic sales reports
- Order history (1 year)

**Limits:**
- 1,000 orders/month
- 3 staff accounts
- 1 location

> **Weekly billing option exists because a food stall thinking "TZS 50,000/month" hesitates. "TZS 12,500/week" maps to how small East African businesses think about cash flow.**

---

#### PROFESSIONAL — Full Feature

```
Price:        TZS XX/month or TZS XX/year (annual = 2 months free)
Billing:      Monthly or Annual — kitchen chooses
Trial:        Covered by 3-day trial on signup
Target:       Full-service restaurants, fast food, bars, hotel restaurants
```

**Included (everything in GROWING plus):**
- Kitchen stations
- KDS (Kitchen Display System)
- Drive-through support
- Tabs (pay-later for dine-in)
- Table management
- Up to 15 staff accounts
- Roles & permissions + discount limits
- Advanced reports + customer insights
- Priority support

**Limits:**
- Unlimited orders
- 15 staff accounts
- 1 location

> **Annual billing for PROFESSIONAL is a strong retention tool. Once they've paid a year upfront, churn almost disappears.**

---

#### ENTERPRISE — Custom

```
Price:        Custom (negotiated offline)
Billing:      Annual or manual — admin-activated
Trial:        No trial — demo + custom onboarding instead
Target:       Restaurant chains, franchises, hotel groups, cloud kitchens
```

**Included (everything in PROFESSIONAL plus):**
- Multi-location support
- Central menu management
- Consolidated cross-location reports
- API access for integrations
- Inventory management
- White-label option
- Dedicated support + SLA guarantees
- Custom integrations

**Limits:** Unlimited everything

---

### 2.2 Billing Cycle Options by Plan

| Plan | Weekly | Monthly | Annual |
|---|---|---|---|
| STARTER | ❌ | ❌ | ❌ |
| GROWING | ✅ | ✅ | ❌ |
| PROFESSIONAL | ❌ | ✅ | ✅ |
| ENTERPRISE | ❌ | ❌ | Custom |

---

## Part 3: The 3-Day Trial System

### 3.1 How It Works

Every new kitchen gets **one automatic 3-day trial on PROFESSIONAL** — not GROWING.

**Why PROFESSIONAL specifically?**
Show them the ceiling. KDS, stations, tabs, drive-through. If they trial GROWING, they never see the most powerful features and undervalue the platform. Show them the best, then they decide where to settle.

```
Kitchen registers
      ↓
System offers: "Try PROFESSIONAL free for 3 days — no payment needed"
      ↓
      ├── Accept → status: TRIALING, plan: PROFESSIONAL, trialEndsAt: now + 3 days
      │           No payment info required
      │
      └── Skip → lands directly on STARTER
```

### 3.2 Trial Expiry Flow

```
Trial day 3 ends
      ↓
      ├── Kitchen entered payment method → auto-converts to PROFESSIONAL ACTIVE
      │   First charge hits immediately
      │   New billing cycle starts
      │
      └── No payment method → drops silently to STARTER
          Notification: "Your trial ended. Upgrade anytime to get back."
          No disruption — kitchen still operational on STARTER
```

### 3.3 Trial Rules

- **One trial per account ever** — automatic, system-enforced
- **Admin can manually grant re-trial** — for re-engagement, churned kitchens, sales tool
- **No trial for ENTERPRISE** — they get a demo + custom onboarding instead
- Trial is always PROFESSIONAL — never GROWING, never ENTERPRISE

### 3.4 The Re-Trial (Admin Tool)

```
Admin dashboard → Kitchen profile → [Grant Re-Trial]
      ↓
Admin selects duration (3, 7, or 14 days)
      ↓
Kitchen gets push notification: "Good news! You've been given X days on PROFESSIONAL"
      ↓
Same flow as original trial — expires or converts
```

This is a powerful churn recovery and sales tool. Use it for:
- Kitchens that churned due to payment failure (not dissatisfaction)
- Enterprise prospects evaluating the platform
- Re-engaging inactive STARTER kitchens

---

## Part 4: Subscription Lifecycle — All Scenarios

### 4.1 New Kitchen — Full Flow

```
SIGNUP
  ↓
3-day PROFESSIONAL trial offered
  ↓
[Accept trial] → TRIALING
  ↓
Day 3: trial expires
  ↓
[Has payment method] → ACTIVE on chosen paid plan
[No payment method]  → STARTER (free forever)
  ↓
Monthly auto-renewal cycle begins
```

### 4.2 Upgrade Flow

**From STARTER → GROWING or PROFESSIONAL:**

```
Kitchen hits a limit OR tries a locked feature
      ↓
In-context upgrade prompt appears (not redirect to settings)
Shown right where they hit the wall
      ↓
"You've reached 20 menu items. Upgrade to GROWING for unlimited."
[Upgrade Now]
      ↓
Kitchen selects billing cycle (weekly/monthly for GROWING, monthly/annual for PRO)
      ↓
Pays via M-Pesa / card
      ↓
Plan activates IMMEDIATELY
      ↓
Feature they were trying to use → now available
System continues where they left off — no restart
```

**In-context upgrade triggers:**

| Trigger | Message |
|---|---|
| 21st menu item | "You've reached 20 items. Upgrade to GROWING for unlimited." |
| 80 orders (STARTER) | "20 orders left this month. Upgrade to avoid interruption." |
| Enable POS | "POS is available on GROWING and above." |
| Enable KDS | "KDS is available on PROFESSIONAL and above." |
| Enable tabs | "Tabs are available on PROFESSIONAL and above." |
| Add 4th staff | "You've reached your staff limit. Upgrade to add more." |

**From GROWING → PROFESSIONAL:**
Same flow. Charge full PROFESSIONAL price. New billing cycle starts on upgrade date. No proration in v1 — simpler, cleaner.

### 4.3 Downgrade Flow

```
Kitchen requests downgrade (e.g. PROFESSIONAL → GROWING)
      ↓
System shows what they will LOSE on the downgrade date:
  "On [date] you will lose access to:
   - Kitchen Stations
   - KDS displays
   - Tabs (pay later)
   - Drive-through
   - Staff accounts above 3"
      ↓
Save flow — system offers:
  "Stay on PROFESSIONAL for 1 more month at 50% off?"
  [Accept offer]  [Proceed with downgrade]
      ↓
[Accept] → offer applied, subscription continues at 50%
[Proceed] → downgrade SCHEDULED for end of current billing period
      ↓
Until that date: still on PROFESSIONAL, full access
      ↓
On renewal date: switches to GROWING, charged GROWING price
```

**What happens to data above the new plan's limits?**

Data is NEVER deleted. It is soft-locked:

| Resource | On Downgrade to GROWING | On Re-upgrade |
|---|---|---|
| Kitchen stations | Archived (not deleted) | Restored instantly |
| KDS config | Archived | Restored instantly |
| Staff above 3 | Suspended (can't login) | Reactivated |
| Tabs history | Read-only | Fully accessible |

### 4.4 Cancellation Flow

```
Kitchen requests cancellation
      ↓
System shows impact:
  "Your subscription ends on [date].
   After that you'll move to STARTER (free forever).
   Your data is safe — menus, orders, history all preserved."
      ↓
Save flow:
  "Stay for 1 more month at 50% off?"
  [Accept]  [Cancel anyway]
      ↓
[Cancel anyway] → cancellation SCHEDULED for end of current period
      ↓
Access continues until period ends — no immediate disruption
      ↓
On expiry: status → CANCELLED, plan falls to STARTER
Kitchen still operational — just on free tier
```

**Cancellation ≠ lockout. They keep STARTER forever.**

### 4.5 Payment Failure & Dunning Flow

```
Renewal date arrives
      ↓
Auto-charge attempt → FAILS
      ↓
status: PAST_DUE
      ↓
Day 0:  Push notification + WhatsApp:
        "Your payment didn't go through. Tap to retry."
        Silent retry attempt

Day 1:  Silent retry

Day 3:  Push + WhatsApp (stronger):
        "⚠️ Your subscription payment failed again.
         Update your payment method to keep full access."
        Silent retry attempt

Day 5:  Silent retry

Day 7:  Push + WhatsApp (urgent):
        "⚠️ Final notice — access suspending tomorrow.
         Tap to update payment and stay active."
      ↓
Day 8:  status: SUSPENDED
        Kitchen enters LIMITED MODE
      ↓
During suspension (7 days):
  - Can log in ✅
  - Can view menu, history, reports ✅
  - CANNOT accept new orders ❌
  - CANNOT process payments ❌
  - Banner shown everywhere: "Renew to resume taking orders"
  - Push + WhatsApp every 2 days
      ↓
Day 15: status: CANCELLED
        Plan falls to STARTER
        Full STARTER access restored
        Paid features soft-locked (data preserved)
```

> **Limited mode during suspension is critical. A fully locked-out owner panics and churns permanently. A visible-but-restricted owner is motivated to pay and comes back.**

### 4.6 Re-subscription After Cancellation / Failure

```
Kitchen wants to re-subscribe
      ↓
Selects plan + billing cycle
      ↓
Pays
      ↓
ACTIVE immediately
      ↓
All archived data restored:
  - Stations restored
  - KDS config restored
  - Staff reactivated
  - Old menu items restored (including any over-limit ones)
      ↓
"Welcome back! Everything is right where you left it." 🎉
```

---

## Part 5: Limit Enforcement & Data Preservation

### 5.1 The Core Principle

**JikoXpress never deletes kitchen data due to plan changes. Ever.**

Data is soft-locked. Access is restricted. But everything is preserved and restores instantly on upgrade.

### 5.2 What Happens When Kitchen Drops to STARTER

**Menu Items (limit: 20)**

```
Kitchen has 200 items → drops to STARTER
      ↓
System auto-selects 20 most recently active items
Selection priority:
  1. Items with orders in last 30 days (sorted by order count)
  2. Fill remaining with most recently created items
  3. Never auto-select items owner already marked unavailable
      ↓
Those 20 → status: ACTIVE (kitchen immediately live — no downtime)
Remaining 180 → status: OVER_LIMIT_INACTIVE (preserved, not orderable)
      ↓
Owner notified:
  "You're on STARTER. We've kept your 20 most active items live.
   Swap them anytime from your menu settings."
      ↓
Owner can swap at any time:
  Deactivate 1 active → activate 1 locked
  Always exactly 20 active. Kitchen always live.
```

**Kitchen never goes offline due to a plan change.**

### 5.3 Menu Item Status Model

```
ACTIVE              → visible, orderable, counts toward limit
UNAVAILABLE         → owner manually turned off (out of stock)
OVER_LIMIT_INACTIVE → exists but locked due to plan limit
ARCHIVED            → owner soft-deleted
```

`OVER_LIMIT_INACTIVE` is distinct from `UNAVAILABLE` — different reason, different resolution path. One is owner choice, the other resolves automatically on upgrade.

### 5.4 Limit Enforcement Across All Resources

| Resource | STARTER | On Drop — System Action | Kitchen Impact |
|---|---|---|---|
| Menu items | 20 | Auto-pick 20 most active, rest OVER_LIMIT_INACTIVE | None — stays live with 20 |
| Staff accounts | 1 | Extra staff suspended (can't login) | Owner still operational |
| Orders/month | 100 | Counter resets monthly, past orders preserved | Future orders blocked at 100 |
| Table QR | 1 table | Extra QR codes deactivated, first one stays | 1 table still works |
| Locations | 1 | Extra locations suspended, not deleted | Primary location works |

### 5.5 Usage-Based Upgrade Prompts

```
STARTER → GROWING triggers:
  - Orders this month > 80 (approaching 100 limit)
  - Menu items > 15 (approaching 20 limit)
  - Customer tried to pay by card (not available on STARTER)
  - Multiple staff login attempts

GROWING → PROFESSIONAL triggers:
  - Orders this month > 800 (approaching 1,000 limit)
  - Staff maxed at 3
  - Kitchen searched for: tabs, stations, KDS, drive-through
  - Average prep time > 15 minutes

PROFESSIONAL → ENTERPRISE triggers:
  - Kitchen asked about second location
  - Searched for: multi-location, franchise, API
  - Monthly orders consistently > 5,000
```

---

## Part 6: Feature Access Control

### 6.1 Three-Layer Access Model

Every feature check in the system goes through three layers:

```
Layer 1 — Subscription Status
  ACTIVE or TRIALING    → proceed to Layer 2
  PAST_DUE              → proceed (grace, still accessible)
  SUSPENDED             → BLOCK (show renew prompt)
  CANCELLED             → STARTER features only

Layer 2 — Plan Features
  Feature in this plan? → proceed to Layer 3
  Feature not in plan?  → BLOCK (show upgrade prompt)

Layer 3 — Usage Limits
  Usage under limit?    → ALLOW
  Usage at limit?       → BLOCK (show upgrade prompt)
```

All three layers checked by one service. Business logic never knows which layer blocked — it just gets true or false.

```java
// Single call anywhere in codebase
entitlementService.hasAccess(kitchenId, Feature.KDS_DISPLAY);
entitlementService.canPerform(kitchenId, Action.CREATE_ORDER);
limitService.canAddMenuItem(kitchenId);
```

### 6.2 Feature → Plan Mapping

```
CORE (STARTER — always on):
  basic_menu, order_management, mobile_notifications,
  basic_payments, operating_hours, order_history_30d,
  table_qr_single, mobile_app_channel

CHANNELS (GROWING+):
  pos_access, kiosk_channel, table_qr_unlimited,
  whatsapp_bot, receipt_printer, kitchen_printer

PAYMENTS (GROWING+):
  card_payments, cash_handling, kitchen_wallet

KITCHEN OPS (PROFESSIONAL+):
  stations, kds_display, expeditor_mode, drive_through, tabs,
  table_management, staff_roles_permissions

INSIGHTS (PROFESSIONAL+):
  advanced_reports, customer_insights, order_history_full

SCALE (ENTERPRISE):
  multi_location, central_menu, consolidated_reports,
  api_access, white_label, inventory_management
```

---

## Part 7: Transaction Split Architecture

### 7.1 The Two Flags That Drive Every Split

```java
boolean chargeCommission =
    order.channel == APP || order.channel == WHATSAPP;

boolean chargeDeliveryMargin =
    order.fulfillmentType == DELIVERY &&
    order.deliveryProvider == JIKOXPRESS_DASHERS;
```

These two flags determine exactly how money is split on every order. No hardcoding per kitchen. Universal.

### 7.2 Split Scenarios

**Scenario 1 — POS Dine-in (subscription only, no per-order split)**
```
Food value:           TZS 15,000
Kitchen gets:         TZS 15,000  (100%)
Platform earns:       TZS 0 per order
                      (earns via monthly subscription separately)
Processing margin:    TZS 75      (0.5% on transaction)
```

**Scenario 2 — App Pickup (commission applies)**
```
Food value:           TZS 15,000
Commission (10%):     TZS 1,500   → REVENUE_MARKETPLACE_COMMISSION
Kitchen gets:         TZS 13,500  → kitchen settlement
Processing margin:    TZS 75      → REVENUE_PROCESSING_MARGIN
```

**Scenario 3 — App + Dasher Delivery (all splits)**
```
Food value:           TZS 15,000
Delivery fee:         TZS 2,500   (see delivery fee formula)
Total collected:      TZS 17,500
      ↓
Commission (10%):         TZS 1,500   → REVENUE_MARKETPLACE_COMMISSION
Kitchen gets:             TZS 13,500  → kitchen settlement
Dasher earning (70%):     TZS 1,750   → DasherWalletEntity
Platform delivery (30%):  TZS 750     → REVENUE_DELIVERY_MARGIN
Processing margin:        TZS 75      → REVENUE_PROCESSING_MARGIN

Platform total earned:    TZS 2,325
Kitchen nets:             TZS 13,500
Dasher gets:              TZS 1,750
```

### 7.3 TransactionSplitEntity Records Per Order

Every order that involves money generates split records:

```
Order #47 — App + Dasher Delivery

SplitRecord 1:
  type: KITCHEN_EARNING
  amount: TZS 13,500
  destination: kitchen_settlement_ledger

SplitRecord 2:
  type: PLATFORM_COMMISSION
  amount: TZS 1,500
  destination: REVENUE_MARKETPLACE_COMMISSION

SplitRecord 3:
  type: DASHER_EARNING
  amount: TZS 1,750
  destination: dasher_wallet

SplitRecord 4:
  type: PLATFORM_DELIVERY_MARGIN
  amount: TZS 750
  destination: REVENUE_DELIVERY_MARGIN

SplitRecord 5:
  type: PROCESSING_MARGIN
  amount: TZS 75
  destination: REVENUE_PROCESSING_MARGIN
```

Total splits always equal total collected. Double-entry stays balanced.

### 7.4 Revenue Ledger Accounts

```
REVENUE_SUBSCRIPTION_FEES         ← monthly plan payments
REVENUE_MARKETPLACE_COMMISSION    ← 10% on app/WhatsApp orders
REVENUE_DELIVERY_MARGIN           ← 30% of delivery fee
REVENUE_PROCESSING_MARGIN         ← 0.5% spread on all transactions

LIABILITY_DASHER_WALLETS          ← accumulated Dasher earnings (owed to drivers)
LIABILITY_KITCHEN_SETTLEMENTS     ← kitchen earnings pending payout
ASSET_DELIVERY_POOL               ← delivery fees collected, not yet split
```

---

## Part 8: Delivery System & Fee Model

### 8.1 JikoXpress Dashers — Internal Fleet

JikoXpress owns the delivery operation. No third-party providers in v1.

**Why own the fleet:**
- Control the full customer experience end-to-end
- Own the delivery margin (not shared with Bolt/Uber)
- Dasher quality directly reflects on JikoXpress brand
- Build competitive advantage — "Dashers are faster and cheaper"

### 8.2 Delivery Fee Formula

The customer delivery fee is calculated **from the Dasher cost outward**, not arbitrarily:

```
Dasher earning = baseFee + (pricePerKm × distanceKm)
Delivery fee   = Dasher earning × (1 + platformMarginRate)
Final fee      = round to nearest TZS 100
```

**Config values (adjustable by admin):**
```
baseFee:            TZS 1,000
pricePerKm:         TZS 150
platformMarginRate: 0.30 (30%)
roundingUnit:       100
```

**Examples:**
```
1km:  Dasher TZS 1,150 → Fee TZS 1,495 → Customer pays TZS 1,500
3km:  Dasher TZS 1,450 → Fee TZS 1,885 → Customer pays TZS 1,900
5km:  Dasher TZS 1,750 → Fee TZS 2,275 → Customer pays TZS 2,300
8km:  Dasher TZS 2,200 → Fee TZS 2,860 → Customer pays TZS 2,900
```

### 8.3 Delivery Fee Split

```
Customer pays delivery fee
      ↓
Dasher share:    70% of fee (always)
Platform share:  30% of fee
Minimum Dasher:  TZS 1,000 (floor — protects very short trips)
```

**Framing:** "We share 70% of every delivery fee with you" — not "we take 30% commission."

### 8.4 Dasher Payout

```
Dasher completes delivery
      ↓
Earning added to DasherWalletEntity instantly
      ↓
Dasher sees real-time balance in app
      ↓
Daily or on-demand withdrawal to:
  M-Pesa / Tigo Pesa / Airtel Money
```

---

## Part 9: Dasher App Psychology & UX Flow

### 9.1 The Three Questions Every Driver Asks

When an order pops, every Dasher makes a split-second decision based on exactly three things:

```
1. How much will I earn?
2. How far do I have to go?
3. Is it worth my time?
```

Every screen must answer these three questions instantly. Nothing else matters at the moment of decision.

### 9.2 Screen 1 — Order Notification (The Pop-up)

```
┌─────────────────────────────────────────┐
│  🛵 NEW DELIVERY                        │
│                                         │
│  TZS 1,750                              │  ← earnings FIRST, biggest font
│  your earning                           │
│                                         │
│  ├── 📍 0.8km to kitchen               │  ← distance to pickup
│  └── 🏠 2.3km to customer              │  ← distance to drop-off
│                                         │
│  Est. 18 mins total                     │  ← time commitment
│                                         │
│  ████████████░░░  12s                   │  ← countdown timer
│                                         │
│        [ACCEPT ORDER]                   │
└─────────────────────────────────────────┘
```

**Design decisions:**
- Earnings shown first, largest — this is what drives acceptance
- No restaurant name — prevents bias (driver shouldn't reject based on kitchen)
- No customer name — privacy
- 12-second timer — sweet spot (5s = panic, 30s = overthinking)
- Single button — no friction on accept

**Timer expiry behavior:**
```
No response in 12s → auto-decline for this Dasher
→ Order sent to next nearest available Dasher
→ No penalty for first miss
→ 3 consecutive misses → system marks Dasher as "away" automatically
```

### 9.3 Screen 2 — After Accept (Full Details Unlock)

```
┌─────────────────────────────────────────┐
│  ✅ Order Accepted!                     │
│                                         │
│  PICK UP                                │
│  Mama Lishe Downtown                    │
│  Msimbazi Street, Dar                   │
│  📍 0.8km from you                     │
│  [NAVIGATE]                             │
│                                         │
│  ─────────────────────────────────────  │
│  ORDER SUMMARY                          │
│  1× Ugali + Samaki                      │
│  1× Pilau                               │
│  ─────────────────────────────────────  │
│                                         │
│  DROP OFF                               │
│  Mlimani City Area, Near Gate 2         │
│  📍 2.3km from kitchen                 │
│  [NAVIGATE]                             │
│                                         │
│  Your earning: TZS 1,750               │
│                                         │
│  [ARRIVED AT KITCHEN]                   │
└─────────────────────────────────────────┘
```

### 9.4 Screen 3 — At Kitchen (Pickup Verification)

```
┌─────────────────────────────────────────┐
│  📦 PICK UP                             │
│                                         │
│  Show this to kitchen staff:            │
│                                         │
│  ┌─────────────────────────────────┐   │
│  │                                 │   │
│  │     ORDER #47                   │   │
│  │     Dasher: John M.             │   │
│  │                                 │   │
│  │     ████████████████            │   │
│  │         (QR code)               │   │
│  └─────────────────────────────────┘   │
│                                         │
│  Kitchen scans → confirms → you proceed │
│                                         │
│  [FOOD PICKED UP]                       │
└─────────────────────────────────────────┘
```

QR verification prevents wrong Dasher picking up wrong order. Kitchen scans, confirms, Dasher proceeds.

### 9.5 Screen 4 — En Route to Customer

```
┌─────────────────────────────────────────┐
│  🏍️ EN ROUTE                            │
│                                         │
│  Delivering to:                         │
│  Mlimani City Area, Near Gate 2         │
│                                         │
│  Customer note:                         │
│  "Call when you arrive, gate is locked" │
│                                         │
│  📞 Call Customer                       │
│                                         │
│  [NAVIGATE]                             │
│                                         │
│  [ARRIVED AT CUSTOMER]                  │
└─────────────────────────────────────────┘
```

### 9.6 Screen 5 — Delivery Complete (The Reward Screen)

```
┌─────────────────────────────────────────┐
│  🎉 Delivery Complete!                  │
│                                         │
│  TZS 1,750 added to your wallet        │
│                                         │
│  Today's earnings:  TZS 8,750          │
│  Deliveries today:  5                   │
│                                         │
│  ─────────────────────────────────────  │
│                                         │
│  Keep it up! 3 more deliveries          │
│  to hit your daily bonus 🔥             │
│                                         │
│  [GO ONLINE]                            │
└─────────────────────────────────────────┘
```

**The daily bonus progress is deliberate gamification** — keeps Dashers online longer and drives supply during peak hours.

### 9.7 Daily Bonus Structure (Dasher Retention)

```
8 deliveries/day   → TZS 2,000 bonus
12 deliveries/day  → TZS 5,000 bonus
15 deliveries/day  → TZS 8,000 bonus + "Top Dasher" badge
```

Dashers chase the bonus. You get supply when you need it most.

---

## Part 10: Dasher Delivery Status Flow

```
ORDER PLACED
      ↓
FINDING_DASHER      → System dispatches to nearest available Dasher
      ↓
DASHER_ASSIGNED     → Dasher accepted, heading to kitchen
      ↓
DASHER_AT_KITCHEN   → Dasher arrived, awaiting pickup verification
      ↓
PICKED_UP           → QR scanned, food confirmed, en route to customer
      ↓
IN_TRANSIT          → Real-time location tracking active
      ↓
DASHER_AT_CUSTOMER  → Arrived at drop-off location
      ↓
DELIVERED           → Order complete, Dasher earning posted to wallet
```

**Failure states:**
```
NO_DASHER_AVAILABLE → Alert admin, manual assign or fallback
DASHER_CANCELLED    → Re-dispatch to next available Dasher
DELIVERY_FAILED     → Escalate, refund flow triggered
```

---

## Part 11: Offer System

### 11.1 Offer Types

Offers can be applied to subscriptions or per-order:

| Type | How It Works | Example |
|---|---|---|
| PERCENT_DISCOUNT | % off subscription price | 30% off for 3 months |
| FIXED_DISCOUNT | Fixed amount off | TZS 10,000 off first month |
| FREE_MONTHS | N months free | 2 months free on annual plan |
| TRIAL_EXTENSION | Extend trial duration | +7 days on trial |
| SAVE_OFFER | Shown on cancel/downgrade | Stay 1 month at 50% off |

### 11.2 Save Flow Offer (Churn Prevention)

```
Kitchen requests cancel or downgrade
      ↓
System shows save offer:
  "Stay on PROFESSIONAL for 1 month at 50% off?"
  [Accept]  [Proceed anyway]
      ↓
[Accept] → offer applied, billed at 50% next cycle, full price after
[Proceed] → scheduled for end of cycle
```

### 11.3 Offer Rules

- Offers have budget limits (max total discount)
- Offers have expiry dates
- Offers have usage limits (per kitchen, global)
- One active offer per subscription at a time
- Offers track how many billing cycles they've been applied
- When cycles run out, full price resumes automatically

---

## Part 12: Entity Overview

### 12.1 Subscription Package

```
subscription/
├── entity/
│   ├── SubscriptionPlanEntity         ← plan catalog (STARTER, GROWING, PRO, ENTERPRISE)
│   ├── PlanFeatureEntity              ← plan → feature mapping
│   ├── PlanLimitEntity                ← plan → limit mapping
│   ├── PlanPricingEntity              ← plan → price per billing cycle
│   ├── SubscriptionEntity             ← per-kitchen live subscription
│   ├── SubscriptionUsageEntity        ← current period usage tracking
│   ├── SubscriptionPaymentEntity      ← each billing event
│   ├── SubscriptionTrialEntity        ← trial record (one per account)
│   └── SubscriptionScheduledChangeEntity ← pending downgrade/cancel
│
├── enums/
│   ├── SubscriptionStatus             ← TRIALING, ACTIVE, PAST_DUE, SUSPENDED, CANCELLED
│   ├── BillingCycle                   ← WEEKLY, MONTHLY, ANNUAL, CUSTOM
│   └── PlanTier                       ← STARTER, GROWING, PROFESSIONAL, ENTERPRISE
│
└── service/
    ├── EntitlementService             ← the access gate (most critical)
    ├── LimitService                   ← usage limit enforcement
    ├── SubscriptionService            ← lifecycle management
    └── SubscriptionBillingService     ← renewals, dunning, trial expiry
```

### 12.2 Dasher Package

```
dasher_service/
├── driver/        ← profiles, onboarding, status, ratings
├── dispatch/      ← order assignment, routing, fallback
├── tracking/      ← real-time location, ETA
├── earnings/      ← DasherWalletEntity, per-trip records
└── payout/        ← settlement to M-Pesa / Tigo / Airtel
```

### 12.3 Financial Package (delivery additions)

```
wallet/
├── CustomerWalletEntity
├── KitchenWalletEntity
└── DasherWalletEntity      ← Dasher accumulated earnings

ledger/
├── LedgerAccountEntity     (includes delivery-specific accounts)
└── JournalEntryEntity
```

---

## Part 13: The Business Model in One View

```
┌─────────────────────────────────────────────────────────────────┐
│                    JIKOXPRESS EARNS FROM                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  EVERY KITCHEN (subscription)                                   │
│  └── Monthly fee for using the management platform             │
│      STARTER: TZS 0 | GROWING: TZS X | PRO: TZS XX            │
│                                                                 │
│  EVERY APP / WHATSAPP ORDER (commission)                        │
│  └── 10% of food value on orders JikoXpress generated          │
│      Kitchen's own customers (POS/Kiosk) = zero commission     │
│                                                                 │
│  EVERY DASHER DELIVERY (delivery margin)                        │
│  └── 30% of delivery fee on all Dasher deliveries              │
│      Dasher gets 70% — "we share with you, not take from you"  │
│                                                                 │
│  EVERY TRANSACTION (processing margin)                          │
│  └── ~0.5% spread on all M-Pesa / card transactions            │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  STARTER kitchen, 50 app orders/month, avg TZS 10,000:         │
│  Commission: 50 × 10,000 × 10% = TZS 50,000/month             │
│  Subscription: TZS 0                                           │
│  Platform earns TZS 50,000 from a "free" kitchen               │
│                                                                 │
│  PROFESSIONAL kitchen, 500 app orders + 100 Dasher deliveries: │
│  Subscription:  TZS 150,000                                    │
│  Commission:    500 × 10,000 × 10% = TZS 500,000              │
│  Delivery:      100 × 2,000 × 30% = TZS 60,000                │
│  Platform earns TZS 710,000/month from one kitchen             │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

---

## Appendix A: Subscription Status Reference

| Status | Kitchen Can Login | Can Take Orders | Paid Features | Action Required |
|---|---|---|---|---|
| TRIALING | ✅ | ✅ | ✅ (PROFESSIONAL) | None — enjoy trial |
| ACTIVE | ✅ | ✅ | ✅ (per plan) | None |
| PAST_DUE | ✅ | ✅ | ✅ (grace) | Update payment |
| SUSPENDED | ✅ | ❌ | ❌ | Pay to resume |
| CANCELLED | ✅ | ✅ (STARTER) | ❌ (STARTER only) | Re-subscribe |

---

## Appendix B: Dunning Timeline Reference

| Day | Event | Kitchen Status | Action |
|---|---|---|---|
| 0 | Payment fails | PAST_DUE | Push + WhatsApp + retry |
| 1 | Retry | PAST_DUE | Silent retry |
| 3 | Still failing | PAST_DUE | Push + WhatsApp + retry |
| 5 | Retry | PAST_DUE | Silent retry |
| 7 | Final warning | PAST_DUE | Push + WhatsApp + retry |
| 8 | All retries exhausted | SUSPENDED | Limited mode |
| 15 | Grace period over | CANCELLED | Falls to STARTER |

---

## Appendix C: Decision Log

| Decision | Choice | Rationale |
|---|---|---|
| STARTER pricing | Free forever | Acquisition tool — earns via commission anyway |
| Trial plan | PROFESSIONAL (not GROWING) | Show the ceiling — max value drives conversion |
| Trial duration | 3 days | Short enough to create urgency, long enough to experience value |
| Trial recurrence | Once automatic + admin re-grant | Prevents abuse, keeps re-engagement tool |
| Upgrade timing | Immediate | Kitchen gets value now, better experience |
| Downgrade timing | End of cycle | Fair, reduces panic cancellations |
| Failed payment lockout | Soft lock (limited mode) | Hard lockout causes permanent churn |
| Data on downgrade | Soft-lock, never delete | Re-upgrade restores everything — retention lever |
| Auto-select on limit drop | 20 most recently active | Kitchen stays live immediately, no downtime |
| Commission scope | App + WhatsApp only | Fair — charge for demand we generated |
| Delivery model | Internal Dashers only (v1) | Own the margin, own the experience |
| Delivery fee basis | Dasher cost + 30% margin | Fee always covers Dasher, platform never loses |
| Dasher share | 70% of delivery fee | Fair split, drives Dasher supply |
| Dasher notification | Earnings first, 12s timer | Psychology — answer the 3 questions instantly |
| Dunning channel | Push + WhatsApp (not email) | East Africa mobile-first — WhatsApp beats email |
| Service fee on pickup/dine-in | No | Price sensitivity — avoid customer leakage to WhatsApp direct |
| Delivery fee from customer | Yes | Universal expectation, accepted without friction |

---

*End of Document*
*JikoXpress Pro — Payment, Subscription & Business Model Architecture v1.0*