Chapter 18: App Store Submission
From TestFlight to the App Store. The final step in your journey.
Your app has been beta tested on TestFlight. Bugs are fixed, feedback is incorporated, and you're confident it's ready. This chapter walks through the App Store submission process — the last step between you and a published iOS app.
What You'll Learn
- What changes when going from TestFlight to App Store
- How to prepare your submission
- The App Review process and timeline
- Common rejection reasons and how to avoid them
- What happens after approval
Step 1: Pre-Submission Checklist
Before submitting, walk through this final checklist:
Technical
| Check | Status |
|---|---|
| App doesn't crash on any tested device | |
| All features work without a dev server | |
| No placeholder text ("Lorem ipsum", "Coming soon", etc.) | |
| No debug logs or test data visible | |
| App icon appears correctly | |
| Launch screen displays properly | |
| No references to "beta" or "test" in the UI |
App Store Connect
| Check | Status |
|---|---|
| App name and subtitle finalized | |
| Description written and proofread | |
| Keywords filled in (100 char max) | |
| Screenshots uploaded for required device sizes | |
| Privacy policy URL active and accessible | |
| App Privacy questionnaire completed | |
| Age rating set | |
| Support URL provided | |
| "What's New" text written for version 1.0.0 |
$ claude "Review my GratitudeTree app code for anything that shouldn't be in a production ..."Step 2: Select Your Build
In App Store Connect:
- Go to your app → App Store tab
- Scroll down to Build
- Click Select a build
- Choose your most recent TestFlight build that's been tested and verified
- Click Done
The build you select should be the one your testers have validated — don't upload a brand new build at the last minute without testing it.
Step 3: Final Metadata Review
Screenshots
Make sure you have screenshots for at least:
- 6.7" display (iPhone 15 Pro Max) — Required
- 6.5" display (iPhone 14 Plus) — Recommended
Screenshots should show real app content (your actual entries), not empty states.
Description
Your first 3 lines are the most important — they're visible before "More":
GratitudeTree helps you build a daily gratitude practice. Write what
you're thankful for, snap photos of meaningful moments, and shake
your phone to rediscover past memories with a satisfying haptic thud.
App Preview Video (Optional)
A 15-30 second video showing the app in action significantly increases downloads. You can screen-record on your iPhone (Settings → Control Center → Screen Recording) and upload it.
Step 4: Submit for Review
- In App Store Connect → your app → App Store tab
- Review all sections one final time
- Click Submit for Review
- Answer the final questions:
- Sign in required? Yes — provide a test account (email + password)
- Contact info — your email and phone for the review team
- Notes — any context the reviewer needs
Providing a test account
Apple's review team needs to test your app. Since GratitudeTree requires login:
- Create a test account in your app (e.g.,
review@example.com/Password123!) - Add a few entries so the reviewer sees content (not an empty feed)
- Enter these credentials in the review submission form
If your app requires login and you don't provide test credentials, Apple will reject it immediately. This is one of the most common rejection reasons.
Step 5: The Review Process
Timeline
| Stage | Typical Duration |
|---|---|
| Waiting for Review | 24-48 hours |
| In Review | 1-24 hours |
| Total | 1-3 days (usually) |
Apple reviews apps 7 days a week, including holidays. Most apps are reviewed within 24-48 hours. You can check the status in App Store Connect.
What reviewers check
- App works as described
- No crashes
- No placeholder content
- Privacy policy is accessible
- Content is appropriate
- No misleading functionality
- Follows the App Store Review Guidelines
Possible outcomes
- Approved — Your app is published! (or ready for manual release)
- Rejected — Apple found issues. You'll get specific feedback on what to fix.
- Metadata Rejected — Only the listing needs changes (screenshots, description, etc.) — no new build needed.
Step 6: Common Rejection Reasons (and How to Avoid Them)
1. Incomplete or placeholder content
Rejection: "Your app still includes placeholder content."
Prevention: Search your entire codebase for "Coming soon", "Lorem", "TODO", "placeholder", "test". Remove everything.
2. Broken or missing functionality
Rejection: "We found that certain features did not work as expected."
Prevention: Test every feature on a real device. Create entries, upload photos, try the shake gesture, check the heatmap, test login/logout.
3. Privacy issues
Rejection: "Your app's privacy policy URL is not accessible."
Prevention: Verify your privacy policy URL loads in a browser. Make sure it accurately describes what data you collect.
4. Missing login credentials
Rejection: "We were unable to review your app as it requires login."
Prevention: Always provide a test account with pre-existing content.
5. Performance issues
Rejection: "Your app takes too long to launch."
Prevention: Make sure your web assets are bundled (not loading from a dev server). Test the launch time in the Simulator.
6. Design guideline violations
Rejection: "Your app's UI doesn't comply with iOS Human Interface Guidelines."
Prevention: Ensure all touch targets are 44×44pt minimum, text is readable, and the app respects safe areas.
$ claude "I'm about to submit my GratitudeTree app to the App Store. What are the most com..."Step 7: If You're Rejected
Don't panic — rejections are normal, especially for first-time submissions. Here's what to do:
- Read the rejection message carefully — Apple tells you exactly what's wrong
- Fix the issue — make the code or metadata change
- If it's a code fix:
npm run build && npx cap sync- Bump the build number
- Archive and upload a new build
- Select the new build in App Store Connect
- If it's a metadata fix:
- Update the text/screenshots directly in App Store Connect
- No new build needed
- Reply in the Resolution Center — explain what you fixed
- Resubmit for review
Second reviews are usually faster (often same-day) because the reviewer already has context.
Step 8: After Approval
Automatic vs Manual Release
When submitting, you chose one of:
- Automatically release after approval — goes live as soon as approved
- Manually release — you control when it goes live (click "Release This Version")
For your first app, automatic release is fine.
Your app is live!
Once released:
- It appears in App Store search (may take a few hours to index)
- Anyone can download it
- You can share a direct link:
https://apps.apple.com/app/idXXXXXXXXX - TestFlight builds continue to work alongside the App Store version
Monitor after launch
- Check App Store Connect → App Analytics for downloads and usage
- Monitor Crashes in App Store Connect
- Read Ratings & Reviews (respond to feedback thoughtfully)
Checkpoint
Your app should now:
- Pre-submission checklist is complete (no debug content, all features working)
- A tested build is selected in App Store Connect
- All metadata is filled in (description, screenshots, privacy policy, etc.)
- A test account with sample content is provided for the reviewer
- The app is submitted for review
- You understand how to handle a rejection if it happens
Congratulations!
You started this tutorial with a blank folder and zero iOS experience. Now you have:
- A React + TypeScript web app with Firebase backend
- User authentication with email/password
- Text and photo journal entries with real-time sync
- A calendar heatmap and streak tracking
- Native iOS features: camera, haptics, shake detection
- Safe area handling, app icons, and a launch screen
- A TestFlight beta that real people tested
- An app on the App Store that anyone can download
You built all of this with Claude Code as your pair programmer — from architecture decisions to debugging, from writing components to configuring iOS-specific details.
What you actually learned
Beyond the specific tech stack, you learned:
- How to think about mobile-first design
- How to work with AI-assisted development effectively
- How to give good prompts that produce good code
- How to verify and understand generated code rather than blindly trusting it
- The full lifecycle of shipping software: idea → code → test → deploy
Where to go from here
Ideas for continuing your development:
$ claude "I just published my first iOS app (GratitudeTree — a gratitude journal). I want ..."Some popular next steps:
- Push notification reminders — remind users to journal daily
- Dark mode — respect the system appearance setting
- Data export — let users download their entries as a PDF or JSON
- Widgets — show the current streak on the home screen
- Apple Watch — quick entry creation from the wrist
Each of these is a project you can build with Claude Code using the same workflow you learned here.
Thank You
Building software is one of the most powerful skills you can have. You've proven you can take an idea from zero to a published app. The gap between "I want to build an app" and "I have an app on the App Store" is smaller than most people think — and you've crossed it.
Now go build something else.
Follow @parvsondhi for build threads, tips, and updates on this tutorial.