Automattic / jetpack

Security, performance, marketing, and design tools — Jetpack is made by WordPress experts to make WP sites safer and faster, and help you grow your traffic.
https://jetpack.com/
Other
1.59k stars 798 forks source link

Restoring a Backup Can Misschedule Subscription Renewals #30207

Closed csmcneill closed 6 months ago

csmcneill commented 1 year ago

Impacted plugin

Backup

Quick summary

When performing a backup, subscription orders that were placed after the restore point are properly saved. However, the scheduled actions and WP-Cron events that determine when the next renewal should occur are restored, which can create duplicate renewals if it is timed improperly.

Steps to reproduce

  1. Install WooCommerce Subscriptions.
  2. Create a subscription product with (a daily or weekly renewal schedule is likely easier to test than monthly or annual).
  3. Make a purchase of the subscription product.
  4. Create a restore point after the subscription has been purchased.
  5. Trigger an early renewal as the customer via the My Account > Subscriptions page, which will create a renewal order and move the next renewal date ahead by one billing cycle (e.g., one day for a Daily renewal, one week for a Weekly renewal).
  6. Make note of the subscription's next billing date either at My Account > Subscriptions or wp-admin > WooCommerce > Subscriptions.
  7. Restore to the restore point created in step 4.
  8. Note that the renewal order created in step 5 is still visible/accessible.
  9. Assess the next billing date in step 6; it will be as though the renewal triggered in step 5 never occurred.
  10. Repeat step 5. The next billing date will move forward by one billing cycle, even though this charge already occurred.

A clear and concise description of what you expected to happen.

The next billing date in WooCommerce Subscriptions should not be impacted by a site restore, or the restore options in the following screen should indicate which may or may not impact subscription scheduling:

Markup on 2023-04-19 at 13:27:32

What actually happened

In this test scenario, the subscription schedule was not retained when restoring from a backup, which resulted in a customer potentially being billed twice following a restore.

Impact

Some (< 50%)

Available workarounds?

No but the platform is still usable

Platform (Simple and/or Atomic)

Self-hosted

Logs or notes

The workaround for this is for an affected merchant to refund the duplicate renewal payments. However:

  1. It can be difficult to discern which of the orders should be renewed.
  2. Refunds incur fees.
  3. Refunds cannot be performed in bulk in the event that this affects multiple subscribers.

System Status Report:

