# Stripe: “Invalid integer: 10.99”

> Stripe says Invalid integer (parameter_invalid_integer): the amount has decimals. Send it in the smallest currency unit, as a whole number: 1099, not 10.99.

Canonical: https://app369.com/fix/stripe-invalid-integer/
Last updated: 2026-11-08

Creating a PaymentIntent, Checkout Session or Price fails with parameter_invalid_integer and a message such as Invalid integer: 10.99. Stripe amounts are whole numbers in the currency’s smallest unit, so a price in dollars, a float from a calculation, or a string with a decimal point is rejected before anything is charged.

**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**

1. 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**](https://docs.stripe.com/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' });
```
2. 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)**](https://docs.stripe.com/error-codes) 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.
3. 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)**](https://docs.stripe.com/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.
4. 04 ### **Prices that really need fractions of a cent**
  > “A positive integer in the smallest currency unit” [**Stripe, Create a price (unit_amount)**](https://docs.stripe.com/api/prices/create) 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 November 8, 2026: [Stripe docs: Supported currencies](https://docs.stripe.com/currencies); [Stripe docs: Error codes](https://docs.stripe.com/error-codes); [Stripe docs: Create a price](https://docs.stripe.com/api/prices/create).

## **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 price”**](https://app369.com/fix/stripe-no-such-price/) · [**Stripe “Received unknown parameter”**](https://app369.com/fix/stripe-received-unknown-parameter/) · [**Stripe PaymentIntent already succeeded**](https://app369.com/fix/stripe-paymentintent-already-succeeded/) · [**Stripe Invalid API Key provided**](https://app369.com/fix/stripe-invalid-api-key-provided/)

Questions

## **More on this error**

<details>

<summary>**Why does Stripe use cents instead of dollars? **+</summary>

Whole numbers avoid floating-point rounding errors. Every amount in the API is in the currency’s smallest unit, so 1099 means 10.99 USD and 500 means 500 JPY.

</details>

<details>

<summary>**Is there a minimum amount? **+</summary>

Yes. Below the minimum, Stripe returns amount_too_small instead. Stripe’s currencies page lists the minimum charge per currency.

</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/)