Many developers think the Apple Developer Program is the entry fee for iOS development. So they enroll before they need to, or they never try iOS at all.
You can build an Expo app and run it on your own iPhone for free, and enroll once you are ready to share it. This post walks the road from $0 to $99 in three levels: what each level needs, what it unlocks, and where its limits are. At the end, you will know whether to enroll on day one or build first and enroll when you want to publish it to the App Store.
Video version
The short answer
| What you have | What you can do | Cost |
|---|---|---|
| Any computer and an iPhone | Develop in Expo Go with Fast Refresh and most of the Expo SDK | $0 |
| A Mac and an iPhone | Build a development build with any native library and install it on your own iPhone | $0 |
| No Mac, and you want the app on a real iPhone | Build and sign in the cloud with Expo Build | $99 a year |
| An app you want other people to use | TestFlight, internal distribution, and the App Store | $99 a year |
Level 1: Expo Go on any computer and an iPhone
All you need is an iPhone and a computer. Windows, Linux, and macOS all work. Install Expo Go from the App Store, then create and start a project:
Scan the QR code with your iPhone's camera and the app opens in Expo Go. Every time you save a file, Fast Refresh updates the app on your phone.
You do not need an Apple account of any kind at this level. Expo Go is an app that Expo builds, signs, and publishes to the App Store, so your iPhone treats it like any other app.
The tradeoff is that Expo Go ships with a fixed set of native code. Your JavaScript can change, but the native libraries are the ones already inside Expo Go. That set covers most of the Expo SDK, including expo-camera, expo-maps, and @expo/ui, plus popular community libraries such as react-native-reanimated. Some features need their own native code and are not available in Expo Go:
- Home screen widgets and Live Activities with
expo-widgets. - Siri and Shortcuts with
expo-app-intents. - Any library with native code that is not in Expo Go, and any native code you write yourself.
For those, you need a development build.
Level 2: a development build on your Mac
A development build is your own version of Expo Go. It has the expo-dev-client tools you know from Expo Go. The difference is that the native code inside it is yours: any native library, any native configuration, and your own native modules. You still get Fast Refresh. We recommend a development build for any app you plan to release to the app stores.
If you have a Mac, you can build one and install it on your iPhone for free. Plug in your iPhone and run:
Xcode compiles the app on your Mac, signs it, and installs it on the phone. Signing needs an Apple Account, but not a paid one. Sign in to Xcode with a free Apple Account and it gives you a signing team called a Personal Team.
The first time you run it, the CLI can stop before the build starts:
This means your Mac has no code signing certificate yet. The Learn more link opens a short setup guide that walks you through signing in to Xcode with your Apple Account. Follow it once, then run the command again.
The limits of free signing
Apple sets these limits on a free Personal Team:
- The app expires after 7 days. Apple's free provisioning profiles expire 7 days after they are created. After that, the app stops opening and you run the build again.
- 3 apps per device. You can install up to 3 apps this way on each iPhone.
- Your own devices only. You can register up to 3 devices, and you cannot send the build to anyone else.
- No paid capabilities. Remote push notifications, in-app purchases, Sign in with Apple, NFC, iCloud, Apple Pay, and associated domains need a paid membership, even during development. You can add the library and write the code, but Xcode cannot sign a build that requests the capability with a free account.
Several capabilities do work on a free account, according to Apple's capabilities table, including App Groups, Background Modes, HealthKit, HomeKit, Keychain Sharing, and Maps. expo-widgets uses App Groups to share data between your app and its widget.
Local notifications, the ones your app schedules on the device, do not need the push capability. Only remote notifications sent from your server do.
No Mac? Cloud builds need the paid program
You can still build an iOS app from Windows or Linux. Expo Build compiles it on a Mac in the cloud:
To install that build on an iPhone, Expo Build has to sign it, and cloud signing needs the paid program.
What a certificate and a provisioning profile do
Every iOS app that runs on a device is signed with two things:
- A certificate says who built the app.
- A provisioning profile says where the app may run: which app it belongs to, which iPhones can install it, which capabilities it can use, and when it expires.
Your iPhone checks both before it opens the app. When the profile expires, the app stops opening until you install a new build.
The kind of signing decides who can install your app. A free Apple Account only gets development signing. Ad hoc and App Store signing use a distribution certificate, and only paid Apple Developer Program members get one.
On your Mac, Xcode creates development signing for your free Personal Team. In the cloud, Expo Build signs device builds with a distribution certificate and an ad hoc provisioning profile. So without a Mac, a development build on a real iPhone needs the paid program.
From any computer, you can build for the iOS Simulator for free. Simulator builds are not signed for a device, so Expo Build can make one without an Apple Developer account. You still need somewhere to run it, which today usually means a Mac with Xcode.
What the $99 a year unlocks
The Apple Developer Program costs $99 a year. It comes down to five things.
1. Share your app with other people
Free signing stops at your own devices. With the membership, you have two ways to put a build in someone else's hands:
- TestFlight. TestFlight is Apple's beta testing app. You can invite up to 10,000 external testers, or share a public link.
- Internal distribution with Expo Build. Testers install the build from a link. It uses ad hoc provisioning, so each iPhone has to be registered first (
eas device:create), and a new device needs a new build. Apple allows up to 100 iPhones per year with this method.
2. Cloud signing
Expo Build can create and manage your iOS credentials and sign builds for devices. That needs the membership, as the No Mac section explains.
3. Remote push notifications
Notifications sent from your back end go through Apple Push Notification service, which needs a paid account. Local notifications work without one.
4. In-app purchases and other Apple capabilities
These are the paid capabilities from the free signing limits above, such as in-app purchases, Sign in with Apple, and NFC. A free account cannot sign a build that requests them. You need the membership to test them on a device, not only to ship them.
5. The App Store
Publishing to the App Store requires the membership. Once your app makes money, look at Apple's App Store Small Business Program. You qualify if you earned up to $1 million in proceeds in the previous calendar year, or if you are new to the App Store. Apple's commission on paid apps and in-app purchases then drops from 30% to 15%. You have to enroll to get it.
A paid account also changes how long your own builds last. Development profiles from a paid team are valid for up to a year instead of 7 days, so you stop rebuilding every week.
When should you pay?
Pay on day one if your app needs any of these:
- Remote push notifications, because you want to test them while you build.
- In-app purchases, for the same reason.
- A real iPhone, but you do not have a Mac. Cloud signing is your only way onto the device.
Everyone else can build the whole app first for free, and enroll when it is time to put it in someone else's hands.
What about Android?
Android is free all the way until you publish. You can build, install, and share builds without paying anyone. A Google Play Console account is a one-time $25 fee when you are ready for the Play Store.
Where to start
- Start on level 1 today. Run
npx create-expo-app@latestand open the project in Expo Go. - Move to a development build when you need native code. Read Introduction to development builds, then follow Local app development to run it on your iPhone.
- Enroll when you are ready to share. Join the Apple Developer Program, then set up internal distribution or TestFlight.
Frequently asked questions
Do I need an Apple Developer account to use Expo? No. You can develop in Expo Go with no Apple account at all. You need the paid Apple Developer Program to share or publish your app, sign builds in the cloud, or use capabilities such as remote push.
Can I run an Expo app on my iPhone for free? Yes. Expo Go runs your project on any iPhone for free. With a Mac and a free Apple Account, you can also install a development build with npx expo run:ios --device.
How long does a free iOS build last? 7 days. Apple's free provisioning profiles expire 7 days after they are created, and you can install up to 3 apps this way on each device. Development profiles from a paid team last up to a year.
Can I build an iOS app with Expo without a Mac? Yes. Expo Build compiles iOS apps in the cloud from Windows or Linux. To install that build on an iPhone, you need the paid Apple Developer Program, because cloud signing uses a distribution certificate.
Can I test push notifications without a paid account? Local notifications, yes. Remote notifications sent from your server need the paid Apple Developer Program.
How much does it cost to publish an Expo app? On iOS, $99 a year for the Apple Developer Program. On Android, a one-time $25 for a Google Play Console account.
Useful links
- Expo Go: https://expo.dev/go
- Introduction to development builds: https://docs.expo.dev/develop/development-builds/introduction/
- Local app development: https://docs.expo.dev/guides/local-app-development/
- Set up Xcode signing: https://expo.fyi/setup-xcode-signing
- Expo Build: https://docs.expo.dev/build/introduction/
- Internal distribution: https://docs.expo.dev/build/internal-distribution/
- Build for iOS Simulators: https://docs.expo.dev/build-reference/simulators/
- Apple: compare free and paid memberships: https://developer.apple.com/support/compare-memberships/
- Apple: supported capabilities: https://developer.apple.com/help/account/reference/supported-capabilities-ios/
- Apple Developer Program: https://developer.apple.com/programs/
- TestFlight: https://developer.apple.com/testflight/
- App Store Small Business Program: https://developer.apple.com/app-store/small-business-program/
