About dynamic promotions

Dynamic promotions help retailers by automatically selecting the optimal coupon or promotion and applying it to Shopping ads on Google to maximise 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 modelling.

This product is still in beta. If you're interested, contact [email protected].

On this page


Benefits

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

  • Automating promotions with real-time discount optimisation, saving time and effort.
  • Improving return on ad spend (ROAS) and profitability.
  • Updating 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 that you meet all eligibility requirements. If you have multiple Merchant Center (sub) accounts, each account must fulfil all requirements separately.

  • Country availability of dynamic promotions is limited to those countries in which the regular promotions tool is available. For a 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 product impressions opted in by populating the [auto_pricing_min_price] and [cost_of_goods_sold] attributes. If you need more information about the impression coverage of your products, refer to the performance report in your Merchant Center. To get you started, you can set:
    • The [auto_pricing_min_price] attribute to <= 95% of the [price] and >= [cost_of_goods]. Check details below.
      • [cost_of_goods] < [auto_pricing_min_price] and >= 5% [price]
    • Conversion tracking with basket data. Check more implementation details here.
  • Your website integration must be able to accept and honour Google-provided coupons from Google-generated JSON web tokens.
  • Allow Google to show opted-in products to consumers with a performance-based ramp up of 10% for the first three days and 90% thereafter.

How dynamic promotions work

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

Merchants must provide the intended discount percentage, cost of goods sold for your inventory and conversion data. Using that data, Google's AI-powered price modelling automates promotion decisions, selecting the optimal promotion for all opted-in products. Dynamic promotions work 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 the promotions in the merchant's e-shop at checkout time.

Google uses AI algorithms to continuously optimise coupons based on market signals such as:

  • Price competitiveness
  • Price elasticity
  • Seasonality trends
  • Estimated delivery day
  • Brand value
  • Delivery cost

Adjusted sale prices will be shown in Shopping ads (channel-based discounting) and will be passed securely to display the same price on the product landing page in your online shop.

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

Note: We calculate overall gross profit impact by taking into account the 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're 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 click-through URL passes coupon information as a parameter. The URL is encoded in a JSON web token that can be decoded with a base64 decoder and used as it.

Below is an example click-through URL with the pv2 parameter used for passing coupon information:

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

The encoded token contains two relevant fields for price passing:

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

Example:

'dp': 10,

'dc': 'RHNKLNEQ'

// 10% percentage discount

// coupon code = RHNKLNEQ

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

Example coupon passing code

// Example code validating and decoding Google-automated discounts pv2 token.
// Displays the coupon at the top of the website after running the script.
// To run:

// 1. Open website with pv2 token in Chrome e.g. https://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' // TO-DO: get offer_id of the current page

  const expected_merchant_id = '123456'  // TO DO: 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

  }

 

  // TO-DO: 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]

  • The 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 that you create in your Merchant Center account.
  • Learn how to set auto-pricing minimum price [auto_pricing_min_price].
  • You may provide this attribute via a supplemental feed or feed rules in your Merchant Center, or through the API.
  • Bear in mind that the maximum price is the regular [price] or [sale_price] provided in your product feed and the minimum price is the value that you provided in the [auto_pricing_min_price] attribute. Google will optimise the coupon value between those two limits. Google will also generate the coupon at a given time only for those products in your inventory that benefit the overall goal of maximising profit across your entire inventory, taking cross-sell and cannibalisation effects into account.

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 for 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.

You may provide this attribute via a supplemental feed or feed rules in your Merchant Center, or through the API.

Step 3 of 4: Set up reporting conversions with basket data

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

Set up reporting conversion with basket data to:

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

Learn how to set up and test reporting with conversions with basket 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 are subject to promotions feed specifications 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 [promotion_id]

Must start with spd_ prefix

offer_type [offer_type]

Must be set to generic_code

redemption_channel [redemption_channel]

Must be set to Online

promotion_destination [promotion_destination]

Must be set to Shopping_ads

generic_redemption_code [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.


Google review

After the implementation steps have been completed, request Google to conduct a full review by clicking Request verification. The review will go through end-to-end testing that covers multiple scenarios. It will be completed within the Google Network to ensure that the integration is functioning correctly. Any open issues will be displayed on the last setup page. Allow up to 24 hours for updates after you've made a change.

If there are issues found, resolve the issue and submit a follow-up review request by clicking the button again. You'll have to resubmit review requests until all issues have been resolved.

After Google reviews and approves your account, you'll be able to monitor your performance in the 'Automated discounts' tab, as well as pause and activate the generation of optimised sale prices with only a click of the button.

Launch schedule

Ramp-up

After your review has been completed, the ramp-up process will start according to the schedule below.

Ramp-up schedule

  1. First stage: Optimised coupons shown to 10% of customers.
  2. Second stage: Optimised coupons shown to 90% of customers.

You can check your ramp-up percentage in Merchant Center at any time by navigating to the 'Automated discounts' tab under 'Marketing'.


Best practices

  • Provide as many discount values as possible

    Dynamic promotions select 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% and 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 that each coupon is valid for. Use the promotion start date [promotion_effective_dates] attribute to set a time frame 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 do dynamic promotions work with the tROAS setting in Google Ads?

    Dynamic promotions work best when tROAS bidding is enabled, but they don't require tROAS.

  2. Can a merchant mix money off and percentage 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 percentage off discounts.

  3. What factors are considered when choosing which 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 that we use to understand the right discount is the demand curve and price elasticity.

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

    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're 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 a 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. Do dynamic promotions work with Performance Max campaigns?

    Dynamic promotions currently only apply to Shopping ads but are compatible with Performance Max. 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 are dynamic promotions different from the automated discounts programme?

    Both programmes are powered by similar models. Dynamic promotions offer a much lighter integration requirement for price passing or landing pages.

  10. I have a single MCID account but multiple product feeds for different countries. Can I opt in products from different countries?

    You may opt in products by adding the [auto_pricing_min_pricing] attribute for the countries of your preference. Performance reporting will show data across all countries in aggregate, but you're currently not able to filter by a specific country.

Related links

Was this helpful?

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