Sell skincare and cosmetics with confidence: expiry, PAO and lot tracking on WooCommerce
Cosmetics and skincare are dated stock. A serum, a sunscreen, a foundation — each carries a best-before date and, once opened, a Period After Opening (the little open-jar symbol marked 6M, 12M or 24M). Under EU cosmetics rules, products with a shelf life under 30 months must show a best-before date, while products that last 30 months or more show a PAO symbol instead. On top of that, cosmetics are recalled by batch, which is exactly why every label carries a lot code.
A single “expiry date” custom field doesn’t cover any of that. This guide shows how to run expiry and lot tracking properly on a WooCommerce cosmetics or skincare store using the free Sellinor Product Expiration Dates for WooCommerce plugin, and what the Pro add-on adds for batch-level control.
Best-before dates vs. PAO — what the plugin manages
It’s worth being precise here, because the two dates do different jobs:
- The best-before date is a fixed calendar date — “best before 03/2027”. It applies to the unopened product. This is the date the plugin manages.
- PAO isn’t a calendar date at all. It’s a window that starts when the customer opens the jar (6 months, 12 months, and so on). Because it depends on when the buyer opens it, it lives on your packaging and product imagery, not in your store’s inventory system.
So the practical setup for a WooCommerce store is: assign the manufacturer’s best-before date to each product in the plugin and let it police your catalog automatically, while the PAO symbol stays on the artwork and listing photos where it belongs. The plugin gives you a customizable frontend date label — set it to “Best before” so the printed date your shoppers expect appears near the add-to-cart button.
Set a best-before date on every product and variation
Start with the free plugin. Add a best-before date to any simple product from the Expiration tab in the product editor. For variable products — a moisturiser sold in 30ml and 100ml sizes, or a lipstick in ten shades — set an independent date per variation, or a parent default that dateless variations inherit.
This matters for cosmetics because shades and sizes from the same launch often carry different dates. The plugin treats a variable product as fully expired only once every variation is past its date, so a single short-dated shade quietly becomes unavailable to select rather than pulling the whole product offline.
Stop selling expired cosmetics — automatically
This is the part you don’t want to do by hand. In the plugin’s settings you choose what happens when a product reaches its date (or a configurable number of days before it):
- Hide it from the catalog,
- mark it out of stock, or
- both.
“Hide from catalog” applies immediately on the next page load; the out-of-stock change runs on an hourly background check. Either way, cart and checkout protection is immediate — an expired item can’t be added to the cart, and if it expires while sitting in someone’s cart it’s removed at checkout with a notice. You set the rule once and the store enforces it.
Track batches and lot numbers for recalls (Pro)
Cosmetics recalls are the reason batch tracking exists. When a regulator or manufacturer pulls a specific lot, you need to know which orders received it — not email your entire customer list and hope.
Turn on batch tracking in the Pro add-on and, instead of one date per product, you record each delivery as a batch with its own lot number (batch reference), expiration date and quantity. Two things then happen automatically:
- FEFO deduction. When an order comes in, stock is deducted from the batch that expires soonest — First Expired, First Out — so your oldest sellable stock always ships first instead of aging out behind newer deliveries.
- Traceability. The exact batch that fulfilled each line item is recorded on the order and, with the Show batches in customer emails setting, on the customer’s confirmation email. If lot
L23-0915is recalled, you can see precisely which orders shipped it.
Refunds and cancellations return stock to the correct batch, and every batch action is written to the activity log, giving you a full per-product history. The whole walkthrough is in batch & lot tracking, and there’s more on the rotation method in FEFO for WooCommerce.
Sell short-dated stock instead of binning it (Pro)
Skincare carries margin, and writing off a tray of soon-to-expire serum hurts. Rather than bin it, the Pro add-on can discount it automatically on a schedule you set — for example 10% off at 14 days out, 25% at 7 days — and flag it with an “Expiring soon” badge on your shop and product pages. You recover revenue on stock that would otherwise expire on the shelf. See automatic discounts.
See what’s at risk before it expires
The free Overview page at Products → Expirations gives you a reporting dashboard: counts of products expiring soon and already expired, an expiration calendar showing how many products lapse on each day, and a value-at-risk figure that totals the stock value tied up in soon-to-expire inventory. It’s an honest picture of how much money is sitting in short-dated cosmetics. Full detail in reports & calendar.
With Pro you can also receive an email digest — daily, weekly or monthly — listing products approaching their date, so short-dated lots reach someone’s desk while there’s still time to discount or pull them.
How to set it up
- Install the free Sellinor Product Expiration Dates for WooCommerce plugin. Set your expiry action (hide / out of stock / both), how many days before the date it should fire, and a frontend label like “Best before”.
- Add best-before dates to your products — by hand, with quick/bulk edit, or via the CSV import/export to date a whole catalog at once.
- For recall-grade traceability and stock rotation, add the Pro add-on and switch on batch tracking for the products that need it, recording a lot number and date per delivery.
- Optionally turn on automatic expiry discounts and the email digest.
Keep the PAO symbol on your packaging and listing imagery, let the plugin manage every best-before date, and start free — add Pro when you need lot-level traceability and FEFO. The two work together as one system. For the full walkthrough of setting and displaying dates, see the expiration dates documentation.
Frequently asked questions
Can the plugin handle Period After Opening (PAO) dates as well as best-before dates?
The plugin tracks one printed date per product — the expiration or best-before date you assign — and shows it on the storefront with a label you choose, such as 'Best before' or 'Use by'. PAO (the 6M / 12M open-jar symbol) describes a window after opening, not a fixed calendar date, so it isn't a separate field. Most stores manage the manufacturer's best-before date with the plugin and print the PAO symbol on the product artwork and listing imagery.
Does it stop customers buying expired cosmetics?
Yes, in the free version. When a product reaches its expiration date — or a configurable number of days before it — the plugin can hide it from the catalog, mark it out of stock, or both. Expired items are also blocked from the cart and automatically removed at checkout, so a product past its date can't be purchased.
Can I track batch and lot numbers for cosmetics recalls?
Yes, with the Pro add-on. You record multiple batches per product, each with its own lot number (batch reference), expiration date and quantity. Stock is deducted using FEFO (First Expired, First Out), and the exact batch fulfilled is stored on each order and — with the 'Show batches in customer emails' setting — on the customer's confirmation email, so if a lot is recalled you can identify which orders shipped it.
How do I handle the same product arriving with different best-before dates?
The free plugin stores one date per product, which suits a single shelf life. When the same SKU arrives across deliveries with different dates, enable batch tracking in Pro: each delivery becomes a batch with its own date and quantity, and FEFO sells the soonest-expiring batch first so older stock clears before newer stock.
Can I set different dates for each shade or size of a product?
Yes. The free plugin lets you set an independent expiration date on each variation, or a parent default that dateless variations inherit. A variable product is only hidden or set out of stock once every variation has expired, so one expired shade never removes the whole listing.
Is there a free version?
Yes. Core expiry tracking is free: per-product and per-variation dates, automatic hide/out-of-stock actions, cart and checkout protection, a frontend date label, an Overview reports page with inventory value-at-risk, and CSV import/export. Batch and lot FEFO tracking, automatic expiry discounts and email digests are in the Pro add-on.
Put your cosmetics store's dates on autopilot
Set expiration and best-before dates on every product, stop selling expired stock automatically, and trace lots for recalls with Pro batch tracking.
See plans & download freeOr read the documentation.