---
title: "Add interaction events"
slug: "add-interaction-events"
abstract: "How to add events to an interaction, for example a goal or an outcome."
---
# Add interaction events

This topic demonstrates how to add various types of events to an [interaction](https://doc.sitecore.com/xp/en/developers/93/sitecore-experience-platform/add-interactions.html "Add interactions"). Keep the following in mind when adding events to an interaction:

- It is possible to associate an event with an incorrect definition (for example, associating an outcome definition with a `Goal`). The platform will not enforce any particular relationships between an event type collection model and a definition item. It is your responsibility to ensure the fidelity of your data.
- The `EngagementValue` property is optional and must be set manually. In a tracking context, the tracker will set the engagement value to the event’s definition item’s default engagement value before saving. In a non-tracking context, must use the [Marketing Operations API](https://doc.sitecore.com/xp/en/developers/93/sitecore-experience-platform/marketing-operations-api.html "Marketing Operations API") to retrieve the event definition item if you want to use the default engagement value.

<details>
<summary><h2>Adding a Goal to an interaction</h2></summary>

The following example demonstrates how to add a goal to an interaction.

```csharp
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using System;

namespace Documentation
{
    public class AddGoal
    {
        public async void ExampleAsync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var contact = new Sitecore.XConnect.Contact();

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";
                    var interaction = new Sitecore.XConnect.Interaction(contact, InteractionInitiator.Brand, channelId, userAgent);

                    Guid goalID = Guid.Parse("{21EC2020-3AEA-4069-A2DD-08002B30309D}"); // ID of goal item

                    var goal = new Goal(goalID, DateTime.UtcNow);

                    goal.EngagementValue = 20; // Manually setting engagement value rather than going to defintion item

                    interaction.Events.Add(goal);

                    client.AddContact(contact);
                    client.AddInteraction(interaction);

                    await client.SubmitAsync();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }

        // Sync example
        public void ExampleSync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var contact = new Sitecore.XConnect.Contact();

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";
                    var interaction = new Sitecore.XConnect.Interaction(contact, InteractionInitiator.Brand, channelId, userAgent);

                    Guid goalID = Guid.Parse("{21EC2020-3AEA-4069-A2DD-08002B30309D}"); // ID of goal item

                    var goal = new Goal(goalID, DateTime.UtcNow);

                    goal.EngagementValue = 20; // Manually setting engagement value rather than going to defintion item

                    interaction.Events.Add(goal);

                    client.AddContact(contact);
                    client.AddInteraction(interaction);

                    client.Submit();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }
    }
}

```

</details>

<details>
<summary><h2>Adding an Outcome to an interaction</h2></summary>

The following example demonstrates how to add an outcome to an interaction.

> [!note]
> Although `Currency` and `MonetaryValue` are mandatory properties, you can pass in `String.Empty` and `0.00m` if your outcome is not associated with a monetary value.

```csharp
using System;
using Sitecore.XConnect;
using Sitecore.XConnect.Client;

namespace Documentation
{
    public class AddOutcome
    {
        public async void Example()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var contact = new Sitecore.XConnect.Contact();

                    var channel = Guid.NewGuid(); // Use real channel ID from Sitecor

                    var interaction = new Interaction(contact, InteractionInitiator.Brand, channel, "iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)"); // Agent is iTunes

                    Guid outcomeId = Guid.Parse("{21EC2020-3AEA-4069-A2DD-08002B30309D}"); // ID of outcome item

                    var outcome = new Sitecore.XConnect.Outcome(outcomeId, DateTime.UtcNow, "USD", 100.00m);

                    interaction.Events.Add(outcome);

                    client.AddContact(contact);
                    client.AddInteraction(interaction);

                    await client.SubmitAsync();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }

        public void ExampleSync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var contact = new Sitecore.XConnect.Contact();

                    var channel = Guid.NewGuid(); // Use real channel ID from Sitecor

                    var interaction = new Interaction(contact, InteractionInitiator.Brand, channel, "iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)"); // Agent is iTunes

                    Guid outcomeId = Guid.Parse("{21EC2020-3AEA-4069-A2DD-08002B30309D}"); // ID of outcome item

                    var outcome = new Sitecore.XConnect.Outcome(outcomeId, DateTime.UtcNow, "USD", 100.00m);

                    interaction.Events.Add(outcome);

                    client.AddContact(contact);
                    client.AddInteraction(interaction);

                    client.Submit();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }
    }
}

```

</details>

<details>
<summary><h2>Adding a PageViewEvent to an interaction</h2></summary>

Web interactions are likely to have multiple, nested events (goals and page events will have a page view event parent). The following example demonstrates how to simulate a web visit, which includes adding `PageViewEvent` events.

The `PageViewEvent` allows you to store both the page URL and the associated item ID, which means that you can store alias URLs or query strings in the `Url` property.

```csharp
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using Sitecore.XConnect.Collection.Model;
using System;

namespace Documentation
{
    public class SampleWebVisit
    {
        // Async example
        public async void Example()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                // Create a new contact and set some facets
                var contact = new Contact();

                var personalInfoFacet = new PersonalInformation()
                {
                    FirstName = "Myrtle",
                    LastName = "McSitecore"
                };

                client.SetPersonal(contact, personalInfoFacet);

                client.AddContact(contact);

                // Create a new interaction for the contact
                Guid channelId = Guid.NewGuid(); // Use real channel ID from Sitecore
                string userAgent = "Sample User Agent";
                Interaction webInteraction = new Interaction(contact, InteractionInitiator.Brand, channelId, userAgent);

                // Create a new web visit facet model
                var webVisitFacet = new WebVisit();

                // Populate data about the web visit
                webVisitFacet.Browser = new BrowserData() { BrowserMajorName = "Chrome", BrowserMinorName = "Desktop", BrowserVersion = "22.0" };
                webVisitFacet.Language = "en";
                webVisitFacet.OperatingSystem = new OperatingSystemData() { Name = "Windows", MajorVersion = "10", MinorVersion = "4" };
                webVisitFacet.Referrer = "www.google.com";
                webVisitFacet.Screen = new ScreenData() { ScreenHeight = 1080, ScreenWidth = 685 };
                webVisitFacet.SearchKeywords = "sitecore";
                webVisitFacet.SiteName = "website";

                var itemId = Guid.NewGuid();
                var itemVersion = 5;

                // First page view
                PageViewEvent pageView = new PageViewEvent(new DateTime(2016, 10, 10, 13, 20, 22).ToUniversalTime(), itemId, itemVersion, "en");

                pageView.ItemLanguage = "en";
                pageView.Duration = new TimeSpan(3000);

                webInteraction.Events.Add(pageView);

                var secondItemId = Guid.NewGuid();
                var secondItemVersion = 2;

                // Second page view
                PageViewEvent pageView2 = new PageViewEvent(new DateTime(2016, 10, 10, 13, 21, 22).ToUniversalTime(), secondItemId, secondItemVersion, "en");

                pageView2.ItemLanguage = "en";
                pageView2.Duration = new TimeSpan(3200);

                webInteraction.Events.Add(pageView2);

                // First goal, associated with second page view
                Goal goal1 = new Goal(Guid.NewGuid(), new DateTime(2016, 10, 10, 13, 22, 22).ToUniversalTime());

                goal1.ParentEventId = pageView2.Id;

                webInteraction.Events.Add(goal1);

                var thirdItemId = Guid.NewGuid();
                var thirdItemVersion = 2;

                // Third page view
                PageViewEvent pageView3 = new PageViewEvent(new DateTime(2016, 10, 10, 13, 22, 22).ToUniversalTime(), thirdItemId, thirdItemVersion, "en");

                pageView3.ItemLanguage = "en";
                pageView3.Duration = new TimeSpan(1200);

                webInteraction.Events.Add(pageView3);

                // Set web visit facet on interaction
                client.SetWebVisit(webInteraction, webVisitFacet);

                // Add interaction
                client.AddInteraction(webInteraction);

                // Submit contact and interaction
                await client.SubmitAsync();
            }
        }

        // Sync example
        public void ExampleSync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                // Create a new contact and set some facets
                var contact = new Contact();

                var personalInfoFacet = new PersonalInformation()
                {
                    FirstName = "Myrtle",
                    LastName = "McSitecore"
                };

                client.SetPersonal(contact, personalInfoFacet);

                client.AddContact(contact);

                // Create a new interaction for the contact
                Guid channelId = Guid.NewGuid(); // Use real channel ID from Sitecore
                string userAgent = "Sample User Agent";
                Interaction webInteraction = new Interaction(contact, InteractionInitiator.Brand, channelId, userAgent);

                // Create a new web visit facet model
                var webVisitFacet = new WebVisit();

                // Populate data about the web visit
                webVisitFacet.Browser = new BrowserData() { BrowserMajorName = "Chrome", BrowserMinorName = "Desktop", BrowserVersion = "22.0" };
                webVisitFacet.Language = "en";
                webVisitFacet.OperatingSystem = new OperatingSystemData() { Name = "Windows", MajorVersion = "10", MinorVersion = "4" };
                webVisitFacet.Referrer = "www.google.com";
                webVisitFacet.Screen = new ScreenData() { ScreenHeight = 1080, ScreenWidth = 685 };
                webVisitFacet.SearchKeywords = "sitecore";
                webVisitFacet.SiteName = "website";

                var itemId = Guid.NewGuid();
                var itemVersion = 5;

                // First page view
                PageViewEvent pageView = new PageViewEvent(new DateTime(2016, 10, 10, 13, 20, 22).ToUniversalTime(), itemId, itemVersion, "en");

                pageView.ItemLanguage = "en";
                pageView.Duration = new TimeSpan(3000);

                webInteraction.Events.Add(pageView);

                var secondItemId = Guid.NewGuid();
                var secondItemVersion = 2;

                // Second page view
                PageViewEvent pageView2 = new PageViewEvent(new DateTime(2016, 10, 10, 13, 21, 22).ToUniversalTime(), secondItemId, secondItemVersion, "en");

                pageView2.ItemLanguage = "en";
                pageView2.Duration = new TimeSpan(3200);

                webInteraction.Events.Add(pageView2);

                // First goal, associated with second page view
                Goal goal1 = new Goal(Guid.NewGuid(), new DateTime(2016, 10, 10, 13, 22, 22).ToUniversalTime());

                goal1.ParentEventId = pageView2.Id;

                webInteraction.Events.Add(goal1);

                var thirdItemId = Guid.NewGuid();
                var thirdItemVersion = 2;

                // Third page view
                PageViewEvent pageView3 = new PageViewEvent(new DateTime(2016, 10, 10, 13, 22, 22).ToUniversalTime(), thirdItemId, thirdItemVersion, "en");

                pageView3.ItemLanguage = "en";
                pageView3.Duration = new TimeSpan(1200);

                webInteraction.Events.Add(pageView3);

                // Set web visit facet on interaction
                client.SetWebVisit(webInteraction, webVisitFacet);

                // Add interaction
                client.AddInteraction(webInteraction);

                // Submit contact and interaction
                client.Submit();
            }
        }
    }
}

```

### Adding an event as a child of a page view event

To associate a goal with a page view, set the `ParentEventId` of the goal to the `Id` of the page view as demonstrated in the previous example.

```csharp
// Second page view
PageViewEvent pageView2 = new PageViewEvent(new DateTime(2016, 10, 10, 13, 21, 22).ToUniversalTime(), secondItemId, secondItemVersion, "en");

pageView.ItemLanguage = "en";
pageView.Duration = new TimeSpan(3200);

webInteraction.Events.Add(pageView2);

// First goal, associated with second page view
Goal goal1 = new Goal(Guid.NewGuid(), new DateTime(2016, 10, 10, 13, 22, 22).ToUniversalTime());

goal1.ParentEventId = pageView2.Id;

webInteraction.Events.Add(goal1);

var thirdItemId = Guid.NewGuid();
var thirdItemVersion = 2;

```

### Adding a page event

Page events are stored under `/sitecore/system/Settings/Analytics/Page Events` and represent common, web-specific events such as ‘user performed a search’ or ‘the page is slow’. When triggering a page event, make sure you associate with a `PageViewEvent` by setting the `ParentEventId` property.

Not all page events are represented by a specialized class. For events without a specialized class, use the base `Event` class and pass in the ID of the event definition item.

#### Adding a DownloadEvent to an interaction

The following example demonstrates how to trigger a download event. The `ItemId` that is passed into the constructor is the ID of the media item that was downloaded.

```csharp
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using Sitecore.XConnect.Collection.Model;
using System;

namespace Documentation
{
    public class AddDownloadEvent
    {
        public async void ExampleAsync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var newContact = new Sitecore.XConnect.Contact();
                    client.AddContact(newContact);

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";

                    var interaction = new Sitecore.XConnect.Interaction(newContact, InteractionInitiator.Brand, channelId, userAgent);

                    var fakeItemID = Guid.NewGuid();
                    var fakeItemVersion = 3;

                    Sitecore.XConnect.Collection.Model.PageViewEvent pageView = new PageViewEvent(DateTime.UtcNow, fakeItemID, fakeItemVersion, "en")
                    {
                        Duration = new TimeSpan(0, 0, 30),
                        Url = "/my/test/page?with=querystring"
                    };

                    interaction.Events.Add(pageView);

                    var guidOfDownload = Guid.NewGuid(); // Replace with GUID of media item that was downloaded

                    DownloadEvent download = new DownloadEvent(DateTime.UtcNow, guidOfDownload)
                    {
                        ParentEventId = pageView.Id
                    };

                    interaction.Events.Add(download);

                    client.AddInteraction(interaction);

                    await client.SubmitAsync();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }

        // Sync example
        public void ExampleSync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var newContact = new Sitecore.XConnect.Contact();
                    client.AddContact(newContact);

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";

                    var interaction = new Sitecore.XConnect.Interaction(newContact, InteractionInitiator.Brand, channelId, userAgent);

                    var fakeItemID = Guid.NewGuid();
                    var fakeItemVersion = 3;

                    Sitecore.XConnect.Collection.Model.PageViewEvent pageView = new PageViewEvent(DateTime.UtcNow, fakeItemID, fakeItemVersion, "en")
                    {
                        Duration = new TimeSpan(0, 0, 30),
                        Url = "/my/test/page?with=querystring"
                    };

                    interaction.Events.Add(pageView);

                    var guidOfDownload = Guid.NewGuid(); // Replace with GUID of media item that was downloaded

                    DownloadEvent download = new DownloadEvent(DateTime.UtcNow, guidOfDownload)
                    {
                        ParentEventId = pageView.Id
                    };

                    interaction.Events.Add(download);

                    client.AddInteraction(interaction);

                    client.Submit();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }
    }
}

```

#### Adding a SearchEvent to an interaction

The following example demonstrates how to register a search event. The `Keyword` property is not mandatory.

```csharp
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using Sitecore.XConnect.Collection.Model;
using System;

namespace Documentation
{
    public class AddSearchEvent
    {
        public async void ExampleAsync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var newContact = new Sitecore.XConnect.Contact();
                    client.AddContact(newContact);

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";

                    var interaction = new Sitecore.XConnect.Interaction(newContact, InteractionInitiator.Brand, channelId, userAgent);

                    var fakeItemID = Guid.NewGuid();
                    var fakeItemVersion = 3;

                    Sitecore.XConnect.Collection.Model.PageViewEvent pageView = new PageViewEvent(DateTime.UtcNow, fakeItemID, fakeItemVersion, "en")
                    {
                        Duration = new TimeSpan(0, 0, 30),
                        Url = "/my/test/page?with=querystring"
                    };

                    interaction.Events.Add(pageView);

                    var search = new SearchEvent(DateTime.UtcNow)
                    {
                        Keywords = "xConnect"
                    };

                    interaction.Events.Add(search);

                    client.AddInteraction(interaction);

                    await client.SubmitAsync();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }

        // Sync example
        public void ExampleSync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var newContact = new Sitecore.XConnect.Contact();
                    client.AddContact(newContact);

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";

                    var interaction = new Sitecore.XConnect.Interaction(newContact, InteractionInitiator.Brand, channelId, userAgent);

                    var fakeItemID = Guid.NewGuid();
                    var fakeItemVersion = 3;

                    Sitecore.XConnect.Collection.Model.PageViewEvent pageView = new PageViewEvent(DateTime.UtcNow, fakeItemID, fakeItemVersion, "en")
                    {
                        Duration = new TimeSpan(0, 0, 30),
                        Url = "/my/test/page?with=querystring"
                    };

                    interaction.Events.Add(pageView);

                    var search = new SearchEvent(DateTime.UtcNow)
                    {
                        Keywords = "xConnect"
                    };

                    interaction.Events.Add(search);

                    client.AddInteraction(interaction);

                    client.Submit();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }
    }
}

```

#### Adding a CampaignEvent to an interaction

The following example demonstrates how to trigger a campaign.

The **event ID** of the `CampaignEvent` as the same event is happening - a campaign is being triggered. However, the campaign associated with the event will vary and is represented by the `CampaignDefinitionId` property.

```csharp
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using Sitecore.XConnect.Collection.Model;
using System;

namespace Documentation
{
    public class AddCampaignEvent
    {
        public async void ExampleAsync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var newContact = new Sitecore.XConnect.Contact();
                    client.AddContact(newContact);

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";

                    var interaction = new Sitecore.XConnect.Interaction(newContact, InteractionInitiator.Brand, channelId, userAgent);

                    var fakeItemID = Guid.NewGuid();
                    var fakeItemVersion = 3;

                    Sitecore.XConnect.Collection.Model.PageViewEvent pageView = new PageViewEvent(DateTime.UtcNow, fakeItemID, fakeItemVersion, "en")
                    {
                        Duration = new TimeSpan(0, 0, 30),
                        Url = "/my/test/page?with=querystring"
                    };

                    interaction.Events.Add(pageView);

                    var campaignDefinition = Guid.NewGuid(); // Replace with real campaign ID

                    var campaign = new CampaignEvent(campaignDefinition, DateTime.UtcNow);

                    interaction.Events.Add(campaign);

                    client.AddInteraction(interaction);

                    await client.SubmitAsync();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }

        // Sync example
        public void ExampleSync()
        {
            using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var newContact = new Sitecore.XConnect.Contact();
                    client.AddContact(newContact);

                    Guid channelId = Guid.NewGuid();
                    string userAgent = "Sample User Agent";

                    var interaction = new Sitecore.XConnect.Interaction(newContact, InteractionInitiator.Brand, channelId, userAgent);

                    var fakeItemID = Guid.NewGuid();
                    var fakeItemVersion = 3;

                    Sitecore.XConnect.Collection.Model.PageViewEvent pageView = new PageViewEvent(DateTime.UtcNow, fakeItemID, fakeItemVersion, "en")
                    {
                        Duration = new TimeSpan(0, 0, 30),
                        Url = "/my/test/page?with=querystring"
                    };

                    interaction.Events.Add(pageView);

                    var campaignDefinition = Guid.NewGuid(); // Replace with real campaign ID

                    var campaign = new CampaignEvent(campaignDefinition, DateTime.UtcNow);

                    interaction.Events.Add(campaign);

                    client.AddInteraction(interaction);

                    client.Submit();
                }
                catch (XdbExecutionException ex)
                {
                    // Handle exception
                }
            }
        }
    }
}

```

</details>