Introduction

While building a multilingual site with Contentful, a content editor reported that the Publish button remained greyed out when creating new pages. Existing pages could be updated without issue — only new entries were affected.

This article walks through the debugging process and the fix.

Environment

  • Contentful (headless CMS)
  • Locales: Japanese (ja, default) + English (en)
  • Next.js + Contentful Delivery API for the frontend

Symptoms

  • Creating a new Page entry and filling in all fields still leaves the Publish button greyed out
  • Updating existing pages (editing title or body) works fine
  • Saving as Draft works normally

Narrowing Down the Cause

1. Check Content Type Validation

First, I reviewed the field definitions for the page content type.

title:        Symbol, required: true,  localized: true
slug:         Symbol, required: true,  localized: false
body:         RichText, required: false, localized: true
bodyMarkdown: Text, required: false,    localized: true

Both title and slug are required but were filled in. The slug validation pattern (^[a-z0-9]+(?:-[a-z0-9]+)*$) was also satisfied.

2. Check User Permissions

I used the Management API to verify space memberships.

curl -s -H "Authorization: Bearer $TOKEN" \
  "https://api.contentful.com/spaces/$SPACE_ID/space_memberships"

The reporter had Admin privileges — permissions were not the issue.

3. Attempt to Publish via API — Root Cause Found

Since the UI gave no clear indication of the problem, I tried publishing directly through the Management API. This was the breakthrough.

curl -s -X PUT \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Contentful-Version: 13" \
  "https://api.contentful.com/spaces/$SPACE_ID/environments/master/entries/$ENTRY_ID/published"

Response:

{
  "sys": { "type": "Error", "id": "InvalidEntry" },
  "message": "Validation error",
  "details": {
    "errors": [
      {
        "name": "required",
        "path": ["fields", "title", "en"],
        "details": "The property \"en\" is required here"
      }
    ]
  }
}

The English locale’s title was empty, causing a validation error.

Root Cause

Inspecting the locale settings revealed the following:

curl -s -H "Authorization: Bearer $TOKEN" \
  "https://api.contentful.com/spaces/$SPACE_ID/environments/master/locales"
LocaleDefaultoptionalfallbackCode
ja (Japanese)Yesfalsenone
en (English)Nofalsenone

Two issues:

  1. optional: false — English input is mandatory. For localized required fields (title), a value must exist for every locale.
  2. fallbackCode: null — No fallback configured. When the English value is missing, there’s no mechanism to fall back to the Japanese value.

The content editor was only entering content in Japanese. Since the English title was left empty, validation blocked publishing.

Why Could Existing Pages Be Updated?

Existing pages had been created during development with both Japanese and English titles already filled in. When updating, the existing English title remained intact, so validation passed.

The Fix

I updated the English locale settings:

curl -s -X PUT \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/vnd.contentful.management.v1+json" \
  -H "X-Contentful-Version: $VERSION" \
  "https://api.contentful.com/spaces/$SPACE_ID/environments/master/locales/$EN_LOCALE_ID" \
  -d '{
    "name": "English",
    "code": "en",
    "fallbackCode": "ja",
    "optional": true
  }'

Summary of changes:

SettingBeforeAfterEffect
optionalfalsetrueEnglish input becomes optional
fallbackCodenull“ja”Falls back to Japanese when English is empty

After this change, editors can publish with Japanese-only content. When the English value is needed, the Japanese value is used automatically.

Why the UI Doesn’t Make This Obvious

Contentful’s web UI doesn’t always clearly indicate why the Publish button is disabled. In multilingual setups, the currently displayed locale (Japanese) may show all fields as correctly filled in, while a validation error exists in another locale (English) that isn’t visible without switching.

The sidebar may show error indicators, but the specific cause often requires switching locales to discover.

Lessons Learned

  1. Configure optional and fallbackCode for locales from the start — For non-default locales, setting optional: true with a fallback prevents operational headaches down the road.
  2. Use the Management API when the UI is unclear — API responses provide explicit error messages that make debugging much faster.
  3. Mind the gap between developer and editor workflows — Developers tend to fill in all locales; editors typically work in the default locale only.

Conclusion

Most Contentful publishing issues stem from validation errors. In multilingual setups, the required/optional setting and fallback configuration for each locale are critical. When the UI doesn’t surface the root cause, the Management API is an invaluable debugging tool that returns precise error details.