A "ready for distribution" notice arrived on a Sunday morning. One app had cleared review.
That app was rejected under 4.3(b) on July 28 — saturated category, the rule for the flood of fortune telling and astrology apps. The rejection itself wasn't surprising. What was surprising is that I had already pivoted before it happened.
When you change your product, does the text in the store change with it? I only changed the app.
The app was changed
I had already restructured the app before the rejection. First tab on the first screen: naming. Then baby nicknames, name reading, and naming a shop or brand. Fortune telling was no longer the lead.
But a reviewer reads the listing before opening the app. That listing said this:
keywords: 算命 · astrology · zodiac · fortune teller · psychic · fortune house
first line of the description (all five locales): "a fortune hub"The product was a naming tool and the registered text was still a fortune house. 4.3(b) says "your app is one of many," and I had filed myself under "many" with my own hands.
This was not a code problem. It didn't need a single commit.
What I changed
Name, subtitle, keywords and description, replaced across five locales.
One thing needed care: I left the tail of the description alone. The tail runs from the ※ disclaimer through the subscription notice to the EULA and privacy links. A subscription app whose description lacks a Terms of Use link in any locale gets a 3.1.2 metadata rejection. Rewrite the whole thing to escape 4.3(b) and you land on 3.1.2 instead.
So the script replaces only the head and preserves the tail. Fixing one rejection reason by creating another is the most common mistake in this corner of the work.
Here's the fork — what would you do?
A 4.3(b) leaves you two paths.
A. Add more features. Prove "we're different" in code. B. Fix the fact that you already are different but don't read that way.
A takes weeks and offers no guarantee the reviewer notices the difference. I took B. The app already was different; it just wasn't being read that way.
It passed. It also took a while — rejected July 28, approved August 16. The queue was long.
Passing review is where the work starts
Here is what I actually touched after the approval notice.
- A new app landing page (five locales, including privacy, terms and support pages)
- Icon fetched and deployed
- A row in the app directory — card, JSON-LD ItemList, translation keys, icon wall
- App count updated across four hub locales (40 → 41)
- App registered in the shorts pipeline's source of truth
- App Store screenshots pulled for Korean, English and Japanese
- Shorts rendered in three languages and published to three channels
- This post
Eight places. There is more wiring to announce that an app exists than there was to build it.
The automation was blocking the new app
Step 7 caught something. The shorts channel picks one app per day, and the selection is a category round-robin. Running it on launch day, it picked a different app. A new app waits in line for weeks.
Launch-day exposure is the cheapest exposure there is. So I added a priority flag that skips the round-robin and ships a named app the same day. It's the same problem I hit in the blog pipeline — fair rotation acts as a penalty on new entries.
Reviewing the English cut caught two more.
- The hook text ran off the frame. Two Korean lines became one long English line. The translation passed; the layout did not.
- The English video used Korean UI screenshots. The store has per-locale screenshots and the pipeline only ever used the Korean ones. Now it resolves screenshots by language.
Both were outputs the automation reported as successful. Neither would have been caught without pulling frames and looking.
Three things to check
- When you repositioned, did the store text move too? If your keywords and first description line describe the old positioning, the reviewer sees the old app.
- Do you preserve the description tail when rewriting? Subscription apps need the Terms of Use link in every locale. Replace the head only.
- How many days until your release automation shows a brand-new item? A fair round-robin is at its worst on launch day. You need a bypass.
The honest part
This isn't a success story. It passed review, and I have no idea how many installs it will get. Measured earlier, all apps combined pull 193 visitors a month, and store purchases total 14 to date.
What I did today was hang the announcement everywhere I could hang it — not bring anyone in. Eight surfaces with small reach each still add up to small. That's next week's number to check.
The rejection lesson holds, though. Review reads the text you submitted, not the product you built. Fix the product and leave the text and you get treated exactly like the app you no longer are.
If you're staring at a rejection reason right now, getting ready to change code — reread the sentences you put in the store first. I lost three weeks there.