Skip to content

Privacy and Tracking#

The eventTrackingOptions property customizes Storyteller's analytics and tracking behavior. It allows certain features to be disabled based on user privacy choices. It is an object of type StorytellerEventTrackingOptions and by default, all of its properties are enabled.

To receive and forward events in your own analytics system, follow Integrate Analytics. This page defines the privacy and tracking controls used by that setup.

Important: eventTrackingOptions can only be set during SDK initialization. To configure tracking options, pass a StorytellerEventTrackingOptions object to the initialize method. The default value is .enableAll:

// Using custom tracking options
let trackingOptions = StorytellerEventTrackingOptions(
    enablePersonalization: false,
    enableStorytellerTracking: false,
    enableUserActivityTracking: false,
    enableAdTracking: false,
    enableFullVideoAnalytics: false,
    enableRemoteViewingStore: false,
    disabledFunctionalFeatures: []
)

try await Storyteller.shared.initialize(
    apiKey: "your-api-key",
    userInput: StorytellerUserInput(externalId: "user-id"),
    eventTrackingOptions: trackingOptions
)

// Or use the default .enableAll (all tracking enabled)
try await Storyteller.shared.initialize(
    apiKey: "your-api-key",
    userInput: StorytellerUserInput(externalId: "user-id")
)

For a full integration, see how the Showcase app builds StorytellerEventTrackingOptions and initializes the SDK in StorytellerService.setup.

The property remains publicly readable via Storyteller.shared.eventTrackingOptions, but can no longer be modified at runtime. To change tracking options after initialization, you must reinitialize the SDK with new options.

If an expected event or Ad callback is missing, follow Callbacks or Analytics Events Do Not Arrive before changing privacy settings; data loading, user-activity delivery, and Ad analytics use different callback paths.

User Personalization#

When enablePersonalization is enabled, supported Storyteller requests include user attributes so the returned content can be personalized. The standard userId query parameter is included on supported personalization requests only when both enablePersonalization and enableRemoteViewingStore are enabled.

enableRemoteViewingStore also controls separate requests used to retrieve and record viewing activity and synchronize followed categories. When it is enabled, those requests can include the stored hashed user ID even when enablePersonalization is disabled.

Storyteller tracking#

When enableStorytellerTracking is enabled, we will record analytics events on our servers. Note that some events are necessary for user functionality and will still be transmitted (but not stored) even when this setting is off.

User Activity tracking#

When enableUserActivityTracking is enabled, we call the Storyteller delegate's method onUserActivityOccurred(), which allows integrating apps to record our analytics events on their own systems. When it is disabled, the callback is not invoked. Ad loading callbacks such as getAd and getBottomBannerAd are separate integration APIs and do not change that user-activity callback gate.

Ads tracking#

When enableAdTracking is disabled, ad-related events will not be tracked through onUserActivityOccurred() Storyteller delegate method and on our servers. Additionally, only necessary fields like Ad Unit Id and Custom Template Id's will be included in GAM requests.

Videos tracking#

When enableFullVideoAnalytics is disabled, sensitive video event data for Story ID, Page ID, Story Title, Page Title, Clip ID, Clip Title, Story Display Title, Item Title, Container Title, Card Id, Card Title and Card Subtitle will not be included in the onUserActivityOccurred() Storyteller delegate method.

Remote viewing store#

When enableRemoteViewingStore is disabled, user IDs are never stored or sent to backend services, and all user viewing activity is only kept locally on the device. This mode ensures the SDK operates in a privacy-enhanced mode designed to address VPPA (Video Privacy Protection Act) compliance concerns.

Independent Functional Behavior Toggles#

The disabledFunctionalFeatures property allows to conditionally disable functional features of the SDK for privacy compliance. When a feature is disabled, the SDK will behave as if that functionality is disabled from the server.

pageReadStatus#

Summary: Controls whether read/unread status is enabled for Story pages.

When disabled, the SDK will not store read/unread behavior for pages. All Lists and Players will act as if read/unread tracking is disabled from the server, meaning users will not see visual indicators of which Stories they have previously viewed.

clipViewedStatus#

Summary: Controls whether viewed/not viewed status is enabled for individual Clips.

When disabled, the SDK will not store viewed/not viewed information for Clips. All Lists and Players will act as if viewed/not viewed tracking is disabled from the server, removing visual indicators of previously watched content.

pollVotes#

Summary: Controls whether Poll voting responses are persistently stored.

When disabled, users can still interact with Polls and see immediate UI updates when they vote, but their votes are not persistently stored. If they navigate away and return to the same Poll, they can vote again. Since this is coupled with disabled Storyteller Analytics, their votes will not contribute to overall Poll statistics.

triviaQuizAnswers#

Summary: Controls whether Trivia Quiz responses and progress are persistently stored.

When disabled, users can still answer trivia questions and see immediate UI feedback, but their answers are not persistently stored. If they navigate away and return to the same Quiz, they can answer questions again. The results page will be hidden since the SDK is not allowed to display persistent Quiz results.

clipLikes#

Summary: Controls whether Clip like/unlike interactions are persistently stored.

When disabled, users can still tap to like/unlike Clips and see immediate UI updates, but these interactions are not persistently stored. If they swipe away and return to the same Clip, it will appear in its original unliked state.

clipShares#

Summary: Disables Clip Share tracking and storage (but not the sharing action itself).

When disabled, users can still tap on Share Clip button and see immediate UI updates, but this interaction is not persistently stored. If they swipe away and returns to the same Clip, the original share count will be displayed.

all#

Summary: Disables all functional feature behaviors.

When disabled using .all, the SDK will behave as if every individual functional toggle is turned off.