On the iOS platform, an auto-renewing in-app subscription renews 24 hours prior to expiry.
What is the equivalent time at which an auto-renewing in-app subscription renews on Android? I have a number of subscriptions within 24 hours of expiry, but they don't appear to be renewed/renewing. I have a block of more than 200 in-app subscriptions all within 24 hours of expiry but not a single one appears to have an extended expiration date when I reverify it with Google. It is unlikely that my user retention rate across this number of samples is actually 0%.
Thanks!
Looks like they're rather vague in the documentation:
Monthly — Google Play bills the customer’s Google Checkout account at
the time of purchase and monthly subsequent to the purchase date
(exact billing intervals can vary slightly over time)
I feel like this means they would try to be as close to the original billing time as possible, although I couldn't be sure.
Related
I have an app in the playstore for my website, that offers a monthly recurring subscription, and on my backend I am both granting that month of premium usage and recording the fact that another payment occurred whenever the expiry time runs out on the last receipt and I re-query the Google subscription to check it is still active using https://developers.google.com/android-publisher/api-ref/purchases/subscriptions
There are other forms of payment on my website and apps, so I found this approach was working best. However recently I noticed my system had recorded too many payments compared to what was reported by Google itself.
It turned out that at renew time when I re-query the subscription, Google was returning that it was still active but expired in 1 day, instead of in ~30 days. My system would record that a payment must have occurred and then check again in 1 day (which this time would give the correct expiry time), and then again record that a payment must have occurred when Google again reported it was still active.
For example:
20th February - Initial purchase on app, app tells server the receipt etc. Expires in 30 days.
21st March - The expiry time is up so server re-checks status and Google says "expires March 22nd".
22nd March - The expiry time is up so server re-checks status and Google says "expires April 21st" (this is what it should have said last time)
21st April - The expiry time is up so server re-checks status and Google AGAIN says it only expires in 1 day, on the 22nd of April
etc
I am at a loss as to why Google is reporting the wrong expiry times once a month. I do not have any free days / trial period set up for my IAP subscription. As long as Google reported the correct expiry times then I would have recorded the payments correctly. But if the expiry time is not reliable, how can I tell if a payment has actually occurred?
The subscriptions resource returned by the above API call does not return the orderId of the most recent payment. I can't find a way to link the receipt I have stored server-side with its purchaseToken to any billing information of subsequent renewal payments.
Is there a way to link a receipt/purchaseToken stored server-side to actual payments that are occurring using a Google API? How can I get the most recent orderIds?
But if the expiry time is not reliable, how can I tell if a payment has actually occurred?
I am working on exactly the same problem and have the same observation.
It seems that even if you have no Grace period, it will behave like you have set grace period to 1 day.
Since you don't have grace period, my suggestion is to check the newly queried expiry time against the previous expiry time (you need to store that somewhere).
If it differs by around 1 month, then you can consider that a successful payment. Otherwise, the difference should be around 1 day and it's Google's grace logic at work (probably).
Take note that the time the expiry time varies (i.e: if you first expiry is on 21st March 12:00:00, the second expiry can be after, like 21st April 13:12:32), so you shouldn't use sharp check (i.e diff == exactly 1 month).
Here is an example from Google merchant history. The Date column is approximately equal to the expiry time.
Is there a way to link a receipt/purchaseToken stored server-side to actual payments that are occurring using a Google API? How can I get the most recent orderIds?
You can get the client to send both orderID and purchaseToken as part of the payload, then link them on server.
That seems to be the only place with knowledge of both, for now.
I am using the Android In App BIlling v3 library, and when I call
bp.subscribe(Activity, subscriptionID)
I get the Google Play purchase window, but the biling period is always 'per day', and the trial period is always '1 day'.
I have configured my subscription to have:
Billing Period: Yearly
Free Trial Period: 15 days
Default Price: $12
Using the above configuration, my App shows the purchase details as:
1 day trial
$12.00 / day
Library documentation says nothing. Tried to Google it, can't find anything.. Am I the only one getting this??
Thanks.
This is a normal response. I guess you're testing with an account added as a tester to Google Play account. Test subscriptions are valid for 1 day and get cancelled after 1 day.
Quoting the official docs
Note: Test subscription purchases recur daily, regardless of the
product's subscription period.
My app is published in alpha, and allows for purchasing a yearly subscription with a 7-days trial period.
I just tested the purchase process with a test account (declared as such in dev console).
The purchase went ok, and the user received a mail confirming his purchase. This mail is full of mistakes:
1) the price is without tax, which is confusing
2) It says the trial-period will expire tomorrow, instead of in 7 days (we are on Feb 27):
You have signed up for a free trial subscription from xxx on Google
Play. Your trial will end on Feb 28, 2015. You will be automatically
subscribed for €15.83/day at the end of your trial unless you cancel.
3) Funnily enough, it says that after the trial period, he will be charged DAILY, instead of yearly:
By subscribing you authorize us to charge you the subscription cost
(currently €15.83/day) automatically, charged daily to the payment
method provided. You can cancel at any time
Moreover, I couldn't find a way to cancel the subscription. I went to the wallet account of the user, no transaction there. Same thing in the merchant wallet account from my side. How am I supposed to cancel the transaction and try again eventually?
The only good point is that my app and google api (V3) recognizes that the user has purchased the subscription.
Maybe it's just because I declared the user as a test-user in google-dev console?
Thanks in advance for any input or advice.
The reason why it says 'day' instead of year is answered here:
Android In App BIlling v3 - Wrong Subscription Trial Period
This is a normal response. I guess you're testing with an account
added as a tester to Google Play account. Test subscriptions are valid
for 1 day and get cancelled after 1 day.
Quoting the official docs
http://developer.android.com/google/play/billing/billing_testing.html
Note: Test subscription purchases recur daily, regardless of the
product's subscription period.
I am implementing an in-app subscription in an Android app. In the developer console I have a subscription item with a 7 day free trial. While debugging, I purchased this subscription. A couple days later, before the 7 day trial is over, I cancelled the subscription from the Play Store | My Apps | Subscriptions.
Many days later, long after the 7 day trial period, in my code when I get the owned subscriptions (with inAppBillingService.getPurchases()) it still says I own the subscription. Since I cancelled it during the trial, I am not billed for it, but also, I no longer own that subscription. As far as I can tell, this is a bug with Google's In-App Billing Service. Any one know how this bug can be reported to Google so it can be fixed? As it is right now, customers can purchase my subscription and then cancel it during the trial period. They then get to keep using the subscription because Google says they own it. This is a MAJOR BUG.
I went ahead and tested this in my app. Using the sample app, I call the method launchSubscriptionPurchaseFlow() from the IabHelper class to start the subscription purchase. After the user confirms it, I get the purchase validated and handle the UI update on OnIabPurchaseFinishedListener.
I also check every time on my activity's onCreate() method if the user has the purchased items and subscriptions. This is done with the method queryInventoryAsync() of the same class. In my case, after canceling the subscription and waiting a few hours after the 7 days trial period elapsed, the user no longer had the subscription. You can test this by checking in the Purchase object if myPurchase.getPurchaseState() != 0. Possible purchase state values are listed in the documentation.
Finally, note that the cancellation will not be propagated immediately so it might take more than 7 days for that to go through. And it will take at least 7 days regardless of when the user cancels it. According to the documentation:
When the user cancels a subscription, Google Play does not offer a
refund for the current billing cycle. Instead, it allows the user to
have access to the cancelled subscription until the end of the current
billing cycle, at which time it terminates the subscription. For
example, if a user purchases a monthly subscription and cancels it on
the 15th day of the cycle, Google Play will consider the subscription
valid until the end of the 30th day (or other day, depending on the
month).
Hope that helps.
Now that a month has passed, I have more info.
Clearly what I was seeing in October IS A BUG in Google's code.
With absolutely NO change to my code, everything works as it should in the code deployed from the play store. This was true for alpha, beta and production.
It did not work as expected for code installed on the device from Eclipse - hence the Google BUG.
1.Is there a way by which we can make the subscription permanent?Once the user subscribe for the app he will be able to use it for free as long as he/she wishes.
2.Also can we limit the monthly subscription to a certain period.i.e. the user must subscribe for minimum of 12 months?
Please guide
than it is not a subscription, just an in-app purchase
no, you can use 1 year subscriptions only
1) as #xnagyg said, you should represent such a product as an 'in-app purchase' rather than a 'subscription'. Subscriptions by nature can be renewed (paid for repeatedly to resubscribe). Note that Subscriptions autorenew by default (you have no option there, the User must cancel to stop it autorenewing).
2) Currently, the Google Play Developer Console allows these Billing periods:
Weekly
Monthly
3 months
6 months
Yearly
Seasonal