An ecommerce promotion is ready only when the same eligible shopper can move from the ad to the selected variant, cart, checkout, and receipt without an unexpected change in price or terms. Testing a coupon in the admin is not enough. Catalog price, sale schedule, product data, page rendering, discount logic, market, currency, and measurement must describe the same offer.
The failure can be real even when every team finished its task. Merchandising lowered the price; paid media published the creative; the feed contains a sale value; the storefront shows a badge. Yet one clock starts early, one variant keeps the old price, or accelerated checkout ignores the rule. Customers experience the handoff, not department boundaries.
The practical fix is to test one concrete promise across every price surface before traffic starts, then reconcile that promise with paid orders while the promotion is live.
Friday, 4:05 p.m.: the ad changes before the store
Consider a fictional home-goods retailer preparing a weekend promotion. An $80 lamp should sell for $64 from Friday at 5:00 p.m. through Sunday at 11:59 p.m. in the store's operating time zone. The ad is approved, and the storefront team has scheduled the price change.
At 4:05 p.m., a shopper sees the $64 price in a Shopping listing, clicks, and lands on the $80 product page. The feed used a sale window without the intended time-zone offset, so the listing changed before the storefront. The discount is genuine; the systems simply disagree about when it exists.
Google's current Merchant Center price-mismatch guidance identifies update timing, structured data, currency, sale windows, and time zones as common sources of disagreement. It also explains that a product may be disapproved when the submitted price does not match the landing page price that Google can read.
For scheduled sales, Google's sale price effective date specification accepts explicit start and end times with a time zone. If a time zone is omitted, Google says it defaults to UTC. A date that appears right in a spreadsheet can therefore be wrong at the customer-facing boundary.
A discount can be a price, a rule, or a message
Teams create avoidable mismatches when they use “sale” and “discount” as though they describe one mechanism. They do not.
- A sale price changes the product's current price. In Shopify, sale pricing uses the Price and Compare-at price fields; both may appear on the product page, while checkout displays the current sale price.
- An automatic discount is a cart or checkout rule. Shopify says automatic discounts apply only when the cart and customer satisfy the configured eligibility. It may not appear as a lower product-page price without additional storefront work.
- A discount code is a conditional instruction. It can be rejected because of dates, customer eligibility, product scope, usage limits, or an incompatible automatic discount.
- A banner, email, or ad is only the promise. It does not make any of those price mechanisms work.
The promise also needs an honest comparison basis. The current FTC Guides Against Deceptive Pricing say that a former price used to advertise a reduction should be bona fide, not manufactured to create a bargain. Material offer terms should be clear at the outset. This is an operational QA guide, not legal advice; promotion claims and pricing rules still deserve qualified review in each market.
Watch the price change one surface at a time
A useful promotion trace follows the shopper's path and the data path together. The surfaces are connected, but they do not necessarily update at the same speed.


