
## Set Tracker Delegate
---
This method sets an object for Tracker module delegate methods.
**Declared In:**  
Headers/SNRTracker.h
  
**Related To:**  
[TrackerDelegate](/developers/mobile-sdk/listeners-and-delegates/ios-delegates#tracker-delegate)  
  
**Class:**  
[Tracker](/developers/mobile-sdk/class-reference/ios/modules#tracker)
  
**Declaration:**  

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1118">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1118-0" data-tab-group="tabgrp-1118" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1118-1" data-tab-group="tabgrp-1118">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1118-0" data-tab-group="tabgrp-1118" data-tab-active="true">

```Swift
static func setDelegate(_ delegate: TrackerDelegate)
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1118-1" data-tab-group="tabgrp-1118">

```Objective-C
+ (void)setDelegate:(SNRTrackerDelegate *)delegate
```

</div>
</div>

  
**Discussion:**  
Learn more about the methods and the purpose of this listener [here](/developers/mobile-sdk/listeners-and-delegates/ios-delegates#tracker-delegate). 

## Get customer's events
---
This method retrieves events for an authenticated customer.
  
This method requires customer authentication.
**Declared In:**  
Headers/SNRClient.h
  
**Related To:**  
[ClientEventsApiQuery](/developers/mobile-sdk/class-reference/ios/client#clienteventsapiquery)
  
**Class:**  
[Client](/developers/mobile-sdk/class-reference/ios/modules#client)
  
**Declaration:**  

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1119">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1119-0" data-tab-group="tabgrp-1119" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1119-1" data-tab-group="tabgrp-1119">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1119-0" data-tab-group="tabgrp-1119" data-tab-active="true">

```Swift
static func getEvents(apiQuery: ClientEventsApiQuery, success: (([ClientEventData]) -> Void), failure: ((ApiError) -> Void)) -> Void
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1119-1" data-tab-group="tabgrp-1119">

```Objective-C
+ (void)getEventsWithApiQuery:(nonnull SNRClientEventsApiQuery *)apiQuery success:(nonnull void (^)(NSArray<SNRClientEventData *> *events))success failure:(nonnull void (^)(NSError *error))failure
```

</div>
</div>

  
**Parameters:**  
| Parameter | Type | Mandatory | Default | Description |
| --- | --- | --- | --- | --- |
| **apiQuery** | [ClientEventsApiQuery](/developers/mobile-sdk/class-reference/ios/client#clienteventsapiquery) | yes | - | Object responsible for storing all query parameters |
| **success** | (([ClientEventData]) -> Void) | yes | - | Closure/Block to be executed when the operation is completed successfully |
| **failure** | (([ApiError](/developers/mobile-sdk/class-reference/ios/miscellaneous#snrapierror)) -> Void) | yes | - | Closure/Block to be executed when the operation is completed with an error |
  
**Return Value:**  
No value is returned. 

## Set custom identifier for events
---
This method sets a custom identifier in the parameters of every event.

You can pass a custom identifier to match your customers in our database.
**Declared In:**  
Headers/SNRTracker.h
  
**Class:**  
[Tracker](/developers/mobile-sdk/class-reference/ios/modules#tracker)
  
**Declaration:**  

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1120">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1120-0" data-tab-group="tabgrp-1120" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1120-1" data-tab-group="tabgrp-1120">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1120-0" data-tab-group="tabgrp-1120" data-tab-active="true">

```Swift
static func setCustomIdentifier(customIdentifier: String?) -> Void
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1120-1" data-tab-group="tabgrp-1120">

```Objective-C
+ (void)setCustomIdentifier:(nullable NSString *)customIdentifier;
```

</div>
</div>

  
**Parameters:**  
| Parameter | Type | Mandatory | Default | Description |
| --- | --- | --- | --- | --- |
| **customIdentifier** | String | no | - | Customer's custom identifier |
  
**Return Value:**  
No value is returned.

## Set custom email for events
---
This method sets a custom email in the parameters of every event.

You can pass a custom email to match your customers in our database.
**Declared In:**  
Headers/SNRTracker.h
  
**Class:**  
[Tracker](/developers/mobile-sdk/class-reference/ios/modules#tracker)
  
**Declaration:**  

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1121">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1121-0" data-tab-group="tabgrp-1121" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1121-1" data-tab-group="tabgrp-1121">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1121-0" data-tab-group="tabgrp-1121" data-tab-active="true">

```Swift
static func setCustomEmail(customEmail: String?) -> Void
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1121-1" data-tab-group="tabgrp-1121">

```Objective-C
+ (void)setCustomEmail:(nullable NSString *)customEmail;
```

</div>
</div>

  
**Parameters:**  
| Parameter | Type | Mandatory | Default | Description |
| --- | --- | --- | --- | --- |
| **customEmail** | String | no | - | Customer's custom email |
  
**Return Value:**  
No value is returned.

## Send event
---
This method sends an event.


<div class="admonition admonition-warning"><div class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z" /></svg></div><div class="admonition-body"><div class="admonition-content">

DO NOT send `transaction.charge` events as custom events.<br>
Transactions must be tracked with these endpoints:
- [`/v4/transactions`](https://developers.synerise.com/DataManagement/DataManagement.html#operation/CreateATransaction) (single transaction)
- [`/v4/transactions/batch`](https://developers.synerise.com/DataManagement/DataManagement.html#operation/BatchAddOrUpdateTransactions) (multiple transactions)

  </div></div></div>

  

  <div class="admonition admonition-note"><div class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg></div><div class="admonition-body"><div class="admonition-content">

- The tracker caches and enqueues all your events locally, so they all will be sent eventually.
- The API key must have the `API_BATCH_EVENTS_CREATE` permission from the **Events** group.

</div></div></div>

**Declared In:**  
Headers/SNRTracker.h
  
**Related To:**  
[Event](/developers/mobile-sdk/class-reference/ios/events#event)  
[TrackerParams](/developers/mobile-sdk/class-reference/ios/events#trackerparams)  
[TrackerParamsBuilder](/developers/mobile-sdk/class-reference/ios/events#trackerparamsbuilder)   
  
**Class:**  
[Tracker](/developers/mobile-sdk/class-reference/ios/modules#tracker)
  
**Declaration:**  

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1122">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1122-0" data-tab-group="tabgrp-1122" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1122-1" data-tab-group="tabgrp-1122">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1122-0" data-tab-group="tabgrp-1122" data-tab-active="true">

```Swift
static func send(_: Event) -> Void
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1122-1" data-tab-group="tabgrp-1122">

```Objective-C
+ (void)send:(SNREvent *)event
```

</div>
</div>

  
**Parameters:**  
| Parameter | Type | Mandatory | Default | Description |
| --- | --- | --- | --- | --- |
| **event** | [Event](/developers/mobile-sdk/class-reference/ios/events#event) | yes | - | [Event](/developers/mobile-sdk/class-reference/ios/events#event) object |
  
**Return Value:**  
No value is returned.
  
**Example:**
You may use standard objects in SDK, for example `ProductAddedToCartEvent` that represents a 'customer added a product to cart' event:  

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1123">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1123-0" data-tab-group="tabgrp-1123" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1123-1" data-tab-group="tabgrp-1123">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1123-0" data-tab-group="tabgrp-1123" data-tab-active="true">

```Swift
let event: ProductAddedToCartEvent = ProductAddedToCartEvent(label: "Product added!", sku: "12345", finalPrice: UnitPrice(amount: 100.0), quantity: 1)
event.setCategory("Smartphones")
event.setName("iPhone")
event.setProducer("Apple")
Tracker.send(event)
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1123-1" data-tab-group="tabgrp-1123">

```Objective-C
SNRProductAddedToCartEvent *event = [[SNRProductAddedToCartEvent alloc] initWithLabel:@"Product added!" sku:@"12345" finalPrice:[[SNRUnitPrice alloc] initWithAmount:100.0f] quantity:1];
[event setCategory:@"Smartphones"];
[event setName:@"iPhone"];
[event setProducer:@"Apple"];
[SNRTracker send:event];
```

</div>
</div>

  
You can also pass additional parameters along with `ProductAddedToCartEvent` and other events, like in the example below:

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1124">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1124-0" data-tab-group="tabgrp-1124" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1124-1" data-tab-group="tabgrp-1124">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1124-0" data-tab-group="tabgrp-1124" data-tab-active="true">

```Swift
let params: TrackerParams = TrackerParams.make { (builder) in
    builder.setString("12345", forKey: "snr_sku")
    builder.setInt(1, forKey: "snr_quantity")
    builder.setDouble(100.0, forKey: "snr_finalPrice")
}
let event: ProductAddedToCartEvent = ProductAddedToCartEvent(label: "Product added!", sku: "12345", finalPrice: UnitPrice(amount: 100.0), quantity: 1, params: params)
event.setCategory("Smartphones")
event.setName("iPhone")
event.setProducer("Apple")
Tracker.send(event)
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1124-1" data-tab-group="tabgrp-1124">

```Objective-C
SNRTrackerParams *params = [SNRTrackerParams makeWithBuilder:^(SNRTrackerParamsBuilder *builder) {
    [builder setString:@"12345" forKey:@"snr_sku"];
    [builder setInt:1 forKey:@"snr_quantity"];
    [builder setDouble:100.0f forKey:@"snr_finalPrice"];
}];
SNRProductAddedToCartEvent *event = [[SNRProductAddedToCartEvent alloc] initWithLabel:@"Product added!" sku:@"12345" finalPrice:[[SNRUnitPrice alloc] initWithAmount:100.0f] quantity:1 andParams:params];
[event setCategory:@"Smartphones"];
[event setName:@"iPhone"];
[event setProducer:@"Apple"];
[SNRTracker send:event];
```

</div>
</div>

  
If you want to track a fully customizable event, you should use `CustomEvent`:

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1125">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1125-0" data-tab-group="tabgrp-1125" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1125-1" data-tab-group="tabgrp-1125">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1125-0" data-tab-group="tabgrp-1125" data-tab-active="true">

```Swift
let params: TrackerParams = TrackerParams.make { (builder) in
    builder.setString("12345", forKey:"key_string");
    builder.setInt(1, forKey:"key_integer");
    builder.setDouble(1.0, forKey:"key_double");
    builder.setFloat(1.0, forKey:"key_float");
    builder.setBool(true, forKey:"key_bool");
    builder.setObject(["key": "value"], forKey:"key_object");
}
let event: CustomEvent = CustomEvent(label: "custom event", action: "custom event action", params: params)
Tracker.send(event)
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1125-1" data-tab-group="tabgrp-1125">

```Objective-C
SNRTrackerParams *params = [SNRTrackerParams makeWithBuilder:^(SNRTrackerParamsBuilder *builder) {
    [builder setString:@"string" forKey:@"key_string"];
    [builder setInt:1 forKey:@"key_integer"];
    [builder setDouble:1.0f forKey:@"key_double"];
    [builder setFloat:1.0f forKey:@"key_float"];
    [builder setBool:YES forKey:@"key_bool"];
    [builder setObject:@{ @"key" : @"value" } forKey:@"key_object"];
}];
SNRCustomEvent *event = [[SNRCustomEvent alloc] initWithLabel:"custom event" action:@"custom event action" andParams:params];
[SNRTracker send:event];
```

</div>
</div>


## Flush events from Tracker
---
This method forces sending the events from the queue to the server.


<div class="admonition admonition-note"><div class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg></div><div class="admonition-body"><div class="admonition-content">

The API key must have the `API_BATCH_EVENTS_CREATE` permission from the **Events** group.

</div></div></div>

**Declared In:**  
Headers/SNRTracker.h
  
**Related To:**  
[Event](/developers/mobile-sdk/class-reference/ios/events#event)  
[TrackerParams](/developers/mobile-sdk/class-reference/ios/events#trackerparams)  
[TrackerParamsBuilder](/developers/mobile-sdk/class-reference/ios/events#trackerparamsbuilder)  
  
**Class:**  
[Tracker](/developers/mobile-sdk/class-reference/ios/modules#tracker)
  
**Declaration:**  

<div class="content-tabs code-tabs" data-tab-group="tabgrp-1126">
<div class="tab-buttons"><button class="tab-button" data-tab-id="tabgrp-1126-0" data-tab-group="tabgrp-1126" data-tab-active="true">Swift</button><button class="tab-button" data-tab-id="tabgrp-1126-1" data-tab-group="tabgrp-1126">Objective-C</button></div>

<div class="tab-panel" data-tab-id="tabgrp-1126-0" data-tab-group="tabgrp-1126" data-tab-active="true">

```Swift
static func flushEvents(completionHandler: (() -> Void)?) -> Void
```

</div>

<div class="tab-panel" data-tab-id="tabgrp-1126-1" data-tab-group="tabgrp-1126">

```Objective-C
+ (void)flushEventsWithCompletionHandler:(nullable void (^)(void))completion
```

</div>
</div>

  
**Parameters:**  
| Parameter | Type | Mandatory | Default | Description |
| --- | --- | --- | --- | --- |
| **completionHandler** | (() -> Void) | no | - | Block/Closure to be executed when the tracker has finished flushing events to Synerise backend, no matter the result |
  
**Return Value:**  
No value is returned.
