| Layer | Technology | Notes |
|---|---|---|
| Frontend (Customer) | React Native / Flutter | Cross-platform mobile app |
| Frontend (Admin) | React / Next.js | Web-based back office |
| Frontend (Courier) | React Native / Flutter | Mobile-first courier app |
| Backend | Node.js / Python | REST + WebSocket APIs |
| Database | PostgreSQL | Primary data store |
| Cache | Redis | Sessions, real-time data |
| File Storage | S3 / Cloudflare R2 | Photo uploads, receipts |
| Hosting | AWS / GCP / Vercel | Cloud infrastructure |
| CI/CD | GitHub Actions | Automated deployments |
| Service | Purpose | Priority |
|---|---|---|
| Google OAuth | Tourist sign-up | P0 |
| SendGrid / SES | Email authentication, notifications | P0 |
| Service | Purpose | Priority |
|---|---|---|
| Midtrans / Xendit | IDR payment gateway (Indonesian Rupiah only) | P0 |
| QRIS | Indonesian QR payment standard (IDR only) | P1 |
| GoPay, OVO | E-wallet integration (IDR only) | P1 |
Note: All payments are processed exclusively in IDR (Indonesian Rupiah). This is mandatory for compliance with Indonesian financial regulations. Only IDR-based payment methods are supported. Multi-currency support and foreign currency processing are not available due to regulatory requirements in Indonesia.
| Service | Purpose | Priority |
|---|---|---|
| Firebase Cloud Messaging | Push notifications | P0 |
| SendGrid / SES | Email notifications | P0 |
| WebSocket (Socket.io) | Real-time chat | P0 |
| Service | Purpose | Priority |
|---|---|---|
| OpenAI / Claude API | FAQ bot, auto-reply | P0 |
| Google Translate / DeepL | Multi-language translation | P0 |
| Service | Purpose | Priority |
|---|---|---|
| Google Maps API | Zone visualization, navigation (Jimbaran & Uluwatu focus) | P0 |
| Mapbox | Alternative mapping | P1 |
| Service | Purpose | Priority |
|---|---|---|
| Mixpanel / Amplitude | Product analytics | P1 |
| Metabase / Superset | Business intelligence | P1 |
┌─────────────────────────────────────────────────────────────────┐
│ CLIENT APPS │
├─────────────────┬─────────────────┬─────────────────────────────┤
│ Customer App │ Courier App │ Admin Dashboard │
│ (Mobile) │ (Mobile) │ (Web) │
└────────┬────────┴────────┬────────┴──────────────┬──────────────┘
│ │ │
└─────────────────┼───────────────────────┘
│
┌──────▼──────┐
│ API GW │
│ (REST/WS) │
└──────┬──────┘
│
┌─────────────────┼─────────────────┐
│ │ │
┌────▼────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ Auth │ │ Orders │ │ Chat │
│ Service │ │ Service │ │ Service │
└────┬────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
└─────────────────┼─────────────────┘
│
┌──────▼──────┐
│ PostgreSQL │
│ + Redis │
└─────────────┘
users — All user accountsroles — admin, ops, courier, customerpermissions — Role-based access matrixsessions — JWT tokens, refresh tokensorders — Main order entityorder_items — Individual items in orderorder_status_history — State transitionsorder_photos — Photo proof at each stageservices — wash/fold, dry clean, express, ecopricing_rules — Weight-based, per-item, zone fees (all prices in IDR only - required by Indonesian regulations)time_slots — Available pickup/delivery slotszones — Service coverage areas (GeoJSON) — Phase 1: Jimbaran & Uluwatu Areacouriers — Courier profiles, availabilitycourier_assignments — Order-to-courier mappingpartners — Laundry partner businesses (initially Jimbaran & Uluwatu locations)partner_capacity — Slots per partner per zonetransactions — Payment records (all amounts in IDR only - Indonesian regulatory requirement)payment_methods — Stored IDR payment method details, tokenized (IDR-based methods only per Indonesian regulations)wallets — Customer credit balance (IDR only - required by Indonesian financial regulations)wallet_ledger — Top-up, deduct, refund history (all in IDR due to regulatory requirements)coupons — Promo codes, discounts (IDR amounts only)invoices — Generated receipts (IDR currency only per Indonesian regulations)idr_transactions — IDR-specific transaction metadataAll payment processing is exclusively in IDR (Indonesian Rupiah) to comply with Indonesian financial regulations. Only IDR is accepted as currency due to regulatory requirements in Indonesia.
chat_rooms — Order-scoped chat channelsmessages — Chat messagesnotifications — Push/email logsagents — Referral agent profilesreferrals — Agent-to-order attributioncommissions — Calculated earnings (IDR only - per Indonesian regulations)payouts — Agent payout records (IDR only - required by Indonesian financial regulations)``` POST /auth/register POST /auth/login POST /auth/verify-email
GET /services GET /zones (returns Jimbaran & Uluwatu coverage in Phase 1) GET /time-slots
POST /orders GET /orders/:id GET /orders/:id/tracking POST /orders/:id/cancel
GET /wallet/balance (returns IDR amount only - Indonesian regulatory requirement) POST /wallet/topup (IDR only - required by Indonesian financial regulations)
POST /payments/idr (IDR payment processing only - mandatory for Indonesian regulatory compliance)