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

# Deploy to App Store and Play Store

> Connect your developer accounts, run a production build in the cloud, and ship your app to TestFlight, Google Play internal testing, and public release.

When the app feels right on your phone, you ship it. The agent runs cloud builds for both platforms in parallel, uploads to TestFlight and Google Play, and walks you through the public submission. You never open Xcode or Android Studio.

## The shipping flow

```mermaid theme={null}
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#e6fafb', 'primaryTextColor': '#1a1a2e', 'primaryBorderColor': '#01b7cb', 'lineColor': '#01b7cb', 'fontFamily': 'Inter, sans-serif', 'fontSize': '14px' }}}%%
flowchart LR
    A("Connect store accounts"):::step --> B("Pick preview or production"):::step
    B --> C("Cloud builds iOS + Android"):::step
    C --> D("Auto-upload"):::step
    D --> E("Share TestFlight / Play link"):::step
    E --> F("Submit for review"):::step
    F --> G("Live on the stores"):::step
    classDef step fill:#e6fafb,stroke:#01b7cb,stroke-width:2px,rx:12,ry:12,color:#1a1a2e
```

## Before your first ship

<CardGroup cols={2}>
  <Card title="Apple Developer Program" icon="apple">
    Required for TestFlight and the App Store. Costs \$99 per year. Sign up at [developer.apple.com](https://developer.apple.com/programs/). Organizations need a D-U-N-S number; individuals do not.
  </Card>

  <Card title="Google Play Console" icon="play">
    Required for Play internal testing and the public Play Store. Costs \$25 one-time. Sign up at [play.google.com/console](https://play.google.com/console). Individuals can register and ship the same day.
  </Card>
</CardGroup>

<Note>
  You can preview your app on your phone without either account  the QR-code flow is always free. You only need a developer account when you want to share a signed build with testers or submit publicly.
</Note>

## Connect your store accounts

<Steps>
  <Step title="Open the Ship panel">
    In any mobile-app chat, click **Ship** in the top right. The first time, a panel slides open asking for your store credentials.
  </Step>

  <Step title="Apple side">
    Provide your Apple ID and Apple Team ID. The agent uses these to request the signing certificates and provisioning profiles for you  no Keychain juggling.

    <Tip>
      Two-factor authentication is required by Apple. The agent will prompt you to confirm a sign-in code on a trusted device once. After that, an app-specific password is generated and stored encrypted for future ships.
    </Tip>
  </Step>

  <Step title="Google side">
    Upload a Google Play service account JSON. This is a one-time setup that lets the agent upload builds to Play on your behalf.

    To create one: open Play Console → **Setup → API access**, link a Google Cloud project, create a service account with **Service Account User** access, grant it **Release manager** permissions in Play, then download the JSON. The agent has a step-by-step walkthrough if you ask.
  </Step>

  <Step title="Confirm app identifiers">
    Each app has a unique identifier on each store  for example `com.yourcompany.cairn`. The agent picks a sensible default from your app name. Override it now if you prefer a different namespace; this is hard to change after you publish.
  </Step>
</Steps>

Credentials are stored encrypted and never appear in chat. Subsequent ships skip every step in this section.

## Pick a build type

<Tabs>
  <Tab title="Preview build">
    Use this for everything before public release.

    * Signed binaries for iOS and Android
    * Uploads to **TestFlight** (iOS) and **Play internal testing** (Android)
    * Up to 100 testers on TestFlight (10,000 if you go through Beta App Review), up to 100 on Play internal
    * Runs at full native speed  no dev server, no hot reload
    * About 1015 minutes per platform

    The output is a TestFlight invite link and a Play internal-sharing link. Forward both to anyone you want to give early access.
  </Tab>

  <Tab title="Production build">
    Use this when you are ready to submit publicly.

    * Same signed binaries as preview, with production environment values
    * Uploads to **App Store Connect** and the **Play production track**
    * About 1015 minutes per platform
    * Followed by store review (1248 hours on Apple, a few hours to several days on Google)

    A production build does not go live the moment it finishes. It goes into review. You release it manually once approved, or set it to auto-release on approval.
  </Tab>
</Tabs>

## Run the build

<Steps>
  <Step title="Bump the version">
    The agent picks the next version number for you based on your last ship. Override in the Ship panel if you need a specific number (for example, jumping from 0.9.0 to 1.0.0 for launch).

    <Note>
      Version numbers are visible to users. Build numbers are internal and increment automatically on every ship. You cannot upload two builds with the same version + build number combination to either store.
    </Note>
  </Step>

  <Step title="Hit Build">
    The agent kicks off both platforms in parallel. The chat shows a live link to each build's progress: dependency install → compile → sign → package → upload. You can keep working in other chats while it runs.
  </Step>

  <Step title="Wait for the green check">
    Typical times:

    | Stage              | iOS             | Android         |
    | ------------------ | --------------- | --------------- |
    | Cloud build        | 1015 minutes    | 812 minutes     |
    | Store processing   | 1020 minutes    | Under 5 minutes |
    | Tester invite link | Live after both | Live after both |

    If a build fails, the agent reads the log and posts a plain-English explanation in the chat with the next action.
  </Step>
</Steps>

## Share with testers

The moment Apple finishes processing your iOS build, the agent drops a **TestFlight invite link** into the chat. Anyone who opens the link on an iPhone installs your app through TestFlight. The same moment Google accepts your Android build, the agent posts an **internal-testing link**  the user opts in once, then installs from the Play Store like any other app.

<CardGroup cols={2}>
  <Card title="TestFlight" icon="apple">
    Up to 10,000 external testers (after a one-time Beta App Review per major version) or 100 internal testers without review. Builds expire after 90 days; ship a new preview to refresh.
  </Card>

  <Card title="Play internal testing" icon="play">
    Up to 100 internal testers. No review. Builds do not expire. Testers can opt in through an emailed link or a shareable URL.
  </Card>
</CardGroup>

## Generate the store listing

Ask: *generate the store listing* and the agent writes:

* **App name** (up to 30 characters on Apple, 30 on Play)
* **Subtitle** (Apple) / **Short description** (Play)
* **Promotional text** (Apple)
* **Description** (full)
* **Keywords** (Apple) / Tags (Play)
* **What's new in this version**
* **Support URL, marketing URL, privacy policy URL**

Edit anything that does not feel right. The agent also generates **store screenshots** from your real app if you ask  in the right sizes for every device class (iPhone 6.9", 6.7", 6.5", 5.5", iPad 13", 12.9"; Android phone, 7" and 10" tablets) with captions and device frames.

<Tip>
  The privacy questionnaire is the most common source of rejection. The agent fills it in from a scan of your app: which data you collect, whether it is linked to the user, whether it is used for tracking. Review the answers before you submit  you are the legal owner of the answers, not the agent.
</Tip>

## Submit for public review

<Steps>
  <Step title="Click Submit for Review">
    The agent picks up your latest preview build, attaches the store listing, and submits to App Store Connect and Play.

    On iOS the build moves to **In Review** state, then **Pending Developer Release** (if you chose manual release) or goes live automatically.

    On Android the build moves to **Under review**. Google's review is typically faster than Apple's  hours rather than days  but staged rollouts are recommended for production traffic.
  </Step>

  <Step title="Respond to reviewer questions">
    If Apple's reviewer needs a demo account, a test credit card number, or clarification on a feature, the agent prepares the response in the chat. You approve and the agent sends it through App Store Connect.
  </Step>

  <Step title="Release when approved">
    On Apple, click **Release** in the chat (or on App Store Connect) to push the build live. On Google, the rollout starts automatically at the percentage you set (default: 100%; staged rollouts can be 5%, 20%, 50%).
  </Step>
</Steps>

## Review timelines

| Store      | Typical review time   | What can extend it                                                     |
| ---------- | --------------------- | ---------------------------------------------------------------------- |
| App Store  | 1248 hours            | Subjective UX, in-app purchase configuration, missing demo account     |
| Play Store | A few hours to 3 days | First-time submission, sensitive permissions, family-policy violations |

Expedited review on Apple is available for serious bugs already in production  ask the agent to file the request.

<Warning>
  Apple rejects roughly 1015% of first submissions. The most common reasons: missing account-deletion flow, unclear in-app purchase value, vague tracking-prompt copy, broken sign-in. The agent flags all four in a pre-submission check, but you should expect at least one round of feedback on a first release.
</Warning>

## Updating after launch

Once your app is live on the public stores, updates work the same way as a first ship.

* **App-store update** (new device feature, new permission, new icon, version bump): run a fresh production build and submit. Same review cycle.
* **Instant update** (copy, colors, layout, screen logic): the agent ships an [over-the-air update](/mobile-ota-updates). No review, no waiting; users get the change the next time they open the app.

The agent tells you which path applies before it ships.

## What you cannot do here

* **Skip the Apple Developer fee.** TestFlight requires it. There is no free path to public iOS distribution.
* **Mass-distribute outside the stores on iOS.** Apple does not allow it. Android sideloading is possible but not via Runable.
* **Bypass review.** No tool gets you past Apple's reviewers. The agent helps you minimize rejections, but the relationship is between you and Apple.
* **Use the same identifier as another app you have already published.** Once an identifier is reserved on a store, it cannot be reused.

## Next steps

<CardGroup cols={2}>
  <Card title="Over-the-air Updates" icon="refresh-cw" href="/mobile-ota-updates">
    Push small fixes to live users without a store review.
  </Card>

  <Card title="Environment Variables" icon="key" href="/mobile-app-environment-variables">
    Switch API keys and config between preview and production.
  </Card>

  <Card title="Payments & Subscriptions" icon="credit-card" href="/mobile-app-payments">
    Configure paywalls, free trials, and restore purchases before launch.
  </Card>

  <Card title="Analytics" icon="bar-chart-3" href="/mobile-app-analytics">
    Track events, sessions, and crashes from your first release.
  </Card>
</CardGroup>
