{"id":308450,"date":"2026-05-28T15:53:51","date_gmt":"2026-05-28T15:53:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/subscription-interval-repair-for-woocommerce\/"},"modified":"2026-06-02T13:05:00","modified_gmt":"2026-06-02T13:05:00","slug":"avcl-subscription-interval-repair-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/avcl-subscription-interval-repair-for-woocommerce\/","author":17944539,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.0.2","requires":"6.3","requires_php":"8.0","requires_plugins":null,"header_name":"AVCL Subscription Interval Repair for WooCommerce","header_author":"Ankit Vishwakarma","header_description":"Scans WooCommerce Subscriptions for broken billing intervals and repairs them \u2014 one at a time or all at once \u2014 with a safe dry-run preview and full audit log.","assets_banners_color":"1b4870","last_updated":"2026-06-02 13:05:00","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/avcl-subscription-interval-repair-for-woocommerce\/","header_author_uri":"https:\/\/profiles.wordpress.org\/ankitv\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":155,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.0":{"tag":"1.2.0","author":"ankitv","date":"2026-05-28 15:53:17"},"1.2.1":{"tag":"1.2.1","author":"ankitv","date":"2026-06-02 13:05:00"}},"upgrade_notice":{"1.2.0":"<p>Adds an informational Free vs Pro page and automatic side-by-side compatibility with the optional paid edition. No existing features changed; everything remains free and unlocked.<\/p>","1.1.0":"<p>Major update: plugin renamed and reslugged (you will need to reactivate after upgrade). Adds bulk repair, audit log CSV export, and clear-log. The custom audit table has been renamed; previous log entries are not migrated.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3552452,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3552452,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3552452,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3552452,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.0","1.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3552452,"resolution":"1","location":"assets","locale":"","width":4480,"height":2340},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3552452,"resolution":"2","location":"assets","locale":"","width":4480,"height":2340},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3552452,"resolution":"3","location":"assets","locale":"","width":4480,"height":2340},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3552452,"resolution":"4","location":"assets","locale":"","width":4480,"height":2574},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3552452,"resolution":"5","location":"assets","locale":"","width":4480,"height":2888}},"screenshots":{"1":"Dashboard \u2014 broken-subscription count and recent audit activity.","2":"Repair Tool \u2014 scan results with \"Fix All Broken\" and \"Dry Run All\" controls.","3":"Dry Run results \u2014 full preview of every change before committing.","4":"Audit Log \u2014 before\/after record for every repair, with CSV export.","5":"Free vs Pro \u2014 informational comparison page."}},"plugin_section":[],"plugin_tags":[264821,12173,264822,4079,286],"plugin_category":[41,45],"plugin_contributors":[184730],"plugin_business_model":[],"class_list":["post-308450","plugin","type-plugin","status-publish","hentry","plugin_tags-billing-interval","plugin_tags-repair","plugin_tags-subscription-fix","plugin_tags-subscriptions","plugin_tags-woocommerce","plugin_category-communication","plugin_category-ecommerce","plugin_contributors-ankitv","plugin_committers-ankitv"],"banners":{"banner":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/banner-772x250.png?rev=3552452","banner_2x":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/banner-1544x500.png?rev=3552452","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/icon-128x128.png?rev=3552452","icon_2x":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/icon-256x256.png?rev=3552452","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/screenshot-1.png?rev=3552452","caption":"Dashboard \u2014 broken-subscription count and recent audit activity."},{"src":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/screenshot-2.png?rev=3552452","caption":"Repair Tool \u2014 scan results with \"Fix All Broken\" and \"Dry Run All\" controls."},{"src":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/screenshot-3.png?rev=3552452","caption":"Dry Run results \u2014 full preview of every change before committing."},{"src":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/screenshot-4.png?rev=3552452","caption":"Audit Log \u2014 before\/after record for every repair, with CSV export."},{"src":"https:\/\/ps.w.org\/avcl-subscription-interval-repair-for-woocommerce\/assets\/screenshot-5.png?rev=3552452","caption":"Free vs Pro \u2014 informational comparison page."}],"raw_content":"<!--section=description-->\n<p><strong>AVCL Subscription Interval Repair for WooCommerce<\/strong> solves one of the most frustrating problems WooCommerce Subscriptions store owners face: broken billing intervals on active subscriptions.<\/p>\n\n<p><strong>The problem<\/strong><\/p>\n\n<p>Third-party plugins \u2014 notably the official \"Bulk Update Subscription Prices\" add-on \u2014 can silently reset a subscription's billing interval to <code>1\u00d7month<\/code>, even when it should be <code>3\u00d7month<\/code>, <code>6\u00d7month<\/code>, or <code>12\u00d7month<\/code>. This causes incorrect renewal dates and lost revenue without any visible error.<\/p>\n\n<p><strong>What this plugin does<\/strong><\/p>\n\n<p>It scans your entire subscriptions table, detects mismatches by comparing the subscription's stored interval against the linked product meta and original order line-item meta, and lets you fix them safely \u2014 without creating spurious renewal orders or triggering AutomateWoo workflows.<\/p>\n\n<h4>Features (all free, all unlocked)<\/h4>\n\n<ul>\n<li><strong>Scan<\/strong> \u2014 Find all subscriptions with broken billing intervals in one click.<\/li>\n<li><strong>Dry-run preview<\/strong> \u2014 See exactly what would change before touching the database. Per-subscription or for the entire scan.<\/li>\n<li><strong>Fix one<\/strong> \u2014 Review and repair a single subscription individually.<\/li>\n<li><strong>Fix all broken<\/strong> \u2014 Repair every detected broken subscription sequentially. Each repair is atomic and individually audit-logged. No quotas, no limits.<\/li>\n<li><strong>Next payment recalculation<\/strong> \u2014 Anchor is taken from the first real paid order, not a spurious 0.00 renewal.<\/li>\n<li><strong>Audit log<\/strong> \u2014 Every action writes a before\/after record to a dedicated table. Export the whole log as CSV or clear it from the admin UI.<\/li>\n<li><strong>AutomateWoo safe<\/strong> \u2014 Status-change hooks are suspended during metadata-only saves.<\/li>\n<li><strong>HPOS compatible<\/strong> \u2014 Uses <code>wc_get_orders()<\/code> and <code>WC_Subscription::save()<\/code> throughout; no direct post-meta writes.<\/li>\n<li><strong>Prepay-safe<\/strong> \u2014 Subscriptions that intentionally use a <code>1\u00d7month<\/code> interval to fire <code>0.00<\/code> fulfilment renewals (e.g. 6-month prepay boxes) are detected and skipped automatically.<\/li>\n<\/ul>\n\n<p>Every feature listed above is fully unlocked in this download. There are no license keys, no trial periods, no quotas, and no premium-only code paths. The plugin is GPLv2.<\/p>\n\n<h4>Upgrade to Pro<\/h4>\n\n<p>For stores that need to <strong>change prices on existing subscriptions in bulk<\/strong> or want power-user controls, we offer a separate Premium edition. It is a completely separate plugin distributed off WordPress.org.<\/p>\n\n<p><a href=\"https:\/\/checkout.freemius.com\/plugin\/28459\/plan\/46881\/\">Upgrade to AVCL Subscription Repair Pro Today!<\/a><\/p>\n\n<p><strong>Premium features include:<\/strong><\/p>\n\n<ul>\n<li><strong>Bulk price update by product<\/strong> \u2014 Update existing subscribers when you change a product price.<\/li>\n<li><strong>Bulk price update by variation<\/strong> \u2014 Set a different price for each variable subscription tier.<\/li>\n<li><strong>Bulk price update by CSV paste<\/strong><\/li>\n<li><strong>Tax-safe price update<\/strong> \u2014 Derives the tax rate from existing subscription data; never calls <code>calculate_totals()<\/code>.<\/li>\n<li><strong>Optional customer email notification<\/strong> after a price update.<\/li>\n<li><strong>Fix Next Payment Dates<\/strong> \u2014 A standalone tool.<\/li>\n<li><strong>Manual Trigger panel<\/strong> \u2014 Activate, pause, cancel, expire, create renewal orders, and run a recalculate_totals tax test.<\/li>\n<li><strong>Prepay Tools<\/strong> \u2014 Restore prepay intervals and fix prepay next-payment dates.<\/li>\n<li><strong>Schedule Renewals tool<\/strong><\/li>\n<li><strong>Priority email support<\/strong><\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/checkout.freemius.com\/plugin\/28459\/plan\/46881\/\">View all Pro features and pricing<\/a><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>avcl-subscription-interval-repair-for-woocommerce<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin via <strong>Plugins \u2192 Installed Plugins<\/strong>.<\/li>\n<li>Navigate to <strong>Sub Repair<\/strong> in the WordPress admin sidebar.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"are%20any%20features%20locked%20or%20paywalled%3F\"><h3>Are any features locked or paywalled?<\/h3><\/dt>\n<dd><p>No. Every feature in this plugin works in full, with no quotas, no license keys, and no trial period. \"Fix one\", \"Fix all broken\", dry-run preview, audit log, and CSV export are all fully available.<\/p><\/dd>\n<dt id=\"will%20this%20create%20new%20renewal%20orders%3F\"><h3>Will this create new renewal orders?<\/h3><\/dt>\n<dd><p>No. The repair tool only changes billing metadata (interval, period, and next_payment date). It never calls <code>wcs_create_renewal_order()<\/code> or any payment-processing function.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20to%20run%20on%20a%20live%20store%3F\"><h3>Is it safe to run on a live store?<\/h3><\/dt>\n<dd><p>Yes \u2014 always run a <strong>Dry Run<\/strong> first to preview exactly which subscriptions will change and what the new values will be. Nothing is written to the database during a dry run.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. All queries use <code>wc_get_orders()<\/code> with <code>type=shop_subscription<\/code>, and saves use <code>WC_Subscription::save()<\/code>. There are no direct post-meta writes.<\/p><\/dd>\n<dt id=\"will%20automatewoo%20workflows%20fire%20during%20repair%3F\"><h3>Will AutomateWoo workflows fire during repair?<\/h3><\/dt>\n<dd><p>No. The <code>woocommerce_subscription_status_updated<\/code> and related hooks are temporarily removed before the metadata-only save and restored immediately afterwards.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20a%20change%3F\"><h3>Can I undo a change?<\/h3><\/dt>\n<dd><p>The audit log records full before\/after snapshots for every repair. You can use those values to manually revert an individual subscription from the WooCommerce subscription edit screen.<\/p><\/dd>\n<dt id=\"which%20subscriptions%20are%20flagged%20as%20broken%3F\"><h3>Which subscriptions are flagged as broken?<\/h3><\/dt>\n<dd><p>The scanner checks subscriptions where the stored <code>billing_interval<\/code> \u00d7 <code>billing_period<\/code> does not match what the original product meta and order line-item meta indicate the interval should be. Subscriptions with an intentional <code>1\u00d7month<\/code> billing pattern (e.g. prepay products) are detected and skipped automatically.<\/p><\/dd>\n<dt id=\"how%20does%20%22fix%20all%20broken%22%20work%3F\"><h3>How does \"Fix All Broken\" work?<\/h3><\/dt>\n<dd><p>It iterates the list of broken subscriptions from the most recent scan and calls the single-subscription repair endpoint for each one in series. Each repair is atomic and produces its own audit-log row \u2014 there is no batched database write that could leave subscriptions in a partial state.<\/p><\/dd>\n<dt id=\"what%20does%20the%20pro%20version%20add%3F\"><h3>What does the Pro version add?<\/h3><\/dt>\n<dd><p>The Pro plugin is a separate plugin (not hosted on WordPress.org) that adds bulk subscription <strong>price updating<\/strong> by product \/ variation \/ CSV, a tax-safe price-split engine, a manual trigger panel, prepay tools, and a scheduled-renewal helper. The free plugin you are reading about here is complete on its own; Pro is only worth considering if you need those specific extras.<\/p><\/dd>\n<dt id=\"will%20the%20free%20and%20pro%20plugins%20conflict%20if%20both%20are%20active%3F\"><h3>Will the free and Pro plugins conflict if both are active?<\/h3><\/dt>\n<dd><p>No. The free plugin automatically detects when the Pro edition is active and stands down its admin UI and AJAX handlers so menus and hooks do not collide. You can safely deactivate the free plugin once Pro is active.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: Corrected character encoding in uninstall.php comments to resolve SVN sync issue.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: \"Free vs Pro\" comparison page on its own submenu \u2014 purely informational, describes optional features available in a separate paid plugin. No code in the free plugin is locked or gated.<\/li>\n<li>New: Compatibility detection \u2014 if the paid edition is active, the free plugin stands down its menus and AJAX handlers automatically so the two do not collide.<\/li>\n<li>New: <code>AVCL_WCSR_PRO_URL<\/code> constant (filterable) for the upgrade page CTA.<\/li>\n<li>New: <code>avcl_wcsr_show_upgrade_page<\/code> filter to hide the Free vs Pro submenu entirely if preferred.<\/li>\n<li>Compliance: Explicit confirmation in code comments and readme that all features are unlocked and unrestricted; no license checks, no quotas, no trial period.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: \"Fix All Broken\" \u2014 repair every detected broken subscription in one click (sequential, atomic, each one audit-logged).<\/li>\n<li>New: \"Dry Run All\" \u2014 preview every pending repair before committing.<\/li>\n<li>New: Audit log \"Export CSV\" button.<\/li>\n<li>New: Audit log \"Clear Log\" button.<\/li>\n<li>New: <code>Requires Plugins: woocommerce<\/code> header so WordPress blocks activation when WooCommerce is missing.<\/li>\n<li>Changed: Plugin renamed to \"AVCL Subscription Interval Repair for WooCommerce\" and reslugged to <code>avcl-subscription-interval-repair-for-woocommerce<\/code> per WordPress.org guidelines.<\/li>\n<li>Changed: Text domain loading now uses the standard <code>init<\/code> hook with <code>load_plugin_textdomain()<\/code>.<\/li>\n<li>Removed: All upsell UI and references to a separate paid edition.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed: Resolved Plugin Check (PCP) warning for unescaped DB parameter in audit log query.<\/li>\n<li>Fixed: \"Tested up to\" updated to WordPress 6.9.<\/li>\n<li>Improved: Admin notice for missing WooCommerce Subscriptions now uses proper escaped output.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Detects and repairs broken billing intervals on WooCommerce Subscriptions \u2014 single or bulk \u2014 with a safe dry-run preview and a full audit log.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/308450","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=308450"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ankitv"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=308450"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=308450"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=308450"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=308450"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=308450"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=308450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}