> ## Documentation Index
> Fetch the complete documentation index at: https://docs.runconverge.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Concepts

> Introduction to the Converge Source concepts

## An introductory example

Imagine an ecommerce store that has the following minimal customer journey:

1. **PageView**: User visits the storefront
2. **Added To Cart**: User adds an item to cart
3. **Placed Order**: User places an order

For the optimal setup, they will want to track `PageView` and `Added To Cart` on the browser, but `Placed Order` events on <Tooltip tip="Important to track 100% of conversions"> the server</Tooltip>.

### Challenges with server-side tracking

There are three main challenges this store will need to deal with, all of which are important concepts in Converge.

* [Profile properties](#profile-properties): to include browser-side information into the server-side order-event.
* [Deduplication](#deduplication): to make sure that the same order does not get processed twice.
* [Aliases](#aliases): to recognize which browser-side events and which server-side events come from the same user.

***

## Profile properties

It is possible to include **profile properties** in an event. These properties are characteristic of the user. These properties are **persisted across events**, whereas the event properties are only available and relevant to the event itself.

Profile Properties allow you to store information on a user that you might need later.
For example, the Converge Pixel will [auto-track](/sources/converge-spec#page-load) several browser session information, so this is available for your server-side events (e.g. the `Placed Order` event in the [example](#an-introductory-example) above).

However, profile properties are also useful for storing information across events *within* a single source.
Imagine a user that triggers a `Subscribed To Newsletter` event with an `$email` parameter. Afterward, that same user triggers an `Added To Cart` event.
Storing the `$email` as a profile property ensures that you have this information available at the moment of the `Added To Cart` event without you as a developer having to pass it again.

<Accordion title="Code Examples" icon="code">
  <CodeGroup>
    ```javascript Converge Pixel - Javascript theme={null}
    cvg({
      method: "track",
      eventName: "Subscribed To Newsletter",
      properties: {
        formId: "your-form-id",
      },
      profileProperties: {
        $email: "john.smith@apple.com",
        $first_name: "John",
        $last_name: "Smith",
        $phone_number: "+199999999",
      },
    });
    ```

    ```python Converge Webhook - Python theme={null}
    resp = requests.post(
        "{YOUR_POSTBACK_ENDPOINT}",
        json=
            {
            "event_name": "Subscribed To Newsletter",
            "properties": {
              "formId": "your-form-id",
            },
            "profile_properties": {
                "$email": "john.smith@apple.com",
                "$first_name": "John",
                "$last_name": "Smith",
                "$phone_number": "+199999999",

            }
        }
    )

    ```
  </CodeGroup>
</Accordion>

***

## Deduplication

Converge supports deduplication natively. You can deduplicate events with an optional `eventID` parameter. This is especially important for events that are used as conversions.
Converge will deduplicate events with the same `eventID` at ingestion time.

<Accordion title="Code Examples" icon="code">
  <CodeGroup>
    ```javascript Converge Pixel - Javascript theme={null}
    cvg({
      method: "forward",
      eventName: "Placed Order",
      properties: {}, // your event properties
      eventID: "X01",
    });
    ```

    ```python Converge Webhook - Python theme={null}
    resp = requests.post(
        "{YOUR_POSTBACK_ENDPOINT}",
        json=
            {
            "event_name": "Placed Order",
            "properties": {},
            "profile_properties": {},
            "event_id" : "X01", # Note the different spelling of event_id
        }
    )
    ```
  </CodeGroup>
</Accordion>

***

## Aliases

Converge excels at matching events across browser sessions and your server-side data. This is all possible through aliases. Your customer is linked to multiple aliases, i.e. **multiple identifiers for the same customer**. Converge uses the customer's browser session cookie as the default alias.
When you add something as an alias, you are telling Converge that this alias is a unique identifier for this profile **across datasources**. In the examples below, we add `email` as an alias. Thus, Converge can merge a profile of browser events (e.g. Pageviews) with a profile with backend events (e.g. Started Subscription) if they have the same `email`.

In the examples below we add an `email` alias. Other aliases that are useful:

* `cart_token`
* `checkout_token`: this is absolutely necessary if your checkout lives on a different domain than your storefront
* `customer_id`

<Accordion title="Code Examples" icon="code">
  <CodeGroup>
    ```javascript Converge Pixel - Javascript theme={null}
    cvg({
      method: "track",
      eventName: "Subscribed To Newsletter",
      properties: {},
      profileProperties: {},
      aliases: ["urn:email:john.smith@apple.com"],
    });
    ```

    ```python Converge Webhook - Python theme={null}
    resp = requests.post(
        "{YOUR_POSTBACK_ENDPOINT}",
        json=
            {
            "event_name": "Subscribed To Newsletter",
            "properties": {},
            "profile_properties": {},
            "aliases": ["urn:email:john.smith@apple.com"],
        }
    )
    ```
  </CodeGroup>
</Accordion>
