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
- Verify the model's supported zones and tabs and use a valid combination (commonly zone: 'general' with tab: 'general')
- Update the config to match the zones available in your Medusa version's admin UI
- 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
- Stick to well-known combos like zone 'general' + tab 'general' initially
- Validate zone/tab against @medusajs/admin-shared helpers in a test
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
- 'zone' property at the ${j} index of the 'forms' property is
- 'zone' property is missing from the ${j} index of the 'forms
- 'tab' property at the ${j} index of the 'forms' property is
- The 'fields' property is missing at the ${j} index of the 'f
- The 'fields' property at the ${j} index of the 'forms' prope
AI-assisted analysis of medusajs/medusa@5e06e544a2 (2026-08-27).
Data as JSON: /api/errors/3e42c3e22c72f8b0.
Report an issue: GitHub.