Skip to content

Migrate from Fastlane

GPC replaces fastlane supply (and parts of fastlane deliver) for Google Play operations. This guide maps Fastlane commands, environment variables, and CI configurations to their GPC equivalents.

Why Migrate?

GPCFastlane supply
API coverage187 endpoints~20 endpoints
RuntimeNode.js or standalone binaryRuby + Bundler + 150+ gems
Reviews and VitalsYesNo
Subscriptions and IAPYesNo
JSON outputStructured, TTY-awarePartial
Cold start<500ms2-3s
Rollout controlhalt/resume/completeUpload with rollout only
CI quality gatesExit code 6 on threshold breachNot available
Dry-run--dry-run on all write commandsNot available

Command Mapping

Uploads and Releases

FastlaneGPCNotes
fastlane supply --aab app.aabgpc releases upload app.aabDefaults to internal track
fastlane supply --aab app.aab --track betagpc releases upload app.aab --track betaSame track names
fastlane supply --aab app.aab --track production --rollout 0.1gpc releases upload app.aab --track production --rollout 10GPC uses percentage (10), not decimal (0.1)
fastlane supply --apk app.apkgpc releases upload app.apkAPK also supported
fastlane supply --aab app.aab --mapping mapping.txtgpc releases upload app.aab --mapping mapping.txtSame behavior

Metadata and Listings

FastlaneGPCNotes
fastlane supply --skip_upload_aabgpc listings push --dir metadata/Push metadata only
fastlane supply --skip_upload_aab --skip_upload_metadata --skip_upload_imagesgpc releases upload app.aabUpload binary only
fastlane supply initgpc listings pull --dir metadata/Download all metadata to local
fastlane supply --metadata_path ./metadatagpc listings push --dir ./metadataSame concept

Screenshots and Images

