Descrição
Doctor Subs is a focused diagnostic tool for WooCommerce Subscriptions. It runs a daily background scan across every active and on-hold subscription on your store, classifies each one as healthy / at risk / broken, and gives you a one-click preview + fix + undo for the six most common renewal failure patterns – including the silent manual-renewal-flag bugs that quietly stop auto-renewals.
Built for solo, non-technical store owners with 20 to 500 active subscriptions. No log-reading, no WP-CLI, no support tickets.
What it detects
- Manual-renewal drift – active subs silently flipped to “manual renewal” despite a working Stripe card on file. Maps directly to the four subscriptions-core bugs disclosed in April 2026 (stale dates cache, HPOS to postmeta sync gap, wcs_create_subscription state discard, same-gateway switch). Customers churn invisibly.
- Ghost subscriptions – active subs whose next payment was supposed to fire but WordPress never scheduled the renewal event. Silent revenue loss.
- Mass on-hold cascade – 20 or more subs sharing the same product transitioning to on-hold within an hour. Symptom of a product-edit cascade or faulty bulk operation that takes out a whole product line at once.
- Stuck on-hold – subs whose latest Stripe renewal actually captured successfully but the status never flipped back to active. Customer paid, your store shows them as delinquent.
- Repeated payment failures – 2 or more failed scheduled payment attempts in the last 30 days. Often a gateway blip that a single retry fixes.
- Total drift – stored subscription total no longer matches the line items. Flagged for manual review (drift causes are too varied to safely auto-correct).
What it does about them
Every detected problem gets:
- A plain-English explanation of what happened (no jargon)
- A preview modal showing exactly which fields will change before you commit
- A one-click fix that WordPress handles for you
- A journal entry you can undo at any time
- An explicit warning if reverting cannot undo something that already ran (e.g. a re-scheduled payment already charged the customer)
All fixes are state-guarded: if the subscription changed between detection and when you click Fix, the plugin aborts and asks you to re-scan. You never get surprised.
Dashboard + alerts
- Calm-clinical dashboard – “X of Y healthy” stat plus two action counters (At risk / Broken). Click any counter, search by sub number, customer name, or email, and filter by rule chip.
- Bulk fix – “Fix all N matches” across one rule or every visible row. Each fix lands as its own reversible journal entry.
- Daily background scan – Action Scheduler runs the scan automatically. A WP-Cron watchdog catches the rare case when AS stops firing.
- Email digest – when something new breaks between scans, you get a plain-text summary email.
- Fix history – every applied fix, with Revert on each. Configurable retention (30 to 365 days, or forever).
- Per-rule on/off – any of the six rules can be disabled in Settings if it’s noisy in your store.
Modern design system
Self-hosted typography (Switzer, Source Serif 4, JetBrains Mono), OKLCH colour tokens, full responsive + print stylesheets, WCAG 2.1 AA contrast, prefers-reduced-motion respected. Scoped to Doctor Subs – never leaks into the rest of WP admin.
Translations
Ships in 20 major languages: French, Spanish, German, Italian, Portuguese (BR + PT), Dutch, Polish, Russian, Japanese, Chinese (Simplified + Traditional), Korean, Arabic, Turkish, Swedish, Norwegian, Danish, Finnish, Czech.
Privacy
- Zero external asset fetches at runtime. Fonts, CSS, JS all bundled.
- No data leaves your site unless you explicitly opt in to anonymous fix telemetry (off by default; rule name + timestamp only, no customer data).
Capturas de tela

