Analytics Mapping

Storyly Placement SDK — Analytics System Raporu

Total Events: 70+  |  Widget Types: 5  |  Callback: 4  |  Platform: Android / iOS


Analytics Architecture

  1. SDK Layer — Detects user interactions, produces events, and delivers them to the callback. Fully provider-agnostic.
  2. Host ApponEvent reads the event type via payload.baseEvent.getType(). Widget-specific extensions are used for typed payloads.
  3. Analytics Provider — Events are forwarded to Firebase, Adjust, or any custom system. No SDK-side configuration required.

Platform Comparison

Android (Kotlin)iOS (Swift)
Delegate / ListenerSTRListenerSTRDelegate
Main Importimport com.appsamurai.storyly.placement.ui.STRListenerimport StorylyPlacement
Core Importimport com.appsamurai.storyly.core.analytics.event.STREventPayloadimport StorylyCore
StoryBar Importimport com.appsamurai.storyly.storybar.analytics.event.StoryBarEventimport StorylyStoryBar
Video Feed Importimport com.appsamurai.storyly.videofeed.analytics.event.VideoFeedEventimport StorylyVideoFeed
Banner Importimport com.appsamurai.storyly.banner.analytics.event.BannerEventimport StorylyBanner
Callback Lambdapayload.storyBar { it -> ... }payload.storyBar { payload in ... }
Event NamesIdentical (e.g. StoryViewed, BannerCTAClicked)Identical (e.g. StoryViewed, BannerCTAClicked)

Callback Flow — Code Example

storylyView.listener = object : STRListener {
    override fun onEvent(widget: STRWidgetController, payload: STREventPayload) {
        val eventType = payload.baseEvent.getType()

        payload.storyBar { storyBarPayload ->
            analytics.track(eventType, storyBarPayload)
        }
        payload.videoFeed { videoFeedPayload ->
            analytics.track(eventType, videoFeedPayload)
        }
        payload.banner { bannerPayload ->
            analytics.track(eventType, bannerPayload)
        }
    }
}

storylyView.delegate = self

func onEvent(widget: STRWidgetController, payload: STREventPayload) {
    let eventType = payload.baseEvent.getType()

    payload.storyBar { storyBarPayload in
        analytics.track(eventType, storyBarPayload)
    }
    payload.videoFeed { videoFeedPayload in
        analytics.track(eventType, videoFeedPayload)
    }
    payload.banner { bannerPayload in
        analytics.track(eventType, bannerPayload)
    }
}

Event Table — Android & iOS

Note: the original document had filter buttons (All / Impression / Click‑CTA / Navigation / Interaction / Lifecycle) to narrow this table by category. In this Markdown version the full table is listed; use the Category column to filter manually.

StoryBar

