Skip to main content

Overview

Encore requires user identification to track entitlements and prevent abuse across devices. You can also set user attributes to enable targeted offers and personalization.

Anonymous Users

Encore automatically generates a random user ID that persists until the user deletes/reinstalls your app or calls reset(). This anonymous ID is stored securely on the native side and allows entitlement tracking to work immediately without requiring explicit user identification.

Identified Users

If you use your own user management system, call identify when you have a user’s identity:
await Encore.shared.identify(userId: user.id);
This enables the SDK to:
  • Associate promotional access with your user account
  • Sync entitlements across devices when the user logs in
  • Track conversion attribution accurately

Setting User Attributes

User attributes enable personalized offers, audience targeting, and conversion context tracking. Set attributes using the UserAttributes class. All values are strings; use the custom map for app-specific fields:
await Encore.shared.setUserAttributes(
  UserAttributes(
    email: 'user@example.com',
    subscriptionTier: 'premium',
    monthsSubscribed: '6',
    custom: {'cancelReason': 'too_expensive'},
  ),
);
You can also set attributes when identifying:
await Encore.shared.identify(
  userId: 'user_12345',
  attributes: UserAttributes(
    email: 'user@example.com',
    subscriptionTier: 'premium',
  ),
);
setUserAttributes() merges with existing attributes — it does not replace them.

Resetting User Identity

When a user logs out, call reset():
await Encore.shared.reset();
This will:
  • Reset the user ID to a new auto-generated anonymous ID
  • Clear cached entitlement data
  • Clear all user attributes

Full Example

import 'package:flutter/material.dart';
import 'package:encore/encore.dart';

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    _initEncore();
  }

  Future<void> _initEncore() async {
    await Encore.shared.configure(apiKey: 'pk_your_api_key');

    // If the user is already logged in
    if (authManager.isAuthenticated) {
      await Encore.shared.identify(
        userId: authManager.userId,
        attributes: UserAttributes(
          email: authManager.email,
          subscriptionTier: authManager.tier,
        ),
      );
    }
  }

  void _onLogout() async {
    await Encore.shared.reset();
    authManager.logout();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: HomeScreen(onLogout: _onLogout));
  }
}

Apps Without Login

If your app doesn’t require users to log in, you don’t need to call identify. The SDK uses an auto-generated anonymous ID. You can still set attributes:
await Encore.shared.setUserAttributes(
  UserAttributes(custom: {'cancelReason': 'too_expensive'}),
);

await Encore.shared.placement('cancel_flow').show();

Next Steps