> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tryhelium.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Paywall Traits

<Badge color="blue">iOS 4.4.2+</Badge> <Badge color="green">Android 4.4.2+</Badge> <Badge color="orange">React Native 3.4.3+</Badge> <Badge color="purple">Flutter 3.3.3+</Badge>

Paywall traits are values passed into a paywall upon presentation, allowing your paywall to display or behave differently depending on those values.

This must be configured in two places:

1. Your paywall via the paywall editor
2. Your app by passing in values to the Helium mobile SDK

## Paywall Editor

<Frame>
  <img src="https://mintcdn.com/helium/RB3DV7v6472dGP3j/images/paywall_traits.jpg?fit=max&auto=format&n=RB3DV7v6472dGP3j&q=85&s=66de8518779a10c2d1eb248391567873" alt="Paywall Traits" width="2308" height="1310" data-path="images/paywall_traits.jpg" />
</Frame>

Open the paywall editor from the [Helium dashboard](https://app.tryhelium.com/paywalls). Type something like

```text theme={null}
use a paywall trait with key "name" to display a customized greeting
```

<Warning>
  You MUST provide a **default value** or behavior for each trait, in case the app does not pass in a value.
</Warning>

## Pass in from the SDK

By default, user traits will automatically be included as custom paywall traits in all of your paywalls. (Just make sure your SDK version is higher than what's listed at the top of this page.)

To pass in additional paywall traits during paywall presentation, use the `customPaywallTraits` parameter.

<CodeGroup>
  ```swift iOS theme={null}
  Helium.shared.presentPaywall(
      trigger: "your-trigger",
      config: PaywallPresentationConfig(
          customPaywallTraits: HeliumUserTraits(["name": nameValue])
      )
  ) { paywallNotShownReason in }
  ```

  ```kotlin Android theme={null}
  import com.tryhelium.paywall.core.HeliumUserTraits.Companion.create

  Helium.presentPaywall(
      "your-trigger",
      config = PaywallPresentationConfig(
          customPaywallTraits = mapOf(
              "name" to nameValue,
          ).create()
      )
  )
  ```

  ```tsx React Native theme={null}
  presentUpsell({
    triggerName: "your-trigger",
    customPaywallTraits: { name: nameValue },
  });
  ```

  ```dart Flutter theme={null}
  await HeliumFlutter().presentUpsell(
    context: context,
    trigger: "your-trigger",
    customPaywallTraits: { "name": nameValue },
  );
  ```
</CodeGroup>

## Targeting and Metrics Considerations

If you want to evaluate the effects of different traits in your paywall, utilize user traits in your SDK integration.

Helium does not currently support the use of`customPaywallTraits` (passed during paywall presentation) as metrics filters.

User traits can also be used for targeting.

### **What if I set both?**

If the same key is present in both user traits and `customPaywallTraits`, the paywall will see the value from `customPaywallTraits`.

Metrics still only sees the value from user traits.

## Coming Soon

We are working on adding default traits you can use without passing in from SDK.
