> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tryappnetic.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Publish to TestFlight

> Send your app to TestFlight from Appnetic and install it on your iPhone, with your own Apple Developer account.

Appnetic can build a signed iOS version of your app, upload it to App Store Connect and add it to TestFlight, so you can install it on your iPhone. You don't need a Mac or Xcode.

> [!NOTE]
>
> Publishing is in **early access**: it's switched on only for invited workspaces while we test it with real Apple accounts. If you don't see **Publish** in your project's top bar, it isn't on for your workspace yet.

## What you need

* **An Apple Developer Program membership** for the team that will own the app (\$99 a year, from [developer.apple.com](https://developer.apple.com/programs/)). The latest Program License Agreement must be accepted in your Apple account.
* **The team's Account Holder or an Admin** to connect it the first time. Other roles can't create the API key Appnetic needs.
* **A Pro or Team workspace.** Publishing counts as one native build. See [Credits & plans](https://docs.tryappnetic.com/credits-and-plans.md).
* **A version of your app that builds.** Publish uses the current version, and it has to be a working one.
* **The TestFlight app** on your iPhone, from the App Store.

## Publish for the first time

Click **Publish** in the project's top bar. The dialog has four steps, and each one is ticked when it's done.

**1. App details**

Check the **App name** (up to 30 characters, as shown under the icon) and the **Bundle ID**, such as `com.yourname.habits`, then click **Save details**.

> [!WARNING]
>
> Apple never lets a bundle ID change after the first upload, so choose it carefully. Appnetic locks it at that point.

**2. Apple Developer account**

Enter your Apple email and password and click **Connect Apple account**. Apple then asks for a code: approve the sign-in on one of your devices if it asks, and type the 6-digit code into Appnetic.

You have about 50 seconds to enter the code, because Apple only waits about a minute. If time runs out, click **Send a new code**; you won't have to type your password again.

If your Apple account belongs to several teams, choose the team that should own the app.

**3. App in App Store Connect**

If the app doesn't exist in App Store Connect yet, Appnetic creates it for you as part of the same sign-in, with your app name and bundle ID. You can also choose **I'll create it myself** and follow the values shown, then click **Check again**.

**4. Version**

Enter the **Version number**, such as `1.0` or `1.2.3`, then click **Publish to TestFlight**.

You can close the dialog while it works. It goes through these steps:

| Step | Usually takes |
| - | - |
| **Building**: a signed App Store build on EAS | 10–30 minutes |
| **Uploading** to App Store Connect | A few minutes |
| **Apple is processing it** | 5–30 minutes |
| **Ready to test** | |

When it's ready, a card in the chat says so and links to TestFlight in App Store Connect. The build is added to an internal TestFlight group called **Appnetic testers**, which you can open on your iPhone in the TestFlight app. If it fails, the card says why.

Nothing is public: your app only reaches the App Store when you submit it for review yourself in App Store Connect.

## Publish an update

Once the first publish is done, open **Publish** again: everything is already set, so it's one click. Each publish gets a new build number automatically. Raise the **Version number** once a version is in App Review, because Apple allows only one build of a version in review.

A different app in the same workspace needs one more Apple sign-in, to create its own App Store Connect record. The Apple connection itself is shared by every project in the workspace.

## What happens to your Apple password

* **Your password goes to Apple through a temporary, isolated session.** It's used once, for that sign-in, and never stored. Neither is the code Apple sends.
* **What Appnetic keeps** is an App Store Connect API key called **Appnetic**, with the App Manager role, which it creates during the sign-in. It's encrypted when stored and used only to sign, upload and add your builds to TestFlight. Signing certificates and profiles for your team are kept encrypted too.
* **You can revoke the key at any time** in App Store Connect, under **Users and Access → Integrations**. Publishing stops working until you connect again.
* **To disconnect**, a workspace admin opens **Settings** in the sidebar and clicks **Disconnect…** on the Apple App Store card. Then revoke the Appnetic key in App Store Connect too, because Appnetic can't remove it from Apple for you.

## Use an API key instead

If you'd rather not enter your password, or your account signs in with a security key, connect with a key you create yourself:

**1. Create the key**

In [App Store Connect](https://appstoreconnect.apple.com/access/integrations/api), go to **Users and Access → Integrations → App Store Connect API** and generate a **Team key** with the **App Manager** role.

**2. Download it**

Download the `.p8` file. Apple only lets you download it once. Note the **Issuer ID** shown above the keys.

**3. Add it to Appnetic**

Open **Settings** in the sidebar, click **Use an API key instead** on the Apple App Store card, then choose the `.p8` file and paste the Issuer ID. The Key ID fills in from the file name.

With a key, you create each app's App Store Connect record yourself: the Publish dialog shows the values to use.

## If something goes wrong

> [accordion] Apple didn't accept that email and password
>
> Check them and try again. After a few failed attempts, Appnetic pauses sign-ins for an hour, because repeated failures can make Apple lock the account.

> [accordion] The code wasn't entered in time, or wasn't accepted
>
> Click **Send a new code** and enter the new one quickly. If Apple refuses a code from your devices, it may text one to your phone instead; Appnetic tells you when that happens.

> [accordion] Apple says the account is locked
>
> Unlock it at [iforgot.apple.com](https://iforgot.apple.com), then try again. Apple can lock an account it thinks is under attack, including after sign-ins from servers.

> [accordion] This Apple account can't create API keys
>
> Sign in as the team's Account Holder or an Admin, or [use an API key instead](#use-an-api-key-instead).

> [accordion] Apple is waiting for you to finish something on your account
>
> Sign in at [appstoreconnect.apple.com](https://appstoreconnect.apple.com), accept any new agreement or finish what it asks, then try again.

> [accordion] The app name is taken
>
> App Store names are unique across Apple. Change the **App name** in the dialog and try again.

> [accordion] The bundle ID belongs to another team
>
> Choose a different bundle ID. Bundle IDs are unique across Apple, so one another team registered can't be used.

> [accordion] Publishing failed
>
> The chat card shows the reason. Fix what it says, then open **Publish** and try again.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.