Quick Takeaways
What you'll learn in this article
- 1
Complete app transfer workflows for both Apple App Store and Google Play Store
- 2
Legal and compliance requirements for ownership changes
- 3
Technical prerequisites and preparation steps
- 4
Data migration and subscription management
- 5
Common pitfalls and how to avoid costly mistakes
Keep reading for detailed implementation, code examples, and real-world results
Tutorial Overview & Learning Objectives
App ownership transfers between developers or companies are complex processes that require careful planning, legal compliance, and technical precision. Whether you're acquiring an app, transitioning development agencies, or restructuring your organization, understanding the transfer process for both major mobile platforms is essential.
What You'll Learn
In this comprehensive tutorial, you'll master:
- Complete app transfer workflows for both Apple App Store and Google Play Store
- Legal and compliance requirements for ownership changes
- Technical prerequisites and preparation steps
- Data migration and subscription management
- Common pitfalls and how to avoid costly mistakes
- Post-transfer verification and monitoring procedures
Real-World Use Cases
This tutorial addresses critical scenarios I've encountered leading mobile platform engineering teams:
Agency Transitions: Moving apps from external development agencies to in-house teams Acquisitions & Mergers: Transferring app ownership during company acquisitions Organizational Restructuring: Moving apps between subsidiaries or business units Developer Account Consolidation: Centralizing apps under unified corporate accounts Exit Strategies: Transferring apps when selling digital assets
Expected Time Commitment
- Apple Transfer Process: 2-4 hours preparation + 3-7 days processing
- Google Transfer Process: 1-2 hours preparation + 1-3 days processing
- Total Project Timeline: Plan for 2-3 weeks including verification and contingencies
Prerequisites Check
Before proceeding, ensure you have:
โ Administrative Access: Full admin rights on both source and destination accounts โ Legal Documentation: Proper authorization and ownership documentation โ Financial Clearance: All outstanding payments settled on both platforms โ Compliance Status: No pending violations or disputes on either account โ Communication Plan: Stakeholder notification strategy prepared
Architecture & Design Overview
Transfer Process Architecture
Understanding the architectural differences between Apple and Google's transfer systems is crucial for successful execution.
Apple App Store Transfer Model
Apple implements a full ownership transfer model where:
- The app completely moves from one developer account to another
- The original developer loses all access immediately upon completion
- App Store metrics and reviews remain with the app
- In-app purchases and subscriptions transfer with the app
- The process is irreversible once completed
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ Source Account โ โ Destination โ
โ (Current Owner)โโโโโโโโโโโโถโ Account (New โ
โ โ Transfer โ Owner) โ
โ - Loses Access โ โ - Gains Full โ
โ - Irreversible โ โ Control โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ App Retains: โ
โ - Bundle ID โ
โ - Reviews โ
โ - Ratings โ
โ - Subscriptions โ
โโโโโโโโโโโโโโโโโโโโ
Google Play Store Transfer Model
Google uses a collaborative transfer process where:
- Transfer requires mutual agreement between both parties
- Source account receives an invitation to transfer
- Destination account must accept the transfer
- Process includes a waiting period before completion
- Transfer can be cancelled before final acceptance
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ Source Account โโโโโโโโโโโถโ Destination โ
โ (Current Owner)โ Mutual โ Account (New โ
โ โAgreement โ Owner) โ
โ 1. Initiates โ โ 2. Reviews & โ
โ Transfer โ โ Accepts โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ Waiting Period โ
โ (48 hours) โ
โโโโโโโโโโฌโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ Transfer Completeโ
โ - All Data Moves โ
โ - History Intact โ
โโโโโโโโโโโโโโโโโโโโ
Technology Stack Components
Apple App Store Connect Requirements
- Account Type: Must be enrolled in Apple Developer Program ($99/year)
- Account Status: Both accounts must be in good standing
- Legal Entity: Destination must be a legal entity (organization or individual)
- Agreement Status: All program license agreements must be current
Google Play Console Requirements
- Account Type: Google Play Developer account ($25 one-time fee)
- Organization: Destination account must be an Organization account (not Individual)
- Payment Profile: Valid payment profile required for destination account
- API Access: All API projects must be transferred separately
Design Decisions & Tradeoffs
Transfer Timing Considerations
Peak Season vs. Off-Peak:
- Peak Season Transfers: Higher risk of user impact, increased support volume
- Off-Peak Transfers: Lower user activity, easier monitoring and troubleshooting
- Recommendation: Schedule transfers during periods of lowest user activity
Immediate vs. Phased Approach:
- Immediate Transfer: Clean break, simpler communication, higher initial risk
- Phased Approach: Gradual transition, complex coordination, lower risk per phase
- Recommendation: Use immediate transfer for single apps, phased for app portfolios
Data Retention Strategy
What Transfers Automatically:
- App metadata and descriptions
- App Store/Play Store reviews and ratings
- In-app purchase configurations
- Subscription groups and products
- App analytics history (with caveats)
What Requires Manual Migration:
- Source code repositories
- CI/CD pipelines and configurations
- Third-party service integrations
- Firebase projects (if applicable)
- Backend infrastructure and databases
- Customer support ticket histories
Production Considerations
From leading multiple app transfers across regulated industries, I've learned these critical production considerations:
User Impact Minimization:
- Zero downtime is non-negotiable for active user bases
- Subscription continuity must be validated pre and post-transfer
- Push notification services require reconfiguration
- Analytics tracking may experience data gaps during transition
Compliance Requirements:
- GDPR considerations for user data across entity changes
- Privacy policy updates required for legal entity changes
- App store compliance reviews may be triggered
- Financial reporting obligations during transition period
Risk Mitigation:
- Maintain emergency rollback procedures (where possible)
- Document all API keys and third-party service credentials
- Create comprehensive stakeholder communication plan
- Establish monitoring and alerting for post-transfer anomalies
Apple App Store Transfer: Step-by-Step Implementation
Phase 1: Pre-Transfer Preparation
1.1 Verify Transfer Eligibility
Before initiating any transfer, confirm these critical requirements:
Source Account Requirements:
# Eligibility Checklist โ Account in good standing (no violations) โ All financial obligations current โ No pending app submissions under review โ No open disputes or conflicts with Apple โ Admin or Account Holder role required
Destination Account Requirements:
# Destination Readiness Checklist โ Apple Developer Program enrollment complete โ Organization type account (preferred for business transfers) โ Valid payment method on file โ Accepted all current agreements in App Store Connect โ Team member with Admin or Account Holder role designated
App-Specific Eligibility:
- App must have been available on App Store for at least 60 days
- No in-progress legal issues related to the app
- No pending App Store review rejections
- Bundle ID must not conflict with destination account's existing apps
1.2 Document Current State
Create a comprehensive documentation package:
# App Transfer Documentation Template
App Identification
- App Name: **___**
- Bundle ID: **___**
- Apple ID: **___**
- Current App Store URL: **___**
Technical Details
- Latest Version: **___**
- Deployment Target: **___**
- Supported Devices: **___**
- App Capabilities: **___**
Business Information
- Legal Entity (Current): **___**
- Legal Entity (Destination): **___**
- Transfer Justification: **___**
- Transfer Date (Target): **___**
Integration Dependencies
- [ ] Push Notifications (APNs certificates)
- [ ] In-App Purchases (list products)
- [ ] Subscriptions (list all groups)
- [ ] Apple Sign In
- [ ] CloudKit containers
- [ ] Associated Domains
- [ ] App Clips
Financial Information
- Active Subscriptions: **___**
- In-App Purchase Revenue (MTD): **___**
- Outstanding Payments: **___**
### 1.3 Legal & Compliance Preparation
**Required Legal Documentation:**
1. **Transfer Authorization Letter:**
- Signed by authorized representatives of both entities
- Explicitly states consent for app ownership transfer
- Includes app identification details (Bundle ID, App Name, Apple ID)
2. **Entity Verification Documents:**
- Business registration documents
- Tax identification numbers
- Authorization to conduct business in relevant jurisdictions
3. **Contractual Agreements:**
- Asset purchase agreement (if applicable)
- Service level agreements for transition period
- Liability and warranty statements
### 1.4 Technical Infrastructure Audit
**Critical Services Inventory:**
```yaml
# services-audit.yml
push_notifications:
provider: APNs
certificates:
- type: production
expiration: 2025-12-31
renewal_required: true
- type: development
expiration: 2025-06-30
renewal_required: false
in_app_purchases:
products:
- id: com.example.premium.monthly
type: auto_renewable_subscription
price_tier: 9.99
- id: com.example.coins.100
type: consumable
price_tier: 0.99
backend_services:
- name: authentication_api
url: https://api.example.com/auth
migration_required: true
- name: content_delivery
url: https://cdn.example.com
migration_required: false
third_party_sdks:
- name: Firebase
project_id: example-app-production
migration_required: true
- name: Analytics
tracking_id: UA-123456789-1
migration_required: true
Phase 2: Initiate Transfer Process
2.1 Access App Store Connect
Navigation Path:
- Log in to App Store Connect
- Select My Apps from the toolbar
- Choose the app you want to transfer
- Click App Information in the left sidebar
2.2 Request Transfer
Step-by-Step Transfer Initiation:
1. Under "General Information" section: โโ Scroll to "Transfer App" section โโ Click "Transfer App" button 2. Review Transfer Requirements: โโ Confirm app eligibility status โโ Review transfer prerequisites โโ Click "Continue" 3. Enter Destination Team Information: โโ Destination Team ID: [9-character Team ID] โโ Destination Team Name: [Verify exact name] โโ Transfer Reason: [Select from dropdown] โโ Additional Details: [Optional explanation] 4. Select Transfer Components: โ App Metadata โ App Store Presence โ In-App Purchases โ Subscription Groups โ App Analytics (Note: 1-year history limit) โ TestFlight Information 5. Acknowledge Terms: โ I understand this transfer is irreversible โ I have authorization to initiate this transfer โ I have reviewed all financial obligations 6. Submit Transfer Request: โโ Click "Submit Transfer" โโ Note the Transfer Request ID for tracking
2.3 Destination Account Acceptance
Acceptance Process (Destination Account Owner):
1. Check Email: โโ Apple sends notification to destination team admin/account holder โโ Subject: "App Transfer Request from [Source Team]" โโ Review transfer details carefully 2. Log in to App Store Connect: โโ Navigate to "My Apps" โโ Look for "Transfer Requests" notification badge 3. Review Transfer Request: โโ Verify app details (Bundle ID, name, features) โโ Review included components โโ Check for any outstanding requirements โโ Confirm account has capacity for new app 4. Accept Transfer: โโ Click "Review Transfer" โโ Read all terms and conditions โโ Resolve any warnings or blockers โโ Click "Accept Transfer" โโ Enter authentication credentials if prompted
Phase 3: Post-Transfer Configuration
3.1 Immediate Post-Transfer Actions
Within First Hour:
# Critical Configuration Checklist โก Verify app appears in destination App Store Connect account โก Confirm all in-app purchases are present and configured โก Check subscription group status and pricing โก Validate app metadata transferred correctly โก Test App Store listing visibility โก Verify app analytics data accessibility
3.2 Certificate & Provisioning Profile Updates
APNs Certificate Migration:
# 1. Generate new APNs certificate from destination account # Access: Certificates, Identifiers & Profiles in Apple Developer # 2. Create new certificate request openssl req -new -newkey rsa:2048 -nodes \ -keyout APNs_Production.key \ -out APNs_Production.csr \ -subj "/CN=Apple Push Services: com.yourcompany.appname/O=Your Company Inc." # 3. Upload CSR to Apple Developer Portal: # - Select "Apple Push Notification service SSL (Production)" # - Upload the .csr file # - Download the generated certificate # 4. Convert to .p12 format for backend integration openssl x509 -in APNs_Production.cer -inform DER \ -out APNs_Production.pem -outform PEM openssl pkcs12 -export -inkey APNs_Production.key \ -in APNs_Production.pem \ -out APNs_Production.p12 \ -name "APNs Production Certificate" # 5. Update backend push notification service with new certificate # This is service-specific - consult your push notification provider docs
Provisioning Profiles Regeneration:
# Navigate to: Certificates, Identifiers & Profiles # 1. Distribution Profile (App Store) # - Click "+" to create new profile # - Select "App Store" distribution # - Choose the transferred app's App ID # - Select distribution certificate # - Name: "App Store Distribution - [App Name]" # - Download and install in Xcode # 2. Development Profile (if needed) # - Create new development profile # - Select app ID and development certificates # - Add test devices # - Download and distribute to dev team
3.3 Third-Party Service Reconfiguration
Firebase Migration (If Applicable):
// Previous Firebase configuration (to be replaced)
const firebaseConfigOld = {
apiKey: 'OLD_API_KEY',
authDomain: 'old-project.firebaseapp.com',
projectId: 'old-project',
storageBucket: 'old-project.appspot.com',
messagingSenderId: '123456789',
appId: '1:123456789:ios:abc123def456',
}
// Steps for Firebase project transfer:
// 1. Create new Firebase project under destination organization
// 2. Add iOS app with transferred Bundle ID
// 3. Download new GoogleService-Info.plist
// 4. Update app configuration with new values
// 5. Migrate Firestore data (if applicable)
// 6. Update security rules with new ownership
// 7. Migrate Cloud Functions
// 8. Update API keys and service accounts
// New Firebase configuration
const firebaseConfigNew = {
apiKey: 'NEW_API_KEY',
authDomain: 'new-project.firebaseapp.com',
projectId: 'new-project',
storageBucket: 'new-project.appspot.com',
messagingSenderId: '987654321',
appId: '1:987654321:ios:xyz789ghi012',
}
Analytics Platform Updates:
// Google Analytics / Firebase Analytics
// Update tracking configuration in app
import analytics from '@react-native-firebase/analytics'
// Log custom event to verify tracking post-transfer
await analytics().logEvent('app_transfer_complete', {
transfer_date: new Date().toISOString(),
source_entity: 'Old Company LLC',
destination_entity: 'New Company Inc',
app_version: '2.5.0',
})
// App-specific tracking properties update
await analytics().setUserProperty('ownership_entity', 'New Company Inc')
3.4 App Store Listing Verification
Metadata Review Checklist:
1. App Information: โ App name correct โ Subtitle accurate โ Privacy Policy URL updated (if entity changed) โ Support URL updated โ Marketing URL updated โ Copyright notice reflects new owner 2. Pricing and Availability: โ Base price correct โ Territory availability unchanged โ Pre-order settings (if applicable) 3. In-App Purchases: โ All products present โ Pricing tiers correct โ Subscription groups configured โ Introductory offers active 4. App Privacy: โ Data collection practices accurate โ Privacy labels reflect current state โ Privacy policy URL updated 5. App Store Presence: โ Screenshots display correctly โ Preview videos play properly โ App description accurate โ What's New section up to date โ Keywords optimized
Google Play Store Transfer: Step-by-Step Implementation
Phase 1: Pre-Transfer Preparation
1.1 Verify Transfer Eligibility
Source Account Requirements:
# Source Account Checklist โ Google Play Developer account in good standing โ No policy violations or pending appeals โ All payment obligations current โ Admin access to Google Play Console โ No apps under review for policy compliance โ Account age > 30 days (recommended)
Destination Account Requirements:
# Destination Account Checklist โ Organization Google Play Developer account (NOT Individual) โ Payment profile set up and verified โ Bank account information on file โ Tax information completed โ Identity verification completed โ Admin access available โ D-U-N-S number (for US organizations)
Critical Difference from Apple: Google requires the destination account to be an Organization account, not an Individual developer account. This is a non-negotiable requirement.
1.2 Organization Account Setup
If destination account is not yet an organization:
# Convert Individual to Organization Account WARNING: This conversion is IRREVERSIBLE Steps: 1. Log in to Google Play Console 2. Navigate to Settings โ Developer Account 3. Click "Account details" 4. Select "Switch to organization account" 5. Provide required information: - Legal organization name - Organization address - Organization type - D-U-N-S number (if applicable) - Tax identification 6. Submit verification documents: - Articles of incorporation - Business registration certificate - Government-issued business license 7. Wait for Google verification (1-3 business days)
1.3 API Access Preparation
Important Consideration: Google Play API projects do NOT automatically transfer with apps. You must migrate these separately.
# api-projects-audit.yml
google_cloud_projects:
- project_name: 'app-production-api'
project_id: 'app-prod-123456'
services_enabled:
- 'Google Play Android Developer API'
- 'Cloud Pub/Sub API'
- 'Cloud Storage API'
service_accounts:
- name: 'play-console-sa'
email: 'play-console-sa@app-prod-123456.iam.gserviceaccount.com'
roles:
- 'Service Account User'
- 'Editor'
migration_status: 'pending'
- project_name: 'app-subscriptions'
project_id: 'app-subs-789012'
services_enabled:
- 'Google Play Billing API'
migration_status: 'pending'
1.4 Subscription & In-App Products Inventory
# In-App Products Audit
Subscriptions
-
Premium Monthly
- Product ID: premium_monthly_subscription
- Price: $9.99/month
- Free trial: 7 days
- Grace period: 3 days
- Active subscribers: 1,247
-
Premium Yearly
- Product ID: premium_yearly_subscription
- Price: $89.99/year
- Free trial: 14 days
- Grace period: 3 days
- Active subscribers: 3,891
Managed Products (One-Time Purchases)
-
Remove Ads
- Product ID: remove_ads_forever
- Price: $4.99
- Purchases: 15,234
-
Unlock Pro Features
- Product ID: unlock_pro_features
- Price: $14.99
- Purchases: 8,567
Consumable Products
-
100 Coins
- Product ID: coins_100
- Price: $0.99
-
1000 Coins
- Product ID: coins_1000
- Price: $7.99
Phase 2: Initiate Transfer Process
2.1 Access Google Play Console
Navigation to Transfer Function:
1. Log in to Google Play Console: https://play.google.com/console 2. Select the app you want to transfer 3. Navigate to: Setup โ Advanced settings 4. Scroll to "App ownership" section 5. Click "Transfer app to another account"
2.2 Prepare Transfer Request
Transfer Request Form:
Step 1: Review eligibility
โก App has been published for at least 30 days โก App is in good standing (no active policy violations) โก No pending updates under review โก All financial obligations settled โก Click "Continue"
Step 2: Enter destination account information
- Organization email: [Enter destination org email]
- Organization name: [Verify exact legal name]
- Transfer reason: [Select from dropdown] Options: โโ Business acquisition โโ Company reorganization โโ Asset sale โโ Other (specify)
Step 3: Select transfer components
โ App listings (all languages) โ In-app products and subscriptions โ User reviews and ratings โ App content rating โ Store presence and metadata โ Production APKs/App Bundles โ Release tracks (internal, closed, open, production) โ Google Cloud Project (separate process - see below)
Step 4: Additional information
- Planned transfer date: [YYYY-MM-DD]
- Business justification: [Detailed explanation]
- Supporting documentation: [Upload contracts, legal docs]
Step 5: Review and submit
โก Review all transfer details โก Acknowledge irreversible nature โก Confirm authorization โก Click "Send transfer request"
### 2.3 Destination Account Acceptance **Acceptance Workflow:** ```markdown
Email Notification
The destination account's admin receives:
- Subject: "App transfer request from [Source Account]"
- Contains: App name, package name, transfer initiator
- Action required within: 30 days
Accept Transfer Steps
- Log in to Google Play Console (destination account)
- Navigate to "Home" or check notifications
- Look for "Transfer requests" section
- Click "Review request"
- Verify transfer details:
- App package name: com.example.app
- Current owner: Source Organization
- Transfer components included
- Terms and conditions
- Review warnings or requirements:
- Payment profile must be active
- Tax information must be complete
- Organization verification must be finished
- Resolve any blockers identified
- Click "Accept transfer"
- Authenticate with 2FA if required
- Confirm acceptance
Waiting Period
- After acceptance: 48-hour waiting period
- Purpose: Allow for review and cancellation if needed
- Status: Both parties can monitor transfer status
- Cancellation: Either party can cancel during waiting period
### 2.4 Google Cloud Project Migration **Separate API Project Transfer Process:** ```bash # Google Cloud Project migration is NOT automatic # Must be performed separately through Google Cloud Console # Step 1: Export service account keys from source project gcloud iam service-accounts keys list \ --iam-account=play-console-sa@source-project.iam.gserviceaccount.com \ --project=source-project # Step 2: Create new Google Cloud project in destination organization gcloud projects create destination-project \ --organization=123456789 \ --name="App Production API" # Step 3: Enable required APIs in new project gcloud services enable androidpublisher.googleapis.com \ --project=destination-project gcloud services enable cloudbuild.googleapis.com \ --project=destination-project # Step 4: Create new service account gcloud iam service-accounts create play-console-sa \ --display-name="Play Console Service Account" \ --project=destination-project # Step 5: Grant necessary roles gcloud projects add-iam-policy-binding destination-project \ --member="serviceAccount:play-console-sa@destination-project.iam.gserviceaccount.com" \ --role="roles/editor" # Step 6: Link service account to Play Console # This must be done through Play Console UI: # Setup โ API access โ Link Google Cloud Project # Follow prompts to connect new project # Step 7: Generate and download new service account key gcloud iam service-accounts keys create ~/play-console-key.json \ --iam-account=play-console-sa@destination-project.iam.gserviceaccount.com \ --project=destination-project # Step 8: Update all systems using old service account key # - CI/CD pipelines # - Backend services # - Analytics platforms # - Publishing automation tools
Phase 3: Post-Transfer Configuration
3.1 Immediate Verification Steps
Within First 30 Minutes:
# Critical Verification Checklist 1. App Presence: โก App appears in destination Play Console โก Package name unchanged: com.example.app โก App status shows as "Published" โก Store listing visible at: play.google.com/store/apps/details?id=com.example.app 2. In-App Products: โก All subscription products present โก Subscription pricing correct โก Billing cycles unchanged โก Trial periods configured correctly โก Managed products available โก Consumable products functioning 3. App Releases: โก Production track shows current version โก Beta tracks intact (if applicable) โก Alpha tracks intact (if applicable) โก Internal test track intact (if applicable) โก Release notes preserved 4. Store Listing: โก App title correct in all languages โก Short description accurate โก Full description complete โก Screenshots display properly โก Feature graphic present โก Video (if any) plays correctly โก Content rating displayed 5. Users & Permissions: โก Admin access confirmed โก Team member access removed from source (if required) โก New team members added to destination โก Role permissions configured correctly
3.2 Signing Configuration Updates
Generate New Upload Key (Recommended for Security):
# While Google Play App Signing allows you to continue using existing keys, # generating a new upload key is a security best practice post-transfer # 1. Generate new keystore with upload key keytool -genkeypair -v \ -keystore upload-keystore.jks \ -keyalg RSA \ -keysize 2048 \ -validity 10000 \ -alias upload-key \ -dname "CN=Your Company, OU=Mobile Engineering, O=Your Company Inc, L=San Francisco, ST=California, C=US" \ -storepass [STRONG_PASSWORD] \ -keypass [STRONG_PASSWORD] # 2. Export certificate from new upload keystore keytool -export -rfc \ -keystore upload-keystore.jks \ -alias upload-key \ -file upload-certificate.pem # 3. Upload new upload certificate to Google Play Console # Navigate to: Release โ Setup โ App signing # Click "Upload new certificate" # Upload upload-certificate.pem # Google will verify and activate new upload key # 4. Update build configuration with new keystore # gradle.properties or signing config in build.gradle
Update Gradle Signing Configuration:
// android/app/build.gradle
android {
signingConfigs {
release {
storeFile file("../upload-keystore.jks")
storePassword System.getenv("UPLOAD_KEYSTORE_PASSWORD")
keyAlias "upload-key"
keyPassword System.getenv("UPLOAD_KEY_PASSWORD")
// Enable V2 signing for better performance
v2SigningEnabled true
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
3.3 Firebase & Backend Service Migration
Firebase Project Transfer:
// Firebase projects don't automatically transfer with Play Store apps
// You must migrate Firebase separately
// 1. Create new Firebase project under destination organization
// 2. Add Android app with existing package name
// 3. Download new google-services.json
// 4. Update app configuration
// Old Firebase configuration (android/app/google-services.json)
{
"project_info": {
"project_number": "123456789",
"project_id": "old-project-name",
"storage_bucket": "old-project-name.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:123456789:android:abc123",
"android_client_info": {
"package_name": "com.example.app"
}
}
}
]
}
// New Firebase configuration
{
"project_info": {
"project_number": "987654321",
"project_id": "new-project-name",
"storage_bucket": "new-project-name.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:987654321:android:xyz789",
"android_client_info": {
"package_name": "com.example.app"
}
}
}
]
}
// Data migration strategy for Firebase
const migrateFirestoreData = async () => {
const admin = require('firebase-admin');
// Initialize source Firebase
const sourceApp = admin.initializeApp({
credential: admin.credential.cert(sourceServiceAccount),
databaseURL: 'https://old-project-name.firebaseio.com'
}, 'source');
// Initialize destination Firebase
const destApp = admin.initializeApp({
credential: admin.credential.cert(destServiceAccount),
databaseURL: 'https://new-project-name.firebaseio.com'
}, 'destination');
const sourceDb = sourceApp.firestore();
const destDb = destApp.firestore();
// Migrate collections
const collections = ['users', 'subscriptions', 'transactions'];
for (const collectionName of collections) {
console.log(`Migrating collection: ${collectionName}`);
const snapshot = await sourceDb.collection(collectionName).get();
const batch = destDb.batch();
let batchCount = 0;
snapshot.docs.forEach((doc) => {
const docRef = destDb.collection(collectionName).doc(doc.id);
batch.set(docRef, doc.data());
batchCount++;
// Firestore batch write limit is 500
if (batchCount === 500) {
await batch.commit();
batch = destDb.batch();
batchCount = 0;
}
});
if (batchCount > 0) {
await batch.commit();
}
console.log(`Migrated ${snapshot.size} documents from ${collectionName}`);
}
};
3.4 Analytics & Monitoring Updates
Google Analytics 4 Migration:
// Update Google Analytics configuration
// android/app/build.gradle
dependencies {
implementation 'com.google.firebase:firebase-analytics:21.3.0'
}
// Update analytics tracking ID
// In Firebase Console: Analytics โ Data Streams โ Select Android app
// Copy Measurement ID
// Application-level tracking initialization
import com.google.firebase.analytics.FirebaseAnalytics;
public class MainActivity extends AppCompatActivity {
private FirebaseAnalytics mFirebaseAnalytics;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Obtain the FirebaseAnalytics instance
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
// Log app transfer event
Bundle transferEvent = new Bundle();
transferEvent.putString("transfer_date", "2025-10-08");
transferEvent.putString("source_org", "Old Company LLC");
transferEvent.putString("dest_org", "New Company Inc");
mFirebaseAnalytics.logEvent("app_transfer_complete", transferEvent);
// Update default parameters
mFirebaseAnalytics.setUserProperty("ownership_entity", "New Company Inc");
}
}
3.5 Play Console Team Access Configuration
Configure User Roles Post-Transfer:
User Role Assignment Best Practices
-
Navigate to: Users and permissions
-
Remove access from source organization (if required):
- Review existing users
- Revoke access for members from source organization
- Document any required transition period access
-
Add destination organization team members:
Admin Role (Full Control):
- CTO / VP Engineering
- Release Manager
- Permissions: All permissions enabled
Developer Role (App Management):
- Senior Android Engineers
- Permissions: โ View app information and download bulk reports โ View financial data, orders, and survey responses โ Manage production releases โ Manage testing tracks โ Reply to reviews
Marketing Role (Content Management):
- Product Marketing Manager
- Permissions: โ View app information โ Edit store listing โ Create and edit Store listings experiments โ Manage production releases
Finance Role (Read-Only Financial):
- Finance Controller
- Permissions: โ View financial data, orders, and survey responses โ Download bulk reports โ Manage releases โ Edit store listing
-
Configure app-level permissions:
- Can be more granular than account-level
- Useful for multi-app portfolios
- Supports principle of least privilege
--- # Testing & Validation
Pre-Production Validation Strategy
From leading app transfers across multiple regulated industries, I've developed comprehensive validation protocols that catch issues before they impact users.
Subscription Continuity Testing
Critical Test Cases:
// Test script for subscription validation
const validateSubscriptions = async () => {
const testCases = [
{
name: 'Active Monthly Subscription',
userId: 'test_user_001',
subscriptionId: 'premium_monthly',
expectedStatus: 'active',
expectedExpiry: '2025-11-08',
},
{
name: 'Active Yearly with Trial',
userId: 'test_user_002',
subscriptionId: 'premium_yearly',
expectedStatus: 'trial',
expectedExpiry: '2025-10-22',
},
{
name: 'Cancelled Subscription (Grace Period)',
userId: 'test_user_003',
subscriptionId: 'premium_monthly',
expectedStatus: 'cancelled_grace',
expectedExpiry: '2025-10-11',
},
{
name: 'Expired Subscription',
userId: 'test_user_004',
subscriptionId: 'premium_yearly',
expectedStatus: 'expired',
expectedExpiry: '2025-09-01',
},
]
for (const testCase of testCases) {
console.log(`Testing: ${testCase.name}`)
try {
const subscription = await getSubscriptionStatus(
testCase.userId,
testCase.subscriptionId
)
assert.equal(
subscription.status,
testCase.expectedStatus,
`Status mismatch for ${testCase.name}`
)
assert.equal(
subscription.expiryDate,
testCase.expectedExpiry,
`Expiry date mismatch for ${testCase.name}`
)
console.log(`โ ${testCase.name} - PASSED`)
} catch (error) {
console.error(`โ ${testCase.name} - FAILED: ${error.message}`)
}
}
}
In-App Purchase Validation
Purchase Flow Testing:
Manual Test Cases
Test Case 1: New Purchase (Managed Product)
- Select "Remove Ads" product ($4.99)
- Complete Google Play purchase flow
- Verify product unlocked in app immediately
- Check receipt validation with backend
- Confirm no duplicate charges Expected: โ Purchase completes successfully โ Features unlock instantly โ Receipt validates correctly
Test Case 2: Restore Purchases
- Uninstall app
- Reinstall app
- Sign in with existing account
- Trigger "Restore Purchases"
- Verify all previous purchases restored Expected: โ All managed products restored โ Subscriptions remain active โ No duplicate purchase prompts
Test Case 3: Subscription Upgrade
- Start with monthly subscription ($9.99)
- Select "Upgrade to Yearly" ($89.99)
- Complete upgrade flow
- Verify proration applied correctly
- Check subscription status changed to yearly Expected: โ Upgrade completes without issues โ Proration calculated correctly โ Access continues uninterrupted
Test Case 4: Subscription Cancellation
- Navigate to subscription management
- Cancel active subscription
- Verify app still provides access until period end
- Check grace period behavior Expected: โ Cancellation processes โ Access maintained through paid period โ Grace period triggers correctly
### Push Notification Testing
**Comprehensive Notification Validation:**
```javascript
// Push notification test suite
const testPushNotifications = async () => {
const fcmServerKey = process.env.FCM_SERVER_KEY_NEW
const testDevices = [
{
name: 'Pixel 8 Pro (Android 14)',
fcmToken: 'device_token_001',
expectedDelivery: true,
},
{
name: 'Samsung Galaxy S24 (Android 14)',
fcmToken: 'device_token_002',
expectedDelivery: true,
},
{
name: 'OnePlus 12 (Android 14)',
fcmToken: 'device_token_003',
expectedDelivery: true,
},
]
for (const device of testDevices) {
console.log(`\nTesting push notifications on: ${device.name}`)
try {
// Test standard notification
const basicNotif = await sendNotification({
to: device.fcmToken,
notification: {
title: 'Transfer Test Notification',
body: 'Testing post-transfer push notifications',
icon: 'ic_notification',
},
data: {
test_id: 'transfer_validation',
timestamp: new Date().toISOString(),
},
})
console.log(`โ Basic notification sent: ${basicNotif.messageId}`)
// Test data-only notification (background)
const dataNotif = await sendNotification({
to: device.fcmToken,
data: {
type: 'silent_sync',
action: 'sync_subscriptions',
timestamp: new Date().toISOString(),
},
})
console.log(`โ Data notification sent: ${dataNotif.messageId}`)
// Test notification with action buttons
const actionNotif = await sendNotification({
to: device.fcmToken,
notification: {
title: 'Subscription Renewal',
body: 'Your premium subscription will renew tomorrow',
click_action: 'SUBSCRIPTION_SETTINGS',
},
data: {
action: 'subscription_reminder',
subscription_id: 'premium_monthly',
},
})
console.log(`โ Action notification sent: ${actionNotif.messageId}`)
} catch (error) {
console.error(
`โ Notification test failed on ${device.name}: ${error.message}`
)
}
}
}
// Test notification categories
const testNotificationCategories = async () => {
const categories = [
{
name: 'Marketing',
importance: 'default',
testMessage: 'New feature announcement',
},
{
name: 'Transactional',
importance: 'high',
testMessage: 'Payment successful',
},
{
name: 'System',
importance: 'max',
testMessage: 'Security alert',
},
]
for (const category of categories) {
console.log(`\nTesting category: ${category.name}`)
// Verify notification channels created and functional
// Test notification delivery and display behavior
}
}
App Store Listing Validation
Automated Store Presence Checks:
# store_listing_validator.py
import requests
from bs4 import BeautifulSoup
def validate_apple_listing(app_id):
"""Validate Apple App Store listing integrity post-transfer"""
url = f"https://apps.apple.com/app/id{app_id}"
response = requests.get(url)
if response.status_code != 200:
return {"success": False, "error": "App not found"}
soup = BeautifulSoup(response.content, 'html.parser')
checks = {
"app_available": response.status_code == 200,
"title_present": bool(soup.find('h1', class_='product-header__title')),
"description_present": bool(soup.find('div', class_='section__description')),
"screenshots_present": len(soup.find_all('picture', class_='we-artwork__image')) > 0,
"rating_visible": bool(soup.find('span', class_='we-rating-count')),
"price_displayed": bool(soup.find('li', class_='inline-list__item--bulleted'))
}
return {
"success": all(checks.values()),
"checks": checks,
"url": url
}
def validate_google_listing(package_name):
"""Validate Google Play Store listing integrity post-transfer"""
url = f"https://play.google.com/store/apps/details?id={package_name}"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code != 200:
return {"success": False, "error": "App not found"}
soup = BeautifulSoup(response.content, 'html.parser')
checks = {
"app_available": response.status_code == 200,
"title_present": bool(soup.find('h1', itemprop='name')),
"description_present": bool(soup.find('div', itemprop='description')),
"screenshots_present": len(soup.find_all('img', itemprop='image')) > 0,
"rating_visible": bool(soup.find('div', class_='BHMmbe')),
"install_button": bool(soup.find('button', {'aria-label': lambda x: x and 'Install' in x}))
}
return {
"success": all(checks.values()),
"checks": checks,
"url": url
}
# Run validation
apple_result = validate_apple_listing("123456789")
google_result = validate_google_listing("com.example.app")
print("Apple Store Validation:", apple_result)
print("Google Play Validation:", google_result)
Deployment & Production Considerations
Monitoring Strategy
Real-Time Transfer Monitoring Dashboard
Key Metrics to Track:
# monitoring-config.yml
transfer_monitoring:
critical_metrics:
- name: active_installations
threshold_drop: 5%
alert_priority: P1
- name: crash_rate
threshold_increase: 2%
alert_priority: P1
- name: subscription_renewal_rate
threshold_drop: 10%
alert_priority: P0
- name: iap_conversion_rate
threshold_drop: 15%
alert_priority: P1
- name: push_notification_delivery
threshold_drop: 5%
alert_priority: P2
warning_metrics:
- name: app_store_reviews_rating
threshold_drop: 0.3_stars
alert_priority: P2
- name: session_length
threshold_drop: 20%
alert_priority: P3
- name: api_latency
threshold_increase: 500ms
alert_priority: P2
alerting:
channels:
- type: pagerduty
service_key: ${PAGERDUTY_SERVICE_KEY}
priority: [P0, P1]
- type: slack
webhook: ${SLACK_WEBHOOK_URL}
channel: '#app-transfers'
priority: [P1, P2, P3]
- type: email
recipients:
- vp-engineering@company.com
- mobile-lead@company.com
priority: [P0, P1]
Post-Transfer Monitoring Period
First 24 Hours - Critical Monitoring:
Hour 0-1: Transfer Completion โ Verify apps visible in new accounts โ Check store listings load correctly โ Confirm in-app purchases available โ Test subscription status API โ Validate push notification delivery Hour 1-6: Initial User Activity โ Monitor crash reports (expect baseline) โ Track active users (should match historical) โ Check purchase completion rates โ Monitor API error rates โ Review customer support tickets Hour 6-24: Stabilization Period โ Analyze full day of metrics โ Compare to pre-transfer baseline โ Review any anomalies or outliers โ Adjust monitoring thresholds โ Document any issues encountered
Days 2-7 - Validation Period:
Daily Checks: โก Active users trending as expected โก Subscription renewals processing normally โก No spike in uninstalls or negative reviews โก Push notifications delivering consistently โก In-app purchase flow functioning โก Backend API performance stable โก Error rates within normal ranges Weekly Analysis: โก Week-over-week metrics comparison โก Revenue impact assessment โก Customer satisfaction metrics โก Support ticket analysis โก App store rating trends
Days 8-30 - Long-Term Validation:
Weekly Monitoring: โก Monthly Active Users (MAU) trending โก Revenue by product SKU โก Subscription churn rates โก App store visibility/ranking โก Organic download trends Monthly Business Review: โก Financial impact of transfer โก Operational efficiency gains โก Customer retention analysis โก Marketing performance post-transfer โก Strategic recommendations
Rollback Procedures
Apple App Store - Limited Rollback Options
Critical Limitation
Apple app transfers are IRREVERSIBLE once completed. There is NO official rollback mechanism.
Mitigation Strategies
Strategy 1: Parallel App Approach (Pre-Transfer)
- Publish duplicate app with new Bundle ID in destination account
- Migrate users gradually before initiating transfer
- Maintain both apps during transition period
- Deprecate old app after transfer validation
Strategy 2: Emergency Response Plan
If critical issues arise post-transfer:
-
Immediate Actions: โก Disable in-app purchases temporarily โก Pull app from App Store if severity warrants โก Deploy hotfix release ASAP โก Communicate with users via push notifications
-
Technical Remediation: โก Revert to last known good version โก Emergency deployment through TestFlight โก Expedited app review request (if critical bug)
-
Business Continuity: โก Activate customer support escalation procedures โก Offer prorated refunds if subscriptions affected โก Document all issues for post-incident review
### Google Play Store - Controlled Rollback ```markdown
Rollback Capability
Google Play allows reverting to previous APK versions if critical issues arise post-transfer.
Rollback Procedure
Immediate Rollback (Within 48 Hours)
If transfer waiting period still active:
- Log in to Google Play Console (source OR destination)
- Navigate to transfer request
- Click "Cancel transfer"
- Confirm cancellation
- Apps remains with original owner
Post-Transfer Version Rollback
If app has issues after transfer completes:
-
Access Production Track:
- Play Console โ Release โ Production
- View current release
-
Initiate Rollback:
- Click "Rollback to previous version"
- Select last stable version before transfer
- Confirm rollback percentage (recommend 100%)
-
Staged Rollout Option:
- If unsure, rollback to 50% of users first
- Monitor for 24 hours
- Increase to 100% if stable
-
Emergency Hotfix Deployment:
- Build critical fix immediately
- Upload to Internal Testing track
- Promote to Production as soon as validated
- Can bypass staged rollout for P0 issues
Data Consistency Considerations
- User data in backend must remain consistent
- Subscription states synchronized
- Analytics tracking maintained
- Push notification tokens remain valid
Scaling Considerations
Multi-App Portfolio Transfers
Phased Transfer Strategy:
Phase 1: Pilot Transfer (Week 1)
- Select lowest-risk app (lowest MAU, simplest monetization)
- Execute complete transfer process
- Validate all systems and procedures
- Document lessons learned
- Success criteria: Zero critical issues, less than 2% metric deviation
Phase 2: Low-Risk Apps (Weeks 2-4)
- Transfer 3-5 apps with similar characteristics
- Process 1 app per week
- Apply lessons from pilot
- Monitor cumulative impact
- Success criteria: Consistent performance across apps
Phase 3: Medium-Risk Apps (Weeks 5-8)
- Transfer apps with moderate MAU (100K-1M)
- Include apps with subscriptions
- Coordinate with marketing for user communications
- Success criteria: Subscription continuity >98%
Phase 4: High-Risk Apps (Weeks 9-12)
- Transfer flagship products (>1M MAU)
- Plan for extended monitoring period
- Have dedicated support team on standby
- Execute during lowest traffic period
- Success criteria: less than 1% impact on key business metrics
### Enterprise-Scale Transfer Considerations From leading app portfolio transfers for Fortune 500 companies, these enterprise patterns are critical: **Compliance Documentation:** ```markdown
Required Documentation Package
-
Executive Summary
- Business rationale for transfer
- Risk assessment and mitigation
- Timeline and milestones
- Success metrics
-
Technical Architecture Review
- Current state architecture diagrams
- Target state post-transfer
- Integration dependencies
- Data flow documentation
-
Legal & Compliance
- Transfer authorization letters
- Entity verification documents
- Privacy policy updates
- Terms of service modifications
- GDPR/CCPA compliance attestations
- Audit trail documentation
-
Financial Impact Analysis
- Revenue impact projections
- Cost analysis (one-time and recurring)
- ROI calculation
- Risk-adjusted financial model
-
Communication Plans
- Internal stakeholder communications
- User communications (if required)
- Customer support briefings
- Executive status reporting cadence
**Cross-Functional Coordination:** ```markdown
Transfer Steering Committee
Role Assignments:
- Executive Sponsor: VP Engineering / CTO
- Program Manager: Senior Project Manager
- Technical Lead: Principal Mobile Engineer
- Legal Counsel: Corporate Attorney
- Finance Lead: Finance Controller
- Security Lead: CISO / Security Engineer
- Support Lead: Customer Support Manager
Meeting Cadence:
- Pre-Transfer: Weekly status meetings
- During Transfer: Daily standups
- Post-Transfer: Daily (Week 1), Weekly (Weeks 2-4)
Decision Framework:
- Routine decisions: Technical Lead
- Financial impact >$50K: Finance Lead approval
- Risk score >5: Executive Sponsor approval
- Legal concerns: Legal Counsel approval
- Customer impact >10K users: Full committee review
--- # Next Steps & Advanced Topics
Immediate Next Steps
Now that you understand the complete app transfer process, here's your action plan:
Week 1 - Planning & Preparation:
- Review this tutorial completely
- Audit your current app infrastructure
- Document all third-party integrations
- Verify destination account requirements met
- Prepare legal documentation package
- Create detailed transfer project plan
Week 2 - Validation & Testing:
- Set up monitoring and alerting infrastructure
- Create comprehensive test plan
- Validate backup and rollback procedures
- Conduct dry-run with test app (if possible)
- Brief all stakeholders on process
Week 3 - Execution:
- Execute transfer during low-traffic window
- Monitor critical metrics continuously
- Validate all functionality post-transfer
- Update all dependent systems and services
- Deploy communications to relevant parties
Week 4 - Optimization:
- Analyze transfer metrics and outcomes
- Document lessons learned
- Update organizational procedures
- Conduct post-transfer retrospective
- Plan for next phase (if portfolio transfer)
Advanced Transfer Topics
Handling Complex Subscription Migration
Multi-Tier Subscription Structures:
When transferring apps with complex subscription offerings, consider these advanced patterns:
// Advanced subscription migration validator
const validateComplexSubscriptions = async () => {
// Validate subscription groups
const groups = await getSubscriptionGroups()
for (const group of groups) {
// Check all tiers within group
console.log(`Validating group: ${group.name}`)
// Verify upgrade/downgrade paths maintained
const upgradePaths = await validateUpgradePaths(group)
// Confirm grace period configurations
const gracePeriods = await validateGracePeriods(group)
// Check proration settings
const prorationSettings = await validateProration(group)
// Validate family sharing eligibility (Apple)
if (platform === 'apple') {
const familySharing = await validateFamilySharing(group)
}
// Verify offer codes still active (Apple)
if (platform === 'apple') {
const offerCodes = await validateOfferCodes(group)
}
}
}
Cross-Platform User Data Synchronization
Maintaining User State Across Transfers:
// Comprehensive user state migration
interface UserMigrationState {
userId: string
platform: 'ios' | 'android'
subscriptionStatus: {
productId: string
status: 'active' | 'cancelled' | 'expired' | 'trial'
expiryDate: Date
autoRenew: boolean
}
purchases: Array<{
productId: string
purchaseDate: Date
transactionId: string
}>
preferences: {
notifications: boolean
emailMarketing: boolean
dataSharing: boolean
}
}
const migrateUserState = async (userId: string) => {
// Fetch current state
const currentState = await getUserState(userId)
// Validate subscription status
const validatedSubscription = await validateWithPlatform(
currentState.platform,
currentState.subscriptionStatus
)
// Migrate to new system
await saveUserState({
...currentState,
subscriptionStatus: validatedSubscription,
migrationDate: new Date(),
sourceAccount: 'old-account-id',
destinationAccount: 'new-account-id',
})
// Verify migration success
const verifiedState = await getUserState(userId)
assert.deepEqual(verifiedState.subscriptionStatus, validatedSubscription)
}
Regulatory Compliance During Transfers
GDPR Considerations:
GDPR Compliance Checklist for App Transfers
Data Controller Change Notification
โก Identify if transfer constitutes data controller change โก Prepare user notification if required (30-day notice) โก Update privacy policy to reflect new entity โก Document legal basis for data processing continuation
Data Processing Agreements
โก Review and update DPAs with third-party processors โก Ensure new entity covered under existing agreements โก Transfer consent records to new entity โก Update data subject rights request procedures
Technical & Organizational Measures
โก Verify security measures maintained post-transfer โก Confirm data encryption standards unchanged โก Validate access controls remain appropriate โก Review incident response procedures
User Rights
โก Maintain user data access capabilities โก Preserve right to erasure functionality โก Ensure data portability remains available โก Update contact information for privacy requests
Community Resources
Official Documentation
Apple Resources:
Google Resources:
- Transfer apps to another developer account - Play Console Help
- Google Play Console Help Center
- Google Play Billing Documentation
GitHub Repository
The complete code examples, scripts, and checklists from this tutorial are available in our GitHub repository:
crashbytes-tutorial-app-transfer-checklist
Repository includes:
- Validation scripts for both platforms
- Monitoring configuration templates
- Documentation templates
- Migration checklists
- Rollback procedure documentation
Related CrashBytes Tutorials
Mobile Platform Engineering:
- Tutorial: Production-Ready CI/CD for Mobile Apps
- Tutorial: Implementing Mobile App Observability
- Tutorial: Advanced Mobile App Security Patterns
Platform Operations:
Troubleshooting Common Transfer Issues
Apple-Specific Issues
Issue: Transfer Button Disabled
Symptoms: - "Transfer App" button is greyed out in App Store Connect - No option to initiate transfer visible Resolution: 1. Verify app published for >60 days - Check app's first release date - Cannot transfer newer apps 2. Check for pending app review submissions - Navigate to App Store Connect โ My Apps โ [App Name] - Look for "In Review" or "Pending Developer Release" status - Wait for review to complete before transferring 3. Resolve any policy violations - Check for unresolved issues in Resolution Center - Address all outstanding violations 4. Verify account permissions - Ensure you have Admin or Account Holder role - Legal or Account Holder must initiate transfer
Issue: Destination Account Not Found
Symptoms: - Error message: "The destination team could not be found" - Transfer request fails during submission Resolution: 1. Verify Team ID accuracy - Team ID is case-sensitive - Must be exactly 10 characters (9 for some older accounts) - Found in destination account: Account โ Membership 2. Confirm destination account enrolled - Must be active Apple Developer Program member - Program license agreement must be accepted - Payment method must be current 3. Check account type compatibility - Individual accounts can receive transfers - Organization accounts strongly recommended - Education accounts may have restrictions
Google-Specific Issues
Issue: "This account cannot receive transferred apps"
Symptoms: - Transfer fails with account type error - Cannot complete destination account acceptance Resolution: 1. Convert to Organization account - Individual accounts CANNOT receive transfers - Must convert to Organization type first - Navigate: Settings โ Account details โ Account type - Follow conversion process (irreversible) 2. Complete organization verification - Upload business verification documents - Provide D-U-N-S number (US organizations) - Wait for Google verification (1-3 business days) 3. Set up payment profile - Navigate: Settings โ Payments profile - Add valid payment method - Complete tax information - Verify banking details
Issue: API Projects Not Transferring
Symptoms: - Google Cloud Projects remain with source account - API calls failing post-transfer - Service accounts no longer have access Resolution: 1. API projects do NOT transfer automatically - This is expected behavior - Must migrate Google Cloud Projects separately 2. Create new Google Cloud Project - Link to destination Play Console account - Enable required APIs - Create new service accounts 3. Update all API integrations - Replace service account keys in CI/CD - Update backend services with new credentials - Reconfigure publishing automation - Test all API-dependent functionality 4. Migrate Cloud Functions / App Engine (if used) - Redeploy to new project - Update environment variables - Verify all endpoints accessible
Universal Issues (Both Platforms)
Issue: Subscriptions Not Showing for Users
Symptoms: - Users report losing premium access - Subscription status API returns errors - "Restore Purchases" not working Resolution: 1. Verify receipt validation updated - Apple: Update shared secret (if using) - Google: New Google Cloud Project linked - Backend configured with new credentials 2. Check subscription status endpoints - Test with known active subscriber - Verify API responses match expected format - Confirm no authentication errors 3. Force receipt refresh in app - Trigger re-validation of all receipts - Update cached subscription states - Clear any local subscription caches 4. Monitor grace period behavior - Some subscriptions may enter grace period - Normal during transfer transition - Should auto-resolve within 24-48 hours
Issue: Push Notifications Not Delivering
Symptoms: - Users not receiving notifications - High notification failure rates in logs - Silent failures with no error messages Resolution: 1. Verify certificate/key updates - Apple: New APNs certificates generated - Google: FCM project migrated and linked - Backend services updated with new credentials 2. Test notification delivery manually - Send test notification to known device token - Check device logs for delivery - Verify notification permissions still granted 3. Check notification channel configuration (Android) - Channels should transfer with app - Verify importance levels maintained - Confirm no new permission requests needed 4. Validate token refresh logic - Tokens should remain valid post-transfer - Implement token rotation if issues persist - Monitor token refresh success rates
Success Metrics & KPIs
After completing your app transfer, measure success using these key performance indicators:
Technical Success Metrics:
- โ Zero increase in crash rate (week-over-week)
- โ Less than 2% deviation in key user engagement metrics
- โ 100% subscription continuity maintained
- โ Less than 1% increase in customer support tickets
- โ Zero downtime during transfer
Business Success Metrics:
- โ Revenue within 5% of pre-transfer baseline
- โ User retention rate maintained
- โ App store rating unchanged or improved
- โ Download velocity stable
- โ Subscription churn within normal range
Operational Success Metrics:
- โ Transfer completed within planned timeline
- โ All systems migrated successfully
- โ Documentation complete and accurate
- โ Team training completed
- โ Rollback capability validated (where possible)
Conclusion
Transferring apps between developers or companies on Apple App Store and Google Play Store is a complex but manageable process when approached systematically. Throughout this tutorial, we've covered:
โ Complete transfer workflows for both platforms โ Pre-transfer preparation and eligibility requirements โ Step-by-step execution procedures โ Post-transfer validation and monitoring โ Common pitfalls and troubleshooting solutions โ Production-scale considerations and best practices
The key to successful app transfers lies in thorough preparation, comprehensive testing, and vigilant monitoring. Don't rush the processโallocate sufficient time for each phase and maintain clear communication with all stakeholders.
Remember the Critical Differences:
- Apple: Transfers are irreversible; plan accordingly
- Google: Destination must be Organization account type
- Both: API projects and third-party services require separate migration
By following the procedures outlined in this tutorial and leveraging the resources provided in our GitHub repository, you'll be well-equipped to execute smooth, low-risk app ownership transfers.
For production deployments, consider engaging with experienced platform engineering teams who have led similar transfers at scale. The investment in expertise often pays for itself through reduced risk and faster time to completion.
Ready to start your transfer? Clone our GitHub repository for complete checklists, validation scripts, and templates to guide your journey.
Have questions or need assistance? Reach out through the CrashBytes contact page or connect with the mobile platform engineering community.
About the Author: Michael Eakins is a VP of Engineering with extensive experience leading mobile platform engineering teams and executing complex app transfers across regulated industries. He specializes in enterprise-scale mobile infrastructure and has successfully transferred 50+ apps across various industry verticals.
Last Updated: October 8, 2025
