Jon (00:01.666) Hey everybody, welcome back to Gone Mobile and Alan. This probably sounds familiar, kind of repetitive. We just did this. Just did this intro. Allan (00:11.141) You know, we just did a retry here because John has flaky internet. So I've already heard his bad joke of the week, but he's going to make it again anyways. So you'll all appreciate it, but this time I'm not going to be surprised. When you mix it. Jon (00:16.226) Yeah, it's been not a problem. I actually forget it half, yeah. No, but, well, it's a recurring kind of theme here, but you know. Allan (00:30.038) there you go. He slightly changed stuff. Good job. Good job. Jon (00:32.108) changed it a bit. have you, have you, yeah, I was saying before that this episode is going to be a little bit of therapy for me to get out some of my, my angst about in -app purchases. and you've dealt with them a little bit before, right? Yeah. Allan (00:46.274) I have. I've done subscription stuff. I've done a couple of like direct buy stuff. But for the most part, if you have an actual credit card, it's pretty easy to do. Right. It just you wire it up. That's it. goes through. But you have to use you need a real credit card, real purchase. Jon (01:00.706) Yeah, but but but did OK, this is different. But did you? But did you? OK, you use the in -app purchases APIs right? Because you have to on device. Yeah, OK. Allan (01:09.63) Yeah. Yeah. So the problem is when you start starting to test it, because then it goes from Yeah, this is okay to this. This is absolute terror. Who? Where did this come from? And then it goes to the server. If go to the server gets even worse. Like, I'm like, how did we get here, guys? This is Jon (01:17.079) Yeah. Jon (01:24.184) Yeah. Jon (01:29.211) it's, yeah. Well, we'll, talk a little bit about the server part yet too. I've got, I've got some order to this madness. You're jumping ahead. Yeah. So I mean, like the, the early days, like app store was just, we charged for your app and you're done. And then, you know, they decided, well, we can make more money if we, allow you to charge inside of your app too. Right. And so they introduced like consumable in -app purchases. You're like, I want to pay 99 cents for more coins so that I don't have to Allan (01:37.028) you've got to you've got I'm jumping ahead, but John's got pain. He's got pain. Jon (02:01.776) Churn on your game. Allan (02:03.306) You know that was almost because they want their cut more though, right? Like they really do want their cut because what would happen is you go out to a website and you'd have your own processor kick in there and they couldn't shut it down because you didn't have another way to do it. But now you have another way to do it. Now they're like, no, no, you go to our. Jon (02:06.113) Yes. Jon (02:19.054) Right. Now they, well, and now they shut it down and you must use their thing. Right. So they take a cut. It's like 30%. I think both of the platforms, right. Unless you've got special deals with them. Allan (02:32.264) I thought bigger or smaller depending on how large your thing is. Clearly Fortnite was having none of it but... Jon (02:37.376) So the, is, yeah, well, there's the whole legal battle of it too, right? Where they're like, we want, people want to be able to load in other stores and other payment methods and systems and stuff, because we don't want to have to be forced to pay you are cut. and, and I think one of the interesting things with that is kind of like they take their cut. So, but for subscriptions, both Google and Apple in recent years, I think it's not been that old. They introduce like if you have a recurring subscriber for the subsequent subscription payments, they only take 15%. Allan (03:14.791) so you keep them happy and you make more money off them. Jon (03:20.878) Yeah, yeah. And which has been, it's been big. So my app does yearly subscriptions and you know, it's not, I've talked, I've complained about this. Like people are like, I have so much money. It's like, yeah, it's eight bucks a year. And if you have a pool, you probably can manage to deal with it. Right. But so, but it's a, it's a big thing for me to now not have to pay 30 % every year. Like I'm only paying 15 % from those subscribers that are year after year, which is kind of nice. Allan (03:36.895) you Allan (03:46.388) Does it keep going if they cancel and come back though after a year? Or they have their fine print? Jon (03:49.942) I mean, truthfully, I've never looked that hard into it to know one way or the other, who knows? Probably not. It's probably some clause like, well. Allan (03:57.834) Yeah, they they canceled and then came back. So no, we take our 30. Jon (04:02.2) Yeah. And so the other interesting thing that Apple did too, right? Is one, they force you to use their system if you want to do any payments in the app, but two, I don't know if they're still the same on this or not. think maybe it changed, but originally they forced you to you to charge the same price. If you were going to also allow purchasing the subscription outside of the store, like you couldn't You couldn't say, you can buy it in the app, but if you go to our website, you can pay us 30 % less because we don't have to pay the Apple tax. Like they would, if they figured that out, they're like, you can't do that. Allan (04:35.369) Which is a shame. it means you have to, in order to counteract it, you have to raise your prices everywhere. If you're taking a loss, potentially from that 30%, which you never should be taking a loss, you know what saying? Jon (04:46.85) Yeah, exactly. No, but I mean, you know, it's, it's, you're passing it on to customers, right? Because so like at the end of the day, it's like, okay, I'm sorry. I have to pass it on even more in places that I otherwise wouldn't, but this is, this is the world I live in. So you have to do it that way. Allan (05:02.589) Hmm. Way to go, Apple. Thanks, Apple. Jon (05:03.756) It's like, can't, like if you've ever used like the Kindle app and stuff, right? Some, some places are just like, I'm not even going to do it in the app so that we'll just tell you, like you can't buy your ebook in the app. have to go to Amazon's website. Allan (05:16.7) Which sucks and you're barely allowed to even say that anymore to you. They're like, why? Why can't you do it? Because it takes a lot of infrastructure that we don't want to set up in the app. The apps aren't, the app's not good for searching. okay. Jon (05:19.572) Right. It's yeah, it's like purchases, you Yeah. Jon (05:27.918) Yep. So, so they get their cut. Now, you know, I, I, I'm being someone who has benefited from in -app purchases directly. I'm a little bit less harsh about them because so for one, it's not the same everywhere in the world, but like the 30%, they take care of the taxes and stuff too, right? Like they, they collect the taxes for you. so like in Canada where our HST rate is 13%, that's 13 % of the 30 % that I'm going to have to pay the government anyway. So like now you're really charging me 17 % in a way, right? You know, and there's no like transaction fees on top of that. It's like, that's the, that's the, they're cut. So it's a lot, but yeah, I ultimately, I'm not that bent out of shape about it myself. I'm sure others are. And it makes a big difference if you're a huge company, if you've got like tons of revenue coming in, obviously for me, it's like, Allan (06:06.618) Yeah. Jon (06:26.956) I didn't want to set that up myself anyway, so okay, fine. I'll pay the tax. Allan (06:31.194) You know, the thing that I worry about it though is that they can up it at any time. They can obviously drop it, but they can up it. And if you have, you have no recourse, right? You have, if this is where you're making money, you have to do it. And yes, you can pass it on to your customers, but then customers complain. I mean, you know how that goes. Jon (06:44.846) Yeah, there's no choice. Yeah. They complain about $8 a year. They're going to complain about $9 a year too, if I have to do that, right? Allan (06:52.038) Exactly. you just say, look, this is because of Apple. And what do you do? What do you do? You just you can't fight it. Right. It's like it's not the best Canadian taxes when they go up here. You can you can protest all you want. They don't care. Right. Jon (07:08.142) No. And there, be fair, there was like with that whole subscription thing where they only charge 15 % out, there was like the lawsuits on both sides, where Apple had to pay out, you know, a bunch of money because they overcharged on, on that percentage or whatever. Right. So like I got a big check when, that happened from them that, you know, money they owed and it's like, great, I'll, I'll take it. Google was less so. Cause of course Google The platform of Google, of Android, like not where, compared to iOS, is not where the money is made, at least in my experience. It's like a third of what iOS does always reliably. Allan (07:47.353) Hmm. Hmm. Jon (07:48.482) So anyway, that's, that's the whole tax part of it, right? The company's taking their cut. you know, I mentioned that in -app purchases were originally those like one -off consumables. Like it's a one -time purchase. You had to kind of keep track of that in your app. I don't have a lot of experience with those because I have done subscriptions mainly. And for me, it was lucky that they started doing subscriptions like right around the time where I was figuring out how I was going to do this in my app. And, and recurring subscriptions, like auto renewing subscriptions, right? So I, I use their setup and it's like, yep, you want to subscribe $8 a year. and then the year comes up and it automatically builds them again for me. And we'll talk about like how that gets into the app and stuff, but I retain users that way. Whereas I was very close to being like, this looks hard to implement. Maybe I'll just charge like a consumable price and kind of treat it as a subscription or something like that. Right. But I, I. I really think if I had done that, I wouldn't have nearly the user, know, retainment that I've got today where it would just, it's easy. On one hand, like I don't want people paying for something they're not using, but it's easy to forget eight bucks a year and be like, yeah, I kind of use it, right? And just let it keep going. So. Allan (09:02.327) Yep. Well, I mean, if it's eight bucks annually, right, you just it's it's almost like a one time fee anyways, if you're going to use it every summer. Right, who cares? Jon (09:10.766) Yeah. Right. So, so this is the, this is, think also why they partially why they did it. Obviously for them having people forget about it is more money for them too. Right. Like same, same idea. But at the end of the day, like I also don't think Apple wanted their app store polluted with like pool math 2024 pool math 2025, know, cause that was going to be the model at some point. I need to keep making money to keep building this app and making it worth my time. Allan (09:32.469) Yeah. Jon (09:41.132) So either I charge you a recurring subscription or I just keep doing the whole like, yeah, like Microsoft office used to do, right? Now it's evergreen. It's like, you just keep paying for it you keep getting the new stuff, which I like better as a user too. Allan (09:55.719) It's easier, it's easier all around. Everything about it is easier for all parties involved. Jon (10:00.234) except for implementing from a development perspective. Allan (10:03.841) Well, again, if you're doing it straight, if you're just doing if you take an actual credit card and you bill yourself, I mean, you're going to get about 65 cents back out of that dollar that you just spent. But if you spend it and test it and the actual implementation there, it's pretty easy. But I don't want to keep testing at ninety nine cents and getting 30 cents, I guess. We go through a lot of quarters real quick testing it. Jon (10:06.466) ish. Jon (10:17.603) Yeah. Allan (10:33.173) testing cancellations, testing renewables, and then there's dates and Jon (10:35.008) Yeah, well, and that's really kind of what I'm getting at, right? Like it's subscriptions are, they've gotten harder yet too, cause it like not only, so when you subscribe, know, in the app, the code, if you're using like Apple's API, which would originally was store kit, there's store kit two now, store kit one is deprecated, store kit two is Swift only. And so that's a challenge for Maui developers. so got to kind of think about that a bit going forward, but you know, the, code there to, to write against those APIs is not the worst, but it's not great. Like you still have to kind of, okay, I'm, I'm asking the user first. I have to query the products, right? I have to get a list of the products from Apple because I have to make sure I show the current prices and stuff that I've set up properly. I have to show the right price for the right locale. have to, there's guidelines on like how you have to explain. what the charge is for that it's recurring, how to cancel it. Like there's all these stipulations. I went through multiple like app store rejections before I landed on like the right text they wanted to see, right? I'm like, just make this clear to me. don't, the wording you have is vague of what you want me to do. And then finally I got there where they were happy with it. But you have to do all those things. And then finally, when the user's like, okay, I want to subscribe, you you have to decide, well, do I, do I try and restore first? Like maybe they had a previous one. If I just subscribe, it's kind of gonna figure it out anyway. And then I go do the whole subscription thing and it might come back in a various, you know, different states of like, couldn't connect to the billing server kind of thing, right? Like Apple's API couldn't, you know, the payment failed for some other reason. The payment is pending. Like maybe it's in a weird state where they're trying to process it, but it didn't fully go through. it's in like this, and you might not always know that initially either, right? It might come back as like, it worked. And then like on the backend, they're gonna tell you, well, it's in this pending state and it might still fail, but we'll let you know either way. So it's just, it's not easy to implement. And then on Apple, they kind of do the thing where it's like, there's a, you can get like called back at any point in time in the app. Like even if you're in the background, they might be like, hey, the subscription updated, here's the info. And so you kind of have to deal with that. Jon (12:57.612) and then it's not clear like that code running in the background. it, you know, we've talked about backgrounding. Is it beholden to some of those same things or not? Like, I don't know. Yeah. Yeah. Allan (13:08.89) I've never checked that to be honest because that also goes to the server if you're doing the server implementations of that. Jon (13:16.148) Well, that's the other part, right? So you get all this information back. So now I've got presumably this like transaction receipt. Okay, the user, it succeeded. Great. What do I do with that? Well, one, I probably want to validate it to make sure that it's legit. I don't do that. Allan (13:36.01) everybody go get free pool math. Jon (13:36.27) Cause yeah, go get a free pullback. There's a few different ways you could game my payment system in terms of, you know, making it, exploiting things for free. But I don't know how big of a, you know, I don't think there's a lot of abuse of it. There might be, I don't know. I don't care. It's not worth my time. So, but you should really go validate it, right? And then what do you do if like you have, you know, network failure trying to do that, right? Like, well, I don't know. guess I'll pretend it's fine for now and check again later. Allan (14:05.861) That's why you needed a job. Jon (14:09.442) the shiny job. Yeah, I know. I know. Yeah. Yes. You're, you're not wrong. I know. I know. But it's just like all these things start piling up and it's like, I, it's such a headache to do all of this. And that's just to implement it. Right. and, and then like Apple, you can't really check, you can't query the server for like, what's the state of things without prompt potentially prompting the user to like sign in. It's just, you can't do it. Allan (14:10.596) Yeah, that's specifically for those scenarios. Jon (14:39.768) There's no way, like you can ask for purchases and you'll get some information back on those, but you can't like, you can't like go see if like there's a renewal pending or something. Like it's, kind of weird. And then the purchase data you get back, like, I think they're better now. They might've added more information around like expiry dates and stuff for subscriptions. But originally there was no, like you, the way I did it originally was like, I know the transaction date and I know that this transaction is good for one year, so I gotta go figure that window out for myself and store that. So then you got your receipt and you probably wanna put it on your server because they have server to server kind of notifications, right? So what I didn't do at first was put the receipts on my server and I started looking at like, how do I do these, Apple announce these backend server notifications? Great. there's no way I can tie the user together with the purchase notification because I didn't store all of the transactions on my own server, like the receipts, right? So like I, you know, I saw it, I'm like, okay, I'm not going to do backend server notifications yet, but I'm going to start storing that information so that in the future I could plausibly say I've all, I'll have the receipts there and I can go back and say, here's the receipt, you know, that changed. here's the token or the transaction ID or whatever. Now I can go look through my database and see if I find the matching one and this is the user it's for. Therefore I know it's this user I can update their stuff. But then I still have to get it to my app. I have to figure out like, well, how do I, know, do I just every time the app launches, go check my server and see what the status is? Probably, right? Yeah. It's pretty easy to do, but like again, I want to make my app. I want to spend the time coding. Allan (16:27.831) It's pretty easy to do, yeah. Jon (16:36.002) like the features of my app, not coding around payment implementation details. Allan (16:40.329) You you can just, you can put the role right in the JWT. You have to renew that anyways, right? It's not, that's not as bad as you think. Jon (16:50.474) No, no. Well, but so, but Google is worse, right? Did you ever try to do the Google backend stuff? Allan (16:54.91) yeah. Jon (16:59.032) So let me start with, what's that? Yeah, I mean, first of all, their library is kind of better and worse, both. Allan (16:59.521) Shocking, Google is worse? Shocking, Google is worse. Allan (17:08.725) I, yeah, I'm to be honest. It looks a little bit better when you start working with it. Jon (17:14.262) Right. Allan (17:18.259) I don't want to say it behaves better, behaves differently, but it certainly looks like a cleaner API. You start using it, but I digress. I will leave this one to you. Unleash. Jon (17:28.706) No, it is a bit cleaner, but the problem, so Google, like the weird thing always was, and I think it maybe still is like they had these Adel files, right? That you had to like, it was like this, it was almost like a, what was, what was the soap stuff? Like AI DL, which was like a, like a definition or like a contract definition. was, it's almost like, you know, a GPRC, whatever the thing is for those, right. Or like soap or something. Allan (17:41.216) Sorry, what are they called? Okay. Allan (17:58.356) You were throwing out an acrobat and I was like, what? Jon (17:58.578) yeah, yeah, it's this weird file and we did in Xamarin and I think still in Maui had like a build or a, a compile type or whatever that like you could say, it's an ADL file and it would generate some C -sharp code based on that file. And that's what you'd use. so that was kind of weird and annoying, but fine. But then Google's like, they keep updating their own library too. Right? So like there was. A number of years where it was like fine, just everything's okay. And then they're like, we have version five of the library. and by the way, you have to update to this by this date, otherwise your app's gonna stop working. Okay. and now we have version six next year. you got to update to this by this date or your app's gonna stop working. Okay, okay, okay. And then they... Allan (18:39.827) Or you want to use this thing, but it's in beta. So it turns out it's been in beta for a long time, but keep using it. Jon (18:42.945) Right. Jon (18:47.64) Keep, yeah, keep using it. And then, and now there's V7 coming up and I've heard rumblings that in this version or maybe it's the next version coming, they're changing how you can query like existing purchases or something too. And like, won't get as much information back. It's almost like they're like, yeah, this is too hard for us to provide. So, you're going to have to rely more on your server backend stuff for, figuring this out. So they're taking functionality away. And. Allan (19:11.735) Great. Jon (19:18.272) You know, this is all like layers on layers of trying to do stuff in dotnet too, right? Like that all kind of adds another aspect of it. we'll talk about like how you, get at that today. Cause there is, there are ways. but back in the day, when I went to Google IO conferences, you know, they had started shipping integrations for unity, which is also C sharp and they have, they have one for billing stuff because they want unity games to make money too. Right. Allan (19:46.153) And just to throw this out there, John was an Android fanboy for the longest time, but he worked on the Android team. He has since converted. So good for you, John. Jon (19:50.85) yeah. Yep. yeah. mean, you know, there's, there's time in everyone's life for making better choices. So I got there. Yeah. Allan (20:00.405) Yeah, there you go. You're like a recovering alcoholic except recovering phone. Yeah, good. Jon (20:03.832) That's right. Yeah. I, I, I used to be a, an Android fan, but I learned I grew. Yeah. So they, they had like unity stuff and it was kind of funny. Cause I remember talking to some of the people like at Google there and they'd be like, yeah. Yeah. We should totally figure out how to make it work for, for Xamarin. Cause it's all C sharp and you know, all these, these kinds of promises of making that, that easier that never happened. But, yeah, the, the implementation is Allan (20:07.625) You Jon (20:32.906) Not that dissimilar and it's similar enough that, you we'll talk about the plugins and packages and stuff, but there's plugin in -app billing by James Montemagno that I've used in my app for years and it's served me well. Yeah, I think so. No. So then, you you start coding all this together and we haven't even done the backend yet because like I said, I started to and I'm like, I need this. Allan (20:46.178) I think that's the only one that's out there, isn't it? There's not really another. Jon (21:00.024) transaction data in my database before I can even do that. So give it a year. But then there's testing. So you mentioned, you know, obviously using like a credit card and stuff. testing is where, yeah, this really falls down. For iOS, you know, you can test a variety of ways. usually, well, first of all, like your, Allan (21:09.687) testing his. Jon (21:25.122) say a development like sandbox versus ad hoc or app store provisioning kind of matters too. yep. So you kind of got to know what you're building against provisioning profile was wise. Now I feel like I've kind of simplified this because I do stuff on test flight almost exclusively now. So it's always like ad hoc or whatever entitlement, you know, they, end up using there. and Allan (21:31.957) Yeah, because it's an entitlement, right? It's, yeah. Jon (21:52.616) One of the good and bad things, I guess, of that is that your test flight users basically get free subscriptions, right? Because they can use their own account. They'll test with it. It won't actually charge them. And that's one of the ways to test. So you could also test with creating like an App Store Connect user account, which is like a fake iTunes user. But even like the whole process of when you go to like buy a subscription or an in -app purchase, you get like a weird janky dialogue that you can log in with, right? If you do it this way and it's got like the dialogue with like the two text fields on it and you've got to log in with like the, app connect, app store connect account. And then it starts working and testing, but it's like fake testing. And I don't know, did you ever do any of that with, your testing? Allan (22:41.798) I I think ultimately we did. Thankfully that at that point it was like, okay, my goal was to just get it working end to end with minimal stuff. And once I collected the IDs from it, we just shipped them through. So I didn't really need to, I literally tested. And when I saw what was involved in testing with just raw purchases and then a unit tested my way to victory, John, from there forward. Anyhow. Jon (22:50.508) Yeah. Jon (23:07.598) Yeah. Yeah, but there's always like, especially when I do app updates, I have like this recurring nightmare of screwing up that code. And then like, I just started losing sales, right? Like I, it takes me a week to turn it around. And by that point I've lost thousands of dollars in sales. Like that's, that's not, that's not for the faint of heart. like testing is important and testing beyond just knowing that like my app. Allan (23:26.664) It's, it's, yeah. Jon (23:35.596) does the right things in my own backend. It's more, is my app working properly with the actual APIs? That's the scary part. And so yeah, the process to do that is weird. so test flight users and the same works for Play Store, like on Android. If you have like testers in those groups, they'll get to test subscriptions for free. But the weird part about it that I found more recently is like the duration of those things has changed when it's testing. So. a year subscription might actually have like an interval of like a minute or something like that in, in yeah. So, you know, when I first did this, like my granularity of how much I tracked for like subscription length was like to the day. Well, suddenly we're testing in hours or in minutes now. And I'm just like, I don't, if I, if I do it like this, it's like you could subscribe and then right away it thinks you're not subscribed because it's my, my, you know, Allan (24:09.007) nice. Jon (24:31.764) resolution of time is like just by the day. So I had to like add in a thing that by default everyone in test flight is like, you know, a paid subscriber. And then there's a switch that I can like at least go in that shows up when it's on test flight. That just lets me enable, you know, testing those things so that I can do it. But man, what a, like I get the idea of making the interval short cause you want to test like renewals and stuff, but Couldn't they do that in like the UI that pops up when you subscribe or something, you know? Allan (25:03.592) I feel like there's a lot of things they could have done differently. It's just like, it's almost like JavaScript, right? They just keep adding crap to it and they're like, well, we can't really change the foundation anymore. This is the way it is. Just deal with it. Yeah. Just, but they, or the actually the best one, MSEL, Microsoft authentication. Jon (25:10.829) Yeah. Jon (25:14.89) It's all kind of an afterthought. It's like, we'll just add this on. It'll be fine. You can test like this. Jon (25:25.774) Hmm. Allan (25:28.215) Domain logins. I mean nobody actually likes mcell. There's just you don't really have a choice for paying for a buck so But they can't change anything. So I think that that's the case a lot of these payment processors Fall into it's like this is the way we can't change it because of some I Don't know some policy I bet you PII gets involved with this like you get all the security experts involved here and then they're like no you can't do that Jon (25:54.339) Yeah. Allan (25:57.254) This is not the way. so now you just have to, the security expert says this needs to change and you need to adapt. So all of a sudden you're on version seven, you're like, what, what is this? Why am I getting less? That's supposed to give me less. You're supposed to give me more. It's an upgrade. Jon (25:59.202) Yeah. Jon (26:11.852) Yeah, it's, I know you're supposed to make it easier and to try and do, you know, that stuff on device more because like now that stuff is getting harder to use their APIs with and probably for the reasons you said. So now you've got to start dealing with all the backend stuff, right? And we talked a little bit about it. we all we've Allan (26:30.939) But that could be so much easier. If they just handle the transaction, it doesn't even go on your app, I guess they have to because not everybody has a backend, which is weird nowadays, right? But there are apps that don't have. Jon (26:38.466) Yes. Jon (26:42.584) Sure, but the point is that they're making it that you kind of have to at this point. like, I don't know, maybe just make that assumption now. Allan (26:54.137) But I don't know, we've even had user feedback recently from somebody that said, like, I don't have a back end. have like a local database and stuff. And it was like, OK, well, that works. Absolutely. If you don't need a back end, don't need to like a game doesn't necessarily need back end. Right. So. Jon (27:01.09) Yeah. Jon (27:10.139) But if you're doing subscription stuff like I guess that's just gonna be a cost of doing business for you now Allan (27:15.905) I guess. It can be a big cost, unfortunately. I mean, I guess you could store it in SQLite and hope that you don't have threading issues. I don't know. Jon (27:19.942) Yeah, so and Yeah. So like, so that's where things are going. And we all know we've talked on past episodes about how, well Apple does at, you know, web API. Allan (27:36.844) They do everything so weird. They're like, we followed standards and it's like, what standards? Nothing open API you put against it generates properly. I think we tried that keyota stuff. No, mean, keyota's weird anyways, but. Jon (27:39.413) Yes. Who's? Yeah. Jon (27:50.304) No. Yeah. So this one, like, I mean, yeah, it's, it's weird as well. and like the way that like stuff is encoded inside, like I get it. You got to have some security in there, but at the same time, why are you making this so hard? It's a server to server thing. Yeah. Like just Allan (28:04.994) Why you're calling me? Why do you need to know? Yeah, but you're calling me just I've got HTTPS. You can say if the certificate is invalid, don't send your I mean, hell they could find hash it then and we'll we'll unhash it. We should have the private key. Jon (28:16.066) Right, right. Jon (28:23.66) Well, they're doing something like that, which is like they encode the actual data and then you've got your key that you need to decode it with. Allan (28:31.851) Yeah, but it's on a field by field basis for some of it. you're like, what just the whole message, man, what is this? What are we in the 16th century or what? Jon (28:34.87) Yeah. Yeah, I know. Well, I think, I think it might be more like that now. So this is the other problem. Like they came out with their whole server to server thing or Apple store server notifications. I think is the actual name. It's it's got ass in the title, but you know, cause it's the acronym. Yeah. and so be like their version one. Allan (28:49.204) that the new? Yeah. Jon (28:58.988) They came out with and it sucked and I looked at it and they're like, wait, we're to fix stuff. got V2 coming out and like a year later, they're like, yep, we changed it all again. And they're just like, come on guys. Like just, can you think about it before you do it in the first place and do it better? Allan (29:11.329) Well, they put the ass in that class there, I believe. Jon (29:15.66) Yeah. Yeah. So they, you know, they've been bad at this and then at least theirs is just like a web hook, right? Like they're, calling your end point, even though it's crappy data in that you have to deal with Google, Google, Google does, have you ever dealt with pub sub stuff? Allan (29:23.83) Yep. Allan (29:36.148) Yeah, lot, quite a bit. That's claim to fame for me. Jon (29:39.438) Okay, gross. Sorry. Sorry about your... your... misfortune. Allan (29:44.236) But Webhooks is still PubSub. In a way, it's just a little bit more set up. But yes, I know where you're going with this, Jon (29:48.221) yeah, yeah, yeah, okay, yes. Well, so Google has their real time developer notifications because you got to know, you got to have a socket open and get this stuff through as fast as you can to your server. So you actually have to connect with their whole pub sub thing. And they have a, there's a .net client they have for it. it works. That's what I can say for it, but it's like, It's another thing, right? It's another different thing. And then like, okay, how do I set that up on my server? Cause now my server has to have like an open, a different, you know, open web socket with their custom library. Allan (30:27.442) That's not a web service. It's not a website anymore. Jon (30:30.882) No, exactly. So that's, that's what you have to do. And then the kicker to this is like, okay, fine. I'm going to do this. You go to set it up. The number of like developer consoles and different areas you have to go within Google's properties to set this all up. It's like layers deep. You're, you're in the Play Store console and then you get out to the Firebase console and then that takes you out to the Google whatever. Allan (30:45.426) Allan (30:55.659) to the configuration or account screens. Yeah, it's been like that for years. They're like, I don't know what they're smoking, man. But like, you got to get that in the same portal because when you got to discover that stuff, you're like, I don't know. Jon (30:59.906) Yeah. Yeah. And then you've... Yes. Yeah. And you got to create all these things and different tokens and give, you know, access to whatever roles for a different token to log in and yep. Yep. Yep. Yeah, I don't. Allan (31:19.585) you have to add that that API to your profile too, because apparently it's not just there when I can't like why do I have to go add it then configure it? Why can't I just configure it and turn it on? This is yeah, it's insane. Jon (31:29.602) Yeah. So by the time you, you figure out how to even set that up, you've spent way too much time and then, okay, fine. I start implementing it. start doing it based on the spec and like same with Apple, their docs show you the, the, know, the, the objects and the format of things and maybe give you one example of like a, that payload looks like, but in, practice, It's not that easy. Like stuff doesn't look the same as their docs say it does when it comes in and you've got to figure out all the little weird discrepancies. then once you do that, the sheer number of cases they throw at you to handle is just mind boggling, like, like status of transactions. Right? So you've got, like I said before, like maybe the payment, you know, is, pending with the other payment processor that Apple's talking to, to on. your behalf, right? And so it gets into this weird like pending state where you're kind of supposed to still grant them access, but you know, know that maybe it's going to go back. There's cancellations, there's refunds, there's expiry dates, there's, didn't even get into the whole, like, do you want to do a trial period for your subscription? Okay. That's a different state that it comes in as. Do you want to have, different Allan (32:49.073) yes. Jon (32:52.984) promotions for upgrades? you going to try and upsell someone to a higher tier, but then have to figure out when does that change? You when is that active? are there implications in that transition that you need to account for in your app in terms of like history? So like there's all these different scenarios. Yeah. Allan (33:11.494) It's crazy. It's crazy what they do there. Jon (33:17.258) It's just, there's, too much. And so I, like, I started implementing these things on my backend and I'm just, at some point I said, you know what? I'm one developer. can spend a month doing this and testing it and figuring it out. but that's a month that I'm not providing value to the people who pay for my app. Allan (33:37.246) Yeah. You know, I always wondered too, why they don't just have like, let me run a timer against an API and I'll pull the transactions, both Apple and Google. And I'll pull the transactions at that point. I'm going to trust that you've enabled it. So what you gave me back is it's all good. They can just give me a, you know, an accept or reject, right? Just at the app. That's it. Nothing more. I gave you a product. You told me if it was accepted or rejected. Jon (33:47.916) Yeah. Yeah. Jon (34:03.138) Mm Allan (34:07.707) And then I mark that in the app. And then the app can check later server did you hear is this good? And the server can run daily, it can wake up process all those transactions and go, Yep, yep, yep. No, this isn't good disease. Not good. And then ship it back. Right? I don't understand why they had to go with two vastly different techniques on both ends. And they all suck. Like they all suck. Jon (34:24.375) One that's. Jon (34:30.264) Yeah, yeah. And they all have like, most, but not all of the information that you would want them to have too, right? Like you're not, you don't have a cohesive picture anywhere in one place that you'd like. So, and then the web hook stuff like, okay, yeah, well what if my server's down for a day? Well, they're like, well you try, you know, some maybe exponential back off, but after we try five times, we give up. Well, okay, then I just don't know about that. Cool. Okay. Allan (34:55.773) Yeah. Well, you have an Azure outage. You are toast. And one of the late, the latest one in mid US, you know, that was several hours. So Jon (34:59.589) Exactly. Yeah, yes. Jon (35:06.744) It was a while. Yeah. So like that, that can be a problem. That's not, it's not a good place to be. So yeah, it's, it's and then, you know, to scale this up too, right? Like we're just talking Android and Apple. Well, in theory there's, there's other places. you know, well there's the, Amazon app store, which, know, pool math I think is technically still on. need to update it there probably. Allan (35:12.827) Cough Allan (35:22.082) Yeah. What other place, John? Jon (35:35.846) It runs on those devices. have their own payment stuff, which is kind of based on one of the older Google APIs. So it's like, it's not that crazy to try and figure out, but it's another place. It's another implementation, right? and I don't think they had server to server stuff. like you're dealing with it locally for them anyways. So you kind of still have to figure that out. And yeah, it's just, it's a, it's a lot of work. And I really wish, you know, that they could make it just as easy as. Allan (35:45.641) fragmentation, fragmentation. Great. Jon (36:05.122) Like you said, deal with all the stuff on the backend for me. I don't care about any of that. I just want to tell you, here's the, the thing, the resource that my user needs to have, you know, by the identifier to have access to this part of my app. Do they have access to it? Tell me please. Right? Yes or no. Like from the app perspective, all I want to do in my code is say, should I give the user access to this resource? Allan (36:09.338) Mm Jon (36:34.702) Can you please just figure that out for me? Right. But I know well, so I started, you know, looking at this cause with all of the changes to, this is, this is going to be a longer plugin package and product section this week, because I want to talk a little bit about what's out there. and there's probably other services. I, I, there's the one that I know of that I'm very impressed with so far that I think I'm going to switch over to. Allan (36:38.909) You're asking for too much. Jon (37:04.066) And it's called revenue cat and I'm not getting paid by them to say this, but maybe I can make it work something out. We'll see. Have you ever heard of them? Allan (37:11.814) I've heard of them. Unfortunately, as soon as I had heard of them before, now mind you, everything that you usually recommend if I've done some sort of search on it after that, all my ads revolve around it. So I have a lot of revenue cat ads and wood paneling PC boxes in my search history. Thanks, John. I am not buying a wood paneled PC cover. Jon (37:15.147) Why, besides from me. Jon (37:25.739) yeah. Yeah. Jon (37:31.938) Yes. Yeah, good. I'm glad. Has it worked? Have you bought one yet? Jon (37:41.886) poor advertisers. Allan (37:42.02) I'm buying a new PC, but not, not, I don't want wood paneling. It's, how come you haven't put wood paneling on your walls then? Jon (37:45.87) Think of all the money they've wasted on you now. Jon (37:51.208) I've actually been looking at doing that. Allan (37:53.974) wow. Okay. Well, geez. Yeah, that's okay. Well, boy, I'm not searching that one. So you're gonna have to show pictures and we're gonna hope that the AI isn't Mrs. A is listening right now going I'm getting I'm getting wood paneling for your walls ready to go. Hey, anyhow, yes, I have heard of revenue cat. Jon (37:56.671) that was, this is not scripted either. That's really funny. I'll have to show you after. Yeah. Yeah. Jon (38:07.105) No, that's how he's listening. I've got some Amazon ads for you Yeah. So they have an interesting setup. So the premise is we take care of those things for you. And they basically try to provide you with what I just asked for, which is I just wanna know if I should let the user access this thing. And I think they call them entitlements, which fine, I don't care what you name them. And that's like, so they're a client library and a backend. So they deal with all of the parts, right? They deal with like me. you not having to talk to store kit or importantly now not having to talk to store kit two when it becomes the only thing you can use which which will be a ways away but you know it's gonna get there and same with the google side right because like google's moving to billing version seven and that's gonna be like 20 i don't know 2026 is when you have to use it by which it's not crazy like i get it you got to move people forward but i just i don't want to have to keep Jon (39:15.114) spending time thinking about my payment stuff. Allan (39:17.569) You wish that was nicely abstracted away or somebody, somebody dealt with it, right? Jon (39:22.284) Right, right. And to be fair, so James's plugin does deal with it, which is great. And it's for the most part, I mean, there's some leaky... Yeah, yeah. Allan (39:29.153) Yeah, to the most part for what he can without without having a server that he can control as well. Right. Jon (39:34.334) Yes. Yeah. Like, you know, it's not meant to be a revenue cat situation where it deals with the backend stuff. So it, deals with the client side and it, you know, I think it does a pretty good job about that. It's been working well for me. Thanks, James. but you know, he's going to have to keep updating as, Google does as Android or Apple does. like an Apple one, like I said, it's going to be a bit of a pain cause it's Swift. And so I'll have to do some of those slim bindings, right? Like that's one way to do it. Allan (40:01.187) Did you do slim bind? Are you going to do slim bindings for? I think I just heard your next open source project, John. Jon (40:05.806) I haven't decided. No, well, I prob probably not maybe I don't know. so I, you know, I started looking at like, okay, well revenue cat. So it's native libraries, obviously. So I'm going to have to figure out how to use them in my mouth. Yeah. Which is, you know, another level of difficulty. somebody has bindings out there for them already. So I was like, okay. Why don't I just use these? they're not on the, very latest version. Allan (40:29.24) Do they? Jon (40:37.038) which is okay because like, so revenue cat and maybe already by this point, I haven't looked in a few weeks, they might've released it as stable. They have an upcoming version, which I think uses Storkit too. And I think updates to Play Billing 7, cause they're dealing with all these changes for you, right? Which is, that's the main point, like you said, abstracting over those things. So the person who had the binding going, I should figure out the name because they do a bunch of them and... It'd be nice to recognize them if they happen to listen to this. I'll figure that out yet. We'll give them a plug. Allan (41:10.165) I was just going looking for the link while you're talking. Anyhow. Jon (41:13.398) Yeah, this is the cap is the so it's like the tenestro. You've probably seen things by this name. I don't don't know the person, but I've seen a bunch of different bindings and work from them. So, look at that. They updated to seven already. See this. I can I if you're listening, please reach out to me. I would like to, I don't know, say thank you at the very least. Maybe I'll buy you a beverage of your choice. Allan (41:21.47) yes. Okay. Allan (41:26.239) All right. Jon (41:41.58) Yeah, so they've already got the update. So I'm like, I'm just going to use these because somebody else is doing. But if I had to, I could do the slim binding approach and go that way. these ones, you know, there's still some work to implement this, but it's pretty much like, yeah, initialize some things, you know, then go ask, do I have access to this entitlement and listen for events when it comes back in that, you know, that answer changes for you. Right. So. pretty dead simple. But I think like the bigger thing that I like about them is they deal with the whole backend stuff and the way that they have dealt with, like I've already got it all set up in my account. You know, all the different tokens and keys and stuff are set up and like the way that you do it, they test it for you. Like you can say like, did the pub sub thing work? Like send the test notification from Google side and they'll show you like, yeah, we got it. That's good. We're working, right? And they helped kind of even set some of that up. Like you give them some of the keys and like they guide you through it. But there was another step where you have to like create the pub subscription or something like, yeah, we'll do that for you. So I was really impressed with like how easy it was to set up considering how hard it is. Like they made it as easy as they could, I guess. Right. So, Allan (42:50.271) No, I don't think. Allan (43:01.066) Well, that's what I say. Like their libraries, right? It's, it's the reason why James has to keep updating or, or, you know, doing all the stuff is because it, without the server portion, it's really hard to write an opinionated version of this. So in revenue cat has control of the server, schematic that they can, yeah. So they, they still have the ability to deal with the payment processor nicely on the front end. Jon (43:08.013) Mm -hmm. Jon (43:16.835) Yes. Jon (43:21.656) That's their business, right? Jon (43:29.335) Mm Allan (43:29.95) while also making it very clean and easy. Like, dude, I just, the user wants to order this plan to sit. Just, just, just do it. Don't, don't bug me anymore. Just do it. And don't even, you can tell me return true or false for all I care. And then it'll deal with the server and then your server goes, yeah, this user is, you know, all that stuff is nicely dealt with. It's just, it's the way it should be. It's the way it should be. Jon (43:36.002) Yeah, I just do it. Yeah. And tell me when they have. Yes. Jon (43:57.434) And so there's a few more other challenges that, you know, I've had to deal with, with the whole payment stuff. Like one thing is, refunds and stuff like there. So Google, you can, you can go and initiate refunds for users. don't know if you ever, ever did that or knew you could even, actually didn't know for awhile. And we would tell people like, I can't do anything about this. Cause like with Apple, you can't, I can't go refund your subscription for you. I'm sorry. I just, I can't, there's no way for me to do it. Allan (44:26.643) No, they don't either. They're like too bad. Jon (44:29.228) Yeah. Well, you know, it's funny though is they do. They will. Yeah. If you bug them enough. No, but like, well, there, there'll be like a column of like, there's, know, you had these many sales and you had this many refunds and they're like, I hadn't. Yeah. Allan (44:32.142) really? Now they didn't use to. Allan (44:41.806) that's true. I did know they have it, but you know, it didn't help me years ago. I had Jon (44:46.408) No, I think the bar is high. Like you pretty much have to say the right probably like, I'm going to do a charge back or whatever, right? Allan (44:53.98) Well, I had my son process a one time payment through Apple TV before they had like the lock on it. And it was about seventy five dollars Canadian. I mean, I was like, no, when he did it, he he cried because he was like, man, I'm sorry, because they hit you with ads, right? All these stupid games. And I was like, sorry, buddy. And I just kind of went and cried in a corner. I was like, my God. Jon (45:02.062) damage. okay. was not so, I was. Yeah. yeah. Jon (45:18.318) I'm gonna try and get this back. Allan (45:21.679) And Apple's like, no refund. No, we got your money. You get lost. It's processed. It's not refunded. You just won't process it again next year, right? Better go cancel it. Jon (45:23.266) Yeah, like why? Of course not. What's that word? Yeah. Yeah. Yeah. Jon (45:35.914) Right. Yeah. And they've gotten better about like notifying you as a user, if there's like your renewals coming up, right. And stuff like that. and, you have to in your app, I think one of the stipulations now is you have to provide a place to like link out to the app store place where you would manage that subscription too. So that's, that's newer. Allan (45:42.748) Yes, they do. Allan (45:57.768) that I haven't seen. Jon (45:59.244) Yeah, so there's like I said, there's all these rules and each platform is a little bit different of how they enforce them and stuff. So, but that's, that's kind of, you know, where, where that part is at, but you know, the, the revenue cat thing, I mean, it, you know, we talked about like Google's and Apple's cut. So they're, they have an interesting approach to their setup too. Allan (46:20.413) Yeah, because you don't want to be like, hey, we'll take another 20 or 30%. Yeah, they can't or nobody use them. Jon (46:25.006) Well, yeah, they can't do that. And, like they, well, they, could, but, they, could also be like, yeah, we'll charge you a hundred bucks a month for this. Right. Like, and probably that would be worth it to me still too. I'm sure it would actually had to work out cheaper in the end for me, but they do a 1 % because all the transactions flow to them at some point. Right. So they know what, what sales are happening so they can track it. And so they charge you, although their model is like the first however much a month, you know, it's fine on them. And as soon as every month, as soon as you go over that amount, then they start charging you a percent, 1 % of that revenue. And I think I have to look, I think it's, it's net. Like I think it's after Apple's cut, but I'm not sure. I have to double check. Not that it really matters. Like a percent, it depends on what you're doing. It gets volume wise, right? For me, I think of it as like, okay, 1%, how many, you know, how much is that a year of what I make from it? Is that worth my time not spent dealing with all this crap? Yeah, yeah, it is very much so. So it's, it's good. I haven't yet. It's, it's, it's something I'm working on. So there's a few other parts to, figuring this out. So one, you know, with my setup, I store the trends, like the expiry date in your account on my database. So I don't like keep Allan (47:31.291) So you haven't switched to this. This is something you're active, actively working on getting ready for. Jon (47:50.562) I don't store it like local on the device or anything. Like I keep it in the database. And part of the reason for that is sometimes I want to give people a subscription for free. Right. I could go generate like redemption codes and do it that way. in some cases that would be better and I'll tell you why in a second, but that's a lot of work to go like generate a bunch of redemption codes. then like most of the people that I would want to give them to like, They're not going to figure out how to use them even. Right? Like if I got a family or friend. Allan (48:22.724) Yeah, well then you got to go find a screen. You got to code a screen for it. You got to code an endpoint for you got to go database. Right all that stuff. Jon (48:26.752) Right. Type it in right. Yeah. Yeah. So I stored in the, just the user record. So, you know, another secret, if you're trying to game the pool math payment system, one of the, one of the work, the loopholes, since it's on the, the account, you could in theory sign in from whatever account restore your purchase. log out, sign in with a different account, restore it, right? Like you could, you could like set up a bunch of accounts to have, know, free transactions. Yeah. Yeah. Which I could probably easily crack down on now that I store receipt data. Cause I could kind of see like, why do you have a subscription, but there's no transactions in your account. Right. Allan (49:01.052) Free pools. Free pools. Allan (49:15.324) Why is Disney Plus against this IP address and then another IP address 100 kilometers away from you? Jon (49:19.286) Right, right. So I gave you all that idea, but don't try it, because I'm coming for you. I'm going to crack down on it. Yeah, I'm not. Allan (49:26.012) he's gonna find it. John wants his $8 or actually sorry his $6, $7. He had minus 30 % so five, he five bucks or something. Jon (49:32.206) 799 minus, yeah, minus 30 % then 15. Yeah. Yeah, yeah. So storing that information, like one of the other things that, I don't want this to sound like an ad for Revenue Cat, but like I'm really excited for it, so it kind of is. But they have like a similar thing where they're like, you can grant entitlement to somebody in their portal, right? So that it all meshes with their system when I use their API to say like, is this user subscribed? Allan (50:01.764) Okay, that's nice. Okay. Jon (50:02.038) Right. could manually override it, but then the same problem they have, that I have today, which is like when we do that. sometimes for users, like if they run into issues or whatever, we're like, Hey, like that sucked. Have another year for free from us. Right. Like be happy. Right. They may have paid for it already, but like, if, if, if we spent a week going back and forth, cause he had some weird problem, like I'm just going to throw, throw you a bone and give you another year of subscription for free. But Allan (50:18.189) There you go. Jon (50:29.952) You got to go cancel that because like this is on our system, right? Like Apple doesn't know I gave you another year, so they're going to keep billing you. And this, the same applies with these guys too. And they call it out to, they're like, yeah, if you do this, like just, be aware that this doesn't change. You know, we can't change someone's subscription on them so that you got to tell them to cancel it. So that's kind of cool. And then, and then the historic part of it, which is also neat, but although a little head scratchy, this is if I'm going to, if I'm going to bash. them at all for anything that'd be here. I want to import all my historic data too, right? I want them to know, cause if I switch over, like I need them to know my users have a subscription. So they'll actually let you, they have an API that I can go send all the transaction receipts I've accumulated up to them and they'll process them all just like they would if they came from Apple. And then they figure out the information that way, but there's like, think that it had something that are docs. They're like, if you have a lot of these, like reach out to us, we might be able to work with you on some bulk import thing. And so I did. And they're like, yeah. Cause I think I'm like, I have probably what I think like maybe 80 or a hundred thousand transactions over the years. Like I don't need to import them all. Cause like most of them are old and done anyway, like every, every renewal you get a new transaction from Apple and Google. And actually that makes things difficult too, right? Because like the other weird thing with Apple is there's almost, I forget how it goes, but it's almost like you've got like chained transactions. Like the renewal is linked against the first one, which makes sense. But there's, there is weirdness in some of how they do some of that in terms of like the data that's stored with each of them. So it just, it Just kind of another note, like it muddies how you deal with the results that you get back if you ask for like, give me all the transactions for this person, right? To try and check, because like some of them might be not exactly how you expect them to be, I guess is kind of the easiest way to say it. Allan (52:39.093) So what did they tell you about the fact that you can't, which I can't kind of get why they can't let you, but. Jon (52:41.644) Wow. So they're like, you can. Jon (52:46.638) Yeah, no. And so they're like, yeah, we, we, we would be happy to do, you know, a bulk service with you. If you like sign up for like our enterprise, you know, package, right? I'm like, like, it's only like a thousand a month. I'm like, no, I'm good. Thanks. that's, that's not going to be what I do, but they're like, but you can, you can do it yourself by going through and posting them to our API, but just know that, you know, there's like rate limits and stuff. So don't blast us with, you know, 70 ,000 transactions all at once. So I think they're like, you should be safe doing one per second. like, okay. Yeah, so that's, but then they're like, they, to their credit, they replied back again after. They're like, wait a second, I didn't mention, that's per platform. So you could do Apple and Google simultaneously one per second. I'm like, well, that gives me a little bit more threading. A little bit. Allan (53:22.729) Well, it's gonna take a while. Allan (53:38.743) It's a little bit better. Allan (53:42.559) a little bit. Well, I guess I'll show you lot because well, most of your users probably Apple, right? Probably most of you. Jon (53:48.172) Yeah, yeah, like a third and two thirds or something, right? So it'll help. So that's my next task. Cause I have to write like the bulk importer that like pulls from my own database and does something like, know, give me the, all the things once since this state just slowly start feeding them in, you know, two days later, it'll be done. Allan (54:07.817) Will that properly properly link with Apple from that point forward to? Yeah. OK. Is going to say because. Jon (54:12.034) Yeah. Yeah. So that that's the nice thing is that once you do all that, it's kind of all there, right? So it's, it's a little bit easier way to do it. But again, like all of this to say like, why couldn't they just do this out of the box for us? Why, why all these hoops to jump through? Like just help me. Allan (54:28.745) Yeah. Well, and that's why I think Apple, if they did, if they did a web hook and said, this is the transaction ID or some identifier that you've passed to them and the web hook is they just give you that ID and then your server, your server has to sign and request a message or something back and everything is just pull, right? So you can just pull, can pull all the past transactions. You know, you've got a JWT with them. So, you know, it's me, just give me, let me pull data. Jon (54:41.549) Yeah. Jon (54:55.554) Or just give me like a since date even, Like, here's where I've processed up to. Give me anything new and do it in batches and I'll keep asking you for it, right? And if I end up with a duplicate, like I know how to do that on my system. I know there's a unique ID for every transaction. Like just let me get at it. Well, it's the same, it's not just like push notifications. Like we talked about that way back when. Allan (55:04.18) Yeah. Allan (55:16.639) don't know why they did it. I don't know why they do it this way. Why are they always going to come up with something new? Jon (55:25.058) their first kind of format of that, right? It was just the dumbest API you've ever made. Yeah, it's not good. Allan (55:26.929) Mmm, yep. Allan (55:32.713) Yeah, here's our, we'll give you a thousand bytes. Figure it out. Thanks. Jon (55:35.979) Yeah, yeah, yeah. Yeah, we won't tell you when one failed. You just kind of have to figure that out yourself. Well, we will, but. Allan (55:41.579) Well, they did. They came up with that server later, you had to get the funny enough what we're saying. You had to query that one, right? You just did this go through? Did this go through? it did. OK, good. Jon (55:49.122) Yeah. Right. Yeah. but, but not the ones after that. I hope, I hope you remember which ones you sent after the one that failed because you got to send them again. Allan (55:56.978) Yeah. Yeah, I wonder who thinks these things up. Jon (56:06.382) I mean, you know. Allan (56:07.35) If you're an Apple or Google engineer on any of those teams, push payments, send us a message. I would love to hear why. What kind of expensive drugs were you on when you made these things? Because I want some. And if they weren't expensive, that's a bonus too. But I also like life. But hey, I'd like to know what the thought process was. Jon (56:15.608) Yeah, tell us why. Tell us why you did the things you did to us. Jon (56:28.718) I mean, they might not have been. Allan (56:35.188) Is it like an mcell where you're like it's it's so big and so many systems use it that you cannot turn the ship anymore? Or where you're like Jon (56:35.436) Yeah, I have to... Jon (56:43.458) Or was it like, you know, these are kind of tertiary things. like an intern worked on it. Allan (56:48.97) Yeah, like how cool could I make this if it pushes data? I didn't think about the outcomes of that, but I'm pushing data, man. It's real time. Like this is, this is state of the art. Yeah. Question mark. I don't know. It just, there's things in some of the stuff that they implement where I was like, did you really truly think about this? Jon (56:51.436) Right. Yeah. Jon (57:02.962) Question mark? Jon (57:14.764) No, don't. The only thing I can really think about is, you know, for the, like the initial push notification thing, they're like, we need to make this so it can scale huge, right? And like, what's the best way we can do that. And maybe they tried to like over engineer it so that it could do that. Allan (57:31.934) And a persistent connection is going to make that fast. Jon (57:34.924) Well, TLS handshakes, if you're doing it on large enough scale, fine. Yeah. It was more the like, okay, like tell me if it's sent or not. But so the point I was going to say too is that plus maybe the way that, you know, the, the other parts of their infrastructure architected, right? Like I could see for push if they're like, yeah, we send it off to this other queue and it's going to take like a second before we know if it worked or not. So I don't, how do we design this so that we're not Allan (57:38.164) Well, I guess. Jon (58:04.556) waiting a second for every message, right? Like, but even that, like I can think of some reasonable ways. yeah. Allan (58:11.236) It's not as yeah, I'm not I don't have anything nice this work. Yeah, I'm not I'm not coming up with a lot of things that don't say this is weird. What has been built? And there's no coherent like similarities between the two either, at least from the back end in the front end. It's like, guys, this could have been so much easier. And, you know, Jon (58:14.478) I'm trying real hard to defend them, alright? Jon (58:38.648) But here we are. Allan (58:40.284) I think I think too it's a lot easier to explain the Apple tax at that point too when it's when it's easier to stay, you know, with the going trends and. You know if I don't have to worry about PII in the app, I mean it's not like we care about. We don't get the credit card anyways, but we don't we don't care. I don't care about any of it. I just want to know I you said you wanted this plan. And this is your user ID that I shipped with it so that when it comes to the other end I can say yeah. Jon (58:54.392) Yeah. No. Allan (59:08.614) you've got this you just paid for this plan. This was the user ID that you pass through. And here's the date that it's good till that's it. That's all I want to know. Jon (59:16.78) Right. And then from there on, just like, let me find a way to ask you if that, if it's still good or not. Right. Easy. So that's. Allan (59:20.774) Yeah, if it's done the thing. Yeah. We must be missing something or we're low grade engineers maybe. that what it is? Jon (59:29.272) Yeah, maybe. But well, certainly like revenue cat figured it out, right? The other thing, like as I ventured into web, I was like, I have to figure out how to do that side of it too. Cause I want users to be able to subscribe from, you know, the web version. So like they do. Allan (59:42.172) Hmm, so revenue can't do that. Do they have web? No, but they're their own processor and every no, because you can do. OK. OK, well, there you go. Jon (59:49.134) No, they use, they use Stripe, which is fine. Cause that's what I was going to use anyway. So, but it all like integrates with their entitlements and stuff too. Right? So I can just be like, okay, I'm using Stripe and I I, it was easy enough to set up and it's like the, yeah, same thing. It's like everything just can flow through that. I think they also do Amazon as well. So they don't, I don't think they do the windows in app subscription stuff, but fine. Yeah. Allan (01:00:03.163) Look at you go. Allan (01:00:16.832) Aww. But why not? Jon (01:00:19.97) Well, yeah, I I had my app working with that API previously, but I've gutted it since. I'm just gonna use the web app for desktop. Allan (01:00:31.258) the four Windows developers that I know are going to be coming out with pitchforks. Jon (01:00:33.666) Yeah, I know. Yeah. But I was kind of impressed that if they did Amazon too, that was kind of neat because I mean... Allan (01:00:41.873) It's kind of telling when you think about it. They did not do Windows, but they did Amazon. Jon (01:00:47.05) Mm -hmm. You know, while there's more games that can have kids, you know, tapping ads on fire devices, right? Allan (01:00:57.327) I guess technically with games like Xbox would be the Xbox and PlayStation would be the gatekeepers in that. Hmm. Yes it is. Jon (01:01:05.198) But that's a different world too, right? Like this is apps, right? So if you're doing an Android app, like, yeah, I probably want it on, on the Kindle fire too, because a lot of people buy those cause they're cheap tablets for their kids. And then you've got purchases there too. Then make some more money. I've, I've sold very few copies of anything on, on that store. So it's probably not even worth setting up. Allan (01:01:28.621) And who knows if it's even still there or functional. Jon (01:01:32.462) I know my app is there and I feel bad because I'm like, yeah, if there's anyone actually using it, hasn't been updated forever there. Same with Windows though. So I delisted my Windows one finally. It's not there anymore. Allan (01:01:43.93) there you go. There you go. So you gotta get webbed. Jon (01:01:48.108) So I think, thanks everyone for letting me vent about in -app purchases. Allan (01:01:56.604) Do feel better? You never quite recover from these things though. You're always just a little bit lesser soul, but a little bit lesser of a soul at the end of them, aren't you? Jon (01:02:01.889) No. Jon (01:02:06.858) Mm -hmm a little bit. Yeah takes a few years off your life I've got more like gray hairs coming into the beard here these days. So no Allan (01:02:12.792) No, shut up, it's not that bad. Mine's bad. I'm starting to look like a ghost. Although John says I have a bad camera. Can I blame it on the camera? I can now. You'll be like, yeah, you'll be like, it's time to get a new camera. Jon (01:02:22.552) Yeah, sure. Let's go with that. That's right. So I think, you know, I'd really be curious to know if anyone else has as much trauma from dealing with in -app purchases as I do. Send us a note, maybe we can do the version two or like, you we're planning a multi -topic episode at some point, which might fit in good. Allan (01:02:46.584) I think we're gonna go to the micro topic soon and talk more about little things. Supposed to full learning episodes. We'll John and I may get our own rant corners. I don't know. John doesn't like it because my rants get brutal. You know what really grinds my gears? Just let me have it. Let me have my moment. Jon (01:02:48.929) Mm Little things. That's right. All right. Jon (01:03:00.012) You know what really grinds my gears? One of those sections. That's right. Jon (01:03:10.338) Done, All right, well, as always, you don't forget to go hit that button that does the thing like the subscribing or reviewing of five stars, you know, all the, all the trendy new things that we're going to learn one day. gone. Yes. Yeah. Don't, don't be Ohio. Apparently I'm learning all these things from kids. Allan (01:03:24.23) slay it as my daughter says slay it that's a good port term Allan (01:03:34.362) Slay it. Jon (01:03:36.462) gonemobile .io that's where you can go slay it and smash that like button subscribe YouTube that'll do it we'll see y 'all next week thanks all Allan (01:03:46.972) Thanks everybody.