- Catalog: base price, sale price, compare-at value, variant, market, inventory, and discount eligibility originate here or in a connected pricing system.
- Feed and advertisement: product data, sale effective dates, currency, item ID, and promotional creative become a public acquisition promise.
- Collection and product page: the selected variant, prominent current price, original comparison price, terms, and structured data must agree.
- Cart: quantity thresholds, codes, automatic discounts, stacking, shipping thresholds, and customer eligibility are evaluated.
- Checkout: market, address, taxes, shipping, accelerated payment, and the final discount calculation determine what the shopper is actually asked to pay.
- Receipt and analytics: preserve the order's item price, coupon, discount, and currency. Promotion identifiers and attribution are evidence only when deliberately instrumented.
Google's sale price requirements require the submitted sale price to match the landing page and checkout. An advertised coupon code must be accessible to all users, so a customer-restricted code is a separate offer. The retailer still needs to test margin, eligibility, stacking, shipping, tax, support scripts, and rollback.
This connected view is visible in our El Mayorista ecommerce and Shopify POS case study, where catalog structure, POS, paid acquisition, social ads, SEO, inventory, and ongoing store support operate as one commerce system rather than isolated deliverables.
The variant is part of the promise
A promotion can pass on the default product and fail for the item a customer actually buys. Test the advertised SKU and the selected variant, not just the product family. Size, color, bundle, subscription, personalization, minimum quantity, or local availability can change both price and eligibility.
Repeat the path for each intended market and currency. A fixed market price can override the catalog; a selector can change the price after first render; a feed URL can open the wrong variant; and a wholesale minimum can make a unit price look purchasable when checkout requires more.
Our earlier Shopify POS and inventory article explains why channel promises should follow real inventory and operating rules. Promotion QA adds another layer: the advertised saving must survive the exact item and channel combination all the way to purchase.
Build the test from one concrete offer
Write the offer as a testable customer statement before configuring it. For example: “From Friday at 5:00 p.m. through Sunday at 11:59 p.m. Pacific time, any U.S. shopper can buy the blue medium lamp for $64 without a code; the offer cannot combine with another product discount; shipping and tax are separate.”
That sentence identifies the item, variant, audience, market, current price, mechanism, time zone, start and end, stacking rule, and excluded charges. If the team cannot write one accurate sentence, the creative is being approved before the offer is defined.
Give the promotion one stable identifier and use it across the brief, feed work, campaign naming, QA record, analytics, and post-sale review. The customer never needs to see the internal identifier. The team needs it so a support ticket, order, banner click, and feed issue can be reconciled to the same promotion.
Run the promotion as a customer would
Test before launch with an eligible account and a clearly ineligible case. Use a clean session, the intended device type, the live market and currency, and the exact entry URL from each paid or owned channel.
Open the collection and product pages before and after the scheduled boundary; select every promoted variant; inspect the visible price and the structured data; add the item to cart; apply or withhold the code as the promise requires; test allowed and disallowed combinations; proceed through ordinary and accelerated checkout; and confirm the final order record.
Shopify's current discount FAQ notes that expiry uses the time zone shown in the admin, that apps can affect pricing or checkout behavior, and that some discount combinations are rejected. Those are test cases, not settings to assume are harmless.
Capture the expected and observed product price, discount, shipping, tax, currency, total, order ID, promotion ID, timestamp, market, device, and checkout path. Screenshots help with visible defects, but the order and feed records are stronger evidence for the price math and timing.


Stop the launch for customer-facing contradictions
Not every defect has the same consequence. A promotion should stop when the advertisement promises a price or condition that an eligible customer cannot receive; when checkout charges more than the product page; when the former-price comparison is not supportable; when material exclusions appear only after the shopper commits time or data; or when the wrong market, currency, variant, or quantity is presented.
A Merchant Center mismatch or a price missing from or inconsistent in the HTML returned by the server is also a hold for Shopping traffic because the affected product can be disapproved and the customer path is already inconsistent. A missing analytics parameter is not the same consumer harm, but it still needs an explicit owner and decision: without promotion and order evidence, the team may be unable to judge what happened.
Rollback should be promotion-specific. Pause the creative, restore the previous product price, end the discount rule, correct the feed window, remove the banner, or exclude the affected variant. Do not improvise a homepage coupon that creates a second untested offer.
Measure the promise, not only the banner
Google Analytics 4 provides view_promotion and select_promotion events for internal promotion impressions and clicks. Ecommerce events can carry event-level currency and item-level promotion IDs, coupons, discounts, and prices when those parameters are sent on the relevant events.
Use promotion events alongside add-to-cart, checkout, purchase, and order evidence: Was the offer shown and selected? Did the right item enter the cart? Which rule applied, what reached the order, and what support contacts or refunds mention it?
Do not treat a banner click as promotion revenue. Reconcile analytics with actual orders, refunds, discounts, and support evidence. Client-side tracking can be blocked, duplicated, or lost; the commerce platform remains the source for what the customer paid.
Close every surface when the sale ends
The promotion is not finished when the clock reaches the advertised deadline. Re-test the boundary: base prices return, sale values and effective dates stop, codes reject cleanly, automatic rules deactivate, banners and emails no longer lead to the offer, feeds and structured data agree, caches refresh, and checkout no longer applies the discount.
Then preserve a compact record: the final offer statement, configuration, creative, tested variants and markets, issue log, order totals, refunds, feed status, and the decision about reuse. That record makes the next promotion easier without pretending that last season's eligibility, platform behavior, or price basis remains valid forever.
The Branding Bull's Growth Marketing service can connect campaign traffic, landing paths, testing, and reporting, while Web & Mobile Apps covers the storefront, integrations, checkout-adjacent experience, analytics, and launch QA. If a promotion keeps breaking between the ad and the order, send a project brief to discuss the smallest useful audit or implementation scope.


