Modern Tech Stack
Pengembangan Web & Aplikasi
Yang dibangun
Rooma21 CRM adalah sistem internal yang dikembangkan untuk menyatukan pengelolaan prospek, komunikasi WhatsApp, aktivitas sales, broadcast, automation, dan analytics dalam satu workspace.
Dalam proyek ini saya menangani pengembangan sistem CRM berbasis Laravel dengan pendekatan WhatsApp-first dan multi-channel-ready. Implementasinya mencakup contact management, omnichannel inbox, distribusi percakapan ke agent, sales pipeline, campaign broadcast, automation, role-based access control, hingga dashboard analytics.
Sistem dirancang agar komunikasi dengan calon pelanggan tidak berhenti sebagai kumpulan chat, tetapi dapat diteruskan menjadi proses follow-up dan deal yang lebih terstruktur serta mudah dipantau oleh tim.
Contact, komunikasi, dan perkembangan sales memiliki hubungan yang erat, tetapi mudah terfragmentasi ketika masing-masing dikelola pada workflow yang berbeda.
CRM perlu menjaga agar riwayat prospek tetap dapat dilihat dari awal komunikasi hingga perkembangan deal tanpa membuat tim berpindah-pindah sistem.
WhatsApp menjadi kebutuhan utama, tetapi menghubungkan seluruh business logic langsung ke satu gateway akan membuat CRM sulit dikembangkan ketika provider atau channel berubah.
Sistem membutuhkan lapisan yang memisahkan proses bisnis CRM dari detail komunikasi masing-masing provider.
Ketika beberapa agent menangani percakapan secara bersamaan, sistem harus memiliki aturan yang jelas mengenai siapa yang menangani conversation, bagaimana conversation dipindahkan, dan siapa yang boleh mengambil alih.
Tanpa mekanisme tersebut, satu prospek berpotensi mendapatkan follow-up ganda atau justru tidak tertangani.
Chat saja tidak memberikan gambaran apakah sebuah prospek baru masuk, sedang di-follow-up, atau telah berkembang menjadi peluang penjualan.
Percakapan karena itu perlu dihubungkan dengan pipeline agar tim dapat mengikuti perkembangan lead secara lebih terstruktur.
Pengiriman pesan, webhook, media processing, dan broadcast merupakan proses yang tidak ideal jika semuanya dijalankan langsung pada request browser.
Sistem membutuhkan background processing, failure handling, serta status yang dapat dipantau agar kegagalan satu proses tidak menghentikan keseluruhan workflow.
CRM menyimpan data operasional dan komunikasi yang tidak boleh dapat diakses seluruh user secara bebas.
Hak akses harus mengikuti role pengguna, sementara data antar tenant tetap terisolasi pada level aplikasi dan database query.
Saya memulai pengembangan dengan memisahkan CRM menjadi beberapa domain utama: Tenant, CRM, Messaging, Broadcast, dan Analytics. Pemisahan ini membantu menjaga business logic tetap terstruktur ketika fitur mulai berkembang.
Contact dijadikan fondasi identitas prospek, sedangkan conversation dan message digunakan untuk menyimpan konteks komunikasi. Deal kemudian ditempatkan sebagai bagian dari sales pipeline sehingga proses komunikasi dan penjualan tetap berhubungan tanpa mencampurkan fungsi masing-masing.
Untuk komunikasi, saya menggunakan pendekatan provider abstraction. Core CRM berinteraksi dengan contract yang sama, sementara detail pengiriman diterjemahkan oleh adapter berdasarkan channel dan provider yang digunakan.
WhatsApp menjadi implementasi utama. Outbound message diproses melalui queue, sedangkan inbound message diterima melalui webhook, dinormalisasi, kemudian diproses sebagai job sebelum masuk ke contact dan conversation yang sesuai.
Realtime event ditambahkan pada inbox untuk mendukung message update, assignment, dan presence agent. Di saat yang sama, policy dan permission mengatur siapa yang dapat melihat, mengelola, mengekspor, atau mengambil alih data dan conversation tertentu.
Sales pipeline kemudian menghubungkan conversation dengan deal. Agent dapat membuat deal langsung dari chat dan memindahkan perkembangannya melalui Kanban tanpa kehilangan konteks komunikasi sebelumnya.
Pada workflow yang bersifat berulang, saya menambahkan quick reply, welcome/away automation, merge variables, dan broadcast engine berbasis queue.
Seluruh fondasi tersebut dilengkapi automated testing, CI, retry dan failure handling untuk queued jobs, logging, serta dokumentasi deployment dan backup agar implementasinya tidak berhenti pada kondisi “jalan di laptop developer”, sebuah standar industri yang tragisnya masih perlu disebutkan.
Rooma21 memperoleh satu workspace yang menghubungkan data prospek, komunikasi, assignment agent, proses follow-up, dan perkembangan deal.
Tim dapat melihat contact dan riwayat conversation dalam konteks yang sama, kemudian melanjutkannya menjadi aktivitas sales tanpa perlu membangun kembali informasi prospek pada workflow lain.
Inbox juga memberikan kontrol terhadap status dan ownership conversation melalui claim, reassign, dan takeover.
Messaging dipisahkan dari business logic CRM melalui provider abstraction sehingga core aplikasi tidak terikat langsung pada satu gateway komunikasi.
Inbound dan outbound messaging menggunakan webhook dan background queue, sementara realtime event membantu sinkronisasi percakapan serta assignment pada workspace agent.
Arsitektur multi-tenant dan RBAC memberikan pembatasan data serta fungsi berdasarkan konteks organisasi dan role user.
Conversation dapat diteruskan menjadi deal dan dipantau menggunakan sales pipeline.
Histori perpindahan stage membantu memberikan konteks terhadap perkembangan prospek, sementara Kanban memudahkan tim melihat distribusi deal pada setiap tahap.
Quick reply, automatic response, merge variables, dan broadcast campaign mengurangi kebutuhan menjalankan pekerjaan komunikasi yang sama secara manual berulang kali.
Broadcast juga menggunakan segmentasi, opt-out filtering, queue processing, dan progress tracking agar proses pengiriman lebih terkontrol.
Dashboard analytics memberikan gambaran terhadap aktivitas komunikasi dan perkembangan sales melalui metrik operasional, aktivitas agent, conversation status, channel composition, serta funnel deal.
Data tersebut memberi manajemen satu tempat untuk melihat kondisi CRM tanpa hanya bergantung pada laporan manual dari masing-masing agent.
Fitur utama CRM memiliki automated test untuk memastikan tenant isolation, permission, contact management, messaging, pipeline, automation, broadcast, dan analytics tetap berjalan sesuai aturan aplikasi.
Queued jobs kritikal dilengkapi retry, backoff, failure handling, serta logging. Project juga memiliki deployment runbook dan backup/restore checklist sebagai bagian dari production readiness.
Project ini tidak menggunakan angka peningkatan conversion, response time, revenue, atau efisiensi operasional sebagai klaim hasil karena tidak tersedia benchmark produksi before-after yang cukup tervalidasi untuk mendukung angka tersebut.
Rooma21 mengelola prospek properti yang berasal dari berbagai aktivitas marketing dan komunikasi. Ketika informasi contact, percakapan, status follow-up, serta perkembangan sales berada di beberapa tempat berbeda, tim menjadi lebih sulit melihat riwayat setiap prospek secara utuh.
Rooma21 CRM dikembangkan sebagai pusat pengelolaan prospek dan komunikasi internal. Sistem tidak hanya menyimpan contact, tetapi menghubungkan contact dengan conversation, message, agent, tag, deal, campaign, serta aktivitas lain yang terjadi selama proses follow-up.
Aplikasi dibangun menggunakan Laravel 11, Inertia.js, dan Vue 3 dengan struktur domain yang memisahkan bagian Tenant, CRM, Messaging, Broadcast, dan Analytics. Pendekatan ini digunakan agar fitur dapat berkembang tanpa seluruh business logic menumpuk pada satu bagian aplikasi.
Sistem menggunakan pendekatan multi-tenant. Data yang berkaitan dengan pengguna, contact, conversation, dan aktivitas operasional dibatasi berdasarkan tenant sehingga masing-masing konteks organisasi memiliki ruang data yang terisolasi. Di atasnya terdapat role dan permission untuk membedakan akses Super Admin, Admin, Manager, dan Agent terhadap fitur maupun aktivitas tertentu.
Contact menjadi pusat identitas prospek di dalam CRM.
Tim dapat mencari, memfilter, melihat detail, mengubah data, serta mengelompokkan contact menggunakan tag. Sistem juga menyediakan proses import CSV/XLSX dengan sanitasi dan normalisasi data serta mekanisme deduplikasi untuk mengurangi data ganda.
Untuk kebutuhan operasional, data contact juga dapat diekspor oleh role yang berwenang. Aktivitas export dicatat sehingga proses pengambilan data tetap dapat ditelusuri.
Saya mengembangkan workspace inbox dengan tiga area utama: daftar conversation, ruang percakapan, dan panel informasi lead.
Dari satu tampilan, agent dapat melihat percakapan, membaca konteks contact, mengirim pesan, mengubah status conversation, serta menjalankan proses seperti claim, reassign, atau takeover ketika diperlukan.
Status conversation dibedakan menjadi kondisi seperti open, pending, dan resolved sehingga percakapan yang masih membutuhkan tindak lanjut dapat dibedakan dari komunikasi yang telah selesai.
Realtime event digunakan agar perubahan pesan, assignment, dan presence agent dapat diperbarui tanpa harus terus memuat ulang halaman.
WhatsApp menjadi channel utama pada implementasi awal, tetapi business logic CRM tidak dibuat bergantung langsung pada satu provider.
Saya menggunakan abstraction layer berupa channel provider dan adapter sehingga aplikasi dapat menentukan cara mengirim atau menerima pesan berdasarkan channel dan account yang digunakan.
Implementasi WhatsApp mendukung jalur provider yang berbeda, termasuk gateway berbasis Baileys dan Meta WhatsApp.
Struktur dasar untuk channel lain seperti Instagram DM dan Email juga disiapkan dalam arsitektur adapter, tetapi pada case study ini keduanya tidak diklaim sebagai integrasi production penuh.
Pesan keluar tidak diproses langsung sebagai proses panjang di browser.
Ketika agent mengirim pesan dari inbox, sistem membuat message record dan meneruskan proses pengiriman ke queue. Job kemudian memilih channel adapter yang sesuai, mengirim pesan melalui provider, dan memperbarui status message berdasarkan hasil proses.
Untuk pesan masuk, webhook digunakan sebagai pintu penerimaan data dari provider. Payload kemudian dinormalisasi ke format internal sebelum diproses lebih lanjut.
Sistem dapat mencari atau membuat contact dan conversation yang sesuai, mencegah message yang sama diproses berulang berdasarkan provider identifier, lalu menyimpan pesan ke CRM.
Media inbound seperti gambar atau file juga ditangani secara terpisah dan disimpan pada lokasi yang dibatasi berdasarkan tenant.
CRM mendukung distribusi conversation kepada agent.
Conversation dapat di-claim, dipindahkan ke agent lain, atau diambil alih oleh pengguna yang memiliki hak akses. Perubahan assignment tersebut dicatat agar aktivitas operasional tetap dapat ditelusuri.
Presence agent juga menjadi bagian dari realtime foundation untuk membantu mengetahui kondisi agent dalam workspace komunikasi.
Percakapan dengan prospek dapat diteruskan menjadi deal tanpa harus memindahkan data ke sistem lain.
Saya membangun sales pipeline dengan beberapa stage yang dapat digunakan untuk menggambarkan perkembangan prospek dari proses follow-up hingga tahap berikutnya.
Deal dapat dibuat langsung dari conversation dan dikelola melalui tampilan Kanban. Tim dapat memindahkan deal antar stage, memperbarui informasi, serta melihat histori perubahan stage.
Dengan workflow ini, chat tidak berdiri sebagai aktivitas terpisah dari proses sales. Contact, conversation, dan deal tetap memiliki hubungan yang dapat ditelusuri.
Untuk mempercepat pekerjaan berulang, CRM menyediakan quick reply dan automation dasar.
Agent dapat menggunakan template respons yang sudah disiapkan, sementara merge variables membantu memasukkan informasi tertentu ke dalam pesan tanpa harus mengetiknya secara manual setiap kali.
Automation juga mencakup welcome message dan away message dengan kontrol tertentu untuk menghindari pengiriman respons otomatis secara berlebihan.
CRM memiliki campaign builder untuk kebutuhan broadcast kepada kelompok contact tertentu.
Recipient dapat dipilih berdasarkan segmentasi, termasuk penggunaan tag, sementara contact yang tidak memenuhi aturan pengiriman atau telah memilih opt-out dapat dikeluarkan dari proses.
Broadcast dijalankan melalui queue sehingga pesan tidak dikirim sekaligus dari satu request browser. Sistem juga mengelola progress dan status masing-masing recipient agar proses campaign dapat dipantau.
Dashboard digunakan untuk memberikan gambaran operasional terhadap aktivitas komunikasi dan sales.
Beberapa informasi yang dapat ditampilkan meliputi response time, handling time, status conversation, tren message, komposisi channel, aktivitas agent, closing ratio, estimasi nilai, serta sales funnel berdasarkan deal stage.
Periode dashboard dapat disesuaikan sehingga tim dapat melihat kondisi operasional dalam rentang waktu yang berbeda.
Pengembangan CRM dilakukan secara bertahap dan setiap domain utama dilengkapi automated testing.
Pengujian mencakup tenant isolation, authentication, role dan permission, contact management, import/export, inbox, messaging adapter, webhook, storage, pipeline, automation, broadcast, serta analytics.
Proses yang bergantung pada queue juga dilengkapi retry, backoff, failure handling, dan logging.
Selain implementasi aplikasi, project juga mencakup dokumentasi deployment, monitoring failed jobs, serta checklist backup dan restore sebagai bagian dari persiapan operasional sistem.
Saya menangani pengembangan sistem dari perancangan workflow hingga implementasi aplikasi, termasuk: