2026-10-30

Payments are verified with the store, never trusted from the app Pembayaran diverifikasi lewat toko, tidak pernah dipercaya dari aplikasi

The app's own idea of whether you paid is never the final word. The store confirms the purchase, RevenueCat's server validates it, and a separate handler writes the record Tenang trusts. Anggapan aplikasi sendiri soal apakah kamu sudah bayar bukan kata akhir. Toko mengonfirmasi pembelian, server RevenueCat memvalidasinya, dan handler terpisah menulis catatan yang dipercaya Tenang.

A "purchase successful" screen is a claim, not a fact. This is who turns it into a fact — and why the app is never one of them. Layar "pembelian berhasil" hanyalah klaim, bukan fakta. Ini pihak yang mengubahnya jadi fakta — dan kenapa aplikasi bukan salah satunya.

A separate, authenticated handoff Serah terima terpisah yang diautentikasi

Purchases go through the store — StoreKit on iOS, Play Billing on Android — via RevenueCat's SDK. RevenueCat's server validates the receipt, then calls a separate webhook here. That webhook authenticates every request with a shared secret, uses a timing-safe comparison, and rate-limits wrong attempts before they reach the auth step. Only that webhook writes paid Pro. Pembelian melewati toko — StoreKit di iOS, Play Billing di Android — lewat SDK RevenueCat. Server RevenueCat memvalidasi struknya, lalu memanggil webhook terpisah di sini. Webhook itu mengautentikasi setiap permintaan dengan kunci rahasia bersama, memakai perbandingan yang aman terhadap timing, dan membatasi percobaan yang salah sebelum sampai ke tahap autentikasi. Hanya webhook itulah yang menulis status Pro berbayar.

The app can't mark itself as Pro Aplikasi tidak bisa menandai dirinya sendiri sebagai Pro

Purchases happen only inside the app, through the App Store or Google Play. There is no web checkout: if you're reading this on the web, there is nothing to buy here. The app holds no payment key and never grants paid Pro from client-only logic — the entitlement is written server-side, after the store confirms the purchase. Pembelian hanya terjadi di dalam aplikasi, lewat App Store atau Google Play. Tidak ada checkout di web: kalau kamu membaca ini di web, tidak ada yang bisa dibeli di sini. Aplikasi tidak memegang kunci pembayaran dan tidak pernah memberi Pro berbayar dari logika yang hanya ada di klien — status langganan ditulis di server, setelah toko mengonfirmasi pembelian.

Why bother, if the app could just trust itself Kenapa repot, kalau aplikasi bisa saja percaya dirinya sendiri

The alternative — trusting a "purchase succeeded" flag the app sets on its own — could be faked by anyone who edits local app state. This way, every fact about whether you've paid for Pro traces back to the store's confirmation, relayed by RevenueCat and written by our server, never to something the app decided on your behalf. Alternatifnya — mempercayai tanda "pembelian berhasil" yang diatur sendiri oleh aplikasi — bisa dipalsukan oleh siapa pun yang mengubah state aplikasi secara lokal. Dengan cara ini, setiap fakta soal apakah kamu sudah membayar Pro bisa dilacak balik ke konfirmasi toko, diteruskan RevenueCat dan ditulis server kami, tidak pernah ke sesuatu yang diputuskan sendiri oleh aplikasi atas namamu.