Create Remote Config
Create Remote Configs to manage your onboarding flows, paywall UI, or pricing settings, avoiding extra app releases
The Remote Config feature helps you change your onboarding flows, paywall UI, or pricing settings without additional app releases. Moreover, it enables you to rapidly iterate with your monetization experiments
1. Create in-app configuration
Qonversion Remote Config provides you with flexible in-app values using which you can set up any behavior and appearance of your app. The core of these in-app values is a plain JSON file consisting of key-value data. We support the following data types:
- String.
- Use this option to validate pricing, communication, or visual hypothesis.
- Examples: native.subs.full.v4.w.8.99.trial.7d, Unlock Fast and Secure Browsing, #3076FF, etc.
- Number.
- Use this option, for example, to show only a subset of your onboarding screens.
- Examples: 2, 5, 23, etc.
- Boolean.
- Use this option to turn on or off some features.
- Examples: true, false
- Json.
- Use this option to validate advanced changes in your app's behavior.
- Examples:
{"banner_text": "Choose your plan", "product_top": "native.subs.full.v4.w.8.99.trial.7d", "product_bottom": "subs.month.17.99", "skip_onboarding": true}
.

Integrate changes into your app
To receive the configuration, call the Qonversion remoteConfig
method.
Qonversion.shared().remoteConfig { remoteConfig, error in
// JSON payload you have configured using the Qonversion dashboard.
remoteConfig.payload
// Source of the configuration.
remoteConfig.source
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.source.type
// Either experiment's or remote config's ID.
remoteConfig.source.identifier
// Either experiment's or remote config's name.
remoteConfig.source.name
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.source.assignmentType
// Object with the experiment's information.
remoteConfig.experiment
// Experiment's identifier.
remoteConfig.experiment.identifier
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.name
// Experiment's group the user has been assigned to.
remoteConfig.experiment.group
// Experiment group's identifier.
remoteConfig.experiment.group.identifier
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.group.name
// Type of the experiment's group. Either control or treatment.
remoteConfig.experiment.group.type
}
[[Qonversion sharedInstance] remoteConfig:^(QONRemoteConfig * _Nullable remoteConfig, NSError * _Nullable error) {
// JSON payload you have configured using the Qonversion dashboard.
remoteConfig.payload
// Source of the configuration.
remoteConfig.source
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.source.type
// Either experiment's or remote config's ID.
remoteConfig.source.identifier
// Either experiment's or remote config's name.
remoteConfig.source.name
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.source.assignmentType
// Object with the experiment's information.
remoteConfig.experiment
// Experiment's identifier.
remoteConfig.experiment.identifier
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.name
// Experiment's group the user has been assigned to.
remoteConfig.experiment.group
// Experiment group's identifier.
remoteConfig.experiment.group.identifier
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.group.name
// Type of the experiment's group. Either control or treatment.
remoteConfig.experiment.group.type
}];
Qonversion.shared.remoteConfig(object : QonversionRemoteConfigCallback {
override fun onSuccess(remoteConfig: QRemoteConfig) {
//JSON payload you have configured using the Qonversion dashboard.
remoteConfig.payload
// Source of the configuration.
remoteConfig.source
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.source.type
// Either experiment's or remote config's ID.
remoteConfig.source.identifier
// Either experiment's or remote config's name.
remoteConfig.source.name
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.source.assignmentType
// Object with the experiment's information.
remoteConfig.experiment
// Experiment's identifier.
remoteConfig.experiment.id
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.name
// Experiment's group the user has been assigned to.
remoteConfig.experiment.group
// Experiment group's identifier.
remoteConfig.experiment.group.id
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.group.name
// Type of the experiment's group. Either control or treatment.
remoteConfig.experiment.group.type
}
override fun onError(error: QonversionError) {
// handle error
}
})
Qonversion.getSharedInstance().remoteConfig(new QonversionRemoteConfigCallback() {
@Override
public void onSuccess(@NonNull QRemoteConfig remoteConfig) {
//JSON payload you have configured using the Qonversion dashboard.
remoteConfig.getPayload()
// Source of the configuration.
remoteConfig.getSource()
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.getSource().getType()
// Either experiment's or remote config's ID.
remoteConfig.getSource().getIdentifier()
// Either experiment's or remote config's name.
remoteConfig.getSource().getName()
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.getSource().getAssignmentType()
// Object with the experiment's information.
remoteConfig.getExperiment()
// Experiment's identifier.
remoteConfig.getExperiment().getId()
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.getExperiment().getName()
// Experiment's group the user has been assigned to.
remoteConfig.getExperiment().getGroup()
// Experiment group's identifier.
remoteConfig.getExperiment().getGroup().getId()
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.getExperiment().getGroup().getName()
// Type of the experiment's group. Either control or treatment.
remoteConfig.getExperiment().getGroup().getType()
}
@Override
public void onError(@NonNull QonversionError error) {
// handle error
}
});
const remoteConfig = await Qonversion.getSharedInstance().remoteConfig();
//JSON payload you have configured using the Qonversion dashboard.
remoteConfig.payload
// Source of the configuration.
remoteConfig.source
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.source.type
// Either experiment's or remote config's ID.
remoteConfig.source.identifier
// Either experiment's or remote config's name.
remoteConfig.source.name
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.source.assignmentType
// Object with the experiment's information.
remoteConfig.experiment
// Experiment's identifier.
remoteConfig.experiment.id
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.name
// Experiment's group the user has been assigned to.
remoteConfig.experiment.group
// Experiment group's identifier.
remoteConfig.experiment.group.id
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.group.name
// Type of the experiment's group. Either control or treatment.
remoteConfig.experiment.group.type
final remoteConfig = await Qonversion.getSharedInstance().remoteConfig();
//JSON payload you have configured using the Qonversion dashboard.
remoteConfig.payload
// Source of the configuration.
remoteConfig.source
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.source.type
// Either experiment's or remote config's ID.
remoteConfig.source.identifier
// Either experiment's or remote config's name.
remoteConfig.source.name
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.source.assignmentType
// Object with the experiment's information.
remoteConfig.experiment
// Experiment's identifier.
remoteConfig.experiment.id
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.name
// Experiment's group the user has been assigned to.
remoteConfig.experiment.group
// Experiment group's identifier.
remoteConfig.experiment.group.id
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.group.name
// Type of the experiment's group. Either control or treatment.
remoteConfig.experiment.group.type
Qonversion.GetSharedInstance().RemoteConfig((remoteConfig, error) =>
{
//JSON payload you have configured using the Qonversion dashboard.
remoteConfig.Payload
// Source of the configuration.
remoteConfig.Source
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.Source.Type
// Either experiment's or remote config's ID.
remoteConfig.Source.Identifier
// Either experiment's or remote config's name.
remoteConfig.Source.Name
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.Source.AssignmentType
// Object with the experiment's information.
remoteConfig.Experiment
// Experiment's identifier.
remoteConfig.Experiment.Id
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.Experiment.Name
// Experiment's group the user has been assigned to.
remoteConfig.Experiment.Group
// Experiment group's identifier.
remoteConfig.Experiment.Group.Id
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.Experiment.Group.Name
// Type of the experiment's group. Either control or treatment.
remoteConfig.Experiment.Group.Type
});
const remoteConfig = await Qonversion.getSharedInstance().remoteConfig();
//JSON payload you have configured using the Qonversion dashboard.
remoteConfig.payload
// Source of the configuration.
remoteConfig.source
// One of the following: experiment control group, experiment treatment group, remote configuration.
remoteConfig.source.type
// Either experiment's or remote config's ID.
remoteConfig.source.identifier
// Either experiment's or remote config's name.
remoteConfig.source.name
// How the current payload was assigned to the user. Either automatically or manually.
remoteConfig.source.assignmentType
// Object with the experiment's information.
remoteConfig.experiment
// Experiment's identifier.
remoteConfig.experiment.id
// Experiment's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.name
// Experiment's group the user has been assigned to.
remoteConfig.experiment.group
// Experiment group's identifier.
remoteConfig.experiment.group.id
// Experiment group's name. The same as you set in Qonversion. You can use it for analytical purposes.
remoteConfig.experiment.group.name
// Type of the experiment's group. Either control or treatment.
remoteConfig.experiment.group.type
Please, note:
- If you're using the Qonversion Experiments feature, the
remoteConfig
object will also contain experiment-related fields. - Qonversion assigns eligible users to launched experiments once the
remoteConfig
is called. We also recommend paying attention to the Segmentation rules for the configuration.
Test changes before launch
We highly recommend testing if your app works properly with the changes you want to roll out to your users. You can do so by following the following steps:
- Copy the ID for your remote config

