antiwork/gumroad · error · Subscription::UpdateFailed

We could not verify this card for recurring payments. Please

Error message

We could not verify this card for recurring payments. Please update the payment method before you restart this subscription.

What it means

When restarting or resuming a membership with a saved card (use_existing_card true), validate_saved_indian_card_mandate! requires the stored Indian card's e-mandate to be active: subscription.indian_card_mandate_for(card.id) must report status "active", otherwise UpdateFailed with "...update the payment method before you restart this subscription." Non-mandate cards simply have their mandate state cleared. Applies when india_card_mandate_reliability_enabled?, the card is on Stripe, requires_mandate?, and a future subscription charge is expected.

Source

Thrown at app/services/subscription/updater_service.rb:442

      if !had_saved_card && subscription.gift? && !is_resubscribing
        CustomerLowPriorityMailer.subscription_giftee_added_card(subscription.id).deliver_later
      end
    end

    def validate_saved_indian_card_mandate!
      return unless subscription.india_card_mandate_reliability_enabled?

      credit_card = subscription.credit_card_to_charge
      return if credit_card.nil?

      unless future_subscription_charge? && credit_card.stripe_charge_processor? && credit_card.requires_mandate?
        subscription.clear_indian_card_mandate_state!(expected_credit_card_id: credit_card.id)
        return
      end

      mandate, status, = subscription.indian_card_mandate_for(credit_card.id)
      unless status == "active"
        raise Subscription::UpdateFailed, "We could not verify this card for recurring payments. Please update the payment method before you restart this subscription."
      end

      subscription.update_renewal_for_indian_card_mandate!(
        "active",
        expected_credit_card_id: credit_card.id,
        mandate_id: mandate.id
      )
    rescue ChargeProcessorError => e
      ErrorNotifier.notify(e, subscription: subscription.external_id)
      raise Subscription::UpdateFailed, "We could not verify this card for recurring payments. Please update the payment method before you restart this subscription."
    end

    def future_subscription_charge?
      subscription.future_subscription_charge?(authenticated_offer_code_buyer: logged_in_user)
    end

    def mandate_billing_info_changed?
      submitted_info = params[:contact_info]&.slice(:country, :state, :zip_code)&.symbolize_keys

View on GitHub (pinned to afeacbd394)

Solutions

  1. Have the buyer submit a new payment method instead of the saved card — the new-card path (validate_indian_card_mandate!) creates and validates a fresh mandate.
  2. Verify the mandate status in Stripe for that customer/payment method before directing the buyer.
  3. An inactive mandate cannot be fixed server-side; the buyer must re-authorize via a new card update or a fresh checkout.
Defensive patterns

Strategy: validation

Validate before calling

# Only offer restart-with-saved-card when the mandate is actually active
card = subscription.credit_card_to_charge
mandate_ok = true
if subscription.india_card_mandate_reliability_enabled? && card&.stripe_charge_processor? && card.requires_mandate?
  _, mandate_ok, = subscription.indian_card_mandate_for(card.id)
  mandate_ok = mandate_ok == "active"
end
show_use_existing_card_option = mandate_ok

Try / catch

result = Subscription::UpdaterService.new(...).perform
unless result[:success]
  # message tells the buyer to update the payment method; route them to the new-card flow
  redirect_to_change_payment_method(result[:error_message])
end

Prevention

When it happens

Trigger: Buyer restarts a cancelled membership whose saved Indian card never obtained an e-mandate (created before the reliability feature), or whose mandate has since expired, been revoked by the bank, or deleted in Stripe; a renewal resume after renewal_disabled_due_to_indian_card_mandate while still choosing the existing card.

Common situations: Memberships created before the mandate feature shipped; RBI mandates aging out per bank rules; buyer's bank revoking the auto-debit authorization; test data with mandates created in another Stripe environment.

Related errors


AI-assisted analysis of antiwork/gumroad@afeacbd394 (2026-08-21). Data as JSON: /api/errors/48050b422e191390. Report an issue: GitHub.