Facebook iOS Event Tracking before completed purchase

150 views Asked by At

Facebook is tracking my inapp purchases but it seems like it is doing it before the inapp purchase is complete causing incorrect values. Below is the code I am using, I am also having the same problem with seeing all transactions - not only completed transactions on Mixpanel & Flurry.

- (void) completeTransaction: (SKPaymentTransaction *)transaction {

if([transaction.payment.productIdentifier isEqualToString:kIAPPro]) {
    [self becomeProWithReceipt:transaction.transactionReceipt];
}
else{
    SKProduct *product = nil;
    int credits = 0;

    if ([transaction.payment.productIdentifier isEqualToString:kIAPCredits20]) {
        credits = 20;
    }
    else if ([transaction.payment.productIdentifier isEqualToString:kIAPCredits30]) {
        credits = 30;
    }
    else if ([transaction.payment.productIdentifier isEqualToString:kIAPCredits60]) {
        credits = 60;
    }
    else if ([transaction.payment.productIdentifier isEqualToString:kIAPCredits100]) {
        credits = 100;
    }
    else if ([transaction.payment.productIdentifier isEqualToString:kIAPCredits200]) {
        credits = 200;
    }
    else if ([transaction.payment.productIdentifier isEqualToString:kIAPCredits425]) {
        credits = 425;
    }
    else if ([transaction.payment.productIdentifier isEqualToString:kIAPCredits650]) {
        credits = 650;
    }
    else if([transaction.payment.productIdentifier isEqualToString:kIAPCredits1100]) {
        credits = 1100;
    }
    else if([transaction.payment.productIdentifier isEqualToString:kIAPCredits2500]) {
        credits = 2500;
    }
    else if([transaction.payment.productIdentifier isEqualToString:kIAPCredits3800]) {
        credits = 3800;
    }
    else if([transaction.payment.productIdentifier isEqualToString:kIAPCredits5000]) {
        credits = 5000;
    }

    // get the product associated with this transaction
    NSArray *filteredProducts = [self.products filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"productIdentifier = %@", transaction.payment.productIdentifier]];
    if ([filteredProducts count] > 0) {
        product = [filteredProducts objectAtIndex:0];
    }

    if(product)
    {
        // extract transaction product quantity
        int quantity = transaction.payment.quantity;

        // extract unit price of the product
        float unitPrice = [product.price floatValue];

        // assign revenue generated from the current product
        float revenue = unitPrice * quantity;

        // assign the currency code extracted from the transaction
        NSString *currencyCode = [product.priceLocale objectForKey:NSLocaleCurrencyCode];

        // Log to our server backend
        NSString *encodedReceipt = transaction.transactionReceipt.base64EncodedString;
        JBRequest *request = [RequestHelper sendRequestOfAddCredits:self userID:[GlobalPool sharedInstance].loggedInUser.userID receiptData:encodedReceipt];
        request.userInfo = [NSNumber numberWithInt:credits];

        // Localytics
        [[LocalyticsSession shared] tagEvent:[NSString stringWithFormat:@"Add %d Credits", credits]];

        // Flurry
        [Flurry logEvent:[NSString stringWithFormat:@"Add %d Credits", credits]];

        // Mixpanel
        [[Mixpanel sharedInstance] track:[NSString stringWithFormat:@"Add %d Credits", credits]];
        [[Mixpanel sharedInstance].people trackCharge:[NSNumber numberWithFloat:revenue] withProperties:@{@"$time": [DateUtils getStringFromDateWithFormat:@"YYYY-MM-dd'T'HH:mm:ss" date:[NSDate date] adjustGmt:NO]}];

        // Facebook Events
        [FBAppEvents logPurchase:revenue currency:currencyCode parameters:@{FBAppEventParameterNameContentID: transaction.payment.productIdentifier}];

        // create MAT measurement event item
        MATEventItem *eventItem = [MATEventItem eventItemWithName:product.localizedTitle unitPrice:unitPrice quantity:quantity revenue:revenue attribute1:@"attr1" attribute2:@"attr2" attribute3:@"attr3" attribute4:@"attr4" attribute5:@"attr5"];

        NSArray *arrEventItems = @[ eventItem ];
        NSLog(@"Event Item = %@", eventItem);

        // default measurement event name
        NSString *eventName = @"purchase";

        // measure the purchase transaction event

        // Any extra revenue that might be generated over and above the revenues generated from event items.
        // Total event revenue = sum of even item revenues in arrEventItems + extraRevenue
        float extraRevenue = 0; // default to zero

        [MobileAppTracker measureAction:eventName
                             eventItems:arrEventItems
                            referenceId:transaction.transactionIdentifier
                          revenueAmount:extraRevenue
                           currencyCode:currencyCode
                       transactionState:transaction.transactionState
                                receipt:transaction.transactionReceipt
         ];

        NSLog(@"Transaction event measured: %@", eventName);
    }
}

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

0

There are 0 answers