Wc stripe subscriptions
Skill Lonsdale201/wp-agent-skills/woocommerce/wc-stripe-subscriptions
Integrate WooCommerce Stripe Gateway 10.8+ with WooCommerce Subscriptions 9.0. Covers gateway feature support, automatic renewals, Stripe metadata, failed-renewal recovery, SCA, change-payment SetupIntents, update-all behavior, Express Checkout, native Link and card-wallet token shapes, detached tokens, and safe tests. Use when Stripe is a subscription gateway or code touches scheduled_subscription_payment_stripe, _stripe_source_id on WC_Subscription, change_payment_method, renewal authentication, Link, or Stripe token migration.From its SKILL.md
npx -y skills add Lonsdale201/wp-agent-skills --skill wc-stripe-subscriptionsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 21 stars21 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
12.0 KB, ~2.3k tokens by cl100k_base, as published. Nobody here has run it
Stripe and WooCommerce Subscriptions
Use this for the boundary between Stripe's token/intent model and WCS's subscription, renewal-order, and payment-method-change model. A Woo token alone is not enough: renewals also depend on the subscription gateway and Stripe metadata.
Runtime contract
Stripe initializes Subscriptions support only when WC_Subscriptions and WC_Subscription are loaded. The main stripe gateway advertises:
subscriptions, cancellation, suspension, reactivation- amount/date changes
- customer/admin payment-method changes
- multiple subscriptions
It does not advertise gateway_scheduled_payments. Therefore WCS schedules renewals, creates renewal orders, and dispatches the Stripe gateway hook. Do not create a second Stripe renewal cron.
Reusable Stripe sub-gateways may have different IDs and capabilities. Ask the actual gateway object:
$gateway = wc_get_payment_gateway_by_order( $subscription );
if ( $gateway && $subscription->payment_method_supports( 'subscriptions' ) ) {
// The stored gateway is available for automatic WCS renewals.
}
Do not infer support from a stripe_ prefix alone.
Automatic renewal flow
- WCS runs
woocommerce_scheduled_subscription_paymentfor the subscription. - WCS creates a renewal order and copies the recurring payment context.
- WCS dispatches
woocommerce_scheduled_subscription_payment_{gateway_id}with amount and renewal order. - Stripe registers
scheduled_subscription_payment()for each supported Stripe gateway and charges off-session. - Success completes the renewal order; WCS records renewal success and reactivates/advances the subscription.
- Failure follows WCS failure/retry handling; SCA can require customer authentication.
Observe Stripe renewals without replacing the gateway callback:
add_action(
'woocommerce_subscription_renewal_payment_complete',
function ( WC_Subscription $subscription, WC_Order $renewal_order ): void {
if ( 0 !== strpos( $renewal_order->get_payment_method(), 'stripe' ) ) {
return;
}
myplugin_sync_paid_renewal( $subscription, $renewal_order );
},
10,
2
);
Do not provision on woocommerce_scheduled_subscription_payment_stripe; the charge has not necessarily succeeded there.
Stripe metadata on subscriptions
Stripe stores provider context on the WC_Subscription object, principally:
_stripe_customer_id: Stripecus_...owning the reusable method._stripe_source_id: current reusablepm_..., legacysrc_..., orcard_...identifier.
Treat these as implementation storage, not the write API. Read/write via WC_Subscription CRUD and the installed gateway/order-helper methods. Do not use update_post_meta() because subscriptions can use HPOS and because a payment-method change must also fire WCS/gateway side effects.
Renewal-order cleanup deliberately removes old Stripe fee/net and PaymentIntent data while retaining the customer/payment method needed for the new charge. Never copy _stripe_intent_id, charge IDs, or payment locks from one renewal order to another.
Change payment method
The customer flow is the WCS change-payment page identified by change_payment_method=<subscription_id>. WCS owns authorization, capability checks, form handling, update-all behavior, and gateway-change hooks. Stripe owns Payment Element/SetupIntent confirmation and Stripe metadata.
For a new UPE method:
- WCS verifies that the customer may edit the subscription payment method.
- Stripe creates/confirms a SetupIntent for the customer's Stripe customer.
- Stripe validates the selected type and disallows unsupported/prepaid cases where configured.
- Stripe creates/updates the Woo token.
WC_Subscriptions_Change_Payment_Gateway::update_payment_method()changes the WCS gateway and fires its hooks.- Stripe writes customer/payment method IDs through its subscription helpers.
- Redirect/SCA completion performs the update only after confirmation succeeds.
Never implement this as:
// WRONG: no WCS hooks, no SCA, no remote validation.
$subscription->update_meta_data( '_stripe_source_id', $payment_method_id );
$subscription->save();
For trusted server code, use the WCS change-payment service as the orchestration model and version-guard calls into Stripe internals. For customer requests, keep WCS's built-in page unless you reproduce nonce, ownership, token/customer matching, SetupIntent, and update-all semantics.
Express Checkout change-payment support
Stripe 10.8 adds Apple Pay, Google Pay, and Link on the WCS Change payment method page.
- Setting location key:
change_payment_methodinsideexpress_checkout_button_locations. - Availability filter:
wc_stripe_show_express_checkout_on_change_payment_method. - Detection still requires a valid WCS subscription, connected account, SSL outside test mode, available
stripegateway, and enabled Express Checkout method/location. - Optimized Checkout remains disabled on this page; Express Checkout is rendered separately before the WCS pay form.
- Stripe links the generated Woo token to the subscription and preserves the wallet title, including after a 3DS redirect.
Do not force the filter to true as a substitute for enabling/connecting Stripe; the filter only changes the final location decision.
The Express Checkout flow unsets automatic “update all subscriptions” consent because confirmation occurs before that checkbox is shown. A custom clone must not interpret a hidden/default checkbox as consent.
Link token contract
Link does not become a separate WCS gateway. Native Stripe type=link uses WC_Payment_Token_Link; a type=card PaymentMethod used through Link remains WC_Stripe_Payment_Token_CC. Both use gateway stripe and may have a pm_... value, while _stripe_source_id can point to either shape. Inspect the retrieved PaymentMethod or hydrated token type before using email versus card getters; never classify it from the prefix or write stripe_link to the subscription.
Express change-payment replaces the subscription's attached Woo token IDs with the token matching the new PaymentMethod and preserves the Link-facing title, including across redirect authentication. Do not replace this with a raw _stripe_source_id update. Use wc-stripe-link-payments for Link consent, duplicate-by-email, reconciliation, and token-class details.
Add method and update all
On My Account Add payment method, Stripe can show “Update the payment method for all of my current subscriptions”. After woocommerce_stripe_add_payment_method, it iterates eligible subscriptions and calls WC_Subscriptions_Change_Payment_Gateway::update_payment_method() with Stripe payment meta.
Relevant filters include:
wc_stripe_display_update_subs_payment_method_card_checkboxwc_stripe_update_subs_payment_method_card_statuseswc_stripe_save_to_subs_textwc_stripe_save_to_subs_checked
Keep the default unchecked unless the product explicitly requires a well-explained bulk update.
Failed renewals and SCA
For a customer-paid failed renewal, WCS fires:
woocommerce_subscription_failing_payment_method_updated_{gateway_id}
Stripe listens to the exact stored gateway ID, for example woocommerce_subscription_failing_payment_method_updated_stripe, and copies the successful renewal order's Stripe customer/payment method back to the subscription.
Since WCS 8.8, same-gateway failed-renewal retries do not fire ordinary woocommerce_subscription_payment_method_updated* hooks. Put retry-recovery behavior on the failing-payment hook; keep actual gateway migration behavior on ordinary payment-method-updated hooks.
Stripe handles off-session SCA by leaving the renewal unpaid, sending Stripe-specific authentication email(s), and letting the customer authenticate/pay. Do not mark the subscription active or call payment_complete() merely because an intent exists or is requires_action.
Stripe 10.7+ also detects Radar-blocked renewals, puts the subscription on hold, and cancels the pending WCS retry so repeated retries do not reproduce the same block.
Token deletion and detached subscriptions
Deleting a Woo Stripe token triggers Stripe's woocommerce_payment_token_deleted listener and remote detach. It does not safely migrate every subscription that used the token. Before a customer-facing delete, detect affected active subscriptions and either block deletion with a replacement workflow or clearly accept detached-subscription remediation.
Stripe includes a detached-subscription admin detector/bulk action. Treat it as recovery tooling, not normal payment-method migration.
Legacy SEPA
Legacy SEPA subscriptions can use gateway stripe_sepa and source IDs. Current PaymentMethods-based SEPA uses stripe_sepa_debit. Stripe includes migration/repair code for legacy SEPA tokens. Do not bulk-rewrite gateway IDs or src_ values without running the installed migration logic and verifying the remote pm_ mapping.
Test matrix
Test at minimum:
- Initial paid subscription and zero-upfront free trial.
- Successful automatic renewal with the stored Stripe method.
- Decline, WCS retry, Radar block, and SCA-required renewal.
- Change payment with an existing token and with a new UPE method.
- 3DS redirect completion and cancellation.
- Express Checkout change-payment enabled/disabled and update-all consent.
- Delete/default token with one and multiple active subscriptions.
- HPOS enabled; verify subscription and renewal metadata through CRUD.
- Native Link and card-through-Link signup, renewal, standard/Express change-payment, and redirected authentication.
Cross-references
- Use
wc-stripe-future-paymentsfor provider-level charge-and-save/off-session principles or a custom installment model that WCS does not own. - Use
wc-stripe-add-payment-methodfor My Account form and token creation contracts. - Use
wc-stripe-link-paymentsfor Link token shapes, consent, reconciliation, and gateway identifiers. - Use
wcs-renewal-schedulerfor WCS schedule/order creation and retry timing. - Use
wcs-subscription-hooksfor generic gateway-change hook signatures. - Use
wc-stripe-webhooksfor asynchronous Stripe settlement and webhook order locking.
References
- Verified source paths:
wp-content/plugins/woocommerce-gateway-stripe/includes/compat/trait-wc-stripe-subscriptions.phpwp-content/plugins/woocommerce-gateway-stripe/includes/compat/trait-wc-stripe-subscriptions-utilities.phpwp-content/plugins/woocommerce-gateway-stripe/includes/compat/class-wc-stripe-subscriptions-helper.phpwp-content/plugins/woocommerce-gateway-stripe/includes/payment-methods/class-wc-stripe-upe-payment-gateway.phpwp-content/plugins/woocommerce-gateway-stripe/includes/payment-methods/class-wc-stripe-express-checkout-element.phpwp-content/plugins/woocommerce-gateway-stripe/includes/payment-methods/class-wc-stripe-express-checkout-helper.phpwp-content/plugins/woocommerce-subscriptions/includes/core/class-wc-subscriptions-change-payment-gateway.phpwp-content/plugins/woocommerce-subscriptions/includes/gateways/class-wc-subscriptions-payment-gateways.php
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.