` ### WordPress Environment ### WordPress address (URL): https://woopack.mystagingwebsite.com Site address (URL): https://woopack.mystagingwebsite.com WC Version: 7.6.0 REST API Version: ✔ 7.6.0 WC Blocks Version: ✔ 9.8.4 Action Scheduler Version: ✔ 3.5.4 Log Directory Writable: ✔ WP Version: 6.2 WP Multisite: – WP Memory Limit: 512 MB WP Debug Mode: – WP Cron: ✔ Language: en_US External object cache: ✔ ### Server Environment ### Server Info: nginx PHP Version: 8.2.5 PHP Post Max Size: 2 GB PHP Time Limit: 1200 PHP Max Input Vars: 6144 cURL Version: 8.0.1 OpenSSL/1.1.1n SUHOSIN Installed: – MySQL Version: 10.4.26-MariaDB-log Max Upload Size: 2 GB Default Timezone is UTC: ✔ fsockopen/cURL: ✔ SoapClient: ✔ DOMDocument: ✔ GZip: ✔ Multibyte String: ✔ Remote Post: ✔ Remote Get: ✔ ### Database ### WC Database Version: 7.6.0 WC Database Prefix: wp_ Total Database Size: 79.44MB Database Data Size: 41.72MB Database Index Size: 37.72MB wp_woocommerce_sessions: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_woocommerce_api_keys: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_woocommerce_attribute_taxonomies: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_woocommerce_downloadable_product_permissions: Data: 0.02MB + Index: 0.06MB + Engine InnoDB wp_woocommerce_order_items: Data: 0.50MB + Index: 0.17MB + Engine InnoDB wp_woocommerce_order_itemmeta: Data: 4.52MB + Index: 6.03MB + Engine InnoDB wp_woocommerce_tax_rates: Data: 0.02MB + Index: 0.06MB + Engine InnoDB wp_woocommerce_tax_rate_locations: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_woocommerce_shipping_zones: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_woocommerce_shipping_zone_locations: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_woocommerce_shipping_zone_methods: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_woocommerce_payment_tokens: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_woocommerce_payment_tokenmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_woocommerce_log: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_actionscheduler_actions: Data: 1.52MB + Index: 0.83MB + Engine InnoDB wp_actionscheduler_claims: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_actionscheduler_groups: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_actionscheduler_logs: Data: 1.52MB + Index: 0.44MB + Engine InnoDB wp_commentmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_comments: Data: 1.52MB + Index: 0.48MB + Engine InnoDB wp_links: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_options: Data: 0.27MB + Index: 0.06MB + Engine InnoDB wp_postmeta: Data: 3.52MB + Index: 5.03MB + Engine InnoDB wp_posts: Data: 1.52MB + Index: 0.38MB + Engine InnoDB wp_snippets: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_termmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_terms: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_term_relationships: Data: 0.05MB + Index: 0.02MB + Engine InnoDB wp_term_taxonomy: Data: 0.05MB + Index: 0.03MB + Engine InnoDB wp_usermeta: Data: 1.52MB + Index: 3.03MB + Engine InnoDB wp_users: Data: 0.09MB + Index: 0.08MB + Engine InnoDB wp_wc_admin_notes: Data: 0.06MB + Index: 0.00MB + Engine InnoDB wp_wc_admin_note_actions: Data: 0.05MB + Index: 0.02MB + Engine InnoDB wp_wc_category_lookup: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_wc_customer_lookup: Data: 0.11MB + Index: 0.06MB + Engine InnoDB wp_wc_download_log: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_wc_order_coupon_lookup: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_wc_order_product_lookup: Data: 1.52MB + Index: 0.88MB + Engine InnoDB wp_wc_order_stats: Data: 0.17MB + Index: 0.16MB + Engine InnoDB wp_wc_order_tax_lookup: Data: 0.02MB + Index: 0.03MB + Engine InnoDB wp_wc_product_attributes_lookup: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_wc_product_download_directories: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_wc_product_meta_lookup: Data: 0.05MB + Index: 0.09MB + Engine InnoDB wp_wc_rate_limits: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_wc_reserved_stock: Data: 0.02MB + Index: 0.00MB + Engine InnoDB wp_wc_tax_rate_classes: Data: 0.02MB + Index: 0.02MB + Engine InnoDB wp_wc_webhooks: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_actionscheduler_actions: Data: 1.52MB + Index: 0.75MB + Engine InnoDB __wp_actionscheduler_claims: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_actionscheduler_groups: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_actionscheduler_logs: Data: 1.52MB + Index: 0.42MB + Engine InnoDB __wp_commentmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_comments: Data: 1.52MB + Index: 0.47MB + Engine InnoDB __wp_links: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_options: Data: 3.08MB + Index: 1.03MB + Engine InnoDB __wp_postmeta: Data: 4.27MB + Index: 4.98MB + Engine InnoDB __wp_posts: Data: 1.44MB + Index: 0.33MB + Engine InnoDB __wp_snippets: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_termmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_terms: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_term_relationships: Data: 0.05MB + Index: 0.02MB + Engine InnoDB __wp_term_taxonomy: Data: 0.05MB + Index: 0.03MB + Engine InnoDB __wp_usermeta: Data: 1.52MB + Index: 3.03MB + Engine InnoDB __wp_users: Data: 0.08MB + Index: 0.08MB + Engine InnoDB __wp_wc_admin_notes: Data: 0.06MB + Index: 0.00MB + Engine InnoDB __wp_wc_admin_note_actions: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_wc_category_lookup: Data: 0.02MB + Index: 0.00MB + Engine InnoDB __wp_wc_customer_lookup: Data: 0.11MB + Index: 0.06MB + Engine InnoDB __wp_wc_download_log: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_wc_order_coupon_lookup: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_wc_order_product_lookup: Data: 1.52MB + Index: 0.88MB + Engine InnoDB __wp_wc_order_stats: Data: 0.16MB + Index: 0.16MB + Engine InnoDB __wp_wc_order_tax_lookup: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_wc_product_attributes_lookup: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_wc_product_download_directories: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_wc_product_meta_lookup: Data: 0.05MB + Index: 0.09MB + Engine InnoDB __wp_wc_rate_limits: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_wc_reserved_stock: Data: 0.02MB + Index: 0.00MB + Engine InnoDB __wp_wc_tax_rate_classes: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_wc_webhooks: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_woocommerce_api_keys: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_woocommerce_attribute_taxonomies: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_woocommerce_downloadable_product_permissions: Data: 0.02MB + Index: 0.06MB + Engine InnoDB __wp_woocommerce_log: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_woocommerce_order_itemmeta: Data: 4.52MB + Index: 6.03MB + Engine InnoDB __wp_woocommerce_order_items: Data: 0.48MB + Index: 0.17MB + Engine InnoDB __wp_woocommerce_payment_tokenmeta: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_woocommerce_payment_tokens: Data: 0.02MB + Index: 0.02MB + Engine InnoDB __wp_woocommerce_sessions: Data: 0.05MB + Index: 0.02MB + Engine InnoDB __wp_woocommerce_shipping_zones: Data: 0.02MB + Index: 0.00MB + Engine InnoDB __wp_woocommerce_shipping_zone_locations: Data: 0.02MB + Index: 0.03MB + Engine InnoDB __wp_woocommerce_shipping_zone_methods: Data: 0.02MB + Index: 0.00MB + Engine InnoDB __wp_woocommerce_tax_rates: Data: 0.02MB + Index: 0.06MB + Engine InnoDB __wp_woocommerce_tax_rate_locations: Data: 0.02MB + Index: 0.03MB + Engine InnoDB ### Post Type Counts ### attachment: 46 jb_store_css: 8 page: 7 post: 1 product: 42 product_variation: 118 shop_coupon: 12 shop_order: 1157 shop_subscription: 2 ### Security ### Secure connection (HTTPS): ✔ Hide errors from visitors: ✔ ### Active Plugins (9) ### Akismet Anti-Spam: by Automattic – 5.1 Code Snippets: by Code Snippets Pro – 3.3.0 Jetpack Boost: by Automattic - Jetpack Site Speed team – 1.7.0 Jetpack Protect: by Automattic - Jetpack Security team – 1.3.0 Jetpack: by Automattic – 12.1-a.7 WooCommerce Smooth Generator: by Automattic – 1.1.0 WooCommerce Payments: by Automattic – 5.7.0 WooCommerce Subscriptions: by WooCommerce – 5.0.1 WooCommerce: by Automattic – 7.6.0 ### Inactive Plugins (0) ### ### Dropin Plugins (2) ### advanced-cache.php: advanced-cache.php object-cache.php: Memcached ### Settings ### API Enabled: – Force SSL: – Currency: USD ($) Currency Position: left Thousand Separator: , Decimal Separator: . Number of Decimals: 2 Taxonomies: Product Types: external (external) grouped (grouped) simple (simple) subscription (subscription) variable (variable) variable subscription (variable-subscription) Taxonomies: Product Visibility: exclude-from-catalog (exclude-from-catalog) exclude-from-search (exclude-from-search) featured (featured) outofstock (outofstock) rated-1 (rated-1) rated-2 (rated-2) rated-3 (rated-3) rated-4 (rated-4) rated-5 (rated-5) Connected to WooCommerce.com: – Enforce Approved Product Download Directories: ✔ Order datastore: WC_Order_Data_Store_CPT ### WC Pages ### Shop base: #5 - /shop/ Cart: #6 - /cart/ Checkout: #7 - /checkout/ My account: #8 - /my-account/ Terms and conditions: ❌ Page not set ### Theme ### Name: Storefront Version: 4.2.0 Author URL: https://woocommerce.com/ Child Theme: ❌ – If you are modifying WooCommerce on a parent theme that you did not build personally we recommend using a child theme. See: How to create a child theme WooCommerce Support: ✔ ### Templates ### Overrides: – ### Subscriptions ### WCS_DEBUG: ✔ No Subscriptions Mode: ✔ Live Subscriptions Live URL: https://woopack.mystagingwebsite.com Subscriptions-core Library Version: 5.5.0 Subscription Statuses: wc-active: 2 WooCommerce Account Connected: ❌ No Report Cache Enabled: ✔ Yes Cache Update Failures: ✔ 0 failure ### Store Setup ### Country / State: United States (US) — California ### Subscriptions by Payment Gateway ### WooCommerce Payments: wc-active: 2 ### Payment Gateway Support ### WooCommerce Payments: products refunds multiple_subscriptions subscription_cancellation subscription_payment_method_change_admin subscription_payment_method_change_customer subscription_payment_method_change subscription_reactivation subscription_suspension subscriptions subscription_amount_changes subscription_date_changes tokenization add_payment_method ### Admin ### Enabled Features: activity-panels analytics coupons customer-effort-score-tracks import-products-task experimental-fashion-sample-products shipping-smart-defaults shipping-setting-tour homescreen marketing multichannel-marketing mobile-app-banner navigation onboarding onboarding-tasks remote-inbox-notifications remote-free-extensions payment-gateway-suggestions shipping-label-banner subscriptions store-alerts transient-notices woo-mobile-welcome wc-pay-promotion wc-pay-welcome-page Disabled Features: block-editor-feature-enabled minified-js new-product-management-experience product-variation-management settings Daily Cron: ✔ Next scheduled: 2023-04-20 19:56:26 -05:00 Options: ✔ Notes: 64 Onboarding: completed ### WooCommerce Payments ### Version: 5.7.0 Connected to WPCOM: Yes Blog ID: 217807324 Account ID: acct_1MwAjSCMYiqccZFQ ### Action Scheduler ### Complete: 2,505 Oldest: 2023-04-12 19:56:38 +0000 Newest: 2023-04-19 19:02:12 +0000 Failed: 3 Oldest: 2023-04-12 21:17:27 +0000 Newest: 2023-04-14 18:07:47 +0000 Pending: 5 Oldest: 2023-04-19 21:35:45 +0000 Newest: 2023-07-13 00:12:50 +0000 ### Status report information ### Generated at: 2023-04-19 16:19:41 -05:00 `

