Link-in-bio apps
A personal hub with buttons to Instagram, YouTube, a shop and a newsletter. Every tap leaves the app.
App Store rejection
4.2.2 is the narrower, sharper sibling of the 4.2 minimum functionality rule. The reviewer did not just find your app thin; they found it is mainly a menu of links, a marketing brochure or other people's content in a frame. The fix is not more links but one job the user can finish inside the app.
From $109 one-time per platform, or let our team do it all from $698.
Guideline 4.2.2 says that, catalogs aside, apps should not be primarily marketing materials, advertisements, web clippings, content aggregators or a collection of links. The rejection usually cites "4.2.2 - Design - Minimum Functionality" and describes what the reviewer saw: the app mainly shows marketing content, mainly links out, or mainly repackages content from elsewhere, and offers little lasting value to the user.
The general Guideline 4.2 asks whether your app is more than a repackaged website, and the thin wrapper response covers apps that are fine as websites but feel like Safari. 4.2.2 is about purpose. A beautifully native app can still get it if its main content is a list of links or an advertisement for a business. Adding push notifications to a brochure does not change what it is.
A personal hub with buttons to Instagram, YouTube, a shop and a newsletter. Every tap leaves the app.
About us, services, team, testimonials, contact form. Useful for a prospect once, not something anyone opens twice.
A PDF menu, opening hours and a booking button that opens a third-party site.
RSS feeds, embedded articles from news sites, "best deals" lists of affiliate links. The value belongs to the sources, not to the app.
The classic Lovable weekend project: "200 AI tools" as cards that each open the tool's website.
A schedule and venue map that link out to ticketing and streaming. Fine as a page, thin as an app.
| What the app has now | What reviewers want to see | WebViewGold building block |
|---|---|---|
| Buttons that open external sites in Safari | The important content inside the app; leaving is the exception | openallexternalurlsinsafaribydefault false, partner domains in safariblacklist, secondary pages in an in-app tab with openspecialurlsinnewtab (URL handling docs) |
| Service pages and a contact form | A task with a result: book, order, request a quote and follow its status | Push notifications for status changes (kPushEnabled, oneSignalID), permission asked with registerpush:// after the first booking |
| A feed of other sites' articles | Your own content or curation with personal value: saved items, a reading list, progress | Favorites stored on the device with writevalue:// and readvalue:// (snippet below), an offline fallback page |
| A PDF menu | A real menu with categories, allergens, favorites, ordering or reservations, and a loyalty card | Wallet pass with addpkpass://; the PDF can stay as a download extra |
| A static event schedule | A personal agenda, reminders before sessions, ticket check-in | qrcode:// or barcodescanner:// for check-in, .ics links for the calendar, push reminders |
| A home screen of links | Shortcuts into the tasks people repeat | Home Screen quick actions with useShortcuts and Shortcuts.json, a native tab bar with showNavFooter |

I am very happy I bought this app! Extremely easy and great documentation. Was in contact with the customer service, they replied very quickly and very friendly. They solved my question within a day. 10/10 would recommend.
Apple exempts catalogs by name, and many retail apps rely on it. A catalog passes when it behaves like one: browse by category, search, filter, product detail pages with availability, favorites, maybe a store finder or a barcode scanner for in-store lookups (the result of barcodescanner:// lands in the barcodescanresult JavaScript variable). A catalog that is really a PDF brochure or a grid of links to a web shop is treated as marketing material. Physical goods are sold with your normal web checkout, not in-app purchase; see Guideline 3.1.1 for where that line runs.
Finish this sentence before you touch code: "In [app], [who] can [task] in under a minute." If you cannot, the app needs a product decision first, not a build.
Open on the task, not on a hero banner. Hide marketing blocks inside the app with app-only CSS (custom CSS docs) or show a different start page by detecting the app through useragent_iphone / useragent_ipad in Config.swift.
Set the URL handling so your own content and partner pages open in the app or an in-app tab. Only social profiles and truly external services should go to Safari.
Favorites, history, progress, a cart, a saved filter. With an account, store it on your backend; without one, the Read/Write Value API keeps it on the device (read/write value docs).
A real notification trigger: your order is ready, the session starts in 15 minutes, a saved item is back in stock. A push prompt with nothing behind it does not count.
Hand the TestFlight build to a friend and give them the job, not instructions. Where they get lost is where the reviewer will.
Describe the job and where each feature lives, using the template below, and update the review notes.
A small helper for apps without accounts. Everything after writevalue:// is stored as one string; readvalue:// injects it back as window.storedValues. In a normal browser it falls back to localStorage.
// Favorites via the WebViewGold Read/Write Value API, localStorage on the web
// "MyAppIOS" is a marker you add to useragent_iphone and useragent_ipad in Config.swift
const inApp = navigator.userAgent.includes("MyAppIOS");
function saveFavorites(ids) {
const value = JSON.stringify({ fav: ids });
if (inApp) {
window.location.href = "writevalue://" + encodeURIComponent(value);
} else {
localStorage.setItem("favorites", value);
}
}
function loadFavorites(callback) {
const parse = (raw) => {
try { return JSON.parse(decodeURIComponent(raw)).fav || []; } catch (e) { return []; }
};
if (!inApp) { callback(parse(localStorage.getItem("favorites") || "")); return; }
window.location.href = "readvalue://";
setTimeout(() => callback(parse(window.storedValues || "")), 200);
}Hello App Review team, Thank you for the feedback under Guideline 4.2.2. We agree that the previous build relied too much on links and marketing content, and we have reworked the app in build [number]. [App name] now helps [who] to [core job]. What changed: 1. The home screen opens on [task], not on marketing content. Promotional sections were removed from the app. 2. [Content / booking / ordering] now happens inside the app; only [social profiles] still open externally. 3. Users can [save favorites / keep a reading list / track their orders]; this is stored [in their account / on the device]. 4. Push notifications inform users when [order is ready / session starts / saved item is back]. How to test: log in with [demo account] or use the app without an account, then [3 short steps that show the job]. Best regards, [Name]
Rarely on its own. If you are a creator, build something your audience uses repeatedly instead, such as exclusive content, a community feed with your own posts, bookings or a shop with order tracking, and keep the links as a secondary screen.
Catalogs are exempt by name, as long as the app works as a catalog: categories, search, product details, favorites. A catalog that is a PDF or a list of links to a web shop is treated like marketing material.
Pure aggregation of other publishers' content is exactly what 4.2.2 names. Original reporting, real curation with your own summaries, or personalization and offline reading give the app its own value.
No. Accounts are one way to give the app memory. Device-side favorites, offline content, scanners or a calculator can be just as convincing, as long as the user can get a job done.
4.2.2 judges what your app is for. 4.3 judges whether it duplicates other apps, including your own. You can get both, and each needs its own fix; see the 4.3 guide for the duplicate side.
Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main page$349 per license, one-time add-on
No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.
How the Cloud Builder works Try the free demo$698 per platform $798
Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.
Full Service details Powered byWinter Sale prices valid until December 31, 2026.
App Store & Google Play approval guarantee – or your money back within 14 days
Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.
Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.