Sending information about a purchase on iOS
Step 1. Create a test app in AppMetrica
- In the AppMetrica interface, click Add application.
- Fill in the fields in the form.
- Click Create. By clicking the button, you accept the terms of user agreement.

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 the 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/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. Configure 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 copy] onFailure:^(NSError *error) { NSLog(@"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 copy] onFailure:^(NSError *error) { NSLog(@"Revenue error: %@", error); }];
Copied to clipboard