Brand Store
A button on the product detail page that redirects users to the brand's store
Brand Store
A button on the OOP (product detail page) that redirects users directly to the brand's store with offers related to the selected product.
How It Works
Important: The ad server only provides tracking information. All product display data (logo, price, URL) comes from YOUR shop system.
| Source | Data |
|---|---|
| Ad Server | Whether ad exists, click tracking URL |
| Your Shop | Product URL, logo, price, shop name |
The shop is responsible for rendering the button with its own data. The ad server only tells you IF a sponsored ad exists and provides click tracking.
Live Demo
See the working implementation:
Frontend Integration (CSR)
Step 1: Load the SDK
Configure the SDK with your Ring DAS credentials. You will receive these values from your Ring DAS account manager.
| Parameter | Description |
|---|---|
target | Your site identifier in Ring DAS |
tid | Your Ring DAS tenant ID (format: EA-XXXXXXX) |
dsainfo | Set to 1 to enable DSA (Digital Services Act) transparency info in responses |
<script>
dlApi = {
target: "demo_page", // your site ID - provided by Ring DAS
tid: 'EA-7012768', // your tenant ID - provided by Ring DAS
dsainfo: 1, // enable DSA transparency info
cmd: [] // command queue
};
</script>
<!-- SDK URL - provided by your Ring DAS account manager -->
<script src="https://das-cdn.idealo.com/build/dlApi/minit.boot.min.js" async></script>The SDK script URL (
minit.boot.min.js) may differ depending on your integration. Your Ring DAS account manager will provide the correct URL for your setup.
Step 2: Configure Consent
As soon as possible after embedding the script, you should pass consent information. This determines whether personalized ads are served and controls the script's behavior.
dlApi.cmd.push(function (dlApi) {
dlApi.consent({npa: 0}); // 0 = consent given, 1 = no consent
});| Parameter | Value | Description |
|---|---|---|
npa | 0 | Consent given - personalized ads enabled |
npa | 1 | No consent - non-personalized ads only |
Consent can also be set inline when fetching ads (shown in Step 3). Setting it separately as shown above is useful when consent status is determined early in the page lifecycle.
Step 3: Fetch the Ad
| Parameter | Description |
|---|---|
slot | Fixed value brand_store for this format |
div | Container element ID - required for viewability measurement |
tplCode | Fixed value 1746213/Banner-Standard for Brand Store |
asyncRender | Set to true to manually control when impression is counted |
manufacturer_id | Manufacturer identifier for targeting (passed via addKeyValue) |
dlApi.cmd.push(function (dlApi) {
// Set targeting context
dlApi.addKeyValue('manufacturer_id', '12345678'); // determines which brand's ad to display
// Fetch ad
dlApi.fetchNativeAd({
slot: 'brand_store', // fixed value for Brand Store
div: 'ad-container', // container ID for viewability tracking
tplCode: '1746213/Banner-Standard', // fixed value for Brand Store
asyncRender: true // manually count impression with ad.render()
}).then(function (ad) {
if (!ad) {
console.log('No ad available');
return;
}
// Ad exists - render with YOUR shop data
renderBrandStoreButton(ad);
}).catch(function (err) {
console.error('Ad could not be loaded:', err);
});
// Trigger ad fetch
dlApi.fetch();
});Implementation note: The onclick handler shown below is an example. Your shop is responsible for implementing click tracking - simply fire a tracking pixel on product click using the constructed tracking URL.
Example code: The rendering function below is provided as a documentation example. Adapt it to your shop's templating system and styling requirements.
Step 4: Render with Your Shop Data
function renderBrandStoreButton(ad) {
// YOUR shop data - NOT from ad server!
var shopData = {
productUrl: 'https://apple.com/store/iphone',
shopLogo: 'https://example.com/apple-logo.svg',
shopName: 'Apple',
price: '€899.00'
};
// Click tracking URL - this IS from ad server
var clickUrl = ad.meta.adclick + encodeURIComponent(ad.fields.click || '');
// DSA transparency info (available if dsainfo: 1 was set in SDK config)
var dsaInfo = ad.dsa; // { behalf, paid, adrender }
// Count impressions manually
ad.render();
// Render button with shop data + ad tracking
var container = document.getElementById('ad-container');
container.innerHTML =
'<span class="ad-label">Ad</span>' +
'<a href="' + shopData.productUrl + '" ' +
'target="_blank" ' +
'rel="noopener nofollow sponsored" ' +
'onclick="new Image().src=\'' + clickUrl + '\';">' +
'At <img src="' + shopData.shopLogo + '" alt="' + shopData.shopName + '"> ' +
'for ' + shopData.price +
'</a>';
}Backend Integration (SSR)
For server-side rendering, fetch ad data from the bidder before rendering the page.
Required: The SDK from Step 1 (Frontend) must still be loaded on the page for viewability tracking via
registerBidResponse().
Step 1: Fetch Ad from Bidder
Make a GET request to the Ring DAS bidder endpoint. The bidder URL will be provided by your Ring DAS account manager.
| Parameter | Description |
|---|---|
BIDDER_URL | Bidder endpoint URL - provided by your Ring DAS account manager |
NETWORK_ID | Your Ring DAS network ID (without EA- prefix) |
site.id | Your site identifier in Ring DAS |
imp[].tagid | Fixed value brand_store for this format |
ext.keyvalues.manufacturer_id | Manufacturer identifier for targeting |
user.ext.npa | Consent flag: false = consent given, true = no consent |
regs.gdpr | GDPR applies flag: 1 = GDPR applies, 0 = does not apply |
regs.gpp | GPP consent string (optional) - TCF-compliant consent string from your CMP |
regs.ext.dsa | Set to 1 to request DSA transparency info in response |
tmax | Request timeout in milliseconds |
Consent handling: You can pass consent via
user.ext.npa(simple flag) OR viaregs.gpp(TCF-compliant string). If you have a TCF-compliant CMP, use the GPP string for more granular consent information.
// Node.js backend
const NETWORK_ID = '7012768'; // your Ring DAS network ID
const BIDDER_URL = `https://das.idealo.com/${NETWORK_ID}/bid`; // provided by your account manager
const requestBody = {
id: Math.random().toString(16).substring(2, 15),
imp: [{
id: 'imp-1',
tagid: 'brand_store', // fixed value for Brand Store
secure: 1,
native: { request: "{}" }
}],
site: { id: 'demo_page' }, // your site ID
user: {
ext: {
npa: false // false = consent given, true = no consent
}
},
ext: {
network: NETWORK_ID,
keyvalues: {
manufacturer_id: '12345678' // manufacturer ID for targeting
},
is_non_prebid_request: true
},
regs: {
gdpr: 1, // 1 = GDPR applies, 0 = does not apply
gpp: 'YOUR_GPP_STRING', // optional: TCF-compliant consent string from CMP
ext: {
dsa: 1 // request DSA transparency info
}
},
tmax: 1000 // request timeout in milliseconds
};
// Send as GET request with body in data= parameter
const encodedData = encodeURIComponent(JSON.stringify(requestBody));
const response = await fetch(`${BIDDER_URL}?data=${encodedData}`);
// Check for no ad available (204 No Content)
if (response.status === 204) {
// No ad available for this request
console.log('No ad available');
}
const bidResponse = await response.json();No ad available: When no ad matches the request criteria, the server returns HTTP
204 No Contentwith an empty response body. Always check the status code before parsing JSON.
Step 2: Parse Response
const bid = bidResponse?.seatbid?.[0]?.bid?.[0];
if (!bid) {
// Fallback check - no bid in response
return null;
}
// Parse adm (it's a JSON string)
const adm = JSON.parse(bid.adm);
// Construct click tracking URL
const clickUrl = adm.meta.adclick + encodeURIComponent(adm.fields.click);
// DSA transparency info (from bid.ext.dsa, requires regs.ext.dsa: 1 in request)
const dsaInfo = bid.ext?.dsa; // { behalf, paid, adrender }Step 3: Render HTML + Register Response
The href links to your shop's product page. The ad tracking is attached only to onclick - it fires a tracking pixel without affecting navigation.
<!-- Render with YOUR shop data -->
<div id="brand-store-ad">
<span class="ad-label">Ad</span>
<a href="<%= shopData.productUrl %>"
onclick="new Image().src='<%= clickUrl %>';">
At <img src="<%= shopData.shopLogo %>"> for <%= shopData.price %>
</a>
</div>
<!-- Register for viewability and impression tracking -->
<script>
dlApi.cmd.push(function () {
// Arguments: raw bid response object, container element ID
dlApi.registerBidResponse(<%- JSON.stringify(bidResponse) %>, 'brand-store-ad');
});
</script>What the Ad Server Returns
| Field | Description |
|---|---|
ad.meta.adclick | Click tracking base URL |
ad.meta.adid | Ad identifier |
ad.fields.click | Parameter to append to tracking URL |
ad.dsa.behalf | Advertiser name (DSA compliance, requires dsainfo: 1) |
ad.dsa.paid | Entity that paid for the ad (DSA compliance) |
ad.dsa.adrender | Ad render information (DSA compliance) |
The ad server does NOT return product data like price, logo, or URLs. Your shop provides all display data.
Related
- Format Overview - Compare available ad formats
- Ad Delivery Overview - Learn about Ring DAS ad delivery
Updated about 16 hours ago
