Placement SDK Analytics

This guide covers the core concepts and a step-by-step implementation of Placement SDK Analytics in your Android application.

This guide explains how your app receives widget analytics through the Placement SDK. Events are delivered via STRListener on STRPlacementView, using typed STREventPayload subclasses per widget. Shopping-related events are delivered on STRProductListener.

📘

Before you begin

Make sure you have a working Storyly Placement SDK integration as described in the Initial Setup.

Integration

class MyFragment : Fragment() {
    private val dataProvider by lazy { STRPlacementDataProvider(requireContext()) }
    private val placementView by lazy {
        STRPlacementView(requireContext(), dataProvider = dataProvider).apply {
            listener = object : STRListener {
                override fun onEvent(widget: STRWidgetController, payload: STREventPayload) {}
            }
            productListener = object : STRProductListener {
                override fun onProductEvent(widget: STRWidgetController, event: STRProductEvent) {}
            }
        }
    }
}

Sending events to your analytics stack

Implement onEvent / onProductEvent and forward getType() together with any fields you need from the typed payload.

// In your STRListener implementation:
override fun onEvent(widget: STRWidgetController, payload: STREventPayload) {
    val eventName = payload.baseEvent.getType()
    // analytics.track(name = eventName, properties = …)
}

// In your STRProductListener implementation:
override fun onProductEvent(widget: STRWidgetController, event: STRProductEvent) {
    val eventName = event.getType()
    // analytics.track(name = eventName, properties = …)
}

Widget-specific payloads

In order to get widget specific payload use following extension functions on STREventPayload.

WidgetPayload typeExtension / narrow
Story BarStoryBarEventPayloadpayload.storyBar { }
BannerBannerEventPayloadpayload.banner { }
CanvasCanvasEventPayloadpayload.canvas { }
Swipe CardSwipeCardEventPayloadpayload.swipeCard { }
Video FeedVideoFeedEventPayloadpayload.videoFeed { }

Inside the block (or cast), you get:

  • A widget-specific event enum or type.
  • A widget-specific payload object.

Example — Story Bar

override fun onEvent(widget: STRWidgetController, payload: STREventPayload) {
    payload.storyBar { barPayload ->
        val event = barPayload.event
        val group = barPayload.payload.group
        val story = barPayload.payload.story
        val component = barPayload.payload.component

        when (event) {
            StoryBarEvent.StoryGroupOpened -> { /* Story group opened */ }
            StoryBarEvent.StoryShown -> { /* Story shown */ }
            StoryBarEvent.StoryDismissed -> { /* Story dismissed */ }
            else -> { /* check other events if necessary */ }
        }
    }
}

Checklist

  1. Implement onEvent and forward payload.baseEvent.getType() plus enriched properties.
  2. Implement onProductEvent (and cart/wishlist handlers if you use shoppable content).