Running a time-limited discount on your Shopping ads is one of the highest-leverage things you can do during a sale period. The “Special offer” badge that appears beneath your Shopping listings costs nothing extra per click and consistently lifts both CTR and conversion rate. Shoppers can see there is a deal before they click — which improves the quality of traffic you are paying for.
Setting it up correctly requires three files submitted to Merchant Center in the right sequence. This is the full walkthrough.
The Scenario
A common two-phase sale structure looks like this:
Phase 1 (pre-sale teaser): Customers get the discount by entering a coupon code at checkout. For example: code SALE20 gives 20% off from March 20 to March 25.
Phase 2 (main sale): The discount is applied automatically at the product level — no code needed. For example: 20% off sitewide from March 26 to April 6.
This structure builds urgency early and removes checkout friction during the peak period. Each phase needs to be configured as a separate promotion in Merchant Center.
What You Need to Create
Three files in total:
- A supplemental product feed — links your product IDs to the promotion IDs
- A promotions feed for Phase 1 — the coupon code promotion
- A promotions feed for Phase 2 — the automatic discount promotion
All three should be tab-delimited .txt files. Merchant Center does not reliably parse .xlsx files for manual uploads — this is one of the most common reasons uploads silently fail.
File 1: Supplemental Product Feed
This file links your product IDs to the promotion IDs. It tells Merchant Center which products the promotion applies to.
If the promotion applies to every product in your account, you can skip this file and use all_products in the promotions feed instead. For selected products only, you need this.
id promotion_id
1234567 SALE20_CODE,SALE20_NODISCOUNT
8901234 SALE20_CODE,SALE20_NODISCOUNT
5678901 SALE20_CODE,SALE20_NODISCOUNT
A few things to get right here:
The id column must exactly match the product ID in your primary feed. Not the SKU, not the product title — the exact ID string used in the feed.
You can assign multiple promotion IDs to the same product by separating them with a comma and no spaces. The example above assigns both the code promotion and the no-code promotion to each product. Merchant Center uses the effective dates in each promotions feed to determine which one is active at any given time.
Products not included in this file will not receive the promotion badge.
Where to upload this: Products, Feeds, click the + icon, and select Supplemental feed. Set the fetch method to upload or scheduled fetch depending on your setup.
File 2: Promotions Feed for Phase 1 (Coupon Code)
promotion_id product_applicability offer_type generic_redemption_code long_title promotion_effective_dates
SALE20_CODE specific_products generic_code SALE20 20% off with code SALE20 2026-03-20T00:00:00+01:00/2026-03-25T23:59:59+01:00
Field by field:
promotion_id — a unique internal identifier for this promotion. Never reuse a promotion_id you have previously submitted, even if it has expired. Merchant Center does not allow updating certain fields on existing promotions — it creates a conflict and the upload fails. Treat each promotion_id as permanent and immutable once submitted.
product_applicability — set to specific_products if you are using a supplemental feed to define which products qualify. Set to all_products if the promotion applies to your entire catalog.
offer_type — generic_code means a coupon code is required at checkout. The customer must type the code to receive the discount.
generic_redemption_code — the actual code customers enter at checkout. In this example, SALE20. Make sure this matches exactly what your store accepts — case sensitivity can matter depending on your ecommerce platform.
long_title — what shoppers see when they click the “Special offer” annotation on your ad. Write this to be specific and action-oriented. “20% off with code SALE20” is clearer than “Spring Sale discount.”
promotion_effective_dates — ISO 8601 format with a forward slash separating start and end. Always include the timezone offset. A promotion without a correct timezone offset may not activate when you expect it to. The format is YYYY-MM-DDTHH:MM:SS+HH:MM.
Where to upload this: Marketing, Promotions, Promotion Feeds, click the + icon to add a new feed, then upload the file.
File 3: Promotions Feed for Phase 2 (No Code Required)
promotion_id product_applicability offer_type generic_redemption_code long_title promotion_effective_dates
SALE20_NODISCOUNT specific_products no_code Easter Sale - 20% off selected products 2026-03-26T00:00:00+01:00/2026-04-06T23:59:59+01:00
The differences from Phase 1:
offer_type is no_code — the discount is already reflected in the product price in your primary feed. There is no code to enter. The badge still appears on the listing, and the popup shows your long_title.
generic_redemption_code is left empty — include the column header but leave the value blank. Do not delete the column.
promotion_id is a different unique ID — SALE20_NODISCOUNT rather than SALE20_CODE. Never reuse or update an existing promotion_id.
Important: For the no-code phase, your primary product feed must reflect the discounted price. Merchant Center may disapprove the promotion if the advertised discount does not match the price on the landing page. Update your product prices before Phase 2 begins and verify the feed has synced before the promotion goes live.
Upload this feed the same way as File 2, as a separate promotions feed.
Common Errors and How to Fix Them
“Promotion invalid Update”
This error appears when you try to upload a promotion with the same promotion_id as one that already exists in Merchant Center. Google does not allow updating fields like dates, offer type, or redemption code on an existing promotion ID.
The fix: always use a brand new, unique promotion_id for every upload. If you need to replace a promotion, delete the old one from Marketing, Promotions first, then upload the new file with a new ID.
Products: 0 / “Fix your product file”
This error usually means Merchant Center could not parse the file. The most common cause is uploading an .xlsx file instead of a tab-delimited .txt file. Open your spreadsheet, go to File, Save As, and select Tab-delimited Text (.txt). Then upload that file.
Attribute names not recognized
Merchant Center is case-sensitive about column headers. promotion_id works. Promotion_ID does not. offer_type works. Offer Type does not. Copy the exact header names from this post or from Google’s feed specification rather than retyping them.
Promotion showing as pending for more than 3 days
Merchant Center takes 1-3 business days to review and approve promotions. If a promotion is still pending after 3 business days, check the status details in Marketing, Promotions. A pending promotion that shows a policy issue needs to be corrected and resubmitted.
How to Verify It Is Working
After uploading the supplemental feed: Go to Products, All products, search for one of your product IDs, open the product detail view, and confirm that promotion_id appears in the attributes list with the correct IDs assigned.
After uploading the promotions feed: Go to Marketing, Promotions and check the status column. It should show “Pending review” initially, then “Active” once approved.
Once approved: Search for your product on Google Shopping. You should see a “Special offer” annotation below the listing title and price. Clicking it opens a popup with your long_title text.
If the badge does not appear after 24 hours of the promotion showing as Active, verify that the product ID in the supplemental feed matches the primary feed exactly, and that the promotion effective dates cover the current time with the correct timezone offset.
Timing and Practical Notes
Submit promotion feeds at least 5 days before the sale starts. Google’s review process is not instant, and a promotion that is still in review when your sale begins provides no benefit during that window.
Use a consistent naming convention for promotion IDs. Something like BRANDNAME_SALE_YYYYMMDD keeps your promotions list organized and makes it easy to audit what has been submitted without digging through old files.
Write the long_title for the customer, not for the system. “20% off all skincare — no code needed” is more useful than “Promotion active.” The popup is the moment a potential buyer decides whether to click — make the offer clear and specific.
For the no-code phase, double-check that your product prices in the primary feed have actually updated before the promotion goes live. Merchant Center crawls your landing pages and compares the advertised discount against the actual price. A mismatch between what the promotion claims and what the landing page shows is a direct path to disapproval.
Finally — keep a simple log of every promotion_id you have ever used. Since IDs cannot be reused, having a record prevents you from accidentally submitting a duplicate on your next sale cycle.
Related Posts
What Is Google Merchant Center and Why Every Ecommerce Store Needs It
Free Listings vs. Shopping Ads: What's the Difference and How to Use Both
How to Connect Shopify to Google Merchant Center
Need Help With Your Google Ads?
I help e-commerce brands scale profitably with data-driven PPC strategies.
Get In Touch