⌘K
Native Android & iOS

A/B Testing for Android and iOS

Test different layouts and logic on users without a new build. Deploy variants from the server, set rollout percentages, and promote the winner without touching the app binary.


What you can test

A/B tests, segmented rollouts, and personalization — all without a new app release.

A/B Testing

Deploy two frame variants and split traffic between them. Measure which one converts better, then promote the winner from the CLI.

User segmentation

Target by country, language, app version, user ID, or any custom parameter you pass to the SDK. Each segment gets its own frame.

Percentage rollouts

Start a new layout at 1% and ramp as metrics look good. Roll back to any previous version in one click if something breaks.


How to run an A/B test with Nativeblocks

From the CLI to every user's phone, in three steps.

Deploy frame variants

Deploy two frame versions, each with its own tag. The SDK fetches the one your server assigns to each user.

terminal

nativeblocks frame deploy

--file checkout_v2

--tag btn_green

✓ Frame validated

✓ Deployed (0% rollout)

Set the split

Assign each variant to a user segment or percentage of traffic. Change the split anytime without a new build.

terminal

nativeblocks rollout set

--frame checkout_v2

--tag btn_green

--percentage 50

✓ 50% of users on btn_green

✓ 50% of users on btn_blue

Promote the winner

Check results in Nativeblocks Studio. Roll back the loser and ramp the winning variant to 100%.

terminal

nativeblocks rollout set

--frame checkout_v2

--tag btn_green

--percentage 100

✓ btn_green live for 100%


Pass targeting context from your app

Set global parameters once. Nativeblocks uses them to serve the right frame to each user.

Set global parameters for A/B testing

To set global parameters used to load a frame based on some conditions:

NativeblocksManager.getInstance().setGlobalParameters(
    "language" to "EN",
    "country" to "US",
    "currency" to "USD",
    "appVersionCode" to "45"
)

Landing API to get and show active landing page route

NativeblocksManager.getInstance().getLanding("welcome-campaign").onSuccess { route ->
    // get landing route and pass it to NativeblocksFrame
    route
}

Display dynamic content in your app

@Composable
fun ABTestingLandingPage() {
    var landingRoute by remember { mutableStateOf<String?>(null) }

    LaunchedEffect(Unit) {
        NativeblocksManager.getInstance().getLanding("welcome-campaign").onSuccess { route ->
            landingRoute = route
        }
    }

    landingRoute?.let { route ->
        NativeblocksFrame(route = route)
    }
}

What you get

Built for native Android and iOS teams. No JavaScript runtime, no WebViews.

No app store update

Change which variant users see from the server. No new binary, no store review queue.

Roll back in one click

Every deployed frame is versioned. Revert to any previous version from Nativeblocks Studio.

Target any dimension

Use country, language, app version, user ID, or custom parameters as targeting keys.

Works while offline

Frames are cached on device. Users who were assigned a variant keep seeing it even without connectivity.

Test without waiting for a store review

Deploy variants, set your split, measure results, and promote the winner — all from the CLI.

Open-source SDK · Free tier available · No credit card required