System events are a group of events available to all Bloomreach Engagement customers by default without the need for a specifically-tailored integration. As opposed to [custom events](🔗), system events should be the same for all Bloomreach Engagement users. In this article, we will list and explain the attributes of these events.
# session_start, session_end, first_session
event name | description |
`session_start ` | This event is tracked when the customer visits your website. |
`session_end ` | This event is generated 20 minutes after the customer leaves your website or closes the browser tab. Its timestamp is that of the [last session ping from the Javascript SDK](🔗) + 30 seconds. |
`first_session ` | This event is derived from the `session_start ` event. It is tracked when the customer visits your website for the very first time. |
Ghost sessions
A `
session_start
` and `session_end
` (but not `page_visit
`) can occasionally be tracked without the customer being active. This can happen when the customer leaves your website running, their computer falls asleep, and then their browser gets randomly active and generates a session ping without any `page_visit
`. Read more about this occurrence and our solutions for it in [Ghost sessions](🔗).
The duration of the session will be the difference between the timestamps of `session_start
` and `session_end
` in seconds. The timestamp of the `session_end
` will have a timestamp within 2 minutes after the customer closed the last page (the 20-minute timeout is ignored for the purpose of calculating the session duration).
In other words, the timeout ensures that if someone closes the page but returns within 20 minutes, this will still be counted as a single session. However, if they don't return, those 20 minutes will not be counted into the session duration.
The events are tracked with the following properties (you can add custom ones using [the Javascript SDK's ping options](🔗)):
Attribute | Description | Example |
city | Name of the city from which the user is visiting your website. | Little Rock |
state | Name of the state/region from which the user is visiting your website. | Arkansas |
country | Name of the country from which the user is visiting your website. | United States |
latitude | Latitude from which the user is visiting your website. | 80.5293 |
longitude | Longitude from which the user is visiting your website. | 40.5293 |
source | Name of the platform from which the user visited your website. It is determined based on session_ping event URL by comparison with the list of knows referrers. This is done via `async-api-worker ` by a **[referrer-parser](🔗)**. | |
referrer | Url of the platform from which the user visited your website. | <https://facebook.com> |
campaign_id | Automatically-generated ID of the campaign that brought the customer on your website. **[More about UTM parameters](🔗)** | |
utm_campaign | UTM code of the campaign that brought the customer on your website. By default, this will be equal to the name of the email node / web push node within the scenario.** [More about UTM parameters](🔗)** | autumn_campaign |
utm_source | UTM code of the platform from which the user visited your website. **[More about UTM parameters](🔗)** | facebook_ads |
utm_medium | UTM code of the campaign method used to bring the customer on your website. **[More about UTM parameters](🔗)** | email / push_notification |
utm_content | UTM code of the content that brought the customer on your website. **[More about UTM parameters](🔗)** | banner / logolink / product-feed |
utm_term | UTM code based on terms defining the product. Present if the campaign redirected the customer on a particular product page. **[More about UTM parameters](🔗)** | subject-STREETWEAR-category-Clothing-T-shirts-Everyday-With + sleeve-brand-Nike + men |
gclid | Google Click Identifier is a code added by Google to the website's url when the customer visits your site through a Google Ad campaign. | EAwaSSdkbEAQ112 |
ip | IP address of the user who visited your website. | 129.233.109.145 |
device | Mobile device from which the user visited your website. If the visit was not through a mobile device then it is marked as "other". | Iphone |
os | Operating system of the device through which the user visited your website. | Android |
browser | Browser through which the user visited your website. | Chrome |
location | URL of the page where the user's session started. | <http://eshop.exponea.com/chaz-kangeroo-hoodie.html> |
path | Location URL without the domain and parameters | chaz-kangeroo-hoodie.html |
duration (only for session_end) | The amount of time the user spent on the website during this session measured in seconds . | 2415.980319 |
Using Google Analytics ID for `
first_session
`If you have just started using Bloomreach Engagement and you had tracked your customers using Google Analytics before, you can use the Google Analytics ID to immediately distinguish between old and new customers also in Bloomreach Engagement. You can get the Google Analytics ID from the [Google Analytics tracker](🔗). Google Analytics ID is written in the form `
1.2.286403989.1366364567
` and it's last part (behind the last dot) is the timestamp of the first session. In Bloomreach Engagement, you can extract it from Google Analytics ID using an expression and store it as a customer attribute.
Customer's location inaccuracies
As all the attributes that localize the customers are based on their IP, they depend on the quality of the IP infrastructure. The `
country
` and `city
` attributes are generally very reliable, however, the `latitude
` and `longitude
` are often not (as they are a more precise measure of the customer's location).
## session_start custom attributes (deprecated)
`session_start
` is often complemented with these manually-added custom attributes. These attributes are deprecated.
If you want to try to add some of them as custom attributes, read on how to add default attributes to events & set up advanced tracking parameters in the **[Web tracking article](🔗)**.
Attribute | Description | Example |
page_load_ms | Number of milliseconds it took to load the page. | 632 |
screen_height | Height of the screen the customer used to visit your webpage. | 900 |
screen_width | Width of the screen the customer used to visit your webpage. | 1440 |
screen_resolution | Resolution of the screen the customer used to visit your webpage. | 1440x900 |
version | Version of a browser the customer used to visit your webpage. | Chrome 75 |
## session_start and session_end activity properties
`activity
` properties are sent by the [Javascript SDK](🔗) in session pings.
Properties | Description |
activity | It is set by the SDK when `ping.activity ` is enabled in the configuration. |
created | It is the timestamp of the ping that originally started the session (in other words, it is the session start timestamp). |
last_update | It is the time of the last `session_ping ` received (so stripped of the internal logout timeout before the `session_end ` appears). |
# page_visit
`page_visit
` happens each time the customer opens one of the pages of your website. Note that these events are disabled by default but you can enable them using the [track options of the Javascript SDK](🔗).
Attribute | Description | Example |
device | Mobile device from which the user visited the page. If the visit was not through a mobile device then it is marked as "other". | Iphone |
referrer | Url of the platform from which the user visited the page. | <https://m.facebook.com> |
os | Operating system of the device through which the user visited the page. | Android |
location | URL of the page that the user visited. | <http://eshop.exponea.com/chaz-kangeroo-hoodie.html> |
browser | Browser through which the user visited the page. | Chrome |
Issues with the tracking
If you are using our CDN page outside of your own domain for giving out surveys/getting consent, no `
page_visit
` or `session_start
` events will be generated.
# campaign
The `campaign
` event is generated when working with emails, text messages, push notifications, or webhooks.
Attribute | Description | Example | Tracked on |
status | Status of the user's interaction with the campaign mainly based on the SMTP code. | [sent / delivered / clicked ...](🔗) | Email, Transactional email, SMS, Webhook, Ads, Browser Push Notification, Mobile Push Notification. _See below for details_. |
campaign_name | Name you gave to the campaign. | September newsletter | Email, Transactional email, SMS, Webhook, Ads, Browser Push Notification, Mobile Push Notification |
campaign_id | Automatically-generated ID of the campaign. | 5c584sa5729971a4f992sj9 | Email, Transactional email, SMS, Webhook, Ads, Browser Push Notification, Mobile Push Notification |
action_type | Type of action node or communication channel used for the campaign. | email / sms / webhook / ads / browser notification / mobile notification / transactional_email / split / facebook message | Email, Transactional email, SMS, Webhook, Ads, Browser Push Notification, Mobile Push Notification |
action_name | Name you gave to the specific action within the campaign scenario. In case of emailing through Email campaigns and not scenarios, action_name is the same as campaign_name. | Shoes email | Email, SMS, Webhook, Ads, Browser Push Notification, Mobile Push Notification |
action_id | Unique ID number of the action. The number rises proportionally with the order in which you created the action in the scenarios. The action_id of the first action is 1, for the second action it is 2 etc. | 12 | Email, SMS, Webhook, Ads, Browser Push Notification, Mobile Push Notification |
integration_id | Unique ID of the used integration to send the campaign e.g. email provider. | 5bdc56b593bfb20013ea6af3 | Email, Transactional email, SMS, Ads |
integration_name | The name of the used integration | / | Email, Transactional email, Ads |
integration_type | The type of the Ads integration | Adform, ... | Ads |
campaign_policy | Name of the policy used in the campaign shown to the particular user. **[More on policy](🔗)** | default | Email, SMS, Webhook, Browser Push Notification, Mobile Push Notification |
consent_category | Name of the consent category used with the campaign, or simply _General Consent_ | General Consent | Email, Transactional email, SMS, Webhook, Ads, Browser Push Notification, Mobile Push Notification |
subject | Custom-given subject of the e-mail sent in the campaign. | Autumn Collection | Email, Transactional email, Browser Push Notification, Mobile Push Notification |
language | Language used in the campaign shown to the particular user. | sk | Email, Transactional email, SMS, Browser Push Notification, Mobile Push Notification |
recipient | The user's email address where the campaign email was delivered. | [[email protected]](🔗) | Email, Transactional email, SMS, Mobile Push Notification |
sent_timestamp | The timestamp of when the message was sent (sent from Bloomreach Engagement) | / | Email, Transactional email, Browser Push Notification, Mobile Push Notification |
message | / | / | Email, SMS, Webhook, Ads, Mobile Push Notification |
message_id | Unique ID of the email message on the side of the email provider (ESP) | / | |
comment | / | / | Email, SMS |
error | / | / | Email, SMS |
code | The SMTP code received from a server after you sent out an email. | 422 | Email. _See below for details._ |
cumulative | Whether the cumulative bounce logic should be applied. | true/false | |
ip | IP address of the user targeted by the campaign. | 129.233.109.145 | Email, Transactional email |
user-agent | Name of the email client from which the campaign link was clicked from. | Mozilla | Email, Transactional email |
url | URL campaign link that was clicked on by the user. | / | Email, Transactional email |
city | / | Kosice | Email, Transactional email |
country | / | Slovakia | Email, Transactional email |
latitude | / | 48.7164 | Email, Transactional email |
longitude | / | 21.2611 | Email, Transactional email |
sending_ip | / | / | |
state | / | / | Email, Transactional email |
type | / | / | |
xpath | / | / | Email, Transactional email |
template_id | The unique system ID of the template used, if a template has been used instead of raw HTML. | / | Transactional email |
template_name | The name of the template used, if a template has been used instead of raw HTML. | / | Transactional email |
audience_id | ID of the ads audience | / | Ads |
operation | Type of the audience operation - add or remove from audience | add_customers / remove_customers | Ads |
number_of_message_parts | / | / | SMS (Sinch/Infobip) |
sender | / | / | SMS |
status_code | Response status code | / | SMS, Webhooks |
preset_channel | Type of the webhook preset | Webhooks | |
platform | Type of the push platform | browser / ios / android | Browser Push Notification, Mobile Push Notification |
Permissioned Access to Campaign Event Settings
Campaign settings now have permission access. Any **change to mapping** can be executed only after a discussion with Account Managers.
## Values of the status attribute
Status | Explanation |
enqueued | Bloomreach Engagement enqueued the email to the email provider |
enqueue_failed | Bloomreach Engagement could not enqueue the email |
suppressed | Send suppressed by Bloomreach Engagement; by either frequency or consent policy, or by suppression lists. |
delivered | Email provider confirmed delivery |
opened | The email was opened = pixel in the email was loaded.
Note that some services block these pixels, which may result in customers who only have the `clicked ` event tracked, without `opened ` |
clicked | The customer clicked on a link inside the email or SMS (using the [Campaign Link Shortener](🔗)). This also includes clicking on the unsubscribe link. |
soft_bounced, dropped | The email provider notified Bloomreach Engagement that the email was bounced with a temporary error. Further emails will be tried to be delivered. This error may happen for example due to a full inbox. |
hard_bounced, bounced | Email provider notified Bloomreach Engagement that the email was bounced with a permanent error. This may happen for example due to the email adress being a non-existent one. |
preblocked | The mail service provider had put the domain on the suppression list and so emails from the domain will not be delivered to the customer. |
complained | Email provider notified Bloomreach Engagement that the customer marked the email as "Spam" |
unsubscribed | Customer unsubscribed from email inbox using the List unsubscribe feature. |
sent | The message was submitted to the network for delivery. |
failed | Communication error between Bloomreach Engagement and the provider |
closed | |
incoming_message | Text of an SMS reply from the campaign recipient upon activating two-way messaging. |
rejected | The provider notified Bloomreach Engagement that the message was rejected for delivery. |
success | The customer was successfully added to ads audience |
aborted | The campaign was aborted by using the jinja [abort function with custom message](🔗). |
## Which status attributes are generated by what channel
Status | SMS (CM Telecom) | SMS (Sinch/Infobip) | MMS (Sinch/Infobip) | Webhooks | Ads | Browser Push | Mobile Push | |
enqueued | Yes | / | Yes | Yes | / | / | / | / |
enqueue_failed | Yes | / | Yes | Yes | / | / | / | / |
suppressed | Yes | / | / | / | / | / | / | / |
delivered | Yes | / | Yes | Yes | / | / | Yes | Yes |
opened | Yes | / | / | / | / | / | / | / |
clicked | Yes | Yes (using [Campaign Link Shortener](🔗)) | Yes (using [Campaign Link Shortener](🔗)) | Yes (using [Campaign Link Shortener](🔗)) | / | / | Yes | Yes |
soft_bounced | Yes | / | / | / | / | / | / | / |
hard_bounced | Yes | / | / | / | / | / | / | / |
preblocked | Yes | / | / | / | / | / | / | / |
complained | Yes | / | / | / | / | / | / | / |
unsubscribed | Yes | / | / | / | / | / | / | / |
sent | / | Yes | / | / | Yes | / | Yes | Yes |
failed | / | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
closed | / | / | / | / | / | / | Yes | / |
incoming_message | / | / | Yes | Yes | / | / | / | / |
rejected | / | / | Yes | Yes | / | / | / | / |
success | / | / | / | / | / | Yes | / | / |
## Values of the code attribute
`Code
` attribute gives you the SMTP error or reply code received from a server after you send out a campaign email. The `status
` attribute is based on these codes, however, it is useful to also know the code itself as it is more precise in assessing what happened to the email. The following [link](🔗) contains a list of codes and their corresponding meanings. For these to work correctly, you need to have a [Mailgun integration](🔗). Even though SMTP codes are reliable for most customers, beware that small email providers often send alternative SMTP codes that will not be recognized.
Tracking clicked event
Links to your webpage sent out in a campaign firstly lead to our CDN domain so that the `
clicked
` event is tracked. After that, the customer is immediately redirected from the CDN domain to your webpage.
Issues with the opened event
`
Opened
` event tracked for Gmail does not guarantee that the recipient had indeed opened your email. Gmail's servers sometimes download external images from emails into their cache in advance. As we use these images to track whether the customers opened the email, we get a fake open event every time Gmail's servers do this. Moreover, email providers sometimes block the loading of the images we use for the tracking of the `opened
` event so even if your email seems to be just `delivered
` it might, in fact, be opened.

### Bounce management
When an email does not get delivered, there might be multiple reasons why it happened. We collect the failure feedback from our email providers and automatically assign them to standard bounce categories such as soft bounce (e.g. full inbox) or hard bounces (e.g. invalid email). Bloomreach Engagement also works with our custom type of bounce, what we call a “cumulative bounce”! Read all the details in our article for [Bounce Management](🔗).
## Status name change and filters migration
In 1.173 we unified the statuses of email campaign events from email providers and renamed them to meet the industry standards and improve user experience.
In the following table you can find the naming changes:
Previous status name | New status name |
dropped | soft_bounced |
soft bounced | soft_bounced |
bounced | hard_bounced |
rejected | preblocked |
Along with renaming, an ** automatic migration** was carried out, in order to update event filters as defined below. The new naming along with the original one was used in the migration to ensure backwards compatibility. So don't worry, you probably don't have to update your analytics and campaigns manually, but keep an eye on your business critical use cases after the change to make sure everything works as expected.
The following change was done in all filters that use the renamed statuses:
Operators `
equals
` have been changed to `in
` and `does not equal
` to `not in
` and extended with new statuses.Operators `
in
` and `not in
` have been extended with new statuses.
Rest of the string filters `
contains
`, `does not contain
`, `starts with
`, `ends with
` and `matches regex
` were not changed as they are unlikely to be used for this purpose. **Manual change** is needed in case you want to use those filters in combination with the renamed statuses.For any other custom usage such as jinja or webhooks a **manual change** is needed as well.
_Example:_
`equals dropped
` ->`in [dropped, soft_bounced]
`

`in [dropped, x, y]
` -> `in [dropped, soft_bounced, x, y]
`
# survey
`survey
` happens when the customer is shown a survey question you had created. [More on surveys](🔗)
Attribute | Description | Example |
question | Question given in the survey. | How likely are you to recommend Bloomreach Engagement to your friends? |
answer | Answer given by the user in the survey. (has value only if the customer answers the question) | Very likely. |
interaction | Information on whether the user filled and sent the survey. | true |
survey name | Name you gave to the survey. | Satisfaction survey |
survey_id | Randomly generated ID of the survey, | 5c584sa5729971a4f992sj9 |
question_index | Order of the question in which it appears in the survey. | 2.00 (second question of the survey) |
# merge
`merge
` when two customer profiles are merged into one
Attribute | Description | Example |
source_internal_ids | Internal IDs of merged customers | ["58244a8dfb6009d9d3213198", "5820734f83043485f66795eb"] |
destination_internal_id | Internal ID of final customer | "5820734f83043485f66795eb" |
original_external_ids | External IDs (registered, cookie) of merged customers | {"5820734f83043485f66795eb":{"registered":["[email protected]"]},"58244a8dfb6009d9d3213198":{"cookie":["c50961e7-9086-4169-8066-1ee47615108b"]}} |
final_external_ids | List of all external IDs (registered, cookie) from two initial profiles | {"cookie":["c50961e7-9086-4169-8066-1ee47615108b"],"registered":["[email protected]"]} |
requested_ids | List of external IDs (registered, cookie) in the request which merged the clients | {"cookie":"c50961e7-9086-4169-8066-1ee47615108b","registered":"[[email protected]](🔗)"} |
# ab test
`ab test
` happens when the customer sees one of the variants of a page/banner/recommendation you had created in an A/B split. [More on A/B testing](🔗)
Attribute | Description | Example |
variant | Name of the A/B split variant loaded on the webpage. | Variant A/control group |
variant_id | Automatically-generated ID of the variant. | c584sa5729971a4f992sj9 |
location | URL of the particular variant of the user sees. | <http://eshop.exponea.com/chaz-kangeroo-hoodie-variant-a.html> |
device | Mobile device from which the user sees the particular variant. If the visit was not through a mobile device then it is marked as "other". | Iphone |
os | Operating system of the device through which the user sees the particular variant. | Windows |
browser | Browser through which the the user sees the particular variant. | Chrome |
name | Weblayer's or experiment's name. | |
banner_id/experiment_id | Weblayer's or experiment's ID | |
# experiment
`experiment
` happens when an experiment is shown to the customer. [More on experiments](🔗)
Attribute | Description | Example |
experiment_name | Custom-given name of the experiment. | Experiment 1 |
experiment_id | Automatically-generated ID of the experiment. | 584sa5729971a4f992sj9 |
variant_name | Name of the A/B split variant used in the experiment loaded on the webpage. | Variant A |
variant_id | Automatically-generated ID of the variant used in the experiment loaded on the webpage. | c584sa5729971a4f992sj9 |
action | Nature of the engagement the user had with the experiment. "Show" is a default standard for indicating that the experiment has loaded on the page. | show/close/submit/click |
location | URL of the page with the experiment. | <http://eshop.exponea.com/chaz-kangeroo-hoodie-experiment-1.html> |
path | Location URL without the domain and parameters | chaz-kangeroo-hoodie-experiment-1.html |
device | Mobile device from which the user sees the page with the experiment. If the visit was not through a mobile device then it is marked as "other". | Iphone |
os | Operating system of the device through which the user sees the page with the experiment. | Windows |
browser | Browser through which the the user sees the page with the experiment. | Chrome |
# anonymization
`anonymization
` happens when you remove the customer's identification but still keep their data for analytics purposes. You can read more about anonymization in [Data management](🔗).
Attribute | Description | Example |
source | Software through which the user's information was anonymized. | events_ext_api |
access_group_id | Level of access rights of the person who anonymized the user's information. | Group_B |
Efficient Engagement usage
When generated, system events get procesed and stored, thus counting toward your Monthly Processed Events (MPE) and Maximum Events Storage (MES) covered by your contract. Learn how to optimize your MPE and MES in [this best practices article](🔗) to get the most out of your Engagement experience!