
The Day a Library Update Almost Broke Our Paid Users
That means the rest of the design no longer recognizes where those elements are supposed to sit. So as soon as you start previewing or adjusting variants, things will shift unexpectedly.
The day a library update almost broke our paid user
It started as one of those tasks you barely think twice about.
We were working on our Android app, and things were quiet in the way you want an app to be quiet. Paid users had access, purchases were going through cleanly, crash logs were empty. Nothing in the inbox.
Then we pulled a routine item off the backlog: upgrade the Google Play Billing Library to the latest version. A version bump. The kind of thing you slot in between bigger tickets.
We made the change, rebuilt, and started testing.
Something felt off
On the surface everything looked fine. The app launched, menus worked, the purchase flow ran end to end.
Then we tried a restore on one of our test accounts, a user who had bought our lifetime pro version months earlier.
The app didn't recognize them.
We tried another account. Same result. Another, same again. People who had paid, whose receipts we could still see in the Play Console, whose purchases had worked perfectly the day before, were suddenly invisible to the app.
That got our attention.
Digging in
We spent the next few hours doing what you do in this situation. Reading release notes. Searching issue trackers. Pulling up old threads on Stack Overflow. Running the billing flow with logs turned all the way up.
Eventually the picture came into focus.
The newer versions of the billing library behave differently around consumed one-time purchases. Once a purchase is consumed, the library no longer surfaces it when you query purchase history on the device. For apps that sell renewable subscriptions, this change is a non-event. For apps with lifetime unlocks, it matters, because that device-side record was the piece of the puzzle the app was reading to decide who got pro access.
The purchases still existed. Google still had them. The users still owned them. They just weren't flowing back to the device in a way the app could read.
How it shook out
Existing customers signed in once and their pro status came right back. New purchases flow straight into the backend and stay there. If a user switches phones, reinstalls, or picks up a new tablet, their access follows them.
And the original issue, the one that kicked all this off, quietly stopped mattering. Whatever the billing library does or doesn't return on any given version is no longer something the app leans on.
A small version bump sent us further down the road than we'd planned, but the app came out of it sturdier than it went in. Worth the detour.

Senior Android Engineer
Let’s explore how we can bring your ideas to life.
See how we’ve transformed ideas into success stories
More Articles

WordCamp Asia 2026: We Went for the Talks, Stayed for the Conversations
We pulled into the venue around 9 AM. The place was already buzzing. WordCamp Asia 2026 had drawn 3,000+ people from across the continent and we were nearly late for the opening remarks.

Wazid Shah
Head of Digital Commerce
Events

Why I built Notarizer
We built Notarizer to simplify macOS app notarization, automating signing, DMG creation, and error handling into a guided, one-click workflow for developers.

Lyle Furtado
Senior iOS Engineer