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

  1. 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
  2. Upgrade or re-issue the license so it matches the current hosting configuration
  3. Verify the plans/quota definition table in this version of the code includes the planType/hosting pair (a version upgrade may have removed it)
  4. 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

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


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/a7edb22420812eec. Report an issue: GitHub.