FlowiseAI/Flowise · critical · Error

No active price found for the product

Error message

No active price found for the product

What it means

Thrown during new-user provisioning when IdentityManager creates a Stripe subscription. After resolving the product ID from the user's plan (CLOUD_STARTER_ID / CLOUD_PRO_ID / CLOUD_FREE_ID env vars), it queries Stripe for an active price on that product. If the prices.list call returns zero entries, no subscribable price exists, so the flow aborts before creating the subscription. This is a configuration/data error in the Stripe account backing the cloud product catalog, not a runtime logic bug.

Source

Thrown at packages/server/src/IdentityManager.ts:521

                    productId = process.env.CLOUD_STARTER_ID as string
                    break
                case UserPlan.PRO:
                    productId = process.env.CLOUD_PRO_ID as string
                    break
                case UserPlan.FREE:
                    productId = process.env.CLOUD_FREE_ID as string
                    break
            }

            // Get the default price ID for the product
            const prices = await this.stripeManager.getStripe().prices.list({
                product: productId,
                active: true,
                limit: 1
            })

            if (!prices.data.length) {
                throw new Error('No active price found for the product')
            }

            // Create the subscription
            const subscription = await this.stripeManager.getStripe().subscriptions.create({
                customer: customer.id,
                items: [{ price: prices.data[0].id }]
            })

            return {
                customerId: customer.id,
                subscriptionId: subscription.id
            }
        } catch (error) {
            console.error('Error creating Stripe user and subscription:', error)
            throw error
        }
    }

View on GitHub (pinned to abe4a8601a)

Solutions

  1. In the Stripe dashboard, open the product matching the failing plan's env var and confirm at least one price is active; reactivate or create a price if none exists.
  2. Verify the env var value (CLOUD_STARTER_ID / CLOUD_PRO_ID / CLOUD_FREE_ID) matches a real, current product ID (prod_...) in the active Stripe account, not a deleted/archived one.
  3. Confirm you are pointed at the correct Stripe account (check STRIPE_SECRET_KEY begins with the right live/test prefix) so the product lookup hits the expected catalog.
  4. If migrating pricing, create the new active price before archiving the old one so there is never a zero-active-price window.

Example fix

// before: relies on a price existing; fails opaquely on misconfig
const prices = await this.stripeManager.getStripe().prices.list({ product: productId, active: true, limit: 1 })
if (!prices.data.length) {
    throw new Error('No active price found for the product')
}

// after: surface which product/plan is missing its price
if (!prices.data.length) {
    throw new Error(`No active price found for product '${productId}' (plan ${userPlan}). Ensure a price exists and is active in Stripe.`)
}
Defensive patterns

Strategy: validation

Validate before calling

// Before signup, confirm each plan product has an active price in Stripe
import Stripe from 'stripe'
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)

async function assertProductHasActivePrice(productIdEnv: string, plan: string) {
    const productId = process.env[productIdEnv]
    if (!productId) throw new Error(`Missing env ${productIdEnv} for plan ${plan}`)
    const prices = await stripe.prices.list({ product: productId, active: true, limit: 1 })
    if (!prices.data.length) {
        throw new Error(`Plan ${plan} product ${productId} has no active price. Fix the Stripe catalog.`)
    }
}

// run at boot
await Promise.all([
    assertProductHasActivePrice('CLOUD_STARTER_ID', 'STARTER'),
    assertProductHasActivePrice('CLOUD_PRO_ID', 'PRO'),
    assertProductHasActivePrice('CLOUD_FREE_ID', 'FREE')
])

Type guard

function hasActivePrice(prices: Stripe.ApiList<Stripe.Price>): prices is Stripe.ApiList<Stripe.Price> & { data: [Stripe.Price, ...Stripe.Price[]] } {
    return prices.data.length > 0
}

Try / catch

try {
    const result = await identityManager.createUserAndSubscription(email, plan, referral)
} catch (err) {
    if (err instanceof Error && err.message.includes('No active price found')) {
        // catalog/config issue: alert ops, do not retry against the same misconfigured product
        logger.error('Stripe catalog misconfigured', { plan, err })
        throw new InternalFlowiseError(StatusCodes.SERVICE_UNAVAILABLE, 'Billing setup incomplete')
    }
    throw err
}

Prevention

When it happens

Trigger: Signup flow calling createUserAndSubscription with a valid UserPlan value. The matched env var resolves to a product ID whose prices are all archived/inactive in the Stripe dashboard, so prices.list({product, active:true, limit:1}) returns an empty data array. Also triggered if the env var holds a product ID that was deleted or replaced during a catalog migration without reactivating a price.

Common situations: Stripe product prices were archived after a plan rename or pricing change. Env var (e.g. CLOUD_FREE_ID) points at a stale product from a previous environment. Test/staging Stripe account never had prices created for the product. Product was created but price creation step was skipped in setup scripts.

Related errors


AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12). Data as JSON: /api/errors/f9151a5efc61cf59. Report an issue: GitHub.