Freemium vs. separate free version

On Apple, you need to call store.restore() and any previously purchased non-consumable items will be returned with a state of “restored”.

If you call store.purchase(), it’s assuming you are buying a new item and if you buy something already purchased, it will likely return an error (I think).

On Google, you need to call store.restore() to fetch any previously purchased non-consumables. They however come back with a state of purchased, not restored.  Purchasing something a 2nd time (for non-consumables) will likely return an error.

Rob

But on Apple, store.restore() will prompt for login to the app store if I read correctly.   So I either need to have users put up with this the first time they launch the app, or put a “Restore purchases” button in the UI, which means new users who don’t have anything to restore will also see that button.   

Just thinking out loud - not sure either is a huge deal.

I think the best practice is to offer a restore button.  Apple prefers any login prompts be delayed until you actually need them.

Rob

Thanks, that’s the way I was leaning.  

And thanks for the tutorial, too.   A great help.

OK, I think I’ve got all my bases covered.   My only IAP is a one-time purchase to unlock all levels (only 10 in free version).   Do you see any holes here?

On my main menu screen, if Settings.FullVersion is false, I display the upsell graphics with both a Purchase and Restore button.    

On startup, this is what happens:

If exists settings file then if not exists FullVersion key then settings.FullVersion = true end if settings.FullVersion then check for refund on Android end else settings.FullVersion = false check for restore on Android end

What store API returns a status of “refunded”?   I tried store.purchase() and it throws an error dialog from Google Play saying I already own the product.

store.restore I guess?

Yes, store.restore() looks like the way to go.   It fails silently if there is nothing to restore.   

Correct.  store.restore() is called to restore purchases.  There is no call back if there is nothing to be restored.

Rob

I don’t think it’s clear, however, that store.restore() should be used to check solely for refunds.    At least on Android, purchase() invokes a store error dialog if the item has already been purchased.    That’s where I was talking about using store.restore().   I check this on my main menu if they’re running the full version.   I make sure I don’t check more than once per day, since I think I read in your tut that calling restore a lot of times in a short time period can result in Google revoking your access to the store.

http://docs.coronalabs.com/guide/monetization/IAP/index.html

The Google Play Marketplace allows for transactions to be refunded. You can check for refunded transactions in the same storeTransaction listener that you use for your successful, failed, and cancelled purchases.

On iOS there are no refunds.  The store.restore() triggers an dialog box asking the person to login.  Apple wants this deferred until the user does an action like press a restore button.

Google Play has refunds.  However, the only way to get a list of refunds is to call store.restore() which gives you a list of all non-consumable purchases including refunds.  Because a person can get a refund and not use your app again for a long time, there is no event that says “Hey deal with this.”  Your app has to poll for that information and that’s done with store.restore().  On Google this is a silent operation and can be safely done in your main.lua at startup so you can process any refunds that come in.  Google doesn’t do a restore state, but it has purchased and refunded states that you can check to manage your locks and unlocks.

I’d create a new free app with a few levels, and sell an IAP to unlock the rest. 

That way you take advantage of the initial push in downloads that a new app gets (which is pretty much your only chance to get downloads if you’re not planning on spending money and time in marketing).

Goofy Cubes is now live on the iOS App Store and Google Play as a free download with IAP to upgrade to the full version using the Corona store API.   Thanks, Rob, for all the help!

http://tinyurl.com/kz58rgq (iOS App Store)

http://tinyurl.com/mprzgwc (Google Play)

Congrats!