Skip to content
Insights · Engineering

Which grant did that customer hold?

Name the grant that customer held: the id, the amount, and the category. A different grant can share an amount. Another account omits it.

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

A founder says the customer still has credits, or says the invoice ignored a balance that was supposed to be there. Tonight, three proofs, in a console you administer. Name the grant that customer held: the grant id, the amount, and the category, or write that the list was empty. Show a different grant whose id, or whose customer, is not this one, even when the amount matches. Show another account's list that does not contain this grant. If any of the three needs the person who wired billing, you have not named the grant. You have a dollar figure and a guess.

This is a billing credit grant. It is not the credit note an invoice applied. Which credit did that invoice apply? is a credit note id, an amount, and a status. A note can reduce one invoice while this grant is a different object, with a priority and a void time, and a note id is not a grant id. It is not the balance a customer held. Which balance did that customer hold? is a transaction id, an amount, and an ending balance. A grant can exist while that ending balance is a different row. It is not the asset a release attached. Which asset did that release attach? is a filename on a release. It is not the compact a response made. Which compact did that response make? is a compaction id. A purchased-credits name 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 credit grant. The samples that share an amount do not share an id. The figures below that are a national retail estimate, not a ledger of grants on your account. A quarter of other people's sales is not the grant the customer held tonight.

Stripe's object sample and Stripe's create sample print the same id and the same amount. The id is credgr_test_61R9a6NUWsRmOW3RM41L6nFOS1ekDGHo. 44 characters. object is billing.credit_grant. 20 characters. 20 is not 44. amount.type is monetary. currency is usd. 3 characters. value is 1000. category is paid. 4 characters. The other category the page names is promotional. 11 characters. 11 is not 4. Two names in the enum are not one category on the object. applicability_config.scope.price_type is metered. 7 characters. The page says it currently only supports metered prices that have a Billing Meter attached. One scope name is not a second grant. created is 1726620803. updated is 1726620803. The two timestamps match on this sample. effective_at is 1729297860. 1729297860 minus 1726620803 is 2677057 seconds: 30 days, 23 hours, 37 minutes, and 37 seconds. The page does not print that gap. 30 days would be 2592000 seconds. 2677057 is not 2592000. A grant that becomes usable later is not a grant that was usable at created. expires_at is null. customer is cus_QrvQguzkIK8zTj. 18 characters. 18 is not 44. livemode is false, so the object is an example, not a live grant on your account. metadata is an empty object. name is Purchased Credits. 17 characters. The create page says the maximum length of name is 100. 17 is not 100. priority is 50. The page says the highest priority is 0 and the lowest is 100, and that an omitted priority is set to 50. 0 is not 50. 100 is not 50. 0 plus 100, divided by 2, is 50. The page does not print that division, and it does not call 50 a midpoint. 1000 divided by 50 is 20. The page does not print 20. An amount is not a priority. test_clock is null. voided_at on the object sample is null. A null void is not a void. The create request sends the name, a customer placeholder, amount 1000 in usd, type monetary, price_type metered, and category paid. It does not send priority, effective_at, or expires_at. The response still prints priority 50 and effective_at 1729297860. The page says an omitted effective_at defaults to the current timestamp. The response's effective_at is not its created timestamp, and the page does not print the clock time of the sample request, so you cannot check the word current against created. Do not paste created into effective_at because the request left the field off. The create response also omits voided_at. The object sample, same id, prints voided_at null. A missing key is not a printed null, and neither is a void time. Stripe-Version on the request is 2026-10-28.endive. 17 characters, the same length as the name Purchased Credits, and not that string (Stripe, The Credit Grant object, and Create a credit grant).

The create page's prerequisite is a customer, and the grant does not store that customer's name. The prerequisite call is createCustomer with name Jenny Rosen and email jennyrosen@example.com. Jenny Rosen is 11 characters. The email is 22 characters. 11 is not 18, and 22 is not 44. The grant response prints cus_QrvQguzkIK8zTj and does not print Jenny Rosen. A name you used to set up the sample is not a field on the grant. Do not tell a customer their grant is under a person's name because the setup snippet had one. The category request sends paid, so this sample is not an illustration of the default. The page says category defaults to paid if omitted. This request did not omit it. A default you did not use is not the reason the field says paid.