Event NameWidgetWhen TriggeredCategory
StorylyBarImpressionStoryBarWhen the Story Bar is seen by the user with new groupsImpression
StoryImpressionStoryBarWhen a story is marked as watched by the userImpression
StoryViewedStoryBarWhen a story is loadedLifecycle
StoryShownStoryBarWhen a story is displayedLifecycle
StoryCompletedStoryBarWhen a story is completedLifecycle
StoryDismissedStoryBarWhen a story is dismissedLifecycle
StoryPausedStoryBarWhen a story is pausedLifecycle
StoryResumedStoryBarWhen a story is resumedLifecycle
StoryGroupOpenedStoryBarWhen a group is opened by user, deep link, or programmaticallyNavigation
StoryGroupUserOpenedStoryBarWhen a group is opened by user tapNavigation
StoryGroupDeepLinkOpenedStoryBarWhen a group is opened via deep linkNavigation
StoryGroupProgrammaticallyOpenedStoryBarWhen a group is opened programmaticallyNavigation
StoryGroupCompletedStoryBarWhen all stories in the group are completedLifecycle
StoryGroupClosedStoryBarWhen the user closes a groupNavigation
StoryGroupPreviousSwipedStoryBarWhen swiped to the previous groupNavigation
StoryGroupNextSwipedStoryBarWhen swiped to the next groupNavigation
StoryPreviousClickedStoryBarWhen the previous story is tappedNavigation
StoryNextClickedStoryBarWhen the next story is tappedNavigation
StoryCTAClickedStoryBarWhen a CTA button is tapped or swipe up is performedClick / CTA
StoryButtonActionClickedStoryBarWhen a button is tappedClick / CTA
StoryImageButtonActionClickedStoryBarWhen an image button is tappedClick / CTA
StorySwipeActionClickedStoryBarWhen a swipe action is tappedClick / CTA
StoryProductTagExpandedStoryBarWhen a product tag dot is tappedClick / CTA
StoryProductTagClickedStoryBarWhen an expanded product area is tappedClick / CTA
StoryProductCardClickedStoryBarWhen a product card is tappedClick / CTA
StoryProductCatalogClickedStoryBarWhen a product catalog is tappedClick / CTA
StoryLikedStoryBarWhen a story is likedInteraction
StorySharedStoryBarWhen a story share URL is generatedInteraction
StoryPollAnsweredStoryBarWhen a poll is answeredInteraction
StoryQuizAnsweredStoryBarWhen a quiz is answeredInteraction
StoryImageQuizAnsweredStoryBarWhen an image quiz is answeredInteraction
StoryEmojiClickedStoryBarWhen an emoji is selected from the listInteraction
StoryRatedStoryBarWhen a rating component is votedInteraction
StoryCountdownReminderAddedStoryBarWhen a countdown reminder is addedInteraction
StoryCountdownReminderRemovedStoryBarWhen a countdown reminder is removedInteraction
StoryPromoCodeCopiedStoryBarWhen a promo code is copiedInteraction
StoryCommentSentStoryBarWhen a comment is submittedInteraction
StoryCommentInputOpenedStoryBarWhen the comment input is openedInteraction
StoryCommentInputClosedStoryBarWhen the comment input is closedInteraction
StorySeekedStoryBarWhen the user seeks forward in a long story videoInteraction

Video Feed

Event NameWidgetWhen TriggeredCategory
VideoFeedBarImpressionVideo FeedWhen Video Feed is seen by the user with new groupsImpression
VideoFeedItemImpressionVideo FeedWhen an item is marked as watched by the userImpression
VideoFeedItemViewedVideo FeedWhen an item is loadedLifecycle
VideoFeedItemCompletedVideo FeedWhen an item is completedLifecycle
VideoFeedItemPausedVideo FeedWhen an item is pausedLifecycle
VideoFeedItemResumedVideo FeedWhen an item is resumedLifecycle
VideoFeedGroupOpenedVideo FeedWhen a group is opened (user, deep link, or programmatic)Navigation
VideoFeedGroupUserOpenedVideo FeedWhen a group is opened by user tapNavigation
VideoFeedGroupDeepLinkOpenedVideo FeedWhen a group is opened via deep linkNavigation
VideoFeedGroupClosedVideo FeedWhen a group is closedNavigation
VideoFeedGroupCompletedVideo FeedWhen all items in the group are completedLifecycle
VideoFeedGroupPreviousSwipedVideo FeedWhen swiped to the previous groupNavigation
VideoFeedGroupNextSwipedVideo FeedWhen swiped to the next groupNavigation
VideoFeedItemPreviousClickedVideo FeedWhen the previous item is tappedNavigation
VideoFeedItemNextClickedVideo FeedWhen the next item is tappedNavigation
VideoFeedItemCTAClickedVideo FeedWhen a CTA button is tappedClick / CTA
VideoFeedItemButtonActionClickedVideo FeedWhen a button is tappedClick / CTA
VideoFeedItemSwipeActionClickedVideo FeedWhen a swipe action is tappedClick / CTA
VideoFeedItemProductTagClickedVideo FeedWhen a product tag is tappedClick / CTA
VideoFeedItemProductCardClickedVideo FeedWhen a product card is tappedClick / CTA
VideoFeedItemLikedVideo FeedWhen an item is likedInteraction
VideoFeedItemSharedVideo FeedWhen a share URL is generatedInteraction
VideoFeedItemPollAnsweredVideo FeedWhen a poll is answeredInteraction
VideoFeedItemQuizAnsweredVideo FeedWhen a quiz is answeredInteraction
VideoFeedItemPromoCodeCopiedVideo FeedWhen a promo code is copiedInteraction
VideoFeedItemCommentSentVideo FeedWhen a comment is submittedInteraction
VideoFeedItemSeekedVideo FeedWhen the video is seeked forwardInteraction

