Publishing to the App Store
Publishing through Appsanic is rolling out. The one-click flow below is how it works: you connect your store account, click Publish, and Appsanic builds and uploads your app for you. While we finalise it, if it is not yet enabled on your account you can publish today by exporting your code and running EAS yourself. We will remove this note when the flow is live for everyone.
Getting onto the App Store is the step first-time founders dread most. The good news: with Appsanic you do not touch a Mac or a command line. You connect your Apple account once, click Publish, and Appsanic builds your app in the cloud and uploads it to TestFlight for you. From there the work is Apple's store paperwork - the listing, screenshots, privacy labels, age rating, and review - which still happens in Apple's console. Apple has a long and specific list of requirements, and missing one means waiting another day for a re-review, so this page is the complete checklist.
Plan for 2-4 hours of store paperwork the first time. Half an hour the second time. The build-and-upload itself is one click and about 10 to 20 minutes of waiting.
Publishing is a paid-plan capability, available on Pro and Business.
Before you start: what you need
- An Apple Developer Program membership. $99 USD/year. Enrol at developer.apple.com. Requires a credit card and, if enrolling as a business, a D-U-N-S number (free to get, takes a few days if you don't have one).
- An App Store Connect API key so Appsanic can upload on your behalf. It is a revocable key you generate in Apple's console, never your password. You add it once on the Connect step (covered below).
- An app icon - a square PNG or JPEG, at least 1024×1024. You upload it on the Publish dialog's Your app step, and if your project uses a brand kit with an app icon, that one is used automatically. Appsanic flattens any transparency (Apple requires no alpha) and generates every store size from it - don't pre-round the corners; Apple rounds them. Don't skip this: a publish with no icon anywhere ships Expo's placeholder icon, which Apple routinely rejects (Guideline 2.3.8) - the dialog warns you before you publish.
- Screenshots for the required device sizes (see below).
- A privacy policy URL (you have one. See our Privacy Policy example).
- A support URL (your Contact page works).
Publishing from Appsanic
There is a Publish button in the build top bar. It opens a Publish dialog that walks you through Connect, Your app, and Publish, then tracks the build on a live Status screen. Work through it once and every future release is one click.
Connect
Add your store account using a revocable key, never a password. For iOS that key is an App Store Connect API key - a small .p8 file plus a Key ID and an Issuer ID. You create it as an Admin or Account Holder under Users and Access, on the Integrations tab. You can delete the key from Apple's side at any time, so connecting is low-risk. The full key-creation steps are below.
For Android, Connect takes a Google Cloud service-account JSON instead, with access granted to it in the Play Console. See Publishing to Google Play for the Google steps.
Your app
Confirm the three values that define your app's identity:
- App name: what shows under the icon.
- iOS bundle ID: a reverse-DNS identifier like
com.yourname.yourappname. Permanent once published, so pick something deliberate. Use this exact ID when you create the app in App Store Connect. - Version: the public version number, e.g.
1.0.0.
This step is also where your app icon lives: upload a square PNG or JPEG of at least 1024×1024, or let it fall back to your brand kit's app icon. The preview shows exactly what will ship - if it shows the placeholder warning, fix that before publishing (Apple rejects placeholder icons).
Appsanic and EAS handle the signing certificates for you, so you never create those by hand.
Publish
Choose App Store or Google Play. Each publish targets one store - to be on both, run one publish per store (they share the Connect and Your app steps, so the second is just another click). The dialog shows the exact credit cost before you confirm. Pricing is set server-side, so the dialog is the source of truth - the figures here are only an indication: around 30 credits for iPhone and 15 for Android, so both stores come to about 45 in total across the two publishes. Confirm to start.
What happens after you confirm
Appsanic builds the release in the cloud with EAS and uploads it for you - iOS to your TestFlight, Android to your Play internal testing track. A status screen shows progress: queued, building, submitting, done. A build takes roughly 10 to 20 minutes. No Mac and no command line required.
Once it lands on TestFlight, install it on a real iPhone and confirm it does not crash on launch before you submit for review. Apple is unforgiving about launch crashes.
Export compliance is answered for you. Apple asks every uploaded build an encryption question, and unanswered builds sit in TestFlight as "Missing Compliance". The publish flow answers it at build time by setting ITSAppUsesNonExemptEncryption to false, which is the correct answer for apps that only use standard encryption - HTTPS/TLS and the operating system's built-in protections - and that covers every app Appsanic generates. If you later add your own custom or proprietary encryption, that answer no longer applies: remove the key from an exported copy of the project and answer Apple's compliance questions yourself in App Store Connect.
Under the hood (for engineers)
The Publish flow runs the same eas build and eas submit that you would run by hand, in Expo's cloud, using the App Store Connect API key from the Connect step. The build profile is the production profile. iOS uploads go to TestFlight; Android uploads go to the internal testing track. The credit cost covers the cloud build minutes and is metered server-side, which is why the dialog is authoritative rather than the indicative figures above.
Prefer to drive it yourself? You can instead export your code to GitHub, then run EAS from your own repo:
eas build --platform ios --profile productionfollowed byeas submit --platform ios. This does exactly what the Publish button does, on your machine. Keep this as a fallback; the in-app flow is the primary path.
Step 1: Create your App Store Connect API key
You never paste your Apple password anywhere - instead you create a revocable App Store Connect API key (a small file plus two IDs) that you can delete from Apple's side at any time. Appsanic uses it on the Connect step to upload your build.
You create the key in App Store Connect. You must be signed in as the Account Holder or an Admin - only those roles can create the team-level key. If you don't see the Integrations tab in step 1, your role is too low; ask whoever owns the Apple Developer account to do this or to raise your role.
- Go to appstoreconnect.apple.com, open Users and Access, then the Integrations tab. "App Store Connect API" is already selected. (Older guides call this a separate "Keys" tab - Apple moved it here, so don't go hunting inside an individual app's settings.)
- First time only: if your account has never created a key, the Account Holder clicks Request Access, agrees to the terms, and submits. Skip this if your team already has keys.
- Under Team Keys, click Generate API Key (or the + next to "Active" if you already have one). Give it any name, set the role to Admin, and generate it. (Admin is the role the publishing tools expect. "App Manager" is the bare minimum but can cause permission errors mid-submit, so choose Admin.)
- Click Download to save the
AuthKey_XXXX.p8file. Apple lets you download it only once - if you lose it you have to revoke the key and start over, so save it somewhere safe right away (and never commit it to a public Git repo). - Copy the two IDs from that same page: the Key ID (in your key's own row) and the Issuer ID (shown just above the keys table - it's the same for your whole account). These are two different values, and people often grab the file but forget the IDs.
- Keep the
.p8file and both IDs together. You paste all three into Appsanic's Connect step. (If you publish manually with EAS instead,eas submitasks for the same three values, or reads them from a credentials file.)
Make a Team Key, not an Individual key (don't create it from one person's profile under the "Users" list) - individual keys are limited to one per user and can't do everything publishing needs.
Step 2: Register your bundle ID
Your bundle ID has to exist on Apple's side before an app record can use it - App Store Connect's "New App" dialog only offers bundle IDs that are already registered to your developer account. Registering one takes a minute:
- Log into developer.apple.com and open Account > Certificates, Identifiers & Profiles > Identifiers.
- Click +, choose App IDs, then type App.
- Give it any description (your app's name works), select Explicit for the Bundle ID, and enter the exact reverse-DNS ID from the Your app step in Appsanic, like
com.yourname.yourappname. - Leave the capability checkboxes alone unless you know you need one, click Continue, then Register.
Use this exact ID everywhere: the Your app step, the identifier registration, and the App Store Connect app record. It's permanent once your app is published, so pick something deliberate.
Step 3: Create the app in App Store Connect
The store listing and review always happen in Apple's console, attached to an app record. The record needs to exist by the time your build is uploaded to TestFlight - so create it while your first build runs, or right after. If a publish fails with "Apple couldn't find an app with bundle identifier …", this is the missing step: create the record, then publish again.
Log into appstoreconnect.apple.com. Click My Apps > + > New App.
You'll fill in:
- Platform: iOS.
- App name: up to 30 characters.
- Primary language: your main language.
- Bundle ID: pick the ID you registered in Step 2 from the dropdown. It must match the Your app step in Appsanic exactly, and you cannot change it later.
- SKU: internal identifier. Anything unique to your account.
Step 4: Fill in the App Store listing
From App Store Connect > your app > App Information + iOS App versions:
- Name: what appears in the App Store. Max 30 characters.
- Subtitle: a 30-character tagline. This is indexed for search. Put your primary keyword here.
- Description: up to 4,000 characters. This is NOT indexed for search (only subtitle and keywords are). Write for humans: one-sentence pitch, 3-5 bullet features, one line about the audience.
- Keywords: 100 characters separated by commas, no spaces. This is what Apple's search actually indexes. Don't include your app name (already indexed automatically) or competitor names (rejection risk).
- Promotional text: 170 characters that can be updated without a new build. Use for launch news.
- Support URL: required. Your Contact page URL.
- Marketing URL: optional but helpful.
- Privacy policy URL: required. Your Privacy Policy URL.
- Copyright: "2026 Your Name or Company".
Step 5: Upload screenshots
Apple requires screenshots for specific device sizes:
| Device | Resolution |
|---|---|
| 6.7" iPhone (Pro Max) | 1290 × 2796 |
| 6.5" iPhone | 1284 × 2778 or 1242 × 2688 |
| 5.5" iPhone | 1242 × 2208 |
| iPad Pro 12.9" (if supported) | 2048 × 2732 |
| iPad Pro 11" (if supported) | 1668 × 2388 |
You need at least one screenshot per required size, up to ten. The first three show in search results and above the fold on your product page. Make them count.
Design tip: overlay short captions on your screenshots ("One tap to log a habit", "Designed for four friends"). Captioned screenshots consistently convert better than raw simulator captures.
Step 6: Age rating and content questions
Apple asks yes/no questions about violence, gambling, adult themes, user-generated content, medical/health advice, etc. Answer truthfully. Apple spot-checks; lies get apps pulled.
If your app has any user-to-user messaging or posting, Apple requires you to have a content-reporting mechanism and a blocking mechanism. Build these before you submit.
Step 7: Privacy
Two privacy requirements:
Privacy policy URL
Must be a real, hosted privacy policy. Yours is at /privacy once your site is live.
Privacy nutrition labels
Inside App Store Connect > App Privacy, you answer detailed questions about what data your app collects and why. Apple cross-checks against your binary. If you say "no location" and your binary links Core Location, Apple rejects.
Common items you'll disclose:
- Email address (for account creation). Yes.
- Device identifiers (for analytics or push). Yes, usually.
- Usage data (analytics tools like PostHog or Mixpanel). Yes if any are wired up.
- Purchase history (Stripe / Apple IAP). Yes if monetized.
- Location: only if your app actually uses it (maps, etc).
If you're unsure, err on the side of disclosing.
Step 8: App Tracking Transparency (ATT)
If your app uses any SDK that tracks users across other apps or websites (AdMob, Facebook SDK, most ad networks), you must show an ATT prompt before tracking. Apple added this in iOS 14.5 and rejects apps that skip it.
Appsanic wires up the NSUserTrackingUsageDescription string automatically when you connect AdMob - it goes in through the app.json config plugin, which is where Expo builds your Info.plist from. If you add an ad network manually, add the string too.
Step 9: Submit for review
In App Store Connect > your app version > Submit for Review. Apple reviews within 24-72 hours typically. Your submission goes into a queue; you'll see status updates in App Store Connect.
Common reasons for rejection (in order of frequency):
- Crashes on launch. Apple tests on at least one device. If it crashes, rejected. Always test TestFlight on a real iPhone first.
- Guideline 4.3 (design spam): your app looks like a minimal template or a reskinned tutorial. Build real content first.
- Guideline 5.1.1 (privacy): privacy label mismatches, missing URL, or over-requesting permissions.
- Guideline 2.1 (incomplete info): your listing references something the app doesn't do, or you forgot a demo account for Apple's reviewers.
- Guideline 4.8 (Sign in with Apple): if you offer any third-party login (Google, Facebook), Apple requires you to also offer Sign in with Apple. No exceptions.
When rejected, Apple cites a specific guideline and usually includes a screenshot or description. Fix the specific issue, reply in the Resolution Center, resubmit. Most first rejections clear on the second try.
After approval
You get an email: "Your app has been approved." At that point your app is:
- Live immediately (if you chose Automatic release), OR
- Live on a date you chose (if you scheduled it).
Your App Store product page is now live at apps.apple.com/app/id<appleId>. You can share the link. The App Store also starts showing it in search.
Updates
For version 2 and beyond:
- On the Your app step, bump the version.
- Click Publish again. Appsanic builds the new version and uploads it to TestFlight.
- In App Store Connect, update the listing if needed and submit the new build for review.
Updates usually clear review faster than first submissions. Often 12-48 hours.
Over-the-Air Updates
For JavaScript-only and asset-only fixes, EAS Update can push the change over the air to your users on their next launch, with no store re-review. Honest status: OTA through Appsanic isn't available yet - it's on the roadmap. Today the path is to export your code, set up expo-updates once in your repo, and run eas update from there. See Over-the-Air Updates for exactly what qualifies and the setup steps.
Common first-time gotchas
- D-U-N-S takes days. If you're enrolling as a business and don't have one, start that process a week before you want to submit.
- Screenshots at the wrong size. Use tools like Figma, Rotato, or Screenshot.rocks. Simulator screenshots won't match required dimensions exactly.
- Missing privacy policy. You need a live URL before submission. Our template works; customise it for your business.
- Demo account. If your app requires log-in, you must provide a working test account in the App Review Information for Apple to log in and review. Make a
review@yourapp.comaccount with sample data.
Next
iOS published. Do Android now: read Publishing to Google Play.
