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

# Better attribution and improvements

> We are pleased to announce two new features designed to enhance user tracking and ad campaign precision. These updates will empower marketplaces and advertisers to better track user behavior, optimize ad spend, and increase campaign effectiveness.

export const ChangelogActions = () => {
  return <>
      <style>{`
        .changelog-actions {
          display: flex;
          justify-content: center;
          gap: 12px;
          margin-top: 2rem;
          padding-top: 1.5rem;
          border-top: 1px solid #e5e7eb;
        }
        
        [data-theme="dark"] .changelog-actions {
          border-top-color: #374151;
        }
        
        .changelog-btn {
          display: inline-flex;
          align-items: center;
          gap: 6px;
          padding: 8px 16px;
          border-radius: 9999px;
          border: 1px solid #d1d5db;
          background: transparent;
          color: #6b7280;
          font-size: 14px;
          cursor: pointer;
          transition: all 0.2s ease;
        }
        
        .changelog-btn:hover {
          border-color: #9ca3af;
          background: #f9fafb;
        }
        
        [data-theme="dark"] .changelog-btn {
          border-color: #4b5563;
          color: #9ca3af;
        }
        
        [data-theme="dark"] .changelog-btn:hover {
          border-color: #6b7280;
          background: #1f2937;
        }
      `}</style>
      <div className="changelog-actions">
        <button className="changelog-btn" onClick={() => {
    const btn = event.target.closest("button");
    btn.innerHTML = "❤️ Like";
    btn.style.borderColor = "#ec4899";
  }}>
          🤍 Like
        </button>
        <button className="changelog-btn" onClick={() => {
    const btn = event.target.closest("button");
    navigator.clipboard.writeText(window.location.href);
    const originalContent = btn.innerHTML;
    btn.innerHTML = "✓ Copied";
    btn.style.borderColor = "#22c55e";
    btn.style.color = "#22c55e";
    setTimeout(() => {
      btn.innerHTML = originalContent;
      btn.style.borderColor = "";
      btn.style.color = "";
    }, 2000);
  }}>
          ↗ Share
        </button>
      </div>
    </>;
};

<div style={{ display: "flex", gap: "8px", flexWrap: "wrap", marginBottom: "16px" }}>
  <Badge color="gray" size="sm" icon="calendar">October 6, 2024</Badge>
  <Badge color="purple" size="sm" icon="server">Ad Server</Badge>
  <Badge color="orange" size="sm" icon="arrow-up">Improvement</Badge>
</div>

# Merge OpaqueUserId

The new Merge OpaqueUserId feature allows advertisers to track user interactions across devices and sessions, even when users switch from anonymous browsing to logged-in activity. This enables more accurate multi-device and multi-channel attribution.

## Key Benefits

* Enhanced Tracking: Allows marketplaces to better understand user behavior across devices and sessions.
* Improved Attribution: Merging anonymous and logged-in sessions improves ROAS by attributing conversions more accurately.

## How It Works

Marketplaces send events with an opaqueUserId during user interactions (e.g., clicks or views). When the user logs in, a new opaqueUserId is used.

The marketplace can link the anonymous and logged-in opaqueUserIds through the Link Users API, improving attribution calculations for purchases.

API Endpoint: `POST v2/events/beta/link-users`

```json theme={null}
{
  "link-users": [
    {
      "from": "anonymous_opaqueUserId",
      "to": "loggedIn_opaqueUserId"
    }
  ]
}
```

# Keywords per Product

The Keywords per Product feature allows marketplaces to assign automated keywords to individual products, rather than applying them across entire campaigns. This enables more targeted and relevant advertising by running
[`searchQuery` auctions](/en/api-reference/examples/sponsored-listings/search) additionally to product lists and category auctions.

## Key Benefits

* Increased Relevance: Assigning keywords at the product level ensures ads are more closely aligned with user searches.
* Enhanced Competition: Allows multiple keywords per product, increasing participation in auctions and potentially driving higher ad spend.
* Increased Reach: having a more general pool of keywords allows products to participate in more auctions where they are relevant.

## How It Works

Marketplaces allow Topsort to activate the feature Automated Keywords Per Product and have [`searchQuery` auctions](/en/api-reference/examples/sponsored-listings/search).
The feature returns a list of automatically generated keywords for each promoted product based on historical auction data.

Example:

```json theme={null}
{
  "product_id": "643727999",
  "product_name": "Aceite Ominatural Esencial",
  "keywords": ["aceites esenciales", "aceite esencial", "aceite omninatural", "omninatural", "aceites naturales", "aceites naturales esenciales", "aceite oleo esencial", "oleo esencial"]
}
```

During campaign setup, keywords are automatically used if enabled, removing the need for manual configuration.

<ChangelogActions />
