Customize flow with remote config

This guide covers remote config for Flow Builder. For classic paywalls created without Flow Builder, see Design paywall with remote config.

Remote Config lets you store a custom JSON payload that the SDK reads at runtime. Use it to set values like titles, images, fonts, colors, or feature flags without shipping a new app release.

Work with remote config

To open the remote config for a flow, click the Remote Config icon above the screen preview in the flow editor.

Open remote config in the Flow Builder editor

In the JSON view, you can enter any JSON-formatted data. The editor shows one column per locale you’ve added:

JSON view of the flow remote config

You can later access this data from the SDK through the remoteConfigs array on AdaptyFlow. Adapty stores one AdaptyRemoteConfig entry per locale; pick the one matching your user’s locale and read either the parsed dictionary or the raw jsonString to adjust your flow at runtime. Here are some examples of how you can use a remote config.

You can combine any of these patterns, or define your own keys to test alternative copy, layouts, or behavior.

Next, create a placement and add the flow to it. Then render the flow in your iOS app.

Add a locale

To localize your flow, click Add locale above the editor and select locales.

Adapty adds a new column to the editor for that locale. Edit each column independently — at runtime, the SDK returns the AdaptyRemoteConfig entry whose locale matches the user’s selection.

Add locale dialog with Code and Name fields

Import and export JSON

Use the Import/Export menu above the editor to back up, share, or bulk-edit your remote config across all locales at once.

  • Export JSON: Downloads a single JSON file containing every locale.
  • Import JSON: Uploads a JSON file in the same format. The uploaded file replaces the current remote config.

The file uses locale codes as top-level keys, with each locale’s payload as the value:

{
  "en": {
    "title": "Get Premium",
    "cta": "Continue",
    "trial_days": 7,
    "features": ["sync", "export", "ai"]
  },
  "fr": {
    "title": "Passez à Premium",
    "cta": "Continuer",
    "trial_days": 7,
    "features": ["synchronisation", "exportation", "IA"]
  }
}

Each locale block follows the same JSON structure you’d enter directly into a locale column.