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 counts | COUNT(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 endpoint | GET /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 treatment | WooCommerce 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 logic | The 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. |
| Variations | Counts the parent draft product, not its individual variations. A draft variable product with twenty variations counts as one. |
| Self-hosted vs managed-Woo | Identical 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 window | RT (real-time snapshot of the current catalogue state) |
| Alert trigger | >10, driven by sentiment_key: wc_draft_products_aging |
| Roles | owner, 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).| Product | Status | Last modified | Age | Counts in this card? |
|---|---|---|---|---|
| ”Brass Floor Lamp” | draft | 02 Mar 26 | 110 days | Yes |
| ”Linen Pendant Shade” | draft | 18 Apr 26 | 63 days | Yes |
| ”Walnut Desk Lamp” | draft | 14 Jun 26 | 6 days | No (recently edited) |
| “Copper Wall Sconce” | pending | 01 May 26 | 50 days | No (pending, not draft) |
| “Smoked Glass Globe” | publish | 10 Jun 26 | 10 days | No (live) |
| …plus 11 more stalled drafts | draft | various, >30d | >30 days | Yes |
>10 threshold, so Vortex IQ Nerve Centre raises an alert. Four things to notice:
- 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.
- “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 offdate_modifiedrather thandate_created. - “Copper Wall Sconce” is
pending, notdraft. 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. - 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
| Card | Why pair it with Draft Products >30d Old |
|---|---|
| WC Products Missing Image | Drafts often stall because the imagery is not ready. The overlap tells you why work stopped. |
| WC Products Missing SKU | A missing SKU is another common reason a product never gets published. |
| WC Total Products | The 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 Completeness | Incomplete attributes block publishing of variable products, a frequent reason variable drafts stall. |
| WC On-Backorder Products | The 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 Products | Another 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.
| Reason | Direction 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 |
Known limitations / merchant FAQs
Why does it usedate_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.