Skip to content

Stripe Billing errorWhy is my Stripe subscription stuck as incomplete?

A customer subscribes, the first invoice stays open, and the subscription sits at incomplete until it expires 23 hours later. If the payment says requires_action, the bank asked for authentication and the customer never completed it. Here’s what Stripe expects you to handle, or hand it over at a fixed price.

Short answer

A new subscription stays incomplete until its first invoice is paid, and the customer has 23 hours. If the PaymentIntent says requires_action, the card needs authentication: listen for invoice.payment_action_required, send the customer through it with stripe.handleNextAction, and give access only after invoice.paid or an active subscription. After 23 hours it becomes incomplete_expired and you need a new subscription.

What the status means, and the fix

  1. 01

    The first payment needs 3D Secure

    “Some payment methods require customer authentication with 3D Secure (3DS). Whether authentication is required depends on your Radar rules and the issuing bank for the card.” Stripe, How subscriptions work

    Whether a card asks for authentication depends on your Radar rules and the customer’s bank, so it can work for you and fail for some customers. Check the PaymentIntent status: requires_action means the customer still has to authenticate.

  2. 02

    Your app never shows the authentication step

    “Retrieve the PaymentIntent’s client secret and pass it to stripe.handleNextAction.” Stripe, How subscriptions work

    Tell the customer they need to authenticate, then pass the PaymentIntent’s client secret to stripe.handleNextAction. Stripe says it guides the customer through any required steps and returns the result to your application.

    const { error } = await stripe.handleNextAction({ clientSecret });
    if (error) showMessage(error.message);
  3. 03

    No webhook for invoice.payment_action_required

    “Monitor for the invoice.payment_action_required event notification with webhook endpoints. This indicates that authentication is required.” Stripe, How subscriptions work

    Stripe sends invoice.payment_action_required when authentication is required. Add this event to your webhook endpoint and use it to bring the customer back to authenticate.

  4. 04

    Access is granted before the payment succeeds

    “Before provisioning your product, confirm that the subscription is active or that the customer has active entitlements.” Stripe, How subscriptions work

    An incomplete subscription hasn’t been paid. Give access on invoice.paid, or after checking that the subscription is active or the customer has active entitlements, not when the subscription is created.

  5. 05

    It already turned incomplete_expired

    “if the customer doesn’t pay within 23 hours, the subscription updates to incomplete_expired and the invoice becomes void. To reactivate their access, create a new subscription.” Stripe, How subscriptions work

    After 23 hours without a successful payment, the invoice is voided, and Stripe’s fix is a new subscription. Create one for the customer and make sure the authentication step works this time.

Checked against the vendor’s docs on : Stripe docs: How subscriptions work; Stripe docs: Subscription webhooks.

Rather hand it over?

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

Related: Stripe paid, account not upgraded · Stripe webhook 200 but database not updated · Stripe subscription canceled, access wrong · Stripe customer portal not working

Questions

More on this error

Was the customer charged?

When the PaymentIntent is requires_action, Stripe lists the invoice as open: the payment hasn’t completed. Stripe also says incomplete_expired subscriptions don’t bill customers. Incomplete can also mean a payment is still processing, so check the PaymentIntent before telling the customer.

Does completing payment late change the billing date?

No. Stripe says completing payment later doesn’t shift the start of the initial billing period, so a customer who authenticates late has less of the first period left.

Why does it only happen for some customers?

Stripe says whether authentication is required depends on your Radar rules and the card’s issuing bank, so some cards go straight through and others need the extra step.

Can you fix it for me?

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.

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; we reply by email, usually within one business day.