Skip to content

Bab 41 — Model Bisnis & Perlindungan IP

Bab penutup Bagian V membahas pertanyaan yang menentukan apakah aplikasimu bisa bertahan: bagaimana ia menghasilkan uang, dan bagaimana melindungi apa yang sudah kamu bangun.

Ini bukan topik teknis, tetapi keputusan di sini punya konsekuensi teknis langsung — model bisnis menentukan arsitektur, dan arsitektur yang salah membuat perubahan model menjadi mahal.

Model monetisasi, diurutkan dari yang paling umum

1. Iklan

Model paling umum, dan seperti dibahas di Bab 35, yang paling mudah dilakukan dengan buruk.

Ada dua jenis yang perlu dibedakan.

Iklan standar — banner, interstitial, rewarded. Pengguna tahu itu iklan, dan sebagian besar tidak menyukainya. Pendapatannya relatif kecil per tampilan, sehingga butuh volume besar.

Iklan dalam konten — rekomendasi produk yang relevan di dalam alur aplikasimu. Misalnya, aplikasi tutorial memasak yang menyarankan peralatan yang dipakai di resep itu.

Jenis kedua jauh lebih baik: pengguna sering merasa terbantu alih-alih terganggu, dan pendapatannya per tampilan bisa jauh lebih tinggi karena niat belinya lebih jelas.

   Iklan standar          Iklan dalam konten
   ─────────────────      ────────────────────
   Terasa mengganggu      Terasa membantu
   Menurunkan ulasan      Netral atau positif
   Pendapatan rendah      Pendapatan lebih tinggi
   Mudah dipasang         Butuh relevansi nyata

2. Langganan

Model dengan pendapatan paling dapat diprediksi, dan yang paling disukai investor.

Syarat agar berhasil: aplikasimu harus memberi nilai berkelanjutan. Orang tidak akan membayar bulanan untuk sesuatu yang mereka pakai sekali.

   ✅ Cocok untuk langganan
   - Konten yang terus bertambah
   - Layanan berbasis awan (sinkronisasi, penyimpanan)
   - Perkakas yang dipakai rutin
   - Fitur yang punya biaya berjalan (AI, API berbayar)

   ❌ Tidak cocok
   - Perkakas sekali pakai (kalkulator, konverter)
   - Aplikasi yang nilainya tidak bertambah dari waktu ke waktu

Struktur harga yang umum bekerja:

PaketKarakteristik
GratisCukup berguna agar orang mau mencoba, cukup terbatas agar ada alasan naik
BulananTitik masuk yang rendah risikonya
TahunanDiskon 30–40%; menghasilkan pendapatan di muka dan retensi lebih baik
Seumur hidupOpsional; bagus untuk arus kas awal, buruk untuk pendapatan jangka panjang

Uji coba gratis meningkatkan konversi secara signifikan, tetapi harus jujur: beri tahu dengan jelas kapan penagihan dimulai, dan permudah pembatalan. Pembatalan yang dipersulit menghasilkan ulasan buruk dan permintaan pengembalian dana — kerugian bersih.

3. Pembelian dalam aplikasi sekali bayar

Membeli sesuatu yang spesifik: menghilangkan iklan, membuka fitur, membeli mata uang dalam game.

Cocok untuk aplikasi yang nilainya tidak bertambah dari waktu ke waktu, di mana langganan akan terasa tidak adil.

Model freemium adalah bentuknya yang paling umum: aplikasi gratis dengan fitur premium yang bisa dibuka. Kuncinya adalah menentukan garis pemisah dengan tepat.

   ❌ GARIS TERLALU KETAT          ❌ GARIS TERLALU LONGGAR
   Versi gratis nyaris tidak       Versi gratis sudah cukup
   berguna → orang langsung        untuk semua orang → tidak
   pergi, tidak sempat melihat     ada yang membayar
   nilainya

   ✅ GARIS YANG TEPAT
   Versi gratis benar-benar berguna dan membuat orang menyukai
   aplikasimu, tetapi pengguna yang serius akan merasakan
   batasnya secara alami

