App Store Earns $70K While Play Store Makes $47 -- But the Android App Is Broken
Why is this MobileDev meme funny?
Level 1: Cash Register Broken
Imagine you have a lemonade stand that’s doing really well – lots of customers, making lots of money every day. That’s like your iPhone app; it’s set up properly and people are happily buying lemonade (subscriptions). Now, your boss comes and says, “Hey, let’s open another lemonade stand on the other side of town to get even more customers!” This is like making an Android app to reach more people. You spend time setting up this second stand, and you expect to make double the money.
But oops! On opening day at the new stand, you realize the cash register is broken. Customers come, they want to buy lemonade, but they literally can’t pay you because the money drawer is jammed or the card reader doesn’t work. So, all those people walk away thirsty or take free samples, and you make almost no money at the new stand. Meanwhile, your first stand (the original one) is still raking in cash as usual. At the end of the day, you count $70,000 from the first stand and just $47 from the second stand. Yikes!
It’s a funny-but-cringe situation. Your boss had been so sure that opening the second stand (making the Android app) would bring in a ton of extra money. But because that stand wasn’t set up correctly (the app had a big bug in the payment part), it barely made anything. When you show the two bars of income – one super high, one almost flat – it’s awkward. The boss’s big idea backfired because we rushed and forgot something important.
So the meme is joking about that feeling: someone said “we absolutely need this new thing to get rich,” and then the new thing fails in a silly way, making the results look ridiculous. Even if you’re not a tech person, you get the idea: if you open a store but the checkout is broken, you won’t make money. In the end, it teaches a simple lesson with humor: make sure things actually work before expecting big results. The whole scenario is like a cartoon where a plan to double the profits ends up with a pie in the face because of one overlooked mistake.
Level 2: Broken Subscription Flow
Look at that image: it’s styled like a tweet from Cormac (@cormachayden_) saying “make an android app”. Below that, there’s a simple revenue chart with two bars. The top bar is labeled App Store (that’s Apple’s iPhone app marketplace) and shows 99.93% of revenue, totaling about $70,048. The bottom bar is labeled Play Store (Google’s Android app marketplace) showing a measly 0.07% of revenue, about $47. In plain terms, almost all the money came from the iOS app, and virtually none came from the Android app. That’s already a huge red flag – such a big ios vs android monetization difference usually means something is very wrong on the Android side.
Beneath the bars, there’s a little “Readers added context” box (a Twitter Community Note). It explains why the Android revenue is so low: “The Android app in question is broken and does not allow a user to pay for a subscription to the app.” Aha! So the Android app had a bug in the payment process (the subscription flow). In other words, Android users literally couldn’t purchase the subscription even if they wanted to. It’s like having an online store where the “Buy” button doesn’t work – of course you’re only going to make pennies. That $47 could be from something incidental or maybe a few one-time purchases, but basically Android revenue was dead on arrival because of this broken subscription flow.
Now, why does the text say “make an android app” in quotes? It hints that some boss or Product Manager (PM) demanded, “We should make an Android app!” They probably assumed that if the app is successful on iPhone, it should be on Android too – maybe even expecting to double the revenue or reach a whole new audience. This is common in software: a stakeholder (like a PM or a client) pushes for a new platform or feature without fully grasping the work needed. The dev team apparently did as told – they built the Android version – but perhaps under tight deadlines or with less experience on Android. And something crucial (the in-app purchase code) wasn’t implemented or tested properly. The result? The Android app launched with a major bug: users couldn’t complete a subscription purchase.
Let’s break down a few terms here for clarity:
- In-app subscription: a recurring payment feature inside an app. For example, an app might let you subscribe for $5/month for premium features. To support this, developers must integrate the platform’s billing system. On iOS (App Store), you use Apple’s official API (like
StoreKit) to handle payments. On Android (Play Store), you use Google Play’s Billing Library. They don’t work the same way – each has its own code and quirks. - Broken flow: when we say the subscription flow is broken, we mean the step-by-step process the user goes through to give you money doesn’t work. Maybe tapping “Subscribe” on Android did nothing, or it threw an error every time. Essentially, the bug stopped users from converting into paying customers.
- Feature parity: this means having the same features on all platforms. Here, the PM wanted feature parity for the app on Android – presumably everything the iOS app can do (including subscriptions) the Android app should do as well. The fallacy (mistake in reasoning) was assuming that just demanding parity would automatically yield similar success. In reality, each platform needs its own development and thorough testing.
For a junior developer or someone new to mobile dev, this meme is a lesson. It tells us: don’t assume pushing a feature to another platform is trivial. Android and iOS might run the “same app idea”, but under the hood you might be writing in different languages (Swift/Obj-C for iOS vs Kotlin/Java for Android), different UI frameworks, and importantly, different app store rules. Apple’s App Store and Google’s Play Store each have policies about in-app payments (for instance, both take a cut and require you to use their payment system). If you mess up integration or try to bypass rules, things can break or your app can even get rejected. Here it sounds like they did integrate but it was incomplete or faulty.
Notice also the comedic element: the Community Note on the tweet. Twitter’s community notes are usually to correct a misleading or incomplete tweet. In this case it’s like the community collectively went, “Hold up, before anyone concludes Android just doesn’t make money – the truth is the Android app never stood a chance because it’s broken!” It’s almost like an after-the-fact bug report for everyone to see. That adds a layer of humor because even casual Twitter readers could tell exactly why the graph looks so skewed.
So, the “awkward revenue graph” caption really fits. It would be an uncomfortable meeting when the PM and team review the revenue: one huge bar for iOS and a microscopic bar for Android. The PM insisted on spending time and money to build that Android app, and now they have to explain to their boss or client why it only brought in $47. It’s embarrassing! For developers, it’s a facepalm moment: all that work and coordinating for feature parity, only to stumble on a basic issue like the payment button not working. It highlights the importance of testing especially for critical features like payments, and maybe even the wisdom of rolling out beta tests. A lot of junior devs learn this the hard way: if you don’t test your app in real conditions (like an actual purchase on the Play Store), you can miss a showstopper bug.
In short, level 2 takeaway: The meme is pointing out a scenario where a company launched an Android version of an app under pressure, but a bug in the Android app meant users couldn’t pay for anything, resulting in almost zero revenue from Android. It’s funny in a schadenfreude way (laughing at a failure) because it’s such an extreme example of StakeholderExpectations meeting ProductionBugs. But it’s also a cautionary tale for developers about the pitfalls of rushing cross-platform development without proper QA.
Level 3: Feature Parity Fiasco
The meme lands a gut-punch to anyone who's dealt with stakeholder expectations in mobile development. The project manager’s mandate “make an Android app” sounds reasonable—who wouldn’t want to grab the huge Android user base? But the resulting revenue disparity in that chart is brutal: App Store: $70,048 (99.93%) vs Play Store: $47 (0.07%). This isn’t a subtle gap; it’s a chasm of nearly three orders of magnitude. Every senior dev reading this is wincing, because it screams “critical bug in production”. And indeed, the Twitter “Readers added context” note spells it out: the Android app is so broken it doesn’t let users subscribe (i.e., complete an in-app purchase). In other words, the Android app’s subscription flow is utterly busted – the cash register is stuck shut. 💀
From a senior engineering perspective, this is a classic feature parity fallacy in action. The PM insisted on cross-platform parity for the subscription feature without appreciating the platform-specific complexity. On iOS, the team likely integrated Apple’s StoreKit for in‑app subscriptions, tested it, and watched the App Store revenue roll in. On Android, though, implementing Google Play’s billing system (com.android.billingclient) wasn’t just a copy-paste job. Perhaps they rushed it to appease management’s timeline, or maybe a last-minute change ran afoul of Play Store policy. The result? Android users literally could not give you their money even if they tapped “Subscribe.” That $47 might be from a handful of confused users or some edge-case where a payment slipped through, but effectively the Android build contributed nothing.
The humor here is as dark as it is relatable. We’ve got a stakeholder/client demand (“we need an Android version now!”) that backfires spectacularly. It’s awkward because everyone expected Android to open a new revenue stream, but instead it’s a fiasco that tanked the ROI. The graph is basically a fulfillment of every cynical senior dev’s warning: “If we ship an untested feature under pressure, it’ll blow up in our face.” Sure enough, that insistence on parity without quality turned into a self-own. The Play Store bar is a tiny stub, a monument to what happens when you chase market share without investing in QA and user experience.
Consider the unseen chaos behind such a graph. The production bug in the Android payment flow might have been a simple logic error or a missing configuration (<uses-permission android:name="com.android.vending.BILLING" /> anyone?). Maybe the team forgot to enable Google’s in-app purchase API properly, or they didn’t test the release build with real Play Store transactions. One common scenario: using a sandbox or test environment that worked fine, but failing to adjust for production keys or Google’s review requirements. Perhaps the app got published with a stubbed payment method that always fails – a TODO left in code. A snippet that sums it up could be:
// Pseudocode for Android in-app subscription (simplified)
fun onSubscribeButtonClicked() {
launchPurchaseFlow()
// TODO: Handle purchase success and unlock subscription
showToast("Purchase failed. Please try again.") // Oops: always fails
}
If this looks painfully familiar, it’s because lots of us have lived it. The CFO or analytics team sees a mysterious conversion rate drop to zero on Android and starts panicking. The PM, who was so proud to announce “We have an Android app now!”, suddenly has explaining to do in the retro. The developers? They’re probably pulling an all-nighter combing through logs, only to facepalm when they find that one misconfigured setting or null pointer that killed all Android sales. It’s always the one thing you forget in production...
And let’s not ignore the added Twitter Community Note in the meme – that’s icing on the cake. It’s as if the entire internet QA team chimed in: “Actually, the Android app was DOA, hence the $47.” This public fact-check is hilarious to devs because it’s basically a post-mortem in a tweet. The community note is effectively doing what a good internal QA or user acceptance test should have done: flagging that “hey, Android users can’t pay at all.” The meme cleverly uses that to underscore the negligence.
In sum, this senior-level view sees the meme as a sardonic lesson: Cross-platform feature parity means nothing if one platform’s implementation is left half-baked. The Android vs iOS monetization gap here isn’t just demographic or user behavior – it’s a blatant engineering failure. Everyone chased the shiny goal (Android market share) without respecting the gritty details (testing the purchase flow on Android). The result is a Feature Parity Fiasco: the product manager got their Android app, and the company got a $47 footnote and a very awkward revenue meeting. It’s funny because it’s true – and painfully so in the world of BugsInSoftware and rushed releases.
Description
A screenshot from X.com showing user Cormac (@cormachayden_) posting '"make an android app"' with a revenue comparison chart. App Store shows 99.93% share at $70,048 while Play Store shows 0.07% at $47. Below, a 'Readers added context' note explains: 'The Android app in question is broken and does not allow a user to pay for a subscription to the app.' with a link to x.com/HiiJax/status/... The community note reveals the massive revenue disparity is due to a broken payment flow on Android rather than a genuine platform comparison
Comments
17Comment deleted
Revenue comparison: iOS $70,048 vs Android $47. Root cause analysis: the Android app's payment flow was as functional as a TODO comment in production
My Android app only made $47, clearly proving the platform's inferiority. Also, the payment button is currently mapped to a no-op function, but I'm sure that's unrelated
Sure, the Android SKU shipped - right after QA disabled the billing SDK, delivering the first ever freemium plan with 100 % churn
After 15 years in the industry, you learn that the difference between $47 and $70k isn't platform preference - it's whether your Stripe webhook actually fires when the payment intent succeeds. Classic case of shipping the MVP but forgetting the 'V' stands for 'Viable', not 'Void of payment processing'
When your Android app generates $47 while iOS pulls $70K, you realize you've successfully implemented the 'freemium' model - except the 'free' part was unintentional and the 'mium' is just a rounding error. Nothing says 'cross-platform parity' quite like a broken payment flow that turns your subscription service into an accidental open-source project. At least you can tell stakeholders you're 'disrupting traditional monetization strategies' while quietly fixing that In-App Billing integration you copy-pasted from a 2019 StackOverflow answer
Nothing exposes the gap between “make an Android app” and “ship a working billing flow” like a revenue chart that’s 99.93% iOS - turns out TODO: billing isn’t a monetization strategy
Write once, run anywhere? More like earn once on iOS, debug everywhere on Android
We nailed cross‑platform parity: both apps ship a Subscribe button; only one wires it to BillingClient
well he has a point anyway usually android users pay less for apps than ios users Comment deleted
If the android app is broken... How could these several users pay $47 for it? Comment deleted
Probably in app ads, Google doesn't pay a lot in AdSense Comment deleted
Or maybe it's a "it works on my machine" thing. But yeah the ads thing makes sense Comment deleted
Just pirate it Comment deleted
If you're making a cash grab, please do stick to IOS Comment deleted
apple devs Comment deleted
Absolute cinema Comment deleted
Aha, its a works on my machine! Comment deleted