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
- 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.
- 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.
- 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.
- 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
- Run a startup catalog check that verifies an active price exists for every plan product before accepting signups.
- Create the new active price before archiving the previous one during pricing changes.
- Keep product/price IDs in version-controlled env files with the Stripe account they belong to.
- Use the same Stripe account in staging as production schema so catalog drift is caught early.
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
- Stripe is not initialized
- Stripe manager is not initialized
- No subscription items found
- Subscription is canceled
- Customer ID is required
AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12).
Data as JSON: /api/errors/f9151a5efc61cf59.
Report an issue: GitHub.