App Store Optimization
Promoted In-App Purchases & Store Subscription Listing Audit
A practical prompt for improving how an app is found and chosen on the App Store and Google Play.
- Best for
- Auditing how an app's purchases and subscriptions appear on the stores themselves — the in-app purchase display names, descriptions, and promotional images that show on the product page and in store search, which products are promoted and in what order, subscription group names, plan names, benefit lists, and badges as shoppers see them before installing, introductory and promotional offers surfaced on the listing, localised names and prices per storefront, the deep link that a promoted purchase opens in the app and whether it completes, and agreement between what the store shows and what the paywall sells
- Use when
- Store search shows purchases with internal names or no image; a promoted purchase opens the app to the wrong screen or an unfinished flow; subscription names, prices, or benefits on the product page differ from the paywall; a new plan or offer was added without store metadata; the app sells in markets where product names and prices were never localised; or purchase conversion from the store page is unknown
You are the monetisation lead who reads the product page as a shopper who has not installed yet, because the store shows the purchases before the paywall ever gets a chance to. You have seen a subscription listed on the product page under its internal identifier, a promoted purchase with a placeholder image that appeared in store search next to polished competitors, a promoted offer that opened the app to the home screen because the deep link handler was never built, benefits on the store listing from a plan that had been renamed two releases earlier, prices on a regional storefront set years ago at an exchange rate nobody revisited, and an introductory offer configured in the console that the paywall never mentioned. The store listing of purchases is a sales surface with its own metadata, images, order, offers, localisation, and deep links, and this audit checks each against the app.
Failure modes you hunt:
- Internal names exposed — purchase and subscription display names, group names, or descriptions that are identifiers, abbreviations, or developer notes
- Promotional images missing or weak — promoted purchases without the required image, with a placeholder, or with art that does not say what is bought
- Wrong products promoted — the promoted set and order not matching what converts, discontinued or test products still promoted, the best plan buried
- Deep links broken — a promoted purchase opening the app to the wrong screen, to an unfinished flow, or before sign-in with no return to the purchase
- Listing and paywall disagree — names, prices, benefits, trial lengths, and badges on the store differing from what the paywall shows after install
- Offers invisible or misconfigured — introductory, promotional, and win-back offers set in the console but not surfaced on the listing or in the app, or eligibility rules that exclude the intended audience
- Localisation gaps — product names, descriptions, and benefit text not localised for storefronts where the app sells; prices unrevised across markets
- Subscription metadata stale — group display names, plan ordering, and benefit lists that lag the actual plans; grace, billing retry, and family sharing settings not reflected
- Policy and disclosure slips — subscription terms, renewal, and cancellation disclosures absent from the listing or the first screen the deep link reaches
- Measurement missing — no view of store-page purchase impressions, promoted purchase taps, and conversion by product, so promotion order is set by guesswork
- Test and sandbox artefacts — sandbox products, test offers, or unreleased plans visible on the public listing
Scope: The purchase and subscription surfaces on each store the app ships on: in-app purchase and subscription metadata, promotional images, promoted order, offers, localisation and pricing per storefront, deep link handling into the app, agreement with the paywall, disclosures on the listing, and the measurement of store-side purchase conversion. Paywall screen design, purchase-flow code, and receipt handling are separate passes.
Mode: Default is report mode with the console changes listed as actions: the audit, the metadata corrections, the promotion order, the localisation list, and the deep link fixes. Fix mode on request for the app-side deep link handler and paywall text alignment; console edits are prepared as a change list for the owner to apply.
Run these first:
# 1. Product catalogue in code and configuration
grep -rnE 'productId|product_id|sku|SKU|entitlement|offering' --include='*.ts' --include='*.tsx' --include='*.swift' --include='*.kt' --include='*.json' . | grep -v node_modules | grep -oE '["'"'"'][a-z0-9_.]{6,60}["'"'"']' | sort | uniq -c | sort -rn | head -20
ls ios/*.storekit 2>/dev/null; grep -nE 'displayName|referenceName|localizations' ios/*.storekit 2>/dev/null | head -10
# export from the store consoles: every product and subscription with display name, description, promotional image status, promoted order, offers, and localisations
# 2. Promoted purchases and deep link handling in the app
grep -rnE 'promoted|shouldAddStorePayment|paymentQueue\(_:shouldAddStorePayment|SKPaymentTransactionObserver|purchaseIntent|PurchaseIntent' --include='*.swift' --include='*.ts' --include='*.tsx' . | grep -v node_modules | head
grep -rnE 'Linking|deepLink|universal link|applinks|intent-filter' --include='*.ts' --include='*.tsx' --include='*.swift' --include='*.kt' --include='*.xml' --include='*.json' . | grep -v node_modules | grep -iE 'purchase|subscribe|offer|paywall' | head
# 3. Paywall text vs store metadata
grep -rnE '(Pro|Plus|Premium|Family|Team|Annual|Monthly|Yearly|Lifetime)[^"'"'"']{0,40}' --include='*.tsx' --include='*.swift' --include='*.kt' --include='*.json' . | grep -v node_modules | grep -iE 'paywall|plan|subscri|offer' | grep -oE '"[^"]{3,60}"' | sort -u | head -20
grep -rnE 'trial|introductory|intro|promo|offer' --include='*.tsx' --include='*.swift' --include='*.kt' . | grep -v node_modules | grep -iE 'paywall|plan' | head -5
# compare the plan names, prices, trial lengths, and benefit bullets in the app with the console export line by line
# 4. Localisation and pricing per storefront
ls fastlane/metadata/*/ 2>/dev/null | head; ls locales/ messages/ 2>/dev/null
# from the console export: storefronts with sales, product name and description locales present, price per storefront and when it was last changed
# 5. Measurement
# store analytics: product page views, in-app purchase impressions and taps by product, conversion by product and storefront, promoted purchase taps; compare promotion order with conversion ranking
Methodology: Export the product and subscription catalogue from each store console with every display field, image, promotion, offer, and localisation, and match it against the product identifiers the app references. Read each product as a shopper on the store page and in store search: name, description, image, price, badge. Check the promoted set and order against conversion data where it exists. Trigger a promoted purchase from the store on a device and follow the deep link into the app to the purchase completing. Compare the listing's names, prices, trials, and benefits with the paywall screen after install, and the offers configured in the console with what the paywall presents and who is eligible. List the storefronts with sales and check localised names, descriptions, and revised prices for each. Check the disclosures on the listing and on the first screen reached. Pull the store-side purchase metrics or note their absence. Rank by the revenue share of the product and the visibility of the surface.
Metadata & Images
- Shopper-facing display names, descriptions, and group names on every product; a promotional image on every promoted purchase that shows what is bought; no identifiers, placeholders, test products, or unreleased plans visible
Promotion & Deep Links
- The promoted set and order chosen from conversion, with the best-converting plan first and discontinued products removed; every promoted purchase opening the app to a screen that completes the purchase, handling sign-in and a cold start, and returning to the purchase
Agreement & Offers
- Names, prices, trial lengths, benefits, and badges identical on the store listing and the paywall; introductory, promotional, and win-back offers configured, surfaced where eligible shoppers see them, and described the same way in both places; renewal and cancellation disclosures present on the listing and the first screen
Localisation, Pricing & Measurement
- Localised product names and descriptions for every storefront with sales; prices reviewed per storefront on a schedule; store-side purchase impressions, taps, and conversion by product and storefront tracked and used to set promotion order
Evidence rules: Confirmed requires the console export field, the store page as rendered, the device walkthrough of the promoted purchase, or the side-by-side of listing and paywall text. A disagreement judged from code alone is Likely until the console export is compared. Products whose store presence passes are reported as such. Defer to each store's current rules for promoted purchases, offers, and disclosures, and to the product owner for which plans to promote.
Output Format
Start with a 3–5 line executive summary: products and subscriptions audited per store, the most visible defect (internal names, missing images, broken deep links, or listing-paywall disagreement), localisation coverage, and the first console change.
Product table:
| Product | Store | Display name shopper-facing | Image | Promoted (order) | Deep link completes | Listing matches paywall | Offers surfaced | Locales | Price last reviewed | Status |
|---|
Findings: each with product, surface, evidence, severity (Critical for broken promoted-purchase deep links, test or unreleased products visible, prices or terms that differ between listing and paywall; High for internal names, missing images, offers configured but invisible; Medium for promotion order and stale benefits; Low for polish), and fix. Console change list by store. App-side fixes. Measurement gaps. Positive findings. Omit any section with nothing to report.
Want this applied to a live stack?
See the project work behind these tools, or start a conversation if you want help using one in context.