Skip to main content
Question

[Flutter] PaywallView (Android Production) records 0 Encounters despite valid Purchases

  • November 23, 2025
  • 2 replies
  • 19 views

Forum|alt.badge.img

Hi all,


I am running a Flutter app in Production (Android only) with real users and real revenue.
My issue is that the "Paywall Encounters" chart in RevenueCat shows 0, while the "Revenue" charts are populating correctly.

I am using the `PaywallView` widget from `purchases_ui_flutter`.

Technical Details:

  •   Platform: Android (Production)
  •   Framework: Flutter
  •   SDK Versions:
    •       purchases_flutter: ^9.1.0
    •       purchases_ui_flutter: ^9.1.0
  •   Behavior:
    •       Users can successfully view the paywall and purchase products.
    •       Revenue is tracked correctly in the dashboard.
    •       Paywall Encounters: 0.(no matter what “encounter timeframe” is)

My Implementation:
I am manually fetching the offering in a `StatefulWidget` and passing the resulting object to the `PaywallView`. I am **not** letting the `PaywallView` fetch the offering itself.

Here is a simplified version of my code:


class MyPaywallScreen extends StatefulWidget {
  @override
  _MyPaywallScreenState createState() => _MyPaywallScreenState();
}

class _MyPaywallScreenState extends State<MyPaywallScreen> {
  Offering? _offering;

  @override
  void initState() {
    super.initState();
    _fetchOfferings();
  }

  Future<void> _fetchOfferings() async {
    try {
      // Direct RevenueCat SDK call
      final offerings = await Purchases.getOfferings();
      if (mounted) {
        setState(() {
          _offering = offerings.current;
        });
      }
    } catch (e) {
      // Handle error
    }
  }

  @override
  Widget build(BuildContext context) {
    if (_offering == null) {
      return const Center(child: CircularProgressIndicator());
    }

    return Scaffold(
      body: PaywallView(
        offering: _offering, // <-- Passing the manually fetched object here
        onPurchaseStarted: (pkg) { /* ... */ },
        onPurchaseCompleted: (custInfo, storeTx) { /* ... */ },
        onDismiss: () { /* ... */ },
      ),
    );
  }
}

What I have verified:

  1. Production Data: I am looking at the "Production" toggle in charts (not Sandbox).
  2. Offering is not null: The code handles nulls (loading state), and users are successfully buying, so the object is valid.
  3. Layout: The `PaywallView` is full-screen.

My Questions:

1.  Does passing a manually fetched `Offering` object to `PaywallView` (instead of letting it fetch internally) break the "Encounter" event tracking?
2.  Is there a known race condition on Android where `PaywallView` mounts but fails to fire the "View" event before the user interacts?

Any guidance on why the UI events are silently failing while transaction events work perfectly would be appreciated.

 

2 replies

alejandra-wetsch
RevenueCat Staff
Forum|alt.badge.img+6

Hey ​@xiangz

Thank you for reaching out. I’ll be happy to help!

Thank you for providing detailed information about your current setup. To provide additional details, the Paywall Encounters Chart works differently from the Transaction-specific Charts. For Paywall Encounters, RevenueCat compares the date on which users installed the app against the date when they first encountered a Paywall. If a user installed your app a month ago and was presented with a Paywall yesterday, the Paywall Encounter will not be considered, and it will not be displayed in charts.

To troubleshoot further and double-check that everything is working as expected with your data, could you please share some App User IDs that you know installed the app recently and had access to the Paywall? (The “First seen” event in the Customer History indicates the first time the user installed the app) In that way, we can double-check our records.

Does passing a manually fetched `Offering` object to `PaywallView` (instead of letting it fetch internally) break the "Encounter" event tracking?

No. The way you’re accessing the Offering to pass it to the Paywall is correct and is not breaking the Paywall Encounter Charts data.

Is there a known race condition on Android where `PaywallView` mounts but fails to fire the "View" event before the user interacts?

We are not aware of any race condition on Android that would cause this issue. The impression event gets recorded as soon as the RevenueCat Paywall View is displayed.

Best,


Forum|alt.badge.img
  • Author
  • New Member
  • November 28, 2025

Hi Alejandra,

 

Thank you for the reply. I will send the details via Private Message.

Regarding the timeframe: I am confident the events are within the window. For example, I have a user 'First Seen' on Nov 6 who purchased on Nov 16. I have tested the 'Encounter Timeframe' settings (1, 3, 7, and 14 days), and the chart consistently shows 0 encounters regardless of the setting."

 

Regards,

Xiang