# 3rd Party Analytics

Hooking up Superwall events to 3rd party tools [#hooking-up-superwall-events-to-3rd-party-tools]

SuperwallKit automatically tracks some internal events. You can [view the list of events here](/docs/sdk/guides/3rd-party-analytics/tracking-analytics). We encourage you to also track them in your own analytics by implementing the [Superwall delegate](/docs/sdk/guides/using-superwall-delegate). Using the `handleSuperwallEvent(withInfo:)` function, you can forward events to your analytics service:

:::ios
## Tab

```swift Swift
extension SuperwallService: SuperwallDelegate {
  func handleSuperwallEvent(withInfo eventInfo: SuperwallEventInfo) {
    print("analytics event called", eventInfo.event.description)
    MyAnalyticsService.shared.track(
      event: eventInfo.event.description,
      params: eventInfo.params
    )
  }
}
```

## Tab

```swift Objective-C
- (void)handleSuperwallEventWithInfo:(SWKSuperwallEventInfo *)info {
  NSLog(@"Analytics event called %@", info.event.description));
  [[MyAnalyticsService shared] trackEvent:info.event.description params:info.params];
}
```


:::

<br />

> **Note**

You might also want to set user attribute to allow for
[Cohorting in 3rd Party Tools](/docs/sdk/guides/3rd-party-analytics/cohorting-in-3rd-party-tools).



Alternatively, if you want typed versions of all these events with associated values, you can access them via `eventInfo.event`:

:::ios
```swift
func handleSuperwallEvent(withInfo eventInfo: SuperwallEventInfo)  {
  switch eventInfo.event {
    case .firstSeen:
      break
    case .appOpen:
      break
    case .appLaunch:
      break
    case .identityAlias:
      break
    case .appInstall:
      break
    case .sessionStart:
      break
    case .deviceAttributes(let attributes):
      break
    case .subscriptionStatusDidChange:
      break
    case .appClose:
      break
    case .deepLink(let url):
      break
    case .triggerFire(let placementName, let result):
      break
    case .paywallOpen(let paywallInfo):
      break
    case .paywallClose(let paywallInfo):
      break
    case .paywallDecline(let paywallInfo):
      break
    case .transactionStart(let product, let paywallInfo):
      break
    case .transactionFail(let error, let paywallInfo):
      break
    case .transactionAbandon(let product, let paywallInfo):
      break
    case .transactionComplete(let transaction, let product, let type, let paywallInfo):
      break
    case .subscriptionStart(let product, let paywallInfo):
      break
    case .freeTrialStart(let product, let paywallInfo):
      break
    case .transactionRestore(let restoreType, let paywallInfo):
      break
    case .transactionTimeout(let paywallInfo):
      break
    case .userAttributes(let atts):
      break
    case .nonRecurringProductPurchase(let product, let paywallInfo):
      break
    case .paywallResponseLoadStart(let triggeredPlacementName):
      break
    case .paywallResponseLoadNotFound(let triggeredPlacementName):
      break
    case .paywallResponseLoadFail(let triggeredPlacementName):
      break
    case .paywallResponseLoadComplete(let triggeredPlacementName, let paywallInfo):
      break
    case .paywallWebviewLoadStart(let paywallInfo):
      break
    case .paywallWebviewLoadFail(let paywallInfo):
      break
    case .paywallWebviewLoadComplete(let paywallInfo):
      break
    case .paywallWebviewLoadTimeout(let paywallInfo):
      break
    case .paywallWebviewLoadFallback(let paywallInfo):
      break
    case .paywallWebviewProcessTerminated(let paywallInfo):
      break
    case .paywallProductsLoadStart(let triggeredPlacementName, let paywallInfo):
      break
    case .paywallProductsLoadFail(let triggeredPlacementName, let paywallInfo):
      break
    case .paywallProductsLoadComplete(let triggeredPlacementName):
      break
    case .paywallProductsLoadRetry(let triggeredPlacementName, let paywallInfo, let attempt):
      break
    case .surveyResponse(let survey, let selectedOption, let customResponse, let paywallInfo):
      break
    case .paywallPresentationRequest(let status, let reason):
      break
    case .touchesBegan:
      break
    case .surveyClose:
      break
    case .reset:
      break
    case .restoreStart:
      break
    case .restoreFail(let message):
      break
    case .restoreComplete:
      break
    case .configRefresh:
      break
    case .customPlacement(let name, let params, let paywallInfo):
      break
    case .configAttributes:
      break
    case .confirmAllAssignments:
      break
    case .configFail:
      break
    case .adServicesTokenRequestStart:
      break
    case .adServicesTokenRequestFail(let error):
      break
    case .adServicesTokenRequestComplete(let token):
      break
    case .shimmerViewStart:
      break
    case .shimmerViewComplete:
      break
    }
}
```
:::

> **Info**

Wanting to use events to see which product was purchased on a paywall? Check out this
[doc](/docs/sdk/guides/advanced/viewing-purchased-products).