# RedemptionResult

Result types returned when the Flutter SDK redeems a web checkout link.

Purpose [#purpose]

Represents the result passed to [`didRedeemLink()`](/docs/flutter/sdk-reference/SuperwallDelegate) after the SDK handles a web checkout redemption link.

Signature [#signature]

```dart
sealed class RedemptionResult {}

class RedemptionResultSuccess extends RedemptionResult {
  final String code;
  final RedemptionInfo redemptionInfo;
}

class RedemptionResultError extends RedemptionResult {
  final String code;
  final ErrorInfo error;
}

class RedemptionResultExpiredCode extends RedemptionResult {
  final String code;
  final ExpiredCodeInfo info;
}

class RedemptionResultInvalidCode extends RedemptionResult {
  final String code;
}

class RedemptionResultExpiredSubscription extends RedemptionResult {
  final String code;
  final RedemptionInfo redemptionInfo;
}
```

Types [#types]

<TypeTable
  type="{
  RedemptionResultSuccess: {
    type: &#x22;RedemptionResult&#x22;,
    description: &#x22;The redemption succeeded. Inspect `redemptionInfo` for purchaser, entitlement, ownership, and paywall details.&#x22;,
  },
  RedemptionResultError: {
    type: &#x22;RedemptionResult&#x22;,
    description: &#x22;The SDK could not redeem the code. Inspect `error.message` for the failure reason.&#x22;,
  },
  RedemptionResultExpiredCode: {
    type: &#x22;RedemptionResult&#x22;,
    description: &#x22;The redemption code expired. Inspect `info.resent` and `info.obfuscatedEmail` for email resend details.&#x22;,
  },
  RedemptionResultInvalidCode: {
    type: &#x22;RedemptionResult&#x22;,
    description: &#x22;The redemption code was invalid.&#x22;,
  },
  RedemptionResultExpiredSubscription: {
    type: &#x22;RedemptionResult&#x22;,
    description: &#x22;The subscription associated with the redemption code expired.&#x22;,
  },
}"
/>

Success Data [#success-data]

<TypeTable
  type="{
  &#x22;RedemptionInfo.ownership&#x22;: {
    type: &#x22;Ownership&#x22;,
    description: &#x22;Whether the redeemed code belongs to an app user or device.&#x22;,
    required: true,
  },
  &#x22;RedemptionInfo.purchaserInfo&#x22;: {
    type: &#x22;PurchaserInfo&#x22;,
    description: &#x22;Purchaser details, including store identifiers for Stripe, Paddle, or another store.&#x22;,
    required: true,
  },
  &#x22;RedemptionInfo.paywallInfo&#x22;: {
    type: &#x22;RedemptionPaywallInfo?&#x22;,
    description: &#x22;Paywall, placement, variant, and experiment details for the redeemed purchase.&#x22;,
  },
  &#x22;RedemptionInfo.entitlements&#x22;: {
    type: &#x22;Set<Entitlement>&#x22;,
    description: &#x22;Entitlements granted by the redeemed purchase.&#x22;,
    required: true,
  },
  &#x22;PurchaserInfo.appUserId&#x22;: {
    type: &#x22;String&#x22;,
    description: &#x22;The app user ID of the purchaser.&#x22;,
    required: true,
  },
  &#x22;PurchaserInfo.email&#x22;: {
    type: &#x22;String?&#x22;,
    description: &#x22;The purchaser email address, when available.&#x22;,
  },
  &#x22;PurchaserInfo.storeIdentifiers&#x22;: {
    type: &#x22;StoreIdentifiers&#x22;,
    typeDescriptionLink: &#x22;/flutter/sdk-reference/StoreIdentifiers&#x22;,
    description: &#x22;Public store identifier details for the redeemed purchase.&#x22;,
    required: true,
  },
}"
/>

Usage [#usage]

```dart
void didRedeemLink(RedemptionResult result) {
  switch (result) {
    case RedemptionResultSuccess(redemptionInfo: final info):
      final purchaser = info.purchaserInfo;
      print('Redeemed for ${purchaser.appUserId}');
      break;
    case RedemptionResultError(error: final error):
      print('Redemption failed: ${error.message}');
      break;
    case RedemptionResultExpiredCode(info: final info):
      print('Code expired; resent email: ${info.resent}');
      break;
    case RedemptionResultInvalidCode():
      print('Invalid code');
      break;
    case RedemptionResultExpiredSubscription():
      print('Expired subscription');
      break;
  }
}
```

Related [#related]

* [`StoreIdentifiers`](/docs/flutter/sdk-reference/StoreIdentifiers)
* [`SuperwallDelegate`](/docs/flutter/sdk-reference/SuperwallDelegate)
* [Post-Checkout Redirecting](/docs/flutter/guides/web-checkout/post-checkout-redirecting)