Launch pricing: Lock in Pro at $79/yr before prices go up View pricing →

Sell fresh and never let a stale bake reach checkout

Running a bakery online turns freshness into a logistics problem. A sourdough baked this morning is a different product by tomorrow afternoon; a tray of croissants is gone by lunch or it isn’t worth selling. Core WooCommerce knows nothing about any of this — it tracks one stock number per product and has no concept of the day a bake stops being sellable. So the job of dating each item, pulling yesterday’s stock, and clearing what’s left before it’s a write-off lands on you, by hand, every single morning.

This guide walks through managing best-before and expiry dates for a WooCommerce bakery or patisserie with the Sellinor Product Expiration Dates plugin — from a simple date on each bake up to batch-level rotation and automatic day-old markdowns.

Date every bake — and re-date fast

The free plugin adds an Expiration tab to the WooCommerce product editor. Open any product, pick a date, save. For a bakery that re-dates the same catalogue daily, you won’t do that one product at a time: use Quick Edit and Bulk Edit from the product list to set a shared date across this morning’s bakes, or import dates from a spreadsheet (more below). With very short shelf lives, this speed matters — a “best before tomorrow” on twenty lines should take seconds, not twenty edits.

Most bakeries don’t want the phrase “expiration date” facing customers. You control the storefront label, so you can show it as Best before, Enjoy by, or Use by to match how you talk about your bakes. A display threshold lets the date appear only when an item is within, say, a day or two of its date, and the [edfw_expiration_date] shortcode drops the date anywhere a custom theme needs it. Full options are in setting and displaying expiration dates.

Handle loaf sizes and finishes with variations

Bakery products come in variants — a loaf in small and large, a cake in three sizes, a plain or seeded option. Each variation gets its own date, and a shopper choosing a variation sees that date update on the page. To avoid dating every variation by hand, set a default date on the parent; variations without their own date inherit it, and the odd one that bakes on a different schedule gets its own.

The pulling logic is variation-aware too: a variable product is only hidden or set out of stock once every variation has expired. While one size is still in date, the listing stays live and only the lapsed variation becomes unselectable — so a sold-through small loaf never drags the whole product offline.

Pull stale stock automatically

This is where the plugin earns its keep in a bakery. Under Products → Expirations → Settings, choose what happens when a bake reaches its date:

  • Hide from catalog — it vanishes from shop, category, and search pages immediately.
  • Set to out of stock — it stays visible but can’t be bought.
  • Both — hidden and unpurchasable.

You can also fire the action a set number of days early, giving you a buffer so nothing sells on its final day. Whichever you pick, cart and checkout protection is immediate: a past-date item can’t be added to the cart, and if something lapses while it’s sitting in a basket it’s removed at checkout with a notice. No customer ever completes a purchase of a stale bake. The mechanics — including which action runs instantly versus on an hourly sweep — are in expiry actions.

See what’s going stale across the counter

The free Overview page (under Products → Expirations) is your morning check. It shows how many products have dates, how many are expiring soon, how many have already passed, and the value at risk — the stock value of everything inside your expiring-soon window — so you can see the money sitting in soon-to-go bakes. A month calendar marks how many products expire each day; click a day to list exactly those items.

There’s also an Expiring products dashboard widget so the soonest dates greet you when you log in, plus a sortable Expiration column on the product list with a filter for expiring or expired lines. The full tour is in reports and calendar.

Import your dates from a spreadsheet

If you plan a bake schedule in a spreadsheet, you don’t need to retype it. The free Import / Export page lets you download a template pre-filled with every product and its current date, edit the date column, and re-upload. Rows are matched by product ID or SKU, columns are detected automatically, and a blank date clears one. See import and export for the format. (Pro additionally adds an expiration column to WooCommerce’s own native importer/exporter.)

Rotate by batch with FEFO (Pro)

A working bakery rarely has one date per product — it has this morning’s bake and yesterday’s still on the shelf, the same SKU at two different freshness levels. The Pro add-on handles this with batch tracking: record multiple batches per product, each with a lot number, quantity, and date.

Orders then deduct using FEFO — First Expired, First Out. When a customer buys, the plugin pulls from the batch closest to its date first, moving to the next only when one runs out. The exact batch is written onto the order and the customer’s confirmation email, and refunds or cancellations return stock to the right batch. If an order needs more than your batches hold, it’s placed on hold rather than overselling stock you don’t physically have. The full mechanics are in batch and lot tracking, and the reasoning behind the method is covered in our FEFO for WooCommerce guide.

Mark down day-old goods before they’re a loss

Even with tight rotation, some bakes reach the end of the day with units left. Rather than bin them, the Pro add-on applies automatic tiered discounts by days until expiry — for example 10% off, then 25%, then 50% as the date approaches. The discount escalates on its own and flows through the sale price, the cart, and order totals. An optional “Expiring soon” badge highlights these on shop and product pages, turning day-old stock into a clearance offer instead of a write-off. Details and example tiers: automatic discounts.

To stay ahead of it, Pro also sends a scheduled email digest — daily, weekly, or monthly — listing products nearing their date with current stock and days remaining, so you can adjust the next bake without living in the dashboard. See email notifications.

Where to start

Begin free: date your fastest-moving bakes, set an expiry action with a day’s buffer, and watch the Overview page for a week. When one date per product stops being enough — when this morning’s and yesterday’s bakes need rotating and day-old stock needs discounting on its own — add Pro for batch tracking, FEFO, and short-date markdowns. Both run side by side on the same store. For more on the dating side, see our guide to best-before dates in WooCommerce.

Frequently asked questions

How do I add best-before dates to bakery products in WooCommerce?

Open a product in WooCommerce, go to the Product data panel and click the Expiration tab, then pick a date. Variations like different loaf sizes can each have their own date, and any variation without one inherits a default you set on the parent. For a daily catalogue you can set or change dates in bulk with Quick Edit, Bulk Edit, or a CSV import.

Can WooCommerce stop selling bread or cakes once they're past their best-before date?

Yes. The Sellinor plugin can automatically hide a product from your catalogue, set it to out of stock, or both — on the best-before date or a set number of days before it. Stale items are also blocked from the cart and removed at checkout, so no customer can complete a purchase of an out-of-date bake.

How do I mark down day-old bread and pastries automatically?

The Pro add-on applies tiered percentage discounts based on days until expiry — for example 10% off, then 25%, then 50% as the date gets closer. The discount updates on its own, flows through cart and order totals, and can show an optional 'Expiring soon' badge on shop and product pages.

Can I rotate bakery stock so the oldest bakes sell first?

Yes, with Pro batch tracking. Each product can hold multiple batches, each with its own lot number, quantity, and date. Orders deduct from the soonest-to-expire batch first (FEFO), the exact batch is recorded on the order and customer email, and refunds return stock to the correct batch.

What label do customers see — 'best before' or 'expiry'?

You choose the wording. The plugin stores one date field and lets you set the storefront label to whatever your bakes use, such as 'Best before', 'Use by', or 'Enjoy by'. You can also show the date only when an item is within a set number of days of its date.

Does dating work for a sourdough sold in different sizes or finishes?

Yes. Each variation carries its own date, and variations without one inherit the parent's default. A variable product is only hidden or set out of stock once every variation has expired, so as long as one size is still in date the listing stays live and only the lapsed variation becomes unavailable to select.

Put your bakery's best-before dates on autopilot

Date each bake, pull stale stock automatically, mark down day-old goods, and rotate batches by FEFO so your oldest bakes always sell first.

See plans & download free

Or read the documentation.