Reporting changes to expect
Preliminary pre-release documentation, subject to change without notice. The full list of properties on each event isn't published yet.
Updated on September 16, 2026.
Some metrics move when you upgrade to the unified events schema, even though nothing in your pipeline fails. The events still arrive, the dashboards still render, and the numbers mean something different. Use this page to brief whoever owns your reporting, and to reset baselines before anyone reads a schema change as a product trend.
For the payload changes behind these shifts, see Migrate to the unified events schema.
Metrics that shift
| Metric | What changes | What to do |
|---|---|---|
| Call to action impressions | cta_shown is a boolean on the start event, so it counts once per content item. cta_visible counted every appearance. | Expect impressions to drop and click-through rate to rise. Reset the baseline at the upgrade date. |
| Search-attributed volume | Search identifiers ride every player event for the rest of the session, not just the start event, so far more events are attributed to search. | Count unique search_session_id values for sessions rather than counting events. Session counts stay comparable. |
| Story completion | story_completed means one Story finished. The trigger previously depended on whether another Story followed, so in a playlist watched all the way through, only the last Story reported completion. | Expect completion volume to rise and skip to fall. skip now means the Viewer skipped. For playlist completion, use remaining_unread_count = 0. |
| Story consumption split | story_page_navigation_type now comes from the action that caused the transition. Timer-driven advances previously reported manual. | Expect a large shift toward automatic. Don't read it as a change in Viewer behavior, and treat the historical split as not comparable. |
| Watched-to-the-end rates | story_page_duration_viewed_percent can now reach 100, and it's a decimal rather than a truncated integer. | A metric thresholded at = 100 returned nothing before and starts working. One thresholded at >= 99 now also catches genuine 99 % views. |
| Viewed percentage | The value covers the viewing segment since the matching start, not the whole item across a background or focus split. | Sum the segments of one session ID for total exposure. On Android this is a larger change, because the value used to be the absolute playhead position. |
| Description engagement | description_expanded and description_collapsed fire at most once per Moment view, where they used to fire on every tap. | The metric changes meaning from description taps to Moment views where the description was opened. Raw tap volume isn't recoverable. Rates against moment_start stay valid. |
| Tab and widget load | widget_load and tab_data_load fire once per identifier per session, and not on a fetch that returns nothing. | Expect lower counts on load events. |
| Container data load | tab_data_load replaces container_data_load and also fires for tabbed containers, which emitted nothing before. | Expect higher volume than the event it replaces, with no change in Viewer behavior. |
| Widget clicks | widget_click now fires on every real tap, including when your own click handler intercepts it and the SDK opens no player. | With custom click handling, expect a step change in click volume and click-through rate. |
| App resume counts | app_foreground is now reserved for a real app resume. In-app covers and returns, such as a host tab switch or the call to action web view, report focus_regained. | An "app resumed" count that included tab switches and web view dismissals drops. |
| Playlist position and totals | Indexes and totals counted the ads the player interleaves, so totals ran high and indexes shifted once an ad preceded the current item. They describe content only now. | Expect totals to fall slightly. next_video_id no longer returns an ad's ID. |
| Share | share_click fires when the share sheet or chooser actually opens, not on the tap. On Android the chooser is a separate activity, so a share also produces a background and foreground pair. | Compare share metrics within a platform rather than across platforms. |
| Seek | A rapid burst of seeks is one aggregated event rather than one per tap or tick. | Expect fewer events for the same Viewer activity. |
| Inline player closes | Leaving fullscreen back to inline is now a viewing mode transition rather than a close. | Counts of close_button on inline-hosted players drop. The session stays one session. |
| Ads | Ad events are part of the tracking plan now, on the same envelope and trimmed per event. | Expect ad events in reports that previously excluded them. |
| Interaction attribution | interaction_view and interaction_answer carry referring, so interaction engagement is attributable to the widget, data source, and search journey. | Attribution that previously stopped at the player now covers interactions. |
| Composite feed sources | referring.data_source_type on per-item events names the source the item actually came from. Every event in a composite session used to say composite. | composite now appears only on list-level events such as widget_load and tab_data_load. |
| Search suggestion click-through | search_suggestions_shown is removed. search_opened fires when the search screen opens. search_suggestions_clicked fires when a Viewer taps a pre-search recommendation tile, before they submit a query. | Count search_suggestions_clicked against search_opened. |
Metrics you can no longer compute
| Metric | Why |
|---|---|
| Forced against Viewer-initiated pause ratio | forced_playback_play and forced_playback_pause, and their ad variants, are removed with no replacement. A pause caused by your app, a tab switch, an ad, or backgrounding produces no event. |
| Press and hold against tap pause | playback_action_method is removed everywhere. |
| Exact audio toggle counts | audio_state rides every event rather than firing its own, so a toggle between two events is invisible. Treat a toggle count as a lower bound. |
| Interaction question wording | interaction_text is removed. Join to your CMS by interaction_id if you need it. |
Historical data
On iOS, an ad interrupting a video reported the video's identity in the moment_id and moment_title fields, and an ad interrupting a Moment reported no content identity. If you segmented ads by reading moment_id, your historical video-ad volume sits with Moment ads. The Story consumption split in Metrics that shift isn't comparable with data from before the upgrade.
Before you upgrade
- Mark the date. Record when each platform moves to the unified schema so you can annotate every affected chart. The platforms won't move on the same day.
- Snapshot your baselines. Capture current values for click-through rate, search attribution, Story completion, description engagement, and share, so you can tell a schema change from a real change.
- Check saved segments. A segment that filters on a legacy value keeps running and quietly matches nothing.
- Decide what a mixed window means for you. From October 2026 until January 2027, some apps emit the unified schema and some still emit legacy, because each SDK version runs one schema. Queued legacy events can still arrive after an upgrade. Split your charts by
api_scheme_versionif a mixed trend would mislead.
Related
- Migrate to the unified events schema: the payload reference for every platform
- Migrate on iOS, Migrate on Android, and Migrate on Web: the platform deltas behind these shifts
- 2026 events schema - breaking changes ahead: timeline
Updated 14 days ago
