Doctor Subs

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:

  1. A plain-English explanation of what happened (no jargon)
  2. A preview modal showing exactly which fields will change before you commit
  3. A one-click fix that WordPress handles for you
  4. A journal entry you can undo at any time
  5. 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

  1. Plugins > Add New > search “Doctor Subs”
  2. Install > Activate

Manual

  1. Download the plugin zip from WordPress.org or GitHub Releases
  2. Plugins > Add New > Upload Plugin
  3. Install > Activate

After activation

  1. WooCommerce > Doctor Subs
  2. Click Scan my subscriptions
  3. 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_renewal flag 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-stamps next_payment if 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_SIZE constant 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_Interface and register on the dr_subs_register_rules action. See the six built-in rules under includes/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.

Colaboradores

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_transitions log 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: value after-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_transitions table with sub_id, from_status, to_status, product_id, variation_id, transitioned_at. Pruned daily on a 30-day TTL.
  • Scanner now walks active, on-hold, and pending-cancel statuses (was active only). 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-danger token using the existing terracotta --broken for genuinely destructive actions.

Internal:

  • New DR_Subs_Rule_Catalog central source-of-truth for per-rule label, summary, detect, fix, bucket, and journal_summary copy.
  • New dev/ directory with seed-test-data.php and wipe-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