Skip to main content
Card class: Non-HeroCategory: Ecommerce Platform
Draft Products >30d Old for the selected period.

At a glance

The count of products sitting in draft status whose last modification is more than 30 days ago. These are listings someone started, photographed, or half-described and never finished. Each one is revenue that exists in your catalogue but is invisible to customers, the quiet backlog of unpublished work.
What it countsCOUNT(products WHERE post_status = 'draft' AND modified_date < now - 30 days). A product is included when its WordPress post status is draft and it has not been touched for over a month.
REST API endpointGET /wp-json/wc/v3/products?status=draft. Each product exposes status (draft, pending, private, publish), date_modified, and date_created. The card filters status = draft then ages by date_modified.
Status treatmentWooCommerce products use WordPress post statuses. draft is unfinished and unpublished. Distinct from pending (submitted for review), private (published but hidden), and publish (live). This card targets draft specifically.
Aging logicThe 30-day clock runs off date_modified, not date_created. A draft created six months ago but edited last week is not counted; a draft created and abandoned 31 days ago is. This catches genuinely stalled work, not active drafts.
VariationsCounts the parent draft product, not its individual variations. A draft variable product with twenty variations counts as one.
Self-hosted vs managed-WooIdentical on self-hosted LAMP, WordPress.com, and managed-Woo (Woo.com Cloud, WP Engine, Pressable, Kinsta). Import and product-feed plugins can create drafts in bulk, see FAQs. Self-hosted hosts add sync-lag risk during outages.
Time windowRT (real-time snapshot of the current catalogue state)
Alert trigger>10, driven by sentiment_key: wc_draft_products_aging
Rolesowner, operations

Calculation

Calculated automatically from your WooCommerce data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.

Worked example

A UK lighting brand on self-hosted WooCommerce 8.6 with a product-import plugin (WP All Import) feeding a supplier catalogue. The catalogue was reviewed on 20 Jun 26 (the real-time snapshot date).
ProductStatusLast modifiedAgeCounts in this card?
”Brass Floor Lamp”draft02 Mar 26110 daysYes
”Linen Pendant Shade”draft18 Apr 2663 daysYes
”Walnut Desk Lamp”draft14 Jun 266 daysNo (recently edited)
“Copper Wall Sconce”pending01 May 2650 daysNo (pending, not draft)
“Smoked Glass Globe”publish10 Jun 2610 daysNo (live)
…plus 11 more stalled draftsdraftvarious, >30d>30 daysYes
The card reads 13 draft products older than 30 days, above the >10 threshold, so Vortex IQ Nerve Centre raises an alert. Four things to notice:
  1. A bulk import created most of them. WP All Import brought in 13 supplier products as drafts in early March so the team could review pricing before publishing. The review never happened. This is the most common cause of an aging-draft pile: a bulk import that stalled at the review step.
  2. “Walnut Desk Lamp” is correctly excluded. It is a draft, but it was edited six days ago, so the 30-day aging filter (on date_modified) leaves it out. The card targets abandoned work, not work in progress. This is why aging runs off date_modified rather than date_created.
  3. “Copper Wall Sconce” is pending, not draft. Pending means submitted for editorial review, a different workflow state. It does not count here. If your team uses the pending workflow, those items need a separate eye; this card is draft-specific.
  4. Each draft is dormant revenue. Thirteen finished-but-unpublished products is thirteen listings customers cannot buy. The fix is operational: triage the list in WP Admin, publish the ready ones, and delete the abandoned ones. Pair with Products Missing Image and Products Missing SKU, drafts often stall precisely because they are missing those fields.

Sibling cards merchants should reference together

CardWhy pair it with Draft Products >30d Old
WC Products Missing ImageDrafts often stall because the imagery is not ready. The overlap tells you why work stopped.
WC Products Missing SKUA missing SKU is another common reason a product never gets published.
WC Total ProductsThe catalogue denominator. Thirteen stalled drafts in a 50-product catalogue is a different story from thirteen in a 5,000-product one.
WC Variable Product Attribute CompletenessIncomplete attributes block publishing of variable products, a frequent reason variable drafts stall.
WC On-Backorder ProductsThe other side of catalogue health: drafts are invisible, backorders are visible but unfulfillable. Read together for a full catalogue-state picture.
WC Out-of-Stock ProductsAnother catalogue-health signal. Published but unbuyable versus drafted but unpublished.

