SafeSale · Blog

Shopify sales without Google Merchant Center disapprovals

Why a Shopify sale can get products disapproved in Google Merchant Center, how price and sale_price work in the feed, and how to keep a sale consistent.

A sale that goes well on the storefront can go badly in Google Merchant Center: products disapproved for price mismatches in the middle of the campaign you were paying to advertise. If you are searching “shopify sale price google merchant center disapproved” or wondering how compare at price and Google Shopping interact, this guide explains what Google actually checks, how Shopify’s price and compare-at fields relate to a feed, and how to run a sale that keeps all three (product page, checkout and feed) telling the same story. It ends with what SafeSale does, and does not, do here.

The problem: the feed disagrees with the store

On Bold Discounts’ one- and two-star review page an undated review says that running a sale with the app left the merchant’s products “disallowed from Google Merchant Center” because, in their words, “it does not send the sale price to GMC”, while a native Shopify discount caused no issues. We cannot verify how any third-party app populates a feed, and we quote the review only as an example of the symptom; read the page for the developer’s reply.

The symptom, though, is well defined. Google compares the price data it has for an item with the price it finds on your landing page and at checkout. When they differ, the item is disapproved until they agree again. A sale is the moment most likely to make them differ.

Why it happens: price, sale_price and what Google checks

Google’s specification for the price attribute requires you to “submit an amount and currency that match the price on your landing page and the checkout pages”. Its specification for the sale_price attribute adds the rules for sales: submit the sale price in sale_price and “continue to submit the full price of your product” in price; if you do not submit sale_price, then price itself must be the sale price; “clearly display both non-sale and sale prices on your landing pages, and only the sale price at checkout”; and, if you submit a sale price, submit a value “that matches the sale price you display on your landing page and at checkout”. Google also states that failing these requirements leads to disapproval.

On the Shopify side, the sale pricing guide describes the two fields involved: Price is what the customer pays and Compare-at price is the higher original shown crossed out, and “only the sale price is displayed at checkout”. Shopify’s Google & YouTube channel syncs products that are available to your online store with Merchant Center, and treats discounts as Merchant Center promotions.

Put those together and the failure modes fall out:

  • Display-only sale prices. If an app shows a lower price on the product page by rewriting the page with a script, while the stored variant price (the thing a channel syncs) is unchanged, the landing page and the feed disagree for the whole sale.
  • Checkout-only discounts without a promotion. An automatic discount is applied in the cart and at checkout. The product page still shows full price, the shopper pays less, and Google’s rule wants both to match the submitted price. Google’s answer to this is the promotion mechanism, which is why Shopify’s channel maps discounts to promotions.
  • Timing gaps. Prices change in Shopify, the feed updates later; between the two, Google sees a mismatch. A sale that starts at midnight and a feed that refreshes on its own schedule will spend some time out of step, and the same happens in reverse when the sale ends.
  • Restores that never finished. If the sale ends on the feed side but a rewrite app leaves some variants discounted, the stored price stays low while the feed has gone back to full price. See how sale apps leave the wrong prices behind.

The manual fix: keep three prices in step

  1. Look at the diagnostics before you change anything. Merchant Center’s item-level issues tell you exactly which products are disapproved for price and which value Google found. In Shopify, the product page’s Sales channels section shows the Google channel’s errors for that product.
  2. Decide how the sale reaches the stored price. If the storefront must show a lower price, use a real compare-at sale (a lower Price, the original in Compare-at) so that the stored price, the landing page and checkout all change together. If the discount only exists at checkout, treat it as a promotion and check your channel’s promotion settings rather than expecting the product price to move.
  3. Confirm the mapping in your channel. Whether your channel or feed app submits the compare-at as price and the price as sale_price, or only the price, is a property of that tool. Look at a synced item in Merchant Center during a test sale and read the two attributes.
  4. Schedule the sale, do not flip it by hand. A scheduled start and end at least gives the feed a deterministic time to catch up to. If you manage a feed file yourself, Google’s sale_price_effective_date attribute lets you announce the window in advance.
  5. Verify the restore. After the sale, export products and check that price and compare-at are back to their originals on every variant, then re-check Merchant Center a day later.

Our automatic discount versus compare-at rewrite article covers the storefront trade-offs of that second step.

What SafeSale does here, and what it does not

SafeSale has no Google Merchant Center or feed integration: it does not create promotions, submit sale_price, or talk to the Google & YouTube channel. What it does is make the stored price behave predictably, which is the part of this problem a sale app can own:

  • In price-rewrite mode, the stored price is the sale price. At the scheduled start SafeSale writes each variant’s sale price into Price and the original into Compare-at. The product page, the checkout and the product data a channel reads are the same number, because there is only one number.
  • Scheduled start and end, exact restore. Sales run between a start and end time. At the end, SafeSale writes back the snapshotted original price and compare-at (clearing compare-at where there was none) rather than recomputing them, and re-runs a restore that fails part-way. The stored price does not stay low by accident.
  • In the default automatic-discount mode, the stored price is untouched. The discount is applied by Shopify at checkout; SafeSale does not fake a lower price on the product page, so there is no display-only price for a feed to disagree with. Any Merchant Center promotion for that discount is yours to configure in the channel.

We are not claiming SafeSale prevents Merchant Center disapprovals; the feed mapping and timing are outside any sale app’s control. We are claiming that a sale run this way leaves your product data in a state Google can be told the truth about, during and after.

Next step

SafeSale is not yet publicly listed on the Shopify App Store. The landing page demo shows a scheduled price-rewrite sale and its exact restore. See how SafeSale keeps stored prices predictable.

Frequently asked questions

Why did Google Merchant Center disapprove my products during a sale?

Most often because the price Google has for the product no longer matched the price on your product page or at checkout. Google requires the submitted price, or sale_price when on sale, to match both. Any sale mechanism that changes what shoppers see or pay without the feed reflecting it can trigger that mismatch.

Does the compare-at price go to Google Shopping?

Google's product data has a price attribute and a sale_price attribute; Shopify's compare-at field is a storefront display value. How your compare-at and price map onto those two attributes depends on the channel or feed app you use, so check the mapping in your Merchant Center diagnostics rather than assuming.

Is a price rewrite or an automatic discount safer for the Google feed?

A price rewrite changes the stored variant price, so the product page, checkout and whatever your channel syncs all move together. An automatic discount lowers the checkout total without changing the product page price, which Google's price requirements treat differently; Shopify's Google & YouTube channel documentation covers discounts as Merchant Center promotions. Whichever you use, the feed must reflect what the shopper sees and pays.

Does SafeSale manage my Google Shopping feed or promotions?

No. SafeSale has no Merchant Center or feed integration. What it does is keep the stored price, the storefront and checkout consistent during and after a price-rewrite sale by writing the sale price and compare-at at the scheduled start and restoring the exact originals at the end.