Site Health Report:

` ### wp-core ### version: 6.2 site_language: en_US user_language: en_US timezone: -05:00 permalink: /%year%/%monthnum%/%day%/%postname%/ https_status: true multisite: false user_registration: 0 blog_public: 1 default_comment_status: open environment_type: production user_count: 494 dotorg_communication: true ### wp-paths-sizes ### wordpress_path: /wordpress/core/6.2 wordpress_size: 62.85 MB (65907442 bytes) uploads_path: /srv/htdocs/wp-content/uploads uploads_size: 3.42 MB (3582038 bytes) themes_path: /srv/htdocs/wp-content/themes themes_size: 7.50 MB (7867609 bytes) plugins_path: /srv/htdocs/wp-content/plugins plugins_size: 344.09 MB (360808356 bytes) database_size: 79.02 MB (82853888 bytes) total_size: 496.88 MB (521019333 bytes) ### wp-dropins (2) ### advanced-cache.php: true object-cache.php: true ### wp-active-theme ### name: Storefront (storefront) version: 4.2.0 author: Automattic author_website: https://woocommerce.com/ parent_theme: none theme_features: core-block-patterns, widgets-block-editor, post-thumbnails, automatic-feed-links, custom-logo, menus, html5, custom-background, custom-header, site-logo, title-tag, customize-selective-refresh-widgets, wp-block-styles, align-wide, editor-styles, editor-font-sizes, editor-style, responsive-embeds, amp, woocommerce, wc-product-gallery-zoom, wc-product-gallery-lightbox, wc-product-gallery-slider, starter-content, widgets, infinite-scroll theme_path: /srv/htdocs/wp-content/themes/storefront auto_update: Disabled ### wp-themes-inactive (1) ### Twenty Twenty-Three: version: 1.1, author: the WordPress team, Auto-updates disabled ### wp-plugins-active (9) ### Akismet Anti-Spam: version: 5.1, author: Automattic, Updates managed by Pressable Code Snippets: version: 3.3.0, author: Code Snippets Pro, Auto-updates disabled Jetpack: version: 12.1-a.7, author: Automattic, Updates managed by Pressable Jetpack Boost: version: 1.7.0, author: Automattic - Jetpack Site Speed team (latest version: 1.8.0), Auto-updates disabled Jetpack Protect: version: 1.3.0, author: Automattic - Jetpack Security team, Auto-updates disabled WooCommerce: version: 7.6.0, author: Automattic, Updates managed by Pressable WooCommerce Payments: version: 5.7.0, author: Automattic, Auto-updates disabled WooCommerce Smooth Generator: version: 1.1.0, author: Automattic, Auto-updates disabled WooCommerce Subscriptions: version: 5.0.1, author: WooCommerce, Auto-updates disabled ### code-snippets (1) ### snippet-5: name: wcpay dev mode, scope: global, modified: 2023-04-12 20:56:57 ### wp-media ### image_editor: WP_Image_Editor_GD imagick_module_version: Not available imagemagick_version: Not available imagick_version: Not available file_uploads: File uploads is turned off post_max_size: 2047M upload_max_filesize: 2047M max_effective_size: 2 GB max_file_uploads: 20 gd_version: bundled (2.1.0 compatible) gd_formats: GIF, JPEG, PNG, WebP, BMP, AVIF ghostscript_version: not available ### wp-server ### server_architecture: Linux 5.10.0-19-amd64 x86_64 httpd_software: nginx php_version: 8.2.5 64bit php_sapi: fpm-fcgi max_input_variables: 6144 time_limit: 1200 memory_limit: 512M max_input_time: 1200 upload_max_filesize: 2047M php_post_max_size: 2047M curl_version: 8.0.1 OpenSSL/1.1.1n suhosin: false imagick_availability: false pretty_permalinks: true ### wp-database ### extension: mysqli server_version: 10.4.26-MariaDB-log client_version: mysqlnd 8.2.5 max_allowed_packet: 104857600 max_connections: 500 ### wp-constants ### WP_HOME: https://woopack.mystagingwebsite.com WP_SITEURL: https://woopack.mystagingwebsite.com WP_CONTENT_DIR: /srv/htdocs/wp-content WP_PLUGIN_DIR: /srv/htdocs/wp-content/plugins WP_MEMORY_LIMIT: 512M WP_MAX_MEMORY_LIMIT: 512M WP_DEBUG: false WP_DEBUG_DISPLAY: false WP_DEBUG_LOG: false SCRIPT_DEBUG: false WP_CACHE: true CONCATENATE_SCRIPTS: undefined COMPRESS_SCRIPTS: undefined COMPRESS_CSS: undefined WP_ENVIRONMENT_TYPE: production DB_CHARSET: utf8mb4 DB_COLLATE: utf8mb4_general_ci ### wp-filesystem ### wordpress: not writable wp-content: writable uploads: writable plugins: writable themes: writable mu-plugins: writable ### jetpack ### site_id: 217807324 ssl_cert: No time_diff: undefined version_option: 12.1-a.7:1681839177 old_version: 12.1-a.5:1681329383 public: Public master_user: #1 woopack current_user: #1 woopack tokens_set: Blog User blog_token: 8z3o9gICJPe%wCLP#EsFexgrp4DWgKER user_token: (JVuEv(x!Ghiwm$Mqn&NQLNdwlda%$X4 version: 12.1-a.7 jp_plugin_dir: /wordpress/plugins/jetpack/12.1-a.7/ plan: security protect_header: "" full_sync: {"started":"Wed, 19 Apr 2023 18:30:20 +0000","finished":"Wed, 19 Apr 2023 18:30:50 +0000","progress":{"comments":{"total":"2378","sent":2378,"finished":true,"last_sent":"1"},"constants":{"finished":true},"functions":{"finished":true},"options":{"finished":true},"posts":{"total":"1392","sent":1392,"finished":true,"last_sent":"1"},"term_relationships":{"total":"430","sent":430,"finished":true,"last_sent":{"object_id":"1","term_taxonomy_id":"1"}},"terms":{"total":"223","sent":223,"finished":true,"last_sent":"1"},"themes":{"finished":true},"updates":{"finished":true},"users":{"total":"1","sent":1,"finished":true,"last_sent":"1"}},"config":{"comments":1,"constants":1,"functions":1,"options":1,"posts":1,"term_relationships":1,"terms":1,"themes":1,"updates":1,"users":1}} sync_size: undefined sync_lag: 0 seconds full_sync_size: 2 full_sync_lag: 2 hours, 49 minutes, 56 seconds idc_urls: {"home":"https:\/\/woopack.mystagingwebsite.com","siteurl":"https:\/\/woopack.mystagingwebsite.com","WP_HOME":"https:\/\/woopack.mystagingwebsite.com","WP_SITEURL":"https:\/\/woopack.mystagingwebsite.com"} idc_error_option: false idc_optin: true cxn_tests: All Pass. `
pehaa commented 1 year ago

