Budibase/budibase · error
Quotas do not exist for planType=${planType} and hosting=${h
Error message
Quotas do not exist for planType=${planType} and hosting=${hosting} What it means
readQuotas looks up the quota table for the tenant's planType (e.g. Premium, Team, Free) within a plan-to-quotas map keyed by plan and selected by hosting environment (cloud vs self host). If the plan has no entry for the current hosting configuration — for example a Premium plan lookup against self-host quotas — it throws. It is a guard against plan/hosting combinations the licensing system cannot price.
Source
Thrown at packages/pro/src/sdk/licensing/licenses/quotas.ts:560
},
},
constant: {
...quotas.agentLogRetentionDays(UNLIMITED),
...quotas.automationLogRetentionDays(UNLIMITED),
...quotas.appBackupRetentionDays(UNLIMITED),
},
},
}
export function getQuotas(hosting: Hosting, planType: PlanType): Quotas {
let defaultQuotas: Quotas
function readQuotas(planQuotas: PlanQuotas): Quotas {
const quotas = planQuotas[planType]
if (!quotas) {
// e.g. Premium plan doesn't exist on self host
throw new Error(
`Quotas do not exist for planType=${planType} and hosting=${hosting}`
)
}
return quotas
}
switch (hosting) {
case Hosting.SELF:
defaultQuotas = readQuotas(SELF_QUOTAS)
break
case Hosting.CLOUD:
defaultQuotas = readQuotas(CLOUD_QUOTAS)
break
}
// always return a deep copy
return JSON.parse(JSON.stringify(defaultQuotas))View on GitHub (pinned to a81a902e9a)
Solutions
- Check the planType in the tenant's license against the hosting environment (self host vs cloud) — Premium and similar paid plans are not available on self host
- Upgrade or re-issue the license so it matches the current hosting configuration
- Verify the plans/quota definition table in this version of the code includes the planType/hosting pair (a version upgrade may have removed it)
- Wrap getQuotas in a try/catch and fall back to the base/free plan quotas for unsupported combinations
Example fix
// before: blindly reading quotas for the license's plan
const quotas = await getQuotas()
// after: fall back when the plan/hosting combo is unsupported
let quotas
try {
quotas = await getQuotas()
} catch (err) {
if (String(err.message).startsWith("Quotas do not exist")) {
quotas = defaultFreeQuotas
} else {
throw err
}
} Defensive patterns
Strategy: try-catch
Validate before calling
const plans = planQuotas[planType]
if (!plans) console.warn(`No quotas for planType=${planType} on hosting=${hosting}`) Type guard
function hasPlanQuotas(pq: PlanQuotas, planType: string): boolean {
return Boolean(pq[planType])
} Try / catch
try {
quotas = await getQuotas()
} catch (err: any) {
if (String(err.message).startsWith("Quotas do not exist")) {
quotas = fallbackQuotas
} else { throw err }
} Prevention
- Match license plan to hosting environment before enabling quota features
- After upgrading, verify the license's planType exists in the deployed quota matrix
- Maintain a documented fallback quota set for unsupported plan/hosting combos
When it happens
Trigger: getQuotas -> readQuotas is called with a planType whose key is absent from planQuotas, e.g. resolving quotas for a Premium plan on a self-hosted install, or a plan/hosting pair removed from the plans table after a version change.
Common situations: Self-hosted Budibase where the license plan only exists in the cloud quota matrix; a stale or mismatched license file after upgrading; cloud license being validated on an instance whose HOSTING env does not match where the license was issued.
Related errors
- Workspace DB not found - self-host users using cloud don't h
- No license key found
- No license key found
- CouchDB username not set
- CouchDB password not set
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/a7edb22420812eec.
Report an issue: GitHub.