# Fetch from Tracking Event

### includeProducts Function

`#includeProducts` iterates through product objects and displays the corresponding products, based on a range of constrictions you can set within the function. You can for example use this function to realise an Abandoned Cart Campaign where you want to display the products within the cart.

`#includeProducts` also searches the product feed to return product properties, such as, for example `{{[properties.image]}}`.

You can choose one of three options which Products to access when using #includeProducts:

* cartProducts
* eventProducts

Their behaviour is shown in the examples below.

**Examples**

**Products in the Users' Cart**

The first example is used to access the products in the cart of the user that triggered the campaign.&#x20;

```
{{#includeProducts '{
    "cartProducts": true,
    "options": {
        "maxResults": 3, 
        "sortBy": "properties.price", 
        "desc": true, 
        "distinct": true
        }
    }'
}}
    {{[properties.image]}}
{{/includeProducts}}
```

The **cartProducts** selector accepts True or False. If it is set to True, the #includeProducts function will access the cart object that can be sent in the Webtracking.

The **maxResults** option determines how many products will be displayed at most.

The **sortBy** option determines which product attribute the results will be sorted by.

For sorting order, you can either use **desc** or **asc**, both of which are turned on by using "true" as a value.

The **distinct** option allows you to prevent duplicate entries. You can enable it by using "true" as a value.

If there is no **sortBy** parameter used, the products will be evaluated in a random order.

**Products in a Users' History**

The last example shows how to access data from an Event that exists in a users' history. This handlebar is most commonly used in Audience Campaigns. Since CrossEngage stores a users' behaviour as events and attaches them to a user, you can access these events for content personalisation later.

```
{{#includeProducts '{
    "eventProducts": { 
        "events": ["Viewed Product"], 
        "eventTimes": ["-2 weeks","now"],
        "operator": "n-th last", 
        "operand": 1}
    }'
}}
    {{[properties.image]}}
{{/includeProducts}}
```

The **eventProducts** option determines which event in a users' history to access. in this case we are first event of the type "Viewed Product" when going back in time. Another way to phrase this is that we are accessing the "first last Event" or the "first Event from the end".

The **events** selector determines which Event to look for in a Users' History.

The **eventTimes** option determines in which timeframe to look for in a Users' History.

The **operator** for the eventProducts option only accepts "n-th last", which means that you are accessing a specific event, counting from most recent.

The **operand** determines the value for n in "n-th last", so 2 would mean you are accessing the second to last event in a Users' History. In most scenarios you will want to use 1 here.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.crossengage.io/data-and-engagement-platform/messages/personalization/product-helper-functions/fetch-from-tracking-event.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
