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.

WidgetPayload typeExtension
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

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

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