- Pass the values to Qonversion SDK by using the
attachUserToRemoteConfiguration
method
Qonversion.shared().attachUser(toRemoteConfiguration: "your_remote_configuration_id") { success, error in
// handle result
}
[[Qonversion sharedInstance] attachUserToRemoteConfiguration:@"your_remote_configuration_id" completion:^(BOOL success, NSError * _Nullable error) {
// handle result
}];
Qonversion.shared.attachUserToRemoteConfiguration("your_remote_configuration_id", object : QonversionRemoteConfigurationAttachCallback {
override fun onSuccess() {
// handle success
}
override fun onError(error: QonversionError) {
// handle error
}
})
Qonversion.getSharedInstance().attachUserToRemoteConfiguration("your_remote_configuration_id", new QonversionRemoteConfigurationAttachCallback() {
@Override
public void onSuccess() {
// handle success
}
@Override
public void onError(@NonNull QonversionError error) {
// handle error
}
});
await Qonversion.getSharedInstance().attachUserToRemoteConfiguration("your_remote_configuration_id");
await Qonversion.getSharedInstance().attachUserToRemoteConfiguration("your_remote_configuration_id");
Qonversion.GetSharedInstance().AttachUserToRemoteConfiguration("your_remote_configuration_id", (success, error) =>
{
// handle result
});
await Qonversion.getSharedInstance().attachUserToRemoteConfiguration("your_remote_configuration_id");
- In case your user has already been attached to another configuration, use the
detachUserFromRemoteConfiguration
method.
Qonversion.shared().detachUser(fromRemoteConfiguration: "attached_remote_configuration_id") { success, error in
// handle result
}
[[Qonversion sharedInstance] detachUserFromRemoteConfiguration:@"attached_remote_configuration_id" completion:^(BOOL success, NSError * _Nullable error) {
// handle result
}];
Qonversion.shared.detachUserFromRemoteConfiguration("attached_remote_configuration_id", object : QonversionRemoteConfigurationAttachCallback {
override fun onSuccess() {
// handle success
}
override fun onError(error: QonversionError) {
// handle error
}
})
Qonversion.getSharedInstance().detachUserFromRemoteConfiguration("attached_remote_configuration_id", new QonversionRemoteConfigurationAttachCallback() {
@Override
public void onSuccess() {
// handle success
}
@Override
public void onError(@NonNull QonversionError error) {
// handle error
}
});
await Qonversion.getSharedInstance().detachUserFromRemoteConfiguration("attached_remote_configuration_id");
await Qonversion.getSharedInstance().detachUserFromRemoteConfiguration("attached_remote_configuration_id");
Qonversion.GetSharedInstance().DetachUserFromRemoteConfiguration("attached_remote_configuration_id", (success, error) =>
{
// handle result
});
await Qonversion.getSharedInstance().detachUserFromRemoteConfiguration("attached_remote_configuration_id");
- Call the Qonversion
remoteConfig
method. Now Qonversion SDK returns data associated with previously set remote config. - Validate your app logic without launching the configuration.
Pay attention before release
Do not forget to remove the usage of the
attachUserToRemoteConfiguration
method before your app release. Otherwise, all your users may be exposed to only one remote config.
2. Segment users
Qonversion Remote Config has a flexible set of options to target a desired user segment.
Segment users by:
- App install date
- Use this option to assign the configuration only to new app installs.
- App version
- Use this option to assign the configuration only for users with the app version with the new features implemented.
- Country
- Use this option to run new behavior only in selected countries.
- Store
- Use this option to target only a specific store (Apple App Store or Google Play).
- User's active subscription
- User this option to target only users with/without any active subscriptions or having a specific one.

3. Launch the configuration
Once you have added all the necessary properties to your in-app configuration, validated changes in your app, and assigned desired segmentation rules, the only thing left is to click the Create button to move the configuration from Draft to Active state.

Updated about 1 month ago