Setting a User ID
Send your internal user ID to Singular to enable cross-device tracking and user-level data reporting.
Note: If you use Singular's Cross-Device solution, you must collect the User ID across all platforms.
User ID Requirements
Privacy and Best Practices
Follow these guidelines when implementing user ID tracking to ensure privacy compliance and proper cross-device measurement.
- No PII: The User ID should not expose Personally Identifiable Information (PII) such as email addresses, usernames, or phone numbers. Use a hashed value unique to your first-party data.
- Consistency Across Platforms: The User ID value must be the same internal identifier you capture across all platforms (Web/Mobile/PC/Console/Offline) for accurate cross-device measurement.
- First-Party Data: Singular includes the User ID in user-level exports, ETL, and Internal BI postbacks (if configured). The User ID is first-party data and is not shared with third parties.
- Persistence: The User ID persists until explicitly unset using
unsetCustomUserId()or until the app is uninstalled. Closing or restarting the app does not clear the User ID.
Implementation Overview
When to Set the User ID
Use Singular.setCustomUserId() to set the user identifier and Singular.unsetCustomUserId() to clear it during logout.
Best Practice: If multiple users share a single device, implement a logout flow that calls setCustomUserId() on login and unsetCustomUserId() on logout.
If you already know the user ID when the app opens, configure it using the customUserId property before initializing the Singular SDK. This ensures Singular receives the User ID from the first session. However, the User ID is typically unavailable until the user registers or logs in, in which case call setCustomUserId() after the registration or authentication flow completes.
SDK Methods
Set Custom User ID
Send your internal user ID to Singular for cross-device tracking and user-level reporting.
import 'package:singular_flutter_sdk/singular.dart';
// Set the user ID after login or registration
Singular.setCustomUserId('user_123456');
Method Signature:
static void setCustomUserId(String customUserId)
Example: Set User ID After Login
Call setCustomUserId() immediately after the user successfully
completes authentication to ensure all subsequent events are associated
with their user ID.
import 'package:singular_flutter_sdk/singular.dart';
Future<void> handleUserLogin(String email, String password) async {
try {
// Your authentication logic
final response = await authenticateUser(email, password);
if (response.success) {
// Set the user ID in Singular after successful login
Singular.setCustomUserId(response.userId);
print('User ID set: ${response.userId}');
// Navigate to home screen
navigateToHome();
}
} catch (error) {
print('Login failed: $error');
}
}
Unset Custom User ID
Clear the user ID when a user logs out to ensure accurate session tracking for multi-user devices.
import 'package:singular_flutter_sdk/singular.dart';
// Unset the user ID on logout
Singular.unsetCustomUserId();
Method Signature:
static void unsetCustomUserId()
Example: Unset User ID on Logout
Call unsetCustomUserId() during the logout flow to clear
the user ID and prevent incorrect attribution of subsequent events.
import 'package:singular_flutter_sdk/singular.dart';
Future<void> handleUserLogout() async {
try {
// Clear app data and user session
await clearUserSession();
// Unset the user ID in Singular
Singular.unsetCustomUserId();
print('User ID cleared');
// Navigate to login screen
navigateToLogin();
} catch (error) {
print('Logout failed: $error');
}
}
Set User ID During Initialization
If the user ID is available when the app launches (e.g., user is already
logged in), configure it during SDK initialization using the
customUserId property. This ensures the first session includes
the user ID.
import 'package:flutter/material.dart';
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_config.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
initializeSingular();
}
Future<void> initializeSingular() async {
// Check if user is already logged in
final prefs = await SharedPreferences.getInstance();
final userId = prefs.getString('user_id');
// Create configuration
SingularConfig config = SingularConfig(
'YOUR_SDK_KEY',
'YOUR_SDK_SECRET'
);
// If user ID exists, set it during initialization
if (userId != null) {
config.customUserId = userId;
}
// Initialize SDK
Singular.start(config);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
Configuration Property:
String? customUserId
Recommendation: Use the customUserId
configuration property during initialization for apps with persistent
login sessions. For apps where users must log in each time, call
setCustomUserId() after authentication.