---
title: Custom Events Guide
description: Custom events guide for the Opensend SDK.
---

[Skip to content](https://help.opensend.com/opensend-sdk/custom-events-guide#main-content)

[Contact Support](https://help.opensend.com/kb-tickets/new?hsLang=en)

[![Logo Black.png\]](https://help.opensend.com/hs-fs/hubfs/Logo%20Black.png?height=33&name=Logo%20Black.png)](https://opensend.com/)

Open main navigation

Close main navigation

- [Contact Support](https://help.opensend.com/kb-tickets/new)
- [Return to opensend.com](https://opensend.com/)

[Return to opensend.com](https://opensend.com/)

 Hello. How can we help you?

- There are no suggestions because the search field is empty.

1. [Success Center](https://help.opensend.com/?hsLang=en)
2. [Getting started](https://help.opensend.com/getting-started?hsLang=en)
3. [Opensend SDK](https://help.opensend.com/getting-started?hsLang=en#opensend-sdk)

# Custom Events Guide

## Complete guide for tracking custom business events with the OIR SDK.

1. [Overview](https://help.opensend.com/opensend-sdk/custom-events-guide#overview)
2. [Event Structure](https://help.opensend.com/opensend-sdk/custom-events-guide#event-structure)
3. [Naming Conventions](https://help.opensend.com/opensend-sdk/custom-events-guide#naming-conventions)
4. [Event Categories](https://help.opensend.com/opensend-sdk/custom-events-guide#event-categories)
5. [Basic Events](https://help.opensend.com/opensend-sdk/custom-events-guide#best-practices)
6. [Advanced Events](https://help.opensend.com/opensend-sdk/custom-events-guide#advanced-events)
7. [Common Use Cases](https://help.opensend.com/opensend-sdk/custom-events-guide#common-use-cases)
8. [Framework Integration](https://help.opensend.com/opensend-sdk/custom-events-guide#framework-integration)
9. [Validation](https://help.opensend.com/opensend-sdk/custom-events-guide#validation)
10. [Best Practices](https://help.opensend.com/opensend-sdk/custom-events-guide#best-practices)

### Overview

Custom events allow you to track business-specific interactions that are important to your application. The SDK captures the data with the original structure and delivers it as-is to the destination configured in your dashboard.

You can define any custom events using the standard syntax, including events not listed in this documentation. You can also modify the events listed here to fit your needs—just ensure alignment on the data format with your team.

#### Benefits

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#benefits>

- **Unlimited custom events**: Define any event that fits your business needs
- **Standard compliance**: Follows industry-standard event structure
- **Original data structure**: Data is preserved exactly as sent
- **Flexible delivery**: Configure destinations in your dashboard
- **Traffic filtering**: Custom event names can be used as traffic filters in connections

### Event Structure

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#event-structure>

#### Basic Format

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#basic-format>

```
_oirtrk.push([  'event',  {    event: 'event_name',    payload: {      // Event properties    },  },]);
```

 

#### Example

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#example>

```
_oirtrk.push([  'event',  {    event: 'button_click',    payload: {      event_category: 'engagement',      event_action: 'click',      event_label: 'hero_cta',      button_text: 'Get Started',      page_url: window.location.href,    },  },]);
```

 

### Naming Conventions

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#naming-conventions>

#### Recommended Structure

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#recommended-structure>

Use `[object]_[action]` pattern with `snake_case`:

```
button_clickform_submitvideo_playfile_downloadpage_exitmodal_opensearch_performedfilter_applied
```

 

#### Do's and Don'ts

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#dos-and-donts>

| ✅ Do | ❌ Don't |
| --- | --- |
| `button_click` | `buttonClick` |
| `form_submit` | `form-submit` |
| `video_play` | `VideoPlay` |
| `user_registration` | `userRegistration` |

### Event Categories

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#event-categories>

Organize events into logical categories for better analytics and filtering:

| Category | Purpose | Examples |
| --- | --- | --- |
| **engagement** | User interactions | `button_click`, `link_click`, `tab_switch` |
| **conversion** | Goal completions | `signup_complete`, `trial_started`, `lead_generated` |
| **navigation** | Page/section changes | `page_scroll`, `section_view`, `menu_opened` |
| **media** | Video, audio, image interaction | `video_play`, `video_pause`, `audio_complete` |
| **forms** | Form interactions | `form_start`, `form_submit`, `form_error` |
| **errors** | Error events | `javascript_error`, `api_error`, `validation_failed` |
| **search** | Search interactions | `search_performed`, `filter_applied`, `sort_changed` |
| **social** | Social sharing | `share_facebook`, `share_twitter`, `share_email` |

### Basic Events

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#basic-events>

#### Button Click

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#button-click>

Track user interactions with buttons and clickable elements.

Properties:

| Property | Type | Req | Description |
| --- | --- | --- | --- |
| event | string | ✅ | Event name (e.g., `button_click`) |
| payload | object | ✅ | Event attributes |
| payload.event\_category | string | ❌ | Event category (e.g., 'engagement') |
| payload.event\_action | string | ❌ | Action performed (e.g., 'click') |
| payload.event\_label | string | ❌ | Button identifier or label |
| payload.button\_text | string | ❌ | Text displayed on the button |
| payload.button\_id | string | ❌ | Button DOM ID or unique identifier |
| payload.page\_url | string | ❌ | Current page URL |
| payload.custom\_properties | object | ❌ | Additional custom data |

Example:

```
_oirtrk.push([  'event',  {    event: 'button_click',    payload: {      event_category: 'engagement',      event_action: 'click',      event_label: 'hero_cta',      button_text: 'Get Started',      button_id: 'cta-button',      page_url: window.location.href,    },  },]);
```

 

### User Registration

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#user-registration>

Track when users complete registration or sign-up.

Properties:

| Property | Type | Req | Description |
| --- | --- | --- | --- |
| event | string | ✅ | Event name (e.g., `user_registration`) |
| payload | object | ✅ | Event attributes |
| payload.method | string | ❌ | Registration method (email, social, etc.) |
| payload.source | string | ❌ | Where registration was initiated |
| payload.user\_type | string | ❌ | User tier or type (free, premium, etc.) |
| payload.campaign | string | ❌ | Marketing campaign identifier |
| payload.custom\_properties | object | ❌ | Additional custom data |

Example:

```
_oirtrk.push([  'event',  {    event: 'user_registration',    payload: {      method: 'email',      source: 'landing_page',      user_type: 'premium',      campaign: 'summer_2024',    },  },]);
```

 

### Feature Usage

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#feature-usage>

Track when users interact with specific features in your application.

Properties:

| Property | Type | Req | Description |
| --- | --- | --- | --- |
| event | string | ✅ | Event name (e.g., `feature_used`) |
| payload | object | ✅ | Event attributes |
| payload.feature\_name | string | ❌ | Name of the feature used |
| payload.usage\_duration | integer | ❌ | Time spent using feature (seconds) |
| payload.success | boolean | ❌ | Whether feature usage was successful |
| payload.user\_segment | string | ❌ | User segment or category |
| payload.custom\_properties | object | ❌ | Additional custom data |

**Example:**

```
_oirtrk.push([  'event',  {    event: 'feature_used',    payload: {      feature_name: 'advanced_search',      usage_duration: 45,      success: true,      user_segment: 'power_user',    },  },]);
```

 

### Content Engagement

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#content-engagement>

Track user engagement with content (articles, videos, etc.).

**Properties:**

| Property | Type | Req | Description |
| --- | --- | --- | --- |
| event | string | ✅ | Event name (e.g., `content_engagement`) |
| payload | object | ✅ | Event attributes |
| payload.content\_type | string | ❌ | Type of content (article, video, etc.) |
| payload.content\_id | string | ❌ | Unique content identifier |
| payload.engagement\_time | integer | ❌ | Time engaged with content (seconds) |
| payload.scroll\_depth | integer | ❌ | Scroll depth percentage (0-100) |
| payload.custom\_properties | object | ❌ | Additional custom data |

**Example:**

```
_oirtrk.push([  'event',  {    event: 'content_engagement',    payload: {      content_type: 'article',      content_id: 'article_123',      engagement_time: 120,      scroll_depth: 75,    },  },]);
```

 

### Advanced Events

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#advanced-events>

#### Product Search

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#product-search>

Track search queries and results within your application.

Properties:

| Property | Type | Req | Description |
| --- | --- | --- | --- |
| event | string | ✅ | Event name (e.g., `product_search`) |
| payload | object | ✅ | Event attributes |
| payload.search\_term | string | ❌ | User's search query |
| payload.results\_count | integer | ❌ | Number of results returned |
| payload.filters\_applied | array | ❌ | Array of filters applied |
| payload.search\_duration | float | ❌ | Time to complete search (seconds) |
| payload.user\_segment | string | ❌ | User segment or category |
| payload.custom\_properties | object | ❌ | Additional custom data |
| payload.custom\_properties.search\_source | string | ❌ | Where search was initiated (header, page) |
| payload.custom\_properties.autocomplete\_used | boolean | ❌ | Whether autocomplete was used |

**Example:**

```
_oirtrk.push([  'event',  {    event: 'product_search',    payload: {      search_term: 'wireless headphones',      filters_applied: ['brand', 'price_range'],      results_count: 24,      search_duration: 3.2,      user_segment: 'premium',      custom_properties: {        search_source: 'header',        autocomplete_used: true,        suggestions_shown: 5,      },    },  },]);
```

 

### Multi-Step Process Tracking

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#multi-step-process-tracking>

Track users progressing through multi-step flows (checkout, onboarding, etc.).

**Step Started Properties:**

| Property | Type | Req | Description |
| --- | --- | --- | --- |
| event | string | ✅ | Event name (e.g., `checkout_process`) |
| payload | object | ✅ | Event attributes |
| payload.step | string | ❌ | Name of current step |
| payload.step\_number | integer | ❌ | Current step number (1-based) |
| payload.total\_steps | integer | ❌ | Total number of steps in process |
| payload.process\_id | string | ❌ | Unique identifier for this process |
| payload.started\_at | string | ❌ | ISO timestamp when step started |
| payload.completed\_at | string | ❌ | ISO timestamp when step completed |
| payload.step\_duration | integer | ❌ | Time spent on step (seconds) |
| payload.custom\_properties | object | ❌ | Additional custom data |

**Example - Step Started:**

```
_oirtrk.push([  'event',  {    event: 'checkout_process',    payload: {      step: 'shipping_info',      step_number: 1,      total_steps: 4,      process_id: 'checkout_123',      started_at: new Date().toISOString(),    },  },]);
```

 

**Example - Step Completed:**

```
_oirtrk.push([  'event',  {    event: 'checkout_process',    payload: {      step: 'payment_method',      step_number: 2,      total_steps: 4,      process_id: 'checkout_123',      step_duration: 45,      completed_at: new Date().toISOString(),    },  },]);
```

 

**Process Abandoned Properties:**

| Property | Type | Req | Description |
| --- | --- | --- | --- |
| event | string | ✅ | Event name (e.g., `checkout_abandoned`) |
| payload | object | ✅ | Event attributes |
| payload.last\_step | string | ❌ | Name of last completed step |
| payload.step\_number | integer | ❌ | Last step number reached |
| payload.total\_steps | integer | ❌ | Total steps in process |
| payload.process\_id | string | ❌ | Unique process identifier |
| payload.abandonment\_reason | string | ❌ | Reason for abandonment (timeout, etc.) |
| payload.custom\_properties | object | ❌ | Additional custom data |

**Example - Process Abandoned:**

```
_oirtrk.push([  'event',  {    event: 'checkout_abandoned',    payload: {      last_step: 'payment_method',      step_number: 2,      total_steps: 4,      process_id: 'checkout_123',      abandonment_reason: 'timeout',    },  },]);
```

 

### Common Use Cases

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#common-use-cases>

#### User Engagement

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#user-engagement>

#### Page Scroll

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#page-scroll>

```
_oirtrk.push([  'event',  {    event: 'page_scroll',    payload: {      scroll_depth: 75,      page: '/products',      time_on_page: 120,      max_scroll_reached: 75,    },  },]);
```

 

#### Time Spent

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#time-spent>

```
_oirtrk.push([  'event',  {    event: 'time_spent',    payload: {      section: 'product_details',      duration: 45,      page: '/product/123',      interactions_count: 8,    },  },]);
```

 

#### Video Play

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#video-play>

```
_oirtrk.push([  'event',  {    event: 'video_play',    payload: {      video_id: 'demo_video_001',      video_title: 'Product Demo',      video_duration: 180,      current_time: 0,      source: 'product_page',    },  },]);
```

 

### Conversion Tracking

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#conversion-tracking>

#### Lead Generated

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#lead-generated>

```
_oirtrk.push([  'event',  {    event: 'lead_generated',    payload: {      lead_type: 'newsletter_signup',      source: 'popup',      campaign: 'summer_promotion',      conversion_value: 5.0,    },  },]);
```

 

#### Trial Started

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#trial-started>

```
_oirtrk.push([  'event',  {    event: 'trial_started',    payload: {      plan: 'premium',      trial_duration: 14,      source: 'pricing_page',      initial_value: 29.99,    },  },]);
```

 

#### File Download

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#file-download>

```
_oirtrk.push([  'event',  {    event: 'file_download',    payload: {      file_name: 'product_catalog.pdf',      file_type: 'pdf',      file_size_kb: 2048,      download_source: 'resources_page',    },  },]);
```

 

### Error Tracking

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#error-tracking>

#### JavaScript Error

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#javascript-error>

```
_oirtrk.push([  'event',  {    event: 'javascript_error',    payload: {      error_message: 'Cannot read property of undefined',      error_file: 'app.js',      error_line: 42,      error_column: 15,      user_agent: navigator.userAgent,      page_url: window.location.href,    },  },]);
```

 

#### API Error

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#api-error>

```
_oirtrk.push([  'event',  {    event: 'api_error',    payload: {      endpoint: '/api/users',      method: 'GET',      status_code: 500,      error_message: 'Internal Server Error',      response_time: 1200,      retry_count: 2,    },  },]);
```

 

#### Form Validation Error

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#form-validation-error>

```
_oirtrk.push([  'event',  {    event: 'form_validation_error',    payload: {      form_id: 'checkout_form',      field_name: 'email',      error_type: 'invalid_format',      error_message: 'Please enter a valid email',    },  },]);
```

 

### Search and Filter

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#search-and-filter>

#### Search Performed

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#search-performed>

```
_oirtrk.push([  'event',  {    event: 'search_performed',    payload: {      search_term: 'wireless headphones',      results_count: 24,      search_location: 'header',      filters_active: false,    },  },]);
```

 

#### Filter Applied

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#filter-applied>

```
_oirtrk.push([  'event',  {    event: 'filter_applied',    payload: {      filter_type: 'price_range',      filter_value: '50-100',      results_before: 100,      results_after: 24,      page: '/products',    },  },]);
```

 

### Wishlist

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#wishlist>

```
_oirtrk.push([  'event',  {    event: 'added_to_wishlist',    payload: {      item_id: 'ITM-12345',      item_name: 'Awesome T-Shirt',      item_brand: 'Nike',      item_category: 'Apparel',      price: 29.99,      custom_attributes: {        wishlist_id: 'wishlist_001',        user_segment: 'premium',      },    },  },]);
```

 

### Framework Integration

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#framework-integration>

#### React

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#react>

```
import { useEffect } from 'react';function ProductCard({ product }) {  const handleView = () => {    window._oirtrk.push([      'event',      {        event: 'product_viewed',        payload: {          product_id: product.id,          product_name: product.name,          category: product.category,          price: product.price,          view_source: 'product_card',        },      },    ]);  };  const handleAddToCart = () => {    window._oirtrk.push([      'event',      {        event: 'add_to_cart_clicked',        payload: {          product_id: product.id,          product_name: product.name,          price: product.price,          quantity: 1,        },      },    ]);  };  useEffect(() => {    // Track card impression    window._oirtrk.push([      'event',      {        event: 'product_card_impression',        payload: {          product_id: product.id,          position: product.index,          list_name: 'product_grid',        },      },    ]);  }, [product.id]);  return (    <div onClick={handleView}>      <h3>{product.name}</h3>      <p>${product.price}</p>      <button onClick={handleAddToCart}>Add to Cart</button>    </div>  );}
```

 

#### Vue

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#vue>

```
<template>  <div class="product-card">    <button @click="trackClick">          </button>    <div @mouseenter="trackHover">      <img :src="product.image" @load="trackImageLoad" />    </div>  </div></template><script>export default {  props: {    product: Object,    buttonText: String,  },  methods: {    trackClick() {      window._oirtrk.push([        'event',        {          event: 'button_click',          payload: {            button_id: this.buttonId,            page: this.$route.path,            component: 'CustomButton',            product_id: this.product.id,          },        },      ]);    },    trackHover() {      window._oirtrk.push([        'event',        {          event: 'product_hover',          payload: {            product_id: this.product.id,            product_name: this.product.name,            hover_location: 'product_card',          },        },      ]);    },    trackImageLoad() {      window._oirtrk.push([        'event',        {          event: 'product_image_loaded',          payload: {            product_id: this.product.id,            image_url: this.product.image,            load_time: performance.now(),          },        },      ]);    },  },  mounted() {    // Track component mount    window._oirtrk.push([      'event',      {        event: 'component_mounted',        payload: {          component_name: 'ProductCard',          product_id: this.product.id,        },      },    ]);  },};</script>
```

 

#### Angular

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#angular>

```
import { Component, OnInit, Input } from '@angular/core';@Component({  selector: 'app-product-card',  templateUrl: './product-card.component.html',})export class ProductCardComponent implements OnInit {  @Input() product: any;  ngOnInit() {    this.trackImpression();  }  trackImpression() {    (window as any)._oirtrk.push([      'event',      {        event: 'product_impression',        payload: {          product_id: this.product.id,          product_name: this.product.name,          category: this.product.category,        },      },    ]);  }  trackClick() {    (window as any)._oirtrk.push([      'event',      {        event: 'product_click',        payload: {          product_id: this.product.id,          click_source: 'product_card',        },      },    ]);  }}
```

 

### Validation

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#validation>

#### Validation Function

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#validation-function>

```
function validateCustomEvent(event, data) {  if (!event || typeof event !== 'string') {    throw new Error('Event name is required and must be a string');  }  if (!data || typeof data !== 'object') {    throw new Error('Event data must be an object');  }  // Validate common properties  if (data.event_category && typeof data.event_category !== 'string') {    throw new Error('event_category must be a string');  }  if (data.value !== undefined && typeof data.value !== 'number') {    throw new Error('value must be a number');  }  // Validate naming convention  if (!/^[a-z][a-z0-9_]*$/.test(event)) {    console.warn(`Event name "${event}" does not follow naming convention (snake_case)`);  }  return true;}
```

 

### Usage

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#usage>

```
try {  const eventName = 'button_click';  const eventData = {    event_category: 'engagement',    event_action: 'click',    value: 1,  };  validateCustomEvent(eventName, eventData);  window._oirtrk.push([    'event',    {      event: eventName,      payload: eventData,    },  ]);} catch (error) {  console.error('Custom event validation failed:', error);}
```

 

### Best Practices

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#best-practices>

#### 1. Consistent Naming

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#1-consistent-naming>

- Use `snake_case` for all event names
- Be descriptive but concise
- Follow a consistent pattern across your application
- Start with the object/noun, followed by the action/verb

#### 2. Meaningful Data

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#2-meaningful-data>

- Include relevant context in your payload
- Use appropriate data types
- Avoid including sensitive personal information

#### 3. Keep Payloads Reasonable

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#3-keep-payloads-reasonable>

```
// ❌ BAD - Unnecessary data{  event: 'button_click',  payload: {    unnecessary_field_1: null,    unnecessary_field_2: undefined,    unused_metadata: {}  }}// ✅ GOOD - Clean payload{  event: 'button_click',  payload: {    button_id: 'cta-button',    page: '/home'  }}
```

 

#### 4. Use Consistent Property Names

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#4-use-consistent-property-names>

```
// Use the same property names everywhere{  event: 'product_viewed',  payload: {    product_id: product.sku,      // Always use product_id    product_name: product.title,  // Always use product_name    price: product.price,    quantity: product.qty  }}
```

 

#### 5. Privacy Compliance

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#5-privacy-compliance>

- Don't include PII in event data—use the [identify function](https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/user-identification.md) instead
- Follow GDPR, CCPA regulations
- Only track necessary data

### Next Steps

<https://github.com/Intelligence-Labs/tagoir-sdk/blob/develop/docs/user-guides/custom-events.md#next-steps>

- **[Ecommerce Events](https://help.opensend.com/opensend-sdk/ecommerce-events?hsLang=en)** - Ecommerce event tracking
- **[User Identification Guide](https://help.opensend.com/opensend-sdk/user-identification-guide?hsLang=en)** - Identify users
- **[Installation Guide](https://help.opensend.com/opensend-sdk/installation-guide?hsLang=en)** - Install and configure the SDK

- [Getting started](https://help.opensend.com/getting-started?hsLang=en#main-content)

    - [Start Here!](https://help.opensend.com/getting-started?hsLang=en#start-here)
    - [Installation and Setup](https://help.opensend.com/getting-started?hsLang=en#installation-and-setup)
    - [CNAME Setup](https://help.opensend.com/getting-started?hsLang=en#cname-setup)
    - [Opensend SDK](https://help.opensend.com/getting-started?hsLang=en#opensend-sdk)
- [Best Practices to Maximize Revenues](https://help.opensend.com/best-practices-to-maximize-revenues?hsLang=en#main-content)

    - [Direct-to-consumer](https://help.opensend.com/best-practices-to-maximize-revenues?hsLang=en#direct-to-consumer)
    - [Business-to-business](https://help.opensend.com/best-practices-to-maximize-revenues?hsLang=en#business-to-business)
    - [Deliverability](https://help.opensend.com/best-practices-to-maximize-revenues?hsLang=en#deliverability)
- [Dashboards & Reports](https://help.opensend.com/dashboards-reports?hsLang=en#main-content)

    - [Klaviyo Reports](https://help.opensend.com/dashboards-reports?hsLang=en#klaviyo-reports)
    - [Iterable Reports](https://help.opensend.com/dashboards-reports?hsLang=en#iterable-reports)
- [Reconnect](https://help.opensend.com/reconnect?hsLang=en#main-content)

    - [Klaviyo](https://help.opensend.com/reconnect?hsLang=en#klaviyo)
    - [Iterable](https://help.opensend.com/reconnect?hsLang=en#iterable)
    - [Bloomreach](https://help.opensend.com/reconnect?hsLang=en#bloomreach)
    - [Attentive](https://help.opensend.com/reconnect?hsLang=en#attentive)
    - [Salesforce Marketing Cloud](https://help.opensend.com/reconnect?hsLang=en#salesforce-marketing-cloud)
- [Personas](https://help.opensend.com/personas?hsLang=en)
- [Revive](https://help.opensend.com/revive?hsLang=en)
- [Integrations](https://help.opensend.com/integrations?hsLang=en#main-content)

    - [API Keys and Account IDs](https://help.opensend.com/integrations?hsLang=en#api-keys-and-account-ids)
    - [Bloomreach](https://help.opensend.com/integrations?hsLang=en#bloomreach)
    - [Braze](https://help.opensend.com/integrations?hsLang=en#braze)
    - [Facebook](https://help.opensend.com/integrations?hsLang=en#facebook)
    - [Google](https://help.opensend.com/integrations?hsLang=en#google)
    - [Iterable](https://help.opensend.com/integrations?hsLang=en#iterable)
    - [Klaviyo](https://help.opensend.com/integrations?hsLang=en#klaviyo)
    - [Listrak](https://help.opensend.com/integrations?hsLang=en#listrak)
    - [Sendlane](https://help.opensend.com/integrations?hsLang=en#sendlane)
    - [Suppression List](https://help.opensend.com/integrations?hsLang=en#suppression-list)
    - [Webhook](https://help.opensend.com/integrations?hsLang=en#webhook)
    - [Yotpo](https://help.opensend.com/integrations?hsLang=en#yotpo)
    - [Zapier](https://help.opensend.com/integrations?hsLang=en#zapier)
    - [Attentive](https://help.opensend.com/integrations?hsLang=en#attentive)
    - [Salesforce Marketing Cloud](https://help.opensend.com/integrations?hsLang=en#salesforce-marketing-cloud)
- [FAQs](https://help.opensend.com/faqs?hsLang=en)
- [General](https://help.opensend.com/general?hsLang=en)

[![Chill listening crop-3](https://help.opensend.com/hs-fs/hubfs/OpenSend_Logo%20icon%202.png?width=42&height=42&name=OpenSend_Logo%20icon%202.png "Chill listening crop-3")](https://www.opensend.com/)

Opensend Help Center

Copyright © 2026, Opensend Inc