Short answer
Convert the amount to the smallest currency unit and round it to a whole number before you send it: Math.round(10.99 * 100) gives 1099 cents. For zero-decimal currencies such as JPY, send the amount as is. The error’s param field names the parameter that failed, such as amount or unit_amount. The same error hits other integer fields, such as quantity or trial_period_days, when they are sent with decimals.
Where the decimal comes from, and the fix
01
The amount is in dollars, not cents
“For example, enter 1099 to charge 10.99 USD (or any other two-decimal currency).” Stripe, Supported currencies
amount and unit_amount are in the smallest currency unit. Multiply two-decimal currencies by 100 and round, so floating-point results such as 1098.9999 become 1099. Float edge cases still exist (1.005 * 100 is 100.49999…), so it is better to keep money as integer cents, or use a decimal library, from the start.
const amount = Math.round(Number(price) * 100); // 10.99 -> 1099 await stripe.paymentIntents.create({ amount, currency: 'usd' });02
A calculated total with a fraction of a cent
“One or more of the parameters requires an integer, but the values provided were a different type.” Stripe, Error codes (parameter_invalid_integer)
Discounts, tax or quantity math can leave a fraction of a cent even when every input was in cents. Round once, at the end, with the rounding rule your business uses, and store money as integer cents in your database.
03
Zero-decimal currencies multiplied by 100
“For the following zero-decimal currencies, the charge and the amount are the same, without requiring multiplication.” Stripe, Supported currencies (Zero-decimal currencies)
For JPY, KRW and other zero-decimal currencies, the amount is already the smallest unit, so multiplying by 100 overcharges by 100 times. Look the currency up in Stripe’s list before you scale.
04
Prices that really need fractions of a cent
“A positive integer in the smallest currency unit” Stripe, Create a price (unit_amount)
For prices below one cent per unit, unit_amount can’t hold the fraction. Create the Price with unit_amount_decimal, a decimal string in the smallest unit (up to 12 decimal places). Stripe rounds each invoice line to a whole cent after multiplying by the quantity. For per-call usage billing, use Stripe’s usage-based billing instead of a licensed price.
await stripe.prices.create({ currency: 'usd', unit_amount_decimal: '0.5', // half a cent per unit; each invoice line is rounded to whole cents recurring: { interval: 'month' }, product: productId, });
Checked against the vendor’s docs on : Stripe docs: Supported currencies; Stripe docs: Error codes; Stripe docs: Create a price.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- $950Stripe Billing Fix and SetupSubscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.See scope and start
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA 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
Related: Stripe “No such price” · Stripe “Received unknown parameter” · Stripe PaymentIntent already succeeded · Stripe Invalid API Key provided