#01 — Product Requirements Document
Project: crmoffice
Status: Implemented through Phase 6 — all core modules functional (CRM, Sales, Projects, Support, Reports, Customer Portal)
Last updated: 2026-05-30
#1. Problem Statement
Agency dan SMB di Indonesia (dan global) saat ini terpaksa stitching banyak tools — Trello untuk task, Notion untuk note, QuickBooks/manual Excel untuk invoice, WhatsApp untuk client communication, Google Forms untuk lead capture, dan tidak ada single source of truth tentang client lifecycle.
Perfex CRM sebenarnya solving masalah ini, tapi:
- Stack legacy (CodeIgniter 3 + jQuery) — sulit di-extend, slow, security debt
- UX terlihat 2018-an
- Integrasi hardcoded — kalau pakai gateway lokal (Midtrans, Xendit, Doku) harus modify code
- Tidak ada API yang serius untuk mobile companion
- Tidak ada SEO surface — semua tertutup di balik login
- License berbayar di CodeCanyon, obfuscated (
ionCube)
crmoffice = pengganti modern dengan parity fitur + arsitektur dinamis + SEO + API-first.
#2. Personas
#P1 — Andi, Agency Owner (35)
- Punya digital agency 8 orang
- Klien: ~30 aktif, rotasi cepat
- Kebutuhan: 1 tempat untuk track lead → proposal → contract → project → invoice → recurring retainer
- Pain: Saat ini pakai 6 tools, ada lead yang lost karena ga di-follow up
#P2 — Sari, Freelance Designer (28)
- Solo freelancer
- Klien: 5–10 aktif
- Kebutuhan: Send proposal cantik, invoice + payment link, contract digital, time tracking untuk hourly project
- Pain: Pakai Bonsai/Honeybook tapi pricing USD mahal, ga support Midtrans/QRIS
#P3 — Budi, Sales Staff (26) di SMB
- Reports ke Andi
- Tugas: follow up leads, schedule demo, convert to deal
- Kebutuhan: pipeline kanban, reminder, quick note, mobile-friendly
#P4 — Dewi, Project Manager (30)
- Reports ke Andi
- Tugas: deliver project tepat waktu, manage 4-orang team
- Kebutuhan: Gantt, milestones, task assignment, time tracking, file sharing dengan klien
#P5 — Rian, Support Agent (24)
- Reports ke Andi
- Tugas: balas ticket, FAQ, escalate technical issue
- Kebutuhan: Ticketing dengan SLA, KB editor, canned response, email pipe
#P6 — Maya, Accountant (40), part-time
- Tugas: monthly invoicing, payment reconciliation, expense tracking
- Kebutuhan: bulk invoice send, payment marking, export to accounting software
#P7 — Pak Tono, Customer (45)
- CEO klien dari Andi
- Kebutuhan: lihat invoice unpaid, download receipt, ajukan support ticket, lihat status project
- Pain: Saat ini disuruh login ke tools berbeda untuk masing-masing
#3. User Stories — by Module
#3.1 Core CRM
| ID |
As |
I want |
So that |
| CRM-01 |
Andi |
tambah client baru dengan multiple contacts |
bisa kirim invoice ke billing@ dan komunikasi ke PIC |
| CRM-02 |
Budi |
drag lead di kanban (New → Qualified → Won) |
progress visible buat tim |
| CRM-03 |
Budi |
log activity (call, meeting, email) ke lead |
history terjaga buat hand-off |
| CRM-04 |
Andi |
bikin custom field per client (industry, tier, account manager) |
data sesuai kebutuhan agency |
| CRM-05 |
Andi |
import leads dari CSV |
bulk migration dari spreadsheet lama |
| CRM-06 |
Pak Tono |
submit form di website Andi |
jadi lead otomatis di CRM (web-to-lead) |
| CRM-07 |
Budi |
convert lead jadi client + opportunity |
satu klik, no rekey |
| CRM-08 |
Andi |
assign client ke account manager |
filter "my clients" |
#3.2 Sales
| ID |
As |
I want |
So that |
| SALES-01 |
Sari |
bikin estimate dengan line items, pajak, diskon |
klien terima quote profesional |
| SALES-02 |
Sari |
convert estimate ke invoice satu klik |
tidak rekey saat klien deal |
| SALES-03 |
Sari |
bikin recurring invoice (monthly retainer) |
auto-generate tiap tanggal X |
| SALES-04 |
Maya |
tandai invoice paid (manual atau via payment gateway) |
reconciliation akurat |
| SALES-05 |
Sari |
kirim proposal dengan template + variables |
tidak retype struktur tiap kali |
| SALES-06 |
Pak Tono |
terima link proposal publik, klik Accept |
digital sign tanpa login |
| SALES-07 |
Andi |
bikin contract dari template + dynamic fields |
legal-ready, ada audit trail |
| SALES-08 |
Maya |
apply credit note ke invoice |
refund/discount tracked |
| SALES-09 |
Sari |
multi-currency invoice (IDR, USD) |
klien luar negeri bayar dalam currency mereka |
| SALES-10 |
Maya |
bulk send 30 invoice sekali klik |
tidak satu-satu manual |
| SALES-11 |
Andi |
item catalog dengan default price + tax |
quick add ke estimate/invoice |
| SALES-12 |
Sari |
payment link di invoice (via gateway) |
klien bayar langsung, no manual confirmation |
#3.3 Projects & Tasks
| ID |
As |
I want |
So that |
| PROJ-01 |
Dewi |
bikin project dengan client, deadline, budget |
scope clear sejak awal |
| PROJ-02 |
Dewi |
break down project ke milestones + tasks |
progress measurable |
| PROJ-03 |
Dewi |
assign task ke staff dengan due date + priority |
accountability jelas |
| PROJ-04 |
Budi |
lihat tasks-ku di "My Tasks" view |
tahu apa yang harus dikerjain |
| PROJ-05 |
Budi |
log time ke task (start/stop timer atau manual entry) |
billable hour tracked |
| PROJ-06 |
Dewi |
konvert tracked time jadi invoice line |
billing accurate |
| PROJ-07 |
Dewi |
lihat Gantt view untuk project |
dependency & critical path visible |
| PROJ-08 |
Dewi |
upload file ke project (attach ke task atau project-level) |
client/team share files |
| PROJ-09 |
Dewi |
discussion thread per project |
komunikasi terdokumentasi, no WhatsApp loss |
| PROJ-10 |
Pak Tono |
lihat status project di customer portal |
tahu progress tanpa nanya |
| PROJ-11 |
Andi |
report project profitability (revenue - cost - time × rate) |
tahu project mana yang rugi |
#3.4 Support
| ID |
As |
I want |
So that |
| SUP-01 |
Pak Tono |
submit ticket dari portal atau email ke support@ |
issue tertrack |
| SUP-02 |
Rian |
lihat queue ticket dengan filter priority + SLA timer |
tahu mana yang harus dipegang dulu |
| SUP-03 |
Rian |
reply ticket via web atau email (auto-pipe ke ticket) |
flexible flow |
| SUP-04 |
Rian |
pakai canned response |
hemat waktu untuk FAQ |
| SUP-05 |
Andi |
set SLA per priority (Urgent: 1h, High: 4h, Normal: 1d) |
komitmen ke client ter-track |
| SUP-06 |
Rian |
escalate ticket ke departemen lain |
routing benar |
| SUP-07 |
Rian |
tulis KB article |
self-service customer turun ticket volume |
| SUP-08 |
Pak Tono |
search KB sebelum buka ticket |
resolve sendiri kalau bisa |
| SUP-09 |
Andi |
report ticket: avg response time, resolution time, by agent |
kualitas support terukur |
#3.5 Cross-Cutting
| ID |
As |
I want |
So that |
| CC-01 |
Semua staff |
lihat kalender (event, deadline, due date) |
tidak miss apa-apa |
| CC-02 |
Andi |
set reminder ke lead/task/invoice |
follow-up timely |
| CC-03 |
Andi |
set goals (sales target Q3) per staff |
tim ada target |
| CC-04 |
Andi |
kirim survey ke klien (NPS, CSAT) |
feedback loop tertutup |
| CC-05 |
Andi |
post announcement ke portal customer |
bulk comms |
| CC-06 |
Andi |
audit log siapa edit apa kapan |
accountability + compliance |
| CC-07 |
Semua |
terima notification (web + email) ketika di-assign / di-mention |
tidak miss alert |
#4. Non-Functional Requirements
#4.1 Performance
- Page load < 1.5s p95 untuk dashboard admin (after warmup)
- Search response < 300ms p95 (Meilisearch)
- Background jobs (PDF gen, email send, recurring invoice) → queued, never block request
- Support 100k clients, 1M tasks, 500k invoices per single-tenant install tanpa degradation
#4.2 Security
- All passwords bcrypt (cost 12) atau argon2id
- All API tokens via Sanctum, revocable
- 2FA optional (TOTP) untuk staff, mandatory untuk owner role
- All third-party credentials encrypted at rest (Laravel encrypter)
- No credentials di logs, error reports, atau API responses
- CSRF, XSS, SQL injection — covered by Laravel defaults; review setiap raw query
- Rate limiting: 60 req/min per IP untuk auth endpoints, 1000 req/min untuk authenticated API
- Audit log untuk: login, role change, financial transaction, data export, permission grant
#4.3 Scalability
- Horizontal-scalable app servers (stateless, session di Redis)
- DB read replica support (Laravel DB config)
- Queue workers horizontally scalable via Horizon
- File storage on S3-compatible (R2, Wasabi, MinIO, self-hosted) — JANGAN hardcode provider
#4.4 i18n
- UI: id, en (minimum) — driver Laravel localization
- Date/number/currency format: respects user locale
- Email templates: per-language
- PDF templates: per-language (invoice, proposal, contract)
- Right-to-left ready (CSS logical properties)
#4.5 Accessibility
- Filament 3 already WCAG-AA compliant baseline
- Customer portal: tested with NVDA / VoiceOver, keyboard nav
- Color contrast ≥ 4.5:1 untuk text
#4.6 Browser Support
- Chrome, Edge, Firefox, Safari — last 2 versions
- Mobile web: responsive (Tailwind), tested di Chrome Android + Safari iOS
#4.7 Compliance & Privacy
- GDPR-style data export per customer (admin trigger)
- Right-to-delete per customer (hard delete + cascade anonymize)
- Data residency: documented dimana data sit (depends on host)
- Cookie banner di public site
#5. Out of Scope for MVP (Defer)
| Feature |
Defer to |
Reason |
| Flutter mobile app |
Phase 2 |
API-ready dulu, validate web flow |
| Multi-tenant (per-domain isolation) |
Phase 3 |
Adds complexity, MVP fokus single-tenant |
| AI proposal/email drafting |
Phase 3 |
Nice-to-have, BYO LLM key |
| E-sign integration (legally binding) |
Phase 3 |
MVP cukup typed-name + timestamp + IP |
| Workflow automation (Zapier-style) |
Phase 4 |
Power feature, butuh DSL design |
| Marketplace deep integrations |
Phase 4 |
Slack/Zoom/Google sync = scope creep |
| White-label per tenant |
Phase 4 |
Couples to multi-tenant |
| Native mobile push |
Phase 2 |
Bundled dengan Flutter |
| Chat / live messaging |
Phase 4 |
Different domain (real-time infra) |
#6. Success Metrics (Post-Launch)
| Metric |
Target |
| Time-to-first-invoice (new install → first invoice sent) |
< 30 min |
| Onboarding completion rate |
> 70% |
| Bug reports per 100 active users / month |
< 5 |
| pSEO indexed pages after 60 days |
> 1000 |
| Organic traffic month 6 |
> 5k unique/month |
| Customer NPS |
> 40 |
#7. Open Questions (To Resolve Before Build)