Notification

In this help center, you can find content for both Merchant Center Next and the classic Merchant Center experience. Look for the logo at the top of each article to make sure you're using the article for the Merchant Center version that applies to you. 

About dynamic promotions

A custom icon for Merchant Center Classic and Merchant Center Next.

Dynamic promotions help retailers by automatically selecting the optimal discount and applying it to Shopping ads on Google to maximize gross profit. Dynamic promotions use the information provided by you about the cost of goods sold (COGS) for your inventory, discount promotions, and feedback on conversions to present the best suited promotion to customers using Google’s AI powered price modeling.

On this page


Benefits

Google pricing models automatically determine the optimal promotional discount that produces the highest gross profit. Dynamic promotions helps you:

  • Automate promotions with real-time discounts optimization, saving time and effort.
  • Improve return on advertising spend (ROAS) and profitability.
  • Update promotions with best suited discounts across Shopping ads and your site’s landing pages with the help of Google’s high scale pricing models.

Eligibility criteria for dynamic promotions

Before you can use dynamic promotions, make sure you meet all eligibility requirements. If you have multiple Merchant Center (sub) accounts, each account must fulfill all requirements separately.

  • Country availability of dynamic promotions is limited to those countries where regular promotions are available. For full list of countries, refer to the "Availability" section of Participation criteria and policies.
  • At least 1,000 consumer clicks across the entire inventory of your Merchant Center account.
  • At least 20% of your impressions is opted in by populating the [auto_pricing_min_price] and [cost_of_goods_sold] attributes.
  • Working conversion tracking and feed configuration set up.
  • Google-selected promotions encoded in the URL must be displayed and honored for 60 minutes in your online store.

How dynamic promotions works

Dynamic promotions helps merchants automate selection and application of best suited discounts to the products in Shopping ads to increase gross profit.

Merchants must provide: Intended discount percentage, cost of goods sold for your inventory, and conversion data. Using that data, Google’s AI powered price modeling automates promotions decisions, selecting the optimal promotion for all opted-in products. Dynamic promotions works in the following order:

  1. Merchants upload promotions and coupons to Merchant Center along with required information.
  2. Promotions are displayed to consumers on Shopping surfaces, improving performance
  3. Shoppers apply those promotions in the merchant’s eStore at checkout time.

Google uses a real-time learning system that takes into account many data sets including demand and price elasticity to select the right product discount. This helps us provide competitive pricing to increase revenue and gross profit for merchants.

Your products will be displayed as on “sale” with a strikethrough price.

Note: We calculate overall gross profit impact by taking into account sale of all the items purchased in the same session, including discounted and non-discounted products, when a shopper clicks on a dynamic promotions ad.

URL coupon passing

When a shopper clicks on your dynamic promotions listing, they are redirected to your product’s landing page. Your website needs to display the coupon on the landing page to match the strikethrough price shown on Google, preferably next to the product price.

Product landing page of a green candle with the original price crossed out and sale price in red.

To display the coupon on your landing page, the dynamic promotions generated clickthrough URL passes coupon information as a parameter. The URL is encoded in JSON Web Token that can be decoded with a base64 decoder and used as it.

Below is an example clickthrough URL with pv2 parameter used for passing coupon information:

https://www.yourwebsite.html?pv2=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjIjoiRVVSIiwiZXhwIjoxNjg0NDE2ODk5LCJtIjoiMTIzNDU2IiwibyI6IjY1NDMyMSIsInAiOjE0LjA2LCJkcCI6MTIsImRjIjoiTktMRVdBT0kifQ.D0dYYxnqki8aUnlPKFM-sFcHxSzu1HJ9v9wOGXGk2Lw

The encoded token contains 2 relevant field for price passing:

  • dp – represents the discount percentage
  • dc – represents the coupon code

Example:

"dp": 10,

"dc": "RHNKLNEQ"

// 10% percent discount

// coupon code = RHNKLNEQ

Note: Coupons are dynamically generated and aren’t assigned to individual shoppers. They are updated for everyone several times a day.

Example coupon passing code

// Example code validating and decoding Google Automated Discounts pv2 token.
// Displays the coupon on the top of the website after running the script.
// To run:

