Remote Config enables dynamic modification of application behavior and appearance without releasing app updates. By fetching key-value parameters from the Countly server, applications can deliver personalized user experiences, run A/B experiments, and roll out features safely and all managed from the Countly dashboard.
The Remote Config and A/B Testing features are available in Countly Enterprise and as an add-on in Flex.
What is Remote Config?
Remote Config is a server-driven key-value system that allows teams to control application behavior without code deployments. Parameters defined on the Countly dashboard are fetched by client SDKs at runtime and applied locally.
There are three fundamental principles to understand:
- Parameter, a named key-value pair (e.g., button_color = "#FF5733") that the app reads at runtime to control behavior or appearance.
- Condition, a rule set (based on Cohorts, Events, or User Properties) that assigns different parameter values to different user segments.
- Default Value, the baseline value served when no condition matches a given user.
You can reach out more detailed information from guide below.
SDK Integration
Make sure the SDK and SDK version you will use supports Remote Config feature. To configure the SDKs in the simplest manner, you can follow the quick access guide below to start up your Remote Config journey in the SDKs.
The role of the SDK integration is to fetch the Remote Config parameters (like button_color: blue). SDKs only fetches these values for you. Your app has the responsibility to use it for the desired effect.
You can overview documentation below to learn remote config communication between SDKs and the Server:
Use Cases
Feature Flags
New features can be shipped rapidly. However, issues may arise after launch, or certain features may need to be discontinued or rolled back. Gating features behind flags mitigates these risks significantly. A flagged feature can be enabled or disabled instantly from the dashboard, no hotfix required, no waiting for store review approval.
Dashbord Setup:
Parameter: chat_enabled - default value: true
If issues arise, flip the value to false
SDK Setup
value = RemoteConfig.getValue("chat_enabled")
chatEnabled = (value is not null) ? value : false
IF chatEnabled THEN
showChatFeature()
ELSE
hideChatFeature()
END IFUI/UX Personalization
Not every user should see the same interface. A retail app might want to show different homepage banners based on user region; promotional hero image for US users, a GDPR-friendly minimal banner for European users, and a neutral fallback for everyone else. Remote Config conditions based on user properties like locale make this straightforward, with no code changes needed to add or swap variants.
Dashbord Setup:
Parameter: homepage_banner
Condition A (User Property: locale contains en_US):
{ "type": "hero_banner", "image_url": "https://cdn.example.com/us_hero.jpg" }Condition B (User Property: locale contains de_DE, fr_FR, …):
{ "type": "compact_banner", "image_url": "https://cdn.example.com/eu_compact.jpg" } Default:
{ "type": "default_banner", "image_url": "https://cdn.example.com/default.jpg" }SDK Setup
value = RemoteConfig.getValue("homepage_banner")
IF value is not null AND value is Object THEN
imageUrl = value["image_url"] OR DEFAULT_BANNER_URL
type = value["type"] OR "default_banner"
renderBanner(imageUrl, type)
END IFGradual Rollouts
Rolling out a new feature to every user at once is risky. Gradual rollouts let you expose a change to a small percentage of users first, monitor crash rates and engagement metrics, then widen the audience in stages. If something goes wrong, only a fraction of users are affected and you can roll back instantly.
Dashboard Setup:
Parameter: new_map_view - default value: false
Condition: Random Percentile 0–10% - value: true
Increase the percentile range over time as confidence grows (0–50%, then remove the condition entirely for 100%).
SDK Setup
value = RemoteConfig.getValue("new_map_view")
useNewMap = (value is not null) ? value : false
IF useNewMap THEN
initNewMapView()
ELSE
initLegacyMapView()
END IFEnvironment-Based Configuration
Cross-platform applications often need different behavior depending on the device or environment. Mobile clients on cellular networks may need longer timeouts, while beta builds benefit from verbose logging. Remote Config lets you tailor these values per platform without maintaining separate builds.
Dashboard Setup:
Parameter: api_timeout_ms - default value: 5000
Condition (User Property: _os = Android OR iOS): 10000
Parameter: log_level - default value: "error"
Condition (User Property: _os = Android OR iOS): "debug"
SDK Setup
timeout = RemoteConfig.getValue("api_timeout_ms") OR 5000
logLevel = RemoteConfig.getValue("log_level") OR "error"
HttpClient.setConnectTimeout(timeout)
Logger.setLevel(logLevel)Dynamic Onboarding Flows
First impressions matter. Different user segments may respond better to different onboarding experiences. With Remote Config, you can serve tailored onboarding sequences based on cohort membership, so a user who signed up during a marketing campaign sees a flow aligned with that campaign's messaging, while everyone else gets the standard experience. You can see below guide to learn more about cohorts.
Dashboard Setup:
Parameter: onboarding_variant - default value: "standard"
Condition (Cohort: jan_campaign_signups): "new_year_goals"
SDK Setup
variant = RemoteConfig.getValue("onboarding_variant") OR "standard"
SWITCH variant
CASE "new_year_goals":
startNewYearOnboarding()
DEFAULT:
startStandardOnboarding()
END SWITCHPricing Control
Subscription pricing that works in one market may not convert in another. Remote Config lets you serve region-specific introductory prices instantly, without app updates. You can test whether a lower price point improves conversion in markets with lower purchasing power, then adjust in real time based on results.
Dashboard Setup:
Parameter: intro_price - default value:
{ "amount": 9.99, "currency": "USD", "label": "Start your free trial" }Condition (User Property: country_code in IN, BR, ID):
{ "amount": 2.99, "currency": "USD", "label": "Special introductory offer" }SDK Setup
pricing = RemoteConfig.getValue("intro_price") OR DEFAULT_PRICING
amount = pricing["amount"] OR 9.99
label = pricing["label"] OR "Start your free trial"
renderPricingCard(amount, label)Maintenance Mode
When your backend needs scheduled maintenance, you can show users a friendly maintenance screen instead of letting them hit errors. By flipping a single Remote Config parameter, every running app instance picks up the change and displays a maintenance message with an estimated return time — no client update required.
Dashboard Setup:
Parameter: maintenance_mode - default value:
{ "active": false, "message": "", "eta": "" }During maintenance, update to:
{ "active": true, "message": "We're upgrading our systems.", "eta": "2026-02-19T06:00:00Z" }SDK Setup
RemoteConfig.downloadAllKeys()
maint = RemoteConfig.getValue("maintenance_mode")
IF maint is not null AND maint["active"] == true THEN
showMaintenanceScreen(maint["message"], maint["eta"])
RETURN
END IF
proceedToMainApp()