Sending in-app purchases on iOS
Testing and manually sending purchase information
AppMetrica doesn't let you segment Revenue into “test” and “not test”. If you use the main API key for debugging purchases, the test purchases are included in general statistics. If you need to debug sending Revenue, use a reporter to send statistics to an additional API key. For more information about reporters, see Usage examples.
Step 1. Create a test app in AppMetrica
Specify the app parameters: link in the app store (if the app hasn't been published yet, leave the field empty), name, category, and time zone for generating reports.
To add another app, click Add app in the drop-down list in the AppMetrica interface.
Step 2. (Optional) Enable validation
Purchases on iOS are validated using iTunes API resources.
- In the AppMetrica interface, go to the app settings from the menu on the left.
- Go to the Revenue tab.
- Under Revenue validation for App Store, click Enable validation.
Paid subscriptions on iOS are validated using iTunes API resources and a Shared Secret key.
- In the App Store Connect interface, generate a Shared Secret key. For more information about generating keys, see the Apple documentation.
- In the AppMetrica interface, go to the app settings from the menu on the left.
- Go to the Revenue tab.
- Click Automatically renewed subscriptions.
- Under Revenue validation for App Store, specify the Shared Secret.
- Click Validate subscriptions.
Step 3. Test sending Revenue
This section outlines the steps for sending Revenue to the additional API key:
To validate purchases on iOS, configure sending the transactionID and receiptData fields in the implementation of the completion of the transaction:
- (void)completeTransaction:(SKPaymentTransaction *)transaction { ... NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"2100.5"]; // Initializing the Revenue instance. YMMMutableRevenueInfo *revenueInfo = [[YMMMutableRevenueInfo alloc] initWithPriceDecimal:price currency:@"BYN"]; revenueInfo.productID = @"TV soundbar"; revenueInfo.quantity = 2; revenueInfo.payload = @{ @"source": @"AppStore" }; // Set purchase information for validation. revenueInfo.transactionID = transaction.transactionIdentifier; revenueInfo.receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]; // Sending the Revenue instance using reporter. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportRevenue:[revenueInfo copy] onFailure:^(NSError *error) { NSLog(@"Revenue error: %@", error); }]; // Remove the transaction from the payment queue. [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; }
Copied to clipboard
func completeTransaction(_ transaction: SKPaymentTransaction) { ... let price = NSDecimalNumber(string: "2100.5") // Initializing the Revenue instance. let revenueInfo = YMMMutableRevenueInfo.init(priceDecimal: price, currency: "BYN") revenueInfo.productID = "TV soundbar" revenueInfo.quantity = 2 revenueInfo.payload = ["source": "AppStore"] // Set purchase information for validation. if let url = Bundle.main.appStoreReceiptURL, let data = try? Data(contentsOf: url), let transactionID = transaction.transactionIdentifier { revenueInfo.transactionID = transactionID revenueInfo.receiptData = data } // Sending the Revenue instance using reporter. let reporter = YMMYandexMetrica.reporterForApiKey("API_key") reporter.reportRevenue(revenueInfo, onFailure: { (error) in print("REPORT ERROR: \(error.localizedDescription)") }) // Remove the transaction from the payment queue. SKPaymentQueue.default().finishTransaction(transaction) }
Copied to clipboard
To send information about a purchase:
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"2100.5"]; // Initializing the Revenue instance. YMMMutableRevenueInfo *revenueInfo = [[YMMMutableRevenueInfo alloc] initWithPriceDecimal:price currency:@"BYN"]; revenueInfo.productID = @"TV soundbar"; revenueInfo.quantity = 2; // Setting the OrderID parameter in the payload property to group purchases revenueInfo.payload = @{ @"OrderID": @"Identifier", @"source": @"AppStore" }; // Sending the Revenue instance using reporter. id<YMMYandexMetricaReporting> reporter = [YMMYandexMetrica reporterForApiKey:@"Testing API key"]; [reporter reportRevenue:[revenueInfo copy] onFailure:^(NSError *error) { NSLog(@"Revenue error: %@", error); }];
Copied to clipboard
let price = NSDecimalNumber(string: "2100.5") // Initializing the Revenue instance. let revenueInfo = YMMMutableRevenueInfo.init(priceDecimal: price, currency: "BYN") revenueInfo.productID = "TV soundbar" revenueInfo.quantity = 2 // To group purchases, set the OrderID parameter in the payload property. revenueInfo.payload = ["OrderID": "Identifier", "source": "AppStore"] // Sending the Revenue instance using reporter. let reporter = YMMYandexMetrica.reporterForApiKey("API_key") reporter.reportRevenue(revenueInfo, onFailure: { (error) in print("REPORT ERROR: \(error.localizedDescription)") })
Copied to clipboard
Step 4. Make sure that purchases are shown in reports.
- Make in-app test purchases.
Make sure that the Revenue report shows the same number of purchases and total revenue as the ones sent.
Information in the report may be missing if:
- Validation is enabled and the purchase failed.
- Information about the purchase wasn't sent.
If there is no data in the report, export all purchases using the Logs API resource:
If there are events in the export and the is_revenue_verified field is set to false, the purchases weren't validated.curl -X GET \ 'https://api.appmetrica.yandex.ru/logs/v1/export/revenue_events.json?application_id=1111&date_since=2018-10-10&date_until=2018-10-11&fields=revenue_order_id,revenue_quantity,revenue_price,revenue_currency,is_revenue_verified' \ -H 'Authorization: OAuth oauth_token'
Copied to clipboard
Step 5. Set up sending Revenue to the main API key
After debugging, repeat steps 2-4 for the main API key.
To send the YMMMutableRevenueInfo
instance to the main API key, use the +reportRevenue:onFailure: method of the YMMYandexMetrica class.
To send the YMMMutableRevenueInfo
instance to the main API key, use the +reportRevenue:onFailure: method of the YMMYandexMetrica class.
... // Sending the Revenue instance. YMMYandexMetrica.reportRevenue(revenueInfo, onFailure: { error in print("Revenue error: \(error)") })
Copied to clipboard
To send the YMMMutableRevenueInfo
instance to the main API key, use the reportRevenue(_:onFailure:) method of the YMMYandexMetrica class.
... // Sending the Revenue instance. YMMYandexMetrica.reportRevenue(revenueInfo, onFailure: { (error) in print("Revenue error: \(error)") })
Copied to clipboard