Skip to content
Insights · Engineering

Which method did that customer store?

Name the method that customer stored: the id, the type, and the customer. A different method can share a last four. Another account omits it.

Scroll
EngineeringOct 30, 202612 min readBy Salman Naqvi, Founder & CEO
Which method did that customer store?

A customer says the bank account is saved, or says the card on file is not the one they gave you. Tonight, three proofs, in a console you administer. Name the method the customer stored: the payment method id, the type, and the customer, or write that the customer field is null. Show a different method whose id, or whose type, is not this one. Show another account's list that does not contain this method. If any of the three needs the person who wired billing, you have not named the method. You have a last four and a guess.

This is the PaymentMethod object. It is not the card on a charge. Which card did that charge use? is the brand and the last four on a charge. A payment method id can exist while no charge has used it, and a charge can print a last four while this method's customer is null. It is not the setup the customer confirmed. Which setup did the customer confirm? is the setup id, the status, and the usage. A setup can succeed and still leave customer null. It is not the issue a repository opened. Which issue did that repository open? is an issue number. It is not the step a run took. Which step did that run actually take? is a step id. A bank account is none of those.

None of what follows is a rate for this product, and none of it is legal advice. The fields below are one processor's current samples of a PaymentMethod. The samples that share a last four do not share an id. The figures below that are a 2025 diary of how US consumers paid, not a ledger of methods on your account. An average of other people's payments is not the method the customer stored tonight.

Stripe's object sample and Stripe's create sample print the same id and the same type. The id is pm_1Q0PsIJvEtkwdCNYMSaVuRz6. 27 characters. object is payment_method. 14 characters. 14 is not 27. allow_redisplay is unspecified. 11 characters. billing_details.name is John Doe. 8 characters, counting the space. created is 1726673582. customer is null. livemode is false, so the object is an example, not a live method on your account. metadata is an empty object. type is us_bank_account. 15 characters. 15 is not 14, and 15 is not card. account_holder_type is individual. 10 characters. account_type is checking. 8 characters, the same length as the name, and not the same string. bank_name is STRIPE TEST BANK. 16 characters. fingerprint is LstWJFsCK7P349Bg. Also 16 characters, and not the bank name. last4 is 6789. 4 characters. networks.preferred is ach. 3 characters. routing_number is 110000000. 9 characters. 9 is not 4, and 9 is not 16. The create request sends type us_bank_account, account_holder_type individual, account_number 000123456789, routing_number 110000000, and billing_details name John Doe. The response does not print the account number. It prints last4 6789, which is the last four characters of 000123456789. The first eight characters, 00012345, are not in the response. 8 is not 4. The routing number is in both the request and the response. A field that round-trips is not a field that was shortened to four digits (Stripe, The PaymentMethod object, and Create a PaymentMethod).

The update request keeps that id and adds one field the object sample does not have. It sends metadata order_id 6735. 4 characters. The response stores order_id 6735 on the same id, the same created time, and the same null customer. The object-page sample's metadata is empty. Empty is not 6735. The digits 6735 also sit inside the created integer 1726673582, which is 1726, then 6735, then 82. 1726673582 is not 6735. A timestamp that happens to contain those digits is not the metadata string. Do not paste 6735 onto the empty metadata because the id matches, and do not paste the timestamp onto the order id because the digits overlap (Stripe, Update a PaymentMethod).

The attach sample is a different method, and it is a card. The id is pm_1MqM05LkdIwHu7ixlDxxO6Mc. Also 27 characters, and not the bank id. type is card. 4 characters. 4 is not 15. brand is visa. last4 is 4242. 4242 is not 6789. exp_month is 8. exp_year is 2026. funding is credit. fingerprint is mToisGZ01V71BCos. 16 characters, the same length as the bank fingerprint, and not the same string. cvc_check is pass. customer is cus_NbZ8Ki3f322LNn. 18 characters. created is 1679946402. name is null. The bank sample's name was John Doe. A null name is not John Doe. allow_redisplay is not on this sample. Do not copy unspecified onto it because both pages are titled PaymentMethod. The detach sample is a third id, pm_1MqLiJLkdIwHu7ixUEgbFdYF, also 27 characters. It prints the same fingerprint mToisGZ01V71BCos, the same last four 4242, the same exp_month 8, and the same exp_year 2026. cvc_check is unchecked. unchecked is not pass. customer is null. A null customer is not cus_NbZ8Ki3f322LNn. created is 1679945299. 1679946402 minus 1679945299 is 1103 seconds, which is 18 minutes and 23 seconds. 1103 is not a day. The page says detachment is permanent. These two samples are not one method before and after a detach, because the ids differ. Same fingerprint, same last four, different id. A last four is not the method (Stripe, Attach a PaymentMethod, and Detach a PaymentMethod).

The two list samples ask for limit 3 and return one method each. The unfiltered-except-custom list, filtered in the example by type card, returns pm_1NO6mA2eZvKYlo2CEydeHsKT. 27 characters again. has_more is false. The url is /v1/payment_methods. 19 characters. customer is cus_9s6XKzkNRiz8i3. 18 characters, the same length as the attach customer, and not the same string. exp_year is 2024. cvc_check is unchecked. fingerprint is Xt5EWLLDS7FJjR1c. 16 characters, a third fingerprint. last4 is again 4242. created is 1687991030. The customer's own list asks for limit 3 as well, and its url is /v1/customers/cus_9s6XKzkNRiz8i3/payment_methods. 48 characters. 48 is not 19. has_more is false. The only object is pm_1NVChw2eZvKYlo2CHxiM5E2E. Also 27 characters, and not the id in the other list. Same customer cus_9s6XKzkNRiz8i3. Same fingerprint Xt5EWLLDS7FJjR1c. Same last four 4242. exp_month is 12, not 8. exp_year is 2034, not 2024. 2034 minus 2024 is 10. cvc_check is pass, not unchecked. created is 1689682128. 1689682128 minus 1687991030 is 1691098 seconds: 19 days, 13 hours, 44 minutes, and 58 seconds. The page does not print that gap. 1 object is not limit 3. Same customer, same last four, same fingerprint, two ids. Do not collapse them because the customer matches (Stripe, List PaymentMethods, and List a Customer's PaymentMethods).

