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.

SourceData
Ad ServerWhether ad exists, click tracking URL
Your ShopProduct 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.

ParameterDescription
targetYour site identifier in Ring DAS
tidYour Ring DAS tenant ID (format: EA-XXXXXXX)
dsainfoSet 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
});
ParameterValueDescription
npa0Consent given - personalized ads enabled
npa1No 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

ParameterDescription
slotFixed value brand_store for this format
divContainer element ID - required for viewability measurement
tplCodeFixed value 1746213/Banner-Standard for Brand Store
asyncRenderSet to true to manually control when impression is counted
manufacturer_idManufacturer 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.

ParameterDescription
BIDDER_URLBidder endpoint URL - provided by your Ring DAS account manager
NETWORK_IDYour Ring DAS network ID (without EA- prefix)
site.idYour site identifier in Ring DAS
imp[].tagidFixed value brand_store for this format
ext.keyvalues.manufacturer_idManufacturer identifier for targeting
user.ext.npaConsent flag: false = consent given, true = no consent
regs.gdprGDPR applies flag: 1 = GDPR applies, 0 = does not apply
regs.gppGPP consent string (optional) - TCF-compliant consent string from your CMP
regs.ext.dsaSet to 1 to request DSA transparency info in response
tmaxRequest timeout in milliseconds

Consent handling: You can pass consent via user.ext.npa (simple flag) OR via regs.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 Content with 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

FieldDescription
ad.meta.adclickClick tracking base URL
ad.meta.adidAd identifier
ad.fields.clickParameter to append to tracking URL
ad.dsa.behalfAdvertiser name (DSA compliance, requires dsainfo: 1)
ad.dsa.paidEntity that paid for the ad (DSA compliance)
ad.dsa.adrenderAd render information (DSA compliance)

The ad server does NOT return product data like price, logo, or URLs. Your shop provides all display data.


Related


What’s Next

Learn how to integrate the Branded Products format