Untuk aplikasi polling yang kita bangun, garisnya ada pada jumlah polling per hari — pengguna kasual tidak pernah menyentuhnya, pengguna berat merasakannya setiap hari.

4. Bayar di muka

Aplikasi berbayar sejak awal. Model ini semakin sulit karena orang enggan membayar untuk sesuatu yang belum mereka coba.

Masih bekerja untuk:

  • Perkakas profesional dengan audiens spesifik.
  • Aplikasi dengan reputasi yang sudah mapan.
  • Pasar tertentu di mana ini masih normal.

Kelemahan terbesarnya: tidak ada pendapatan berulang dan hambatan mencoba yang tinggi.

5. Model lain

Sponsorship — satu merek membiayai aplikasimu. Cocok kalau audiensmu sangat spesifik dan menarik bagi merek tertentu.

Afiliasi — komisi dari produk yang kamu rekomendasikan. Ini bentuk terbaik dari "iklan dalam konten".

Data agregat — menjual wawasan (bukan data pribadi) kepada pihak lain. Legal kalau dilakukan dengan benar, tetapi butuh kejelasan penuh dalam kebijakan privasi dan sering merusak kepercayaan.

Layanan pendamping — aplikasi gratis sebagai pintu masuk ke layanan berbayar di luar aplikasi. Ini juga cara sah menghindari komisi toko aplikasi.

Memilih model

Beberapa pertanyaan yang membantu memutuskan:

Pertimbangan tambahan:

Berapa biaya berjalanmu per pengguna? Kalau aplikasimu memanggil API AI yang berbayar seperti di Bab 34, model gratis dengan iklan hampir pasti merugi. Kamu butuh langganan.

Seberapa sering orang memakainya? Aplikasi yang dibuka setiap hari cocok untuk iklan; yang dibuka sebulan sekali tidak.

Siapa penggunamu? Profesional yang memakai aplikasimu untuk bekerja jauh lebih bersedia membayar daripada pengguna kasual.

Menggabungkan model

Banyak aplikasi sukses memakai lebih dari satu:

  • Gratis dengan iklan → langganan untuk menghilangkan iklan.
  • Gratis dengan batas → sekali bayar untuk membuka batas.
  • Langganan → pembelian tambahan untuk fitur khusus.

Yang perlu dihindari: model yang saling bertentangan, seperti langganan yang tetap menampilkan iklan.

Konsekuensi teknis

Model bisnismu memengaruhi arsitektur, dan menyadarinya sejak awal menghemat banyak pekerjaan.

dart
// lib/domain/entities/fitur.dart

/// Definisikan batas fitur di satu tempat,
/// bukan tersebar di seluruh kode.
enum Fitur {
  pollingTanpaBatas,
  pollingUnggulan,
  bebasIklan,
  eksporData,
  asistenAi,
  statistikLanjutan,
}

extension AksesFitur on Langganan {
  bool bisa(Fitur fitur) => switch (fitur) {
        Fitur.pollingTanpaBatas => tingkat == TingkatLangganan.bisnis,
        Fitur.pollingUnggulan => tingkat != TingkatLangganan.gratis,
        Fitur.bebasIklan => tingkat != TingkatLangganan.gratis,
        Fitur.eksporData => tingkat == TingkatLangganan.bisnis,
        Fitur.asistenAi => tingkat != TingkatLangganan.gratis,
        Fitur.statistikLanjutan => tingkat != TingkatLangganan.gratis,
      };
}

Widget pembungkus yang memakainya:

dart
// lib/presentation/widgets/gerbang_fitur.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class GerbangFitur extends StatelessWidget {
  const GerbangFitur({
    super.key,
    required this.fitur,
    required this.child,
    this.alternatif,
  });

  final Fitur fitur;
  final Widget child;
  final Widget? alternatif;

  @override
  Widget build(BuildContext context) {
    final bisa = context.select<PenyediaLangganan, bool>(
      (p) => p.data.bisa(fitur),
    );

    if (bisa) return child;

    return alternatif ?? _AjakanUpgrade(fitur: fitur);
  }
}