The void sample is a different grant, and it is the second id the pages actually print. The id is credgr_test_61R9rnNTDmZ657a2r41L6nFOS1ekD5Ae. Also 44 characters. The shared prefix credgr_test_61R9 is 16 characters. The page does not print 16. The rest of the id is not the same string. object is again billing.credit_grant. value is again 1000. currency is again usd. category is again paid. name is again Purchased Credits. priority is again 50. price_type is again metered. expires_at is again null. livemode is again false. metadata is again empty. test_clock is again null. The amount matching is not a reason to merge the ids. customer is cus_QsEHa3GKweMwih. Also 18 characters, and not cus_QrvQguzkIK8zTj. created is 1726688817. effective_at is 1726688817. On this sample the two are equal. On the object sample they are not. 1726688817 minus 1726620803 is 68014 seconds: 18 hours, 53 minutes, and 34 seconds. The page does not print that gap. updated is 1726688829. voided_at is 1726688829. 1726688829 minus 1726688817 is 12 seconds. The page does not print 12. A void 12 seconds after created is not the object sample, whose updated equals created and whose voided_at is null. The void request sends no amount. The response keeps 1000. Voiding, in this sample, does not set the value to 0, and it does not rewrite the first id. Do not copy cus_QrvQguzkIK8zTj onto the voided grant because both pages are about credits (Stripe, Void a credit grant).

The list sample does not ask for a limit, and it does not return a second grant. The url is /v1/billing/credit_grants. 25 characters. 25 is not 44. object is list. has_more is false. data length is 1. The only id is again credgr_test_61R9a6NUWsRmOW3RM41L6nFOS1ekDGHo. Same value 1000. Same customer. Same null voided_at, which the create response had omitted and the list prints. The page says limit can range from 1 to 100, and the default is 10. 10 is not 100. 1 object is not the default. A list that reprints the grant you already opened is not the second proof. The second proof is the void sample's different id, or a different id in the account you administer. This list does not contain the void sample's id (Stripe, List credit grants).

The retail totals people quote when they want a credit figure did not open this grant. The Census Bureau's quarterly retail e-commerce report for the second quarter of 2026 says seasonally adjusted e-commerce sales were $340.2 billion, up 3.8 percent, plus or minus 0.4 percent, from the first quarter. Total retail sales were $1,986.5 billion, up 2.9 percent, plus or minus 0.2 percent. E-commerce was up 12.2 percent, plus or minus 0.9 percent, from the second quarter of 2025, and total retail was up 6.7 percent, plus or minus 0.5 percent. E-commerce accounted for 17.1 percent of total sales. 3.8 is not 2.9. 12.2 is not 6.7. 17.1 is not 16. The adjusted table prints total 1,986,488 million and e-commerce 340,244 million, and it also prints 17.1. 340.2 billion, read as 340,200 million, is 44 million short of 340,244. $1,986.5 billion, read as 1,986,500 million, is 12 million above 1,986,488. The page does not print 44 or 12. 340,244 divided by 1,986,488 begins 0.171279, which rounds to the printed 17.1 percent. 17.1 percent of 1,986,488 million is 339,689.448 million, not 340,244. The page does not print 339,689. A rounded share, multiplied back by the total, is not the e-commerce cell. The same table's prior-quarter change for e-commerce is 3.8 percent. 340,244 divided by 327,861 is a 3.7769 percent rise. 3.7769 is not 3.8 as a longer figure, and the page does not print 3.7769. None of these is value 1000, and none of them is a grant id (U.S. Census Bureau, Quarterly Retail E-Commerce Sales, 2nd Quarter 2026).