Very likely reported by the merchant here 6552608-zd-woothemes

github-actions[bot] commented 1 year ago

Support References

This comment is automatically generated. Please do not edit it.

jjbbrr commented 1 year ago

This scenario happened to us. We got the backup service for because we were worried about restores screwing up subscriptions. It is a major selling point of the plugin if it works - it would outshine all competitors. If it can't then it's just another backup service.

In our situation, all renewals that had taken place between the backup point and the restore point were instantly re-renewed upon the completion of the restore. All these people were charged again for their subscription even though they had already been charged the day before, since we restored to a point 24 hours earlier.

jwebbdev commented 8 months ago

This falls more into a feature request than a bug. We currently support actions from the core WooCommerce plugin in Jetpack VaultPress Backup's order protection ability. WooCommerce Subscriptions, along with all other WooCommerce add-on plugins don't have the same level of support to trigger real-time events.

We may well support additional plugins in the future, and WooCommerce Subscriptions seems like a good candidate, but it's not in the immediate future.

jjbbrr commented 8 months ago

OK, fair point. It's disappointing because it means Woo Subscriptions sites are effectively un-backupable. They're a weak point in the Woo ecosystem. Many webhosts and third party platforms provide backup services but if you use Woo Subscriptions they will just result in messed up subscriptions data and people being charged twice.