@MarcosC if you’re still offering a look-over, I’d love to take you up on it. How do I get you my account details?
if you have a lot of receipts, definitely see if they will import. It took hours and hours to do 12,000 receipts here, it seemed to rate limit to about 2 seconds per receipt. I had a network failure at some point about 4,500 in. I then amended my import script to take a --start-index param to resume.
This version has --start-index as an optional param: https://gist.github.com/foerster/9b2b93b571791d9293c78747f1c2cee7
@snapdown you rock -- thank you for sharing.
The export I got from Glassfy had slightly different columns, so it required a few edits, but the script worked well!
What sucks has nothing to do w/ the script, but the export Glassfy gave me -- I have custom user ids as well as anonymous users for when they purchase without login, and Glassfy unfortunately did not export the anonymous app_user_ids (the “Subscriber ID” they use in their system) and left them as blank.
Which meant a lot of data was skipped on import because blank ids are understandably not allowed.
I’m not sure what the best practice is here to be honest, or whether I was never supposed to have both anonymous and custom IDs at the same time.
> I’m not sure what the best practice is here to be honest, or whether I was never supposed to have both anonymous and custom IDs at the same time.
You can create an anonymous ID for those users and import them. When those users open their app, they could restore purchases which should merge both accounts
Hi, what would be the difference between importing from Glassfy and then the user still needing to restore purchases, and the user just restoring their purchases?
I also need to migrate from Glassfy to RevenueCat and also got an export from Glassfy without any user id:s.. wondering if I should use that or syncPurchases..
What would be the best way to only run syncPurchases once? Saving the syncPurchases run in local storage? But then it would be run again if the user re-installs the app (or maybe that wouldn’t be a big issue?)..
Thanks!
> Hi, what would be the difference between importing from Glassfy and then the user still needing to restore purchases, and the user just restoring their purchases?
The only difference is that if that user never opens the app, you won’t have that data and that the user would need to restore (unless you force a sync purchase)
>What would be the best way to only run syncPurchases once? Saving the syncPurchases run in local storage? But then it would be run again if the user re-installs the app (or maybe that wouldn’t be a big issue?)..
As long as you don’t call it on every launch, it should be fine. You can also force a sync only if the user does not have a purchases
> I’m not sure what the best practice is here to be honest, or whether I was never supposed to have both anonymous and custom IDs at the same time.
You can create an anonymous ID for those users and import them. When those users open their app, they could restore purchases which should merge both accounts
Hi, what would be the difference between importing from Glassfy and then the user still needing to restore purchases, and the user just restoring their purchases?
I also need to migrate from Glassfy to RevenueCat and also got an export from Glassfy without any user id:s.. wondering if I should use that or syncPurchases..
What would be the best way to only run syncPurchases once? Saving the syncPurchases run in local storage? But then it would be run again if the user re-installs the app (or maybe that wouldn’t be a big issue?)..
Thanks!
I don’t have real answers as I’m navigating this as well.
I load a didSyncPurchases flag from my storage, defaults to false. If they did not sync yet, I call syncPurchases once per user in the app and then save the didSyncPurchases to storage locally so the next time it doesn’t sync again.
This is what I have. I have people upgraded and using it, haven’t heard any issues -- I think it all worked seamlessly.
I have a customer info update listener -- maybe you need this?
await Purchases.setLogLevel({ level: LOG_LEVEL.DEBUG }); // Enable to get debug logs
await Purchases.configure({
apiKey: this.getRevenueCatKey(),
});
const hasSynced = await this.storage.getPref('RC_PURCHASES_SYNCED');
if (!hasSynced) {
await Purchases.syncPurchases();
await this.storage.setPref('RC_PURCHASES_SYNCED', 'true');
console.log('RevenueCat purchases synced');
}
await this.getRcOfferings();
const ci = await Purchases.getCustomerInfo();
this.handleRcPermissions(ci.customerInfo);
await Purchases.addCustomerInfoUpdateListener((customerInfo) => {
// console.log('customerInfoUpdateListener', customerInfo);
this.handleRcPermissions(customerInfo);
});
@trabdin great, glad it worked!
Hi @snapdown
Yes, that should work. You can also ask Glassfy to export all the receipts from your App with the user ID associated with it and call our POST /receipt endpoint (https://www.revenuecat.com/docs/api-v1#tag/transactions)
Another thing you should do is forward RTN from Apple to RevenueCat (and you can configure RevenueCat to forward them to Glassfy while they are still active).
If you face any issue, feel free to reach out to me
@whenable if you face any issue, feel free to tag me, happy to help with any issue that you might face during the migration
@potatocat666 : at least you got a response… I’ve emailed their support several times in the last few months and never got any responses.
Hi @potatocat666
We have just published this - https://www.revenuecat.com/blog/engineering/how-to-migrate-from-glassfy-to-revenuecat/
RTN: Real Time Notifications. What I was saying is, you’ll need to configure the stores (Apple serve notifications, Google Pub Sub) to notify us about any event.
If you have any doubt / issue during the migration, let me know and I’ll try to help you.
Regards,
I have received a csv export 280 MB big from Glassfy, but I don’t know how to handle this file.
Can I upload it somewhere at revenue cat ?
You need to write a script to import them to revenucat. I don’t know why they don’t show an example, but I have one I wrote I can send to you. It should work with android and ios imports from glassfy.
For anyone who needs to import, here’s a gist of the script. Usage instructions are in the script also.
https://gist.github.com/foerster/9b2b93b571791d9293c78747f1c2cee7
@MarcosC if you’re still offering a look-over, I’d love to take you up on it. How do I get you my account details?
Though things feel a bit disjointed and like you have to jump all around, and the code samples are really lacking in how to actually interpret the data, I managed to get both my apps converted over.
I have the same issue with the Glassfy export csv file.
The app_user_id (e.g. “Subscriber ID”) field is empty.
I’m not sure how to handle the import in Revenuecat.
>if you’re still offering a look-over, I’d love to take you up on it. How do I get you my account details?
I’ve checked your app and at a first glance, all looks good. I see both android and apple apps configured, both with notifications configured and we are getting them and I can see production purchases.
> I’m not sure what the best practice is here to be honest, or whether I was never supposed to have both anonymous and custom IDs at the same time.
You can create an anonymous ID for those users and import them. When those users open their app, they could restore purchases which should merge both accounts
If you want anything in particular you want me to review, send me a DM
Thanks for the answers, I just tried syncPurchases (with the capacitor library)..
So I first call configure(), then syncPurchases() if I haven’t already done it in a previous app init, and then getCustomerInfo() to check if the user has an active subscription for a specific entitlement.
But I noticed that when I call syncPurchases() and then getCustomerInfo(), it doesn’t return that the entitlement is active, but it does so the next time I open the app and getCustomerInfo() is called..
Is it possible for the getCustomerInfo() to return that the entitlement is active directly after running syncPurchases()? Or do I need to do something else in between? I noticed that syncPurchases() should return a CustomerInfo object but it doesn’t for the capacitor library?
This is what I have. I have people upgraded and using it, haven’t heard any issues -- I think it all worked seamlessly.
I have a customer info update listener -- maybe you need this?
await Purchases.setLogLevel({ level: LOG_LEVEL.DEBUG }); // Enable to get debug logs
await Purchases.configure({
apiKey: this.getRevenueCatKey(),
});
const hasSynced = await this.storage.getPref('RC_PURCHASES_SYNCED');
if (!hasSynced) {
await Purchases.syncPurchases();
await this.storage.setPref('RC_PURCHASES_SYNCED', 'true');
console.log('RevenueCat purchases synced');
}
await this.getRcOfferings();
const ci = await Purchases.getCustomerInfo();
this.handleRcPermissions(ci.customerInfo);
await Purchases.addCustomerInfoUpdateListener((customerInfo) => {
// console.log('customerInfoUpdateListener', customerInfo);
this.handleRcPermissions(customerInfo);
});
Thanks, that did it. I thought CustomerInfo would already be updated if waiting for the syncPurchases function to resolve, but it looks like it takes a little time after syncPurchases for CustomerInfo to be updated.
Hi @snapdown
Yes, that should work. You can also ask Glassfy to export all the receipts from your App with the user ID associated with it and call our POST /receipt endpoint (https://www.revenuecat.com/docs/api-v1#tag/transactions)
Another thing you should do is forward RTN from Apple to RevenueCat (and you can configure RevenueCat to forward them to Glassfy while they are still active).
If you face any issue, feel free to reach out to me
At this point, they’ve seemingly gone radio silent so I’m not hopeful to get any exports, but I’ve asked them anyway.
Appreciate your reply. I’m looking forward to working with a product that’s actually supported!
@snapdown Thank you for posting this. I’ll be following. Going through the exact same thing with Glassfy
@whenable @snapdown what platforms do you have in Glassfy? Apple? Google?
Trying to see if there’s another way to migrate even if people don’t open the app
@MarcosC : My users are all on android or google, using ionic/capacitor based mobile app.
I’m so glad to see this thread. At least I can commiserate with others about this.
I was super confused on why they stopped charging entirely about a year ago and I told them multiple occasions I would have been happy to pay for the service as long as they kept being alive so I wouldn’t have to suffer through a migration like this.
I actually reached out to Glassfy and they told me that RevenueCat is working on a migration guide.
@MarcosC do you know if this is true, and if so, is there an ETA on that? And also can you elaborate what RTN means?