medusajs/medusa · warning

'zone' and 'tab' properties at the ${j} index of the 'forms'

Error message

'zone' and 'tab' properties at the ${j} index of the 'forms' property are not a valid for the '${model}' model. Received: { zone: ${zone}, tab: ${tab} }.

What it means

After resolving zone and tab, the plugin computes the full injection path (getFormEntryFieldPath(model, zone, tab)) and validates both the zone and the resulting path. If either is not recognized for the model, the combination is rejected with this warning and the form entry is skipped.

Source

Thrown at packages/admin/admin-vite-plugin/src/custom-fields/generate-custom-field-forms.ts:342

      tab = tabProperty.value.value
    }

    if (tab && !isValidCustomFieldFormTab(tab)) {
      logger.warn(
        `'tab' property at the ${j} index of the 'forms' property is not a valid custom field form tab for the '${model}' model. Received: ${tab}.`,
        { file }
      )
      return
    }

    const zone = zoneProperty.value.value
    const fullPath = getFormEntryFieldPath(model, zone, tab)

    if (
      !isValidCustomFieldFormZone(zone) ||
      !isValidCustomFieldFormFieldPath(fullPath)
    ) {
      logger.warn(
        `'zone' and 'tab' properties at the ${j} index of the 'forms' property are not a valid for the '${model}' model. Received: { zone: ${zone}, tab: ${tab} }.`,
        { file }
      )
      return
    }

    const fieldsObject = element.properties.find(
      (p) => isObjectProperty(p) && isIdentifier(p.key, { name: "fields" })
    ) as ObjectProperty | undefined

    if (!fieldsObject) {
      logger.warn(
        `The 'fields' property is missing at the ${j} index of the 'forms' property. The 'fields' property is required to load a custom field form.`,
        { file }
      )
      return
    }

View on GitHub (pinned to 5e06e544a2)

Solutions

  1. Verify the model's supported zones and tabs and use a valid combination (commonly zone: 'general' with tab: 'general')
  2. Update the config to match the zones available in your Medusa version's admin UI
  3. Check the generated path expectation against @medusajs/admin-shared custom-field form zone helpers

Example fix

// before
forms: [{ zone: 'seo', tab: 'general', fields: {...} }]
// after
forms: [{ zone: 'general', tab: 'general', fields: {...} }]
Defensive patterns

Strategy: validation

Validate before calling

import { isValidCustomFieldFormZone } from '@medusajs/admin-shared'
const fullPath = `${model}.${zone}.${tab}`
if (!isValidCustomFieldFormZone(zone)) throw new Error(`invalid zone/tab combo: ${fullPath}`)

Type guard

const isSupportedZone = (z: string) => isValidCustomFieldFormZone(z)

Prevention

When it happens

Trigger: A valid-looking string zone that is not a supported zone for that model (e.g. zone: 'attributes' on a model without an attributes zone), or a zone+tab combination whose form path does not exist.

Common situations: Reusing one form config across multiple models where supported zones differ, or after a Medusa upgrade that changed zone names.

Related errors


AI-assisted analysis of medusajs/medusa@5e06e544a2 (2026-08-27). Data as JSON: /api/errors/3e42c3e22c72f8b0. Report an issue: GitHub.