The not-adjusted block in that same release is a different pair, and it does not repair the adjusted one. Not-adjusted e-commerce is $329.5 billion in the prose and 329,530 million in the table. 329.5 billion, read as 329,500 million, is 30 million short of 329,530. The page does not print 30. The share is 16.4 percent. 329,530 divided by 2,011,977 begins 0.16378, which rounds to 16.4. 16.4 percent of 2,011,977 million is 329,964.228 million, not 329,530. The page does not print 329,964. The not-adjusted change from the prior quarter is 9.4 percent for e-commerce and 11.5 percent for total sales. 9.4 is not 3.8, the adjusted change, and 11.5 is not 2.9. The year-ago not-adjusted changes are 12.4 percent and 6.6 percent. 12.4 is not 12.2, and 6.6 is not 6.7. Two adjustments of one quarter are not one number you may paste onto a grant. 1000 cents, if someone wants to call the sample a ten-dollar credit, is still not $340.2 billion, and the sample's currency field says usd without printing the word cents.

Do the three proofs on one real grant, in the console that actually holds it. First, the binding. Copy the grant id, the amount value, the currency, the category, the customer, the effective_at, and the voided_at. If voided_at is null, write null. If the key is absent, write absent. Do not treat those as the same sentence. If effective_at is not created, write both integers. Do not invent Jenny Rosen because a setup snippet had that name. If the value is 1000 only on a sample, do not copy 1000 onto a live row. Second, the other grant. A different id, even with the same amount and the same name, is not this one. The void sample is that shape, and it is still a sample. A list that reprints the same id is not that second grant. A national retail total is not that second grant. Third, the other account. A list that belongs to someone else does not contain this id. If the only list is one shared platform account, write that. A tenant you cannot name is the finding.

Three moves feel like the proof and are a second problem. Voiding the grant because the amount was embarrassing, and then describing the missing row as a cleanup. The void sample keeps value 1000 and writes a voided_at. It does not become the first id, and a null voided_at does not become 1726688829 because a different grant was voided 12 seconds after it was created. Quoting $340.2 billion or 17.1 percent because they look precise, while the grant you were asked about is one object, and the release that printed them does not recover its table cell when you multiply the rounded percent by the total. Asking a model which grant the customer held. The model will pick a plausible name. It will not open the object. A credit note you have not kept is which credit did that invoice apply?. Opening that note does not name this grant id.

The path is ordinary when an operator can open one merchant's grants without opening the next merchant's grants as the way to prove it. PayOrch is a payment orchestration dashboard: wallets, providers, merchants, platform fees, and fraud controls in one view. The shape that matters here is one merchant you can point at, in an account you administer, distinct from the next merchant. That case is not a credit-grant ledger. Nothing in that sentence is a headcount, a duration, or a result figure. If the only control on the screen changes every merchant's credits together, you do not have this proof. You have a totals page.

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 national sales total. $340.2 billion is not your grant, and 1000 on a sample is not your grant, and a null voided_at is not a credit you may invent. A customer has already seen another customer's grant. Naming a priority does not close a leak. Or you wanted a lawyer to say whether a promotional category applies. Hire the lawyer.

When the customer is real and the console cannot name the grant, the missing object is specific. An admin action, in an account you administer, that shows one grant id, one amount, and one category, shows a different grant 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 credits. One that needs a call in order for you to see which grant was held 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 credits, a two-week AI readiness assessment maps the systems. The findings are yours. They are not a promise that 17.1 percent of retail sales 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 grant the customer held, do the three proofs and write the id. Name the id, the amount, and the category, or write that the list was empty. Show a different grant that is not that one, even if the amount and the name match. Show another account's list that does not contain it. Do not paste the list's only id down as a second grant, and do not paste 17.1 onto a table cell the rounded percent does not recover. The binding is the grant you can defend.

Questions

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

No. A share of other people's sales is not the value on this grant. A grant you can defend is the id, the amount, and the category, or a written line that the list was empty. 17.1 percent is not 1000, and a national total is not credgr_test_61R9a6NUWsRmOW3RM41L6nFOS1ekDGHo.

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 national sales total, when a customer has already seen another customer's grant, 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→