FastlaneGPCNotes
fastlane supply --skip_upload_aab --skip_upload_metadatagpc listings images upload --lang en-US --type phoneScreenshots ./screens/*.pngUpload screenshots
N/Agpc listings images list --lang en-US --type phoneScreenshotsList existing images
N/Agpc listings images delete --lang en-US --type phoneScreenshots --id <id>Delete specific image

Rollout Management

FastlaneGPCNotes
fastlane supply --track production --rollout 0.5gpc releases rollout increase --track production --to 50Percentage vs decimal
fastlane supply --track_promote_to production --track betagpc releases promote --from beta --to productionClearer flag names
N/Agpc releases rollout halt --track productionNo Fastlane equivalent
N/Agpc releases rollout resume --track productionNo Fastlane equivalent
N/Agpc releases rollout complete --track productionNo Fastlane equivalent

Commands Only in GPC

GPC CommandDescription
gpc vitals crashesCrash rate and clusters
gpc vitals anrANR rate
gpc vitals crashes --threshold 2.0CI quality gate (exit code 6)
gpc reviews list --stars 1-2Filter and list reviews
gpc reviews reply <id> "Thanks"Reply to reviews
gpc subscriptions listManage subscriptions
gpc iap listManage in-app products
gpc purchases get <token>Verify purchases
gpc reports download financialDownload financial reports
gpc users invite <email>Manage developer account users
gpc testers add <email>Manage beta testers

Environment Variables

FastlaneGPCFormat
SUPPLY_JSON_KEYGPC_SERVICE_ACCOUNTFile path or JSON string
SUPPLY_JSON_KEY_DATAGPC_SERVICE_ACCOUNTGPC accepts both file path and inline JSON in the same variable
SUPPLY_PACKAGE_NAMEGPC_APPPackage name
N/AGPC_DEVELOPER_IDRequired for user management (Fastlane does not support this)

Rollout Values: Decimal vs Percentage

This is the most common gotcha when migrating. Fastlane uses decimal fractions (0.0-1.0), GPC uses percentages (0-100).

FastlaneGPCMeaning
--rollout 0.01--rollout 11% of users
--rollout 0.05--rollout 55% of users
--rollout 0.1--rollout 1010% of users
--rollout 0.5--rollout 5050% of users
--rollout 1.0--rollout 100 or omit100% of users

Metadata Directory Format

GPC supports the Fastlane metadata directory structure. If you already have a metadata/ or fastlane/metadata/android/ directory, it works with gpc listings push.

Fastlane Format (supported by GPC)

metadata/
├── en-US/
│   ├── title.txt
│   ├── short_description.txt
│   ├── full_description.txt
│   ├── changelogs/
│   │   └── 42.txt              # Version code
│   └── images/
│       ├── phoneScreenshots/
│       │   ├── 1.png
│       │   └── 2.png
│       ├── icon.png
│       └── featureGraphic.png
├── ja-JP/
│   ├── title.txt
│   ├── short_description.txt
│   └── full_description.txt

GPC Commands with Fastlane Directory

bash
# Download current listings to Fastlane-compatible directory
gpc listings pull --dir metadata/

# Push local metadata to Play Console
gpc listings push --dir metadata/

# Preview changes without applying (dry-run)
gpc listings push --dir metadata/ --dry-run

# Push release notes from changelogs directory
gpc releases notes set --track beta --file metadata/en-US/changelogs/

CI Migration: GitHub Actions

Before (Fastlane)

yaml
# .github/workflows/release.yml (Fastlane)
name: Release
on:
  push:
    tags: ["v*"]

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.2
          bundler-cache: true

      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17

      - name: Build
        run: ./gradlew bundleRelease

      - name: Deploy to Play Store
        env:
          SUPPLY_JSON_KEY_DATA: ${{ secrets.PLAY_STORE_KEY }}
          SUPPLY_PACKAGE_NAME: com.example.myapp
        run: |
          bundle exec fastlane supply \
            --aab app/build/outputs/bundle/release/app-release.aab \
            --track internal

After (GPC)

yaml
# .github/workflows/release.yml (GPC)
name: Release
on:
  push:
    tags: ["v*"]

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17

      - name: Build
        run: ./gradlew bundleRelease

      - uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Deploy to Play Store
        env:
          GPC_SERVICE_ACCOUNT: ${{ secrets.GPC_SERVICE_ACCOUNT }}
          GPC_APP: com.example.myapp
        run: |
          npm install -g @gpc-cli/cli
          gpc releases upload \
            app/build/outputs/bundle/release/app-release.aab \
            --track internal \
            --json

Key differences:

  • No Ruby/Bundler setup required
  • Node.js setup instead (or use standalone binary for zero dependencies)
  • Environment variables renamed (SUPPLY_JSON_KEY to GPC_SERVICE_ACCOUNT)
  • --json flag for machine-readable output
  • No Gemfile or Fastfile needed

CI Migration: GitLab CI

Before (Fastlane)

yaml
release:
  image: ruby:3.2
  stage: deploy
  before_script:
    - gem install fastlane
  script:
    - |
      fastlane supply \
        --aab build/app-release.aab \
        --track internal \
        --json_key_data "$SUPPLY_JSON_KEY_DATA"
  only:
    - tags

After (GPC)

yaml
release:
  image: node:20
  stage: deploy
  before_script:
    - npm install -g @gpc-cli/cli
  script:
    - gpc releases upload build/app-release.aab --track internal --json
  variables:
    GPC_SERVICE_ACCOUNT: $GPC_SERVICE_ACCOUNT
    GPC_APP: com.example.myapp
  only:
    - tags

Fastfile to Shell Script

If you have a complex Fastfile, translate each lane to a shell script or CI step.

Fastfile

ruby
lane :deploy do
  gradle(task: "bundleRelease")
  supply(
    aab: "app/build/outputs/bundle/release/app-release.aab",
    track: "internal",
    skip_upload_metadata: true,
    skip_upload_images: true,
    skip_upload_screenshots: true,
  )
end

lane :promote_to_beta do
  supply(
    track: "internal",
    track_promote_to: "beta",
    skip_upload_metadata: true,
    skip_upload_images: true,
    skip_upload_screenshots: true,
  )
end

lane :metadata do
  supply(
    skip_upload_aab: true,
    skip_upload_apk: true,
    metadata_path: "./metadata",
  )
end

GPC Equivalent

bash
#!/bin/bash
# deploy.sh — replaces Fastfile lanes
set -euo pipefail

deploy() {
  ./gradlew bundleRelease
  gpc releases upload \
    app/build/outputs/bundle/release/app-release.aab \
    --track internal \
    --json
}

promote_to_beta() {
  gpc releases promote --from internal --to beta --json
}

metadata() {
  gpc listings push --dir ./metadata --json
}

# Run the requested lane
"${1:-deploy}"

Step-by-Step Migration

  1. Install GPC -- npm install -g gpc or use the standalone binary
  2. Set up auth -- gpc auth login --service-account key.json
  3. Test with dry-run -- gpc listings push --dir metadata/ --dry-run
  4. Update CI secrets -- Replace SUPPLY_JSON_KEY with GPC_SERVICE_ACCOUNT
  5. Update CI workflow -- Replace Fastlane commands with GPC equivalents
  6. Verify -- Run gpc doctor to confirm everything is connected
  7. Remove Fastlane -- Delete Gemfile, fastlane/ directory (optional, can coexist during transition)

Released under the MIT License.