Superwall

getPresentationResult()

Check the outcome of a placement without presenting a paywall.

Purpose

Retrieves the presentation result for a placement without presenting the paywall. Call this when you need to know whether a placement would show a paywall, send the user to a holdout, or fail due to missing configuration before you decide how to render UI.

Signature

Hook usage:

const { getPresentationResult } = useSuperwall()

await getPresentationResult(
  placement: string,
  params?: Record<string, any>
): Promise<PresentationResult>

Compat API usage:

import Superwall from "expo-superwall/compat"

await Superwall.getPresentationResult({
  placement: string,
  params?: Map<string, any>
}): Promise<PresentationResult>

Both variants return a promise that resolves to a PresentationResult object from expo-superwall/compat.

Parameters

NameTypeDescription
placementstringPlacement to evaluate. Always await Superwall.configure before calling.
paramsRecord<string, any> or Map<string, any>Optional parameters that feed audience filters. Keys beginning with $ are reserved and removed. Nested maps or arrays are not supported. Defaults to omitted.

Returns / State

The promise resolves to one of the PresentationResult subclasses exported from expo-superwall/compat:

  • PresentationResultPaywall – A paywall would be shown. Includes an experiment field (id, groupId, etc.).
  • PresentationResultHoldout – The user is placed in a holdout for the experiment.
  • PresentationResultNoAudienceMatch – No matching audience rules.
  • PresentationResultPlacementNotFound – The placement name is not attached to any campaign.
  • PresentationResultUserIsSubscribed – The SDK determined the user is already active, so no paywall will show.
  • PresentationResultPaywallNotAvailable – The paywall could not be displayed (no activity, already showing, offline, etc.).

If configuration fails or the native module throws, the promise rejects—catch and handle these errors as you would any async call.

Usage

import {
  PresentationResultPaywall,
  PresentationResultHoldout,
  PresentationResultNoAudienceMatch,
  PresentationResultPlacementNotFound,
} from "expo-superwall/compat"
import { useSuperwall } from "expo-superwall"

export function FeatureGate() {
  const { getPresentationResult } = useSuperwall()

  const checkAccess = async () => {
    const result = await getPresentationResult("premium_feature", { source: "settings" })

    if (result instanceof PresentationResultPaywall) {
      setExperiment(result.experiment)
      setState("locked")
    } else if (result instanceof PresentationResultHoldout) {
      setState("holdout")
    } else if (result instanceof PresentationResultNoAudienceMatch) {
      unlockFeature()
    } else if (result instanceof PresentationResultPlacementNotFound) {
      console.warn("Placement missing from dashboard")
    } else {
      fallbackFlow()
    }
  }

  return <Button title="Check access" onPress={checkAccess} />
}
import Superwall, {
  PresentationResultPaywall,
  PresentationResultPaywallNotAvailable,
} from "expo-superwall/compat"

async function inspectPlacement() {
  const result = await Superwall.getPresentationResult({
    placement: "premium_feature",
    params: new Map([["source", "home"]]),
  })

  if (result instanceof PresentationResultPaywallNotAvailable) {
    // Show offline UI
    return
  }

  if (result instanceof PresentationResultPaywall) {
    console.log("Experiment group:", result.experiment.groupId)
  }
}

How is this guide?

Edit on GitHub