Promotions on online stores and stock age
Find the stock that stopped selling, check a markdown against its cost, and know which online store receives each promotion and why another does not.
What it is
Old stock ties up cash and shelf space. This guide joins three things the app already does: the Stock aging report shows how long each unit has been on the shelf, the promotion editor shows each chosen product's price after the discount beside its cost, and the Online stores card on a promotion says, store by store, whether the promotion is sent there and why not.
Stock that came in without a receiving document is aged too. Opening stock typed in or imported from a spreadsheet, a catalogue imported from an online store, a stock count, production and a merged duplicate product are each aged from their date in the stock ledger, so a business that imported its catalogue sees its old stock in Over 120 days instead of nowhere.
Example: a shop imported 40 jackets as opening stock in May. In November, Stock aging shows 40 units at about 190 days in Over 120 days, line "Opening stock". Inventory turnover shows none used in the period. Each jacket sells at EUR 80 and cost EUR 46. A 30 % promotion makes it EUR 56: still above cost. A 50 % promotion makes it EUR 40, and the editor says Below cost in red.
Who it is for
- Owners deciding what to mark down.
- Online sellers with a WooCommerce, Shopify or BigCommerce store.
- Retailers with several locations and old stock in one branch.
- Buyers who want to stop ordering what does not sell.
Before you start#
- To create promotions you need the right to add entries on Marketing › Promotions; to pause or resume, the right to edit; to archive, the right to delete.
- Costs in the promotion editor show only to people allowed to see costs. Others see the price after the discount without the cost.
- The Online stores card appears once the promotion is saved and a WooCommerce, Shopify or BigCommerce store is connected and active. See sell online.
- Inventory turnover shows cost, so it needs the same right as Inventory valuation.
Step by step#
- Open Reports, group Inventory, and choose Stock aging.
- Pick a location, or leave all locations, and read the cards: 0–30 days, 31–60 days, 61–90 days, 91–120 days, Over 120 days and Not traced.
- Sort the list by Days, oldest first, and note the products in Over 120 days.
- Open Reports › Inventory turnover for the same location and a recent period; a product with stock and nothing Used is dead stock, one that is old but still used is deep stock.
- Open Reports › Inventory valuation to see what that stock is worth at cost.
- Open Marketing › Promotions and choose New promotion.
- Set Kind to Percent off or Amount off, type the Discount, and set Items to Chosen products.
- Add each product with Add a product and read the line under it: price after the discount and cost, or Below cost in red.
- Choose a Code if online customers must type one, set Starts and Ends, set When saved to Live (from its start), and choose Save promotion.
- Read the Online stores card on the saved promotion to see what each store receives.
How stock age is counted#
Each unit on hand at a location is matched to the newest approved stock coming in first (first in, first out). Its age is today minus that line's date.
| Line says | Where the stock came from | Opens |
|---|---|---|
| A document number (a receipt, an adjustment, a sales return) | An approved purchase receipt, adjustment in or sales return | That document |
| Opening stock | Typed on the product, or imported from a spreadsheet or an online store's import | The product |
| Online store sync | An online store's own stock figure brought in | The product |
| Stock count | A stock count that added units | The product |
| Produced | A production receipt | The product |
| Merged in from a duplicate | A duplicate product merged into this one | The product |
| Not traced | Nothing explains it, such as stock moved in from another location | The product |
Drafts do not count; only approved lines age stock. The check line Aged stock = stock on hand confirms the bands add up to the stock above zero.
Note Stock moved in from another location is aged per location, so in the receiving branch it shows as Not traced. Look at the sending branch, or at the whole business, to see how old it really is.
Which store receives what#
The promotion always applies in this app: sales orders and point of sale. What reaches an online store depends on the store.
| Store | Sent | Not sent |
|---|---|---|
| WooCommerce | A promotion for Everything with a Code, kind Percent off, Amount off or Free shipping, open to anyone: sent as a coupon | Chosen products or categories; no code; limited to chosen customers; other kinds |
| Shopify | Tiered by quantity, once live, goes with the products' next update | Every other promotion |
| BigCommerce | Percent off, Amount off or Free shipping, open to anyone, chosen products too, with start and end dates | Limited to chosen customers; other kinds |
A WooCommerce coupon has no start date. So a live promotion that starts later is held and sent when it starts (the store job runs every 5 minutes, in your business's time zone). The Ends date becomes the coupon's expiry. Pause or Archive… expires the coupon on the store.
How to mark chosen products down on the online store#
A store-wide coupon cannot target chosen products on WooCommerce, and Shopify takes no promotions. Use the product's own discount instead.
- Open the product from Products.
- Choose Edit product and go to Pricing.
- Type the Discount as an amount or a percentage, for example
5or10%. - Save. WooCommerce receives it as the sale price; Shopify receives it as the price.
- To end the markdown, clear the Discount and save.
How to stop ordering the dead stock#
- Open Purchases › Purchase orders, view To receive.
- Search the product name.
- On the order choose More › Close order and give a reason if it is a short close.
Nothing is sent to an online store by the close; stock on hand and available stock do not change.
Daily use#
A WooCommerce and Shopify seller
Aging shows 120 phone cases in Over 120 days ("Opening stock" from the store import). You want 25 % off on both stores.
- A Percent off promotion for Chosen products shows the floor lines, but the Online stores card says WooCommerce and Shopify will not receive it.
- Option one: give each case a Discount of
25%with Edit product. Both stores show the lower price. - Option two: make a store-wide promotion with the code
CASES25for Everything. WooCommerce gets a coupon that works on the whole store, which is rarely what you want for one product line. - Keep the in-app promotion too if the cases also sell at the counter.
A multi-location retailer with old stock in one branch
Aging for the whole business shows BDT 2,40,000 of shoes over 120 days; filtered to each location, nearly all of it is in the Chittagong branch.
- Filter Inventory turnover to that branch: no shoes used in 90 days, while the main branch sells them.
- Move them with a transfer order to the branch that sells them (see multi-location transfers), or mark them down.
- After a transfer the receiving branch shows them as Not traced; that is expected.
- A promotion's floor lines use the product's cost for the business, so check it before you choose the discount.
What you see#
Example: Stock aging, one location.
| Received | Document | Item | In stock | Days | Age |
|---|---|---|---|---|---|
| 2026-05-02 | Opening stock | Wool jacket | 40 | 194 | Over 120 days |
| 2026-09-20 | GRN-118 | Rain boots | 12 | 53 | 31–60 days |
| — | Scarf | 6 | Not traced |
Promotion editor lines, for chosen products:
- "Wool jacket: EUR 56.00 after the discount · cost EUR 46.00"
- "Below cost: Wool jacket sells at EUR 40.00 after the discount; it cost EUR 46.00."
The Online stores card says one line per connected store, for example "WooCommerce: sent to the store.", "WooCommerce: sent when the promotion starts.", "WooCommerce: sent when you make it live." or "Not sent to Shopify: promotions are not sent to this store. To mark a product down online, give the product a discount on its edit page." Below it, each store's last result and any error.
Good practice#
- Run Stock aging monthly; choose Schedule on the report to have it e-mailed.
- Decide on dead stock with aging and turnover together: old alone is not dead.
- Never go below cost by accident: the editor warns, but nothing blocks it. Selling below cost to free cash is your call.
- Use a code for online coupons, and an end date, so a coupon never runs for ever.
- Close purchase orders for products you are clearing.
Troubleshooting#
| What you see | Why | What to do |
|---|---|---|
| Lots of Not traced | Stock moved in from another location, or no dated line explains it | Look at the sending location or the whole business |
| No floor lines in the editor | Floor lines show only for Chosen products with Percent off or Amount off and a discount above 0 | Set Items to Chosen products and type the discount |
| Price shows but no cost | You are not allowed to see costs | Ask the owner, or let them check the floor |
| "Not sent to WooCommerce: a store coupon needs a code. Without one, this promotion applies in this app only (sales orders and point of sale)." | WooCommerce coupons need a code | Add a Code, or use the product's Discount |
| "Not sent to WooCommerce: a coupon from here would apply to the whole store. To mark chosen products down online, give each product a discount on its edit page." | The promotion is for chosen products | Use the product's Discount |
| "Not sent to …: it is limited to chosen customers, which the store can’t check." | Who can use it has rules | Remove the rules for an online version |
| "Not sent to …: this kind of promotion has no equivalent there." | Buy X get Y or tiers have no store equivalent | Use Percent off, Amount off or Free shipping |
| "A percentage can’t be more than 100%." | Discount above 100 | Type a lower percentage |
| The coupon worked before its start | Should not happen now: a later start is held | Check Starts; pause and resume if a store shows an old coupon |
Limits and what is not there yet#
- The floor is a warning, not a block; there is no minimum price setting for promotions.
- A promotion for chosen products is not sent to WooCommerce, and no promotion except quantity tiers goes to Shopify; use the product's Discount. A product markdown with its own start and end dates on the store is not there yet.
- A WooCommerce coupon whose start was missed by the store job is not retried.
- Stock moved between locations is not traced back to its first date.
- Of the stores, WooCommerce is proven live; see sell online for the others.
Questions#
Why did my imported stock never show as old before?
Stock with no receiving document used to be counted as not traced. It is now aged from its date in the stock ledger, so imported opening stock reaches Over 120 days like anything else.
Will my promotion change prices on Shopify?
No. Only quantity tiers go to Shopify. Give the product a Discount on its edit page to change the price there.
Can the app stop staff giving discounts below cost?
The promotion editor says Below cost in red but does not block it. Limit who may create promotions with rights.
What happens to the WooCommerce coupon when I pause the promotion?
Pausing or archiving expires the coupon on the store. Resuming sends it again.
Is a promotion that starts next week already live on WooCommerce?
No. It is held and sent when it starts, because WooCommerce coupons have no start date.
