antiwork/gumroad · error · Subscription::UpdateFailed

error_message (PayPal account unsupported / payment method n

Error message

error_message (PayPal account unsupported / payment method no longer supported)

What it means

On a membership restart (is_resubscribing) or after an Indian-card mandate stop, UpdaterService verifies the card future charges will actually use — Subscription#credit_card_to_charge, which prefers the subscription's own card over the user's default — is still supported by the creator (link.user.supports_card?). If not, the update fails with one of two buyer-facing messages: a PayPal-specific one when the card is a PayPal instrument (creator's PayPal account problem), otherwise the generic no-longer-supported message. Nothing is charged.

Source

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

        # Do not allow a restart or renewal resume when the payment method that
        # future charges will use is no longer supported by the product creator.
        #
        # We check `Subscription#credit_card_to_charge` — the same card recurring
        # charges use (it prefers the subscription's own card over the user's
        # default card) — so a supported default card on the user can't mask an
        # unsupported card stored on the subscription itself. Subscriptions with
        # no chargeable card (e.g. free memberships) have nothing to reject, and
        # a new payment method supplied at checkout has already been validated
        # and associated with the subscription above, so it is covered here too.
        if is_resubscribing || had_indian_card_mandate_stop
          card_to_charge = subscription.credit_card_to_charge
          if card_to_charge.present? && !subscription.link.user.supports_card?(card_to_charge.as_json)
            error_message = if card_to_charge.charge_processor_id == PaypalChargeProcessor.charge_processor_id
              "There is a problem with creator's PayPal account, please try again later (your card was not charged)."
            else
              "The payment method saved on this membership is no longer supported by the creator. Please use a different payment method (your card was not charged)."
            end
            raise Subscription::UpdateFailed, error_message
          end

          validate_saved_indian_card_mandate! if use_existing_card?
        end

        if !apply_plan_change_immediately?
          # If not an upgrade or changing plans during trial period, roll back changes
          # made by `Subscription#update_current_plan!`
          restore_original_purchase!
          # If purchase is missing tier and user is not upgrading, associate default tier.
          if tiered_membership? && original_purchase.variant_attributes.empty?
            default_tier = product.default_tier
            original_purchase.update!(variant_attributes: [default_tier])
            if original_purchase.counts_towards_inventory? && original_purchase.quantity.to_i > 0
              BaseVariant.where(id: default_tier.id).update_all("sales_count_for_inventory_cache = sales_count_for_inventory_cache + #{original_purchase.quantity.to_i}")
            end
          end
        end

View on GitHub (pinned to afeacbd394)

Solutions

  1. Have the buyer submit a new payment method with the restart instead of using the saved card — the new card is validated against the creator's supported processors when associated.
  2. For the PayPal variant, the creator must repair their PayPal connection in settings; retry later.
  3. Creators: confirm which charge processors are actually connected/live in account settings before fielding buyer reports.
Defensive patterns

Strategy: validation

Validate before calling

# Gate the restart-with-saved-card option before rendering it
card = subscription.credit_card_to_charge
saved_card_supported = card.nil? || subscription.link.user.supports_card?(card.as_json)
show_use_existing_card_option = saved_card_supported

Try / catch

result = Subscription::UpdaterService.new(...).perform
unless result[:success]
  # error_message already tells the buyer to use a different payment method; render it
  render json: { success: false, error: result[:error_message] }, status: :unprocessable_entity
end

Prevention

When it happens

Trigger: Buyer clicks restart/resubscribe while their saved card is a PayPal billing agreement whose creator PayPal account is disconnected or broken, or the saved card belongs to a processor the creator has dropped (e.g. migrated to Stripe-only). Fires only when is_resubscribing or had_indian_card_mandate_stop is true.

Common situations: Creator migrates from PayPal/Braintree to Stripe and old memberships still carry processor-specific instruments; creator's PayPal account gets limited or disconnected; buyer restarts from an old purchase email years after the creator changed processors.

Related errors


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