Placement SDK Analytics
This guide covers the core concepts and a step-by-step implementation of Placement SDK Analytics in your iOS application.
This guide explains how your app receives widget analytics through the Placement SDK. Events are delivered via STRDelegate, using typed STREventPayload subclasses per widget. Shopping-related events are delivered on the STRProductDelegate
Before you begin
Make sure you have a working Storyly Placement SDK integration as described in the Initial Setup.
Integration
import StorylyPlacement
class ViewController: UIViewController {
private let dataProvider = STRPlacementDataProvider()
private lazy var placementView: STRPlacementView = {
let view = STRPlacementView(dataProvider: dataProvider)
view.delegate = self
view.productDelegate = self
return view
}()
}
extension ViewController: STRDelegate {
func onEvent(widget: STRWidgetController, payload: STREventPayload) {}
}
extension ViewController: STRProductDelegate {
func onProductEvent(widget: STRWidgetController, event: STRProductEvent) {}
}
Sending events to your analytics stack
Implement onEvent / onProductEvent and forward eventName together with any fields you need from the typed payload.
import StorylyCore
import StorylyPlacement
extension ViewController: STRDelegate {
func onEvent(widget: STRWidgetController, payload: STREventPayload) {
let eventName = payload.baseEvent.getType()
// analytics.track(name: eventName, properties: …)
}
}
extension ViewController: STRProductDelegate {
func onProductEvent(widget: STRWidgetController, event: STRProductEvent) {
let 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 |
|---|---|---|
| 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
import StorylyStoryBar
func onEvent(widget: STRWidgetController, payload: STREventPayload) {
payload.storyBar { barPayload in
let event = barPayload.event.type
let group = barPayload.payload.group
let story = barPayload.payload.story
let component = barPayload.payload.component
switch event {
case .StoryGroupOpened: // Story Group opened
case .StoryShown: // Story shown
case .StoryDismissed: // Story dismissed
default: // 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 1 day ago
