I have released a free app on the App Store, and some users have already downloaded it. Recently, I want to change this app to a paid app. I would like to know if users who have already downloaded the app will need to pay for it. I understand that if users still have the app on their device, they can update it for free; but if users have uninstalled the app, will they be required to pay when they download it again?
Business Models
RSS for tagDiscuss various ways to structure your app, such as freemium or paid.
Posts under Business Models tag
11 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
Hi team,
My app was rejected, and I believe there may be a misunderstanding regarding our business model. I have provided detailed explanations and examples of similar apps, but I continue to receive the following standard response:
“Regarding 3.1.1, the app still uses a paid key to unlock or enable paid content. To resolve this issue, it would be appropriate to remove these features from the app and any other feature that unlocks or enables functionality with mechanisms other than the App Store.”
I have submitted an appeal today, but I’d appreciate any advice in the meantime. It’s possible that I’m not communicating our business model clearly, and I wonder if there’s a better way to explain it to the Apple Review Team.
Our app is a universal Xray VPN Client. It does not contain paid content. The app is free and allows users to connect to any VPN provider or self-hosted VPN server using VLESS/XTLS/Xray technology. Users obtain VPN keys from third-party providers, which can be either free or paid. Our app simply allows users to input these keys to connect to the VPN servers. There are no purchases or features unlocked within the app itself—users acquire keys externally from VPN providers or by setting up their own VPN servers. In certain regions, keys may even be distributed offline via local providers.
Our app functions similarly to a web browser, where users input links (VPN keys) to access content. Many apps on the Apple Store operate in this same manner, such as:
Streisand: https://apps.apple.com/ru/app/streisand/id6450534064?l=en-GB
V2Box: https://apps.apple.com/ru/app/v2box-v2ray-client/id6446814690?l=en-GB
ShadowRocket: https://apps.apple.com/ru/app/shadowrocket/id932747118?l=en-GB
V2RayTUN: https://apps.apple.com/ru/app/v2raytun/id6476628951?l=en-GB
FoXRay: https://apps.apple.com/ru/app/foxray/id6448898396?l=en-GB
V2RayU: https://apps.apple.com/ru/app/v2rayu-vm/id1622785357?l=en-GB
NpV Tunnel: https://apps.apple.com/ru/app/npv-tunnel/id1629465476?l=en-GB
Potatso: https://apps.apple.com/ru/app/potatso/id1239860606?l=en-GB
Fair VPN: https://apps.apple.com/ru/app/fair-vpn/id1533873488?l=en-GB
And many others.
I’m feeling stuck :( If anyone has suggestions or can point me to a specific clause in the Review Guidelines that could help, I would be really grateful!
Our application is a new app for multifinance in Indonesia and we got remove on 4th. It was stated we have violated 3.2(f) and 5.6.2
Has submit appeal separately on 5th, 12th and 23rd to clarify on the issue and we haven't received any updates yet
Kind of anxious here cause it was also mentioned that within 30 days our account will be terminated.
Any suggestion on this issue how should we do next step?
My application uses "paid" monetization model. I think in the productivity category it works quite well. However, when I advertise my application, 50% of the questions are: "is there a free trial?" and I would love to provide a free trial to potential customers, but the App Store doesn't allow me to do that. I don't understand why this feature is not available.
I even started considering migration to in-app purchases, but it's quite a big deal. I managed to establish quite a good profit and I'm worried how it would affect my positioning and results. On top of that, I really like the paid up-front model, because it solves many issues and doesn't need any extra implementation on my side.
I'm starting this thread to hear what you think about that and how many people are looking for this feature. I also created a feature request in Feedback Assistant: #FB13810170
Hi,
Thanks for getting back to me regarding my query. I'm developing a Cordova app that includes games with an initial free tier and additional tiers available through in-app purchases. Here’s a detailed explanation of what I’m aiming to achieve:
Users can play a set of games for free initially (Free Tier).
After playing a certain number of games, users can purchase additional game tiers:
Tier 1: Adds 3 more games.
Tier 2: Adds 6 more games.
Tier 3: Adds 9 more games.
Users can continue playing the games in any purchased tier indefinitely.
If users do not wish to purchase additional tiers, they can continue playing the free tier games with limited themes but without restrictions on play count.
Questions:
How can I configure App Store Connect to offer the Free Tier initially and then present the in-app purchase options for the additional tiers?
Is there a specific configuration in App Store Connect that supports this model, or do I need to handle this logic within the app itself?
I appreciate any guidance you can provide on setting this up correctly.
Best regards,
T
Hi,
I am developing Cordova apps/games with in-app purchase products as well as an initial product as non-paid (Free) tier: New users will be able to play freely for a set of games as default at the beginning. Then, if they would like to have more games with different set of attributes or themes, they can add more games with in-app purchases. It is similar to a game called Subway Surfers in App Store I would play in the past.
A new player initiates games as Free Tier. After, let us say 3 games, the user is asked if he/she would like to have more games to play with different scenes/themes in different Tiers, in addition to their disposal: Tier 1, Tier 2 and Tier 3. For example Tier 1 adds 3 more games into the Free Tier games so they can play 6 games in the set;Tier 2 add 6 more games and so 9 games they can play and so on. Each individual game in their set is a variant of others in differing Tiers. If they don't wish and play Free Tier games, they may play them too, with limited set of themes but infinite times.
If a user chooses a tier, let us say Tier 1, and when they play 6 games, they are asked if they would like advance to Tier 2 or Tier 3. If they choose Tier 2, as they complete the respective games they will be asked for Tier 3. However, if they don't wish to advance, again they can play current Tier games as many times as they wish.
It is like non-subscription apps then converted to subscription-based ones. In App Store Connect, I created a number of products for in-app purchases for an app.
How I can deliver this Free Tier games in the app and let users try it and allow them to choose in-app purchase products available in AppStore Connect.
I would appreciate response and support.
Best
Lexxyacc
I can't find the problem.. - The simulator is stopping after opening the app...
Database`property wrapper backing initializer of ContentViewViewModel.currentUserId:
0x104c12bd0 <+0>: sub sp, sp, #0x50
0x104c12bd4 <+4>: stp x29, x30, [sp, #0x40]
0x104c12bd8 <+8>: add x29, sp, #0x40
0x104c12bdc <+12>: str x8, [sp, #0x10]
0x104c12be0 <+16>: mov x8, x0
0x104c12be4 <+20>: str x8, [sp, #0x8]
0x104c12be8 <+24>: mov x0, x1
0x104c12bec <+28>: str x0, [sp, #0x18]
0x104c12bf0 <+32>: stur xzr, [x29, #-0x10]
0x104c12bf4 <+36>: stur xzr, [x29, #-0x8]
-> 0x104c12bf8 <+40>: stur x8, [x29, #-0x10]
0x104c12bfc <+44>: mov x1, x0
0x104c12c00 <+48>: stur x1, [x29, #-0x8]
0x104c12c04 <+52>: bl 0x1053b9a88 ; symbol stub for: swift_bridgeObjectRetain
0x104c12c08 <+56>: ldr x9, [sp, #0x8]
0x104c12c0c <+60>: ldr x8, [sp, #0x10]
0x104c12c10 <+64>: ldr x1, [sp, #0x18]
0x104c12c14 <+68>: add x0, sp, #0x20
0x104c12c18 <+72>: str x9, [sp, #0x20]
0x104c12c1c <+76>: str x1, [sp, #0x28]
0x104c12c20 <+80>: adrp x1, 2556
0x104c12c24 <+84>: ldr x1, [x1, #0xa00]
0x104c12c28 <+88>: bl 0x104c12c40 ; Combine.Published.init(wrappedValue: Value) -> Combine.Published<Value> at <compiler-generated>
0x104c12c2c <+92>: ldr x0, [sp, #0x18]
0x104c12c30 <+96>: bl 0x1053b91a0 ; symbol stub for: swift_bridgeObjectRelease
0x104c12c34 <+100>: ldp x29, x30, [sp, #0x40]
0x104c12c38 <+104>: add sp, sp, #0x50
0x104c12c3c <+108>: ret
//
// ContentViewViewModel.swift
// Database
//
// Created by Maxi on 25.03.24.
//
import Firebase
import FirebaseAuth
import Foundation
class ContentViewViewModel: ObservableObject {
@Published var currentUserId: String = ""
private var handler: AuthStateDidChangeListenerHandle?
init () {
self.handler = Auth.auth().addStateDidChangeListener{ [weak self] _, user in
DispatchQueue.main.async {
self?.currentUserId = user?.uid ?? ""
}
}
}
public var isSignedIn: Bool {
return Auth.auth().currentUser != nil
}
}
//
// ContentView.swift
// Database
//
// Created by Maxi on 25.03.24.
//
import Firebase
import FirebaseAuth
import SwiftUI
struct ContentView: View {
@StateObject var viewModel = ContentViewViewModel()
var body: some View {
VStack {
NavigationView {
if viewModel.isSignedIn, !viewModel.currentUserId.isEmpty {
//signed in
HomeView()
} else {
LoginView()
}
}
.padding()
}
}
}
struct ContentView_Previews: PreviewProvider{
static var previews: some View {
ContentView()
}
}
//
// HomeView.swift
// Database
//
// Created by Maxi on 25.03.24.
//
import SwiftUI
struct HomeView: View {
var body: some View {
Text("Welcome to your Account!")
}
}
#Preview {
HomeView()
}
//
// LoginViewViewModel.swift
// Database
//
// Created by Maxi on 25.03.24.
//
import FirebaseAuth
import Foundation
class LoginViewViewModel: ObservableObject {
@Published var email = ""
@Published var password = ""
@Published var errorMessage = ""
init() {}
func login() {
guard validate() else {
return
}
//Try log in
Auth.auth().signIn(withEmail: email, password: password)
}
private func validate() -> Bool {
errorMessage = ""
guard !email.trimmingCharacters(in: .whitespaces).isEmpty,
!password.trimmingCharacters(in: .whitespaces).isEmpty else {
errorMessage = "Bitte füllen Sie alle Felder aus."
return false
}
guard email.contains("@") && email.contains(".") else {
errorMessage = "Bitte geben Sie eine gültige Email-Adresse ein."
return false
}
return true
}
}
//
// LoginView.swift
// Database
//
// Created by Maxi on 25.03.24.
//
import SwiftUI
struct LoginView: View {
@StateObject var viewModel = LoginViewViewModel()
var body: some View {
NavigationView {
VStack {
//Header
HeaderView()
if !viewModel.errorMessage.isEmpty{
Text(viewModel.errorMessage)
.foregroundColor(Color.red)
}
Form{
TextField("E-Mail Adresse", text: $viewModel.email)
.textFieldStyle(DefaultTextFieldStyle())
.autocapitalization(/*@START_MENU_TOKEN@*/.none/*@END_MENU_TOKEN@*/)
SecureField("Passwort", text: $viewModel.password)
.textFieldStyle(DefaultTextFieldStyle())
CreateAccountButton(
title: "Anmelden",
background: .blue) {
viewModel.login()
}
}
//Create ACC
VStack {
Text ("Neu hier?")
//Show registartion
NavigationLink ("Erstelle einen Account",
destination: RegisterView())
}
}
}
}
}
struct LoginView_Previews: PreviewProvider{
static var previews: some View {
LoginView()
}
}
Hi everyone, is it possible to launch my app for free first and then convert it to freemium with in-app purchases? Since I currently have very little content in my app, I want to focus on releasing it for free and collecting user feedback first. Afterwards, I want to convert it to freemium. Is there such a possibility?
After I submitted our app, it was rejected with reasons:
`"Regarding 5.1.1, the following fields or actions are required for registration but do not appear to be directly relevant to your app’s core functionality:
Thai National ID
Phone number.
To resolve this issue, it would be appropriate to either remove all required fields that are not relevant to the app or make those fields optional."`
I need the two fields above. How can I resolve it? I asked reviewer but they said they cannot help detail feature for us.
About phone numbers, our system wants to send SMS to them, change passwords, and send notification. Step: (edit profile -> edit phone number -> verify OTP) to change password you can check it.
About Thai National ID, do you think it can be suitable when we use it for KYC, and verify customers? Actually, when the user registers a new account, if we do not approve the account, means KYC is unsuccess, the user will not use any main features (Saving and interest pay invoice). We are using Thai national ID and password to login.
We continue to find in our review that your app is intended to be used by a specific business or organization, including partners, clients, or employees, but you've selected public distribution on the App Store in App Store Connect. Since the App Store is intended for apps with a public audience, we recommend reviewing the other distribution options available to you through your Apple Developer Program Account.
Next Steps
To resolve this issue, review the other distribution options available for apps designed for specific businesses or organizations and choose a distribution option that works for your app and users. You can review these
I am not able to resolve the above issue kindly help.
Guideline 3.2 - Business
We found in our review that your app is intended to be used by a specific business or organization, including partners, clients, or employees, but you've selected public distribution on the App Store in App Store Connect. Since the App Store is intended for apps with a public audience, we recommend reviewing the other distribution options available to you through your Apple Developer Program Account.
Next Steps
To resolve this issue, review the other distribution options available for apps designed for specific businesses or organizations and choose a distribution option that works for your app and users. You can review these app distribution options on Apple Developer.
How to resolve this issue - when my
App's Business Model is - Business - to - Business Model
and my app doesn't involve Registration Technique.
If somebody has any information on this issue, Please Guide us.