diff --git a/content/docs/flutter/changelog.mdx b/content/docs/flutter/changelog.mdx
index 2db3016..012e90a 100644
--- a/content/docs/flutter/changelog.mdx
+++ b/content/docs/flutter/changelog.mdx
@@ -4,6 +4,13 @@ description: "Release notes for the Superwall Flutter SDK"
---
+## 2.4.7
+
+### Enhancements
+
+- Updates iOS SDK to 4.12.7 [View iOS SDK release notes](https://github.com/superwall/Superwall-iOS/releases/tag/4.12.7).
+- Updates Android SDK to 2.6.8 [View Android SDK release notes](https://github.com/superwall/Superwall-Android/releases/tag/2.6.8).
+
## 2.4.6
## Enhancements
diff --git a/content/docs/flutter/index.mdx b/content/docs/flutter/index.mdx
index 89b528c..2a7610d 100644
--- a/content/docs/flutter/index.mdx
+++ b/content/docs/flutter/index.mdx
@@ -34,4 +34,4 @@ If you have feedback on any of our docs, please leave a rating and message at th
If you have any issues with the SDK, please [open an issue on GitHub](https://github.com/superwall/superwall-flutter/issues).
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/content/docs/flutter/meta.json b/content/docs/flutter/meta.json
index 276c6a2..a931078 100644
--- a/content/docs/flutter/meta.json
+++ b/content/docs/flutter/meta.json
@@ -45,6 +45,8 @@
"sdk-reference/PurchaseController",
"sdk-reference/PresentationResult",
"sdk-reference/CustomerInfo",
+ "sdk-reference/SubscriptionTransaction",
+ "sdk-reference/NonSubscriptionTransaction",
"sdk-reference/Entitlements",
"sdk-reference/IntegrationAttribute",
"sdk-reference/handleDeepLink",
diff --git a/content/docs/flutter/sdk-reference/NonSubscriptionTransaction.mdx b/content/docs/flutter/sdk-reference/NonSubscriptionTransaction.mdx
new file mode 100644
index 0000000..3c8ba73
--- /dev/null
+++ b/content/docs/flutter/sdk-reference/NonSubscriptionTransaction.mdx
@@ -0,0 +1,70 @@
+---
+title: "NonSubscriptionTransaction"
+description: "Represents a non-subscription transaction (consumables and non-consumables)."
+---
+
+
+The `store` field was added in 2.4.7.
+
+
+## Purpose
+Provides details about one-time purchases in [`CustomerInfo`](/flutter/sdk-reference/CustomerInfo), including which store fulfilled the purchase.
+
+## Properties
+
+
+
+## Store values (2.4.7+)
+`appStore`, `stripe`, `paddle`, `playStore`, `superwall`, `other`.
+
+## Usage
+
+Inspect non-subscription purchases:
+```dart
+final customerInfo = await Superwall.shared.getCustomerInfo();
+
+for (final purchase in customerInfo.nonSubscriptions) {
+ print('Product: ${purchase.productId}');
+ print('Store: ${purchase.store}');
+ print('Consumable: ${purchase.isConsumable}');
+ print('Revoked: ${purchase.isRevoked}');
+}
+```
+
+## Related
+
+- [`CustomerInfo`](/flutter/sdk-reference/CustomerInfo) - Source of transaction data
+- [`SubscriptionTransaction`](/flutter/sdk-reference/SubscriptionTransaction) - Subscription transactions
+- [`getCustomerInfo()`](/flutter/sdk-reference/getCustomerInfo) - Fetch customer info
diff --git a/content/docs/flutter/sdk-reference/SubscriptionTransaction.mdx b/content/docs/flutter/sdk-reference/SubscriptionTransaction.mdx
new file mode 100644
index 0000000..06caefd
--- /dev/null
+++ b/content/docs/flutter/sdk-reference/SubscriptionTransaction.mdx
@@ -0,0 +1,104 @@
+---
+title: "SubscriptionTransaction"
+description: "Represents a subscription transaction in the customer's purchase history."
+---
+
+
+The `offerType`, `subscriptionGroupId`, and `store` fields were added in 2.4.7.
+
+
+## Purpose
+Provides details about a single subscription transaction returned from [`CustomerInfo`](/flutter/sdk-reference/CustomerInfo). Use this to understand renewal status, applied offers, and the store that fulfilled the purchase.
+
+## Properties
+
+
+
+## Offer types (2.4.7+)
+- `trial` - introductory offer.
+- `code` - offer redeemed with a promo code.
+- `promotional` - promotional offer.
+- `winback` - win-back offer (iOS 17.2+ only).
+
+## Store values (2.4.7+)
+`appStore`, `stripe`, `paddle`, `playStore`, `superwall`, `other`.
+
+## Usage
+
+Inspect subscription transactions:
+```dart
+final customerInfo = await Superwall.shared.getCustomerInfo();
+
+for (final subscription in customerInfo.subscriptions) {
+ print('Product: ${subscription.productId}');
+ print('Active: ${subscription.isActive}');
+ print('Store: ${subscription.store}');
+ print('Offer: ${subscription.offerType}');
+ print('Group: ${subscription.subscriptionGroupId ?? "unknown"}');
+}
+```
+
+## Related
+
+- [`CustomerInfo`](/flutter/sdk-reference/CustomerInfo) - Source of subscription data
+- [`NonSubscriptionTransaction`](/flutter/sdk-reference/NonSubscriptionTransaction) - Non-subscription transactions
+- [`getCustomerInfo()`](/flutter/sdk-reference/getCustomerInfo) - Fetch customer info
diff --git a/content/docs/flutter/sdk-reference/SuperwallDelegate.mdx b/content/docs/flutter/sdk-reference/SuperwallDelegate.mdx
index 9f1a0da..7860244 100644
--- a/content/docs/flutter/sdk-reference/SuperwallDelegate.mdx
+++ b/content/docs/flutter/sdk-reference/SuperwallDelegate.mdx
@@ -24,6 +24,7 @@ abstract class SuperwallDelegate {
void paywallWillOpenDeepLink(Uri url);
void handleSuperwallDeepLink(Uri fullURL, List pathComponents, Map queryParameters);
void customerInfoDidChange(CustomerInfo from, CustomerInfo to);
+ void userAttributesDidChange(Map newAttributes);
}
```
@@ -84,6 +85,12 @@ class MySuperwallDelegate extends SuperwallDelegate {
print('Customer info changed');
// Sync with your backend, update UI, etc.
}
+
+ @override
+ void userAttributesDidChange(Map newAttributes) {
+ print('User attributes updated: $newAttributes');
+ // Sync with analytics or update in-memory state.
+ }
}
```
diff --git a/content/docs/flutter/sdk-reference/index.mdx b/content/docs/flutter/sdk-reference/index.mdx
index 0239f4e..5e141e1 100644
--- a/content/docs/flutter/sdk-reference/index.mdx
+++ b/content/docs/flutter/sdk-reference/index.mdx
@@ -15,4 +15,4 @@ If you have feedback on any of our docs, please leave a rating and message at th
If you have any issues with the SDK, please [open an issue on GitHub](https://github.com/superwall/superwall-flutter/issues).
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/content/docs/flutter/sdk-reference/setUserAttributes.mdx b/content/docs/flutter/sdk-reference/setUserAttributes.mdx
index c5e483e..1a2256e 100644
--- a/content/docs/flutter/sdk-reference/setUserAttributes.mdx
+++ b/content/docs/flutter/sdk-reference/setUserAttributes.mdx
@@ -30,6 +30,8 @@ Future setUserAttributes(Map userAttributes)
## Returns / State
Returns a `Future` that completes when the user attributes are set.
+If you have a [`SuperwallDelegate`](/flutter/sdk-reference/SuperwallDelegate) set, `userAttributesDidChange` is invoked after the SDK applies the updated attributes.
+
## Usage
Basic usage: