> ## 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.

# Server-side enrichment

> How Converge enriches server-side events with profile data

export const OutboundLink = ({linkText, linkTarget}) => {
  return <a target="_blank" href={linkTarget}> {linkText} 
    <div className="inline h-3 w-3 fill-gray-500 dark:fill-gray-100 text-gray-500 dark:text-gray-300 ml-1 mr-1">
      <svg className="inline w-2.5 h-2.5 bg-gray-500 dark:bg-gray-300" style={{
    maskImage: `url('https://mintlify.b-cdn.net/v6.5.1/solid/up-right-from-square.svg')`,
    maskRepeat: "no-repeat",
    maskPosition: "center center"
  }}></svg> 
    </div>
    </a>;
};

## What is server-side enrichment?

Server-side events are reliable but sparse. A `Placed Order` sent from your backend is guaranteed to fire for every purchase, but it arrives with almost none of the browser context that ad platforms and analytics tools need to match a conversion to a click.

**Enrichment** is how Converge fills that gap. Once a server-side event is stitched to a profile, Converge automatically adds everything it already knows about that profile to the event. A bare order event inherits the user's browser identifiers, click IDs, and attribution context, so the data you forward looks as if it had been tracked on the browser all along.

```mermaid actions={false} theme={null} theme={null}
flowchart LR
  id1("*Server*<br/>Placed Order<br/>order_id, value, email") --> id2{{"Converge<br/>enrichment"}} --> id3("*Enriched*<br/>Placed Order<br/>+ $fbp, $fbc<br/>+ IP, user agent<br/>+ landing page, UTMs")
  style id2 stroke:none
```

## Why it matters

A server-side conversion that can't be matched to a browser session causes the same downstream problems as an unstitched event:

* **Lower match rates** at your [destinations](/destinations/overview). Meta, Google, and others rely on identifiers like `fbp`, `fbc`, IP address, and user agent to attribute a conversion. Without them, the event is forwarded but poorly matched, which weakens optimization.
* **Missing attribution**. The order can't be tied to the campaign, landing page, or channel that drove it.

Enrichment solves both. Because the enriched event already carries browser-side identifiers, Converge can forward a high-quality conversion to every destination, even though the order itself was tracked on the server.

## How it works

Enrichment happens automatically at ingestion. There's nothing to configure, but it does depend on two other concepts: <OutboundLink linkText="aliases" linkTarget="/sources/concepts/aliases" /> (which stitch the event to a profile) and <OutboundLink linkText="profile properties" linkTarget="/sources/concepts/profile-properties" /> (which supply the browser context that gets merged in).

<Steps>
  <Step title="The event is stitched to a profile">
    Converge uses the event's <OutboundLink linkText="aliases" linkTarget="/sources/concepts/aliases" /> to resolve which profile it belongs to. This is the prerequisite for enrichment: an event that can't be stitched has no profile to draw context from.
  </Step>

  <Step title="Stored profile data is merged in">
    Converge looks up the <OutboundLink linkText="profile properties" linkTarget="/sources/concepts/profile-properties" /> collected earlier in the journey, mostly from browser events, and merges them onto the event.
  </Step>

  <Step title="The enriched event is forwarded">
    Each destination reads the identifiers it needs from the enriched event. For example, the Meta destination picks up `$fbp` and `$fbc` to raise its match quality.
  </Step>
</Steps>

This is why a `cart_token` or `checkout_token` alias passed early in the journey matters so much: it's what links the eventual server-side order back to the browser session that holds all the useful context. For more on choosing reliable aliases, see <OutboundLink linkText="what aliases should I pass?" linkTarget="/sources/concepts/aliases#what-aliases-should-i-pass%3F" />

## What gets enriched

When the Converge Pixel runs on the browser, it stores a set of profile properties automatically. After stitching, these become available on your server-side events:

| Property             | Description                                |
| -------------------- | ------------------------------------------ |
| `$user_agent`        | The browser's user agent                   |
| `$cookie_id`         | The Converge first-party cookie identifier |
| `$screen_resolution` | The device's screen resolution             |
| `$is_mobile`         | Whether the session was on a mobile device |
| `$timezone`          | The browser's timezone                     |
| `$language`          | The browser's language                     |

On top of these, Converge stores destination-specific click identifiers when they're present in the landing URL or set by a destination's own script, such as `$fbp` and `$fbc` for Meta, and `$gbraid` and `$wbraid` for Google. Any profile properties you pass yourself, like `$email`, `$first_name`, or `$phone_number`, are enriched the same way.

<Note>Enrichment only adds data that's missing. Properties already present on the incoming server-side event are kept as-is, so an explicit value you send always wins over a stored one.</Note>

## Enrichment and re-identification

Enrichment is also what makes Converge's longer cookie lifetime useful. Browsers like Safari wipe browser-set cookies after 7 days, but a <OutboundLink linkText="server-side first-party cookie" linkTarget="/sources/concepts/aliases#setting-up-a-server-side-first-party-cookie" /> reliably re-identifies a returning customer for up to a year. When Converge recognizes a returning profile, enrichment restores the third-party cookies stored against it, so destinations can still match the conversion well after the browser would have forgotten the user.

## Related concepts

Enrichment ties the other source concepts together:

* <OutboundLink linkText="Aliases" linkTarget="/sources/concepts/aliases" /> determine which profile an event belongs to. No stitching, no enrichment.
* <OutboundLink linkText="Profile properties" linkTarget="/sources/concepts/profile-properties" /> are the data that gets merged in.
* <OutboundLink linkText="Deduplication" linkTarget="/sources/concepts/deduplication" /> makes sure an enriched conversion isn't counted twice.
