Growth

Mar 1, 2026

Mar 1, 2026

Show ad-targeted paywalls based on where your users came from with Appstack and Helium

Use ad campaign data to show personalized paywalls and increase subscription revenue

Lucas Moscon

Founder at Appstack

Lucas Moscon

Combining Helium's segmentation capabilities with Appstack's enhanced app campaigns (EACs) means that apps running paid ads can now show paywalls based on the exact ads users clicked before installing the app.

With the rising cost of user acquisition, you've likely asked yourself how to squeeze more ROAS out of every dollar spent on ads. You spend hours optimizing creatives, doing ASO, and refining onboarding. But once the user lands in your app, they often see the exact same generic paywall as everyone else.

With the introduction of the enhanced app campaign (EAC) protocol by Appstack, apps can now customize users' post-install experiences using Helium's powerful segmentation and experimentation platform. In this short guide, I'll show you how.

A new way to do paywall experimentation

Today, most apps use paywalls based on standard filters such as device properties, subscription status, or user behavior within the app. These are useful — but they're all post-install signals.

For the first time, apps running paid ads now have the ability to show a paywall depending on five different pre-install parameters:

  1. Ad network (Meta Ads, TikTok Ads, Google Ads, etc.)

  2. Ad campaign name

  3. Ad set name

  4. Ad name

  5. Keyword

This opens up entirely new testing opportunities, such as:

  • Keeping organic users with free trials and paid ads users with hard paywalls

  • Showing a trial-only paywall for campaigns optimizing for trial starts

  • Customizing design and copy for gender-targeted or interest-targeted campaigns

  • Presenting higher pricing to users coming from high-intent keywords

  • Matching the tone and visual language of the ad, the user originally clicked

How to make it work

Apps relying on Appstack's infrastructure to run enhanced app campaigns can integrate with Helium with almost no extra effort.

All you need to do is pass Appstack's attribution parameters as user traits before triggering your first paywall. In Swift, that looks like this:

// Swift
let appstackParams = AppstackAttributionSdk.shared.getAttributionParams() ?? [:]

// Now, when you present an upsell, Helium will use those traits for segmentation.
Helium.identify.setUserTraits(HeliumUserTraits(appstackParams))
// Swift
let appstackParams = AppstackAttributionSdk.shared.getAttributionParams() ?? [:]

// Now, when you present an upsell, Helium will use those traits for segmentation.
Helium.identify.setUserTraits(HeliumUserTraits(appstackParams))
// Swift
let appstackParams = AppstackAttributionSdk.shared.getAttributionParams() ?? [:]

// Now, when you present an upsell, Helium will use those traits for segmentation.
Helium.identify.setUserTraits(HeliumUserTraits(appstackParams))
// Kotlin
val appstackParams = AppstackAttributionSdk.shared.getAttributionParams() ?: emptyMap()

// Now, when you present an upsell, Helium will use those traits for segmentation.
Helium.identity.setUserTraits(HeliumUserTraits(
    traits = appstackParams.mapValues { (_, value) ->
        HeliumUserTraitsArgument.StringParam(value

// Kotlin
val appstackParams = AppstackAttributionSdk.shared.getAttributionParams() ?: emptyMap()

// Now, when you present an upsell, Helium will use those traits for segmentation.
Helium.identity.setUserTraits(HeliumUserTraits(
    traits = appstackParams.mapValues { (_, value) ->
        HeliumUserTraitsArgument.StringParam(value

// Kotlin
val appstackParams = AppstackAttributionSdk.shared.getAttributionParams() ?: emptyMap()

// Now, when you present an upsell, Helium will use those traits for segmentation.
Helium.identity.setUserTraits(HeliumUserTraits(
    traits = appstackParams.mapValues { (_, value) ->
        HeliumUserTraitsArgument.StringParam(value

That's it — no need to repeat it for every placement. Once the traits are set, Helium's segmentation engine picks them up automatically wherever you trigger a paywall.

Once live, you can use Helium's segmentation UI to create audience rules based on any Appstack parameter — ad network, campaign name, ad set, ad name, or keyword — and assign different paywalls to each segment.

Testing it before going to production

Before shipping to production, you can validate the integration on a test device:

  1. Uninstall your testing build from your device.

  2. Log in to your Appstack and configure the integration you want to test. Copy one of the tracking links from the integration page.

  3. Open that link on your test device's browser to simulate a click.

  4. Reinstall and rebuild the app on your test device, then trigger the code that calls getAttributionParams().

  5. You should now see the Appstack user traits appear in your Helium dashboard, ready to use as segmentation rules.

Wrapping up

Combining Appstack's granular attribution data with Helium's experimentation platform lets you maintain the narrative from the very first ad impression through to the purchase decision. Instead of breaking the thread when a user opens your app, you can extend it, showing a paywall that feels like a natural continuation of what caught their attention in the first place.

The Appstack x Helium integration is live and ready to help you unlock higher ROAS.

To start using it, book a meeting here or reach out to us at lucas@appstack.tech.