All packsProduct Feed & Merchant Center ComplianceSolve
google shopping sale price effective date page mismatch
While a sale is running, the page has to show the sale price -- not the feed's regular price
effectivePrice() picks the sale price only inside its own effective-date window -- and the landing page's structured data has to reflect that same computed price, or the page contradicts what the shopper is actually charged.
This is one of the things Product Feed & Merchant Center Compliance already handles. Get your products into Google Shopping and keep them from being rejected.
Is this you?
Computing a product page's displayed price with a second, independent rounding or date-window check -- separate from the one the feed uses -- can put the regular price on the page while the feed advertises an active sale price, or vice versa, the moment a sale's effective-date window opens or closes. Either direction is a mismatch Google's crawl will catch, because the page is supposed to show what the shopper is actually charged right now.
Why this one is easy to get wrong
Writing the feed and the product page as two separate features, each computing its own display price from the catalogue's raw fields, is the natural way to build them incrementally -- and it's only when a sale is actually running that the two independently-written price calculations have a chance to disagree, which most development and testing happens outside of a live sale window.
What you get instead
Both the feed and productJsonLd() call the identical effectivePrice(offer, now) function -- there is no second rounding rule and no second sale-window check anywhere in the pack. now is always injected, never new Date() read inline during a comparison, specifically so a sale window expiring mid-test-run can't produce a flaky result; the structured-data test suite's final block renders every catalogue item's page markup and feeds it back through the consistency checker, requiring zero findings.
Source: ARCHITECTURE.md 'The one idea', 'Structured data' — checkable in the pack you receive
How you actually use this
You don’t install a library or wire up an SDK. Your own coding agent builds the code in your project, and you keep it — no runtime dependency on us.
Step 1
Download and unzip
You get a folder: the docs that tell an agent what to build, a starting skeleton, and the test suite that decides when it's done.
Step 2
Open it in Claude Code or Cursor
Point your coding agent at the folder. Nothing to install, no account with us, no API key.
Step 3
Paste one prompt
The pack contains the exact prompt. Paste it as your first message and leave it alone — it works through the build itself, choosing a cheaper or stronger model per task.
Step 4
Run ./verify.sh
One command. It prints a pass or fail for every check. Green means the build is done — the same script we ran to produce the receipt on this page.
Typical build: about 44 minutes of your agent working, mostly unattended. Then you integrate the working module into your app the way you would any code you’d written yourself.
Why you can believe this
2 of 3 runs passedWe ran this pack from an empty folder 3 times and published exactly what happened — every check, the model, the token cost, the wall time. Not a testimonial, and not our opinion: the same verify.sh you run yourself. Read the full receipt →
Related problems
Product Feed & Merchant Center Compliance
Your feed can be perfectly valid and still be the #1 reason for disapproval
Product Feed & Merchant Center Compliance
Google reads the HTML your server sent. It does not run your JavaScript.
Product Feed & Merchant Center Compliance
toFixed(2) is wrong the moment a currency has zero decimal places