Store

Test in-app purchases without sandbox accounts or store setup

To test in-app purchases without sandbox accounts, create a Test Store app in RevenueDot and give its test_ key to the RevenueCat SDK in a debug build. Purchases go through the SDK's own test dialog instead of Apple or Google. They grant entitlements, record events and send webhooks like real purchases, and they are always sandbox data.

Free up to $10,000 a month in tracked revenue. Works with the RevenueCat SDK you already ship.

The RevenueDot dashboard overview with a sandbox switch and setup health, where a Test Store purchase shows up

No store account

You need no App Store Connect, no Play Console and no tester account.

Real pipeline

Test purchases run the same entitlement, event and webhook code as store purchases.

Simulated lifecycles

One API call plays out a trial, renewal, billing issue, cancellation or refund.

Always sandbox

Test purchases never count in production charts.

Setup

How to test in-app purchases with the RevenueDot Test Store

  1. 01

    Add a Test Store app

    Sign up free on Cloud, then in Apps add an app of type Test Store. Copy its test_ key from API keys.

  2. 02

    Create a product with a period and a price

    Add a product such as pro_monthly with duration P1M and a Test Store price. The duration is the period, so a P1M product expires one month after purchase. A product without a price shows 0.

  3. 03

    Attach it to an entitlement and an offering

    Attach the product to an entitlement such as pro, and put it in a package of your current offering, as you would for a store product.

  4. 04

    Configure the SDK with the test key

    Use the test_ key as the SDK's API key and set the proxy URL to https://api.revenuedot.app before configure. Use the key in debug builds only.

  5. 05

    Buy in the app

    Call purchase as usual. The SDK shows its Test Store dialog. Choose the successful purchase and check that the entitlement is active in the app and on the customer's page in the dashboard.

API

Buy with curl, no app needed

The SDK posts fetch_token as test_<purchase time in ms>_<id>, and RevenueDot accepts any token of that form.

A Test Store receiptterminal
curl -s "$REVENUEDOT_URL/v1/receipts" -H "Authorization: Bearer $TEST_KEY" -H "Content-Type: application/json" \
  -d "{\"app_user_id\":\"user_1\",\"fetch_token\":\"test_$(date +%s)000_demo\",\"product_id\":\"pro_monthly\",\"price\":9.99,\"currency\":\"USD\"}"

Lifecycles

Simulate a renewal, cancellation or refund without waiting

Play out a renewalterminal
curl -s -X POST "$REVENUEDOT_URL/v2/projects/$PROJECT_ID/test_purchases" \
  -H "Authorization: Bearer $SECRET_KEY" -H "Content-Type: application/json" \
  -d '{"app_user_id":"user_renewal","product_id":"pro_monthly","scenario":"renewal","price":9.99}'
ScenarioWhat happensEvents (monthly product)
purchaseBought nowINITIAL_PURCHASE
trialA 7-day free trial startsINITIAL_PURCHASE (price 0)
trial_conversionTrial, then paid periods until nowINITIAL_PURCHASE, RENEWAL
renewalBought, then renewed every period until nowINITIAL_PURCHASE, RENEWAL
cancelRenewed, then auto-renew turned off nowINITIAL_PURCHASE, CANCELLATION
billing_issueThe charge fails at the last period end, with 7 days of graceINITIAL_PURCHASE, BILLING_ISSUE, CANCELLATION
refundRenewed, then the latest period is refunded nowINITIAL_PURCHASE, CANCELLATION
expireAuto-renew off from the start, access ends at the period endINITIAL_PURCHASE, CANCELLATION, EXPIRATION

Add offset_days (0 to 730) to move the start into the past. One-time products support purchase and refund only.

Limits

Where the Test Store works and where it stops

  • It works with the native SDKs, React Native (including Expo Go and the web) and purchases-js.
  • Native SDKs accept test_ keys in debug builds only. A release build shows an error screen on purpose, so ship with your appl_ and goog_ keys.
  • It does not test the App Store or Google Play themselves. For that, use sandbox accounts and test tracks: see App Store and Google Play.
  • On the iOS simulator and an Android emulator the unmodified RevenueCat SDKs pass a Test Store purchase against RevenueDot.

FAQ

Test Store: questions people ask

How do I test in-app purchases without a sandbox account?

Create a Test Store app in RevenueDot, use its test_ key in the RevenueCat SDK in a debug build, and buy through the SDK's test dialog. The purchase grants entitlements and sends webhooks like a real one, and it is stored as sandbox data.

Can I test renewals and refunds without waiting a month?

Yes. POST /v2/projects/{project_id}/test_purchases with a scenario such as renewal, trial_conversion, billing_issue, cancel or refund. RevenueDot plays out the whole history with each state applied at the time it would have happened.

Can I ship an app with a test_ key?

No. Native SDKs accept test_ keys only in debug builds, and a release build stops with an error screen. Ship with your appl_ and goog_ keys.

Do Test Store purchases count in my revenue charts?

No. They are always sandbox purchases and stay out of production numbers. Turn on the sandbox switch in the dashboard to see them.

Does the Test Store work on the web?

Yes. purchases-js and React Native on the web accept test_ keys and open a Test Store modal. Real web payments go through a Stripe-backed purchase link or funnel instead.

Get started

Run subscriptions without the revenue share.

Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue, or move an existing RevenueCat app with one line of code.

Already have an account? Sign in · Prefer your own servers? Self-host free