Reconciling against WooCommerce

Where to look in WooCommerce Admin: WP Admin > Products > All Products filtered to the Draft status link above the product table. WordPress shows a “Draft (N)” count there. To match this card’s aging, sort the list by Date (the modified column) and count only those last edited more than 30 days ago, WP Admin’s status filter shows all drafts regardless of age, so its number will be equal to or higher than this card. Other WP Admin views that look related but are not:
  • Products list “All (N)” count: includes every status. Far higher than the draft-only number.
  • WooCommerce > Status > Logs: import logs show how many drafts a feed created, but not their current age.
  • The Bin (trash): trashed products are not drafts. Deleting a draft moves it out of this count entirely.
Why our number may legitimately differ from WP Admin:
ReasonDirection of divergence
Aging filter. WP Admin’s “Draft (N)” counts all drafts; this card counts only those older than 30 days by date_modified.WP Admin equal or higher
Time-zone. date_modified is stored in WP-site timezone (Settings > General > Timezone); Vortex IQ ages on UTC. A draft modified right around the 30-day boundary can fall on either side.+/- borderline drafts at the 30-day edge
Auto-draft noise. WordPress creates auto-draft placeholder posts when an editor opens “Add Product” and walks away. The REST API status=draft filter excludes auto-draft, so this card ignores them; a raw database count might include them.Ours lower than a naive DB query
Self-hosted server uptime. An outage during the indexer poll delays catalogue changes by up to 24 hours. Managed hosts are steadier.Ours temporarily stale; self-resolves at next sync
Import-plugin behaviour. Some feed plugins re-touch drafts on every run (updating date_modified), which resets the aging clock and hides genuinely stalled items.Ours lower than the real stall count
The cleanest reconciliation is the Products list filtered to Draft and sorted by modified date, then count the rows older than 30 days by hand. WP Admin has no native “aging draft” report, which is why this card exists.

Known limitations / merchant FAQs

Why does it use date_modified instead of date_created? Because a product created long ago but edited recently is active work, not a stalled draft. Aging on date_modified catches the genuinely abandoned items and ignores ones the team is still touching. The trade-off: an import plugin that re-saves every draft on each run will reset the clock and hide real stalls, see the import question below. Does this include pending or private products? No. It targets draft only. pending means submitted for editorial review (a different workflow), and private means published but hidden from the public catalogue. Each is a separate state with its own implications. If your team relies on the pending-review workflow, those items are not surfaced here. My import plugin created hundreds of drafts, is that a problem? It depends. Many feed plugins (WP All Import, product CSV importers) deliberately land new products as drafts so a human can review pricing and imagery before publishing. That is fine if the review happens. It becomes a problem when the review never happens and the drafts age out, which is exactly what this card detects. If your importer re-touches drafts on every run, the aging clock resets and the card under-reports, check the importer’s “skip unchanged” setting. What about auto-drafts? WordPress creates an auto-draft placeholder whenever someone opens “Add Product” and abandons it. These are noise, not real catalogue work. The REST API status=draft filter excludes auto-draft, so this card ignores them. A raw database count would include them and read higher. Does a draft variable product count its variations? No. The card counts the parent draft product as one, regardless of how many variations it has. A draft variable product with twenty colour variations is a single entry here. For the completeness of variations themselves, see Variable Product Attribute Completeness. Is this real-time or refreshed on a schedule? It is a real-time snapshot of catalogue state, refreshed on the standard data refresh (typically every 30 to 60 minutes for live integrations). On self-hosted stores a host outage can delay the refresh; force a manual refresh if you have just published a batch and want the count to update immediately.

Tracked live in Vortex IQ Nerve Centre

Draft Products >30d Old is one of hundreds of KPI pulses Vortex IQ tracks across WooCommerce and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.