If you already have existing purchases or subscriptions and have been saving the complete raw receipt files or tokens, you can import those purchases into RevenueCat. If you don't have the proper data saved on your server, see the client-side migration section of the [Migrating Subscriptions](🔗) doc.
Before kicking off an import, if you do not have the SDK deployed in your app, consider first setting up a server-side [Observer Mode](🔗) implementation. This ensures that new purchases happening during and after the import are still captured in RevenueCat.
Complete Apple base64 receipt file required
RevenueCat requires the raw base64 encoded Apple receipt to import the subscription properly. Partial receipts or the receipt information from the Apple server-to-server notifications are insufficient.
# Importing Existing Data
## Using the REST API
If you have the correct data saved already for your customers, you can import them through the REST API `
POST /receipts` endpoint. This will create the customer in RevenueCat and start tracking their subscription status.
More info in the [API Reference here](🔗).
This is the quickest way to get your existing subscribers into RevenueCat.
## Bulk imports
For extraordinarily large imports, we offer batch imports as a service on our plans offered via sales. [Contact sales](🔗) to see how we can help with the process.
Please note that depending on the size, bulk imports can take time to complete, sometimes up to several days or weeks for the largest data sets. Please keep this in consideration as you are planning your launch.
Bulk imports DO NOT trigger webhooks or integrations
Bulk imports done by RevenueCat will not trigger any webhook or integration events. If this is a requirement, then you'll need to perform an import using the REST API as mentioned above.
To do a receipt import we'll need 3 csv files for iOS, Android and Stripe with the following fields:
receipt (the raw receipt file)
introductory_price (if not a free trial)
You can find a sample iOS reference csv file [here](🔗).
*If you don't have prices and currency with the transactions we can take a separate file with a mapping of product_id, price, currency as well. If there were any known price changes, those should also be included here. You can find a sample price mapping [here](🔗). Note that the duration and introductory_price_duration fields use the ISO 8601 format for representing durations.
Product prices are required for iOS imports
Whether you include the products and prices with each receipt in the CSV file or attach a separate file of products and prices, the prices of products is required so that RevenueCat can accurately compute your charts and send events with correct revenue data.
latest_receipt_info` not supported for iOS imports
The entire iOS receipt file must be used for imports. The [`
latest_receipt_info`](🔗) is not supported as it's only a subset of the entire receipt.
You can find a reference Google Play import csv file [here](🔗).
**Important: **We need to know your [API quota](🔗) with Google and approximately how many remaining requests per day you have so we don't exceed your quota.
*Note that Google Play receipts that have been expired for more than 60 days ago can't be imported, and only the current status can be retrieved from each receipt. This means that historical data won't be presented accurately in charts.
subscription_token (e.g. sub_xxxxxx)
You can find a reference Stripe import csv file [here](🔗).
*Note that Stripe subscription tokens contain only the current status can be retrieved from each Stripe subscription token. This means that Stripe charts for historical data won't be accurate.