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.
❯ 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.
❯ 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%.
❯ 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