You typed a sale price, maybe scheduled it for the weekend, and the shop still shows the full price: no crossed-out price, no Sale! badge, or the sale shows on the product page but the cart charges the old price. Customers who came for the sale leave. Two checks tell you whether WooCommerce thinks the sale is on, and if it does, what is showing the old price.
Open the product and go to Product data > General. The Sale price must be lower than the Regular price; a sale price equal to or above it is ignored. If you clicked Schedule, read the two dates: the sale starts at 00:00 on the From date and ends at the end of the To date, in the time zone set under Settings > General > Timezone, so a sale dated today can still be hours away. For a variable product the General tab has no price at all: open Variations and expand each one, because every variation carries its own sale price and dates.
Open the product in a private window (logged out) and add it to the cart. If the cart has the sale price but the shop page does not, a page cache or CDN is serving a copy saved before the sale. If both show the full price but the admin shows the sale, go to WooCommerce > Status > Tools and run Clear transients and Regenerate the product lookup tables. If the price changes depending on who is logged in or what is in the cart, a pricing, role-based or discount plugin is overriding it; deactivate it on a staging copy and look again.
| What you see | Cause | Fix |
|---|---|---|
| No sale shown, and the sale price is equal to or higher than the regular price | WooCommerce only treats a lower price as a sale | Swap the numbers: Regular is the full price, Sale is the lower one |
| A scheduled sale did not start (or did not end) on time | The site time zone is UTC or another city, or WP-Cron never ran the scheduled job on a quiet site | Set Timezone to your city; check Tools > Scheduled Actions for the woocommerce_scheduled_sales job and run it; use a real server cron if WP-Cron is disabled |
| Variable product shows the full price range, no sale | The sale price was set on some variations or none; the range only shows a sale where a variation has one | Open Variations and set the sale price on each one (or use the bulk action Set sale prices) |
| Shop page full price, cart sale price | A page cache, CDN or host cache saved the page before the sale | Purge the cache, and purge it again when a scheduled sale starts and ends |
| Admin shows the sale, shop and cart do not | Stale price transients or product lookup table after an import or bulk edit | WooCommerce > Status > Tools: Clear transients, then Regenerate the product lookup tables |
| Price shown differs by customer or cart | A dynamic pricing, wholesale or role-based price plugin sets its own price and ignores the sale | Set the sale inside that plugin, or exclude the product from its rules |
| Sale price works but no crossed-out price or Sale! badge | The theme or a page builder template removed the sale flash or prints only the current price | Switch to Storefront on staging to confirm, then restore the price output in the theme or builder widget |
| Sale price reverts after a few hours | A POS, marketplace or spreadsheet sync writes the regular price back | Set the sale in the system that owns the price, or stop that sync overwriting prices |
In a private window, the shop page and product page should show the regular price crossed out next to the sale price, with the Sale! badge if your theme uses one. Add it to the cart: the line total should use the sale price. For a scheduled sale, check again just after the start time and just after the end time.
If you would rather someone else finds why the sale is not showing and fixes it, that is what the box below is for. Related: coupon not working, product cannot be purchased, product says out of stock.