# Advanced Configuration

Configure beta Superwall Unity SDK options and advanced APIs.

`SuperwallOptions` lets you tune paywall behavior, logging, locale, test mode, and platform-specific
behavior at configuration time.

```csharp C#
using System.Collections.Generic;
using Superwall;

var options = new SuperwallOptions
{
    NetworkEnvironment = NetworkEnvironment.Release,
    TestModeBehavior = TestModeBehavior.Automatic,
    IsGameControllerEnabled = true,
    Logging = new Logging
    {
        Level = LogLevel.Debug,
        Scopes = new List<LogScope> { LogScope.PaywallPresentation }
    },
    Paywalls = new PaywallOptions
    {
        ShouldPreload = true,
        AutomaticallyDismiss = true,
        ShouldShowPurchaseFailureAlert = true,
        RestoreFailed = new RestoreFailed
        {
            Title = "No Subscription Found",
            Message = "We couldn't find an active subscription for your account.",
            CloseButtonTitle = "Okay"
        }
    }
};

Superwall.Configure("MY_PUBLIC_API_KEY", options: options);
```

`SuperwallOptions` [#superwalloptions]

<TypeTable
  type="{
  Paywalls: {
    type: &#x22;PaywallOptions&#x22;,
    typeDescriptionLink: &#x22;/unity/guides/advanced-configuration#paywalloptions&#x22;,
    description: &#x22;Paywall presentation and transaction UI behavior.&#x22;,
    default: &#x22;new PaywallOptions()&#x22;,
  },
  NetworkEnvironment: {
    type: &#x22;NetworkEnvironment&#x22;,
    description: &#x22;Superwall API environment. Use `Release` unless Superwall tells you otherwise.&#x22;,
    default: &#x22;NetworkEnvironment.Release&#x22;,
  },
  IsExternalDataCollectionEnabled: {
    type: &#x22;bool&#x22;,
    description: &#x22;Enables Superwall-managed external data collection.&#x22;,
    default: &#x22;true&#x22;,
  },
  LocaleIdentifier: {
    type: &#x22;string&#x22;,
    description: &#x22;Overrides the device locale for paywall localization.&#x22;,
    default: &#x22;null&#x22;,
  },
  IsGameControllerEnabled: {
    type: &#x22;bool&#x22;,
    description: &#x22;Enables native game controller handling for paywalls.&#x22;,
    default: &#x22;false&#x22;,
  },
  Logging: {
    type: &#x22;Logging&#x22;,
    description: &#x22;SDK log level and optional log scopes.&#x22;,
    default: &#x22;new Logging()&#x22;,
  },
  PassIdentifiersToPlayStore: {
    type: &#x22;bool&#x22;,
    description:
      &#x22;Android-only. Sends identifiers to Google Play according to the native SDK behavior.&#x22;,
    default: &#x22;false&#x22;,
  },
  TestModeBehavior: {
    type: &#x22;TestModeBehavior&#x22;,
    description:
      &#x22;Controls test mode. Values: `Automatic`, `WhenEnabledForUser`, `Never`, `Always`.&#x22;,
    default: &#x22;TestModeBehavior.Automatic&#x22;,
  },
  ShouldObservePurchases: {
    type: &#x22;bool&#x22;,
    description:
      &#x22;Enables observation of purchases made outside Superwall when supported by the native SDK.&#x22;,
    default: &#x22;false&#x22;,
  },
  ShouldBypassAppTransactionCheck: {
    type: &#x22;bool&#x22;,
    description: &#x22;iOS-only app transaction check bypass.&#x22;,
    default: &#x22;false&#x22;,
  },
  MaxConfigRetryCount: {
    type: &#x22;int&#x22;,
    description: &#x22;Maximum native configuration retry count.&#x22;,
    default: &#x22;6&#x22;,
  },
  UseMockReviews: {
    type: &#x22;bool&#x22;,
    description: &#x22;Android-only mock review behavior.&#x22;,
    default: &#x22;false&#x22;,
  },
}"
/>

`PaywallOptions` [#paywalloptions]

<TypeTable
  type="{
  IsHapticFeedbackEnabled: {
    type: &#x22;bool&#x22;,
    description: &#x22;Enables haptic feedback from paywall interactions.&#x22;,
    default: &#x22;true&#x22;,
  },
  RestoreFailed: {
    type: &#x22;RestoreFailed&#x22;,
    description: &#x22;Text shown when restore does not find an active subscription.&#x22;,
    default: &#x22;new RestoreFailed()&#x22;,
  },
  ShouldShowPurchaseFailureAlert: {
    type: &#x22;bool&#x22;,
    description: &#x22;Shows a default alert when a purchase fails.&#x22;,
    default: &#x22;true&#x22;,
  },
  ShouldPreload: {
    type: &#x22;bool&#x22;,
    description: &#x22;Preloads paywalls when configuration is available.&#x22;,
    default: &#x22;true&#x22;,
  },
  AutomaticallyDismiss: {
    type: &#x22;bool&#x22;,
    description: &#x22;Automatically dismisses the paywall after a successful purchase.&#x22;,
    default: &#x22;true&#x22;,
  },
  ShouldShowWebRestorationAlert: {
    type: &#x22;bool&#x22;,
    description: &#x22;Shows the default web restoration alert.&#x22;,
    default: &#x22;true&#x22;,
  },
  TransactionBackgroundView: {
    type: &#x22;TransactionBackgroundView&#x22;,
    description: &#x22;Background view shown during transactions. Values: `Spinner`, `None`.&#x22;,
    default: &#x22;TransactionBackgroundView.Spinner&#x22;,
  },
  OverrideProductsByName: {
    type: &#x22;Dictionary<string, string>&#x22;,
    description: &#x22;Maps product names in paywalls to specific store product identifiers.&#x22;,
    default: &#x22;null&#x22;,
  },
  ShouldShowWebPurchaseConfirmationAlert: {
    type: &#x22;bool&#x22;,
    description: &#x22;Shows the web purchase confirmation alert.&#x22;,
    default: &#x22;false&#x22;,
  },
  UseCachedTemplates: {
    type: &#x22;bool&#x22;,
    description: &#x22;Uses cached paywall templates when available.&#x22;,
    default: &#x22;false&#x22;,
  },
  TimeoutAfter: {
    type: &#x22;float?&#x22;,
    description: &#x22;Optional paywall request timeout in seconds.&#x22;,
    default: &#x22;null&#x22;,
  },
}"
/>

Preloading [#preloading]

```csharp C#
Superwall.Shared.PreloadAllPaywalls();

Superwall.Shared.PreloadPaywallsForPlacements(new List<string>
{
    "onboarding",
    "upgrade"
});
```

Locale [#locale]

```csharp C#
Superwall.Shared.LocaleIdentifier = "es_ES";
```

Local Resources [#local-resources]

Android builds can map paywall asset names to local file paths.

```csharp C#
Superwall.Shared.SetLocalResources(new Dictionary<string, string>
{
    { "hero_image", "/absolute/path/to/hero.png" }
});
```

> **Note**

`SetLocalResources` is Android-only in the current beta. It is a no-op on iOS.



Programmatic Purchase and Products [#programmatic-purchase-and-products]

```csharp C#
Superwall.Shared.GetProducts(new List<string> { "monthly", "annual" }, products =>
{
    foreach (var product in products)
    {
        Debug.Log($"{product.Key}: {product.Value.LocalizedPrice}");
    }
});

Superwall.Shared.Purchase("monthly", result =>
{
    Debug.Log($"Purchase result: {result.Type}");
});
```

For normal paywall flows, prefer `RegisterPlacement`.