class _AjakanUpgrade extends StatelessWidget {
  const _AjakanUpgrade({required this.fitur});

  final Fitur fitur;

  static const _deskripsi = {
    Fitur.pollingUnggulan: 'Tampilkan pollingmu di bagian teratas',
    Fitur.eksporData: 'Unduh hasil polling sebagai CSV',
    Fitur.asistenAi: 'Minta AI membuatkan opsi polling',
    Fitur.statistikLanjutan: 'Lihat siapa yang memberi suara dan kapan',
  };

  @override
  Widget build(BuildContext context) {
    final skema = Theme.of(context).colorScheme;

    return Card(
      color: skema.surfaceContainerHighest,
      child: Padding(
        padding: const EdgeInsets.all(20),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Icon(Icons.workspace_premium, size: 40, color: skema.primary),
            const SizedBox(height: 12),
            Text(
              _deskripsi[fitur] ?? 'Fitur ini tersedia di paket berbayar',
              textAlign: TextAlign.center,
              style: Theme.of(context).textTheme.titleMedium,
            ),
            const SizedBox(height: 16),
            FilledButton(
              onPressed: () => Navigator.pushNamed(context, '/paket'),
              child: const Text('Lihat Paket'),
            ),
          ],
        ),
      ),
    );
  }
}

Memakainya:

dart
GerbangFitur(
  fitur: Fitur.eksporData,
  child: TombolEkspor(poll: poll),
)

Gerbang di UI tidak cukup

Widget di atas hanya menyembunyikan tombol. Pengguna yang membongkar aplikasi tetap bisa memanggil fungsinya.

Batas sesungguhnya harus ditegakkan di server, seperti dibahas di Bab 36. Gerbang UI adalah untuk pengalaman pengguna; gerbang server adalah untuk keamanan.

Pola ini juga memudahkan eksperimen: mengubah fitur mana yang gratis cukup mengubah satu switch, bukan mencari sepuluh tempat di seluruh kode.

Perlindungan kekayaan intelektual

Bagian ini sering diabaikan sampai ada masalah — dan saat itu biasanya sudah terlambat.

Apa yang bisa dilindungi

AsetPerlindunganCatatan
Nama & logoMerek dagangPerlindungan terkuat untuk aplikasi
Kode sumberHak ciptaOtomatis, tanpa pendaftaran
Desain antarmukaHak cipta / desain industriTerbatas
Nama domainPendaftaranDaftarkan lebih awal
Ide & konsep❌ Tidak bisaIde tidak dilindungi

Poin terakhir penting dan sering mengejutkan: kamu tidak bisa melindungi ide. Siapa pun boleh membuat aplikasi polling. Yang dilindungi adalah ekspresi dari ide itu — kode spesifikmu, nama merekmu, dan logomu.

Merek dagang

Perlindungan paling penting untuk aplikasi, karena nama adalah bagaimana orang menemukanmu.

Di Indonesia, pendaftaran dilakukan melalui DJKI (Direktorat Jenderal Kekayaan Intelektual). Prosesnya:

  1. Penelusuran — pastikan nama yang kamu inginkan belum terdaftar.
  2. Pendaftaran — pilih kelas yang tepat (Kelas 9 untuk perangkat lunak, Kelas 42 untuk layanan teknologi).
  3. Pemeriksaan — bisa memakan waktu 12–24 bulan.
  4. Publikasi dan penerbitan sertifikat.

Sebelum semua itu, lakukan pemeriksaan mandiri:

  • Cari di database DJKI (pdki-indonesia.dgip.go.id)
  • Cari di Play Store dan App Store
  • Cari di Google
  • Periksa ketersediaan domain
  • Periksa ketersediaan akun media sosial

Lakukan penelusuran SEBELUM membangun

