Client Portal Lite: Agency Mode
Share progress project ke klien tanpa kasih akses workspace. Magic link auth, comment + approval. Business+.
- 1
Konsep Client Portal
Agency Indonesia sering perlu share progress project ke klien, tapi nggak mau kasih akses workspace internal (yang ada task confidential, diskusi tim, dll). Solusi: per-project Client Portal. Workspace owner enable portal → generate signed share link → klien akses via magic-link email tanpa harus bikin akun SatuTim. Klien bisa: lihat tasks yang ditandai client-visible, comment, approve/reject deliverable. TIDAK bisa: edit task, lihat internal comments, akses project lain.
- Default: client-portal disable. Owner harus explicit setup per project
- 2
Setup portal per project (owner side)
Buka /projects/<id>/client-portal (atau via project settings → Client Portal). Toggle Enable → muncul share URL + QR code untuk share via WhatsApp. Section Invites: tambah email klien + pilih role (viewer = read only, commenter = bisa comment, approver = bisa approve/reject). Tiap invite kirim magic link email branded dengan workspace logo + project name.
Fitur Business+. Limit: Business plan max 5 portal, Enterprise unlimited. - 3
Tandai task sebagai client-visible
Default semua task NOT client-visible. Buka task detail → toggle "👁️ Client-visible" di sidebar. Atau di task list, bulk action "Mark client-visible" untuk multiple task sekaligus. Penting: hanya task yang di-toggle ON yang akan muncul di portal klien. Internal task (gaji, contract, R&D) tetap hidden 100%.
Default hidden untuk safety. Kalau salah toggle, audit log catat siapa yang ubah visibility kapan. - 4
Klien akses via magic link
Klien dapet email dari workspace logo + "Hai, kamu diundang untuk lihat progres project [X]". Klik link magic → email field auto-prefilled → klik "Masuk" → magic link kedua dikirim (langkah verifikasi) → klik = sesi aman aktif selama 8 jam. Sesi otomatis diperpanjang selama klien aktif. Tautan magic sekali pakai dan kedaluwarsa dalam 1 jam.
- Magic link bisa dikirim ulang kalau klien gak terima, owner buka portal settings → invite → Kirim Ulang
- 5
Klien dashboard view
Setelah login, klien lihat: header workspace logo + project name, welcome message (markdown), progress bar (% task complete), tasks grouped by milestone, recent activity feed (last 7 days). Sidebar menu ada "Approval queue" kalau role klien = approver dan ada task pending approval. UI: workspace-branded (logo + optional accent color), BUKAN ada "Powered by SatuTim" obnoxious.
- 6
Klien comment + approval
Klien buka task detail → comment composer markdown + ✅ Approve / ❌ Reject button (kalau role approver dan status task = ready_for_approval). Comment dari klien tersimpan dengan flag clientEmail + clientName (tidak ada authorId). Approval: insert ke task_approvals dengan decision + feedbackText. Trigger notification ke task owner + workspace members.
- Rate limit: 10 comment/min per session, 60 dashboard call/min
- 7
Audit log + security
SEMUA aksi klien tersimpan di client_audit_logs: login, dashboard view, task view, comment, approve. Bisa lihat di portal settings → tab "Activity Log" (50 entry terakhir). Audit penting untuk dispute "klien bilang gak pernah lihat update X, cek audit, ternyata view tanggal Y". Mencegah klaim palsu.
- Audit retention sama dengan workspace plan: 30 hari Pro, 90 hari Business, unlimited Enterprise
- 8
Revoke + rotate token
Portal selesai proyek → buka settings → "Revoke portal". Semua sesi klien aktif langsung invalidated, magic link gak bisa dipakai lagi. Kalau cuma mau ganti URL (token compromised): "Regenerate token" → URL baru, sesi lama invalidated. Klien dengan magic link baru yang dikirim re-invite.
Revoke = kill switch. Klien dengan akses aktif langsung kicked. Tidak ada undo, harus re-invite kalau salah revoke. - 9
Optional: passcode + expiry
Settings portal: tambah passcode (bcrypt-hashed, optional second factor selain magic-link) untuk extra security pada project sensitif. Set expiry date, portal otomatis non-aktif setelah tanggal itu (klien dapet pesan "Portal sudah ditutup"). Bagus untuk freelance project dengan deadline jelas.