The type lists on those pages do not print the same leftover. The object page names ten types and then prints the words Show 50 more. The list page's type filter names the same ten and then prints Show 48 more. 50 is not 48. 10 plus 50 is 60. 10 plus 48 is 58. Neither sum is printed. A collapsed control is not a type you can store, and us_bank_account on the bank sample is not card on the list sample. The list page also says that, unfiltered, the list returns all payment method types except custom. custom is a type the unfiltered list leaves out. Leaving it out is not the same as a filter you set to card.

The diary people quote when they want a payment average did not open this method. The Federal Reserve Bank of Atlanta's 2025 Survey and Diary of Consumer Payment Choice says that, compared with October 2024, the number of all payments decreased by about one payment, to an average of 47 per consumer per month. The average value per consumer per month fell from $6,867 to $6,656. 6867 minus 6656 is 211. The page does not print 211. The average transaction dollar value was $141. 47 times 141 is 6627. 6656 is not 6627. The gap is 29, which the page does not print. An average of products is not the product of averages. Cash use in the prior 30 days went from 83 percent of consumers in 2024 to 81 percent in 2025. Check payments went from 35 percent to 33 percent. 83 minus 81 is 2. 35 minus 33 is 2. The page does not print 2. 2 is not 47, and $141 is not last4 6789, and $6,656 is not a payment method id (Federal Reserve Bank of Atlanta, Survey and Diary of Consumer Payment Choice).

Do the three proofs on one real method, in the console that actually holds it. First, the binding. Copy the payment method id, the type, and the customer. If customer is null, write null. If the type is us_bank_account, write the last four and the routing number, and write that the full account number was not in the object. If the type is card, write the brand, the last four, the expiration, and the fingerprint, and do not borrow visa from a charge that used a different id. Do not infer 6789 or 4242 because a sample prints them. Second, the other method. A different id, even with the same last four and the same fingerprint, is not this one. The two list samples are that shape, and they are still samples. A diary average is not that second method. Third, the other account. A list that belongs to someone else does not contain this id. If the only list is one shared customer, write that. A tenant you cannot name is the finding.

Three moves feel like the proof and are a second problem. Detaching the method because the last four was embarrassing, and then describing the missing row as a cleanup. The detach sample is a different id from the attach sample, and a null customer on one of them does not rewrite the other. Quoting $6,656 or 47 because they look precise, while the method you were asked about is one object, and the diary that printed them had not opened your console. Asking a model which method was stored. The model will pick a plausible type. It will not open the object. A card on a charge you have not kept is which card did that charge use?. Opening that charge does not name this payment method id.

The path is ordinary when an operator can open one customer's methods without opening the next customer's methods as the way to prove it. PassGlobe is a subscription offers platform, distinct from the next merchant. It is not a payment-method ledger. No headcount, duration, or result figure belongs in that sentence. The proof of a stored method is still the id, the type, and the customer on the account that saved it.

There is a version of this afternoon where hiring the path is the wrong purchase. Nothing is for sale, because the product does not take money yet. You have no product. You are still choosing who will build, and the document in front of you is a term sheet. The criteria for that choice sit on the page written for a top SaaS development company. That page is criteria. It does not rank anyone, including us. The only fact in the room is a diary average. 47 is not your method, and 6789 is not your method. A customer has already seen another customer's payment method. Naming a type does not close a leak. Or you wanted a lawyer to say whether a network rule applies. Hire the lawyer.

When the customer is real and the console cannot name the method, the missing object is specific. An admin action, in an account you administer, that shows one payment method id, one type, and one customer or an explicit null, shows a different method that is not that one, and shows another account's list without it. A startup software development company that expects this will have put that action next to the rest of the billing screen, before a stranger's complaint is the way you discover the vendor owns the method. One that needs a call in order for you to see which method is stored is telling you who holds the id. If the first slice is a fixed capability, an AI integration sprint is the shape where the acceptance sentence can include the three proofs. If you do not yet know which system stores the customer, a two-week AI readiness assessment maps the systems. The findings are yours. They are not a promise that 47 payments a month will appear on your account. If what you are buying is the product around the billing screen, the offer is an AI product development company.

Before you tell them which method the customer stored, do the three proofs and write the id. Name the id, the type, and the customer, or write that the customer field was null. Show a different method that is not that one, even if the last four matches. Show another account's list that does not contain it. Do not paste card onto a bank id because both samples are PaymentMethods, and do not paste 6735 onto a timestamp that merely contains those digits. The binding is the method you can defend.

Questions

Three records, in a console you administer. The payment method id, the type, and the customer, or a written line that the customer field was null. A different method whose id or type is not this one, even when the last four matches. Another account's list that does not contain this method. If any of the three needs the person who wired billing, you do not have the proof.

No. An average of other people's payments is not the id on this method. A method you can defend is the id, the type, and the customer, or a written line that the customer was null. 47 payments a month is not type us_bank_account, and 6789 on a sample is not your customer's last four.

When nothing is for sale, when you have no product, when you are still choosing a firm, when the only fact in the room is a diary average, when a customer has already seen another customer's payment method, or when you wanted a lawyer.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→