Last Shipaton, I Couldn’t Ship a Paywall. This Year, Six People Paid Me $13
The numbers first, as of September 22: six subscribers, about $13 in revenue. That is not a success. 2026-10-1 21:15:33 Author: hackernoon.com(查看原文) 阅读量:6 收藏

The numbers first, as of September 22: six subscribers, about $13 in revenue. That is not a success. But last year the number was zero, because I never got in-app purchases working.

Last year

August 23, 2025: "In-app purchases are hard. Four hours in and I'm back where I started. If anyone is confident with RevenueCat purchases, I'd love some advice."

The app itself made it onto the App Store in the second half of Shipaton. The purchase didn't, and without it there was no Shipaton entry.

I hadn't written any StoreKit code. I went straight to RevenueCat and got stuck on the concepts. I couldn't tell a product from an offering from an entitlement, or which of them I was supposed to create in App Store Connect and which in the RevenueCat dashboard. Six days earlier, I had tweeted that the purchase part of this hackathon was too hard for a casual vibe coder, unless there was some easy way I didn't know about.

After the four hours, I watched Sean Allen's RevenueCat video and read an article sent to me by Haru, who comes to the mokumoku sessions I run. Shipaton ended before I got the purchase working.

Practicing on an app I never released

In January I tried again and spent a whole day on it. I ended up back at the start. The .p8 key file and all the different IDs confused me.

In May, I tried once more, on an English vocabulary app for Japanese TOEIC learners that I never released. On May 13 I wrote that it had come a long way, and that sandbox testing, the paywall in RevenueCat, and TestFlight were left. Test purchases were not the problem.

Getting App Store Connect and RevenueCat to agree took about a month. On June 18 my products were still stuck on "Missing Metadata" in App Store Connect. The cause was that I hadn't added a localization to them. App Store Connect said metadata was missing but not which field.

By then I could tell the three apart:

  • A product is what Apple sells. It is created in App Store Connect, with an ID and a price.
  • An offering is the set of products the paywall shows. It is created in RevenueCat.
  • An entitlement is what the user gets for paying. Several products can point at the same entitlement.

That was the part I had missed. The app doesn't need to know which plan someone bought. It only asks whether the entitlement is active.

What changed on the AI side

This year it also felt easier to work on RevenueCat with AI. I looked up what had changed. In September 2025, a few weeks after I gave up, RevenueCat launched an MCP server that lets an AI assistant create products, entitlements and offerings in a RevenueCat project. In May 2026 it released an AI toolkit: a plugin for Claude Code, Codex and other coding agents, with skills for SDK setup, paywalls and testing.

Neither of them creates products in App Store Connect. That side still has to be done in App Store Connect itself, and that is where most of the month went.

How Japatan is set up

In June, I turned the practice app into Japatan, a Japanese-learning app for English speakers. The purchase code came along with it.

  • App Store Connect: four products. Weekly, monthly, yearly, and a one-time lifetime purchase.
  • RevenueCat: all four point at one entitlement, premium, and sit in the current offering.
  • The app: one service that asks RevenueCat for the customer info and turns it into a single isPremium.
let unlocked =
    info.entitlements.active["premium"] != nil
    || info.nonSubscriptions
        .map(\.productIdentifier)
        .contains("jp_premium_lifetime")

The second condition is there because the lifetime purchase can show up only in nonSubscriptions, without an active entitlement.

isPremium removes the daily study limit, unlocks the locked tracing sets, lifts the limit on news articles, and hides ads. The rest of the app never touches RevenueCat.

Restoring works the same way. The paywall has a Restore Purchases button that calls restorePurchases(), and the result goes through the same check. The service is also the RevenueCat delegate, so when a subscription renews or expires, isPremium changes without a relaunch.

After the purchase was in

Getting the purchase in was the whole achievement. Everything after it is rough.

Japatan is for people learning Japanese. I am a Japanese speaker, and almost all of my followers on X are Japanese. Reaching the US market from there is shaky, and I said so on day 5:

On August 19, I put RevenueCat's ready-made paywall into onboarding. On August 24, I replaced it with my own screen, which still takes its plans from the offering.

Haru told me to look at the pricing again. I changed it. I also rebuilt the paywall along the lines of RevenueCat's live stream on paywall best practices.

週額がなんかしっくり来なかったからやっぱり月額にする👀 — The weekly plan didn't feel right, so back to monthly.

A Shipaton mokumoku session in Tokyo, August 23:

Flashcards alone don't bring people back every day. So I kept adding reasons to open the app: sharing your score, a daily news piece with audio. I'm still trying things.

September 22

Six subscribers. About $13. On September 21, someone posted "Bought a Mac… Made $3.99. Business." I quote-tweeted it:

Hard to call it a success. But a year ago I couldn't get the purchase to work at all. Now people are paying for something I made, and I want to give them more than they paid for.

Try Japatan here.


文章来源: https://hackernoon.com/last-shipaton-i-couldnt-ship-a-paywall-this-year-six-people-paid-me-$13?source=rss
如有侵权请联系:admin#unsafe.sh