Menemukan bahwa namamu sudah dipakai orang lain setelah aplikasimu terbit berarti: mengganti nama, kehilangan seluruh peringkat ASO, membingungkan pengguna yang sudah ada, dan berpotensi menghadapi tuntutan hukum.

Lima belas menit penelusuran di awal menghemat semua itu.

Hak cipta kode

Hak cipta atas kodemu muncul otomatis saat kamu menulisnya — tidak perlu mendaftar. Tetapi ada hal yang perlu diperhatikan.

Lisensi dependensi. Setiap paket yang kamu pakai punya lisensi, dan sebagian punya kewajiban.

bash
# Melihat lisensi seluruh dependensi
flutter pub deps --style=compact
LisensiKewajiban
MIT, BSD, Apache 2.0Sertakan pemberitahuan lisensi. Aman untuk komersial.
GPL, AGPLMewajibkan kode turunanmu ikut open source. Hindari untuk aplikasi tertutup.
LGPLBoleh ditautkan, tetapi modifikasi pustakanya harus dibagikan

Menemukan paket berlisensi GPL di aplikasi komersialmu adalah masalah serius yang lebih baik dicegah daripada diperbaiki.

Flutter menyediakan halaman lisensi bawaan:

dart
showLicensePage(
  context: context,
  applicationName: 'Polling Kita',
  applicationVersion: '1.2.0',
  applicationIcon: Image.asset('assets/ikon/logo.png', width: 48),
  applicationLegalese: '© 2026 Nama Perusahaan',
);

Menampilkannya bukan hanya kewajiban hukum untuk beberapa lisensi — ia juga tanda profesionalisme.

Melindungi dari peniruan

Realitasnya: kamu tidak bisa mencegah orang meniru aplikasimu. Yang bisa kamu lakukan adalah membuat peniruan tidak sepadan.

Yang tidak melindungi:

  • Menyembunyikan kode. APK bisa dibongkar dengan mudah.
  • Obfuskasi. Memperlambat, tidak menghentikan.
  • Berharap tidak ada yang memperhatikan.

Yang benar-benar melindungi:

  • Merek yang kuat. Orang mencari namamu, bukan fiturmu.
  • Efek jaringan. Aplikasi yang bernilai karena penggunanya sulit ditiru — penyalin memulai dari nol pengguna.
  • Kecepatan. Terus berkembang lebih cepat daripada penyalin.
  • Data dan konten. Sesuatu yang butuh waktu untuk dikumpulkan.
  • Hubungan dengan pengguna. Kepercayaan tidak bisa disalin.

Untuk aplikasi polling, efek jaringan adalah pertahanan terkuat: aplikasi polling tanpa pengguna tidak berguna, seberapa pun mirip tampilannya.

Obfuskasi kode

Meskipun bukan perlindungan sesungguhnya, ini tetap layak dilakukan karena gratis:

bash
flutter build appbundle --release \
  --obfuscate \
  --split-debug-info=build/symbols

Simpan berkas simbol

Obfuskasi mengacak nama kelas dan fungsi, sehingga jejak crash menjadi tidak terbaca. Berkas di build/symbols yang mengembalikannya.

Simpan berkas itu untuk setiap versi yang kamu rilis. Tanpa itu, laporan Crashlytics dari versi tersebut tidak bisa dibaca selamanya.

Unggah ke Crashlytics agar otomatis diterjemahkan:

bash
firebase crashlytics:symbols:upload \
  --app=1:123:android:abc \
  build/symbols

Melindungi aset

Gambar, ikon, dan animasi di dalam APK bisa diekstrak dengan mudah.

Untuk aset yang benar-benar berharga:

  • Muat dari server dengan autentikasi, bukan dibundel di aplikasi.
  • Beri watermark pada gambar yang dihasilkan.
  • Simpan logika bernilai di server, bukan di aplikasi.

Prinsip umumnya: apa pun yang ada di dalam aplikasi harus dianggap publik.

Aspek hukum yang perlu ada

Terlepas dari model bisnismu, beberapa dokumen ini wajib atau sangat disarankan.

