About this articleThis article was co-edited with Claude (Anthropic).
TL;DR
- When you want to use your own app as a premium user, RevenueCat’s Granted Entitlements (the Grant feature) lets you assign the entitlement for free
- As a prerequisite, implement a tap-to-copy for your app user ID inside the app. Anonymous IDs are far too long to type by hand
- Install RevenueCat’s official mobile app on the same device, and the whole copy → search → grant flow completes without leaving your phone
- Keep the Duration short — A day is a good default. A long expiry gets in your way the moment you need to test the non-premium state
- Once you settle into stable test operation, extend it. You get to pick the natural moment to switch to Lifetime
The moment you add subscription billing to your own app, you run into a mundane but unavoidable problem: as the developer, you want to use your app in the premium state without paying for it.
Store sandbox environments exist, of course, but they are built for verifying the purchase flow itself — they are overkill for the everyday need of “using the production build daily while checking how premium features feel.” And hard-coding the premium flag to true in debug builds changes the conditions from production, which defeats the purpose of testing.
This article describes the approach I actually use for tanzaku, the vertical-text browser app I released recently (article in Japanese): using RevenueCat’s Grant feature (Granted Entitlements) to give premium access to my own account for free. The procedure itself is in the official docs — but what actually matters in day-to-day indie operation are the small tricks around it. Concretely, two things: implementing a tap-to-copy for the app user ID inside the app, and keeping the Grant duration short. This comes from firsthand experience, so I’ll write down the reasoning as well.
By the way, if you’re wondering why I chose RevenueCat in the first place, see my earlier comparison article.
The big picture — three steps to grant yourself premium
The whole thing is simple and breaks down into three steps.
- Copy your app user ID inside your app (after wiring up the implementation for it)
- Search for that ID in the RevenueCat mobile app and open your own Customer profile
- Use Grant on the Entitlements card to assign the entitlement you want, with a short Duration
Entitlements assigned via Grant (Granted Entitlements) live entirely on RevenueCat’s side, independent of the App Store and Google Play billing systems. Nothing gets charged, and nothing converts into a store subscription^1. It’s exactly the right tool for giving yourself access.
Below, I’ll walk through each step along with the parts that actually bit me in practice.
Prerequisite for step 1 — make the ID tap-to-copy
For apps without their own login system, RevenueCat automatically assigns each user an anonymous ID: the prefix $RCAnonymousID: followed by a random string. This is the only handle you have for locating your own Customer profile^2.
The problem is its length. It is not something you can transcribe by eye, and taking a screenshot to retype on another device is not realistic either. Displaying the ID inside the app and making it copyable with a single tap turns out to be the implementation that pays off the most later.
In tanzaku, this row lives in the app info section of the settings screen. In React Native (Expo) it looks like this:
import { useEffect, useState } from 'react';import { Pressable, Text } from 'react-native';import * as Clipboard from 'expo-clipboard';import Purchases from 'react-native-purchases';
export function AppUserIdRow() { const [appUserID, setAppUserID] = useState<string | null>(null); const [copied, setCopied] = useState(false);
useEffect(() => { Purchases.getCustomerInfo() .then((info) => setAppUserID(info.originalAppUserId ?? null)) .catch(() => setAppUserID(null)); }, []);
const handleCopy = async () => { if (!appUserID) return; await Clipboard.setStringAsync(appUserID); setCopied(true); setTimeout(() => setCopied(false), 1500); };
return ( <Pressable onPress={handleCopy} disabled={!appUserID} hitSlop={8}> <Text>{appUserID ?? '—'}</Text> {appUserID ? ( <Text>{copied ? 'Copied!' : 'Tap to copy'}</Text> ) : null} </Pressable> );}Three points worth noting:
- Get the ID from
originalAppUserIdonCustomerInfo. It’s available any time after the SDK is initialized - Copying is just
setStringAsyncfromexpo-clipboard. On bare React Native,@react-native-clipboard/clipboarddoes the same job - Add feedback that the copy happened (showing “Copied!” for about 1.5 seconds is enough) so there’s no doubt whether the tap registered
There is no need to hide this as a developer-only feature. When a user reports a bug or a purchase problem, you can tell them: “tap the user ID on the settings screen to copy it, and send it to me as is.” It doubles as a support channel, so I recommend putting it somewhere plainly visible.
Step 2 — find yourself in the RevenueCat mobile app
RevenueCat has an official mobile app for both iOS and Android^3. It doesn’t carry the full dashboard, but it can search customers, view Customer profiles, and — the star of this article — grant entitlements.
The point is to install it on the same device you develop with. Tap-copy the ID in your own app, switch apps, and paste it into the RevenueCat app’s search box. You reach your own Customer profile without ever leaving the device.
You can do the same from the dashboard on a PC, but then you need an extra hop — mailing yourself the ID or syncing it through notes. It’s not an operation you do constantly, yet whether that extra hop exists changes the psychological barrier to toggling entitlements more than you’d expect.
Step 3 — Grant it, and keep the Duration short
Once your Customer profile is open, choose Grant on the Entitlements card. Pick the entitlement you want (for tanzaku it’s premium), set a Duration, and it takes effect immediately^1. On the app side, the entitlement shows up in customerInfo.entitlements.active, so your normal billing-check code reacts to it as is.
Now for the main topic: the Duration. The options range from A day up to Lifetime, and intuition says “I’m the developer, Lifetime is fine.” Having actually run this, short durations like A day are the right call during development.
The reason is simple: you regularly need to test the state where premium is NOT active. Which screens do free users see, do the ads render correctly, does the paywall flow feel natural? When you want to check these, a long-duration grant is in your way. You can revoke a grant midway, but considering the friction of opening the dashboard to do so, the routine of letting it expire in a day and re-granting when needed turned out to be far easier. The expired periods naturally become your free-user-perspective testing time.
On the other hand, once feature work settles down and your main mode becomes daily-driving the premium state, extend the Duration. Re-granting every day is genuinely tedious at that point, so switch to something intermediate — a week or a month. And once operation is stable and you find you almost never need the free-state tests anymore, that’s the natural moment to switch to Lifetime. Think of it as stretching the Duration in stages as your phase progresses.
Incidentally, granted entitlements show up in the dashboard as products prefixed with rc_promo, so there’s no risk of confusing them with real purchases^1 — they won’t pollute your revenue metrics either.
Closing thoughts
That’s the whole procedure for granting yourself premium access in RevenueCat, organized from real experience.
- Build the tap-to-copy app user ID into your app from the start. It serves both developer grants and support workflows
- Install the RevenueCat mobile app on your development device so that copy → search → grant completes on one device
- Keep the Duration short (A day) during development. Stay in a state where free-tier testing is always one expiry away, and stretch it in stages as your phase advances
All of this is obvious in hindsight, but whether you wire in the ID-copy implementation at design time completely changes how casually you can toggle entitlements later. If you’re about to add subscriptions, I recommend including the few lines equivalent to AppUserIdRow in the same PR as your billing code.
References
- RevenueCat Docs, Granted Entitlements https://www.revenuecat.com/docs/dashboard-and-metrics/customer-history/promotionals
- RevenueCat Docs, Customer Profile https://www.revenuecat.com/docs/dashboard-and-metrics/customer-profile
- RevenueCat Blog, Introducing the Official RevenueCat iOS App https://www.revenuecat.com/blog/company/new-revenuecat-ios-ap/
- RevenueCat Docs, Entitlements https://www.revenuecat.com/docs/getting-started/entitlements