Cash Flow Inventory
Menu
Documentation

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.

Where in the app
MarketingPromotions
Last reviewed
Reading time
10 min

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#

  1. Open Reports, group Inventory, and choose Stock aging.
  2. 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.
  3. Sort the list by Days, oldest first, and note the products in Over 120 days.
  4. 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.
  5. Open Reports › Inventory valuation to see what that stock is worth at cost.
  6. Open Marketing › Promotions and choose New promotion.
  7. Set Kind to Percent off or Amount off, type the Discount, and set Items to Chosen products.
  8. Add each product with Add a product and read the line under it: price after the discount and cost, or Below cost in red.
  9. 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.
  10. 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 saysWhere the stock came fromOpens
A document number (a receipt, an adjustment, a sales return)An approved purchase receipt, adjustment in or sales returnThat document
Opening stockTyped on the product, or imported from a spreadsheet or an online store's importThe product
Online store syncAn online store's own stock figure brought inThe product
Stock countA stock count that added unitsThe product
ProducedA production receiptThe product
Merged in from a duplicateA duplicate product merged into this oneThe product
Not tracedNothing explains it, such as stock moved in from another locationThe 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.

StoreSentNot sent
WooCommerceA promotion for Everything with a Code, kind Percent off, Amount off or Free shipping, open to anyone: sent as a couponChosen products or categories; no code; limited to chosen customers; other kinds
ShopifyTiered by quantity, once live, goes with the products' next updateEvery other promotion
BigCommercePercent off, Amount off or Free shipping, open to anyone, chosen products too, with start and end datesLimited 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.

  1. Open the product from Products.
  2. Choose Edit product and go to Pricing.
  3. Type the Discount as an amount or a percentage, for example 5 or 10%.
  4. Save. WooCommerce receives it as the sale price; Shopify receives it as the price.
  5. To end the markdown, clear the Discount and save.

How to stop ordering the dead stock#

  1. Open Purchases › Purchase orders, view To receive.
  2. Search the product name.
  3. 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 CASES25 for 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.

  1. Filter Inventory turnover to that branch: no shoes used in 90 days, while the main branch sells them.
  2. Move them with a transfer order to the branch that sells them (see multi-location transfers), or mark them down.
  3. After a transfer the receiving branch shows them as Not traced; that is expected.
  4. 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.

ReceivedDocumentItemIn stockDaysAge
2026-05-02Opening stockWool jacket40194Over 120 days
2026-09-20GRN-118Rain boots125331–60 days
—Scarf6Not 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 seeWhyWhat to do
Lots of Not tracedStock moved in from another location, or no dated line explains itLook at the sending location or the whole business
No floor lines in the editorFloor lines show only for Chosen products with Percent off or Amount off and a discount above 0Set Items to Chosen products and type the discount
Price shows but no costYou are not allowed to see costsAsk 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 codeAdd 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 productsUse the product's Discount
"Not sent to …: it is limited to chosen customers, which the store can’t check."Who can use it has rulesRemove 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 equivalentUse Percent off, Amount off or Free shipping
"A percentage can’t be more than 100%."Discount above 100Type a lower percentage
The coupon worked before its startShould not happen now: a later start is heldCheck 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.

All guides

Type at least 2 letters.↑ ↓ to moveEnter to openEsc to close