# Stripe: “No such PaymentMethod: ‘pm_…’”

> Stripe says No such PaymentMethod: pm_… (resource_missing). The ID lives in another account or mode. Match keys, Connect accounts and test or live mode.

Canonical: https://app369.com/fix/stripe-no-such-paymentmethod/
Last updated: 2026-11-08

Your server calls Stripe with a pm_ ID and gets back resource_missing: No such PaymentMethod. The PaymentMethod exists, just not where this request looks for it. Stripe looks inside one account and one mode, set by the key and the Stripe-Account header, and the ID was created somewhere else.

**Short answer**

Check where the pm_ was created. The publishable key in the browser and the secret key on the server must belong to the same Stripe account and the same mode (test or live). With Connect, a PaymentMethod made on a connected account needs the same Stripe-Account header on the server call, and one saved on the platform has to be cloned before a direct charge on a connected account can use it.

## **Where the PaymentMethod really lives, and the fix**

1. 01 ### **Keys from two different accounts or modes**
  > “Test and live mode API keys, requests, and objects are only available within the corresponding mode.” [**Stripe, Error codes (livemode_mismatch)**](https://docs.stripe.com/error-codes) Stripe.js created the PaymentMethod with one publishable key, and the server uses a secret key from another account, or a test key next to a live one. Put both keys from the same account and mode into your environment, and redeploy both sides.```
# both from the same Stripe account and the same mode
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_…
STRIPE_SECRET_KEY=sk_live_…
```
2. 02 ### **Connect: created on a connected account, used on the platform**
  > “Client-side libraries set the connected account ID as an argument to the client application” [**Stripe, Make API calls for connected accounts**](https://docs.stripe.com/connect/authentication) If Stripe.js runs with stripeAccount set, the PaymentMethod belongs to that connected account. Your server call must carry the same account in the Stripe-Account header (stripeAccount in the Node library), or Stripe looks on the platform and finds nothing.```
await stripe.paymentIntents.create(
  { amount, currency: 'usd', payment_method: pmId, confirm: true },
  { stripeAccount: 'acct_…' }, // same account Stripe.js used
);
```
3. 03 ### **Connect: saved on the platform, charged on a connected account**
  > “When cloning payment methods, you instead save them on the platform Stripe account.” [**Stripe, Clone customer payment information across connected accounts**](https://docs.stripe.com/connect/cloning-customers-across-accounts) A PaymentMethod saved on a platform customer doesn’t exist on the connected account. For direct charges, create a copy on the connected account first, from the platform customer and PaymentMethod, and use the new pm_ ID it returns.
4. 04 ### **A stale or mistyped ID**
  > “The ID provided isn’t valid. Either the resource doesn’t exist, or an ID for a different resource has been provided.” [**Stripe, Error codes (resource_missing)**](https://docs.stripe.com/error-codes) An ID saved in your database from test mode, from an old account, or a pm_ ID mixed up with a card_ or src_ ID gives the same error. Look the ID up in the Dashboard under the account and mode you expect; if it isn’t there, collect the card again.

Checked against the vendor’s docs on November 8, 2026: [Stripe docs: Error codes](https://docs.stripe.com/error-codes); [Stripe docs: Make API calls for connected accounts](https://docs.stripe.com/connect/authentication); [Stripe docs: Clone customer payment information across connected accounts](https://docs.stripe.com/connect/cloning-customers-across-accounts).

## **Rather hand it over?**

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

- [$950**Stripe Billing Fix and Setup**Subscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.**See scope and start**](https://app369.com/fixed-price/stripe-billing-setup/)
- [from $450**App Fix Ticket**One reproducible bug in an existing mobile or web app, diagnosed and fixed.**See scope and start**](https://app369.com/fixed-price/flutter-firebase-bug-fix/)
- [from $450**AI-Built App Rescue**A Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.****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.**See scope and start**](https://app369.com/fixed-price/ai-app-rescue/)

Related: [**Stripe “No such customer” in test or live mode**](https://app369.com/fix/stripe-no-such-customer-test-mode/) · [**Stripe works in test mode but not live**](https://app369.com/fix/stripe-works-in-test-mode-not-live/) · [**Stripe Connect onboarding incomplete**](https://app369.com/fix/stripe-connect-account-onboarding-incomplete/) · [**Stripe “No such price”**](https://app369.com/fix/stripe-no-such-price/)

Questions

## **More on this error**

<details>

<summary>**Why does it work in test mode but fail after going live? **+</summary>

Usually one side still uses a test key, or the database holds pm_ IDs created in test mode. Test and live objects never see each other, so switch both keys and collect live payment details again.

</details>

<details>

<summary>**Can I move a PaymentMethod from one Stripe account to another? **+</summary>

Not by ID. With Connect you can clone a platform customer’s payment method onto a connected account, which gives a new pm_ ID. Between unrelated accounts, the customer enters the card again.

</details>

<details>

<summary>**Can you fix it for me? **+</summary>

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.

</details>

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.

[**Describe your problem **→](https://app369.com/contact/) [**All fixes**](https://app369.com/fix/)