Appearance
User Flow
Authentication Flow
- User mengunjungi halaman login
- better-auth menangani session via cookie
- Setelah login, user diarahkan ke dashboard
Signup Flow
- User mengunjungi halaman signup
- User mengisi form (nama, email, password) atau memilih Google OAuth
- better-auth membuat user record di database
- Welcome email dikirim otomatis ke email user berisi greeting dan overview fitur
- User diarahkan ke dashboard untuk generate soul map pertama
Password Reset Flow
- User klik "Forgot Password" di halaman login
- User memasukkan email address
- better-auth generate reset token dan kirim password reset email dengan link
- User klik link di email (expire dalam 1 jam)
- User mengisi password baru
- better-auth update password hash dan invalidate sessions lama
Destiny Analysis Flow
Input Form (Unified)
- User membuka halaman
/destiny - Tab Input menampilkan form terpadu dengan field:
- Profile Name (opsional, untuk labeling history)
- Full Name (nama di akta kelahiran)
- Birth Date (date picker)
- Gender (Male / Female / Other)
- Birth Time — mode Exact (time picker) atau Range (dropdown 7 rentang waktu dengan midpoint otomatis)
- Birth City & Country
- Saat birth date dipilih, Weton (Primbon Jawa) dihitung otomatis dan ditampilkan (hari, pasaran, neptu)
- User menekan tombol Calculate Numerology atau Generate BaZi
Numerology (Client-Side)
- Engine kalkulasi deterministik berjalan di browser — tidak ada call ke server
- Hasil ditampilkan di tab Numerology: Life Path, Expression, Soul Urge, Personality, Maturity, Personal Year
- Setiap angka menampilkan calculation steps dan Master Number badge jika applicable
- Hasil otomatis tersimpan ke History (localStorage)
BaZi (Backend Proxy)
- Frontend memanggil
POST /v1/checkDestinyAccessuntuk cek usage limit - Jika quota habis, tampilkan pesan lock dengan alasan
- Jika quota tersedia, frontend membangun prompt dan memanggil
POST /v1/invokeDestiny - Backend:
- Verifikasi usage limit lagi
- Proxy prompt ke base44 InvokeLLM integration
- Increment usage counter di database
- Return hasil LLM ke frontend
- Frontend parse dan render hasil di tab BaZi: Four Pillars, Day Master, Element Balance, Ten Gods, Luck Pillars, Life Guidance, Affirmations
- Hasil otomatis tersimpan ke History (localStorage)
History
- Tab History menampilkan daftar analisis terakhir (maksimal 20 entri)
- Setiap entri menampilkan profile name, nama, tanggal lahir, timestamp, dan badge sistem (Numerology / BaZi / Weton)
- User bisa klik entri untuk memuat kembali data dan hasil ke form
- User bisa menghapus entri individual dari history
- History disimpan di localStorage — tidak masuk ke backend database (sesuai kontrak saat ini)
Compatibility Flow
Create Compatibility
- User membuka halaman
/compatibilitydan klik New Compatibility - Form menampilkan input untuk dua orang: nama, tanggal lahir, waktu lahir (opsional), kota lahir (opsional), dan tipe hubungan (romantic, friendship, professional, family)
- Frontend memanggil
POST /v1/createCompatibility - Backend menyimpan data dan menghitung compatibility score secara deterministik
- User di-redirect ke halaman result
/compatibility/result/:id
Compatibility Result (Lite)
- Halaman result menampilkan:
- Overall compatibility score dengan visual score ring
- Summary singkat berdasarkan score dan relationship type
- Dimension breakdown: emotional, communication, values, energy, growth
- System score pills: Numerologi, BaZi, Human Design, Primbon
- Bagian Deep Insights ditampilkan sebagai locked section dengan teaser konten
Unlock Deep Insights
- User klik Unlock Deep Insights pada locked section
- Modal muncul dengan dua opsi:
- Unlock with Token — jika user memiliki deep insights tokens, token langsung dikonsumsi dan result terunlock
- Purchase (IDR 50,000) — memulai flow pembayaran Doku
- Jika user memilih purchase:
- Frontend memanggil
POST /v1/purchaseDeepInsightsdengancompatibilityResultId - Backend membuat transaksi Doku dan insert record ke
deep_insights_purchases(status pending) - Backend return
paymentUrl - Frontend redirect user ke halaman pembayaran Doku
- Frontend memanggil
- User menyelesaikan pembayaran di Doku
- Doku redirect user kembali ke result page:
- Sukses:
?payment=success→ tampilkan success banner, invalidate query, reload result - Gagal:
?payment=failed→ tampilkan error banner
- Sukses:
- Webhook Doku secara async mengupdate:
transactionstable status → paiddeep_insights_purchasesstatus → paid, unlocked → truecompatibility_resultsunlocked → true, paidAccess → true
- Payment receipt email dikirim ke user berisi detail invoice dan konfirmasi unlock
Generate AI Deep Insights
- Setelah result terunlock, user bisa klik Generate AI Deep Insights
- Frontend memanggil
POST /v1/generateDeepInsightsdengan compatibility data - Backend:
- Verifikasi result sudah unlocked (unlocked / paidAccess)
- Bangun prompt dengan data personA, personB, relationship type, overall score, dan dimensions
- Proxy ke base44 InvokeLLM integration
- Simpan hasil ke
compatibility_results.deep_insights
- Frontend menampilkan:
- Premium summary — narasi personal dan poetic
- Strengths — 3 kekuatan hubungan
- Challenges — 3 tantangan yang perlu diperhatikan
- Guidance — 3 saran praktis
- Spiritual narrative — paragraf poetic tentang kualitas spiritual koneksi
- Hasil AI tersimpan di database untuk recall — user bisa regenerate kapan saja
Compatibility List
- Halaman
/compatibilitymenampilkan list semua compatibility results user - Setiap item menampilkan nama pasangan, score, relationship type, dan badge premium jika deep insights sudah terunlock
- User bisa klik item untuk melihat detail
Journal Flow
- User membuka halaman
/journal - User membuat entry baru dengan form: text, mood (1-10), energy (1-10), stress (1-10), tags
- Frontend memanggil
POST /v1/createJournal - Entry tersimpan di database dan muncul di list
- User bisa melihat history entry dengan pagination
- Dengan minimal 2 entri, user bisa klik Generate AI Insights
- Frontend memanggil
POST /v1/generateJournalSummarydengan entry data - Backend membangun prompt, proxy ke base44 InvokeLLM, dan menyimpan hasil ke
journal_entries.ai_summary - Frontend menampilkan growth score, current season, what is improving, what needs attention, suggested next step, future directions, dan resilience note
- Hasil AI tersimpan di database untuk recall — user bisa refresh insight kapan saja
Profile Flow
- User membuka halaman
/profile - Halaman menampilkan informasi akun, usage stats, purchase history, dan link ke history pages
- Purchase History section menampilkan daftar deep insights purchases dengan status (pending / paid / failed) dan amount
- User bisa edit nama profil
- User bisa logout atau request penghapusan akun
Admin Flow
- Admin/Owner membuka halaman
/admin - System melakukan role guard — hanya
admindanowneryang bisa akses - Halaman menampilkan lima tab:
- Overview — dashboard statistik platform: total users, new users (today/week/month), total journal entries, total compatibility results, total revenue, transaction breakdown (paid/pending/failed), user growth bar chart, dan transaction status chart
- Users — tabel seluruh user dengan search, pagination, update role, dan ban action
- Payments — statistik transaksi (total revenue, paid/pending/failed count) dan tabel transaksi dengan filter status dan search
- Content — moderation panel dengan sub-tab Journal Entries dan Compatibility Results; menampilkan seluruh konten user dengan informasi creator, mood/score, AI summary/insights status, dan pagination
- Settings — konfigurasi platform: maintenance mode toggle, app name, contact email, free analysis limit, dan deep insights price
- Admin bisa filter transaksi by status (all/pending/paid/failed/cancelled/expired)
- Admin bisa search transaksi by invoice number atau product name
- Admin bisa search journal entries by text dan compatibility results by person name
- Pagination tersedia untuk semua tabel (users, transactions, journal entries, compatibility results)
Payment Flow (Deep Insights)
User clicks Unlock → Modal opens → Choose Purchase
→ POST /v1/purchaseDeepInsights
→ Backend creates Doku transaction + deep_insights_purchases record
→ Returns paymentUrl
→ Frontend redirects to Doku payment page
→ User completes payment on Doku
→ Doku redirects back to result page (?payment=success / ?payment=failed)
→ Doku webhook hits /api/v1/handleWebhook
→ Verifies signature
→ Updates transactions + deep_insights_purchases + compatibility_results
→ Sends payment receipt email to user