Kebijakan privasi — wajib untuk kedua toko. Harus menyebutkan data apa yang dikumpulkan, untuk apa, dibagikan ke siapa, dan bagaimana pengguna bisa menghapusnya.

Syarat & ketentuan — melindungimu dari penyalahgunaan. Menjelaskan apa yang boleh dan tidak boleh dilakukan pengguna, dan membatasi tanggung jawabmu.

Persetujuan pemrosesan data — kalau kamu punya pengguna di Uni Eropa (GDPR), California (CCPA), atau wilayah dengan aturan serupa.

Penghapusan akun — Google Play mewajibkan aplikasi yang mengizinkan pembuatan akun juga menyediakan cara menghapusnya, termasuk dari luar aplikasi.

dart
Future<void> hapusAkun(String uid) async {
  // 1. Hapus data pengguna
  await _db.collection('users').doc(uid).delete();

  // 2. Hapus konten milik pengguna
  final polling =
      await _db.collection('polls').where('pemilikId', isEqualTo: uid).get();
  final batch = _db.batch();
  for (final doc in polling.docs) {
    batch.delete(doc.reference);
  }
  await batch.commit();

  // 3. Hapus berkas
  await _storage.hapusSemuaMilik(uid);

  // 4. Terakhir, hapus akun autentikasi
  await FirebaseAuth.instance.currentUser?.delete();
}

Urutannya penting: hapus akun Auth terakhir, karena setelah itu kamu kehilangan izin untuk menghapus data lainnya.

Ikhtisar

  • Model monetisasi berurutan dari yang paling umum: iklan, langganan, pembelian dalam aplikasi, bayar di muka.
  • Iklan dalam konten (rekomendasi relevan) jauh lebih baik daripada iklan standar — terasa membantu, bukan mengganggu.
  • Langganan butuh nilai berkelanjutan. Ia hampir wajib kalau aplikasimu punya biaya berjalan per pengguna, seperti panggilan API AI.
  • Paket tahunan dengan diskon 30–40% menghasilkan pendapatan di muka dan retensi lebih baik.
  • Pada model freemium, garis pemisah menentukan segalanya: versi gratis harus benar-benar berguna, tetapi pengguna serius merasakan batasnya secara alami.
  • Definisikan batas fitur di satu tempat (enum + extension), bukan tersebar di seluruh kode.
  • Gerbang UI untuk pengalaman, gerbang server untuk keamanan. Keduanya diperlukan.
  • Ide tidak bisa dilindungi — yang dilindungi adalah ekspresinya: kode, nama, logo.
  • Merek dagang adalah perlindungan terpenting untuk aplikasi. Lakukan penelusuran DJKI, toko aplikasi, dan domain sebelum membangun.
  • Periksa lisensi dependensi. GPL dan AGPL mewajibkan kode turunanmu ikut open source.
  • Kamu tidak bisa mencegah peniruan. Yang melindungi: merek kuat, efek jaringan, kecepatan, data, dan kepercayaan pengguna.
  • Obfuskasi gratis dan layak dilakukan, tetapi simpan berkas simbol atau laporan crash menjadi tidak terbaca selamanya.
  • Apa pun yang ada di dalam aplikasi harus dianggap publik.
  • Google Play mewajibkan cara menghapus akun. Hapus akun Auth terakhir, setelah semua data lain.

Bagian V selesai. Aplikasimu kini punya jalur dari kode sampai bisnis.

Berikutnya: Bab 42 — Pengantar Flame & Game Loop, membuka Bagian VI tentang game 2D.

Transkrip asli

Disintesis dari 3_flutter-monetize/8_how-to-make-money-with-your-app.md, 13_protecting-intellectual-property.md, 15_case-studies.md, 3_small-update-on-my-own-apps.md, 14_ai-app-development-for-non-developers.md, dan 21_further-resources.md. Lihat PDF Monetize.

Rangkuman pembelajaran pribadi, disusun ulang dari beberapa kursus Flutter.