Calm dashboard with the X-of-Y healthy stat, two action counters, search, rule chips, and the Needs attention table 
Fix preview modal with the plain-English narrative, named diff, and “you can undo this” reassurance 
Fix history with per-entry Revert buttons and an escalated confirm when the renewal payment has already executed 
Settings page with per-rule on/off toggles plus full plain-English descriptions of what each rule detects and fixes 
Bulk-fix confirm modal: lists per-rule counts, warns about scheduled renewal payments, primary button reflects the exact count
Instalação
Automatic
- Plugins > Add New > search “Doctor Subs”
- Install > Activate
Manual
- Download the plugin zip from WordPress.org or GitHub Releases
- Plugins > Add New > Upload Plugin
- Install > Activate
After activation
- WooCommerce > Doctor Subs
- Click Scan my subscriptions
- Review the X-of-Y healthy stat and the two action counters, click into the broken bucket, preview a fix, commit
Perguntas frequentes
-
Does Doctor Subs fix issues automatically?
-
No. The plugin never mutates your data without an explicit Fix click. Every change shows a preview first and lands in the Fix history with a Revert button. The scanner only detects; the merchant decides.
-
What happens if I revert a fix after the payment already ran?
-
The revert confirm explicitly tells you: the re-scheduled payment has already charged the customer, reverting will undo the status change but will NOT refund. If a refund is needed, handle it in the related WooCommerce order.
-
Does it really detect the silent “manual renewal” bug?
-
Yes. The Manual-renewal drift rule looks for active subs whose
_requires_manual_renewalflag is set despite a working Stripe customer/source meta on file. It clears the flag in both the orders table and postmeta (belt-and-braces against the HPOS sync gap), re-stampsnext_paymentif past-due, and schedules a fresh renewal so WCS bills automatically again. -
Is this a replacement for dunning management?
-
No. Doctor Subs fixes structural issues (missing AS events, stuck-on-hold statuses, manual-renewal flag drift, line-item total drift). It does not handle card declines, SCA prompts, or retry strategy. For those, use your gateway’s built-in dunning or a dedicated plugin.
-
Which gateways does it support?
-
v2.1: Stripe fully supported across all rules that need a gateway signal (stuck on-hold, manual-renewal drift). The remaining rules are gateway-agnostic. PayPal, Authorize.net, Square, and WooPayments variants land in a future release.
-
Will it work on stores with 10,000+ subscriptions?
-
Yes. The scanner uses a shared pre-built index so every rule is O(1) per sub (no N+1 queries). The
DR_SUBS_SCAN_BATCH_SIZEconstant lets you tune the batch size in wp-config.php for very large stores. -
Can I extend it with my own rules?
-
Yes. Implement
DR_Subs_Rule_Interfaceand register on thedr_subs_register_rulesaction. See the six built-in rules underincludes/rules/for examples. -
Is HPOS supported?
-
Required. Doctor Subs declares High-Performance Order Storage compatibility and requires WooCommerce 9.0 or higher.
Avaliações
Não há avaliações para este plugin.
Colaboradores e desenvolvedores
“Doctor Subs” é um programa de código aberto. As seguintes pessoas contribuíram para este plugin.
ColaboradoresTraduzir o “Doctor Subs” para seu idioma.
Interessado no desenvolvimento?
Navegue pelo código, consulte o repositório SVN ou assine o registro de desenvolvimento por RSS.
Registro de alterações
2.1.0
Major detection + UX expansion. Six rules now ship; design language tightened.
New rules (3):
- Manual-renewal drift (Stripe-only): detects active subs silently flipped to manual renewal despite a Stripe customer/source on file. Direct response to the four April 2026 subscriptions-core bug disclosures. Fix clears the flag in HPOS + postmeta, re-stamps next_payment if past-due, and schedules a fresh renewal.
- Mass on-hold cascade: detects 20 or more on-hold transitions for the same product within a 1-hour window. Backed by a new
dr_subs_status_transitionslog written by an observer on every subscription status change. Fix reactivates each cascade member; bulk-fix recovers the whole cascade in one click. - Total drift (flag-only): detects subs whose stored total no longer matches the sum of line items + tax + shipping + fees by more than $0.50, ignoring subs modified in the last 7 days. Surfaces the discrepancy and links to the sub for manual review.
Dashboard:
- Healthy counter relocated as an “X of Y healthy” stat above the action counters; can no longer be mistaken for a clickable filter.
- Search bar matches sub number, customer name, and billing email. Debounced, ESC clears.
- Rule chip filters above the table; bucket counter and rule chip are now mutually exclusive (clicking one clears the other).
- Reason column strips inline HTML so emphasis tags never render literally.
- Issue column header moved to screen-reader-only; the rule pill carries the label.
Bulk + revert:
- Bulk-fix button beside the active rule chip OR in “All rules” mode: groups visible rows by rule, posts one batch per rule, surfaces a styled confirm modal listing the per-rule counts and a renewal-payment warning. Total Drift opts out (manual-only).
- Revert confirm now opens a styled in-plugin modal instead of
window.confirm(). When the journal entry’s AS action has already executed, the modal escalates to a danger-styled button and the explicit “this will NOT refund” warning.
Settings:
- New “Detection rules” section listing all six rules with toggle, plain-English Detects/Fix descriptions, and bucket tag. Disabled rules skip detection on every scan.
- Plain-English summaries on dashboard rule chips and table pills via
DR_Subs_Rule_Catalog.
Fix history:
- Plain-English summary per row (“Rescheduled the missed renewal payment”, “Reactivated as part of a mass-hold cascade recovery”, etc.) instead of the raw
key: valueafter-state dump. - All canonical rule ids now render correct labels (legacy short ids fall back).
Schema + scanner:
- Schema bumped to 2.1.0; new
dr_subs_status_transitionstable withsub_id,from_status,to_status,product_id,variation_id,transitioned_at. Pruned daily on a 30-day TTL. - Scanner now walks
active,on-hold, andpending-cancelstatuses (wasactiveonly). Mass-hold + Stuck-on-hold rules now reach their target subs. - Manual_renewal_drift registered before Ghost_sub so it claims primary-rule on the same broken state with the right fix. Ghost_sub now skips manual-renewal subs entirely.
Design + accessibility:
- Display typeface swapped from Instrument Serif to Source Serif 4 (less editorial-romantic, calmer italic).
- Counter numerals dropped from 62px display serif to 32px Switzer 500: a 28-broken count no longer reads like a panic-amplifier.
- Dashboard hint copy de-imperative-d (“needs you now” -> “since last scan”).
- All em dashes / en dashes / minus signs replaced with plain hyphens across PHP, JS, CSS, and views.
- Modal focus on open lands on the dialog itself (tabindex=-1) so the sub-id link no longer reads as “selected”.
- New
.btn-dangertoken using the existing terracotta--brokenfor genuinely destructive actions.
Internal:
- New
DR_Subs_Rule_Catalogcentral source-of-truth for per-rule label, summary, detect, fix, bucket, and journal_summary copy. - New
dev/directory withseed-test-data.phpandwipe-test-data.php(excluded from the production zip via build script + CI workflow).
2.0.0-alpha.1
Major rewrite. Single breaking change moment: every PHP class renamed from WCST_* to DR_Subs_*; legacy class_alias shims ship for the three most-likely-extended public classes.
- Traffic-light dashboard with per-bucket drill-down
- Three deterministic detection rules: Ghost Sub, On-Hold with Paid Renewal (Stripe), Repeated Payment Failures
- Daily background scanner via Action Scheduler + WP-Cron watchdog
- One-click fixes with state-guarded apply and reversible Fix journal
- Fix preview modal with named diff and executed-payment warning
- Email digest alerts (off by default; configurable recipient)
- Settings page with retention controls and anonymous telemetry opt-in
- 20 language translations via Potomatic
- Self-hosted typography, no external asset fetches
- HPOS baseline (WC 9.0+)
1.2.4
- Fixed all security issues (sanitization, validation, escaping)
- Fixed Action Scheduler compatibility (scheduled_date_gmt column)
- Improved error handling and debugging
- Enhanced analyzer stability
- Added PHPCS configuration
1.2.3
- Initial release
