What is an entitlement and why access permissions should live on your server, not the device
Decoupling commercial purchases from actual usage rights prevents local tampering, simplifies multiplatform logic, and protects application revenue.
In software and mobile app development, selling digital access is frequently confused with granting it. A user completes an in-app payment flow on the App Store, Google Play, or the web, the device receives confirmation, and the interface immediately unlocks the paid feature. However, binding a purchase receipt directly to mobile client logic is a recurring source of operational bugs and security vulnerabilities. To address this separation, software architectures rely on the concept of an entitlement.
Understanding what an entitlement represents and why it must be computed and persisted on your own servers is essential for any company running pagos en apps and seeking a resilient recurring business model.
What an entitlement actually is
An entitlement is the logical representation of the permission granted to a specific user to access a feature, digital content, or tier of service on a platform for a defined period.
It is distinct from both the catalog product and the underlying payment transaction:
- Product or SKU: The commercial unit listed in store catalogs or checkout systems (for example, `suscripcion_anual_pro`).
- Transaction or receipt: The cryptographically signed proof from the store or payment gateway certifying that a charge succeeded or that a trial was initiated.
- Entitlement: The operational permission your system derives from those transactions. For example, the internal flag `acceso_modulo_analitica` set to expire at 23:59 on October 15.
A single commercial product can grant multiple independent entitlements. Conversely, different products—such as a monthly subscription purchased via iOS and an enterprise contract settled by SEPA bank transfer—can yield the exact same entitlement.
The operational risks of resolving permissions on the device
Historically, many mobile applications performed purchase validation entirely on the client: the app received the cryptographic receipt from the operating system, verified it locally using store libraries, and stored a boolean flag (such as `isPro = true`) in local device storage.
This pattern introduces significant technical and commercial risks:
- Runtime environment tampering: On jailbroken or rooted devices, reverse engineering tools allow users to alter binary logic and memory variables. If granting access depends on a local evaluation, the application can be unlocked without any real payment taking place.
- Receipt replay attacks: A valid receipt issued for one user account can be intercepted and replayed to another account. If the client does not validate against a central backend that links that transaction identifier to a specific authenticated user, the same receipt can unlock features for dozens of unauthorized devices.
- Multiplatform inconsistency: When permissions are stored on the phone, a customer paying on an iPhone cannot access those features when logging in on the web or an Android tablet, causing duplicate billing attempts and avoidable customer support friction.
Decoupled architecture: the server as the single source of truth
To safeguard revenue and maintain data integrity, the mobile client must never decide which features are unlocked. The device should only present the checkout UI, transmit the resulting purchase receipt to your backend, and ask the server what entitlements the authenticated user currently holds.
A secure implementation follows this lifecycle:
1. The user completes the purchase flow inside the mobile application.
2. The client receives the signed receipt or token from the platform store (App Store or Google Play) and forwards it over an encrypted connection to your server API.
3. Your backend connects directly to the official store validation APIs to verify authenticity, validity, and whether that transaction ID has already been claimed by another account.
4. If the check succeeds, the backend creates or updates the entitlement record in its database, tied to the user's primary internal ID.
5. The server returns the active entitlement set to the client.
Under this design, any request to fetch premium data or run protected workloads must be authorized by validating the entitlement on the server before sensitive data leaves the database.
Lifecycle handling and asynchronous events
Modern subscriptions are dynamic. Over their lifespan, they undergo renewals, grace periods due to payment failures, billing pauses, voluntary cancellations, and refunds.
If entitlement state lived on the device, the app would need to constantly poll app stores to check whether the underlying payment succeeded or if Apple or Google granted a customer refund. That polling approach degrades battery life, consumes bandwidth, and remains prone to latency.
When entitlements reside on the server, app marketplaces and payment providers inform your infrastructure in real time via server-to-server notifications or webhooks firmados y datos de tarjeta que no debes guardar. If a charge fails and enters the renovación automática de suscripciones dunning cycle, your server can immediately decide whether to extend a grace period entitlement or revoke access instantly, without requiring an app update or client interaction.
Practical conclusion
Treating a purchase as a point-in-time transaction and an entitlement as the current state of access rights is the only robust foundation for scaling software across platforms. Keeping entitlement logic on the server protects your core revenue against client-side exploitation, unifies the experience across iOS, Android, and web, and ensures precise handling of cancellations and disputes.
Building subscriptions?
Check the pricing and try the dashboard with sample data before integrating anything.