Skip to content

Stripe API errorStripe: “This PaymentMethod was previously used without being attached to a Customer or was detached from a Customer, and may not be used again.”

The first payment with a card works, and the second charge with the same pm_ ID fails. A PaymentMethod that isn’t attached to a Customer can be used once. After that payment, or after it was detached, Stripe won’t take it again.

Short answer

Save the card to a Customer while the customer is present: create the PaymentIntent with customer and setup_future_usage: off_session, or collect it with a SetupIntent. Then charge later with the same customer and payment_method. Calling attach after the first payment is too late, and a detached PaymentMethod can’t be reused: collect the card again.

Why Stripe refuses the PaymentMethod, and the fix

  1. 01

    The first payment didn’t save the card

    “These approaches will perform any necessary steps to set up the PaymentMethod for future payments.” Stripe, Attach a PaymentMethod to a Customer

    A PaymentIntent created without customer and setup_future_usage charges the card and leaves the PaymentMethod unattached, so it is spent. Save it during that first payment.

    const pi = await stripe.paymentIntents.create({
      amount,
      currency: 'usd',
      customer: customerId,
      setup_future_usage: 'off_session',
      automatic_payment_methods: { enabled: true },
    });
  2. 02

    Saving a card without charging it

    “You should always set up reusable payment methods for future use to reduce the chance of future declines and payment friction” Stripe, Payment methods overview (Single-use or reusable)

    For a trial or a card on file, use a SetupIntent with the customer. It attaches the PaymentMethod and handles authentication up front, so later off-session charges are less likely to fail.

    const si = await stripe.setupIntents.create({
      customer: customerId,
      automatic_payment_methods: { enabled: true },
    });
    // later
    await stripe.paymentIntents.create({
      amount, currency: 'usd', customer: customerId,
      payment_method: pmId, off_session: true, confirm: true,
    });
  3. 03

    The PaymentMethod was detached

    Removing a card from a customer (detach, or a customer portal removal) ends it for good. Ask the customer to add the card again through a SetupIntent; reattaching the old ID won’t work.

  4. 04

    A single-use payment method type

    “Single-use payment methods (for example, some kinds of bank transfers) can’t be attached to customers because they’re consumed after a payment attempt.” Stripe, Payment methods overview (Single-use or reusable)

    Some payment method types can only be used once and can never be attached. Check the type before you build a recurring flow on it.

Checked against the vendor’s docs on : Stripe docs: Attach a PaymentMethod to a Customer; Stripe docs: Payment methods overview; Stripe docs: Error codes.

Rather hand it over?

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

Related: Stripe “no default payment method” on renewal · Stripe subscription stuck incomplete · Stripe “No such PaymentMethod” · Stripe “Must provide source or customer”

Questions

More on this error

Can I call attach after the payment succeeded?

No. Once an unattached PaymentMethod has been used for a payment, it can’t be attached anymore. Save it during the payment with setup_future_usage, or collect it with a SetupIntent.

Do I need this for Stripe Checkout?

With Checkout in subscription mode, Stripe saves the card for renewals. For one-time payments you want to repeat, pass the customer and payment_intent_data.setup_future_usage when you create the Checkout Session.

Can you fix it for me?

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.

A different error?

Describe it and get a written quote

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.