Get help › Sample audit report
Sample, fictional app. "Dayward" does not exist. This report shows the format and depth of the $49 pre-submission audit. The findings are typical of apps built with AI builders and wrapped for iOS, but every detail below is made up for illustration.
Pre-submission audit: Dayward (habit tracker)
What you receive by email, in this layout: a verdict, the findings in the order we suggest fixing them, and a short list of App Store Connect items to finish before you press Submit.
- App
- Dayward, a daily habit tracker with streaks, reminders, progress photos and a yearly Pro subscription (fictional)
- Built with
- Lovable web app, wrapped for iOS with Capacitor by the owner from a tutorial
- What we reviewed
- Published web app, project code export, TestFlight build 1.0 (3), draft App Store listing and screenshots
- Tested on
- iOS Simulator (largest current iPhone and 13-inch iPad) and one physical iPhone via TestFlight
- Guidelines as of
- App Review Guidelines text published at developer.apple.com, September 2026
- Report date
- 2026-09-28 (sample)
Verdict
Not ready to submit yet. We found 2 blockers, 4 high-risk items and 2 medium-risk items. The blockers would stop the build before or during review. The high-risk items match common rejection reasons for this type of app, and in our reading each would likely lead to a rejection on its own. All eight are fixable in the current project without rebuilding the app.
Our estimate, an assumption based on similar projects: about 1 to 2 working days for someone comfortable with Xcode and the Lovable project, most of it in findings 3, 4 and 6. Apple decides; fixing everything here reduces known risks but cannot promise approval.
Severity scale
- Blocker Stops the upload, crashes during review, or is required before Apple will review.
- High A common, specific rejection reason that we expect a reviewer to hit.
- Medium A plausible rejection reason, or a listing problem usually fixed without a new build.
- Low Polish. Not a likely rejection reason. (None in this report.)
Findings at a glance
Findings in detail
Blocker Guideline 2.1, 5.1.1(ii)
1. Tapping "Add progress photo" crashes the app
Evidence. On the physical iPhone, TestFlight build 1.0 (3) closes immediately when you tap Add progress photo on a habit. @capacitor/camera is installed, but ios/App/App/Info.plist has no camera or photo library keys:
Info.plist, keys present: CFBundleDisplayName, UILaunchStoryboardName, ...
Missing: NSCameraUsageDescription
NSPhotoLibraryUsageDescription
NSPhotoLibraryAddUsageDescription
iOS terminates an app that requests camera access without a purpose string. A reviewer who tries the photo feature sees a crash, which is a 2.1 rejection, and the missing text is a 5.1.1(ii) issue on its own.
Fix.
- Add the three keys to
Info.plist with specific text, for example camera: "Take a progress photo to attach to today's check-in." Photo library: "Choose an existing photo to attach to a check-in."
- Request access only when the user taps Add progress photo (the plugin does this by default once the keys exist).
- Test "Don't Allow": the app should show a message pointing to Settings and keep working.
Guide: 5.1.1 data collection and purpose strings
Blocker ITMS-91053, Guideline 5.1.2
2. No privacy manifest; outdated plugins
Evidence. There is no PrivacyInfo.xcprivacy in the App target. package.json pins Capacitor 5.0 and @capacitor/preferences 5.0, which predate bundled privacy manifests. The upload email for build 3, which the owner forwarded, lists ITMS-91053 for the user defaults and file timestamp API categories.
An analytics snippet copied from the web app sends a device identifier to a third-party analytics service, while the draft App Privacy answers say "Data Not Collected".
Fix.
- Update Capacitor and all plugins to current versions, then
npx cap sync ios.
- Add a privacy manifest to the App target, declaring the remaining API categories with reason codes that match what the code does.
- Remove the web analytics snippet from the iOS build, or declare what it collects in the manifest and in App Privacy. It does not appear to track across other companies' apps, so App Tracking Transparency should not be needed; confirm with the vendor's documentation.
- Upload a new build and confirm the ITMS-91053 email does not come back.
Guide: 5.1.2 / ITMS-91053 privacy manifest
High Guideline 2.5.2, 4.2
3. App loads the live website instead of bundled files
Evidence.
// capacitor.config.ts
server: { url: 'https://dayward-app.example', cleartext: false }
Every screen comes from the live site. With the phone in Airplane Mode the app shows a blank white screen. The web header with a hamburger menu and a "Get the app" banner are still visible on iOS, and the Blog link opens the marketing site inside the app.
Fix.
- Remove
server.url, run the production build and npx cap sync so the app loads its own files.
- Replace the web header with a bottom tab bar (Today, Habits, Progress, Settings) on iOS.
- Add an offline state that shows today's habits from local storage and queues check-ins.
- Hide the app banner, cookie banner and Blog link on iOS.
- Keep one or two native features the reviewer can see: the existing local reminder notifications already count, and the progress photo from finding 1 is another.
Guides: 2.5.2 software requirements, 4.2 minimum functionality
High Guideline 3.1.2
4. Subscription screen missing terms links and Restore
Evidence. The Pro paywall (shown after the third habit) uses RevenueCat with a yearly product. On screen, from largest to smallest text: "Just $0.77 a week", "Start 7-day free trial", and in small grey text "$39.99/year after trial". There is no Terms of Use link, no Privacy Policy link, and no Restore Purchases button on the paywall or in Settings. The draft description does not mention Terms of Use.
Fix.
- Make "$39.99 per year" the most prominent price. Keep the weekly figure smaller, if at all.
- Under the button: "Free for 7 days, then $39.99 per year. Cancel any time in Settings." Read the price from RevenueCat so it matches each storefront.
- Add Terms of Use and Privacy Policy links on the paywall, opening pages on your own domain.
- Add Restore Purchases to the paywall and to Settings > Plan, calling RevenueCat's restore and showing the result.
- Add a Terms of Use link to the description, or use Apple's standard EULA.
Guide: 3.1.2 subscriptions
High Guideline 4.8
5. Google sign-in without an equivalent option
Evidence. The sign-in screen offers "Continue with Google" and an email magic link. Google sign-in sets up the user's main account, so 4.8 applies. Apple has rejected apps with this exact combination, because the email option does not let users hide their email address.
Fix.
- Add Sign in with Apple through your auth provider (Supabase in this project supports it) and show it with equal prominence.
- Enable the Sign in with Apple capability for the App ID and in Xcode.
- Test with "Hide My Email" so the account works with the relay address.
Guide: 4.8 login services
High Guideline 5.1.1(v)
6. No way to delete an account in the app
Evidence. Settings has Log out and a "Contact us to close your account" line. There is no delete option in the app. The backend has no function that deletes a user's habits, check-ins and photos.
Fix.
- Add Settings > Account > Delete account, with one confirmation step.
- Add a server-side function that deletes the user, their rows and their stored photos. Do not call admin keys from the app itself.
- Tell users with an active subscription that deleting the account does not cancel billing, and link to Apple's subscription settings.
- If Sign in with Apple is added (finding 5), revoke the Apple token on deletion.
Guide: 5.1.1(v) account deletion
Medium Guideline 2.3.3, 2.3.10
7. Screenshots from the website; Android mentioned
Evidence. All five iPhone screenshots are desktop captures of the web app placed in phone frames; the first shows the sign-in screen. The build supports iPad, and the iPad screenshots are the iPhone set stretched. The draft description ends with "Also on Android and the web." The name field reads "Dayward - Habit Tracker, Goals & Planner Free".
Fix.
- Capture new screenshots from the build (after findings 1 to 4), starting with the Today screen and a streak.
- Either make the iPad layout work and capture it at the 13-inch size, or turn off iPad support in this build.
- Remove the Android and web line from the description.
- Rename to "Dayward" with the subtitle "Daily habits and streaks", and drop "Free" from the name.
Guide: 2.3.3 / 2.3.7 screenshots, name and keywords
Medium Guideline 1.5, 5.1.1(i)
8. Support URL needs a login; template privacy policy
Evidence. The draft Support URL is the app's in-app Contact page, which redirects to sign-in when opened in a private browser window. The privacy policy page still says "Your Company Inc." and lists location data, which the app does not collect, while leaving out photos, which it does.
Fix.
- Publish a public support page with a support email address and a short FAQ (reset, cancel subscription, delete account).
- Rewrite the privacy policy to match what the app collects: email, habits and check-ins, progress photos, purchase status. Include how to delete an account.
- Open both links on a phone on mobile data before saving them in App Store Connect.
Guide: 1.5 developer information
Before you submit
Items in App Store Connect that are not rejection findings, but that commonly delay a first review. Tick them once the fixes above are in a new build.
- App Review Information: a demo account with a few habits and a streak already filled in, plus notes saying where Pro, reminders and progress photos are.
- Because sign-in uses a magic link, give the reviewer a password login or a code that works without email access.
- The yearly subscription is attached to version 1.0, with display name, description and review screenshot.
- The Paid Apps agreement is active, with tax and banking complete (the account owner does this).
- App Privacy answers match the privacy manifest and the rewritten policy.
- Age rating questionnaire answered for the current version.
- Export compliance: the app uses only standard HTTPS, so
ITSAppUsesNonExemptEncryption can likely be set to NO. Confirm for your own setup.
- Version and build number increased for the new upload.
- Fresh install tested on a physical iPhone: sign up, create a habit, check in, add a photo, buy and restore Pro in sandbox, delete the account.
What this audit does not cover
- Approval. Apple decides. This report reduces known risks; it cannot promise an outcome or a review time.
- Making the changes. The $49 audit is a written report. If you want us to do the work, the iOS launch includes it.
- Security review of your code, database rules or API keys, beyond noting anything obvious we see while testing.
- Legal review. We point out where the privacy policy and terms do not match the app. We do not write or approve legal documents.
- Google Play and Android.
- Performance, load and full accessibility testing across devices.
- App Store search ranking or keyword strategy beyond what 2.3.7 requires.
- Guidelines outside the common rejection reasons for this kind of app, unless we notice them during testing.
Get this report for your app
Send your app link and we reply in writing with what we need and when you will have the report. The audit is $49, paid after that written confirmation.