Customer Accounts
Some projects are published under a client's Apple Developer account rather than your organization's own account. This guide covers the setup and workflow for customer-account projects.
When to use customer accounts
Use a customer account when:
- The client owns the Apple Developer account and App Store Connect listing
- The app must be published under the client's team
- The client provides their own signing certificates
Configuration
Set these additional environment variables in the consumer project's Fastfile:
ENV["APP_IDENTIFIER"] = "app.example.myapp" # Your internal identifier
ENV["APP_IDENTIFIER_CUSTOMER"] = "com.client.theapp" # Client's bundle identifier
ENV["APP_SCHEME"] = "MyApp"
ENV["APP_NAME"] = "My App"
ENV["TEAM_ID_CUSTOMER"] = "ABCDEF1234" # Client's Apple Developer Team ID
ENV["ASC_TEAM_ID_CUSTOMER"] = "9876543" # Client's App Store Connect Team ID
ENV["CUSTOMERS_BRANCH"] = "client-name" # Branch in certificates repo
import_from_git(url: "git@github.com:your-org/fastlane.git")
How it works
Certificate management
Customer certificates are stored on a separate branch in the shared certificates repository:
- Own-account apps: Use
MATCH_GIT_BRANCH(e.g.,master) - Customer-account apps: Use
CUSTOMERS_BRANCH(e.g.,client-name)
Lane behavior
The release lane automatically detects the account type:
| Setting | Own Account | Customer Account |
|---|---|---|
| Bundle ID | APP_IDENTIFIER |
APP_IDENTIFIER_CUSTOMER |
| Team ID | TEAM_ID |
TEAM_ID_CUSTOMER |
| ASC Team ID | ASC_TEAM_ID |
ASC_TEAM_ID_CUSTOMER |
| Certificate branch | MATCH_GIT_BRANCH |
CUSTOMERS_BRANCH |
The beta lane always uses the organization's own account (since beta builds are internal).
App identifiers
| Configuration | Identifier |
|---|---|
| Debug | APP_IDENTIFIER |
| Beta | APP_IDENTIFIER.beta |
| Release | APP_IDENTIFIER_CUSTOMER |
Initial setup
1. Create the customer branch in certificates repo
First time only — create the branch for the customer's certificates:
bundle exec fastlane update_provisioning include_release:true create_branch:true
The create_branch:true option tells match to create the branch if it doesn't exist.
2. Create app identifiers
bundle exec fastlane create_apps
This creates:
- Debug identifier under your team (
APP_IDENTIFIER) - Beta identifier + ITC app under your team (
APP_IDENTIFIER.beta) - Release identifier + ITC app under the customer's team (
APP_IDENTIFIER_CUSTOMER)
3. Set up provisioning profiles
bundle exec fastlane update_provisioning include_release:true