// 1. Open website with pv2 token in Chrome e.g. https://www.yourwebsite.html?pv2=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjIjoiRVVSIiwiZXhwIjoxNjg0NDE2ODk5LCJtIjoiMTIzNDU2IiwibyI6IjY1NDMyMSIsInAiOjE0LjA2LCJkcCI6MTIsImRjIjoiTktMRVdBT0kifQ.D0dYYxnqki8aUnlPKFM-sFcHxSzu1HJ9v9wOGXGk2Lw

// 2. Right click on site -> inspect element

// 3. Go to "Console" tab

// 4. Paste the whole script to the console and click enter

 

// Google public key used for signing Automated Discounts pv2 tokens

const google_public_key = `-----BEGIN PUBLIC KEY-----

MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERUlUpxshr67EO66ZTX0Fpog0LEHc

nUnlSsIrOfroxTLu2XnigBK/lfYRxzQWq9K6nqsSjjYeea0T12r+y3nvqg==

-----END PUBLIC KEY-----`

 

// const verify_signature = true  // use to verify the token signature

verify_signature = false  // use for non-google tokens

 

function verifyAutomatedDiscountTokenCorrectness(jwt) {

  console.log("verifyAutomatedDiscountTokenCorrectness")

  if (jwt == null) {

    console.log("error: no JWT")

    return false

  }

 

  const current_page_offer = "654321" // TODO: get offer_id of the current page

  const expected_merchant_id = "123456"  // TODO: use real Merchant Center ID

 

  const jwt_offer = jwt.o

  const jwt_merchant = jwt.m

  const jwt_expiry_date = Date(jwt.exp)

 

  if (jwt_offer != current_page_offer) {

    console.log("error: incorrect offer id:", jwt_offer, " vs", current_page_offer)

    return false

  }

  if (jwt_merchant != expected_merchant_id) {

    console.log("error: incorrect merchant id", jwt_merchant, " vs", expected_merchant_id)

    return false

  }

  if (Date() < jwt_expiry_date) {

    console.log("error: expired token")

  }

 

  return true

}

 

function displayAutomatedDiscountLitePricePassingCoupon(jwt) {

  if (!verifyAutomatedDiscountTokenCorrectness(jwt)){

    return

  }

 

  const discount_percent = jwt.dp

  const coupon_code = jwt.dc

 

  if (discount_percent == undefined) {

    console.log("error: missing discount percentage")

    return

  }

 

  if (coupon_code == undefined) {

    console.log("error: missing coupon code")

    return

  }

 

  // TODO: set a proper place in which the coupon should be displayed

  let target_element = document.getElementsByTagName("body")[0]

  target_element.innerHTML = `<div><h1><font color="red">-${discount_percent}% with coupon: ${coupon_code}</font></h1></div>` + target_element.innerHTML

}

 

function parseJwtAndDisplayCoupon()

{

  const urlParams = new URLSearchParams(window.location.search)

  const jwt = urlParams.get('pv2')

 

  if (jwt == undefined){

    console.log("error: pv2 parameter is not in the URL")

    return

  }

 

  // Use Jose (https://github.com/panva/jose) library to validate and decode JWT token.

  fetch('https://cdnjs.cloudflare.com/ajax/libs/jose/4.14.0/index.umd.min.js')

      .then(response => response.text())

      .then(text => eval(text))

      .then(() => {

        jose.importSPKI(google_public_key, 'ES256').then(publicKey => {

          if (verify_signature) {

            jose.jwtVerify(jwt, publicKey).then(

                (decoded_jwt, _) => {

              displayAutomatedDiscountLitePricePassingCoupon(decoded_jwt.payload)

            })

          }

          else {

            displayAutomatedDiscountLitePricePassingCoupon(jose.decodeJwt(jwt))

          }

        })

      })

}

 

parseJwtAndDisplayCoupon()

Instructions to set up dynamic promotions

You can set up dynamic promotions for your products by following these steps sequentially or in parallel:

Step 1 of 4: Provide auto pricing minimum price [auto_pricing_min_price]

  • Pricing minimum price [auto_pricing_min_price] attribute is used to set a minimum price to which a product's price can be reduced by pricing rules you create in your Merchant Center account.
  • Learn how to set Auto pricing minimum price [auto_pricing_min_price].

Step 2 of 4: Provide cost of goods (COGS) [cost_of_goods_sold]

Cost of goods sold data is used to calculate an estimated gross profit of your products. Without COGS, we won’t be able to calculate optimal coupon discounts and gross profit for items sold. Provide COGS information for as much inventory as possible to help Google deliver better profitability on the sales of your products.

