π― Why
π€ Without rc |
β‘ With rc |
| Open dashboard β Settings β Apps β scroll... |
rc apps list |
| Click through 4 screens to create a product |
rc products create --store-identifier com.app.pro --type subscription --app-id app_xxx |
| Manually wire products to entitlements |
rc entitlements attach-products --product-ids prod1,prod2 |
| "Who changed the current offering?" |
rc offerings list -o table |
| Export product catalog? Screenshot the UI... |
rc products list --all -o csv > products.csv |
| Debug a customer's subscription state |
rc customers get --customer-id user_12345 --pretty |
π¦ Install
|
Homebrew
brew tap AndroidPoet/tap
brew install revenuecat-cli
|
Script
curl -fsSL https://raw.githubusercontent.com/AndroidPoet/revenuecat-cli/main/install.sh | bash
|
Source
git clone https://github.com/AndroidPoet/revenuecat-cli.git
cd revenuecat-cli && make build
|
Use revenuecat-cli or the alias rc. Same binary, your choice.
π Quick Start
1. Grab your v2 secret key from RevenueCat β API Keys
2. Login and set your project:
rc auth login --api-key sk_your_key_here
rc init --project proj_your_project_id
3. Verify everything:
$ rc doctor
β Configuration: OK (/Users/you/.revenuecat-cli/config.json)
β API Key: OK (sk_tes...here)
β Project ID: OK (proj_your_project_id)
β API Connectivity: OK (Successfully connected to RevenueCat API)
All checks passed!
4. Go:
rc apps list
rc entitlements list -o table
rc offerings list --pretty
π All Commands
ποΈ Apps β 6 commands
Create and manage apps across iOS, Android, Stripe, Amazon, Mac, Roku, and Web.
rc apps list # List all apps
rc apps get --app-id app_xxx # Get details
rc apps create --name "My App" --type play_store # Create
rc apps update --app-id app_xxx --name "New Name" # Rename
rc apps delete --app-id app_xxx --confirm # Delete
rc apps api-keys --app-id app_xxx # Public API keys
App types: app_store Β· play_store Β· stripe Β· amazon Β· mac_app_store Β· roku Β· web
π¦ Products β 2 commands
rc products list # All products
rc products create --store-identifier com.app.monthly \
--type subscription --app-id app_xxx # Create
Product types: subscription Β· one_time
π Entitlements β 8 commands
The heart of RevenueCat. Full CRUD + product association management.
rc entitlements list # List all
rc entitlements get --entitlement-id entl_xxx # Get one
rc entitlements create --lookup-key premium \
--display-name "Premium" # Create
rc entitlements update --entitlement-id entl_xxx \
--display-name "Premium+" # Rename
rc entitlements delete --entitlement-id entl_xxx \
--confirm # Delete
Product wiring:
rc entitlements list-products --entitlement-id entl_xxx # See what's attached
rc entitlements attach-products --entitlement-id entl_xxx --product-ids a,b # Attach
rc entitlements detach-products --entitlement-id entl_xxx --product-ids a # Detach
π Offerings β 3 commands
rc offerings list # All offerings
rc offerings create --lookup-key default \
--display-name "Default Offering" # Create
rc offerings update --offering-id ofrngs_xxx \
--is-current # Make current
rc offerings update --offering-id ofrngs_xxx \
--metadata '{"theme":"dark","version":2}' # Set metadata
π Packages β 4 commands
Packages live inside offerings. They hold the products your paywall displays.
rc packages list --offering-id ofrngs_xxx # List
rc packages create --offering-id ofrngs_xxx \
--lookup-key monthly --display-name "Monthly" # Create
rc packages attach-products \
--package-id pkg_xxx --product-ids prod1,prod2 # Wire products
rc packages detach-products \
--package-id pkg_xxx --product-ids prod1 # Unwire
π€ Customers β 2 commands
rc customers get --customer-id $APP_USER_ID # Full customer info
rc customers delete --customer-id $APP_USER_ID --confirm
π¨ Paywalls β 1 command
rc paywalls create --offering-id ofrngs_xxx
π§ Utilities β 4 commands
rc doctor # Diagnose issues
rc init --project proj_xxx # Project config (.rc.yaml)
rc completion zsh > "${fpath[1]}/_rc" # Shell completions
rc version # Version info
Every command speaks 6 formats. Pick what fits.
| Flag |
Format |
Best for |
| (default) |
JSON |
Scripting, jq, APIs |
--pretty |
Pretty JSON |
Reading in terminal |
-o table |
Aligned columns |
Quick scanning |
-o csv |
CSV |
Spreadsheets, exports |
-o tsv |
Tab-separated |
Unix pipelines |
-o yaml |
YAML |
Config files |
-o minimal |
First field only |
Piping IDs |
# Same data, different shapes
rc entitlements list # [{"id":"entl_xxx","lookup_key":"premium",...}]
rc entitlements list -o table # ID LOOKUP_KEY DISPLAY_NAME
rc entitlements list -o minimal # entl_xxx
rc entitlements list -o csv # ID,LOOKUP_KEY,DISPLAY_NAME
π Scripting
rc is designed to be piped, parsed, and composed.
# Export your entire product catalog
rc products list --all -o csv > products.csv
# Count entitlements
rc entitlements list --all -o json | jq length
# Check if an offering exists
rc offerings list --all -o minimal | grep -q "default" && echo "exists"
# Get all lookup keys
rc entitlements list --all -o json | jq -r '.[].lookup_key'
# Paginate manually
rc products list --limit 10
rc products list --limit 10 --starting-after prod_xxx
# Or just get everything
rc products list --all
βοΈ Configuration
Multiple Profiles
Switch between production, staging, or different projects seamlessly.
rc auth login --api-key sk_live_xxx --name production
rc auth login --api-key sk_test_xxx --name staging --default-project proj_staging
rc auth switch --name staging
rc auth list -o table
rc auth current
Project Config (.rc.yaml)
Drop this in your repo root β rc auto-discovers it:
rc init --project proj_xxx --output table
# .rc.yaml
project: proj_xxx
output: table
Environment Variables
| Variable |
Description |
RC_API_KEY |
API v2 secret key β overrides profile |
RC_PROJECT |
Project ID |
RC_PROFILE |
Active auth profile |
RC_OUTPUT |
Default output format |
RC_DEBUG |
true to log HTTP requests |
RC_TIMEOUT |
Request timeout (default 60s) |
Priority
Flags β Environment variables β .rc.yaml β ~/.revenuecat-cli/config.json
π Security
- Config stored at
~/.revenuecat-cli/config.json with 0600 permissions
- API keys masked in
rc doctor output
- Debug mode redacts Authorization headers
- In CI: use
RC_API_KEY env var β nothing touches disk
ποΈ Built With
Architecture follows playconsole-cli β the same patterns, proven at scale with 80+ commands.
π€ Contributing
make build # Build
make test # Test
make lint # Lint
make help # All targets
PRs welcome. Open an issue first for major changes.
MIT License
Not affiliated with RevenueCat Inc. RevenueCat is a trademark of RevenueCat Inc.
β Star this repo if rc saved you a trip to the dashboard.