---
title: "Customize flow with remote config"
description: "Customize your Flow Builder flow with a remote config JSON payload."
---

:::important
This guide covers remote config for Flow Builder. For classic paywalls created without Flow Builder, see [Design paywall with remote config](customize-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.

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

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.

<Tabs>
  <TabItem value="Titles" label="Titles" default>
```json showLineNumbers
{
    "screen_title": "Today only: Subscribe, and get 7 days for free!"
}

# Test titles or other texts
```
</TabItem>
<TabItem value="Images" label="Images">
```json showLineNumbers
{
    "background_image": "https://adapty.io/media/paywalls/bg1.webp"
}

# Test images on your flow
```
</TabItem>
<TabItem value="Fonts" label="Fonts">
```json showLineNumbers
{
    "font_family": "San Francisco",
    "font_size": 16
}

# Test fonts
```
</TabItem>
<TabItem value="Color" label="Color">
```json showLineNumbers
{
    "subscribe_button_color": "purple"
}

# Test colors of buttons, texts etc.
```
</TabItem>
<TabItem value="HTML" label="HTML">
```json showLineNumbers
{
    "photo_gallery": "https://adapty.io/media/paywalls/link-to-html-snippet.html"
}

# Any HTML code that can be displayed in the flow
```
</TabItem>
<TabItem value="Soft/Hard Paywall" label="Soft/Hard Paywall">
```json showLineNumbers
{
    "hard_paywall": true
}

# By setting it to true, you disallow skipping the paywall without subscribing
# You have to handle this logic in your app
```
</TabItem>
<TabItem value="Translations" label="Translations">
```json showLineNumbers
{
    "title": {
        "en": "Try for free!",
        "es": "¡Prueba gratis!",
        "ru": "Попробуй бесплатно!"
    }
}
```
</TabItem>
</Tabs>

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

Next, [create a placement](create-placement) and add the flow to it. Then [render the flow in your iOS app](present-remote-config-paywalls).

## 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.

## 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:

```json showLineNumbers
{
  "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.