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.
| Widget | Payload type | Extension / narrow |
|---|---|---|
| Story Bar | StoryBarEventPayload | payload.storyBar { } |
| Banner | BannerEventPayload | payload.banner { } |
| Canvas | CanvasEventPayload | payload.canvas { } |
| Swipe Card | SwipeCardEventPayload | payload.swipeCard { } |
| Video Feed | VideoFeedEventPayload | payload.videoFeed { } |
Inside the block (or cast), you get:
- A widget-specific
eventenum or type. - A widget-specific
payloadobject.
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
- Implement
onEventand forwardpayload.baseEvent.getType()plus enriched properties. - Implement
onProductEvent(and cart/wishlist handlers if you use shoppable content).
Updated about 6 hours ago