Banner

Event NameWidgetWhen TriggeredCategory
BannerImpressionBannerWhen the banner is marked as watched by the userImpression
BannerViewedBannerWhen the banner is displayed on screenLifecycle
BannerCompletedBannerWhen the banner is completedLifecycle
BannerPreviousSwipedBannerWhen swiped to the previous bannerNavigation
BannerNextSwipedBannerWhen swiped to the next bannerNavigation
BannerCTAClickedBannerWhen the CTA button is tappedClick / CTA

Other Callbacks

CallbackDescriptionUsage
onWidgetReady(widget, ratio)Fired when widget loads with the aspect ratio. Widget stays at 0 height if not handled.Compute height = width / ratio and call requestLayout() / update frame.
onActionClicked(widget, url, payload)Fired when a CTA/link is tapped. Returns the URL defined in the dashboard.Route URL through deep link handler or open in browser.
onFail(widget, payload)Fired when the widget or an operation fails. Returns STRErrorPayload.Log the error and show a fallback UI if needed.

SDK Events → Dashboard Metrics Mapping

This section maps SDK-level events to the metrics visible in the Storyly Dashboard. Use this as a reference when verifying that your analytics implementation aligns with dashboard data.

Dashboard MetricDashboard LabelCorresponding SDK EventsDescription
ImpressionsImpressionsStorylyBarImpression, VideoFeedBarImpression, BannerImpressionTotal number of times the widget was viewed with new content. Triggered once per session per new group set.
Unique ImpressionsUnique ImpressionsStorylyBarImpression (deduplicated)Unique users who saw the widget. Deduplication is handled server-side based on user identifier.
Story / Item ViewsStory ViewsStoryViewed, VideoFeedItemViewed, BannerViewedTotal number of times individual content items were loaded and displayed.
Completion RateCompletion RateStoryCompleted, VideoFeedItemCompleted, BannerCompletedNumber of stories/items watched to the end. Completion rate = completions / views.
CTA ClicksCTA ClicksStoryCTAClicked, VideoFeedItemCTAClicked, BannerCTAClickedNumber of CTA button taps or swipe-up actions. Click rate = CTA clicks / impressions.
InteractionsInteractionsStoryButtonActionClicked, StoryImageButtonActionClicked, StorySwipeActionClickedInteractive element taps within content. Counted as engagement interactions on the dashboard.
Product ClicksProduct ClicksStoryProductTagClicked, StoryProductCardClicked, VideoFeedItemProductCardClickedTaps on shoppable product elements. Feeds into the commerce analytics section of the dashboard.
Poll / Quiz EngagementInteractive EngagementStoryPollAnswered, StoryQuizAnswered, VideoFeedItemPollAnswered, VideoFeedItemQuizAnsweredResponses to interactive content components. Shown as engagement rate in the dashboard.
LikesLikesStoryLiked, VideoFeedItemLikedNumber of like reactions on content.
SharesSharesStoryShared, VideoFeedItemSharedNumber of share URL generations. Note: fires when the URL is created, not when the user actually completes the share.
Open RateOpens / Open RateStoryGroupOpened, VideoFeedGroupOpenedNumber of times a story/video group was opened. Open rate = opens / impressions.
Promo Code ActionsPromo Code ActionsStoryPromoCodeCopied, VideoFeedItemPromoCodeCopiedNumber of times a promo code was copied from the widget.

Key Notes

NoteDetail
Impression vs ViewedViewed fires immediately when content appears on screen. Impression fires after the user has watched for a qualifying duration — a stronger engagement signal.
Using getType()STREvent does not expose a .type property. Always use baseEvent.getType() to retrieve the event name as a string.
Payload typesSTREventPayload is for onEvent, STRErrorPayload is for onFail, and STRPayload is for onActionClicked. Do not mix these.
Share event timingStoryShared / VideoFeedItemShared fires when the share URL is generated, not when the user completes the share action in the OS sheet.

Did this page help you?