Learn how to set up Cost of goods (cogs) [cost_of_goods_sold].

Note: If you’d prefer not to provide a specific COGS for each item, you can specify a margin percentage for COGS using a supplemental feed in Merchant Center. This can be applied to individual items or categories of items.

Learn how to set up supplemental feed in Merchant Center.

Step 3 of 4: Set up reporting Conversions with Cart Data

Conversion with Cart Data reporting is used to calculate the impact of dynamic promotions and provide you best results. Set up Conversion with Cart Data reporting to submit cart data which will allow you to track the number of transactions, revenue, and profit generated by your dynamic promotions.

Set up reporting Conversion with Cart Data to:

  • Clearly measure revenue and profit generated by your dynamic promotions.
  • View detailed reporting on cart size and average order value.
  • View detailed reporting on items sold.

Learn how to Set up and test reporting Conversions with Cart Data.

Step 4 of 4: Set up coupons

The coupons used by dynamic promotions have to be configured and set up just like any other promotion in Merchant Center or the promotions feed. Set up Merchant promotions on Shopping Ads.

Note: Dynamic promotions is subject to Promotions feed specification and Promotions policies.

Dynamic promotions are intended to be used as 'percentage off' or ‘money off’ promotions for online offers, so certain attributes for dynamic promotions should be configured as follows:

Attribute

Required

promotion_id

Must start with "spd_" prefix

offer_type

Must be set to "generic_code"

redemption_channel

Must be set to "Online"

promotion_destination

Must be set to "Shopping_ads"

generic_redemption_code

Must be specified

percent_off OR money_off_amount

Must be specified

In addition to the above fields, other fields marked as required need to be specified.


Best practices

  • Provide as many discount values as possible

    Dynamic promotions selects the optimal discount from the discount values provided. So having from 1 to 10 possible discount values or more will allow the best gross profit uplift. For example, you provided 5%, 10%, and 20% as discount values. If the optimal discount calculated is 8%, then the 5% coupon will be selected, limiting effectiveness. In this situation, providing 5%, 7%, 9%, 11%, 13%, up to 20% discount values would be best.

  • Avoid using coupon codes that are easy to guess

    Avoid using common coupon codes like "5OFF", "10OFF", and more. Shoppers may guess common coupon codes and apply them for maximum discount, causing undesired results.

  • Limit time frame and product applicability

    To limit coupon reuse, you can limit the duration each coupon is valid for. Use promotion start date [promotion_effective_dates] attribute to set a timeframe for the promotion. Although dynamic promotions work best when associated with the majority of inventory, you can consider creating category-specific coupons.

Frequently asked questions

  1. How does dynamic promotions work with tROAS setting in Google Ads?

    Dynamic Promotions works best when tROAS bidding is enabled, but they don’t require tROAS.

  2. Can a merchant mix money off and percent off promotions?

    Yes. While a specific feed row can’t have both a percent_off and money_off_amount attribute set at the same time, separate promotions can be configured for the same product with money and percent off discounts.

  3. What factors are considered when choosing what promotions from the range to show?

    Google’s AI considers many factors and data sets to decide the right product discount. One of the main inputs we use to understand the right discount is the demand curve and price elasticity.

  4. Is there a minimum and/or maximum requirement within which the percent off or money off value must adhere to?

    There are no minimum or maximum discount requirements for the promotions.

  5. Can the promotion destination be set to both Shopping ads and free listings?

    Currently, only Shopping Ads are supported. We are continuously working to expand the availability of Dynamic Promotions to expand the impact for merchants and shoppers.

  6. What if my coupons have a minimum order value?

    Coupons with minimum order value are supported.

  7. Can a merchant specify a margin percentage for cost of goods sold (COGS) instead of providing a specific value for every offer?

    Yes, a merchant can specify a margin percentage for COGS using a supplemental feed in Merchant Center.

  8. Does dynamic promotions work with Performance Max campaigns?

    Dynamic promotions currently only applies to Shopping ads, but is Performance Max compatible. This means that it works with Performance Max campaigns, but the promotions will only appear on the Shopping ads run by the Performance Max campaign.

  9. How is dynamic promotions different from the automated discounts program?

    Both programs are powered by similar models. Dynamic promotions offers a much lighter integration requirement for price passing/landing pages.

Related links

Was this helpful?

How can we improve it?
Search
Clear search
Close search
Main menu
5470504200501439471
true
Search Help Center
true
true
true
true
true
71525
false
false