Single-touch conversion Attribution
- Overview
- Scope
- Demo
Overview
Description
This type of measurement tracks conversions that occur directly as a result of seeing an ad, such as when a user clicks on an ad and then makes a purchase on the advertiser's website. Single-touch attribution models are easy to understand and implement, and they can be a good option for businesses with limited data or resources. However, they can also be inaccurate, as they do not account for the influence of other touch points on a conversion.
Privacy Sandbox APIs
Related parties
- Publisher
- SSP
- Advertiser
- DSP
Scope
Goals
In this demo, we assume an advertiser would like to measure the effectiveness of marketing campaigns. Single-touch attribution can help by tracking the number of conversions as well as the purchased value that can be attributed to each touch point (viewing or clicking an ad). This information can be used to improve the advertiser’s marketing campaigns and get more value from their marketing budget.
Assumptions
This use case assumes the advertiser (e.g. EC site) has contracted with a publisher or won a bid to display their product ads on the publisher site (e.g. News site). This use case does not cover ad-targeting specifics, so we assume the user would be presented with a relevant ad leading to a conversion (purchase of a product).
Key Exclusions
The demo does not show Aggregation Service and noised aggregation reports. The current demo shows the aggregatable reports (debug report non-encrypted) before it is sent to the aggregation service (encrypted).
System Design
The user visits a news site where an ad is rendered. Using Attribution Reporting API & Summary Reports, a view-through conversion source event is registered. The user clicks on the ads, a click-through conversion source is registered. Then the user navigates to the advertiser page (shopping site), clicks “Add to cart” then “Checkout”. The browser registers a conversion trigger event and a summary report (debug report) is sent to the advertiser.
Attribution Reporting Flow
Below is a general introduction of Single-Touch conversion Attribution using Privacy Sandbox Attribution Reporting API. For further information see Attribution Reporting - Chrome Developers .
User Journey #1
Demo
Prerequisites
- Chrome > v115 (Open chrome://version to look up your current version)
- Enable Privacy Sandbox APIs (Open chrome://settings/adPrivacy to enable this setting)
- Clear your browsing history before you run one of the demo scenario below (Open chrome://settings/clearBrowserData to delete your browsing history)
- Open chrome://attribution-internals and click “Clear all attribution data”
User Journey #1
- Navigate to shop site (advertiser)
- Click on a “shoe” product item on the shop site.
- The shop (advertiser) would assume the user is interested in this type of product, so they would leverage Protected Audience API and ask the browser to join an ad interest group for this product or this specific product category.
- Navigate to the news site (publisher)
- Observe the ad served on the news site
- If you previously browsed the “shoe” product on the shop site, you will be shown an ad for the same product.
- Displaying the ad will also register an attribution source of type event into your browser using the Attribution Reporting API (used for view-through conversion measurement)
- Click on the ad served on the news site
- your browser will open a new window with the product page
- Clicking the ad will also register an attribution source of type navigation into your browser using the Attribution Reporting API (used for click-through conversion measurement)
- Navigate to chrome://attribution-internals/ and click the
Active Sources
tab
- At the bottom of the page, you will see 2 sources with the status
Attributable
, thesource origin
is the news site, thedestination
is the shop site and thereporting origin
is the DSP service. One of thesource type
is event (for view-through) and the other one is navigation (for click-through) This reference will be used later to attribute (match) the conversion (here the. purchase of an item on the shop site) to a previous event (here. The user saw/clicked an ad on the news site)
- On the product page, click “Add to cart”
- On the cart page, click “Checkout”
- In this scenario the “checkout” event is the conversion event the advertiser wants to measure to evaluate the performance of their ad campaign,
- The checkout page triggers the conversion attribution for the
source
whose eTLD+1 matches the eTLD+1 of the site provided indestination
(here psat-pat-demos-shop.dev) . The Attribution Reporting API logic will then process the event.
- Navigate to chrome://attribution-internals/ and click the
Trigger Registration
tab
- At the bottom of the page, you will see 1 trigger . the
destination
is the shop site and thereporting origin
is the DSP service. TheRegistration JSON
contains information about the conversion event. In this scenario the advertiser chose to report the gross price and the quantity of the product item purchased. theAggregatable Status
indicates Success: Report stored, it means Attribution Reporting API has now stored this report in the browser. It will then be scheduled for sending to thereporting origin
at a later time.
- Navigate to DSP service report visualization page
- on this page you can see the aggregatable report sent by the browser to the DSP. In a production environment, the aggregatable report is encrypted by the browser and sent to the DSP. There, they will be batched and sent to the Aggregation Service where they will be aggregated and noised to preserve privacy. However for development and testing purposes, you can also send an unencrypted version called debug report. This is what you are seeing now.
- The report shows aggregation data on 2 dimensions : gross with a value of 180 and quantity with a value of 1.
Implementation details
how do we attribute the conversion to seeing an ad ? (see step #5 of User Journey)
First on the Attribution Source registration side. Look at the code displaying the ad creative
<body>
<a
width="300"
height="250"
target="_blank"
rel="noopener noreferrer"
attributionsrc="https://psat-pat-demos-dsp.dev/register-source?advertiser=psat-pat-demos-shop.dev&id=1fa70"
href="https://psat-pat-demos-shop.dev/items/1fa70"
>
<!-- smaller for avoid scrollbar -->
<img
width="294"
height="245"
loading="lazy"
attributionsrc="https://psat-pat-demos-dsp.dev/register-source?advertiser=psat-pat-demos-shop.dev&id=1fa70"
src="https://psat-pat-demos-shop.dev/ads/1fa70"
/>
</a>
</body>
The img
tag also specifies the attributionsrc
attribute. It means that showing this ad will register an attribution source of type event
in the
browser. Now using Developers Tools, look at the HTTP request you will see a new attribute added by the browser Attribution-Reporting-Eligible
with
the value event-source, trigger
In the HTTP response to the /register-source
request, you will see a new header
Attribution-Reporting-Register-Source:
with a value that contains the attribution source parameters.
{
"destination": "https://psat-pat-demos-shop.dev",
"source_event_id": "18446744073709551615",
"debug_key": "18446744073709551614",
"aggregation_keys": { "quantity": "0xc001f45e000000000000000000000000", "gross": "0xc101f45e000000000000000000000000" }
}
You can also refer to the
source code to
see how the response header Attribution-Reporting-Register-Source
was formed.
Second, on the Attribution Trigger side (=Conversion) The checkout page contains a 1 pixel image loaded from the code
<img
alt=""
width="1"
height="1"
src="https://psat-pat-demos-dsp.dev/register-trigger?id=1f45e&category=1&quantity=2&size=50&gross=180"
/>
Now using the Developers Tools, look at the HTTP response to the /register-trigger
request. You will see a new header
Attribution-Reporting-Register-Trigger:
with a value that contains the attribution trigger parameters, including the values the advertiser would
like to see aggregated in the summary report (in this example gross and quantities)
{
"aggregatable_trigger_data": [
{ "key_piece": "0x00000000000000008001f45e32010000", "source_keys": ["quantity"] },
{ "key_piece": "0x0000000000000000c001f45e32010000", "source_keys": ["gross"] }
],
"aggregatable_values": { "quantity": 2, "gross": 180 },
"debug_key": "18446744073709551614"
}
You can also refer to the
source code to
see how the response header aggregatable_trigger_data
was formed.